Een server toevoegen
Van een kale Ubuntu-server naar een werkende rol-node in één commando. Je vult in het paneel in waar de machine voor is, kopieert één regel, plakt die op de server, en kijkt daarna toe.
Geschreven voor: Beheerder
Van een kale Ubuntu-server naar een werkende rol-node in één commando. Je vult in het paneel in waar de machine voor is, kopieert één regel, plakt die op de server, en kijkt daarna toe.
Alleen beheerders zien dit. Resellers en eindgebruikers zien nooit welke machines er zijn.
Wat je nodig hebt
- Een Ubuntu 26.04 LTS-server (24.04 werkt ook, maar de pakketten worden voor 26.04 gebouwd — dat geeft een waarschuwing).
- Een echte machine of een volledige virtuele machine (KVM, Xen, VMware). Een LXC- of OpenVZ-container wordt geweigerd: een node laadt zijn eigen firewall, schrijft sysctls en maakt cgroups per account, en dat kan in een container niet zonder de host te raken.
- Een publiek IPv4-adres op de interface zelf. Achter NAT kan de server wel naar buiten, maar de DNS-records die CoreCP publiceert wijzen dan naar een adres dat niemand kan bereiken.
- Een volledige hostnaam die klopt:
hostname -fmoet hetzelfde antwoorden als wat je in het paneel invult. Het certificaat wordt op die naam uitgegeven. - Uitgaand HTTPS naar het paneel en uitgaand 9443 naar de certificaatautoriteit. Inkomend hoeft er niets open: de server belt naar buiten, nooit andersom.
- Voor de mailrol ook uitgaande poort 25 — de meeste providers zetten die standaard dicht en openen hem op verzoek.
Stap 1 — vertellen waar de server voor is
Paneel → Servers → Server koppelen (of ⌘K, "Server koppelen").
Je vult in:
| Veld | Wat het doet |
|---|---|
| Volledige naam | De identiteit. Het certificaat wordt hierop uitgegeven. |
| Vriendelijke naam | Alleen voor de lijst. Optioneel. |
| Groep | Wie de machine mag zien. |
| Locatie | Vrije tekst: datacenter, stad, rack. Optioneel. |
| Rollen | web, db, mail, dns, back-up, ftp — meerdere tegelijk mag. |
| Servergroep | Waar pakketten op inplannen. Optioneel. |
| Geldigheid | 15, 30 of 60 minuten. |
De rollen reizen mee ín het commando. Dat is het verschil met de meeste andere panelen: de server komt al ingericht boven in plaats van gekoppeld-en-leeg.
Stap 2 — het commando
Je krijgt één regel terug, met een zichtbare aftelling. Op de nieuwe server:
# 1 — de agent installeren (sla over als corectl er al staat)
curl -fsSL https://get.corecp.dev | bash
# 2 — koppelen (het paneel geeft je de echte code)
corectl join --code corecp1.eyJ2IjoxLCJwIjoiaHR0cHM6Ly9wYW5lbDEu…Q.78d8e8b8De code is één keer bruikbaar, verloopt, en draagt de vingerafdruk van de certificaatautoriteit in zich. Daardoor is het eerste contact geen "vertrouw-wat-er-antwoordt": de server pint op die vingerafdruk vóórdat hij iets gelooft wat de autoriteit zegt.
Je kunt de code eerst lezen zonder iets te doen:
corectl join --show --code corecp1.…panel https://panel1.corecp.dev
node stck2.corecp.dev
roles web, db
authority build.corecp.dev:9443
ca pin c4430ea564db75b6
expires 2026-08-09T16:05:00Z
panel ips 185.117.226.121, 2a10:7180:100::121Stap 3 — toekijken
Vanaf het moment dat je op enter drukt loopt de kaart in het paneel mee. Zes fasen, in deze volgorde:
| Fase | Wat er gebeurt |
|---|---|
| Preflight | De machine wordt gelezen. Er wordt niets geschreven. |
| Hardening | Basispakketten, sysctls, ssh-hardening, fail2ban, nftables. |
| mTLS-inschrijving | De autoriteit ondertekent het certificaat van de node. |
| Rolpakketten | De gekozen rollen worden geïnstalleerd. |
| Diensten | De agent en de roldiensten gaan draaien. |
| Gezondheid | corectl doctor — "gekoppeld" betekent "werkend". |
Op de server zie je hetzelfde:
[corecp] joining https://panel1.corecp.dev as stck2.corecp.dev
[corecp] roles: web, db
[corecp] certificate authority build.corecp.dev:9443, pinned on c4430ea564db75b6…
[corecp] == preflight == checking this machine before anything is installed
ok operating system Ubuntu 26.04 LTS
ok architecture amd64
ok virtualization kvm virtual machine
ok memory 3.9 GB (db, web needs 2.0 GB)
ok port 80/tcp free HTTP, nothing listening
ok panel reachable https://panel1.corecp.dev answers, outbound is open
ok public IPv4 185.133.89.70, the same address the panel sees
[corecp] preflight: this machine can carry db, webDe preflight
Dit is het stuk dat CoreCP anders doet. Andere panelen documenteren hun eisen; hier worden ze gecontroleerd, vóórdat er één pakket wordt gedownload. Faalt er één check, dan stopt het en is er niets geïnstalleerd.
Wat er gecontroleerd wordt: het besturingssysteem (Ubuntu LTS), de architectuur, of het geen container is, of poort 80/443 (en 25 voor mail, 53 voor dns) vrij is, of er geen restanten van MySQL/Postfix/een ander paneel staan, RAM en schijf per gekozen rol, een statisch publiek IPv4 en NAT-detectie, of het paneel uitgaand bereikbaar is, en de tijdsynchronisatie. Voor de mailrol daarbovenop uitgaande poort 25 en het PTR-record; voor de dns-rol dat 53 vrij is.
Elke check komt terug, ook de geslaagde. Wie een machine aan het repareren is wil de hele lijst, niet het eerste dat misging. Bij elke rode regel staat wat je eraan doet.
Je kunt de preflight ook los draaien, zonder te koppelen:
# op de machine zelf
corectl node preflight --roles web,db --panel https://panel1.corecp.dev
# of, voor een machine die al gekoppeld is, vanuit het paneel:
# Servers → <server> → rol toevoegenExitcode 1 betekent "deze machine kan het niet dragen", dus dit is bruikbaar in een script.
Alleen de preflight draaien met de echte code, zonder te installeren:
corectl join --code corecp1.… --dry-runAls het misgaat
Onderbroken halverwege. Draai hetzelfde commando opnieuw met --retry:
corectl join --code corecp1.… --retryDat is idempotent. Rollen die al staan worden met rust gelaten, en als de autoriteit het token niet nog eens wil tekenen — want het is opgebruikt door de poging die stukliep — gaat de run verder met het certificaat dat die poging heeft opgehaald.
Verminkt geplakt. De code heeft een controlesom. Een regel die in een chat of een e-mail is afgekapt geeft:
corectl: this join code is incomplete or was altered in transitKopieer hem opnieuw uit het paneel. Regeleindes en spaties in het midden zijn geen probleem — die worden eruit gehaald.
Verlopen. Het token gaat na 15-60 minuten dood; het commando zegt tot wanneer het geldig was. Geef een nieuw token uit in het paneel.
Firewall van de provider. Herkenbaar aan panel reachable of outbound SMTP (port 25) die faalt. De node belt uit; er hoeft niets ingaand open te staan. Wat wél open moet: uitgaand 443 naar het paneel, uitgaand 9443 naar de autoriteit, en uitgaand 25 als je de mailrol wilt.
Opnieuw beginnen. In het paneel: Servers → de server → gevarenzone → Server vergeten en opnieuw beginnen. Dat trekt het token en het certificaat in en verwijdert het record. Daarna op de machine zelf:
corectl join --reset # certificaat en paneelbinding weg
corectl join --reset --purge --yes # ook node.yaml: rollen en configuratie weg--purge is een aparte vlag met een bevestiging, omdat node.yaml geen identiteit is maar configuratie: de rollen, de webserverkeuze, de DNS-primaries. Op een machine die nog accounts draait is dat geen reset maar een wissen.
Token intrekken zonder de server te vergeten. In het paneel bij het commando: Token intrekken. Dat gaat ook naar de certificaatautoriteit — een intrekking die de ondertekenaar niet kent, is een knop die liegt.
Na de koppeling
- Firewall en fail2ban staan er, per rol ingericht.
- De node abonneert zich op het kanaal waar de vloot op staat.
- Bestaande websites verhuizen niet. Nieuwe capaciteit krijgt pas werk als je de machine in een servergroep zet; dat is een aparte, bewuste handeling.
Dit bewijzen zonder reserveserver
De acceptatietest van deze functie (scripts/e2e-r2-node-wizard.sh) heeft geen wegwerp-VM tot zijn beschikking — de buildserver is zelf een KVM-gast zonder geneste virtualisatie. Deel (b) is daarom een echte herinschrijving van ns2.corecp.dev door dezelfde flow: een echte joincode, een echte preflight, een echt door de echte CA ondertekend CSR, de echte rolfase en de echte doctor. Het script maakt vooraf een kopie van het certificaat en node.yaml en zet die terug als er iets misgaat; op groen blijft er één verschil over, namelijk dat de node een nieuwer certificaat heeft — en dat is precies waar een koppeling voor is.