145 lines
5.4 KiB
YAML
145 lines
5.4 KiB
YAML
# Прод/test-контур: образы тянутся из Gitea Registry.
|
||
#
|
||
# Контуры разделяются именем compose-проекта (-p) и файлом окружения (ENV_FILE):
|
||
# ENV_FILE=env/prod.env docker compose -p prod -f docker-compose.prod.yml up -d
|
||
# ENV_FILE=env/test.env docker compose -p test -f docker-compose.prod.yml up -d
|
||
#
|
||
# Имя проекта задаёт отдельные volume'ы (pgdata) — у prod и test свои БД.
|
||
services:
|
||
postgres:
|
||
image: postgres:16-alpine
|
||
restart: unless-stopped
|
||
environment:
|
||
POSTGRES_DB: ${DB_NAME:-dispel_evil}
|
||
POSTGRES_USER: ${DB_USER:-de_admin}
|
||
POSTGRES_PASSWORD: ${DB_PASSWORD:?задайте DB_PASSWORD}
|
||
volumes:
|
||
- pgdata:/var/lib/postgresql/data
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-de_admin} -d ${DB_NAME:-dispel_evil}"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 10
|
||
|
||
migrate:
|
||
image: flyway/flyway:10
|
||
command: ["migrate"]
|
||
environment:
|
||
FLYWAY_URL: jdbc:postgresql://postgres:5432/${DB_NAME:-dispel_evil}
|
||
FLYWAY_USER: ${DB_USER:-de_admin}
|
||
FLYWAY_PASSWORD: ${DB_PASSWORD:?задайте DB_PASSWORD}
|
||
FLYWAY_LOCATIONS: filesystem:/flyway/sql
|
||
FLYWAY_BASELINE_ON_MIGRATE: "true"
|
||
FLYWAY_CONNECT_RETRIES: "10"
|
||
volumes:
|
||
- ./sql:/flyway/sql:ro
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
restart: "no"
|
||
|
||
bot:
|
||
image: ${REGISTRY:-git.mpakosrv.ru}/mpakobecex/dispelevilbot-bot:${IMAGE_TAG:-latest}
|
||
restart: unless-stopped
|
||
env_file:
|
||
- ${ENV_FILE:-env/prod.env}
|
||
environment:
|
||
DB_HOST: postgres
|
||
DB_PORT: "5432"
|
||
CLICKHOUSE_HOST: clickhouse
|
||
CLICKHOUSE_PORT: "8123"
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
migrate:
|
||
condition: service_completed_successfully
|
||
# Без ожидания здоровья: аналитика некритична, бот работает и при недоступном ClickHouse.
|
||
clickhouse:
|
||
condition: service_started
|
||
logging:
|
||
driver: json-file
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
|
||
# Админка (FastAPI + Jinja2/HTMX), образ из Gitea Registry.
|
||
# Наружу пока не публикуется: только loopback хоста; домен/TLS — Блок 2.4/4.2.
|
||
admin:
|
||
image: ${REGISTRY:-git.mpakosrv.ru}/mpakobecex/dispelevilbot-admin:${IMAGE_TAG:-latest}
|
||
restart: unless-stopped
|
||
env_file:
|
||
- ${ENV_FILE:-env/prod.env}
|
||
environment:
|
||
DB_HOST: postgres
|
||
DB_PORT: "5432"
|
||
CLICKHOUSE_HOST: clickhouse
|
||
CLICKHOUSE_PORT: "8123"
|
||
ADMIN_HOST: 0.0.0.0
|
||
ADMIN_PORT: "8000"
|
||
ports:
|
||
# По умолчанию только loopback. Для NPM (контейнер) задайте ADMIN_BIND_IP=172.17.0.1:
|
||
# порт остаётся недоступен из интернета, но виден контейнерам на bridge.
|
||
- "${ADMIN_BIND_IP:-127.0.0.1}:${ADMIN_HTTP_PORT:-8101}:8000"
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
migrate:
|
||
condition: service_completed_successfully
|
||
logging:
|
||
driver: json-file
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
|
||
# Аналитика событий (docs/events.md). Наружу не публикуется:
|
||
# только loopback хоста для бэкапа/туннеля; бот ходит внутрь сети compose.
|
||
clickhouse:
|
||
image: clickhouse/clickhouse-server:25.3
|
||
restart: unless-stopped
|
||
environment:
|
||
CLICKHOUSE_DB: ${CLICKHOUSE_DB:-analytics}
|
||
CLICKHOUSE_USER: ${CLICKHOUSE_USER:-de_bot}
|
||
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD:?задайте CLICKHOUSE_PASSWORD}
|
||
# Нужно для создания пользователей/грантов (в финале — read-only пользователь для Superset).
|
||
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
|
||
volumes:
|
||
- clickhousedata:/var/lib/clickhouse
|
||
# DDL применяется один раз при первой инициализации (пустой data-каталог).
|
||
- ./clickhouse/init:/docker-entrypoint-initdb.d:ro
|
||
# trace_log не нужен и на тестовом контуре съедал гигабайты в сутки.
|
||
- ./clickhouse/config.d/disable-trace-log.xml:/etc/clickhouse-server/config.d/disable-trace-log.xml:ro
|
||
ports:
|
||
# Порт контура задаётся в env (prod 8123, test 8124) — иначе конфликт на одной VPS.
|
||
- "127.0.0.1:${CLICKHOUSE_HTTP_PORT:-8123}:8123"
|
||
ulimits:
|
||
nofile:
|
||
soft: 262144
|
||
hard: 262144
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "wget --spider -q -T 5 http://127.0.0.1:8123/ping || exit 1"]
|
||
interval: 15s
|
||
timeout: 10s
|
||
retries: 10
|
||
start_period: 20s
|
||
|
||
# --- Reverse proxy и TLS (Блок 2.4) ---
|
||
# Включается, когда появится админка/Mini App (Блоки 4–5).
|
||
# Раскомментировать и положить deploy/Caddyfile:
|
||
#
|
||
# caddy:
|
||
# image: caddy:2
|
||
# restart: unless-stopped
|
||
# ports:
|
||
# - "80:80"
|
||
# - "443:443"
|
||
# volumes:
|
||
# - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
|
||
# - caddy_data:/data
|
||
# - caddy_config:/config
|
||
|
||
volumes:
|
||
pgdata:
|
||
clickhousedata:
|
||
# caddy_data:
|
||
# caddy_config:
|