Customer story

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

Als wir mit dem Aufbau unserer internen Automatisierungsplattform begannen, dachten wir, wir hätten den richtigen Stack. Wir hatten n8n für die Workflow-Orchestrierung, Semaphore UI für die Ausführung von Ansible-Playbooks und eine Vorstellung davon, wie sich der Hosting-Betrieb vollständig automatisieren ließe. Ein paar Monate später starrte ich auf etwas, das man nur als Spinnennetz beschreiben konnte — und mir war klar, dass wir von vorne anfangen mussten.

1

Das Problem, das wir lösen wollten

Ich bin der CTO von Savvii, einem Managed-Hosting-Unternehmen mit Sitz in den Niederlanden. Wir sind auf PHP-basierte Websites spezialisiert — E-Commerce, WordPress und ähnliche Workloads — und bedienen drei Kundensegmente: kleinere Kunden, Reseller und Agenturen. Jedes Segment hat andere Anforderungen, eine andere Größenordnung und andere Erwartungen.

Im Agentursegment spürten wir den Druck am stärksten. Agenturen sind anspruchsvolle Kunden, aber ihre internen Teams bestehen oft aus einer Mischung aus technischen und nicht-technischen Personen. Sie brauchen eine grafische Oberfläche. Sie können nicht in der Befehlszeile leben. Und je mehr Agenturen wir an Bord holten, desto offensichtlicher wurde es: Wir brauchten ein richtiges Control Panel, gestützt auf echte Automatisierung.

Ansible Tower und ähnliche Tools hatten wir im Blick, aber sie waren entweder zu komplex einzurichten, hatten eine inkonsistente Dokumentation oder brachten Bedenken hinsichtlich Performance und Datensouveränität mit sich. Wir wollten etwas, das wir selbst hosten, ohne Drama aktualisieren und ohne eine Woche Schulung an unser Support-Team übergeben konnten.

2

Die Bewertung der Optionen

Wir haben einen vollständigen Vergleich durchgeführt, bevor wir uns auf irgendetwas festgelegt haben. Zwei Faktoren engten das Feld schnell ein.

Datensouveränität. Kein Tool, das Status oder Anmeldedaten in einer Drittanbieter-Cloud speichert. Selbst-Hosting war nicht verhandelbar.

UX für Nicht-Techniker. Das First-Line-Support-Team besteht aus starken Kommunikatoren, nicht aus Systemadministratoren. Was auch immer wir wählen würden, musste navigierbar sein, ohne jeden Vorfall an DevOps zu eskalieren. Zu den von uns bewerteten Tools gehörten:

Kriterium Semaphore UI n8n AWX / Tower Rundeck
Standardmäßig selbst gehostet Ja — einzelne Binärdatei / vertrautes Deployment Ja — selbst gehostete Edition Ja (AWX) / gemischt (AAP-Cloud-Optionen) Ja
UX für First-Line-Support Hohe Klarheit bei Aufgaben & Inventar Gut für Autoren; schwach bei der Übergabe an den Betrieb Schwere RBAC-Konzepte; steil für den Support Job-zentriert; steilere Ansible-Ergonomie
Ansible-Inventar & Ausführungs-UX Aufgebaut um Projekte & Templates Keine Ansible-Steuerungsebene Nativ, aber komplexer Upgrade-Pfad Möglich; nicht Ansible-orientiert
API für individuelle Middleware Konsistente Aufgaben- & Projekt-APIs Umfangreich; anderes Betriebsmodell Tower-API-Oberfläche variiert je nach Version Ausgereifte Job-API; andere Primitive
Upgrade- & Betriebsaufwand In der Praxis reibungsarme Upgrades Hängt von der Workflow-Ausuferung ab Oft schwer (K8s / gebündelte Abhängigkeiten) Mäßig; JVM-Fußabdruck

Semaphore UI gewann in beiden Punkten. Die Installation war unkompliziert. Upgrades waren schmerzlos. Die Oberfläche war übersichtlich genug, dass auch ein Nicht-Techniker verstehen konnte, was passierte. Das Einbinden unseres bestehenden Ansible-Inventars verlief nahezu reibungslos — der einzige Punkt, an dem wir Hilfe brauchten, war die Anbindung unseres Inventars, und das wurde mit dem Support schnell gelöst. Die Dokumentation von Semaphore war solide, und das gab uns Zuversicht.

3

Die erste Architektur: n8n als Middleware

Die anfängliche Architektur nutzte n8n als Orchestrierungsschicht zwischen HostBill (Abrechnung), Semaphore UI und der CMDB. Auf dem Papier sah es sauber aus — Low-Code, visuell, kein Entwickler nötig, um es zu pflegen.

1
Kunde kauft einen Server in HostBill
2
HostBill löst einen Webhook an n8n aus
3
n8n startet eine Semaphore-Aufgabe, die das Provisioning-Ansible-Playbook ausführt
4
Das Playbook wird auf der Infrastruktur ausgeführt
5
Semaphore sendet einen Callback, wenn die Aufgabe abgeschlossen ist
6
n8n empfängt den Callback und sammelt die resultierenden Daten
7
n8n schreibt die Serverinformationen in unsere CMDB
8
Der Kunde erhält seine Server-Anmeldedaten und Verbindungsdetails
4

Was mit n8n schiefging

Die visuelle Oberfläche von n8n ist großartig für einfache lineare Abläufe. Aber sobald Bedingungen, Fehlerbehandlung, mehrstufige Callbacks und Statusverwaltung ins Spiel kamen — verschwand der Überblick. Was als sauberes Diagramm begann, verwandelte sich in eine surrealistische Leiterplatte.

Keine sichere Statusspeicherung

Keine sichere Möglichkeit, Zwischenstatus zwischen den Schritten zu speichern, in der von uns verwendeten Version.

Sicherheitsbedenken

Keine zuverlässige Passwortmaskierung in den Logs — ein ernstes Problem, wenn Ansible-Callbacks generierte Anmeldedaten enthalten.

Fragile Callbacks

Die Callback-Behandlung zwischen n8n, Semaphore und der CMDB erforderte ein übermäßiges Hin und Her, das die Abläufe fragil machte.

5

Die neue Architektur: Laravel als Middleware

Wir haben n8n durch eine Laravel-Anwendung ersetzt. Es ist echte Middleware — kein No-Code-Tool, sondern etwas, das unser Team vollständig besitzt und versteht.

Server-Provisioning-Ablauf
1
Kunde bestellt einen Server in HostBill (Abrechnungspanel)
2
HostBill löst einen Webhook an die Laravel-Middleware aus
3
Laravel sammelt die Anfragedaten und reserviert einen Slot in unserer CMDB
4
Laravel ruft Semaphore auf, um das Provisioning-Playbook auszulösen
5
Semaphore führt das Playbook aus und gibt eine Task-ID zurück
6
Laravel verknüpft die Task-ID mit dem CMDB-Datensatz
7
Wenn Semaphore nach Abschluss zurückruft, aktualisiert Laravel die CMDB mit der Server-IP
8
Der Kunde wird mit seinen Serverdetails kontaktiert

Sicherheitsmodell

Jeder Server verfügt über eine authorized_keys-Datei, die einschränkt, was der Semaphore-SSH-Schlüssel tatsächlich tun darf. Mithilfe der command-Direktive in authorized_keys legen wir genau fest, welche Befehle Semaphore ausführen darf. Nach der initialen Einrichtung verliert Semaphore zudem den Root-Zugriff — es kann sich nur noch mit Benutzerkonten verbinden.

Das begrenzt den Schadensradius erheblich, falls jemals etwas kompromittiert würde.

6

Wo wir heute stehen

Das Agentursegment, mit dem wir begonnen haben, betreibt rund 600 Server über diese Architektur. Der Gesamtumfang über alle drei Segmente wird letztlich bei 3.000 bis 4.000 Servern liegen, und wir rollen die Plattform schrittweise aus.

Als Nächstes steht der Scheduler von Semaphore für Server-Updates an — derzeit mit externen Tools gehandhabt, aber im Begriff, auf Ansible umzustellen, wobei der Scheduler die Steuerung übernimmt.

Unabhängigkeit des Supports

Der Support kann Semaphore eigenständig nutzen, ohne bei jedem Vorfall DevOps hinzuziehen zu müssen.

Echtzeit-Benachrichtigungen

Die Slack-Integration liefert dem Engineering sofortige Benachrichtigungen, wenn Playbooks fehlschlagen.

Saubere Templates

Geringe Anzahl an Templates durch die Übergabe von Variablen per API — Ausuferung vermieden.

Akkurate CMDB

Die CMDB bleibt automatisch akkurat — keine manuelle Pflege mehr.

7

Wenn wir heute noch einmal von vorne anfangen würden

Das Allerwichtigste, das wir anders machen würden: mehr Zeit in das Architekturdesign investieren, bevor wir auch nur eine einzige Zeile Automatisierung schreiben. Wir haben mehr als einmal von vorne begonnen, weil wir nicht sorgfältig genug darüber nachgedacht hatten, welche Abläufe skalieren und welche Fehler elegant behandeln würden.

Architektur zuerst

Investieren Sie mehr Zeit in das Architekturdesign, bevor Sie auch nur eine einzige Zeile Automatisierung schreiben. Denken Sie sorgfältig darüber nach, welche Abläufe skalieren und Fehler elegant behandeln werden.

Nach UX bewerten, nicht nur nach Funktionsumfang

Wenn Ihr Support-Team es um 2 Uhr nachts nicht ohne einen erfahrenen Engineer nutzen kann, ist es das falsche Tool.

Datensouveränität ist wichtig

Wissen Sie, wo Ihre Anmeldedaten und Ihr Status liegen, bevor Sie in Produktion gehen.

Gute Dokumentation ist ein Signal

Wenn die Dokumentation eines Tools ein Chaos ist, ist das Tool es wahrscheinlich auch.

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.