pelmeni-shield-vpn/docker-compose.yml

79 lines
2.2 KiB
YAML

version: "3.8"
services:
# 1. 3X-UI: Xray-core движок + скрытая веб-панель
3x-ui:
image: ghcr.io/mhsanaei/3x-ui:latest
container_name: 3x-ui-shield
restart: always
environment:
- XRAY_VMESS_AEAD_FORCED=false
volumes:
- ./3x-ui:/etc/x-ui/
- ./certbot/certs:/root/cert/
ports:
- "443:443" # Xray VLESS (единственный открытый защищенный порт)
- "127.0.0.1:2053:2053" # Панель 3X-UI СТРОГО на localhost (доступ через SSH-туннель!)
networks:
- shield_net
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 2. JPCHX Web App & Forum (Python Flask + SQLite)
jpchx-app:
build:
context: ./site
dockerfile: Dockerfile
container_name: jpchx-app
restart: always
volumes:
- ./site/data:/app/data
networks:
- shield_net
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 3. Nginx Decoy: Шлюз сайта Клуба ЖПЧХ + скрытый шлюз подписок
nginx-decoy:
image: nginx:alpine
container_name: nginx-decoy
restart: always
ports:
- "80:80" # HTTP для ACME certbot и редиректа на HTTPS
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./site/static:/usr/share/nginx/html/static:ro
- ./certbot/www:/var/www/certbot:ro
- ./certbot/certs:/etc/letsencrypt:ro
networks:
- shield_net
depends_on:
- 3x-ui
- jpchx-app
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 4. Certbot: автоматический выпуск и продление SSL Let's Encrypt
certbot:
image: certbot/certbot:latest
container_name: certbot-ssl
volumes:
- ./certbot/certs:/etc/letsencrypt/
- ./certbot/www:/var/www/certbot/
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12d & wait $${!}; done;'"
networks:
- shield_net
networks:
shield_net:
name: shield_net
driver: bridge