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.
- Uploads: отдельный volume или S3-compatible storage.
- Database: отдельный контейнер с volume или внешний managed DB.
- Backups: не в том же контейнере, который можно удалить.
7. Rollback
Перед deploy фиксируй текущую версию image или commit. Если новая сборка сломалась, откат должен быть одной понятной командой, а не ручным поиском старых файлов.
git rev-parse --short HEAD
docker compose images
docker compose up -d --no-deps appChecklist
- Есть health endpoint.
- Контейнеры имеют restart policy.
- Secrets лежат в .env, не в Git.
- Backups проверяются через restore.
- Nginx отдаёт security headers.