@@ -97,6 +97,10 @@ services:
9797 APP_VERSION : ${IMAGE_TAG}
9898 SPRING_PROFILES_ACTIVE : prod
9999 APPLICATION_HOST_URL : https://${APP_HOSTNAME}
100+ # Tomcat RemoteIpValve proxy trust. forward-headers-strategy=native (application-prod.yml) is
101+ # active in prod, so ProxyTrustGuard fails the boot unless this is a non-blank internal-proxies
102+ # regex pinned to the ingress (Traefik). Empty default surfaces the guard's clear fail-fast.
103+ HEPHAESTUS_TRUSTED_PROXIES : ${HEPHAESTUS_TRUSTED_PROXIES:-}
100104 # Webhook reception runs in a dedicated `webhook-server` container (see ADR 0008
101105 # + docker/compose.core.yaml). Disable it here so the receiver beans don't load
102106 # in application-server (saves RAM; prevents accidental localhost traffic).
@@ -108,40 +112,45 @@ services:
108112 # Auth (Hephaestus-native; ADR 0017). State-cookie key MUST be base64 32-byte AES.
109113 HEPHAESTUS_AUTH_ISSUER : https://${APP_HOSTNAME}
110114 HEPHAESTUS_AUTH_STATE_COOKIE_KEY : ${HEPHAESTUS_AUTH_STATE_COOKIE_KEY}
115+ # First instance super-admin bootstrap (auth-cutover runbook). The admin UI is admin-gated, so
116+ # the first APP_ADMIN must come from operator config — comma-separated <provider>:@user or
117+ # <provider>:<subject>. Optional break-glass token enables POST /auth/bootstrap-admin.
118+ HEPHAESTUS_AUTH_BOOTSTRAP_ADMINS : ${HEPHAESTUS_AUTH_BOOTSTRAP_ADMINS:-}
119+ HEPHAESTUS_AUTH_BOOTSTRAP_TOKEN : ${HEPHAESTUS_AUTH_BOOTSTRAP_TOKEN:-}
111120 GITHUB_OAUTH_CLIENT_ID : ${GITHUB_OAUTH_CLIENT_ID}
112121 GITHUB_OAUTH_CLIENT_SECRET : ${GITHUB_OAUTH_CLIENT_SECRET}
113122 GITLAB_OAUTH_CLIENT_ID : ${GITLAB_OAUTH_CLIENT_ID:-}
114123 GITLAB_OAUTH_CLIENT_SECRET : ${GITLAB_OAUTH_CLIENT_SECRET:-}
115124 GITLAB_OAUTH_BASE_URL : ${GITLAB_OAUTH_BASE_URL:-https://gitlab.com}
116125 GITLAB_OAUTH_DISPLAY_NAME : ${GITLAB_OAUTH_DISPLAY_NAME:-GitLab}
117- GH_APP_ID : ${GH_APP_ID}
126+ GH_APP_ID : ${GH_APP_ID:-0 }
118127 GH_APP_PRIVATE_KEY : ${GH_APP_PRIVATE_KEY}
119128 GH_APP_PRIVATE_KEY_LOCATION : ${GH_APP_PRIVATE_KEY_LOCATION:-}
120129 GH_APP_INSTALLATION_URL : ${GH_APP_INSTALLATION_URL:-}
121130 GH_AUTH_TOKEN : ${GH_AUTH_TOKEN}
122- NATS_ENABLED : ${NATS_ENABLED}
123- NATS_DURABLE_CONSUMER_NAME : ${NATS_DURABLE_CONSUMER_NAME}
124- MONITORING_TIMEFRAME : ${MONITORING_TIMEFRAME}
125- MONITORING_RUN_ON_STARTUP : ${MONITORING_RUN_ON_STARTUP}
126- MONITORING_SYNC_CRON : ${MONITORING_SYNC_CRON}
127- MONITORING_SYNC_COOLDOWN_IN_MINUTES : ${MONITORING_SYNC_COOLDOWN_IN_MINUTES}
131+ # Default on: the integration event flow needs NATS in prod (the code-level fallback is off for local dev).
132+ NATS_ENABLED : ${NATS_ENABLED:-true}
133+ NATS_DURABLE_CONSUMER_NAME : ${NATS_DURABLE_CONSUMER_NAME:-}
134+ MONITORING_TIMEFRAME : ${MONITORING_TIMEFRAME:-7}
135+ MONITORING_RUN_ON_STARTUP : ${MONITORING_RUN_ON_STARTUP:-true}
136+ MONITORING_SYNC_CRON : ${MONITORING_SYNC_CRON:-0 0 * * * *}
137+ MONITORING_SYNC_COOLDOWN_IN_MINUTES : ${MONITORING_SYNC_COOLDOWN_IN_MINUTES:-60}
128138 MONITORING_BACKFILL_ENABLED : ${MONITORING_BACKFILL_ENABLED:-true}
129139 MONITORING_BACKFILL_BATCH_SIZE : ${MONITORING_BACKFILL_BATCH_SIZE:-50}
130140 MONITORING_BACKFILL_RATE_LIMIT_THRESHOLD : ${MONITORING_BACKFILL_RATE_LIMIT_THRESHOLD:-500}
131141 MONITORING_BACKFILL_INTERVAL_SECONDS : ${MONITORING_BACKFILL_INTERVAL_SECONDS:-60}
132- LEADERBOARD_NOTIFICATION_ENABLED : ${LEADERBOARD_NOTIFICATION_ENABLED}
133- LEADERBOARD_NOTIFICATION_TEAM : ${LEADERBOARD_NOTIFICATION_TEAM}
134- LEADERBOARD_NOTIFICATION_CHANNEL_ID : ${LEADERBOARD_NOTIFICATION_CHANNEL_ID}
135- LEADERBOARD_NOTIFICATION_WORKSPACE_SLUGS : ${LEADERBOARD_NOTIFICATION_WORKSPACE_SLUGS}
136- LEADERBOARD_SCHEDULE_DAY : ${LEADERBOARD_SCHEDULE_DAY}
137- LEADERBOARD_SCHEDULE_TIME : ${LEADERBOARD_SCHEDULE_TIME}
142+ # Per-workspace channel/team now live on the Slack Connection config; this is the global kill-switch.
143+ LEADERBOARD_NOTIFICATION_ENABLED : ${LEADERBOARD_NOTIFICATION_ENABLED:-true}
144+ LEADERBOARD_SCHEDULE_DAY : ${LEADERBOARD_SCHEDULE_DAY:-2}
145+ LEADERBOARD_SCHEDULE_TIME : ${LEADERBOARD_SCHEDULE_TIME:-9}
138146 SENTRY_DSN : ${SENTRY_DSN}
139147 POSTHOG_ENABLED : ${POSTHOG_ENABLED:-false}
140148 POSTHOG_API_HOST : ${POSTHOG_API_HOST:-https://app.posthog.com}
141149 POSTHOG_PROJECT_ID : ${POSTHOG_PROJECT_ID:-}
142150 POSTHOG_PERSONAL_API_KEY : ${POSTHOG_PERSONAL_API_KEY:-}
143151 WEBHOOK_SECRET : ${WEBHOOK_SECRET}
144- WEBHOOK_EXTERNAL_URL : https://${APP_HOSTNAME}/webhooks
152+ # WEBHOOK_EXTERNAL_URL intentionally unset: GitLab auto-registration defaults it to
153+ # APPLICATION_HOST_URL (same origin here), then appends /webhooks/gitlab itself.
145154 # AES-256-GCM key for credentials encrypted at rest in the `connection` table. Exactly 32
146155 # chars. Required in prod (fail-fast); the Liquibase backfill re-encrypts on boot, so this
147156 # MUST be set on application-server (where Liquibase runs). Keep it stable.
@@ -154,9 +163,8 @@ services:
154163 # GitLab integration
155164 GITLAB_ENABLED : ${GITLAB_ENABLED:-false}
156165 GITLAB_DEFAULT_SERVER_URL : ${GITLAB_DEFAULT_SERVER_URL:-https://gitlab.lrz.de}
157- # Agent sandbox (practice review + Pi mentor chat — both gated per-workspace via
158- # WorkspaceFeatures.{practicesEnabled,mentorEnabled})
159- SANDBOX_ENABLED : ${SANDBOX_ENABLED:-false}
166+ # Agent sandbox (practice review + Pi mentor chat). Activated by the worker role
167+ # (hephaestus.runtime.worker.enabled), then gated per-workspace via WorkspaceFeatures.
160168 SANDBOX_DOCKER_HOST : ${SANDBOX_DOCKER_HOST:-unix:///var/run/docker.sock}
161169 SANDBOX_CONTAINER_RUNTIME : ${SANDBOX_CONTAINER_RUNTIME:-}
162170 SANDBOX_MAX_CONCURRENT : ${SANDBOX_MAX_CONCURRENT:-5}
@@ -186,8 +194,6 @@ services:
186194 LLM_PROXY_AZURE_OPENAI_USE_BEARER : ${LLM_PROXY_AZURE_OPENAI_USE_BEARER:-false}
187195 # Worker control channel: same env var feeds the worker pod's registration-token claim.
188196 HEPHAESTUS_WORKER_HUB_TOKEN_REGISTRATION_TOKEN : ${HEPHAESTUS_WORKER_REGISTRATION_TOKEN:-}
189- # PEM PKCS#8 RSA private key. Unset = ephemeral keypair regenerated on restart (dev only).
190- HEPHAESTUS_WORKER_HUB_TOKEN_SIGNING_KEY : ${HEPHAESTUS_WORKER_HUB_SIGNING_KEY:-}
191197 depends_on :
192198 postgres :
193199 condition : service_started
@@ -256,11 +262,11 @@ services:
256262 environment :
257263 APP_VERSION : ${IMAGE_TAG}
258264 SPRING_PROFILES_ACTIVE : prod,worker
265+ HEPHAESTUS_TRUSTED_PROXIES : ${HEPHAESTUS_TRUSTED_PROXIES:-}
259266 HEPHAESTUS_HUB_URL : ws://application-server:8080/api/workers/connect
260267 HEPHAESTUS_WORKER_REGISTRATION_TOKEN : ${HEPHAESTUS_WORKER_REGISTRATION_TOKEN:-}
261268 NATS_SERVER : nats://nats-server:4222
262269 AGENT_NATS_ENABLED : ${AGENT_NATS_ENABLED:-false}
263- SANDBOX_ENABLED : ${SANDBOX_ENABLED:-false}
264270 SANDBOX_DOCKER_HOST : ${SANDBOX_DOCKER_HOST:-unix:///var/run/docker.sock}
265271 SANDBOX_CONTAINER_RUNTIME : ${SANDBOX_CONTAINER_RUNTIME:-}
266272 SANDBOX_MAX_CONCURRENT : ${SANDBOX_MAX_CONCURRENT:-5}
0 commit comments