Как установить и настроить Coolify на VPS
Coolify обещает Heroku на своём железе: пуш в ветку — и приложение в проде, с сертификатом и базой рядом. Установка Coolify действительно укладывается в одну команду, но дальше начинается настройка, о которой скрипт молчит: домен панели, ключ шифрования секретов, доступ панели по SSH к своему же серверу, swap под сборки. Пройдём путь от чистого VPS до задеплоенного приложения — с командами, цифрами и местами, где эта конструкция ломается.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что Coolify ставит на сервер и сколько это ест
Coolify четвёртой ветки — управляющий слой над Docker: ходит в Git, собирает образы, запускает контейнеры и раздаёт им домены через встроенный Traefik. После установки появляется пять служебных контейнеров, docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}' покажет примерно такое:
NAMES IMAGE PORTS
coolify ghcr.io/coollabsio/coolify:latest 0.0.0.0:8000->8080/tcp
coolify-realtime ghcr.io/coollabsio/coolify-realtime 0.0.0.0:6001-6002->6001-6002/tcp
coolify-db postgres:15-alpine 5432/tcp
coolify-redis redis:7-alpine 6379/tcp
coolify-proxy traefik:v3 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
Здесь coolify — панель на Laravel, coolify-db — Postgres с вашими проектами, переменными и SSH-ключами, coolify-realtime — вебсокет живых логов, coolify-proxy — Traefik с Let's Encrypt. В простое пятёрка держит 1,2–1,5 ГБ резидентной памяти (docker stats --no-stream), свежая установка занимает около 3 ГБ на диске одними образами. Это накладные расходы — до первого вашего приложения.
Важно: Coolify — control plane, а не рантайм. Остановите контейнер coolify — приложения продолжат работать, отвалятся только деплои, панель и живые логи. Обратная сторона: если панель и весь прод на одной машине, это одна точка отказа.
Готовим VPS: ОС, swap, порты и DNS
Система. Ubuntu 24.04 LTS или Debian 12 (скрипт умеет и в AlmaLinux/Rocky 9). Ставить под root: инсталлятор пишет в /data и правит systemd.
Сервер должен быть чистым. Частая ошибка — Coolify ставят на машину, где уже висит Nginx. Traefik не займёт 80-й порт, и в логах будет Bind for 0.0.0.0:80 failed: port is already allocated. Проверьте заранее: ss -tulpn | grep -E ':(80|443|8000|6001)\b'.
Swap обязателен. Сборка Next.js, Nuxt или Vite пиково просит 2–3 ГБ, и на 4 ГБ без swap процесс убивает OOM-killer:
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
sysctl -w vm.swappiness=10
Это костыль под пики сборки, а не замена памяти.
Фаервол до того, как поднимете домен панели:
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 8000/tcp
ufw allow 6001/tcp
ufw enable
8000 — панель, 6001 — вебсокет живых логов, 6002 — веб-терминал в свежих версиях. Закрытый 6001 — частая ложная тревога «Coolify не работает»: интерфейс открывается, но лог деплоя висит пустым.
Честно про UFW: опубликованные Docker-порты его правила обходят — DNAT-правила пишутся в цепочку DOCKER-USER, и ufw deny 8000/tcp порт не закроет. Помогает ufw-docker или перевод панели на домен без публикации портов наружу.
DNS заведите заранее, обе записи должны отрезолвиться до настройки HTTPS:
| Запись | Тип | Значение |
|---|---|---|
coolify.example.com | A | IP сервера — домен панели |
*.apps.example.com | A | IP сервера — автодомены приложений |
Проверка — dig +short coolify.example.com. И сверьте часы: расхождение ломает ACME.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть CoolifyУстановка Coolify: одна команда и что она делает
Каноничный вариант — curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash. Лучше скачать скрипт (-o install.sh), прочитать и запустить bash install.sh.
За 2–5 минут скрипт ставит зависимости (curl, wget, git, jq), при отсутствии Docker тянет его с get.docker.com (старая 20.10 из репозиториев Debian не подойдёт — сверьте docker --version), генерирует .env со случайными паролями и накатывает миграции. Дерево, которое стоит знать наизусть:
/data/coolify/
├── source/ docker-compose.yml, .env, upgrade.sh
├── ssh/ keys/ и mux/ — ключи и мультиплексоры SSH
├── applications/ тома и данные ваших приложений
├── databases/ данные баз, созданных через панель
├── proxy/ конфиг Traefik: dynamic/ и acme.json
└── backups/ локальные дампы
Главное из этого раздела. В /data/coolify/source/.env лежит APP_KEY — им Laravel шифрует всё чувствительное в базе: переменные окружения, токены, приватные SSH-ключи. Потеряли ключ — дамп базы превращается в нерасшифровываемые строки, и вернуть его нельзя ничем. Бэкап Coolify — всегда пара: дамп Postgres плюс .env. Сохраните его сразу: grep APP_KEY /data/coolify/source/.env.
Сразу после установки порт 8000 минуту отвечает отказом в соединении — идут миграции, смотрите docker logs -f coolify. Скрипт ставит актуальный релиз; нужна конкретная версия — задайте переменную VERSION в начале файла, номер берите со страницы релизов на GitHub.
Первый вход: админ, регистрация и домен панели
Откройте http://IP-СЕРВЕРА:8000. Первый зарегистрированный пользователь становится владельцем инстанса, пароля по умолчанию нет. Три вещи в первые пять минут:
- Закрыть регистрацию.
Settings → Configuration, выключитьRegistration allowed. Пока переключатель включён, любой знающий IP и порт заведёт себе аккаунт на вашем сервере. - Включить 2FA в профиле. У панели root-доступ к серверу по SSH: компрометация аккаунта равна компрометации машины.
- Выключить
Auto Update. Coolify развивается быстро, между релизами случаются ломающие изменения, и получить их ночью без бэкапа — плохой сценарий.
Домен панели. Пока вы ходите по http://IP:8000, пароль летит открытым текстом. В Settings → Configuration → Instance Domain впишите https://coolify.example.com — Coolify перерегистрирует себя в Traefik, запросит сертификат и переедет на 443. Ловушка, в которую попадают почти все: если A-запись ещё не отрезолвилась, вы теряете доступ к панели — сертификат не выпустится, а IP:8000 уже редиректит на домен. Путь назад — сбросить FQDN в базе:
docker exec -it coolify-db psql -U coolify -d coolify \
-c "update instance_settings set fqdn = null;"
docker restart coolify
После переезда порты 8000, 6001 и 6002 наружу не нужны — весь трафик, включая вебсокеты, идёт через 443: ufw delete allow 8000/tcp и так далее.
Сервер, прокси и SSL: где это ломается чаще всего
Неочевидная деталь: Coolify управляет даже локальной машиной через SSH. Он генерирует ключ /data/coolify/ssh/keys/id.root@host.docker.internal и кладёт публичную часть в /root/.ssh/authorized_keys — панель ходит на собственный хост как root.
Отсюда самая обидная поломка: вы прогоняете скрипт харденинга, он ставит PermitRootLogin no, и кнопка Validate Server возвращает Permission denied (publickey). Деплои встают, хотя приложения работают. Правильный /etc/ssh/sshd_config для машины с Coolify:
PermitRootLogin prohibit-password
PubkeyAuthentication yes
PasswordAuthentication no
Root пускаем, но только по ключу, и не вычищайте authorized_keys вслепую — там лежит ключ панели. После правки sshd -t && systemctl reload ssh. Вторая точка отказа — залипшие сокеты в /data/coolify/ssh/mux/: деплой висит без вывода, помогает очистка каталога.
Домены приложений. В Server → General есть поле Wildcard Domain: впишите https://apps.example.com, и каждое новое приложение получит адрес вида https://k4sc0k8.apps.example.com.
Про сертификаты коротко. Coolify использует HTTP-01-проверку: Let's Encrypt стучится на http://ваш-домен/.well-known/acme-challenge/..., значит 80-й порт должен быть открыт всегда, а не только на время выпуска. Wildcard-сертификат так не выдаётся — на каждый поддомен свой, и работают лимиты: 50 сертификатов на домен в неделю и 5 дубликатов одного набора имён; стенд, где приложения пересоздают десятками, упирается в них за пару дней. У /data/coolify/proxy/acme.json должны быть права 600, иначе Traefik молча его проигнорирует. Подробнее — Coolify не выдаёт SSL.
Первый деплой, бэкапы и обновление
Иерархия простая: Project → Environment → Resource. Для приватного репозитория подключайте GitHub App (Settings → Sources), а не деплой-ключ: он сам настраивает вебхуки, и пуш в ветку запускает сборку. Build pack там же: Nixpacks определяет стек сам, но обновился Nixpacks — поменялась версия рантайма; для прода берут Dockerfile.
Два места, где спотыкаются на первом деплое:
- Порт. В
Ports Exposesукажите порт, который слушает приложение внутри контейнера (обычно 3000 или 8080). Ошиблись — сборка пройдёт, а домен отдаст502 Bad Gateway: Traefik не найдёт апстрим. - Переменные окружения. У каждой есть чекбокс
Build Variable. Всё, что нужно на этапе сборки —NEXT_PUBLIC_*,VITE_*— должно быть им помечено, иначе бандл уедет в прод сundefinedвнутри.
Сборка падает. В логе будет либо exit code: 137, либо честное сообщение сборщика:
The build failed because the process exited too early. This probably
means the system ran out of memory or someone called kill -9.
И то и другое — нехватка памяти, а не баг Coolify: swap из второго раздела, больше RAM или сборка образа в CI.
Диск. Кэш сборки растёт быстро: на сервере с четырьмя приложениями и десятком деплоев в неделю за месяц набегает 15–25 ГБ мусора. Убирает Server → Settings → Docker Cleanup (по расписанию и при заполнении выше 80%), руками — docker image prune -af --filter "until=168h".
Бэкапы — три разные сущности, которые путают: база самой Coolify (Settings → Backup, дампы в /data/coolify/backups/ и в S3, плюс .env); базы, созданные через панель (у каждой свой раздел Backups); тома из /data/coolify/applications/ — их Coolify не бэкапит, вывозите сами, например restic по крону.
Обновление — кнопка в панели или bash /data/coolify/source/upgrade.sh. Честно о риске: миграции применяются автоматически, обратных нет, откатиться на предыдущий тег обычно не выйдет. Сначала бэкап базы и .env, потом обновление. Что вылезает в эксплуатации — частые ошибки Coolify.
Какой сервер взять в MAATRIX под Coolify
Минимум — 2 vCPU, 4 ГБ RAM, 60 ГБ NVMe. Панель забирает 1,2–1,5 ГБ, дальше ваши контейнеры. Двух гигабайт, которые иногда указывают как требование, хватает ровно на то, чтобы панель открылась: первая сборка Node-приложения уходит в OOM. Расчёт — сколько RAM нужно для Coolify.
Комфортный вариант — 4 vCPU, 8 ГБ RAM, 100–160 ГБ NVMe. Панель плюс 4–6 небольших приложений с базами: сборка не мешает проду, места хватает на образы, кэш и дампы. Это то, что мы советуем, когда Coolify берут под свои проекты.
Много сборок — 8 vCPU, 16 ГБ. Сборка упирается в процессор: на двух ядрах Next.js собирается пять минут вместо полутора. Дешевле другой путь: Coolify управляет несколькими серверами по SSH — панель на маленькой машине, приложения на отдельных.
Локация. Для Coolify мы почти всегда советуем Лондон, причина практическая: сервер постоянно тянет образы с Docker Hub и ghcr.io, пакеты с npm, код с GitHub. С российских адресов часть реестров отвечает отказом или работает через раз, и чинить вы будете не приложение, а доступ к зеркалам. Британская площадка ходит везде без ухищрений, пинг из Москвы — 45–60 мс. Франция равноценна для континентальной Европы, США берут, когда приложениям нужен американский IP. Россия — если обрабатываете персональные данные по 152-ФЗ; тогда сразу закладывайте настройку зеркал реестров.
Оплата — картами российских банков, по СБП, криптовалютой или токеном MAAT: иностранная карта не нужна, даже когда сервер в Лондоне. Не уверены в конфигурации — напишите, сколько приложений планируете и на чём они написаны. Смежное: Docker Compose для продакшена и Coolify против Dokploy.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть CoolifyОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Хватит ли 2 ГБ RAM для Coolify?
Панель запустится и будет выглядеть живой, но первая же сборка фронтенда завершится с exit code: 137. Служебные контейнеры сами держат 1,2–1,5 ГБ, поэтому рабочий минимум — 4 ГБ плюс swap, комфорт — 8 ГБ.
Что будет с приложениями, если Coolify упадёт?
Ничего: контейнеры приложений и Traefik работают независимо от панели. Отвалятся деплои, веб-интерфейс и живые логи — то есть управление, а не прод.
Можно ли поставить Coolify туда, где уже работает Nginx?
Практически нет: Traefik не займёт 80 и 443, установка упрётся в port is already allocated, а без этих портов не будет ни автодоменов, ни Let's Encrypt.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.