healthcheck rabbitmq по check_port_connectivity: web и worker стартуют после service_healthy, make dev поднимает сервисы с --wait. Иначе docker-proxy принимает TCP до старта брокера и pika спамит IncompatibleProtocolError. dj_worker: --processes 1 --threads 1 вместо процесса на каждое ядро. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
156 lines
5.7 KiB
YAML
156 lines
5.7 KiB
YAML
services:
|
|
xui:
|
|
# 3x-ui для тестирования api. Панель: http://127.0.0.1:2053 (по умолчанию admin/admin)
|
|
image: docker.local/ghcr.io/mhsanaei/3x-ui:latest
|
|
environment:
|
|
XRAY_VMESS_AEAD_FORCED: "false"
|
|
XUI_ENABLE_FAIL2BAN: "false"
|
|
ports:
|
|
- "127.0.0.1:2053:2053"
|
|
volumes:
|
|
- ./docker-services-data/xui/db/:/etc/x-ui/
|
|
- ./docker-services-data/xui/cert/:/root/cert/
|
|
|
|
telegram:
|
|
image: docker.local/aiogram/telegram-bot-api:10.3
|
|
environment:
|
|
TELEGRAM_API_ID: $TG_APP_ID
|
|
TELEGRAM_API_HASH: $TG_APP_HASH
|
|
# --local: webhook на http и любой порт, в том числе на сайт на хосте
|
|
TELEGRAM_LOCAL: "1"
|
|
volumes:
|
|
- telegram-bot-api-data:/var/lib/telegram-bot-api
|
|
network_mode: host
|
|
# ports:
|
|
# - "127.0.0.1:8081:8081"
|
|
# - "127.0.0.1:8082:8082"
|
|
|
|
telegram-files:
|
|
# файлы, присланные ботам документами: Bot API сервер в --local режиме не отдает их по HTTP, а пишет на диск
|
|
# с правами 0600 от uid 101. Воркеры nginx работают от того же uid 101. Отдаются только documents/
|
|
image: docker.local/nginx:1.30.5-alpine-slim
|
|
configs:
|
|
- source: telegram-files
|
|
target: /etc/nginx/conf.d/default.conf
|
|
volumes:
|
|
- telegram-bot-api-data:/var/lib/telegram-bot-api:ro
|
|
network_mode: host
|
|
restart: unless-stopped
|
|
|
|
redis:
|
|
image: docker.local/redis:8.8.3-alpine
|
|
ports:
|
|
- "127.0.0.1:6379:6379"
|
|
volumes:
|
|
- redis_data:/data
|
|
|
|
rabbitmq:
|
|
image: docker.local/rabbitmq:4.3.6-management-alpine
|
|
# Данные лежат в mnesia/rabbit@<hostname>, поэтому hostname и cookie фиксируем,
|
|
# чтобы при переносе volume новый контейнер смог их прочитать
|
|
hostname: $RABBITMQ_HOST
|
|
environment:
|
|
RABBITMQ_NODENAME: rabbit@$RABBITMQ_HOST
|
|
RABBITMQ_ERLANG_COOKIE: $RABBITMQ_ERLANG_COOKIE
|
|
RABBITMQ_DEFAULT_VHOST: $RABBITMQ_VHOST
|
|
# guest пускают только с localhost контейнера, поэтому свой пользователь
|
|
RABBITMQ_DEFAULT_USER: $RABBITMQ_USER
|
|
RABBITMQ_DEFAULT_PASS: $RABBITMQ_PASSWORD
|
|
ports:
|
|
- "127.0.0.1:5672:5672"
|
|
- "127.0.0.1:15672:15672"
|
|
volumes:
|
|
- rabbitmq_data:/var/lib/rabbitmq
|
|
# docker-proxy принимает TCP еще до старта брокера и сразу рвет соединение: ждем, когда AMQP-порт реально слушается
|
|
healthcheck:
|
|
test: [ "CMD", "rabbitmq-diagnostics", "-q", "check_port_connectivity" ]
|
|
interval: 30s
|
|
timeout: 10s
|
|
start_period: 60s
|
|
start_interval: 1s
|
|
|
|
postgres:
|
|
image: docker.local/postgres:16.15-alpine3.23
|
|
environment:
|
|
POSTGRES_DB: $DB_NAME
|
|
POSTGRES_USER: $DB_USER
|
|
POSTGRES_PASSWORD: $DB_PASSWD
|
|
ports:
|
|
- "127.0.0.1:5432:5432"
|
|
volumes:
|
|
- postgres_data:/var/lib/postgresql/data
|
|
|
|
# приложение: docker compose --profile app up -d --build. Без профиля поднимается только инфраструктура для разработки
|
|
migrate:
|
|
<<: &app
|
|
build: .
|
|
image: mypointvpn:latest
|
|
profiles: [ app ]
|
|
env_file: .env
|
|
# адреса сервисов внутри сети compose поверх .env, который настроен на разработку с хоста
|
|
environment:
|
|
DJANGO_SETTINGS_MODULE: MyPointVPN.settings.docker
|
|
DB_HOST: postgres
|
|
DB_PORT: "5432"
|
|
RABBITMQ_ADDRESS: rabbitmq:5672
|
|
TELEGRAM_API_URL: http://telegram:8081
|
|
TELEGRAM_FILES_URL: http://telegram-files:8083
|
|
# Bot API сервер ходит на webhook по имени сервиса сайта, домен не нужен
|
|
TELEGRAM_WEBHOOK_URL: http://web:8000
|
|
ALLOWED_HOSTS: web,127.0.0.1,localhost
|
|
volumes:
|
|
# свой CA (SERVERUS_CERTIFICATES=local) и бэкапы - на хосте
|
|
- ./extra/serverus/ca:/app/extra/serverus/ca
|
|
- ./extra/backups:/app/extra/backups
|
|
command: python manage.py migrate --noinput
|
|
depends_on: [ postgres ]
|
|
|
|
web:
|
|
<<: *app
|
|
# админка только с хоста: ssh -L 8000:127.0.0.1:8000 сервер
|
|
ports:
|
|
- "127.0.0.1:8000:8000"
|
|
restart: unless-stopped
|
|
depends_on:
|
|
migrate:
|
|
condition: service_completed_successfully
|
|
rabbitmq:
|
|
condition: service_healthy
|
|
telegram:
|
|
condition: service_started
|
|
telegram-files:
|
|
condition: service_started
|
|
|
|
worker:
|
|
<<: *app
|
|
# check_points заново запускает ежедневные проверки точек: цепочки переживают потерю очереди
|
|
command: sh -c "python manage.py check_points && exec python manage.py rundramatiq --processes 1 --threads 8"
|
|
restart: unless-stopped
|
|
# установка может идти до часа: даем задачам закончиться, иначе супервизор снимет их как прерванные
|
|
stop_grace_period: 5m
|
|
depends_on:
|
|
migrate:
|
|
condition: service_completed_successfully
|
|
rabbitmq:
|
|
condition: service_healthy
|
|
|
|
volumes:
|
|
telegram-bot-api-data:
|
|
redis_data:
|
|
rabbitmq_data:
|
|
postgres_data:
|
|
|
|
configs:
|
|
telegram-files:
|
|
content: |
|
|
server {
|
|
listen 127.0.0.1:8083;
|
|
access_log off;
|
|
location ~ ^/[0-9]+:[A-Za-z0-9_-]+/documents/[^/]+$$ {
|
|
root /var/lib/telegram-bot-api;
|
|
}
|
|
location / {
|
|
return 404;
|
|
}
|
|
}
|