DATABASE_URL=postgres://postgres:postgres@localhost:5432/ghost BETTER_AUTH_SECRET= API_PORT=3001 BETTER_AUTH_URL=http://localhost:$API_PORT AUTH_TRUSTED_ORIGINS=http://localhost:3000 # Set in production when web and API share a parent domain, e.g. .example.com AUTH_COOKIE_DOMAIN= NEXT_PUBLIC_API_URL=http://localhost:$API_PORT # SSH transport. Without a host key the listener never starts and git speaks HTTP only. # Generate one with: ssh-keygen -t ed25519 -N '' -f ghost_host_key && base64 -i ghost_host_key GIT_SSH_HOST_KEY= # 1031 is the default because 2222 collides with Railway's own container SSH. GIT_SSH_PORT=1031 NEXT_PUBLIC_SSH_CLONE_HOST=localhost:1031 S3_ENDPOINT=http://localhost:9000 S3_ACCESS_KEY_ID=ghost S3_SECRET_ACCESS_KEY=ghostsecret S3_BUCKET=ghost # Storage limits for release assets. Sizes are bytes or binary units: 1073741824, 1gb, 500mb. # STORAGE_QUOTA_BYTES caps what each account (a user, or an organization for its repositories) may store; empty means unlimited. STORAGE_QUOTA_BYTES= # Largest single asset. Defaults to 2gb; one upload can never exceed 5gb. RELEASE_ASSET_MAX_BYTES= # Code search: the api publishes zoekt shards to the bucket under zoekt/ and queries the zoekt node (apps/zoekt) at ZOEKT_URL. Empty turns code search off. ZOEKT_URL= # Origin of the web app; verify and reset-password forms live there. WEB_APP_URL=http://localhost:3000 # The docs app (apps/docs) and the instance it links back to. Both are inlined # into their bundles at build time, so set them before building, not at boot. NEXT_PUBLIC_DOCS_URL=http://localhost:3003 NEXT_PUBLIC_WEB_APP_URL=http://localhost:3000 # Email verification is opt-in so self-hosted instances work without a mail server. EMAIL_VERIFICATION_ENABLED=false EMAIL_SENDER="Ghost " # Either an HTTP relay... EMAIL_PROXY= EMAIL_PROXY_SECRET= # ...or SMTP. MAIL_HOST= MAIL_PORT=587 MAIL_SECURE=false MAIL_USER= MAIL_PASSWORD= # `queue` hands issue and pull request emails to apps/delivery, which retries them. Leave empty to send them from the API. # apps/delivery reads EMAIL_PROXY, EMAIL_PROXY_SECRET and EMAIL_SENDER above. DELIVERY_EMAIL= # Webhook secrets are stored encrypted with this key (AES-256-GCM). The API and apps/delivery need the same value. # Generate one with: openssl rand -base64 32 WEBHOOK_SECRET_KEY= # `true` lets webhooks reach private and loopback addresses, for self-hosted receivers on your own network. # Cloud metadata (169.254.0.0/16) stays blocked either way. WEBHOOK_ALLOW_PRIVATE_NETWORKS=false # How many webhooks apps/delivery sends to one host at once, so one slow receiver cannot take every worker. WEBHOOK_HOST_CONCURRENCY=4 # Telemetry goes to the `lgtm` container: `docker compose up -d lgtm`, Grafana on http://localhost:3100. Clear both to turn it off. OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 PYROSCOPE_SERVER_ADDRESS=http://localhost:4040 GRAFANA_USER=admin GRAFANA_PASSWORD=