Custom Domains
Point your own domain to a Shipyard deployment with automatic TLS.
Default domains
Every project automatically gets a subdomain:
- Production:
https://<project-name>.shipyard.wtf - Preview:
https://<deploy-id>.shipyard.wtf
Adding a custom domain
Step 1: Add the domain
Terminal
$ shipyard domains add app.example.com
Add this TXT record to your DNS:
_shipyard.app.example.com → shipyard-verify=a1b2c3d4...
Then run: shipyard domains verify app.example.comStep 2: Add DNS records
Add these records at your DNS provider (Cloudflare, GoDaddy, Namecheap, etc.):
| Type | Name | Value |
|---|---|---|
TXT | _shipyard.app.example.com | shipyard-verify=a1b2c3d4... |
CNAME | app.example.com | proxy.shipyard.wtf |
For apex domains (e.g. example.com), use an A record pointing to your Shipyard server's IP address instead of a CNAME.
Step 3: Verify
Terminal
$ shipyard domains verify app.example.com
✓ Domain verified!
SSL certificate provisioning...DNS propagation can take up to 48 hours, but usually completes in minutes. Caddy automatically provisions a TLS certificate on the first request.
Managing domains
Terminal
# List all domains
$ shipyard domains list
DOMAIN STATUS SSL
app.example.com active active
staging.example.com pending pending
# Remove a domain
$ shipyard domains remove staging.example.com
✓ Removed staging.example.comHow it works
- The TXT record proves you own the domain
- Caddy is configured to accept traffic for your domain
- On first HTTPS request, Caddy obtains a Let's Encrypt certificate automatically
- Requests are reverse-proxied to your production deployment's Fly.io Machine
Troubleshooting
- Verification failing? Check that the TXT record is set on
_shipyard.yourdomain.com, notyourdomain.com - SSL not working? Ensure the CNAME/A record points to your Shipyard server and ports 80/443 are open
- Using Cloudflare? Set the proxy status to "DNS only" (gray cloud) so Caddy can provision its own certificate