> ## Documentation Index
> Fetch the complete documentation index at: https://repocloud.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom Domains

> Connect your own domain to a Container App or a VPS App with two CNAME records

## Custom Domains

A Container App receives an HTTPS address of its own. A VPS App has an address too: a free default domain that points at the server, with HTTPS only if the server installs a certificate (the DevOps AI Agent is instructed to set up HTTPS for a web application it installs). You can add your own domain for a professional, branded experience. A custom domain needs an app that is Online (for a VPS App, a server that has finished provisioning), and it is not offered for the OpenClaw container app or for a server named Ubuntu VPS.

Both kinds of app use two CNAME records; only the pages that show them differ.

## Container Apps: CNAME-Based Setup

Container Apps use two CNAME records, and the HTTPS certificate is issued automatically once both records verify.

**1. Click Add Custom Domain**

Go to your Container App's manage page and click **Add Custom Domain**. The button exists only while the app is Online; in any other status it is disabled with the tooltip "Available when the app is online". The OpenClaw container app has no custom domain ("Custom domains are not available for OpenClaw.").

**2. Enter Your Domain**

The form is titled "Custom domain", with the field **Domain** and the button **Add Custom Domain**; its help line reads "Without http:// or a trailing slash — just the domain." Enter your domain (e.g., `app.example.com`). If you enter a root domain (e.g., `example.com`), the dialog "Using a root domain?" says your DNS provider must support "ANAME, ALIAS, or @ records pointing to a CNAME instead of an A record", names GoDaddy as a provider that does not, and recommends a `www` subdomain "and/or pointing your nameservers to Cloudflare first". Its buttons are **Use 'www' subdomain** and **Proceed with root domain**. The form refuses a name that begins with "http", which can also refuse a real domain whose first label begins with those letters.

**3. Add DNS Records**

The page "Verify your domain" shows two CNAME records to add at your domain registrar, in a table with the columns Type, Name, Value, and Status:

1. **The first record** — its Name is `@` for a root domain and otherwise the part left of your registered domain (`app` for `app.example.com`). Its Value is your app's own address ending in a dot, as the page shows it
2. **The second record** — its Name is `_acme-challenge` and its Value is your registered domain, a dot, the validation target of the app's server, and a dot (`example.com.<16 hex>.dcv.cloudflare.com.`), copied from the page. The record belongs to the registered domain (`_acme-challenge.example.com` for `app.example.com`), not to the subdomain

Every Name and Value has a copy button. The Status column reads Verified or Waiting and is recomputed each time the page loads.

**4. Wait for DNS Propagation**

The page says "DNS changes usually apply within 5–10 minutes but can take up to 24 hours." Some registrars quote up to 48 hours for a change to update globally.

**5. Check Status**

Press **Check status**. The first press registers the domain and emails "Make Your Custom Domain Live". Once both records verify, the page says "All records verified! Your SSL certificate is being issued by Cloudflare. This usually takes a few minutes and will complete automatically." The page reloads itself every 30 seconds only after at least one record has verified; press **Check status** to look again. The manage page changes to "Connected and live" when a check that runs twice an hour (at minutes 13 and 42) finds both records verified and the certificate active, so allow up to about half an hour after the records verify. The email "Success! Your Custom Domain is Ready" follows.

> [!WARNING]
>
> Leave both records in place after setup.

### Multiple Subdomains

The second record sits at the registered domain (`_acme-challenge.example.com`), and its Value belongs to the app's server. If you put several RepoCloud apps on subdomains of one registered domain (`app1.example.com` and `app2.example.com`), check that every Status shows Verified; if one stays Waiting, contact support.

### Removing a Custom Domain

Return to the manage page and click **Remove Domain**; the button exists only while the app is Online. The dialog "Remove Custom Domain" asks "Are you sure you want to permanently remove the custom domain linked to this app? Your app stays reachable at its RepoCloud URL." with the buttons **Cancel** and **Yes, remove it**, and the page confirms with "Custom domain has been successfully removed!". Delete the two records at your registrar afterwards.

On the VPS manage page the Custom Domain card has its own **Remove Custom Domain** button, which removes the domain at once, with no confirmation dialog.

## VPS Apps: CNAME Setup

A VPS App has a dedicated IPv4 address, and its default domain points at that address. A custom domain for a VPS server uses two CNAME records to the server's default web address; the page never offers an A record.

**1. Open the Custom Domain Section**

On the VPS manage page, go to the **Custom Domain** section. The section is absent for a server named Ubuntu VPS and disabled at a zero balance ("Custom domain management is disabled while your balance is $0."), and the control plane can refuse a domain for a server that it does not count as having an application ("Please deploy an app before adding a custom domain."). If it does, point an A record of your domain at the server's IPv4 address and ask the agent in the chat to serve the domain and request a certificate for it. An A record points at one address, so update it if the server's address ever changes.

**2. Add the Domain**

Point a CNAME record from your domain to the server's default domain (shown in the **Access** section), as the card says, then follow the **add it here** link and enter your domain. RepoCloud registers the domain at once, and the page that opens, "Verify your domain", shows the exact two records. The second value exists only after the domain is registered.

**3. Create Two CNAME Records**

At your domain registrar, create the two CNAME records the page shows: your domain (for example `app.example.com`) pointing to the value the page shows (your server's `.vps.rcld.dev` address), and `_acme-challenge.app.example.com` pointing to the validation value. The page prints full names, so enter them the way your DNS provider asks; some providers want the name without the domain.

**4. Wait for Verification**

The page has a **Check status** button and shows Verified or Waiting for each record. Once DNS is verified, the certificate takes 1–3 minutes ("All records verified! Your SSL certificate is being issued."). The page reloads itself every 30 seconds in those states and, when the domain is active, shows `Domain <domain> is now active!` and returns to the manage page. In all, expect about 3 to 5 minutes after the records exist; DNS alone takes 30 seconds to 5 minutes, depending on your registrar. A failed attempt shows "Verification failed." (or "DNS verification timed out.") with a **Remove and try again** button, and a domain whose records were never added fails after 7 days.

### Cloudflare DNS

If the name servers of your domain are Cloudflare's, the VPS verification page shows a note: "Cloudflare DNS users: Set the `_acme-challenge` record to DNS-only (grey cloud). The main CNAME can use Cloudflare proxy (orange cloud)." There is no confirmation prompt to click. The note never appears for a domain under a multi-label suffix such as `.co.uk`. Cloudflare's own documentation advises that records that prove your domain ownership should not be proxied; RepoCloud shows its note for VPS servers only.

### Apps with Their Own Domain Management

For a VPS App that runs Coolify or Dokploy, which manage the domains of the applications you deploy inside them with their own reverse proxy:

- Use the **application's built-in domain management** (inside Coolify or Dokploy) for individual services deployed within the VPS
- The **Custom Domain** section of the manage page puts a domain on the server's default web address, not on a service inside Coolify or Dokploy

> [!WARNING]
>
> A domain added in the Custom Domain section reaches whatever the server's default web address serves, not an application inside Coolify or Dokploy. Add application domains in Coolify's or Dokploy's own Domains settings.

## Apex (Root) Domains

An apex domain (e.g., `example.com` without a subdomain) normally cannot use a CNAME record. A root domain on a Container App verifies when the name answers any address, so a DNS provider that supports one of these can serve it:

- ALIAS records
- ANAME records
- CNAME flattening

Cloudflare notes that turning on CNAME flattening for all CNAME records may cause verification to fail for a CNAME that verifies a domain for a third party. The product's dialog says "Some DNS providers, like GoDaddy, do not support this feature." Options:

- Use a subdomain like `www.example.com` instead (RepoCloud offers this in the dialog, with the **Use 'www' subdomain** button)
- Switch to a DNS provider that supports the feature: Cloudflare (CNAME flattening), DNSimple (ALIAS), or DNS Made Easy (ANAME)

A VPS server also uses two CNAME records and shows the same root-domain dialog. Whether a flattened root domain verifies for a VPS server has not been tested, so use a `www` or other subdomain.

## SSL Certificates

- **Container Apps**: the HTTPS certificate is issued automatically (by Cloudflare) once both CNAME records verify.
- **VPS Apps**: RepoCloud issues the custom-domain certificate automatically once DNS is verified, usually in 1–3 minutes. The second record is what lets the certificate be issued and renewed without further action from you. Certificates that an application inside the server requests for itself (Certbot, Traefik, Caddy) are separate and stay that application's business. A server named Ubuntu VPS has no Custom Domain section.

## Troubleshooting

> **DNS verification failed**
>
> Verify that your DNS records match the values shown in the dashboard. DNS changes usually apply within 5–10 minutes but can take up to 24 hours; some registrars quote up to 48 hours. Use [DNS Checker](https://dnschecker.org) to verify your records are visible globally. A VPS domain whose records were never added fails after 7 days and shows **Remove and try again**.

> **SSL certificate not issuing (Container Apps)**
>
> Ensure the `_acme-challenge` CNAME is at `_acme-challenge.<registered domain>` with the exact value the page shows. The manage page changes to "Connected and live" only when the twice-hourly check (minutes 13 and 42) sees both records verified and the certificate active, so allow up to about half an hour. If both records show Verified and the manage page still says it is waiting for DNS to connect after two of the half-hourly checks, contact support. For a VPS server the certificate step takes 1–3 minutes.

> **Domain shows 'Not Secure'**
>
> The SSL certificate has not been issued yet. Verify DNS configuration and allow time for issuance. Ensure you are accessing the site via HTTPS.

## Next Steps

> **[Container App Management](https://repocloud.io/docs/manage/container-apps.md)**
>
> Other management features for container-based deployments

> **[VPS App Management](https://repocloud.io/docs/manage/vps-apps.md)**
>
> All management features for VPS instances

> **[Troubleshooting](https://repocloud.io/docs/resources/troubleshooting.md)**
>
> Resolve common issues with your applications
