MAATRIX / Блог / Coolify на Ubuntu 24.04: пошаговая установка

Coolify на Ubuntu 24.04: пошаговая установка

Coolify на Ubuntu 24.04: пошаговая установка

MAATRIX

Coolify обещает «свой Heroku за пять минут», и на чистой Ubuntu 24.04 это почти правда: установка действительно сводится к одной команде. Проблемы начинаются дальше — панель не видит собственный сервер, сертификат не выпускается, а первая же сборка падает с кодом 137. Ниже — установка Coolify на Ubuntu 24.04 по шагам с командами, а рядом честный разбор мест, где обычно застревают.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Coolify и почему его ставят на свой сервер

Coolify — открытая self-hosted PaaS-платформа: вы отдаёте ей сервер, а она разворачивает на нём приложения из Git, базы данных, готовые сервисы и обратный прокси с автоматическим HTTPS. По сути это слой управления поверх Docker: вместо ручных docker compose up, конфигов Nginx и cron-задач под certbot вы нажимаете «Deploy» в веб-интерфейсе.

Актуальная ветка — четвёртая (v4): Laravel, всё в контейнерах, по умолчанию Traefik v3 как обратный прокси (в настройках переключается на Caddy или отключается, если у вас свой Nginx). Управлять Coolify умеет не только своим хостом, но и удалёнными машинами по SSH. Экономика простая: один VPS на 4 ГБ RAM держит десяток небольших приложений, и платите вы за сервер, а не за каждый инстанс.

Честный минус: Coolify развивается быстро, релизы выходят часто, и обновления иногда ломают рабочие вещи — гарантий обратной совместимости уровня Kubernetes здесь нет. Если проект критичен, держите бэкап /data/coolify и дампы Postgres.

Требования и подготовка Ubuntu 24.04

Берите чистый образ Ubuntu 24.04 LTS: если на сервере уже стоит Nginx, Apache, ISPmanager, aaPanel или другой Docker-стек, конфликт по портам 80 и 443 гарантирован.

Ресурсы. Официальный минимум — 2 CPU и 2 ГБ RAM, диск от 30 ГБ. Сам Coolify в простое съедает 500–700 МБ: контейнер приложения 300–400 МБ, coolify-db (Postgres) ~60 МБ, coolify-redis ~15 МБ, coolify-realtime ~40 МБ, Traefik ~30 МБ. Остальное — ваши приложения и, что важнее, сборки, которые едят память рывками.

Начните с обновления. На 24.04 обязательно отключите интерактивный needrestart, иначе apt upgrade зависнет на синем диалоге «Which services should be restarted?»:

export NEEDRESTART_MODE=a
apt update && apt -y full-upgrade
apt -y install curl wget git jq ca-certificates

Задайте имя хоста и проверьте часы — расхождение времени ломает выпуск Let's Encrypt-сертификатов: hostnamectl set-hostname coolify.example.com, затем timedatectl set-ntp true && timedatectl status | grep synchronized.

Если взяли 2 ГБ RAM, сразу добавьте swap — он спасёт первые сборки:

fallocate -l 4G /swapfile && chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

И поднимите лимиты inotify: по умолчанию fs.inotify.max_user_instances равен 128, а каждый контейнер с файловым вотчером их тратит — на двух десятках контейнеров упрётесь в потолок. Лечится строкой echo 'fs.inotify.max_user_instances = 1024' > /etc/sysctl.d/99-coolify.conf && sysctl --system.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Coolify

Установка одной командой и что на самом деле делает скрипт

Установщик запускается от root одной строкой:

curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash

На 2 vCPU это 3–6 минут, большая часть — скачивание Docker и образов (около 2,5 ГБ). Запускайте в screen, чтобы обрыв SSH не оставил систему в половинчатом состоянии.

Что скрипт делает под капотом:

  • Ставит Docker через get.docker.com. Это принципиально: пакет docker.io из репозитория Ubuntu слишком старый, а Coolify требует Docker 26 и новее — на древнем установка прервётся с сообщением про неподдерживаемую версию.
  • Правит /etc/docker/daemon.json: ротация логов и пул адресов для docker-сетей. Загляните туда после установки — cat /etc/docker/daemon.json. Если пул пересекается с вашей корпоративной сетью или WireGuard-туннелем на 10.x.x.x, вы потеряете доступ к тем адресам изнутри контейнеров. Пул меняется в том же файле, дальше systemctl restart docker.
  • Создаёт /data/coolify с подкаталогами source, ssh, applications, databases, backups, services, proxy. Всё состояние живёт здесь, это и есть объект бэкапа.
  • Генерирует SSH-ключ и кладёт публичную часть в ~/.ssh/authorized_keys root-а — через него панель управляет собственным хостом.
  • Поднимает контейнеры из /data/coolify/source/docker-compose.yml вместе с docker-compose.prod.yml.

Проверьте результат:

docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

Должны быть подняты coolify, coolify-db, coolify-redis и coolify-realtime. Если какой-то в статусе Restartingdocker logs coolify --tail 100. И честное ограничение: под обычным пользователем без sudo Coolify не развернуть, панель управляет Docker и SSH-доступом хоста.

Первый вход, админ и сервер localhost

Панель слушает порт 8000. Откройте http://IP_СЕРВЕРА:8000 — там форма регистрации. Первый зарегистрированный пользователь становится администратором, после чего открытая регистрация закрывается. Не тяните: сервер с открытым 8000 и без админа — приглашение занять вашу панель.

Дальше мастер предложит настроить сервер localhost. Здесь возникает самая частая ошибка:

Server is not reachable. Please validate your configuration and connection.

Панель ходит на собственный хост по SSH от имени root — и упирается в запрет root-логина: в большинстве облачных образов 24.04 в /etc/ssh/sshd_config стоит PermitRootLogin no. Разрешаем вход по ключу, но не по паролю:

sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
systemctl restart ssh

Проверьте вручную ключом, который сгенерировал установщик:

ls /data/coolify/ssh/keys/
ssh -i /data/coolify/ssh/keys/id.root@host.docker.internal root@localhost 'docker info --format {{.ServerVersion}}'

Вернулась версия Docker — жмите Validate Server, статус станет зелёным. Получили Permission denied (publickey) — проверьте права: chmod 600 на ключ и chmod 700 на ~/.ssh root-а.

Вторая мелочь — «висящий» интерфейс: страница загрузилась, но данные не обновляются, а в консоли браузера ошибка соединения с WebSocket. Coolify использует realtime-канал на порту 6001 (и 6002 для встроенного терминала). Если между вами и сервером фаервол, эти порты нужно открыть — иначе панель выглядит живой, но ничего не показывает.

Домен, HTTPS и фаервол без иллюзий

Работать по голому IP неудобно и небезопасно. Заведите поддомен и wildcard — тогда каждый новый сервис получит адрес автоматически:

coolify.example.com.   A   203.0.113.10
*.apps.example.com.    A   203.0.113.10

Затем в панели: Settings → Instance Domain → впишите https://coolify.example.com. Coolify перевесит дашборд на Traefik и сам закажет сертификат Let's Encrypt. Убедитесь, что записи разъехались по DNS, прежде чем сохранять: dig +short coolify.example.com. Если Let's Encrypt не достучится до домена, в логах прокси (docker logs coolify-proxy --tail 200 | grep -i acme) будет строка вида acme: error: 403 :: urn:ietf:params:acme:error:unauthorized, а браузер покажет самоподписанный TRAEFIK DEFAULT CERT. Вторая причина той же ошибки — занятый 80-й порт: если остался Apache или Nginx, прокси не стартует. Проверьте ss -tlnp | grep -E ':80|:443'.

Теперь фаервол. Открыть надо:

ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp
ufw allow 6001/tcp && ufw allow 6002/tcp
ufw --force enable

Порт 8000 сюда специально не входит: после привязки домена дашборд доступен по HTTPS. Но вот подвох, о котором молчит половина мануалов: UFW не защищает опубликованные Docker-порты. Docker пишет правила в цепочку DOCKER-USER и в nat/PREROUTING раньше, чем трафик доходит до UFW, поэтому ufw deny 8000 не сработает. Убедиться легко: curl -m 5 -o /dev/null -w '%{http_code}\n' http://IP_СЕРВЕРА:8000 вернёт 200 даже при включённом запрете. Вариантов два: закрыть 8000 на фаерволе провайдера (уровень сети, до сервера) или добавить правило в DOCKER-USER:

iptables -I DOCKER-USER -p tcp --dport 8000 ! -s 127.0.0.1 -j DROP

Правило не переживёт перезагрузку — сохраните его через netfilter-persistent save. На Ubuntu 24.04 iptables работает через nft-бэкенд, но синтаксис остаётся прежним.

Первый деплой и грабли, специфичные для 24.04

Создайте проект, добавьте приложение через + New → Public Repository, укажите ветку и Build Pack. Nixpacks определит стек сам, но для прода лучше Dockerfile: Nixpacks иногда молча меняет версию рантайма между релизами.

Первая сборка на сервере с 2 ГБ RAM почти наверняка упрётся в память и оборвётся строкой exit code: 137. 137 — это 128 + 9, то есть процесс убит сигналом SIGKILL, и убил его OOM-killer ядра; подтверждает dmesg -T | grep -i 'killed process'. Сборка Next.js или Nuxt легко просит 2–3 ГБ на этапе бандлинга. Лечится по возрастанию правильности: swap (см. выше), NODE_OPTIONS=--max-old-space-size=1536 для сборщика, либо сборка образа на машине помощнее. На 4 ГБ RAM большинство фронтенд-сборок проходит спокойно.

Вторая грабля именно 24.04 — ужесточённый AppArmor: sysctl kernel.apparmor_restrict_unprivileged_userns возвращает 1, то есть непривилегированные user namespaces запрещены. На это натыкаются контейнеры со своей песочницей: Puppeteer и Playwright с headless Chrome, сборщики на базе bubblewrap. Симптом — падение с Failed to move to new namespace или мгновенный крэш браузера. Лечится так:

echo 'kernel.apparmor_restrict_unprivileged_userns = 0' > /etc/sysctl.d/99-userns.conf
sysctl --system

Честно: это ослабление защиты ядра, введённой не просто так. Отключайте, только если приложение без этого не работает, и не там, где крутится чужой код.

Обновляется Coolify из панели (Settings → Upgrade) или командой curl -fsSL https://cdn.coollabs.io/coolify/upgrade.sh | bash. Перед этим — бэкап:

docker exec coolify-db pg_dumpall -U coolify > /root/coolify-$(date +%F).sql
tar czf /root/coolify-data-$(date +%F).tar.gz /data/coolify

И про доступность из России: сервер должен свободно ходить на cdn.coollabs.io, ghcr.io, Docker Hub, npm и GitHub. Изнутри РФ эти адреса отдают curl: (28) Connection timed out after 5000 milliseconds, причём падать будет не установка, а случайные сборки — что противнее в отладке.

Какой сервер брать в MAATRIX под Coolify

Начнём с локации. Для Coolify рекомендуем UK (Лондон): чистый выход к ghcr.io, Docker Hub, npm и GitHub без региональных фильтров, а пинг до Москвы и Петербурга — 40–60 мс, панель отзывчивая, встроенный терминал не лагает. Плюс GDPR-соседство, если клиенты в ЕС. Франция даёт ту же картину и меньший пинг до континентальной Европы. Российскую локацию берут по одной причине — 152-ФЗ; тогда закладывайте зеркала реестров для сборок.

Теперь конфигурация, без округления вверх.

СценарийCPURAMДискЧто реально получится
Минимум2 vCPU2 ГБ40 ГБ NVMeПанель работает, 1–2 лёгких приложения. Фронтенд-сборки падают без swap
Рабочий вариант2–4 vCPU4 ГБ60–80 ГБ NVMe5–8 приложений, база, сборки проходят без плясок
Комфорт4–8 vCPU8–16 ГБ160 ГБ NVMeДесятки сервисов, Postgres с нагрузкой, параллельные сборки

Логика такая. 2 ГБ — не «для теста», а про то, что Coolify занимает треть памяти ещё до вашего первого приложения. Остатка хватит на пару статичных сайтов или лёгкий API, но сборка на Node прожуёт его и получит тот самый код 137. Жёсткий бюджет — берите 2 ГБ и обязательно ставьте 4 ГБ swap: решение рабочее, просто сборки идут медленнее. 4 ГБ — точка, с которой о памяти перестаёшь думать; её и советуем как стартовую.

По диску не экономьте: Docker копит слои образов и билд-кэш, 20 ГБ кончаются за месяц активных деплоев. 60 ГБ NVMe — разумный старт плюс еженедельный docker system prune -af (флаг --volumes добавляйте осознанно, он сносит неиспользуемые тома с данными).

Оплата — картами российских банков, по СБП, криптовалютой или токеном MAAT; иностранная карта для британской площадки не нужна. Сервер выдаётся с чистым образом Ubuntu 24.04 LTS и root-доступом, так что установщик Coolify запускается сразу после первого входа по SSH. Не уверены с объёмом памяти под свой стек — напишите, что планируете деплоить, поможем не переплатить.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Coolify

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Хватит ли 2 ГБ RAM для Coolify на Ubuntu 24.04?

Для самой панели — да, она занимает 500–700 МБ. Но сборки фронтенда на 2 ГБ падают с exit code: 137 (OOM). Либо добавляйте 4 ГБ swap, либо берите 4 ГБ RAM.

Почему панель пишет «Server is not reachable» сразу после установки?

Coolify подключается к собственному хосту по SSH от root, а в образах Ubuntu 24.04 root-логин обычно запрещён. Поставьте PermitRootLogin prohibit-password в /etc/ssh/sshd_config, перезапустите ssh и нажмите Validate Server.

Можно ли закрыть порт 8000 через ufw?

Нет: Docker публикует порты в обход UFW через цепочку DOCKER-USER. Закрывайте порт на фаерволе провайдера или правилом в DOCKER-USER, а дашборд выносите на домен с HTTPS.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.