services: backend: container_name: notelett-backend build: context: . dockerfile: backend/Dockerfile ports: - "4016:4016" environment: NODE_ENV: development PORT: 4016 HOST: 0.0.0.0 PRODUCT_ID: notelett SERVICE_NAME: notelett-backend JWT_SECRET: ${JWT_SECRET:-dev-secret-change-me-at-least-32-characters} COSMOS_ENDPOINT: ${COSMOS_ENDPOINT:-} COSMOS_KEY: ${COSMOS_KEY:-} COSMOS_DATABASE: ${COSMOS_DATABASE:-bytelyst} DB_PROVIDER: ${DB_PROVIDER:-memory} CORS_ORIGIN: ${CORS_ORIGIN:-http://127.0.0.1:3000} PLATFORM_SERVICE_URL: ${PLATFORM_SERVICE_URL:-http://127.0.0.1:4003} EXTRACTION_SERVICE_URL: ${EXTRACTION_SERVICE_URL:-http://127.0.0.1:4005} MCP_SERVER_URL: ${MCP_SERVER_URL:-http://127.0.0.1:4007} TELEMETRY_ENABLED: ${TELEMETRY_ENABLED:-false} FEATURE_FLAGS_ENABLED: ${FEATURE_FLAGS_ENABLED:-false} FIELD_ENCRYPT_ENABLED: ${FIELD_ENCRYPT_ENABLED:-false} FIELD_ENCRYPT_KEY_PROVIDER: ${FIELD_ENCRYPT_KEY_PROVIDER:-memory} LLM_PROVIDER: ${LLM_PROVIDER:-mock} OPENAI_API_KEY: ${OPENAI_API_KEY:-} OPENAI_BASE_URL: ${OPENAI_BASE_URL:-} AZURE_OPENAI_ENDPOINT: ${AZURE_OPENAI_ENDPOINT:-} AZURE_OPENAI_API_KEY: ${AZURE_OPENAI_API_KEY:-} LLM_DEFAULT_MODEL: ${LLM_DEFAULT_MODEL:-gpt-4o-mini} LLM_VISION_MODEL: ${LLM_VISION_MODEL:-gpt-4o} LLM_EMBEDDING_MODEL: ${LLM_EMBEDDING_MODEL:-text-embedding-3-small} restart: unless-stopped healthcheck: test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:4016/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] interval: 30s timeout: 5s retries: 3 web: container_name: notelett-web build: context: . dockerfile: web/Dockerfile args: # NEXT_PUBLIC_* values are baked into the Next.js bundle at build # time, so they MUST be passed as build args, not just runtime # environment. The defaults below target a local stack; override # via the same-named env var on the host (the value is captured # by docker compose's ${VAR:-default} substitution). NEXT_PUBLIC_NOTES_API_URL: ${NEXT_PUBLIC_NOTES_API_URL:-http://127.0.0.1:4016/api} NEXT_PUBLIC_PLATFORM_SERVICE_URL: ${NEXT_PUBLIC_PLATFORM_SERVICE_URL:-http://127.0.0.1:4003/api} NEXT_PUBLIC_EXTRACTION_SERVICE_URL: ${NEXT_PUBLIC_EXTRACTION_SERVICE_URL:-http://127.0.0.1:4005} NEXT_PUBLIC_MCP_SERVER_URL: ${NEXT_PUBLIC_MCP_SERVER_URL:-http://127.0.0.1:4007/api} NEXT_PUBLIC_DIAGNOSTICS_URL: ${NEXT_PUBLIC_DIAGNOSTICS_URL:-http://127.0.0.1:3000} NEXT_PUBLIC_PRODUCT_NAME: ${NEXT_PUBLIC_PRODUCT_NAME:-NoteLett} NEXT_PUBLIC_PRODUCT_ID: ${NEXT_PUBLIC_PRODUCT_ID:-notelett} NEXT_PUBLIC_TELEMETRY_TRANSPORT: ${NEXT_PUBLIC_TELEMETRY_TRANSPORT:-fetch} ports: - "3000:3045" environment: NODE_ENV: production NEXT_PUBLIC_PRODUCT_NAME: NoteLett NEXT_PUBLIC_PRODUCT_ID: notelett NEXT_PUBLIC_NOTES_API_URL: ${NEXT_PUBLIC_NOTES_API_URL:-http://127.0.0.1:4016/api} NEXT_PUBLIC_PLATFORM_SERVICE_URL: ${NEXT_PUBLIC_PLATFORM_SERVICE_URL:-http://127.0.0.1:4003/api} NEXT_PUBLIC_EXTRACTION_SERVICE_URL: ${EXTRACTION_SERVICE_URL:-http://127.0.0.1:4005} NEXT_PUBLIC_MCP_SERVER_URL: ${MCP_SERVER_URL:-http://127.0.0.1:4007}/api NEXT_PUBLIC_DIAGNOSTICS_URL: ${DIAGNOSTICS_URL:-http://127.0.0.1:3000} NEXT_PUBLIC_TELEMETRY_TRANSPORT: fetch depends_on: backend: condition: service_healthy restart: unless-stopped