Blame · Line-by-line history
.env.example
Each line is annotated with the commit that last touched it. Click any SHA to jump to that commit and see the surrounding change.
| fc1817a | 1 | DATABASE_URL=postgresql://user:password@host/gluecron |
| 2 | GIT_REPOS_PATH=./repos | |
| 3 | PORT=3000 | |
| 60323c5 | 4 | |
| 5 | # ─── SSH git server (Block SSH-1) ───────────────────────────────────────── | |
| 6 | # Port for the SSH git daemon. 2222 by default (use 22 in production | |
| 7 | # if you expose it directly, or put it behind an SSH proxy). | |
| 8 | # Set SSH_PORT=0 to disable the SSH server entirely. | |
| 9 | SSH_PORT=2222 | |
| 10 | # PEM-encoded Ed25519 (or RSA) private key for the SSH host. | |
| 11 | # If unset, an ephemeral key is generated on startup — fine for dev but | |
| 12 | # clients will see "host key changed" warnings on restart. | |
| 13 | # Generate with: ssh-keygen -t ed25519 -f /etc/gluecron/ssh_host_key -N '' | |
| 14 | # Then paste the contents here (or use \\n for newlines in single-line form). | |
| 15 | SSH_HOST_KEY= | |
| 16 | # ────────────────────────────────────────────────────────────────────────── | |
| a4e1564 | 17 | GATETEST_URL=https://gatetest.ai/api/events/push |
| e883329 | 18 | GATETEST_API_KEY= |
| ad6d4ad | 19 | # Inbound GateTest callback auth — set one so GateTest can POST results back. |
| 20 | # See GATETEST_HOOK.md for payload + endpoint details. | |
| 21 | # Generate a secret with: openssl rand -hex 32 | |
| 22 | GATETEST_CALLBACK_SECRET= | |
| 23 | GATETEST_HMAC_SECRET= | |
| 0ec4ece | 24 | # ─── For the GateTest side, NOT Gluecron ───────────────────────────────── |
| 25 | # When you point GateTest at gluecron.com to scan the live site, GateTest | |
| 26 | # needs the two values below in ITS environment (set them in the gatetest.ai | |
| 27 | # scanner config, not here). Issue the token from /admin/ops → "GateTest | |
| 28 | # scanner credentials" while signed in as site admin. | |
| 29 | # GLUECRON_BASE_URL=https://gluecron.com | |
| 30 | # GLUECRON_API_TOKEN=<paste from /admin/ops, shown once> | |
| 31 | # ───────────────────────────────────────────────────────────────────────── | |
| 9ecf5a4 | 32 | # Vapron (formerly Crontech) deploy integration. Legacy CRONTECH_* names |
| 33 | # are still honored as fallbacks for already-configured deployments. | |
| 36ec667 | 34 | # |
| 35 | # To deploy VAPRON ITSELF from Gluecron (push to ccantynz/Vapron → Vapron | |
| 36 | # rebuilds), point this at the deploy-agent's Caddy-proxied webhook. The | |
| 37 | # OLD value below (/api/webhooks/gluecron-push) is a 404 — do NOT use it. | |
| 38 | VAPRON_DEPLOY_URL=https://vapron.ai/__deploy_webhook | |
| 39 | # Only fire the Vapron deploy webhook for pushes to this exact, | |
| 40 | # CASE-SENSITIVE `<owner>/<name>`. Self-hosted Vapron on Gluecron lives at | |
| 41 | # `ccantynz/Vapron` (capital V). Default `ccantynz-alt/vapron` will NOT match. | |
| 42 | VAPRON_REPO=ccantynz/Vapron | |
| 43 | # Shared HMAC secret used to sign the outbound Vapron deploy webhook. Sent | |
| 44 | # as BOTH `X-Gluecron-Signature` and `X-Gluecron-Signature-256` = sha256=<hex> | |
| 45 | # of the JSON body. Must equal the Vapron deploy-agent's `DEPLOY_AGENT_HMAC`. | |
| 46 | # Unset → header omitted and Vapron rejects with 401. (Legacy fallbacks: | |
| 47 | # CRONTECH_HMAC_SECRET, GLUECRON_WEBHOOK_SECRET.) Generate one strong value | |
| 48 | # and set it identically on both boxes; prefer /admin/integrations here. | |
| 9ecf5a4 | 49 | VAPRON_HMAC_SECRET= |
| 50 | # Inbound bearer token Vapron MUST present on deploy.succeeded / | |
| 9e1e93a | 51 | # deploy.failed callbacks to POST /api/events/deploy (Signal Bus P1 — E3/E4). |
| 52 | # Generate with: openssl rand -hex 32. Unset → endpoint refuses every call. | |
| 9ecf5a4 | 53 | # (Legacy fallback: CRONTECH_EVENT_TOKEN.) |
| 54 | VAPRON_EVENT_TOKEN= | |
| e883329 | 55 | ANTHROPIC_API_KEY= |
| 24cf2ca | 56 | # Email (Block A8). Provider=log just writes to stderr (safe default). |
| 57 | # Switch to "resend" in prod and set RESEND_API_KEY. | |
| 58 | EMAIL_PROVIDER=log | |
| 59 | EMAIL_FROM=gluecron <no-reply@gluecron.local> | |
| 60 | RESEND_API_KEY= | |
| 61 | # Used to build absolute URLs in outbound emails + webhooks. | |
| 62 | APP_BASE_URL=http://localhost:3000 | |
| 9ecf5a4 | 63 | # Cross-product platform-status endpoints (Vapron / Gluecron / GateTest). |
| ccf9eef | 64 | # Used by the /admin/platform widget. Defaults point at production hosts. |
| 9ecf5a4 | 65 | VAPRON_STATUS_URL=https://vapron.ai/api/platform-status |
| ccf9eef | 66 | GLUECRON_STATUS_URL=https://gluecron.com/api/platform-status |
| 67 | GATETEST_STATUS_URL=https://gatetest.io/api/platform-status | |
| 80bed05 | 68 | # Error tracking (optional). If unset, errors are logged to stderr only. |
| 69 | # ERROR_WEBHOOK_URL — POST JSON {timestamp,message,stack,context,env} on unhandled errors. | |
| 70 | ERROR_WEBHOOK_URL= | |
| 71 | # SENTRY_DSN — if set, errors POST to the Sentry envelope endpoint directly (no SDK). | |
| 72 | SENTRY_DSN= | |
| ea52715 | 73 | # CLI: gluecron server host for remote commands (default: localhost). |
| 74 | GLUECRON_HOST=localhost | |
| 75 | # Preflight script: port the running server listens on (default matches PORT). | |
| 76 | PREFLIGHT_PORT=3000 | |
| 77 | # Preflight script: set to 1 to run the backup drill check. | |
| 78 | PREFLIGHT_BACKUP_DRILL= | |
| 79 | # Set to 1 to enable verbose AI review debug output. | |
| 80 | DEBUG_AI_REVIEW= | |
| 81 | # Autopilot: poll interval in milliseconds (default: 60000). | |
| 82 | AUTOPILOT_INTERVAL_MS=60000 | |
| 83 | # Set to 1 to disable the autopilot background task entirely. | |
| 84 | AUTOPILOT_DISABLED= | |
| 85 | # WebAuthn / Passkey relying-party settings. | |
| 86 | WEBAUTHN_RP_ID=localhost | |
| 87 | WEBAUTHN_ORIGIN=http://localhost:3000 | |
| 88 | WEBAUTHN_RP_NAME=gluecron | |
| 89 | # Set to 1 to enable verbose PR triage debug output. | |
| 90 | DEBUG_PR_TRIAGE= | |
| 91 | # Voyage AI API key for semantic (vector) code search. | |
| 92 | VOYAGE_API_KEY= | |
| 93 | # AES-256-GCM key (hex, 64 chars) for encrypting workflow secrets at rest. | |
| 94 | WORKFLOW_SECRETS_KEY= | |
| 783dd46 | 95 | # AES-256-GCM key (hex, 64 chars) for encrypting server-target SSH private |
| 96 | # keys and per-target env vars at rest (Block ST — /admin/servers). | |
| 97 | # Generate with: openssl rand -hex 32. If unset, all server-target | |
| 98 | # operations refuse cleanly (no panics, no plaintext fallbacks). | |
| 99 | SERVER_TARGETS_KEY= | |
| 90c7531 | 100 | # Block CW — Claude on the web (/:owner/:repo/claude). |
| 101 | # Per-session working directories live under this dir on the web server. | |
| 102 | # Default: /var/lib/gluecron/claude-web. Should be on a disk with room | |
| 103 | # for full repo clones and writable by the gluecron service user. | |
| 104 | CLAUDE_WEB_WORKDIR= | |
| 105 | # Path to the Claude Code CLI binary. Default: `claude` (i.e. on PATH). | |
| 106 | # Override if `claude` is installed somewhere non-standard on the box. | |
| 107 | CLAUDE_BIN= | |
| ea52715 | 108 | # Set to "production" or "test" to override NODE_ENV for Bun. |
| 109 | BUN_ENV= | |
| 110 | # Injected at build time; the deployed git commit SHA for the platform-status endpoint. | |
| 111 | APP_VERSION= | |
| 112 | # Injected at build time; the deployed git commit SHA shown on the status page. | |
| 113 | GIT_COMMIT= | |
| 74a8784 | 114 | |
| 115 | # ── Documented 2026-06-10 (audit pass) — vars used in src/lib/config.ts ── | |
| 116 | # Opt-in: AI scans push diffs and opens issues for problems it finds. | |
| 117 | AI_AUTO_ISSUES= | |
| 118 | # Opt-in: dependency scanner runs on push (advisory cross-reference). | |
| 119 | DEPENDENCY_SCAN_ENABLED= | |
| 120 | # Directory for the OCI container-registry blob store. Default: ./oci-store | |
| 121 | OCI_STORE_PATH= | |
| 122 | # Wildcard domain for PR preview deployments (e.g. previews.example.com). | |
| 123 | # Empty disables branch previews. | |
| 124 | PREVIEW_DOMAIN= | |
| 125 | # Redis/Valkey connection for cross-node SSE fan-out. Empty = in-process | |
| 126 | # broadcaster (single-node only). Either name is accepted. | |
| 127 | REDIS_URL= | |
| 128 | VALKEY_URL= | |
| 27d5fd3 | 129 | |
| 130 | # ── "Sign in with Google" bootstrap (2026-06-12) ───────────────────────── | |
| 131 | # Setting this pair enables the Google sign-in button without touching the | |
| 132 | # /admin/google-oauth page (a DB config saved there takes precedence). | |
| ad3ddf6 | 133 | # Create a Web OAuth client at console.cloud.google.com/apis/credentials. |
| 134 | # The callback auto-resolves from the request (honours X-Forwarded-Proto), | |
| 135 | # so register https://<your-public-host>/login/google/callback in the | |
| 136 | # Console — no APP_BASE_URL required for Google sign-in to work. | |
| 27d5fd3 | 137 | GOOGLE_OAUTH_CLIENT_ID= |
| 138 | GOOGLE_OAUTH_CLIENT_SECRET= | |
| 139 | # Optional: set to 0 to refuse auto-creating accounts on first Google login. | |
| 140 | GOOGLE_OAUTH_AUTO_CREATE= | |
| 141 | # Optional: comma-separated email domains allowed to sign in with Google. | |
| 142 | GOOGLE_OAUTH_ALLOWED_DOMAINS= | |
| bc519ae | 143 | |
| 144 | # ── 2026-06-12 build block (flywheel + SSRF + model routing) ────────────── | |
| 145 | # Kill-switch: set to 1 to force every AI task onto Sonnet, ignoring the | |
| 146 | # Haiku allowlist in src/lib/ai-client.ts modelForTask(). Read per-call. | |
| 147 | AI_FORCE_SONNET= | |
| 148 | # Escape hatch for self-hosted/dev setups whose webhooks or mirrors | |
| 149 | # legitimately target private addresses. Default: private IPs blocked. | |
| 150 | SSRF_ALLOW_PRIVATE= |