# undata full stack — one command to start everything # # Usage: docker compose up -d # # Services: # - db: PostgreSQL 16 + pgvector (localhost:5432) # - backend: FastAPI + GraphQL (localhost:8002, playground at /graphql) # - frontend: Next.js (localhost:3000) # - keycloak: OIDC identity provider (localhost:8080, admin: admin/admin) # # First run: database is seeded with sample data automatically. # Browse elements at http://localhost:3000/elements services: db: image: pgvector/pgvector:pg16 environment: POSTGRES_USER: undata POSTGRES_PASSWORD: undata POSTGRES_DB: undata ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data - ./backend/postgres-init:/docker-entrypoint-initdb.d healthcheck: test: ["CMD-SHELL", "pg_isready -U undata"] interval: 5s timeout: 3s retries: 10 keycloak: image: quay.io/keycloak/keycloak:24.0 entrypoint: ["/bin/bash", "/opt/keycloak/data/import/configure-and-start.sh"] env_file: - .env environment: KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin KC_HOSTNAME_STRICT: "false" KC_HTTP_ENABLED: "true" ports: - "8080:8080" volumes: - ./backend/keycloak:/opt/keycloak/data/import healthcheck: test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost/8080 && echo -e 'GET /health/ready HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && cat <&3 | grep -q '200'"] interval: 10s timeout: 5s retries: 15 start_period: 30s backend: build: context: . dockerfile: backend/Dockerfile ports: - "8002:8002" environment: DATABASE_URL: postgresql+asyncpg://undata:undata@db:5432/undata LOG_LEVEL: INFO UNDATA_BASE_URL: http://localhost:8002 KEYCLOAK_URL: http://keycloak:8080 KEYCLOAK_EXTERNAL_URL: http://localhost:8080 KEYCLOAK_REALM: undata KEYCLOAK_CLIENT_ID: undata-backend FRONTEND_URL: http://localhost:3000 OPENAI_API_KEY: ${OPENAI_API_KEY:-} OLLAMA_HOST: ${OLLAMA_HOST:-http://host.docker.internal:11434} volumes: - ./backend/src:/app/backend/src - ./backend/seed:/app/backend/seed depends_on: db: condition: service_healthy frontend: build: context: . dockerfile: frontend/Dockerfile ports: - "3000:3000" environment: NEXT_PUBLIC_BACKEND_URL: http://localhost:8002 NEXT_PUBLIC_GRAPHQL_URL: http://localhost:8002/graphql depends_on: - backend volumes: pgdata: