SpipCP
DNSSelf-hosted

Delegate a domain

Per owned domain — create the zone in the panel, add records and the wildcard, then change the registrar's nameservers to ns1/ns2.spipdns.com and verify it propagated. Layer 1 made concrete.

With your nameservers set up, putting a domain onto them is the Layer 1 action made concrete: you create the zone (Layer 2) in the panel, then change the domain's nameservers at its registrar (Layer 1) to point at your ns1/ns2. Do this once per domain you want to self-host.

Order matters: records first, then delegate — never the other way round

The one rule that governs go-live: records must exist on your boxes BEFORE delegation points at your boxes. Delegate first and, hours later, your own panel cp.example.com goes dark — because you moved authority to boxes that never had the cp record. Copy the registrar's existing records into your zone first (apex A/AAAA, www, mail MX/SPF/TXT, ftp, and anything else it already serves), so the instant authority moves to your boxes they already have every answer. The DNS Servers page keeps this order in front of you as an always-visible callout above the tabs. The full sequence:

  1. Enroll ns1 + ns2 until both are healthy (the Nameserver boxes tab).
  2. Create the zone so it goes active (the Self-hosted zones tab).
  3. Add every recordcp, ns1, ns2, and everything the registrar already serves (copy them from the registrar first; Paste many does this in bulk).
  4. Verify: dig @<box-ip> name.example.com +norec returns your answer.
  5. DNSSEC at the registrar? Turn it off there first and wait for it to clear (see DNSSEC).
  6. Only now set glue + point the domain's nameservers at ns1/ns2.
The DNS Servers page with the always-visible go-live order callout above the two tabs
📷The DNS Servers page — the always-visible go-live order callout above the tabs.img/dns-servers-golive-order.avif
The DNS Servers page — the always-visible go-live order callout above the tabs.

1. Create the zone in the panel

In Networking → Nameservers → Self-hosted zones → Create zone, enter the domain (e.g. example.com). SpipCP creates the zone and pushes it to each nameserver box separately — so both ns1 and ns2 are authoritative for it right away (one box being down doesn't block the create; it catches up when it returns).

The Self-hosted zones tab works one domain at a time (the Cloudflare model): a zone selector — a left rail on wide screens, a dropdown on narrow ones — lists your zones, and only the selected zone's records show. Your selection persists across visits, so you land back on the domain you were editing.

The Self-hosted zones tab with the zone selector on the left and the selected zone's records
📷The Self-hosted zones tab: the zone selector (one domain at a time) with the selected zone's records.img/dns-zone-selector.avif
The Self-hosted zones tab: the zone selector (one domain at a time) with the selected zone's records.

2. Add records (and the wildcard)

Pick the domain in the zone selector and its records show — that's where you manage what the domain answers. These are Layer 2, living inside your now-authoritative boxes:

RecordTypical use
A / AAAAexample.com and subdomains → your node's IP(s).
CNAMEAn alias (e.g. wwwexample.com).
MX + TXTMail routing and SPF / DKIM / DMARC, if you run mail.
SRV / CAAService discovery; restrict which CAs may issue certs.
Wildcard*.example.com → catch every subdomain at once (use * as the name).

Add record opens a dialog: a name (relative to the zone — www, @ for the apex, * for a wildcard), a type, one or more values (one per line for round-robin A or multiple MX), and a TTL (300s is a safe default). Editing a record changes its values and TTL; the name and type are fixed.

To bring a whole zone across at once, use Paste many — the bulk-import dialog. It's built for exactly the go-live case: "Great for copying a zone out of Cloudflare/OVH before you delegate." Paste your old provider's export, review, and every record lands in the zone in one go — so your boxes hold the full set of answers before you point the domain at them.

The Paste many bulk-import dialog with a zone's records pasted from an old registrar
📷Paste many — bulk-import a zone's records copied out of your old registrar before you delegate.img/dns-zone-paste-many.avif
Paste many — bulk-import a zone's records copied out of your old registrar before you delegate.

Records live in the zone, not at the registrar

This is the part people miss. Once the domain is delegated to your boxes (step 3), the registrar holds no records — your nameservers do. Every A/MX/TXT lives here, in the zone, and that's the only place to edit them.

The apex SOA and NS records are managed for you (they define delegation itself) and can't be hand-edited here — that's deliberate, so the editor can't silently break who's authoritative. Every change is written to each box, and you see the result per box; if a box rejected the write you see it, never a fake success. What you see in the panel is what the boxes will answer.

Verify from a clean vantage — your own network can lie about port 53

Before you delegate, confirm your nameservers answer authoritatively from the outside — but do not trust dig @<box-ip> run from your laptop or office. Many ISPs and networks transparently intercept outbound port 53 and answer from their resolver, so your query never reaches your box. You'll see recursive answers — the ra flag instead of aa, arbitrary domains resolving, counting-down TTLs — that look exactly like "my box is misconfigured / it's an open resolver" when the box is actually fine.

The tell: query a known-good authoritative server (e.g. a big provider's own nameserver) from the same network. If that also comes back recursive (ra), your network is the interceptor, not your box. Verify the right way instead:

  1. From the box itself — use the panel's Terminal (a shell over the agent, no SSH needed):
    • dig @127.0.0.1 example.eu SOA +norec should show flags: qr aa plus a SOA line.
    • dig @127.0.0.1 example.com +norec should return status: REFUSED — proving it's authoritative, not an open resolver.
    • (dig may need installing first: apt-get install -y dnsutils.)
  2. From a neutral external checkerZonemaster in its "undelegated" mode: enter your domain plus your nameservers-and-IPs (ns1.spipdns.com/203.0.113.1, ns2.spipdns.com/198.51.100.1). It queries from its own infrastructure and confirms authoritative + globally-reachable + not-a-recursor before you touch delegation. This is the correct pre-delegation gate.

Where to find Zonemaster's undelegated mode

Open zonemaster.netShow options → tick Undelegated test, then add each nameserver as name/IP (e.g. ns1.spipdns.com/203.0.113.1). Run it, and every module should be green except a Delegation note that the parent still lists your old nameservers — that clears once you do the delegation change below and it propagates.

3. Point the registrar at your nameservers

Now the Layer-1 move. At the registrar of example.com (the domain you're delegating — not the nameserver domain), replace its nameservers with yours:

ns1.spipdns.com
ns2.spipdns.com

This moves the whole zone's authority from wherever it was (e.g. the registrar's default DNS, or a managed provider) to your boxes. It is not a record edit — it's the "who is authoritative?" answer changing. Remove any old nameservers so only your two remain.

Leave the optional 'associated IP' field blank

Some registrars' "use my own nameservers" form has an optional "associated IP" / glue field next to each nameserver name. If your nameservers live under a different domain — the recommended pattern (ns1/ns2.spipdns.com, see setup) — leave that field blank: the glue already lives at the nameserver domain, so this delegation needs only the names. Only fill an IP if the registrar genuinely requires in-domain glue (nameservers inside the very domain you're delegating). And don't accept a pre-filled placeholder IP — clear it.

4. Verify it propagated

Back in the panel, use Verify delegation on the zone. SpipCP checks from outside that the domain's parent now points to ns1/ns2.spipdns.com and that your boxes answer authoritatively for it.

Delegation propagation can take hours

Nameserver changes go through the registry and are cached by resolvers worldwide; full propagation can take anywhere from minutes to a day (bounded by the parent zone's TTL). The zone shows pending until Verify delegation goes green — that's normal. Don't pull the old nameservers' records elsewhere until delegation is confirmed, so resolvers mid-switch still get answers.

Right after you delegate, an external checker may still show the old nameservers, and Zonemaster may flag "parent ≠ child" — until the registry publishes the change and resolver caches expire. That's normal propagation, not an error; re-check after the parent TTL passes.

Once delegation verifies, the domain is fully on your nameservers — every future record edit in the panel takes effect on your own infrastructure. If you also want the zone signed, continue to DNSSEC.

Next steps

  • DNSSEC — sign this zone and register its DS at the registrar.
  • Failover — how the two nameservers keep the domain resolving.
  • Domains & SSL — attach this domain to a site for HTTPS.

On this page