From 3a7bb293409bf160570b20e75fddc5ffa4430bae Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 18 Jan 2026 01:05:10 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20docker-compose=20=D1=81=D0=B0=D0=B9?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=BA?= =?UTF-8?q?=D1=88=D0=BD=20(=D0=B8=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 4 ++ docker-compose.prod.yml | 84 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 docker-compose.prod.yml 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: