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

Deployment


Поточний стан

Проєкт має Docker-стек, налаштований для локальної розробки. Production-ready статус потребує доопрацювань.

Що готово

Компонент Стан
Dockerfile є, base python:3.12-slim
docker-compose.yml є, 6 сервісів
entrypoint.sh є (migrate → collectstatic → seed → uvicorn)
.env.example є
DATABASE_URL switching ✅ (raise Exception якщо не встановлено)
REDIS_URL switching ✅ (InMemory або Redis channel layer)
Nginx reverse proxy ✅ (nginx:1.27-alpine, порт 80)
ASGI server (Uvicorn) ✅
Static files ✅ (collectstatic, nginx або whitenoise)

Що потрібно для production

Задача Деталь
SECRET_KEY з environment наразі може бути hardcoded в dev
DEBUG=False з обов'язковим ALLOWED_HOSTS
HTTPS і secure cookies SECURE_SSL_REDIRECT, SESSION_COOKIE_SECURE, CSRF_COOKIE_SECURE
Uvicorn без --reload --reload тільки для dev
DebugExceptionMiddleware видалити повертає traceback клієнтам (security issue)
Backup / rollback plan БД + media
Logging і monitoring structured logs, health endpoint

Docker Compose сервіси

services:
  db:      postgres:16-alpine  # порт 5432
  redis:   redis:7-alpine       # порт 6379
  web:     Django ASGI (Uvicorn) # порт 8001
  nginx:   nginx:1.27-alpine    # порт 80 → web:8001
  ngrok:   ngrok/ngrok          # публічний тунель (dev)
  selenium: selenium/standalone-chrome  # E2E тести

Залежності: web запускається після health check db і redis.


entrypoint.sh

#!/bin/sh
python manage.py migrate
python manage.py collectstatic --no-input
if [ "$SEED_DEMO_DATA" = "1" ]; then
    python manage.py seed_demo_data
fi
exec uvicorn notes_project.asgi:application \
    --host 0.0.0.0 --port 8001 --reload

Nginx

Nginx (nginx:1.27-alpine) проксіює: - HTTP → web:8001 - WebSocket → web:8001 (з proxy_http_version 1.1 + Upgrade/Connection headers, proxy_read_timeout 300s)

CSRF_TRUSTED_ORIGINS повинен містити домен, з якого приходять запити (ngrok URL або production domain).


CI (GitHub Actions)

Файл: .github/workflows/django-tests.yml

Watches: notes_app/**, notes_project/**.

Job 1 (unit + integration, ubuntu-latest) → Job 2 (Selenium, тільки якщо Job 1 ✅).