# ============================================================================= # World Monitor — Docker / Podman Compose # ============================================================================= # Self-contained stack: app + Redis + AIS relay. # # Quick start: # cp .env.example .env # add your API keys # docker compose up -d --build # # The app will be available at http://localhost:3000 # ============================================================================= services: worldmonitor: build: context: . dockerfile: Dockerfile image: worldmonitor:latest container_name: worldmonitor ports: - "${WM_PORT:-3000}:8080" environment: UPSTASH_REDIS_REST_URL: "http://redis-rest:80" UPSTASH_REDIS_REST_TOKEN: "${REDIS_TOKEN:-wm-local-token}" LOCAL_API_PORT: "46123" LOCAL_API_MODE: "docker" LOCAL_API_CLOUD_FALLBACK: "false" WS_RELAY_URL: "http://ais-relay:3004" # LLM provider (any OpenAI-compatible endpoint) LLM_API_URL: "${LLM_API_URL:-}" LLM_API_KEY: "${LLM_API_KEY:-}" LLM_MODEL: "${LLM_MODEL:-}" GROQ_API_KEY: "${GROQ_API_KEY:-}" # Data source API keys (optional — features degrade gracefully) AISSTREAM_API_KEY: "${AISSTREAM_API_KEY:-}" FINNHUB_API_KEY: "${FINNHUB_API_KEY:-}" EIA_API_KEY: "${EIA_API_KEY:-}" FRED_API_KEY: "${FRED_API_KEY:-}" ACLED_ACCESS_TOKEN: "${ACLED_ACCESS_TOKEN:-}" NASA_FIRMS_API_KEY: "${NASA_FIRMS_API_KEY:-}" CLOUDFLARE_API_TOKEN: "${CLOUDFLARE_API_TOKEN:-}" AVIATIONSTACK_API: "${AVIATIONSTACK_API:-}" # Docker secrets (recommended for API keys — keeps them out of docker inspect). # Create secrets/ dir with one file per key, then uncomment below. # See SELF_HOSTING.md or docker-compose.override.yml for details. # secrets: # - GROQ_API_KEY # - AISSTREAM_API_KEY # - FINNHUB_API_KEY # - FRED_API_KEY # - NASA_FIRMS_API_KEY # - LLM_API_KEY depends_on: redis-rest: condition: service_started ais-relay: condition: service_started restart: unless-stopped ais-relay: build: context: . dockerfile: Dockerfile.relay image: worldmonitor-ais-relay:latest container_name: worldmonitor-ais-relay environment: AISSTREAM_API_KEY: "${AISSTREAM_API_KEY:-}" PORT: "3004" restart: unless-stopped redis: image: docker.io/redis:7-alpine container_name: worldmonitor-redis command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis-data:/data restart: unless-stopped redis-rest: build: context: docker dockerfile: Dockerfile.redis-rest image: worldmonitor-redis-rest:latest container_name: worldmonitor-redis-rest ports: - "127.0.0.1:8079:80" environment: SRH_TOKEN: "${REDIS_TOKEN:-wm-local-token}" SRH_CONNECTION_STRING: "redis://redis:6379" depends_on: - redis restart: unless-stopped # Docker secrets — uncomment and point to your secret files. # Example: echo "gsk_abc123" > secrets/groq_api_key.txt # secrets: # GROQ_API_KEY: # file: ./secrets/groq_api_key.txt # AISSTREAM_API_KEY: # file: ./secrets/aisstream_api_key.txt # FINNHUB_API_KEY: # file: ./secrets/finnhub_api_key.txt # FRED_API_KEY: # file: ./secrets/fred_api_key.txt # NASA_FIRMS_API_KEY: # file: ./secrets/nasa_firms_api_key.txt # LLM_API_KEY: # file: ./secrets/llm_api_key.txt volumes: redis-data: