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.com

Step 2: Add DNS records

Add these records at your DNS provider (Cloudflare, GoDaddy, Namecheap, etc.):

TypeNameValue
TXT_shipyard.app.example.comshipyard-verify=a1b2c3d4...
CNAMEapp.example.comproxy.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.com

How it works

  1. The TXT record proves you own the domain
  2. Caddy is configured to accept traffic for your domain
  3. On first HTTPS request, Caddy obtains a Let's Encrypt certificate automatically
  4. 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, not yourdomain.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

Next steps