# ────────────────────────────────────────────────────────────── # BanGUI — Production Compose # # Compatible with: # docker compose -f Docker/compose.prod.yml up -d # podman compose -f Docker/compose.prod.yml up -d # podman-compose -f Docker/compose.prod.yml up -d # # Prerequisites: # Create a .env file at the project root (or pass --env-file): # BANGUI_SESSION_SECRET= # ────────────────────────────────────────────────────────────── name: bangui services: # ── fail2ban ───────────────────────────────────────────────── fail2ban: image: lscr.io/linuxserver/fail2ban:latest container_name: bangui-fail2ban restart: unless-stopped cap_add: - NET_ADMIN - NET_RAW network_mode: host environment: TZ: "${BANGUI_TIMEZONE:-UTC}" PUID: 0 PGID: 0 volumes: - fail2ban-config:/config - fail2ban-run:/var/run/fail2ban - /var/log:/var/log:ro healthcheck: test: ["CMD", "fail2ban-client", "ping"] interval: 30s timeout: 5s start_period: 15s retries: 3 # NOTE: The fail2ban-config volume must be pre-populated with the following files: # • fail2ban/jail.conf (or jail.d/*.conf) with the DEFAULT section containing: # banaction = iptables-allports[lockingopt="-w 5"] # This prevents xtables lock contention errors when multiple jails start in parallel. # See https://fail2ban.readthedocs.io/en/latest/development/environment.html # ── Backend (FastAPI + uvicorn) ───────────────────────────── backend: build: context: .. dockerfile: Docker/Dockerfile.backend container_name: bangui-backend restart: unless-stopped depends_on: fail2ban: condition: service_healthy environment: BANGUI_DATABASE_PATH: "/data/bangui.db" BANGUI_FAIL2BAN_SOCKET: "/var/run/fail2ban/fail2ban.sock" BANGUI_FAIL2BAN_CONFIG_DIR: "/config/fail2ban" BANGUI_LOG_LEVEL: "info" BANGUI_SESSION_SECRET: "${BANGUI_SESSION_SECRET:?Set BANGUI_SESSION_SECRET}" BANGUI_TIMEZONE: "${BANGUI_TIMEZONE:-UTC}" volumes: - bangui-data:/data - fail2ban-run:/var/run/fail2ban:ro - fail2ban-config:/config:rw expose: - "8000" healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')"] interval: 30s timeout: 5s start_period: 10s retries: 3 networks: - bangui-net # ── Frontend (nginx serving built SPA + API proxy) ────────── frontend: build: context: .. dockerfile: Docker/Dockerfile.frontend container_name: bangui-frontend restart: unless-stopped ports: - "${BANGUI_PORT:-8080}:80" depends_on: backend: condition: service_healthy healthcheck: test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:80/"] interval: 30s timeout: 5s start_period: 5s retries: 3 networks: - bangui-net volumes: bangui-data: driver: local fail2ban-config: driver: local fail2ban-run: driver: local networks: bangui-net: driver: bridge