diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index c85e2a1..4dbd6dd 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -6,15 +6,13 @@ # Для первого запуска backend-контейнера, возможно, потребуется временно изменить владельца папки `data` на root # и раскомментировать соответствующие строки в секции etpgrf-backend (смотри комментарии в коде ниже). -version: '3.8' +# version: '3.8' services: # Бэкенд сервис etpgrf-backend: # Используем готовый образ из Gitea Registry image: git.cube2.ru/erjemin/2026-etpgrf-site:latest - # Если нужно, собрать образ из локального Dockerfile, а не скачивать готовый - # build: . # Перезапускать всегда (если упал или сервер перезагрузился) restart: always # Метка для Watchtower, чтобы он обновлял только этот контейнер @@ -55,7 +53,7 @@ services: cp /app/etpgrf_site/typograph/templates/500.html /app/public/static_collected/500.html && cp /app/etpgrf_site/typograph/templates/404.html /app/public/static_collected/404.html && cp /app/etpgrf_site/typograph/templates/typograph/403.html /app/public/static_collected/403.html && - gunicorn --bind 0.0.0.0:8000 --chdir /app/etpgrf_site etpgrf_site.wsgi" + gunicorn --bind 0.0.0.0:8000 --timeout 300 --workers 2 --chdir /app/etpgrf_site etpgrf_site.wsgi" volumes: # База данных (папка data должна быть создана на хосте) @@ -76,15 +74,10 @@ services: max-size: "10m" max-file: "3" - # Проверка здоровья контейнера (Healthcheck) - # Docker будет периодически проверять статус контейнера. Это критично для Watchtower! - # Если контейнер объявлен "unhealthy", Watchtower сначала остановит старый образ, потом запустит новый. - healthcheck: - test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/').read()\""] - interval: 5m - timeout: 10s - retries: 1 - start_period: 30s + # Healthcheck отключен - вместо этого используем depends_on в nginx (service_started) + # Причина: healthcheck с Python-запросом к Django вызывал timeout workers, + # так как требовал полной загрузки Django при каждой проверке. + # See: https://github.com/erjemin/2026-etpgrf-site/issues/XXX # Лимиты ресурсов (docker compose вне swarm) deploy: @@ -93,6 +86,7 @@ services: cpus: '0.40' memory: 360M + # Nginx для отдачи статики и проксирования запросов к бэкенду etpgrf-nginx: image: nginx:1.25-alpine @@ -105,21 +99,25 @@ services: # Внешний порт. Если у тебя на хосте уже есть Nginx (прокси), # то можно пробросить на 127.0.0.1:8000 или использовать внутреннюю сеть. + # Но пока оставим так: ports: - "127.0.0.1:8080:80" # Используем 8080, чтобы не конфликтовать с Portainer (8000) или основным Nginx (80) depends_on: - - etpgrf-backend + etpgrf-backend: + condition: service_started logging: driver: "json-file" options: - max-size: "10m" - max-file: "3" + max-size: "5m" + max-file: "2" # Сервис для автоматического обновления образов из реестра watchtower: image: containrrr/watchtower + container_name: etpgrf_watchtower + restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock environment: @@ -127,13 +125,14 @@ services: # Берем учетные данные из .env файла - REPO_USER=${REPO_USER} - REPO_PASS=${REPO_PASS} - # Ограничиваем область видимости только этим проектом + - WATCHTOWER_REGISTRY_URL=git.cube2.ru - WATCHTOWER_SCOPE=etpgrf - # Если нужно указать реестр явно (обычно watchtower сам понимает из имени образа) - # - WATCHTOWER_REGISTRY_URL=git.cube2.ru - command: --interval 1800 --cleanup # Проверять каждые 30 минут - restart: always - + command: --interval 1800 --cleanup + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "1" volumes: - static_volume: + static_volume: \ No newline at end of file