|
| 1 | +# ============================================================================= |
| 2 | +# Hephaestus self-hosted — environment |
| 3 | +# ============================================================================= |
| 4 | +# |
| 5 | +# cp .env.example .env # then fill in every REQUIRED value below |
| 6 | +# docker compose up -d |
| 7 | +# |
| 8 | +# Full guide (read it first): https://ls1intum.github.io/Hephaestus/admin/install |
| 9 | +# |
| 10 | +# Hardware honesty: 4 vCPUs / 8 GB RAM / 40 GB SSD recommended. The stack runs |
| 11 | +# two JVM services plus Postgres and NATS; 4 GB RAM is the absolute floor and |
| 12 | +# only without AI practice review. Each concurrent AI review sandbox may use |
| 13 | +# up to 4 GiB on top. |
| 14 | +# ============================================================================= |
| 15 | + |
| 16 | +# --- General (REQUIRED) ------------------------------------------------------ |
| 17 | + |
| 18 | +# Public hostname the instance is served on (DNS A record -> this host). |
| 19 | +# No scheme, no trailing slash. Example: hephaestus.example.com |
| 20 | +APP_HOSTNAME= |
| 21 | + |
| 22 | +# Release to run: an exact version, no leading `v`, never `latest`. |
| 23 | +# Must match the release you checked out. See the install guide. |
| 24 | +IMAGE_TAG=0.73.2 |
| 25 | + |
| 26 | +# Email for Let's Encrypt certificate-expiry notices. |
| 27 | +ACME_EMAIL= |
| 28 | + |
| 29 | +# --- Secrets (REQUIRED — generate once, then never change) ------------------- |
| 30 | + |
| 31 | +# Database password. Applied only when the data volume is first initialized. |
| 32 | +# Generate: openssl rand -hex 16 |
| 33 | +POSTGRES_PASSWORD= |
| 34 | + |
| 35 | +# AES-256 key encrypting credentials at rest (and sealing the JWT signing key). |
| 36 | +# EXACTLY 32 characters. Losing or changing it makes every stored provider |
| 37 | +# token unreadable — treat it like the database itself and back it up. |
| 38 | +# Generate: openssl rand -base64 24 | cut -c1-32 |
| 39 | +HEPHAESTUS_SECURITY_ENCRYPTION_KEY= |
| 40 | + |
| 41 | +# Base64-encoded 32-byte AES key sealing the short-lived OAuth state cookies. |
| 42 | +# Generate: openssl rand -base64 32 |
| 43 | +HEPHAESTUS_AUTH_STATE_COOKIE_KEY= |
| 44 | + |
| 45 | +# Shared secret verifying inbound GitHub/GitLab webhooks (min 32 chars). |
| 46 | +# You will enter this same value on the GitHub side — see the install guide. |
| 47 | +# Generate: openssl rand -hex 32 |
| 48 | +WEBHOOK_SECRET= |
| 49 | + |
| 50 | +# --- Login (at least one provider REQUIRED, or nobody can sign in) ----------- |
| 51 | + |
| 52 | +# GitHub OAuth App (https://github.com/settings/developers -> "New OAuth App"). |
| 53 | +# Authorization callback URL: https://<APP_HOSTNAME>/api/login/oauth2/code/github |
| 54 | +# Named GH_OAUTH_* (not GITHUB_OAUTH_*) because GitHub Actions reserves the |
| 55 | +# GITHUB_ prefix; the container still presents the right name to the server. |
| 56 | +GH_OAUTH_CLIENT_ID= |
| 57 | +GH_OAUTH_CLIENT_SECRET= |
| 58 | + |
| 59 | +# GitLab OAuth application (optional; gitlab.com or self-hosted; scope: read_user). |
| 60 | +# Callback: https://<APP_HOSTNAME>/api/login/oauth2/code/gitlab |
| 61 | +#GITLAB_OAUTH_CLIENT_ID= |
| 62 | +#GITLAB_OAUTH_CLIENT_SECRET= |
| 63 | +#GITLAB_OAUTH_BASE_URL=https://gitlab.com |
| 64 | +#GITLAB_OAUTH_DISPLAY_NAME=GitLab |
| 65 | + |
| 66 | +# --- First admin (REQUIRED — set BEFORE first boot) --------------------------- |
| 67 | + |
| 68 | +# Who becomes instance admin on their first sign-in. Comma-separated |
| 69 | +# <provider>:@<username> or <provider>:<numeric-id>, e.g. github:@octocat |
| 70 | +# On public github.com prefer the numeric id (from |
| 71 | +# https://api.github.com/users/<login>) — handles can be reclaimed. |
| 72 | +HEPHAESTUS_AUTH_BOOTSTRAP_ADMINS= |
| 73 | + |
| 74 | +# Break-glass fallback: enables one-time POST /auth/bootstrap-admin while no |
| 75 | +# admin exists. Leave unset unless you need it; unset again after use. |
| 76 | +#HEPHAESTUS_AUTH_BOOTSTRAP_TOKEN= |
| 77 | + |
| 78 | +# --- GitHub App (optional — PAT-only mode works without any of these) -------- |
| 79 | +# Needed for posting AI review feedback back to GitHub and higher rate limits. |
| 80 | +# Setup guide: https://ls1intum.github.io/Hephaestus/admin/github-integration |
| 81 | +GH_APP_PRIVATE_KEY= |
| 82 | +#GH_APP_ID= |
| 83 | +#GH_APP_INSTALLATION_URL= |
| 84 | + |
| 85 | +# Legacy GitHub token used for contributor metadata only. Leave blank. |
| 86 | +GH_AUTH_TOKEN= |
| 87 | + |
| 88 | +# --- Optional integrations ---------------------------------------------------- |
| 89 | +# GitLab sync, Slack, Outline, AI practice review: enable by uncommenting here. |
| 90 | +# See https://ls1intum.github.io/Hephaestus/admin/production-setup for each bundle. |
| 91 | +#GITLAB_ENABLED=false |
| 92 | +#GITLAB_WORKSPACE_CREATION=false |
| 93 | +# Default GitLab instance for sync + workspace creation (compose otherwise defaults |
| 94 | +# this to the maintainers' gitlab.lrz.de). Point it at your instance. |
| 95 | +#GITLAB_DEFAULT_SERVER_URL=https://gitlab.com |
| 96 | +#HEPHAESTUS_INTEGRATION_SLACK_ENABLED=false |
| 97 | +#HEPHAESTUS_INTEGRATION_SLACK_CLIENT_ID= |
| 98 | +#HEPHAESTUS_INTEGRATION_SLACK_CLIENT_SECRET= |
| 99 | +#HEPHAESTUS_INTEGRATION_SLACK_SIGNING_SECRET= |
| 100 | +#HEPHAESTUS_INTEGRATION_OUTLINE_ENABLED=false |
| 101 | + |
| 102 | +# AI practice review bundle (enable all three together + an LLM upstream), plus |
| 103 | +# a model and API key per workspace in the UI. Budget ~4 GiB RAM per sandbox. |
| 104 | +#AGENT_NATS_ENABLED=false |
| 105 | +#GIT_CHECKOUT_ENABLED=false |
| 106 | +#PRACTICE_REVIEW_FOR_ALL=false |
| 107 | +#SANDBOX_MAX_CONCURRENT=1 |
| 108 | +#LLM_PROXY_OPENAI_URL=https://api.openai.com |
| 109 | + |
| 110 | +# --- Misc (optional) ----------------------------------------------------------- |
| 111 | + |
| 112 | +# Imprint/privacy pages (required for public instances in e.g. Germany): |
| 113 | +# see https://ls1intum.github.io/Hephaestus/admin/legal-pages |
| 114 | +#LEGAL_PROFILE= |
| 115 | + |
| 116 | +# Sentry error tracking. Leave blank to disable. |
| 117 | +SENTRY_DSN= |
| 118 | +SENTRY_ENVIRONMENT=production |
| 119 | +# PostHog product analytics — disabled unless POSTHOG_ENABLED=true; the keys below |
| 120 | +# do nothing on their own. Leave the two keys present (blank is fine) either way. |
| 121 | +#POSTHOG_ENABLED=false |
| 122 | +POSTHOG_PROJECT_API_KEY= |
| 123 | +POSTHOG_API_HOST= |
| 124 | + |
| 125 | +# NATS JetStream limits, sized for a single host (reference deployment uses 4G/50G). |
| 126 | +NATS_JS_MAX_MEM=1G |
| 127 | +NATS_JS_MAX_FILE=10G |
| 128 | + |
| 129 | +# Proxy-trust regex; the default matches reverse-proxy's fixed IP (172.29.47.2). |
| 130 | +# Only set when you changed that IP or the subnet in compose.single-host.yaml. |
| 131 | +#HEPHAESTUS_TRUSTED_PROXIES=172\.29\.47\.2 |
0 commit comments