Перейти до змісту

Deployment Cheatsheet


Перший запуск

cp .env.example .env
# Відредагуй: SECRET_KEY, POSTGRES_PASSWORD, NGROK_AUTHTOKEN, NGROK_DOMAIN

docker compose up --build
# Очікуй: "Uvicorn running on http://0.0.0.0:8001"

open http://localhost          # через nginx
open http://localhost:4040     # ngrok dashboard

Production checklist

Обов'язково

Параметр Вимога
SECRET_KEY Унікальний, 50+ символів, не "django-insecure-..."
DEBUG False
ALLOWED_HOSTS Конкретні домени, не ['*']
CSRF_TRUSTED_ORIGINS Включає ngrok домен
DATABASE_URL PostgreSQL з strong password
REDIS_URL Redis (не InMemoryChannelLayer)
.env У .gitignore, не в git
entrypoint.sh Без --reload у Uvicorn

Перевірка

docker compose exec web python manage.py check --deploy
# Показує всі security warnings перед deploy

Змінні середовища

# .env — обов'язкові:
SECRET_KEY=<50+ символів>
DEBUG=False
ALLOWED_HOSTS=localhost,your-domain.com
DATABASE_URL=postgres://user:pass@db:5432/dbname
REDIS_URL=redis://redis:6379/0
NGROK_AUTHTOKEN=<з ngrok dashboard>
NGROK_DOMAIN=<your-subdomain.ngrok-free.app>

# Генерувати SECRET_KEY:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"

Docker Compose — типові команди

docker compose up --build       # перший запуск / після зміни Dockerfile
docker compose up -d            # background
docker compose down             # зупинити (volumes зберігаються)
docker compose down -v          # + видалити volumes (скинути БД)
docker compose logs -f web      # слідкувати за логами
docker compose exec web bash    # shell у контейнері
docker compose restart web      # перезапустити тільки web

Nginx — ключові параметри для WebSocket

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 300s;

Без цих рядків WebSocket не відкриється.


Redis — socket_timeout=None

# settings.py — CRITICAL для idle WS з'єднань:
"CONFIG": {
    "hosts": [{
        "address": REDIS_URL,
        "socket_timeout": None,       # ← не 5 (default)
        "health_check_interval": 30,
    }]
}

Типові помилки

Симптом Причина Виправлення
403 CSRF через ngrok CSRF_TRUSTED_ORIGINS не налаштовано Додати домен у settings.py
ERR_NGROK_8012 ngrok і nginx на різних мережах Явна app-net network
Static 404 collectstatic не запущений Перевірити entrypoint.sh
WS 400 через nginx Відсутні Upgrade headers proxy_http_version 1.1 у nginx.conf
TimeoutError: redis socket_timeout=5 "socket_timeout": None
web unhealthy migrate або uvicorn падає docker compose logs web

HTTPS у production

# settings.py — після налаштування SSL:
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
# nginx.conf — SSL termination:
server {
    listen 443 ssl;
    ssl_certificate     /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
}
server {
    listen 80;
    return 301 https://$host$request_uri;
}