services: backend: build: context: ./backend container_name: finsight-backend depends_on: postgres: condition: service_healthy rabbitmq: condition: service_healthy ai-service: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: postgres,rabbitmq,redis,prod SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/finsight SPRING_DATASOURCE_USERNAME: finsight SPRING_DATASOURCE_PASSWORD: finsight SPRING_RABBITMQ_HOST: rabbitmq SPRING_RABBITMQ_PORT: 5672 SPRING_RABBITMQ_USERNAME: finsight SPRING_RABBITMQ_PASSWORD: finsight SPRING_DATA_REDIS_URL: redis://redis:6379 FINSIGHT_AI_SERVICE_URL: http://ai-service:8001 FINSIGHT_AI_SERVICE_ENABLED: "true" FINSIGHT_REDIS_URL: redis://redis:6379 FINSIGHT_SCHEDULER_ENABLED: ${FINSIGHT_SCHEDULER_ENABLED:-false} FINSIGHT_ELASTICSEARCH_URL: http://elasticsearch:9200 FINSIGHT_MINIO_URL: http://minio:9000 FINSIGHT_AUTH_SECURE_COOKIE: ${FINSIGHT_AUTH_SECURE_COOKIE:-false} FINSIGHT_AUTH_EMAIL_ENABLED: ${FINSIGHT_AUTH_EMAIL_ENABLED:-false} MANAGEMENT_HEALTH_MAIL_ENABLED: ${MANAGEMENT_HEALTH_MAIL_ENABLED:-false} FINSIGHT_AUTH_MAIL_FROM: ${FINSIGHT_AUTH_MAIL_FROM:-noreply@finsight.local} FINSIGHT_PUBLIC_BASE_URL: ${FINSIGHT_PUBLIC_BASE_URL:-http://localhost:8080} SPRING_MAIL_HOST: ${SPRING_MAIL_HOST:-} SPRING_MAIL_PORT: ${SPRING_MAIL_PORT:-587} SPRING_MAIL_USERNAME: ${SPRING_MAIL_USERNAME:-} SPRING_MAIL_PASSWORD: ${SPRING_MAIL_PASSWORD:-} ports: - "8080:8080" healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost:8080/actuator/health || exit 1"] interval: 10s timeout: 5s retries: 20 ai-service: build: context: ./ai-service container_name: finsight-ai-service environment: # Model provider: ollama (default), openai-compatible, or anthropic. # Cloud credentials are optional and intentionally unset by default. LLM_PROVIDER: ${LLM_PROVIDER:-ollama} LLM_MODEL: ${LLM_MODEL:-} LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-45} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://host.docker.internal:11434} OLLAMA_MODEL: ${OLLAMA_MODEL:-qwen2.5:7b} OPENAI_COMPATIBLE_BASE_URL: ${OPENAI_COMPATIBLE_BASE_URL:-https://api.openai.com/v1} OPENAI_COMPATIBLE_MODEL: ${OPENAI_COMPATIBLE_MODEL:-gpt-4o-mini} OPENAI_COMPATIBLE_API_KEY: ${OPENAI_COMPATIBLE_API_KEY:-} ANTHROPIC_MODEL: ${ANTHROPIC_MODEL:-claude-3-5-haiku-latest} ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.anthropic.com/v1} ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} AI_LOCAL_MODELS_ENABLED: ${AI_LOCAL_MODELS_ENABLED:-true} EMBEDDING_MODEL: ${EMBEDDING_MODEL:-sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2} RERANK_MODEL: ${RERANK_MODEL:-BAAI/bge-reranker-base} EMBEDDING_BATCH_SIZE: ${EMBEDDING_BATCH_SIZE:-32} RERANK_BATCH_SIZE: ${RERANK_BATCH_SIZE:-16} ports: - "8001:8001" healthcheck: test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:8001/health', timeout=2)\""] interval: 10s timeout: 5s retries: 10 postgres: image: pgvector/pgvector:pg16 container_name: finsight-postgres environment: POSTGRES_DB: finsight POSTGRES_USER: finsight POSTGRES_PASSWORD: finsight ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U finsight -d finsight"] interval: 10s timeout: 5s retries: 10 redis: image: redis:7-alpine container_name: finsight-redis ports: - "6379:6379" rabbitmq: image: rabbitmq:3-management container_name: finsight-rabbitmq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: finsight RABBITMQ_DEFAULT_PASS: finsight healthcheck: test: ["CMD-SHELL", "rabbitmq-diagnostics -q ping"] interval: 10s timeout: 5s retries: 10 elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.15.3 container_name: finsight-elasticsearch environment: discovery.type: single-node xpack.security.enabled: "false" ES_JAVA_OPTS: "-Xms512m -Xmx512m" ports: - "9200:9200" volumes: - elasticsearch_data:/usr/share/elasticsearch/data minio: image: minio/minio:RELEASE.2024-10-13T13-34-11Z container_name: finsight-minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: finsight MINIO_ROOT_PASSWORD: finsight123 ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data volumes: postgres_data: elasticsearch_data: minio_data: