Отлично, Akrom 🔥 — у тебя уже почти “продакшн-готовый” Docker setup для Django с Celery, Redis, PostgreSQL через pgbouncer, и даже Flower для мониторинга. Давай разберём логику всего твоего стека, что делает каждый файл, как это оптимизировать для продакшна и как правильно управлять контейнерами.
-
Стартует через
/startскрипт. -
Скрипт выполняет:
migrate(применяет миграции БД)collectstatic(собирает статические файлы)- Запускает ASGI сервер через
uvicorn(можно заменить на Gunicorn для продакшна)
-
Подключается к:
- Redis (кеш, брокер Celery)
- pgbouncer → PostgreSQL (оптимизация подключений к БД)
-
Оптимизация для продакшна:
-
Лучше использовать Gunicorn с
uvicornворкерами:gunicorn core.asgi:application -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 --workers 4 --timeout 120
Это позволит обрабатывать больше запросов одновременно.
-
-
Хранит данные.
-
volume
pg_dataгарантирует, что данные сохраняются после перезапуска контейнера. -
healthcheck ждёт готовности PostgreSQL перед запуском pgbouncer и web.
-
Оптимизация:
- Настроить параметры pool_size, max_connections для PostgreSQL и pgbouncer.
- Для продакшна использовать отдельный сервер БД (или управляемый сервис) для стабильности.
-
Лёгкий connection pool для PostgreSQL.
-
Подключается к
db, отдаёт соединения веб-сервисам. -
Плюсы:
- Уменьшает нагрузку на PostgreSQL при множественных соединениях.
- Можно масштабировать воркеры Django без проблем.
-
Продакшн: можно включить TLS и логирование, ограничить max_client_conn.
-
Кеширование и брокер для Celery.
-
Важен для производительности:
- Django caching
- Celery брокер
-
Продакшн: лучше использовать отдельный Redis сервер или managed Redis для стабильности.
-
Worker: обрабатывает задачи (отправка email, обработка аудио и т.д.)
-
Beat: планировщик периодических задач.
-
Скрипты стартуют после
sleep10 сек, чтобы RabbitMQ (если включён) и Redis были готовы. -
Продакшн:
- Увеличить количество worker процессов (
-c 4или больше, зависит от CPU) - Включить
--max-tasks-per-childдля предотвращения утечек памяти
- Увеличить количество worker процессов (
- Мониторинг Celery в реальном времени на порту 5555.
- Можно отключать в проде, если не нужен постоянный доступ.
- Ждёт готовности PostgreSQL (
postgres_ready()) - После чего выполняет команду, переданную в контейнере (
exec "$@")
-
Django:
migratecollectstatic- Запуск ASGI через uvicorn (или Gunicorn)
-
Для продакшна лучше Gunicorn + Uvicorn worker.
- Worker, Beat, Flower ждут RabbitMQ/Redis (
sleep 10), чтобы не падали при старте. - После этого запускают свои процессы.
-
Gunicorn вместо Uvicorn в
start:gunicorn core.asgi:application \ -k uvicorn.workers.UvicornWorker \ --bind 0.0.0.0:8000 \ --workers 4 \ --timeout 120 \ --log-level info- Позволяет обрабатывать больше параллельных запросов.
-
Разделение dev и prod Dockerfile
- Для dev:
--reloaduvicorn - Для prod: Gunicorn + no reload + оптимизированные зависимости
- Для dev:
-
Volumes
- Не включать статику и медиа для сборки, чтобы Docker кэшировал зависимости.
.dockerignoreуже настроен — отлично.
-
Environment
- Отдельные
.envдля dev и prod - Не хранить секреты в Dockerfile
- Отдельные
-
Celery
-
Настроить concurrency:
celery -A core worker -l info -c 4 --max-tasks-per-child=100
-
Beat scheduler: хранить PID в volume, чтобы перезапускался корректно
-
-
Healthchecks
- Для всех критических контейнеров (web, db, redis) — добавить healthcheck, чтобы Docker перезапускал падение
-
Logging
- Gunicorn + Nginx логи в stdout/stderr → Docker logging driver → удобно для мониторинга
-
Reverse proxy (Nginx)
- Если Nginx через Docker:
depends_on: web, volume для статики - SSL через LetsEncrypt
- Если Nginx через Docker:
-
Запуск всех:
docker compose up -d
-
Перезапуск всех:
docker compose restart
-
Остановка:
docker compose down
-
Смотр логов:
docker compose logs -f web docker compose logs -f celery_worker
-
Войти внутрь контейнера:
docker exec -it django_app bash -
Проверка состояния контейнеров:
docker compose ps
Backend/
├─ deployments/compose/django/
│ ├─ Dockerfile # отдельный для dev/prod
│ ├─ entrypoint # ждёт БД
│ ├─ start # запуск Gunicorn/uvicorn
│ └─ celery/ # worker/beat/flower scripts
├─ docker-compose.yml
├─ .env
├─ requirements.txt
├─ app/ # Django project
├─ assets/
│ ├─ staticfiles/
│ └─ media/
└─ .dockerignore
- Dev: uvicorn
--reload - Prod: Gunicorn + Uvicorn worker
.dockerignoreубирает лишние файлы для ускорения сборки- Healthchecks + volumes для сохранения данных
- Логи в stdout/stderr → легко интегрировать с monitoring
💡 Главные рекомендации для продакшн:
- Gunicorn вместо
uvicorn --reload - Concurrency Celery и max-tasks-per-child
- Healthchecks всех сервисов
- Отдельный volume для БД, статики и медиа
- SSL + Nginx reverse proxy
- Логи через Docker (без локальных файлов)
.envотдельно, секреты не в Dockerfile
Если хочешь, я могу прямо сейчас переписать твой Dockerfile, start/entrypoint и docker-compose.yml, чтобы он был оптимизирован под продакшн, с Gunicorn, Celery, Redis, PostgreSQL через pgbouncer, Nginx и SSL-ready, при этом код стал читаемым и компактным.
Хочешь, чтобы я сделал это?