version: '3.8' services: timescaledb: image: timescale/timescaledb:latest-pg16 container_name: meta_timescaledb ports: - "5555:5432" environment: POSTGRES_DB: meta_insights POSTGRES_USER: meta_user POSTGRES_PASSWORD: meta_password volumes: - timescale_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U meta_user -d meta_insights"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # Meta API Grabber - Scheduled data collection meta-grabber: build: context: . dockerfile: Dockerfile container_name: meta_api_grabber environment: # Database connection (connects to timescaledb service) DATABASE_URL: postgresql://meta_user:meta_password@timescaledb:5432/meta_insights env_file: - .env # Must contain META_ACCESS_TOKEN, META_APP_ID, META_APP_SECRET volumes: # Mount .env for token updates (auto-refresh will update the file) - ./.env:/app/.env # Mount token metadata file (preserves token refresh state across restarts) - ./.meta_token.json:/app/.meta_token.json depends_on: timescaledb: condition: service_healthy restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" # Optional: Grafana for visualization grafana: image: grafana/grafana:latest container_name: meta_grafana ports: - "3555:3000" environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin GF_INSTALL_PLUGINS: grafana-clock-panel volumes: - grafana_data:/var/lib/grafana depends_on: timescaledb: condition: service_healthy restart: unless-stopped volumes: timescale_data: grafana_data: