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