Skip to content
Back to site

Domain and HTTPS

Give an internet-facing instance a domain and HTTPS, either through the installer or behind a reverse proxy you already run.

  1. Point the domain at the server

    Create an A record for the domain with the server’s public IP. Ports 80 and 443 must be free and open to the internet.

  2. Install with the domain

    Terminal window
    curl -fsSL https://railhook.io/install.sh | bash -s -- --domain hooks.example.com --email ops@example.com
Setting Value
TLS terminator Caddy runs on 80 and 443, and obtains and renews a Let’s Encrypt certificate itself
Dashboard nginx Moves to 127.0.0.1:8080, behind Caddy
APP_ENV production, so the platform refuses to start on unsafe configuration
APP_BASE_URL, CORS_ALLOWED_ORIGINS https://<your domain>
Source ingress and CLI tunnel URLs Follow APP_BASE_URL, so providers get https://<your domain>/ingress/…
LOG_LEVEL WARN
WEBHOOK_TRUSTED_PROXIES 172.16.0.0/12, so real client IPs reach the audit log and the per-IP rate limits. Behind a CDN such as Cloudflare, add the CDN’s published address ranges too, or every visitor through one edge is counted as that edge

With APP_ENV=production the API refuses to start when:

  • a secret still holds a placeholder or a shipped default,
  • WEBHOOK_ALLOW_PRIVATE_IPS=true,
  • SWAGGER_ENABLED=true,
  • CORS_ALLOWED_ORIGINS still contains localhost.

./railhook doctor checks these ahead of time. It also warns if APP_BASE_URL still points at localhost, or if EMAIL_ENABLED is off: with email off, accounts are created already verified and nobody can be invited.