115 lines
5.5 KiB
YAML
115 lines
5.5 KiB
YAML
# ==============================================================================
|
||
# Docker Compose для PRODUCTION
|
||
# Этот файл запускается на боевом сервере.
|
||
# Вариант 1 (если переименовали в docker-compose.yml): docker compose up -d
|
||
# Вариант 2 (если оставили имя): docker compose -f docker-compose.prod.yml up -d
|
||
# ==============================================================================
|
||
|
||
version: '3.8'
|
||
|
||
services:
|
||
# --- ОCНОВНОЙ СЕРВИС: DJANGO + GUNICORN + WHITENOISE ---
|
||
web:
|
||
# Имя контейнера
|
||
container_name: dq-backend
|
||
|
||
# 1. ОБРАЗ
|
||
# В продакшене мы используем готовый, собранный образ из реестра (Gitea)
|
||
# image: git.cube2.ru/e-serg/dicquo:latest
|
||
# Но пока, для первого деплоя или если реестра нет, можно собирать локально:
|
||
build: .
|
||
|
||
restart: always
|
||
|
||
# 2. Метки для Watchtower (авто-обновление)
|
||
labels:
|
||
- "com.centurylinklabs.watchtower.scope=dq-scope"
|
||
|
||
# 3. КОМАНДА ЗАПУСКА (Замена entrypoint.sh)
|
||
# Выполняем цепочку команд внутри контейнера при запуске:
|
||
# 1. Миграции
|
||
# 2. Collectstatic
|
||
# 3. Создаем папку nginx в примонтированном томе конфигов (если нет)
|
||
# 4. Копирование конфига Nginx с авто-заменой путей через sed (замену реального пути на хосте получаем через переменную окружения HOST_PROJECT_PATH)
|
||
# 5. Инициализация боевого конфига (если нет)
|
||
# 6. Создаем папку для ошибок и копируем туда статические страницы 404/500
|
||
# 7. Запуск Gunicorn
|
||
command: >
|
||
sh -c "python manage.py migrate --noinput &&
|
||
python manage.py collectstatic --noinput &&
|
||
mkdir -p /nginx_configs_host/nginx &&
|
||
sed \"s|/home/user/app/dq-site|${HOST_PROJECT_PATH:-/home/default_user/projects/dq-site}|g\" /app/configs/nginx/dq-app--external-nginx.conf > /nginx_configs_host/nginx/nginx_dq.conf.example &&
|
||
if [ ! -f /nginx_configs_host/nginx/dq-app--external-nginx.conf ]; then
|
||
cp /nginx_configs_host/nginx/nginx_dq.conf.example /nginx_configs_host/nginx/dq-app--external-nginx.conf;
|
||
echo 'INIT: Created new nginx config with correct paths';
|
||
fi &&
|
||
mkdir -p /app/public/media/errors &&
|
||
cp /app/dicquo/templates/static_404.html /app/public/media/errors/404.html &&
|
||
cp /app/dicquo/templates/static_500.html /app/public/media/errors/500.html &&
|
||
gunicorn --workers 3 --bind 0.0.0.0:8000 dicquo.wsgi:application"
|
||
|
||
# 4. Проброс портов (Внешний Nginx -> localhost:8010)
|
||
ports:
|
||
- "8010:8000"
|
||
|
||
# 5. Тома (Volumes)
|
||
volumes:
|
||
# База данных
|
||
# Монтируем папку database с хоста в папку с базой внутри контейнера.
|
||
# Путь в контейнере: /app/database (так как Django ищет базу в BASE_DIR.parent/database)
|
||
- ./database:/app/database
|
||
|
||
# Медиа (папка media должна быть рядом с docker-compose.yml)
|
||
- ./media:/app/public/media
|
||
|
||
# Конфиги (Монтируем папку ./config с хоста в /nginx_configs_host внутри контейнера)
|
||
# Это нужно, чтобы скрипт запуска мог положить туда .example конфиг и прочитать боевой конфиг.
|
||
- ./config:/nginx_configs_host
|
||
|
||
# 6. Переменные окружения
|
||
env_file:
|
||
- .env
|
||
environment:
|
||
- DJANGO_SETTINGS_MODULE=dicquo.settings
|
||
- PYTHONUNBUFFERED=1
|
||
# Передаем переменную с путем на хосте внутрь контейнера, чтобы sed мог её использовать
|
||
- HOST_PROJECT_PATH=${HOST_PROJECT_PATH:-/home/default_user/projects/dq-site}
|
||
|
||
# 7. Логирование (Ротация)
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
|
||
# 8. Ресурсы
|
||
deploy:
|
||
resources:
|
||
limits:
|
||
cpus: '0.40'
|
||
memory: 256M
|
||
mem_limit: 256m
|
||
|
||
# --- WATCHTOWER: АВТО-ОБНОВЛЕНИЕ ОБРАЗОВ ---
|
||
# Следит за реестром Gitea и обновляет контейнер web, если появился новый image
|
||
watchtower:
|
||
image: containrrr/watchtower
|
||
container_name: dq_watchtower
|
||
restart: always
|
||
volumes:
|
||
- /var/run/docker.sock:/var/run/docker.sock
|
||
environment:
|
||
# Токен/Логин для вашего приватного реестра (нужно добавить в .env!)
|
||
# REPO_USER и REPO_PASS должны быть в .env файле на сервере
|
||
- REPO_USER=${REPO_USER}
|
||
- REPO_PASS=${REPO_PASS}
|
||
- WATCHTOWER_SCOPE=dq-scope
|
||
- WATCHTOWER_CLEANUP=true # Удалять старые образы после обновления
|
||
- WATCHTOWER_POLL_INTERVAL=1800 # Проверять каждые 30 минут
|
||
command: --scope dq-scope
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|