version: '3.8' services: frontend: image: ghcr.io/clucraft/note-app-frontend:latest ports: - "8088:80" depends_on: - backend networks: - app-network restart: unless-stopped backend: image: ghcr.io/clucraft/note-app-backend:latest ports: - "3001:3001" environment: - NODE_ENV=production - PORT=3001 - DATABASE_PATH=/data/notes.db - ACCESS_TOKEN_SECRET=${ACCESS_TOKEN_SECRET:-change-this-secret-in-production} - REFRESH_TOKEN_SECRET=${REFRESH_TOKEN_SECRET:-change-this-refresh-secret-in-production} - CORS_ORIGIN=http://localhost:8088 - BACKEND_PUBLIC_URL=${BACKEND_PUBLIC_URL:-http://localhost:3001} volumes: - sqlite-data:/data networks: - app-network restart: unless-stopped healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3001/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s mcp: image: ghcr.io/clucraft/note-app-mcp:latest ports: - "3002:3002" environment: - PORT=3002 - BACKEND_URL=http://backend:3001 - MCP_JWT_SECRET=${MCP_JWT_SECRET:-mcp-oauth-secret-change-me} - MCP_PUBLIC_URL=https://mcpserver-url.com depends_on: backend: condition: service_healthy networks: - app-network restart: unless-stopped profiles: - mcp networks: app-network: driver: bridge volumes: sqlite-data: driver: local