diff --git a/.env.example b/.env.example index 3868361..c389198 100644 --- a/.env.example +++ b/.env.example @@ -9,3 +9,7 @@ ALLOWED_HOSTS=localhost,127.0.0.1,0.0.0.0 # Доверенные источники для CSRF (важно для Docker/Nginx) # Укажите здесь URL, по которому вы заходите на сайт (с протоколом и портом) CSRF_TRUSTED_ORIGINS=http://localhost:8000,http://127.0.0.1:8000,http://0.0.0.0:8000 + +# Настройки достпа к пакетам в репозитории, чтобы wathtower мог проверять их свежесть и скачивать +REPO_USER=xxxxx +REPO_PASS=xxxxx diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..a8ffacb --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,84 @@ +version: '3.8' + +services: + # Бэкенд сервис + etpgrf-backend: + # Используем готовый образ из Gitea Registry + image: git.cube2.ru/erjemin/2026-etpgrf-site:latest + # Перезапускать всегда (если упал или сервер перезагрузился) + restart: always + + # Метка для Watchtower, чтобы он обновлял только этот контейнер + labels: + - "com.centurylinklabs.watchtower.scope=etpgrf" + + # Запускаем collectstatic перед стартом + command: sh -c "python etpgrf_site/manage.py collectstatic --noinput && gunicorn --bind 0.0.0.0:8000 --chdir /app/etpgrf_site etpgrf_site.wsgi" + + volumes: + # База данных (папка data должна быть создана на хосте) + - ./data:/app/data + # Статика (общий том) + - static_volume:/app/public/static_collected + # Медиа (папка media должна быть создана на хосте) + - ./media:/app/public/media + + env_file: + - .env + + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # Nginx для отдачи статики и проксирования запросов к бэкенду + etpgrf-nginx: + image: nginx:1.25-alpine + restart: always + + # Метка для Watchtower (хотя nginx:alpine обновляется редко, но пусть будет) + labels: + - "com.centurylinklabs.watchtower.scope=etpgrf" + + volumes: + # Конфиг берем из репозитория + - ./config/nginx/etpgrf--internal-nginx.conf:/etc/nginx/nginx.conf:ro + - static_volume:/app/public/static_collected + - ./media:/app/public/media + + # Внешний порт. Если у тебя на хосте уже есть Nginx (прокси), + # то можно пробросить на 127.0.0.1:8000 или использовать внутреннюю сеть. + # Но пока оставим так: + ports: + - "127.0.0.1:8080:80" # Используем 8080, чтобы не конфликтовать с Portainer (8000) или основным Nginx (80) + + depends_on: + - etpgrf-backend + + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # Сервис для автоматического обновления образов из реестра + watchtower: + image: containrrr/watchtower + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - DOCKER_API_VERSION=1.44 + # Берем учетные данные из .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 300 --cleanup # Проверять каждые 5 минут + + +volumes: + static_volume: