2026-03-30 10:13:39 +02:00
|
|
|
services:
|
2026-04-04 15:09:49 +02:00
|
|
|
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
|
|
|
|
|
|
2026-03-30 10:13:39 +02:00
|
|
|
postgres:
|
|
|
|
|
image: postgres:16-alpine
|
2026-04-04 15:09:49 +02:00
|
|
|
restart: unless-stopped
|
2026-03-30 10:13:39 +02:00
|
|
|
environment:
|
2026-04-04 15:09:49 +02:00
|
|
|
POSTGRES_DB: ${POSTGRES_DB:-cameleer_saas}
|
|
|
|
|
POSTGRES_USER: ${POSTGRES_USER:-cameleer}
|
|
|
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-cameleer_dev}
|
2026-03-30 10:13:39 +02:00
|
|
|
volumes:
|
|
|
|
|
- pgdata:/var/lib/postgresql/data
|
2026-04-04 15:09:49 +02:00
|
|
|
- ./docker/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro
|
|
|
|
|
healthcheck:
|
2026-04-04 23:38:02 +02:00
|
|
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-cameleer} -d ${POSTGRES_DB:-cameleer_saas}"]
|
2026-04-04 15:09:49 +02:00
|
|
|
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
|
2026-04-05 17:42:17 +02:00
|
|
|
ENDPOINT: http://auth.${PUBLIC_HOST:-localhost}
|
2026-04-05 17:07:20 +02:00
|
|
|
ADMIN_ENDPOINT: http://${PUBLIC_HOST:-localhost}:3002
|
2026-04-04 15:09:49 +02:00
|
|
|
TRUST_PROXY_HEADER: 1
|
2026-04-05 00:22:22 +02:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "node -e \"require('http').get('http://localhost:3001/oidc/.well-known/openid-configuration', r => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\""]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 5s
|
|
|
|
|
retries: 30
|
|
|
|
|
start_period: 15s
|
2026-04-04 15:09:49 +02:00
|
|
|
labels:
|
|
|
|
|
- traefik.enable=true
|
2026-04-05 17:42:17 +02:00
|
|
|
- traefik.http.routers.logto.rule=Host(`auth.${PUBLIC_HOST:-localhost}`)
|
2026-04-04 15:09:49 +02:00
|
|
|
- traefik.http.services.logto.loadbalancer.server.port=3001
|
|
|
|
|
networks:
|
|
|
|
|
- cameleer
|
|
|
|
|
|
2026-04-05 00:22:22 +02:00
|
|
|
logto-bootstrap:
|
|
|
|
|
image: postgres:16-alpine
|
|
|
|
|
depends_on:
|
|
|
|
|
logto:
|
|
|
|
|
condition: service_healthy
|
2026-04-05 02:50:51 +02:00
|
|
|
cameleer3-server:
|
|
|
|
|
condition: service_healthy
|
2026-04-05 00:22:22 +02:00
|
|
|
restart: "no"
|
|
|
|
|
entrypoint: ["sh", "/scripts/logto-bootstrap.sh"]
|
|
|
|
|
environment:
|
|
|
|
|
LOGTO_ENDPOINT: http://logto:3001
|
|
|
|
|
LOGTO_ADMIN_ENDPOINT: http://logto:3002
|
2026-04-05 17:42:17 +02:00
|
|
|
LOGTO_PUBLIC_ENDPOINT: http://auth.${PUBLIC_HOST:-localhost}
|
2026-04-05 17:07:20 +02:00
|
|
|
PUBLIC_HOST: ${PUBLIC_HOST:-localhost}
|
2026-04-05 00:22:22 +02:00
|
|
|
PG_HOST: postgres
|
|
|
|
|
PG_USER: ${POSTGRES_USER:-cameleer}
|
|
|
|
|
PG_PASSWORD: ${POSTGRES_PASSWORD:-cameleer_dev}
|
2026-04-05 02:50:51 +02:00
|
|
|
PG_DB_SAAS: ${POSTGRES_DB:-cameleer_saas}
|
|
|
|
|
SAAS_ADMIN_USER: ${SAAS_ADMIN_USER:-admin}
|
|
|
|
|
SAAS_ADMIN_PASS: ${SAAS_ADMIN_PASS:-admin}
|
|
|
|
|
TENANT_ADMIN_USER: ${TENANT_ADMIN_USER:-camel}
|
|
|
|
|
TENANT_ADMIN_PASS: ${TENANT_ADMIN_PASS:-camel}
|
|
|
|
|
CAMELEER_AUTH_TOKEN: ${CAMELEER_AUTH_TOKEN:-default-bootstrap-token}
|
|
|
|
|
SERVER_ENDPOINT: http://cameleer3-server:8081
|
|
|
|
|
SERVER_UI_USER: ${CAMELEER_UI_USER:-admin}
|
|
|
|
|
SERVER_UI_PASS: ${CAMELEER_UI_PASSWORD:-admin}
|
2026-04-05 00:22:22 +02:00
|
|
|
volumes:
|
|
|
|
|
- ./docker/logto-bootstrap.sh:/scripts/logto-bootstrap.sh:ro
|
|
|
|
|
- bootstrapdata:/data
|
|
|
|
|
networks:
|
|
|
|
|
- cameleer
|
|
|
|
|
|
2026-04-04 15:09:49 +02:00
|
|
|
cameleer-saas:
|
|
|
|
|
image: ${CAMELEER_IMAGE:-gitea.siegeln.net/cameleer/cameleer-saas}:${VERSION:-latest}
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
depends_on:
|
|
|
|
|
postgres:
|
|
|
|
|
condition: service_healthy
|
2026-04-05 00:22:22 +02:00
|
|
|
logto-bootstrap:
|
|
|
|
|
condition: service_completed_successfully
|
2026-04-04 15:09:49 +02:00
|
|
|
volumes:
|
|
|
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
2026-04-04 18:04:42 +02:00
|
|
|
- jardata:/data/jars
|
2026-04-05 00:22:22 +02:00
|
|
|
- bootstrapdata:/data/bootstrap:ro
|
2026-04-04 15:09:49 +02:00
|
|
|
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}
|
2026-04-05 17:42:17 +02:00
|
|
|
LOGTO_PUBLIC_ENDPOINT: http://auth.${PUBLIC_HOST:-localhost}
|
|
|
|
|
LOGTO_ISSUER_URI: http://auth.${PUBLIC_HOST:-localhost}/oidc
|
2026-04-05 17:16:04 +02:00
|
|
|
LOGTO_JWK_SET_URI: ${LOGTO_ENDPOINT:-http://logto:3001}/oidc/jwks
|
2026-04-04 15:09:49 +02:00
|
|
|
LOGTO_M2M_CLIENT_ID: ${LOGTO_M2M_CLIENT_ID:-}
|
|
|
|
|
LOGTO_M2M_CLIENT_SECRET: ${LOGTO_M2M_CLIENT_SECRET:-}
|
2026-04-04 18:04:42 +02:00
|
|
|
CAMELEER3_SERVER_ENDPOINT: http://cameleer3-server:8081
|
|
|
|
|
CLICKHOUSE_URL: jdbc:clickhouse://clickhouse:8123/cameleer
|
2026-04-04 15:09:49 +02:00
|
|
|
labels:
|
|
|
|
|
- traefik.enable=true
|
|
|
|
|
- traefik.http.routers.api.rule=PathPrefix(`/api`)
|
2026-04-05 00:48:21 +02:00
|
|
|
- traefik.http.routers.api.service=api
|
2026-04-04 15:09:49 +02:00
|
|
|
- traefik.http.services.api.loadbalancer.server.port=8080
|
2026-04-04 22:06:36 +02:00
|
|
|
- traefik.http.routers.spa.rule=PathPrefix(`/`)
|
|
|
|
|
- traefik.http.routers.spa.priority=1
|
2026-04-05 00:48:21 +02:00
|
|
|
- traefik.http.routers.spa.service=spa
|
2026-04-04 22:06:36 +02:00
|
|
|
- traefik.http.services.spa.loadbalancer.server.port=8080
|
2026-04-04 15:09:49 +02:00
|
|
|
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:
|
2026-04-04 23:37:19 +02:00
|
|
|
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/cameleer3
|
|
|
|
|
SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-cameleer}
|
|
|
|
|
SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-cameleer_dev}
|
2026-04-04 15:09:49 +02:00
|
|
|
CLICKHOUSE_URL: jdbc:clickhouse://clickhouse:8123/cameleer
|
2026-04-04 18:04:42 +02:00
|
|
|
CAMELEER_AUTH_TOKEN: ${CAMELEER_AUTH_TOKEN:-default-bootstrap-token}
|
2026-04-04 23:42:37 +02:00
|
|
|
CAMELEER_JWT_SECRET: ${CAMELEER_JWT_SECRET:-cameleer-dev-jwt-secret-change-in-production}
|
2026-04-04 21:04:57 +02:00
|
|
|
CAMELEER_TENANT_ID: ${CAMELEER_TENANT_SLUG:-default}
|
2026-04-05 17:42:17 +02:00
|
|
|
CAMELEER_OIDC_ISSUER_URI: http://auth.${PUBLIC_HOST:-localhost}/oidc
|
2026-04-05 12:44:04 +02:00
|
|
|
CAMELEER_OIDC_AUDIENCE: ${CAMELEER_OIDC_AUDIENCE:-https://api.cameleer.local}
|
2026-04-05 02:50:51 +02:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "curl -sf http://localhost:8081/api/v1/health || exit 1"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 5s
|
|
|
|
|
retries: 30
|
|
|
|
|
start_period: 15s
|
2026-04-04 15:09:49 +02:00
|
|
|
labels:
|
|
|
|
|
- traefik.enable=true
|
|
|
|
|
- traefik.http.routers.observe.rule=PathPrefix(`/observe`)
|
2026-04-05 00:48:21 +02:00
|
|
|
- traefik.http.routers.observe.service=observe
|
2026-04-04 15:09:49 +02:00
|
|
|
- traefik.http.services.observe.loadbalancer.server.port=8080
|
2026-04-04 21:04:57 +02:00
|
|
|
- traefik.http.routers.dashboard.rule=PathPrefix(`/dashboard`)
|
2026-04-05 00:48:21 +02:00
|
|
|
- traefik.http.routers.dashboard.service=dashboard
|
2026-04-05 12:44:04 +02:00
|
|
|
- traefik.http.routers.dashboard.middlewares=dashboard-strip
|
2026-04-04 21:04:57 +02:00
|
|
|
- traefik.http.middlewares.dashboard-strip.stripprefix.prefixes=/dashboard
|
|
|
|
|
- traefik.http.services.dashboard.loadbalancer.server.port=8080
|
2026-04-04 15:09:49 +02:00
|
|
|
networks:
|
|
|
|
|
- cameleer
|
|
|
|
|
|
2026-04-05 16:23:48 +02:00
|
|
|
cameleer3-server-ui:
|
|
|
|
|
image: ${CAMELEER3_SERVER_UI_IMAGE:-gitea.siegeln.net/cameleer/cameleer3-server-ui}:${VERSION:-latest}
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
depends_on:
|
|
|
|
|
cameleer3-server:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
environment:
|
|
|
|
|
CAMELEER_API_URL: http://cameleer3-server:8081
|
2026-04-05 17:32:36 +02:00
|
|
|
labels:
|
|
|
|
|
- traefik.enable=true
|
2026-04-05 17:48:11 +02:00
|
|
|
- traefik.http.routers.server-ui.rule=Host(`server.${PUBLIC_HOST:-localhost}`)
|
2026-04-05 17:32:36 +02:00
|
|
|
- traefik.http.routers.server-ui.service=server-ui
|
|
|
|
|
- traefik.http.services.server-ui.loadbalancer.server.port=80
|
2026-04-05 16:23:48 +02:00
|
|
|
networks:
|
|
|
|
|
- cameleer
|
|
|
|
|
|
2026-04-04 15:09:49 +02:00
|
|
|
clickhouse:
|
|
|
|
|
image: clickhouse/clickhouse-server:latest
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
volumes:
|
|
|
|
|
- chdata:/var/lib/clickhouse
|
2026-04-04 23:37:19 +02:00
|
|
|
- ./docker/clickhouse-init.sql:/docker-entrypoint-initdb.d/init.sql:ro
|
2026-04-04 23:41:14 +02:00
|
|
|
- ./docker/clickhouse-users.xml:/etc/clickhouse-server/users.d/default-user.xml:ro
|
2026-04-04 15:09:49 +02:00
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "clickhouse-client --query 'SELECT 1'"]
|
|
|
|
|
interval: 10s
|
|
|
|
|
timeout: 5s
|
|
|
|
|
retries: 3
|
|
|
|
|
networks:
|
|
|
|
|
- cameleer
|
|
|
|
|
|
|
|
|
|
networks:
|
|
|
|
|
cameleer:
|
|
|
|
|
driver: bridge
|
2026-03-30 10:13:39 +02:00
|
|
|
|
|
|
|
|
volumes:
|
|
|
|
|
pgdata:
|
2026-04-04 15:09:49 +02:00
|
|
|
chdata:
|
|
|
|
|
acme:
|
2026-04-04 18:04:42 +02:00
|
|
|
jardata:
|
2026-04-05 00:22:22 +02:00
|
|
|
bootstrapdata:
|