Поиск
Главная / Сервер

Стандарт деплоя на один сервер: 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 в файл и копирование наружу.


Итог: стандарт “деплой без боли”

  1. Пользователь + ключи SSH.
  2. UFW.
  3. Docker + compose.
  4. /opt/apps/<app> + .env.
  5. Reverse proxy + SSL.
  6. Деплой: pull + up -d.
  7. Откат и бэкапы как часть процесса.