DispelEvilBot/docker-compose.yml

128 lines
3.8 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Базовый compose для локального запуска и разработки.
# Секреты берутся из .env (см. .env.example).
#
# docker compose up --build
#
name: dispelevilbot
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 в .env}
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
# ports:
# - "5432:5432" # раскомментировать для доступа к БД с хоста
# Накат миграций Flyway перед стартом бота (идемпотентно).
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 в .env}
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:
build: .
image: dispelevilbot-bot:local
restart: unless-stopped
env_file:
- .env
environment:
# Внутри сети compose БД доступна по имени сервиса.
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 + HTMX). Порт — только loopback: наружу выйдет через reverse proxy
# вместе с TLS и доменом (Блок 2.4/4.2).
admin:
build:
context: .
dockerfile: admin/Dockerfile
image: dispelevilbot-admin:local
restart: unless-stopped
env_file:
- .env
environment:
DB_HOST: postgres
DB_PORT: "5432"
CLICKHOUSE_HOST: clickhouse
CLICKHOUSE_PORT: "8123"
ADMIN_HOST: 0.0.0.0
ADMIN_PORT: "8000"
ports:
- "${ADMIN_BIND_IP:-127.0.0.1}:${ADMIN_HTTP_PORT:-8000}:8000"
depends_on:
postgres:
condition: service_healthy
migrate:
condition: service_completed_successfully
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# Аналитика событий (Блок 3). DDL — в clickhouse/init/.
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 в .env}
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
volumes:
- clickhousedata:/var/lib/clickhouse
- ./clickhouse/init:/docker-entrypoint-initdb.d:ro
ports:
- "127.0.0.1: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
volumes:
pgdata:
clickhousedata: