services: traefik: image: traefik:v3 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik.yml:/etc/traefik/traefik.yml:ro - acme:/etc/traefik/acme networks: - cameleer postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-cameleer_saas} POSTGRES_USER: ${POSTGRES_USER:-cameleer} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-cameleer_dev} volumes: - pgdata:/var/lib/postgresql/data - ./docker/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-cameleer}"] interval: 5s timeout: 5s retries: 5 networks: - cameleer logto: image: ghcr.io/logto-io/logto:latest restart: unless-stopped depends_on: postgres: condition: service_healthy entrypoint: ["sh", "-c", "npm run cli db seed -- --swe && npm start"] environment: DB_URL: postgres://${POSTGRES_USER:-cameleer}:${POSTGRES_PASSWORD:-cameleer_dev}@postgres:5432/logto ENDPOINT: ${LOGTO_ENDPOINT:-http://localhost:3001} ADMIN_ENDPOINT: ${LOGTO_ADMIN_ENDPOINT:-http://localhost:3002} TRUST_PROXY_HEADER: 1 labels: - traefik.enable=true - traefik.http.routers.logto.rule=PathPrefix(`/oidc`) || PathPrefix(`/interaction`) - traefik.http.services.logto.loadbalancer.server.port=3001 networks: - cameleer cameleer-saas: image: ${CAMELEER_IMAGE:-gitea.siegeln.net/cameleer/cameleer-saas}:${VERSION:-latest} restart: unless-stopped depends_on: postgres: condition: service_healthy volumes: - /var/run/docker.sock:/var/run/docker.sock - ./keys:/etc/cameleer/keys:ro - jardata:/data/jars environment: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB:-cameleer_saas} SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-cameleer} SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-cameleer_dev} LOGTO_ENDPOINT: ${LOGTO_ENDPOINT:-http://logto:3001} LOGTO_ISSUER_URI: ${LOGTO_ISSUER_URI:-http://logto:3001/oidc} LOGTO_JWK_SET_URI: ${LOGTO_JWK_SET_URI:-http://logto:3001/oidc/jwks} LOGTO_M2M_CLIENT_ID: ${LOGTO_M2M_CLIENT_ID:-} LOGTO_M2M_CLIENT_SECRET: ${LOGTO_M2M_CLIENT_SECRET:-} CAMELEER_JWT_PRIVATE_KEY_PATH: ${CAMELEER_JWT_PRIVATE_KEY_PATH:-} CAMELEER_JWT_PUBLIC_KEY_PATH: ${CAMELEER_JWT_PUBLIC_KEY_PATH:-} CAMELEER_AUTH_TOKEN: ${CAMELEER_AUTH_TOKEN:-default-bootstrap-token} CAMELEER3_SERVER_ENDPOINT: http://cameleer3-server:8081 CLICKHOUSE_URL: jdbc:clickhouse://clickhouse:8123/cameleer labels: - traefik.enable=true - traefik.http.routers.api.rule=PathPrefix(`/api`) - traefik.http.services.api.loadbalancer.server.port=8080 - traefik.http.routers.forwardauth.rule=Path(`/auth/verify`) - traefik.http.services.forwardauth.loadbalancer.server.port=8080 - traefik.http.routers.spa.rule=PathPrefix(`/`) - traefik.http.routers.spa.priority=1 - traefik.http.services.spa.loadbalancer.server.port=8080 networks: - cameleer cameleer3-server: image: ${CAMELEER3_SERVER_IMAGE:-gitea.siegeln.net/cameleer/cameleer3-server}:${VERSION:-latest} restart: unless-stopped depends_on: postgres: condition: service_healthy clickhouse: condition: service_started environment: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB:-cameleer_saas} CLICKHOUSE_URL: jdbc:clickhouse://clickhouse:8123/cameleer CAMELEER_AUTH_TOKEN: ${CAMELEER_AUTH_TOKEN:-default-bootstrap-token} CAMELEER_TENANT_ID: ${CAMELEER_TENANT_SLUG:-default} labels: - traefik.enable=true - traefik.http.routers.observe.rule=PathPrefix(`/observe`) - traefik.http.routers.observe.middlewares=forward-auth - traefik.http.middlewares.forward-auth.forwardauth.address=http://cameleer-saas:8080/auth/verify - traefik.http.middlewares.forward-auth.forwardauth.authResponseHeaders=X-Tenant-Id,X-User-Id,X-User-Email - traefik.http.services.observe.loadbalancer.server.port=8080 - traefik.http.routers.dashboard.rule=PathPrefix(`/dashboard`) - traefik.http.routers.dashboard.middlewares=forward-auth,dashboard-strip - traefik.http.middlewares.dashboard-strip.stripprefix.prefixes=/dashboard - traefik.http.services.dashboard.loadbalancer.server.port=8080 networks: - cameleer clickhouse: image: clickhouse/clickhouse-server:latest restart: unless-stopped volumes: - chdata:/var/lib/clickhouse healthcheck: test: ["CMD-SHELL", "clickhouse-client --query 'SELECT 1'"] interval: 10s timeout: 5s retries: 3 networks: - cameleer networks: cameleer: driver: bridge volumes: pgdata: chdata: acme: jardata: