version: "3.8" 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 - strapi 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 + ChromaDB) backend: build: context: ./backend dockerfile: Dockerfile expose: - "3002" volumes: - ./data/backend:/app/data environment: - NODE_ENV=production - PORT=3002 - STRAPI_URL=http://strapi:1337 - STRAPI_API_TOKEN=${STRAPI_API_TOKEN:-} networks: - aiui-network restart: unless-stopped # Strapi CMS (SQLite) strapi: image: strapi/strapi:5 expose: - "1337" volumes: - ./data/strapi:/srv/app environment: - DATABASE_CLIENT=sqlite - DATABASE_FILENAME=.tmp/data.db - JWT_SECRET=${JWT_SECRET:-changemejwt} - ADMIN_JWT_SECRET=${ADMIN_JWT_SECRET:-changemeadmin} - APP_KEYS=${APP_KEYS:-changeme1,changeme2} - API_TOKEN_SALT=${API_TOKEN_SALT:-changemesalt} - TRANSFER_TOKEN_SALT=${TRANSFER_TOKEN_SALT:-changemetoken} - NODE_ENV=production networks: - aiui-network restart: unless-stopped networks: aiui-network: driver: bridge volumes: backend-data: strapi-data: