Files
mypointvpn/docker-compose.yaml
T

120 lines
4.3 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"
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
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
# 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_started
telegram:
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_started
volumes:
telegram-bot-api-data:
redis_data:
rabbitmq_data:
postgres_data: