Деплой

Docker + Nginx: нормальный минимум для production

Эта схема подходит для сайта, API, Telegram mini app backend или админки: приложение изолировано в контейнере, Nginx принимает внешний трафик, SSL и headers живут в одном месте.

1. Структура проекта

project/
  app/
  Dockerfile
  docker-compose.yml
  nginx/
    app.conf
  .env

.env не коммитится. В Git остаются только примеры переменных.

2. Docker Compose

services:
  app:
    build: .
    restart: unless-stopped
    env_file: .env
    expose:
      - "8000"
    networks:
      - web

  nginx:
    image: nginx:1.27-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx:/etc/nginx/conf.d:ro
      - ./certbot:/etc/letsencrypt
    networks:
      - web

networks:
  web:

3. Nginx proxy config

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://app:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

4. Команды deploy

docker compose pull
docker compose build
docker compose up -d
docker compose ps
docker compose logs -f --tail=100 app

После deploy всегда проверяй статус контейнеров, HTTP status главной страницы и последние ошибки.

5. SSL и redirect

SSL лучше держать на Nginx-слое. После выпуска сертификата проверь, что HTTP сразу уходит на HTTPS и что www/без www ведут на один основной адрес.

certbot --nginx -d example.com -d www.example.com
curl -I http://example.com
curl -I https://www.example.com

Нормальный результат: один 301 redirect на основной HTTPS-домен, без цепочки из нескольких прыжков.

6. Volumes и данные

Контейнер можно пересоздать в любой момент, поэтому данные не должны жить внутри него. База, uploads, backups и сертификаты должны быть в volume или отдельном managed storage.

  1. Uploads: отдельный volume или S3-compatible storage.
  2. Database: отдельный контейнер с volume или внешний managed DB.
  3. Backups: не в том же контейнере, который можно удалить.

7. Rollback

Перед deploy фиксируй текущую версию image или commit. Если новая сборка сломалась, откат должен быть одной понятной командой, а не ручным поиском старых файлов.

git rev-parse --short HEAD
docker compose images
docker compose up -d --no-deps app

Checklist

  • Есть health endpoint.
  • Контейнеры имеют restart policy.
  • Secrets лежат в .env, не в Git.
  • Backups проверяются через restore.
  • Nginx отдаёт security headers.
Все постыСледующая инструкция