services: postgres: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-hermes_news} POSTGRES_USER: ${POSTGRES_USER:-hermes} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-hermes} ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER:-hermes} -d $${POSTGRES_DB:-hermes_news}"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 ollama: image: ollama/ollama:latest ports: - "11434:11434" volumes: - ollama-data:/root/.ollama app: build: . environment: SPRING_PROFILES_ACTIVE: local POSTGRES_JDBC_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB:-hermes_news} REDIS_HOST: redis REDIS_PORT: 6379 AI_PROVIDER: ${AI_PROVIDER:-ollama} OLLAMA_BASE_URL: http://ollama:11434 OLLAMA_MODEL: ${OLLAMA_MODEL:-qwen3} OLLAMA_TEMPERATURE: ${OLLAMA_TEMPERATURE:-0.2} WATCHLIST_SCAN_CRON: ${WATCHLIST_SCAN_CRON:-0 */10 * * * *} WATCHLIST_DEFAULT_COOLDOWN: ${WATCHLIST_DEFAULT_COOLDOWN:-6h} WATCHLIST_MAX_ARTICLE_AGE: ${WATCHLIST_MAX_ARTICLE_AGE:-24h} WATCHLIST_MIN_SCORE: ${WATCHLIST_MIN_SCORE:-20} WATCHLIST_MAX_ALERTS_PER_RUN: ${WATCHLIST_MAX_ALERTS_PER_RUN:-2} OUTBOX_RETRY_CRON: ${OUTBOX_RETRY_CRON:-0 * * * * *} OUTBOX_MAX_ATTEMPTS: ${OUTBOX_MAX_ATTEMPTS:-3} OUTBOX_BASE_DELAY: ${OUTBOX_BASE_DELAY:-1m} EVOLUTION_BASE_URL: http://evolution-api:8080 EVOLUTION_API_KEY: ${EVOLUTION_API_KEY:-change-me-local-only} EVOLUTION_INSTANCE: ${EVOLUTION_INSTANCE:-hermes-local} EVOLUTION_RECIPIENT: ${EVOLUTION_RECIPIENT:-} EVOLUTION_ALLOWED_SENDER: ${EVOLUTION_ALLOWED_SENDER:-} ports: - "8080:8080" depends_on: postgres: condition: service_healthy redis: condition: service_healthy evolution-api: condition: service_started ollama: condition: service_started evolution-postgres: image: postgres:16-alpine environment: POSTGRES_DB: ${EVOLUTION_POSTGRES_DB:-evolution} POSTGRES_USER: ${EVOLUTION_POSTGRES_USER:-evolution} POSTGRES_PASSWORD: ${EVOLUTION_POSTGRES_PASSWORD:-evolution} ports: - "5433:5432" volumes: - evolution-postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER:-evolution} -d $${POSTGRES_DB:-evolution}"] interval: 10s timeout: 5s retries: 5 evolution-api: image: evoapicloud/evolution-api:v2.1.1 restart: unless-stopped environment: SERVER_TYPE: http SERVER_PORT: 8080 SERVER_URL: ${EVOLUTION_SERVER_URL:-http://localhost:8081} DEL_INSTANCE: "false" DATABASE_ENABLED: "true" DATABASE_PROVIDER: postgresql DATABASE_CONNECTION_URI: postgresql://${EVOLUTION_POSTGRES_USER:-evolution}:${EVOLUTION_POSTGRES_PASSWORD:-evolution}@evolution-postgres:5432/${EVOLUTION_POSTGRES_DB:-evolution}?schema=public DATABASE_CONNECTION_CLIENT_NAME: evolution_api DATABASE_SAVE_DATA_INSTANCE: "true" DATABASE_SAVE_DATA_NEW_MESSAGE: "true" DATABASE_SAVE_MESSAGE_UPDATE: "true" DATABASE_SAVE_DATA_CONTACTS: "true" DATABASE_SAVE_DATA_CHATS: "true" DATABASE_SAVE_DATA_LABELS: "true" DATABASE_SAVE_DATA_HISTORIC: "true" RABBITMQ_ENABLED: "false" CACHE_REDIS_ENABLED: "true" CACHE_REDIS_URI: redis://redis:6379/1 CACHE_REDIS_PREFIX_KEY: evolution_api CACHE_REDIS_SAVE_INSTANCES: "false" CACHE_LOCAL_ENABLED: "false" CONFIG_SESSION_PHONE_CLIENT: ${EVOLUTION_SESSION_PHONE_CLIENT:-Hermes News} CONFIG_SESSION_PHONE_NAME: ${EVOLUTION_SESSION_PHONE_NAME:-Chrome} CONFIG_SESSION_PHONE_VERSION: "${EVOLUTION_SESSION_PHONE_VERSION:-}" QRCODE_LIMIT: ${EVOLUTION_QRCODE_LIMIT:-30} QRCODE_COLOR: "${EVOLUTION_QRCODE_COLOR:-#198754}" AUTHENTICATION_API_KEY: ${EVOLUTION_API_KEY:-change-me-local-only} AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES: "true" WEBHOOK_EVENTS_MESSAGES_UPSERT: "true" LANGUAGE: pt-BR ports: - "8081:8080" volumes: - evolution-instances:/evolution/instances depends_on: evolution-postgres: condition: service_healthy redis: condition: service_healthy volumes: postgres-data: ollama-data: evolution-postgres-data: evolution-instances: