nightshipd speaks plain HTTP with no built-in TLS. For anything past localhost, terminate HTTPS in a reverse proxy. Caddy is the easy default — automatic Let’s Encrypt — but nginx or Traefik work just as well.
Never expose nightshipd’s port directly to the internet.
It has no TLS and no rate limiting appropriate for a raw public port. A
reverse proxy terminates HTTPS, and nightshipd only ever
listens for plain HTTP behind it.
The Compose setup already includes a Caddy
service. All it needs is a Caddyfile next to the compose file —
point your domain’s DNS record at the host first:
builds.example.com {
reverse_proxy nightshipd:8080
}
Caddy fetches and renews a Let’s Encrypt certificate automatically.
Inside the Compose network it reaches the server by service name
(nightshipd:8080).
For a systemd server, install Caddy from
your distro, point a DNS record at the host, and use
/etc/caddy/Caddyfile:
builds.example.com {
encode zstd gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
}
reverse_proxy 127.0.0.1:8080
}
caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Caddy obtains and renews the certificate over the ACME HTTP-01 challenge — which is why port 80 must stay open.
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
nightshipd only speaks
plain HTTP and doesn’t care what terminates TLS. Just proxy your domain
to 127.0.0.1:8080 (or nightshipd:8080 in Docker)
and keep the server’s own port off the public internet.