version: '3.8' services: redis: image: redis:7-alpine container_name: geoip-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru ports: - "127.0.0.1:6379:6379" volumes: - redis_data:/data networks: - geoip-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 3 geoip-ban: build: . container_name: geoip-ban-generator restart: unless-stopped ports: - "${FLASK_PORT:-5000}:${FLASK_PORT:-5000}" environment: - FLASK_HOST=0.0.0.0 - FLASK_PORT=${FLASK_PORT:-5000} - FLASK_DEBUG=${FLASK_DEBUG:-False} - SECRET_KEY=${SECRET_KEY:-change-me-in-production} - APP_NAME=${APP_NAME:-GeoIP Ban Generator} - LOGO_URL=${LOGO_URL:-} - LOGO_LINK=${LOGO_LINK:-/} - FOOTER_TEXT=${FOOTER_TEXT:-© 2026 GeoIP Ban Generator} - FOOTER_LINK=${FOOTER_LINK:-} - FOOTER_LINK_TEXT=${FOOTER_LINK_TEXT:-Documentation} - MAXMIND_PRIMARY_URL=${MAXMIND_PRIMARY_URL:-https://github.com/P3TERX/GeoLite.mmdb/releases/download/2026.02.07/GeoLite2-Country.mmdb} - MAXMIND_FALLBACK_URL=${MAXMIND_FALLBACK_URL:-https://git.io/GeoLite2-Country.mmdb} - MAXMIND_UPDATE_INTERVAL_DAYS=${MAXMIND_UPDATE_INTERVAL_DAYS:-7} - MAXMIND_AUTO_UPDATE=${MAXMIND_AUTO_UPDATE:-True} - CACHE_ENABLED=${CACHE_ENABLED:-True} - CACHE_TTL_SECONDS=${CACHE_TTL_SECONDS:-3600} # Redis configuration - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_DB=${REDIS_DB:-0} - REDIS_PASSWORD=${REDIS_PASSWORD:-} - REDIS_ENABLED=${REDIS_ENABLED:-true} - REDIS_CACHE_TTL=${REDIS_CACHE_TTL:-86400} volumes: - geoip_data:/app/geoip_db networks: - geoip-network depends_on: redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:${FLASK_PORT:-5000}/"] interval: 30s timeout: 10s retries: 3 start_period: 40s geoip-scheduler: build: . container_name: geoip-scheduler restart: unless-stopped environment: - MAXMIND_PRIMARY_URL=${MAXMIND_PRIMARY_URL:-https://github.com/P3TERX/GeoLite.mmdb/releases/download/2026.02.07/GeoLite2-Country.mmdb} - MAXMIND_FALLBACK_URL=${MAXMIND_FALLBACK_URL:-https://git.io/GeoLite2-Country.mmdb} - MAXMIND_UPDATE_INTERVAL_DAYS=${MAXMIND_UPDATE_INTERVAL_DAYS:-7} - SCHEDULER_ENABLED=${SCHEDULER_ENABLED:-true} - SCAN_INTERVAL=${SCAN_INTERVAL:-30d} - SCAN_TIME=${SCAN_TIME:-02:00} - SCAN_ON_STARTUP=${SCAN_ON_STARTUP:-true} - CACHE_MAX_AGE_HOURS=${CACHE_MAX_AGE_HOURS:-720} - PARALLEL_WORKERS=${PARALLEL_WORKERS:-8} # Redis configuration (for cache invalidation after scan) - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_DB=${REDIS_DB:-0} - REDIS_PASSWORD=${REDIS_PASSWORD:-} - REDIS_ENABLED=${REDIS_ENABLED:-true} volumes: - geoip_data:/app/geoip_db networks: - geoip-network command: python scheduler.py depends_on: - geoip-ban - redis geoip-precache: build: . container_name: geoip-precache restart: "no" environment: - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_DB=${REDIS_DB:-0} - REDIS_PASSWORD=${REDIS_PASSWORD:-} - REDIS_ENABLED=true volumes: - geoip_data:/app/geoip_db networks: - geoip-network command: python precache_configs.py depends_on: - redis - geoip-ban profiles: - tools volumes: geoip_data: driver: local redis_data: driver: local networks: geoip-network: driver: bridge