Why not keep the automatic address?
Every app goes live right away with an address like app-x7k2.1-2-3-4.sslip.io. That's ideal for trying things out, but Let's Encrypt applies one shared weekly certificate quota to all sslip.io users. Use your own domain for production sites.
1. Create an A record
In your domain provider's DNS settings, add an A record pointing your domain to the server's IP:
blog.example.com. A 203.0.113.10
2. Add the domain to the app
- Open the app's Domains tab.
- Type
blog.example.comunder Connect a domain and leave HTTPS on. - Press Add.
3. Read the DNS check
The panel checks the record with public resolvers. If it's right, the list says "DNS points to this server". If not, it tells you what the record should point to; DNS can take minutes to hours to propagate.
The certificate is obtained on the first visit and renewed before it expires.
If you use Cloudflare
If the domain is behind Cloudflare's proxy (orange cloud), set Cloudflare's SSL mode to Full (strict) or turn the proxy off. Otherwise you may see a redirect loop or certificate error.
If your framework rejects the domain
Frameworks like Django, Rails or Vite may reject hosts they don't know. Instead of listing allowed hosts by hand, use {{XUDBIN_DOMAINS}} in the environment variable; new domains are added on every deploy. Then redeploy.
Your own domain for every new app
To give new apps an address under your domain instead of sslip.io:
- Add a wildcard DNS record:
*.apps.example.com → 203.0.113.10 - In Servers > server > Settings, enter
apps.example.comunder Your own domain for automatic addresses. - Verify with Test, then Save.
New apps get app.apps.example.com; existing addresses don't change.
If you can't open ports
For home servers or machines behind NAT, use Cloudflare Tunnel: paste the token under Servers > server > Settings > Cloudflare Tunnel, set http://xudbin-caddy:80 as the service for the hostname in Cloudflare, and set HTTPS on this server to Off, HTTP only.