Kundehistorie

How we built an automation platform for 600+ managed servers

And why we replaced n8n with Laravel along the way

Portrait of Toon Van Dooren

Toon Van DoorenCTO · Savvii Hosting

600+
Servers managed
3–4k
Final scale across all verticals
7
Infrastructure stacks unified post-merger
6
Tools evaluated before committing

Da vi begyndte at bygge vores interne automatiseringsplatform, troede vi, at vi havde det rette teknologiske stack. Vi havde n8n til workflow-orkestrering, Semaphore UI til afvikling af Ansible-playbooks og en vision for, hvordan vi kunne automatisere hosting-driften fuldstændigt. Nogle måneder inde i projektet stirrede jeg på noget, der kun kan beskrives som et edderkoppespind — og jeg vidste, at vi var nødt til at starte forfra.

1

Problemet vi forsøgte at løse

Jeg er CTO hos Savvii, en administreret hostingvirksomhed baseret i Holland. Vi er specialiseret i PHP-baserede hjemmesider — e-handel, WordPress og lignende arbejdsbyrder — og betjener tre kundesegmenter: mindre kunder, forhandlere (resellere) og bureauer. Hver har forskellige behov, forskellig skala og forskellige forventninger.

Det var bureau-segmentet, hvor vi følte presset mest. Bureauer er sofistikerede kunder, men deres interne teams er ofte en blanding af tekniske og ikke-tekniske folk. De har brug for en GUI. De kan ikke arbejde i kommandolinjen. Og jo flere bureauer vi tog ind, desto mere indlysende blev det: vi havde brug for et ordentligt kontrolpanel understøttet af ægte automatisering.

Ansible Tower og lignende værktøjer var i vores søgelys, men de var enten for komplekse at sætte op, havde inkonsistent dokumentation eller medførte bekymringer om ydeevne og datasuverænitet. Vi ønskede en løsning, vi selv kunne hoste, opgradere uden drama og overlade til vores supportteam uden en uges forudgående træning.

2

Vurdering af mulighederne

Vi foretog en grundig sammenligning, inden vi lagde os fast på noget. To faktorer indsnævrede hurtigt feltet.

Datasuverænitet. Intet værktøj, der gemte tilstand eller legitimationsoplysninger i en tredjepartssky, kom i betragtning. Selvhosting var ikke til forhandling.

UX for ikke-ingeniører. Vores førstelinjesupport er dygtige formidlere, ikke systemadministratorer. Uanset hvad vi valgte, skulle det kunne betjenes uden at eskalere enhver hændelse til DevOps. De værktøjer, vi vurderede, omfattede:

Kriterium Semaphore UI n8n AWX / Tower Rundeck
Selvhostet som standard Ja — enkelt binær fil / velkendt udrulning Ja — selvhostet udgave Ja (AWX) / blandet (AAP sky-muligheder) Ja
UX for førstelinjesupport Fremragende klarhed omkring opgaver og fortegnelser Godt for forfattere; svagt til driftsoverdragelse Tunge RBAC-koncepter; stejl læringskurve for support Job-centreret; mere besværlig Ansible-ergonomi
Ansible-fortegnelse & eksekverings-UX Bygget op omkring projekter og skabeloner Ikke et kontrolplan til Ansible Indbygget, men kompleks opgraderingsvej Muligt; ikke primært rettet mod Ansible
API til tilpasset middleware Ensartede opgave- og projekt-API'er Omfattende; helt anden driftsmodel Tower API-overflade varierer efter version Modent job-API; andre basiselementer
Opgraderings- og driftsbyrde Problemfrie opgraderinger i praksis Afhænger af workflow-vækst Ofte tung (K8s / samlede afhængigheder) Moderat; JVM-ressourceforbrug

Semaphore UI vandt på begge punkter. Installationen var enkel. Opgraderinger var smertefrie. Brugerfladen var så overskuelig, at en person uden ingeniørbaggrund kunne forstå, hvad der foregik. Tilslutningen af vores eksisterende Ansible-fortegnelse forløb næsten uden gnidninger — det eneste punkt, hvor vi havde brug for hjælp, var at få vores fortegnelse forbundet, og det blev hurtigt løst via support. Semaphores dokumentation var solid, og det gav os tryghed.

3

Den første arkitektur: n8n som middleware

Den oprindelige arkitektur anvendte n8n som orkestreringslag mellem HostBill (fakturering), Semaphore UI og CMDB'en. På papiret så det elegant ud — visuelt, low-code, uden behov for en udvikler til at vedligeholde det.

1
Kunden køber en server i HostBill
2
HostBill sender en webhook til n8n
3
n8n udløser en Semaphore-opgave, der afvikler klargørings-playbook'en i Ansible
4
Playbook'en afvikles på infrastrukturen
5
Semaphore sender et callback, når opgaven er fuldført
6
n8n modtager callbacket og indsamler de resulterende data
7
n8n skriver serveroplysningerne ind i vores CMDB
8
Kunden modtager sine serveroplysninger og forbindelsesdetaljer
4

Hvad der gik galt med n8n

n8n's visuelle brugerflade er glimrende til enkle, lineære flows. Men da betingelser, fejlhåndtering, flertrins-callbacks og tilstandsstyring kom ind i billedet — forsvandt overblikket. Hvad der startede som et overskueligt diagram, udviklede sig til et surrealistisk kredsløb.

Ingen sikker tilstandslagring

Ingen sikker måde at gemme mellemliggende tilstand mellem trin i den version, vi brugte.

Sikkerhedsmæssige bekymringer

Manglende pålidelig sløring af adgangskoder i logfiler — en alvorlig bekymring, når Ansible-callbacks indeholder genererede legitimationsoplysninger.

Skrøbelige callbacks

Håndteringen af callbacks mellem n8n, Semaphore og CMDB krævede uforholdsmæssigt megen kommunikation frem og tilbage, hvilket gjorde workflows skrøbelige.

5

Den nye arkitektur: Laravel som middleware

Vi erstattede n8n med en Laravel-applikation. Det er en rigtig middleware — ikke et no-code værktøj, men noget vores team fuldt ud ejer og forstår.

Klargøringsflow for servere
1
Kunden bestiller en server i HostBill (faktureringspanel)
2
HostBill sender en webhook til Laravel-middlewaren
3
Laravel indsamler anmodningsdata og reserverer en plads i vores CMDB
4
Laravel kalder Semaphore for at udløse klargørings-playbook'en
5
Semaphore afvikler playbook'en og returnerer et opgave-id (task ID)
6
Laravel knytter opgave-id'et til CMDB-posten
7
Når Semaphore sender callback ved fuldførelse, opdaterer Laravel CMDB'en med serverens IP
8
Kunden kontaktes med sine serverdetaljer

Sikkerhedsmodel

Hver server har en authorized_keys-fil, der begrænser, hvad Semaphore SSH-nøglen rent faktisk kan gøre. Ved hjælp af command-direktivet i authorized_keys definerer vi præcist, hvilke kommandoer Semaphore har lov til at køre. Efter den indledende opsætning mister Semaphore også root-adgang — den kan kun forbinde til brugerkonti.

Dette begrænser skadesomfanget (blast radius) markant, hvis noget nogensinde skulle blive kompromitteret.

6

Hvor vi står i dag

Bureau-segmentet, hvor vi startede, kører omkring 600 servere via denne arkitektur. Det samlede omfang på tværs af alle tre segmenter vil i sidste ende være 3.000 til 4.000 servere, og vi udruller platformen løbende.

Semaphores scheduler er næste skridt til serveropdateringer — p.t. håndteres det med eksterne værktøjer, men flyttes til Ansible drevet af scheduleren.

Uafhængig support

Supportteamet kan bruge Semaphore selvstændigt uden at inddrage DevOps ved hver hændelse.

Realtidsalarmer

Slack-integration giver udviklingsteamet øjeblikkelige alarmer, når playbooks fejler.

Rene skabeloner

Lavt antal skabeloner ved at overføre variabler via API — undgik unødig vækst.

Nøjagtig CMDB

CMDB'en holdes automatisk ajour — slut med manuel vedligeholdelse.

7

Hvis vi startede forfra i dag

Den største ting, vi ville gøre anderledes: bruge mere tid på arkitekturdesign, før der skrives en eneste linje automatisering. Vi startede forfra mere end én gang, fordi vi ikke havde gennemtænkt nøje nok, hvilke flows der ville skalere, og hvilke der ville håndtere fejl hensigtsmæssigt.

Arkitektur først

Brug mere tid på arkitekturdesign, før der skrives en eneste linje automatisering. Tænk nøje over, hvilke flows der vil skalere og håndtere fejl hensigtsmæssigt.

Vurder på UX, ikke kun funktioner

Hvis dit supportteam ikke kan bruge det kl. 02 om natten uden at tilkalde en senioringeniør, er det det forkerte værktøj.

Datasuverænitet har betydning

Hav styr på, hvor dine legitimationsoplysninger og tilstandsdata befinder sig, før du går i produktion.

God dokumentation er et signal

Hvis et værktøjs dokumentation sejler, gælder det sandsynligvis også for selve værktøjet.

Ready to automate your infrastructure?

Start with OSS, upgrade to Pro when your team grows. Enterprise support and SLA are available — including for hosting providers running thousands of servers.