Стандарт деплоя на один сервер: Docker Compose, домен, SSL, обновления
Пошаговый мануал: подготовка Ubuntu, пользователь, SSH, UFW, Docker/Compose, структура папок, деплой, откат, бэкапы.
Короткий план (чек‑лист)
- Создать отдельного пользователя (не работать постоянно под
root). - Настроить SSH ключи и отключить вход по паролю (когда готов).
- Включить базовый firewall (UFW).
- Установить Docker и Docker Compose.
- Завести структуру
/opt/apps/<app>и.envдля каждого проекта. - Поднять reverse‑proxy (Caddy/Nginx) и SSL (Let’s Encrypt).
- Описать деплой как
docker compose pull && docker compose up -d. - Договориться об откате (предыдущий образ + снапшот/бэкап).
0) Модель: один сервер, несколько приложений
Мы держим на одном сервере несколько сервисов (например: n8n, сайт, Postgres), но делаем это предсказуемо:
- каждый сервис в своём каталоге
- всё поднимается
docker compose - конфиги в файлах, а не “ручные настройки”
1) Базовая подготовка сервера (Ubuntu/Debian)
Обновляем пакеты:
apt update && apt upgrade -y
Ставим полезный минимум:
apt install -y curl ca-certificates gnupg git ufw
2) Пользователь и права (чтобы не жить под root)
Создаём пользователя (пример: deploy):
adduser deploy
usermod -aG sudo deploy
3) SSH: ключи и базовая безопасность
На своём компьютере (локально) генерируешь ключ, если его нет:
ssh-keygen -t ed25519
Копируешь ключ на сервер:
ssh-copy-id deploy@IP_СЕРВЕРА
Проверяешь вход:
ssh deploy@IP_СЕРВЕРА
4) Firewall (UFW)
Разрешаем SSH и включаем UFW:
ufw allow OpenSSH
ufw enable
ufw status
Если будешь поднимать веб‑сервисы напрямую (80/443) не забудь:
ufw allow 80
ufw allow 443
5) Установка Docker (копипастный вариант)
Это вариант “одной командой”, чтобы можно было просто вставить в терминал:
curl -fsSL https://get.docker.com | sh
Добавляем пользователя в группу docker:
usermod -aG docker deploy
Перезайди в SSH (или newgrp docker), затем проверь:
docker version
6) Docker Compose
На многих системах уже доступен как плагин:
docker compose version
Если команды нет, уточним конкретно под твою ОС/репозиторий (там варианты отличаются).
7) Структура каталогов на сервере
Рекомендую так:
mkdir -p /opt/apps
mkdir -p /opt/apps/myapp
chown -R deploy:deploy /opt/apps
Внутри /opt/apps/myapp/:
docker-compose.yml.env(не коммитим в git)data/(если есть volume)backups/(если делаешь локальные дампы)
8) Минимальный шаблон docker-compose.yml (пример)
Пример для приложения + Postgres (как структура, не догма):
services:
app:
image: your-org/your-app:latest
restart: unless-stopped
env_file:
- .env
ports:
- "127.0.0.1:3000:3000"
depends_on:
- db
db:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: change_me
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
9) Reverse proxy + домен + SSL
Есть два нормальных пути:
- Caddy: максимально просто, сам получает SSL.
- Nginx + certbot: классика, чуть больше ручных шагов.
Для MVP я бы выбрал Caddy.
10) Команда деплоя (обновление)
Базовый цикл:
cd /opt/apps/myapp
docker compose pull
docker compose up -d
docker compose ps
Логи:
docker compose logs -f --tail=200
11) Откат (rollback)
Варианты:
- держать “предыдущий тег” образа и быстро вернуть его в
docker-compose.yml - делать снапшот сервера перед изменениями (если провайдер позволяет)
- иметь бэкапы БД и процедуру восстановления
12) Бэкапы базы (минимальная дисциплина)
Если Postgres на сервере, делай хотя бы ежедневный pg_dump в файл и копирование наружу.
Итог: стандарт “деплой без боли”
- Пользователь + ключи SSH.
- UFW.
- Docker + compose.
/opt/apps/<app>+.env.- Reverse proxy + SSL.
- Деплой:
pull+up -d. - Откат и бэкапы как часть процесса.