services: # Nginx reverse proxy nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - frontend - backend networks: - aiui-network # Frontend (React + Vite built to static files) frontend: build: context: ./frontend dockerfile: Dockerfile expose: - "80" networks: - aiui-network restart: unless-stopped # Backend (Express + SQLite) backend: build: context: ./backend dockerfile: Dockerfile expose: - "3002" volumes: - ./data/backend:/app/data environment: - NODE_ENV=production - PORT=3002 - OPENAI_API_URL=${OPENAI_API_URL:-https://api.openai.com/v1} - OPENAI_API_KEY=${OPENAI_API_KEY:-} - DEFAULT_MODEL=${DEFAULT_MODEL:-gpt-4o-mini} - JWT_SECRET=${JWT_SECRET:-randomsecret} - CHROMA_HOST=chromadb - CHROMA_PORT=8000 networks: - aiui-network depends_on: - chromadb restart: unless-stopped # ChromaDB - vector database for RAG chromadb: image: chromadb/chroma:latest expose: - "8000" volumes: - ./data/chromadb:/data/chromadb environment: - CHROMA_SERVER_HOST=0.0.0.0 - CHROMA_SERVER_HTTP_PORT=8000 - CHROMA_SERVER_CORS_ALLOW_ORIGINS=["*"] - IS_PERSISTENT=TRUE - PERSIST_DIRECTORY=/data/chromadb networks: - aiui-network restart: unless-stopped networks: aiui-network: driver: bridge volumes: backend-data: chromadb-data: