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 nameservers set up, putting a domain onto them is the Layer 1 action made concrete: create the zone (Layer 2) in the panel, then change the domain's nameservers at its registrar (Layer 1) to point at ns1/ns2. Do this once per domain being self-hosted.

Order matters: records first, then delegate β€” never the other way round

The one rule that governs go-live: records must exist on the boxes BEFORE delegation points at those boxes. Delegating first means that, hours later, the panel itself at cp.example.com goes dark β€” because authority moved to boxes that never had the cp record. Copy the registrar's existing records into the zone first (apex A/AAAA, www, mail MX/SPF/TXT, ftp, and anything else it already serves), so the instant authority moves to the new boxes they already have every answer. The DNS Servers page keeps this order visible 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 record β€” cp, 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 the expected 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 the zones, and only the selected zone's records show. The selection persists across visits, landing back on the domain last being edited.

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 the domain's answers are managed. These are Layer 2, living inside the now-authoritative boxes:

RecordTypical use
A / AAAAexample.com and subdomains β†’ the node's IP(s).
CNAMEAn alias (e.g. www β†’ example.com).
MX + TXTMail routing and SPF / DKIM / DMARC, when mail is run.
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: copying a zone out of Cloudflare/OVH before delegating. Paste the old provider's export, review, and every record lands in the zone in one go β€” so the boxes hold the full set of answers before the domain is pointed 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 the old registrar before delegating.img/dns-zone-paste-many.avif
Paste many β€” bulk-import a zone's records copied out of the old registrar before delegating.

Records live in the zone, not at the registrar

This is the part people miss. Once the domain is delegated to the new boxes (stepΒ 3), the registrar holds no records β€” the 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 automatically (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 the result is shown per box; if a box rejected the write it's shown, never a fake success. What the panel shows is what the boxes will answer.

Verify from a clean vantage β€” a local network can lie about port 53

Before delegating, confirm the nameservers answer authoritatively from the outside β€” but do not trust dig @<box-ip> run from a laptop or office network. Many ISPs and networks transparently intercept outbound port 53 and answer from their resolver, so the query never reaches the box. The result looks recursive β€” the ra flag instead of aa, arbitrary domains resolving, counting-down TTLs β€” exactly like "the 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), the network is the interceptor, not the 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 checker β€” Zonemaster in its "undelegated" mode: enter the domain plus the 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 delegation is touched. This is the correct pre-delegation gate.

Where to find Zonemaster's undelegated mode

Open zonemaster.net β†’ Show 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 the old nameservers β€” that clears once the delegation change below propagates.

3. Point the registrar at the new nameservers

Now the Layer-1 move. At the registrar of example.com (the domain being delegated β€” not the nameserver domain), replace its nameservers with:

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 the new boxes. It is not a record edit β€” it's the "who is authoritative?" answer changing. Remove any old nameservers so only the two new ones 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. When the 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 being delegated). 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 the 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 delegation, 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 the new nameservers β€” every future record edit in the panel takes effect on that infrastructure. To also sign the zone, 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