version: '3.8' services: seo-optimizer: build: . container_name: seo-optimizer restart: unless-stopped env_file: - .env ports: - "8080:8080" environment: # WordPress credentials - WP_APP_PASSWORD=${WP_APP_PASSWORD} # LLM provider (claude or deepseek) - set LLM_PROVIDER to override config # Claude API key - CLAUDE_API_KEY=${CLAUDE_API_KEY:-} # DeepSeek API key + base URL - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} - DEEPSEEK_BASE_URL=${DEEPSEEK_BASE_URL:-https://api.deepseek.com} # Optimization configuration - OPTIMIZATION_INTERVAL_HOURS=${OPTIMIZATION_INTERVAL_HOURS:-2.5} # Idea generation configuration - IDEAS_ENABLED=${IDEAS_ENABLED:-true} - IDEAS_INTERVAL_HOURS=${IDEAS_INTERVAL_HOURS:-24} - IDEAS_SUBREDDIT=${IDEAS_SUBREDDIT:-kubernetes} - IDEAS_LISTING=${IDEAS_LISTING:-top} - IDEAS_TIME_RANGE=${IDEAS_TIME_RANGE:-day} - IDEAS_MAX_REDDIT_POSTS=${IDEAS_MAX_REDDIT_POSTS:-20} - IDEAS_MAX_IDEAS=${IDEAS_MAX_IDEAS:-5} - IDEAS_STYLE_SAMPLES=${IDEAS_STYLE_SAMPLES:-3} - IDEAS_MIN_SCORE=${IDEAS_MIN_SCORE:-25} - IDEAS_MIN_COMMENTS=${IDEAS_MIN_COMMENTS:-5} - IDEAS_STORAGE_PATH=${IDEAS_STORAGE_PATH:-/app/data/ideas} # Outreach configuration - OUTREACH_ENABLED=${OUTREACH_ENABLED:-true} - OUTREACH_SUBREDDIT=${OUTREACH_SUBREDDIT:-kubernetes} - OUTREACH_LISTING=${OUTREACH_LISTING:-top} - OUTREACH_TIME_RANGE=${OUTREACH_TIME_RANGE:-day} - OUTREACH_MAX_REDDIT_POSTS=${OUTREACH_MAX_REDDIT_POSTS:-20} - OUTREACH_MAX_SUGGESTIONS=${OUTREACH_MAX_SUGGESTIONS:-5} - OUTREACH_MIN_SCORE=${OUTREACH_MIN_SCORE:-25} - OUTREACH_MIN_COMMENTS=${OUTREACH_MIN_COMMENTS:-5} - OUTREACH_MAX_ARTICLES=${OUTREACH_MAX_ARTICLES:-50} - OUTREACH_STORAGE_PATH=${OUTREACH_STORAGE_PATH:-/app/data/outreach} # Newsletter configuration - NEWSLETTER_ENABLED=${NEWSLETTER_ENABLED:-true} - NEWSLETTER_INTERVAL_HOURS=${NEWSLETTER_INTERVAL_HOURS:-168} - NEWSLETTER_FEED_URL=${NEWSLETTER_FEED_URL:-https://alexandre-vazquez.com/feed/} - NEWSLETTER_SUBREDDIT=${NEWSLETTER_SUBREDDIT:-kubernetes} - NEWSLETTER_LISTING=${NEWSLETTER_LISTING:-top} - NEWSLETTER_TIME_RANGE=${NEWSLETTER_TIME_RANGE:-week} - NEWSLETTER_MAX_FEED_ITEMS=${NEWSLETTER_MAX_FEED_ITEMS:-5} - NEWSLETTER_MAX_REDDIT_POSTS=${NEWSLETTER_MAX_REDDIT_POSTS:-10} - NEWSLETTER_MIN_SCORE=${NEWSLETTER_MIN_SCORE:-10} - NEWSLETTER_MIN_COMMENTS=${NEWSLETTER_MIN_COMMENTS:-2} - NEWSLETTER_STORAGE_PATH=${NEWSLETTER_STORAGE_PATH:-/app/data/newsletters} # Dry-run mode - DRY_RUN=${DRY_RUN:-false} # Logging - LOG_LEVEL=${LOG_LEVEL:-INFO} # API port - API_PORT=8080 # Optional webhook URL - WEBHOOK_URL=${WEBHOOK_URL:-} volumes: # Mount config file (optional, can use env vars instead) - ./configs/config.yaml:/app/configs/config.yaml:ro # Persist data across restarts/upgrades - seo-optimizer-data:/app/data healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s logging: driver: "json-file" options: max-size: "10m" max-file: "3" volumes: seo-optimizer-data: