Att provisionera en ”enkel” hostad tjänst i WHMCS borde inte bli en Slack-tråd, en manuell SSH-session och ett uppföljningsärende för att något driftade över natten. Men det blir det. Och det värsta är hur normalt det hinner kännas.
Den här WHMCS Docker-automationen träffar först hostingens driftteam, och spiller sedan över i supportkön och account managers inkorgar. Oavsett om du driver ett litet hostingbolag eller är en byrå som underhåller kundtjänster på en Docker-host blir resultatet detsamma: färre pingpong-ärenden och mer konsekventa driftsättningar.
Det här arbetsflödet gör WHMCS-modulåtgärder till kontrollerade Docker-kommandon över SSH, med ett strukturerat API-svar tillbaka till WHMCS. Du får se vad det automatiserar, vad du behöver och hur du anpassar det till din miljö.
Så fungerar automationen
Hela n8n-flödet, från trigger till slutlig output:
n8n Workflow Template: WHMCS till Docker: automatiska tjänstedeployeringar
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Parametrs", pos: "b", h: 48 }
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>API"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>422-Invalid server domain"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code1"]
n5@{ icon: "mdi:cog", form: "rounded", label: "SSH", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Container Actions", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Service Actions", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>API answer"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Inspect", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Stat", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Start", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Stop", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Test Connection1", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Deploy", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Suspend", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Terminated", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Unsuspend", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-vertical", form: "rounded", label: "Mount Disk", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Unmount Disk", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Log", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "ChangePackage", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Deploy-docker-compose", pos: "b", h: 48 }
n23@{ icon: "mdi:swap-vertical", form: "rounded", label: "Version", pos: "b", h: 48 }
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Users", pos: "b", h: 48 }
n25@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-vertical", form: "rounded", label: "nginx", pos: "b", h: 48 }
n27@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Container Stat", pos: "b", h: 48 }
n28@{ icon: "mdi:swap-vertical", form: "rounded", label: "GET ACL", pos: "b", h: 48 }
n29@{ icon: "mdi:swap-vertical", form: "rounded", label: "SET ACL", pos: "b", h: 48 }
n30@{ icon: "mdi:swap-vertical", form: "rounded", label: "GET NET", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-vertical", form: "rounded", label: "Dependent containers Stat", pos: "b", h: 48 }
n32@{ icon: "mdi:swap-vertical", form: "rounded", label: "Change Password", pos: "b", h: 48 }
n33@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Immich", pos: "b", h: 48 }
n0 --> n27
n0 --> n6
n0 --> n33
n0 --> n25
n0 --> n3
n2 --> n1
n25 --> n26
n25 --> n7
n20 --> n5
n5 --> n4
n10 --> n5
n12 --> n5
n4 --> n8
n11 --> n5
n24 --> n5
n26 --> n22
n14 --> n5
n33 --> n23
n33 --> n24
n33 --> n32
n28 --> n5
n30 --> n5
n9 --> n5
n29 --> n5
n15 --> n5
n23 --> n5
n1 --> n0
n17 --> n5
n18 --> n5
n16 --> n5
n19 --> n5
n21 --> n5
n27 --> n9
n27 --> n10
n27 --> n20
n27 --> n31
n32 --> n5
n7 --> n13
n7 --> n14
n7 --> n15
n7 --> n17
n7 --> n16
n7 --> n21
n13 --> n5
n6 --> n11
n6 --> n12
n6 --> n18
n6 --> n19
n6 --> n28
n6 --> n29
n6 --> n30
n22 --> n7
n31 --> n5
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n6,n7,n25,n27,n33 decision
class n2,n3,n8 api
class n4 code
classDef customIcon fill:none,stroke:none
class n2,n3,n4,n8 customIcon
Problemet: WHMCS-åtgärder driftsätter inte tjänster av sig själva
WHMCS är riktigt bra på fakturering, livscykelhändelser och att hålla kunddata samlat. Men när en kund klickar på ”Beställ” och förväntar sig en fungerande tjänst skapar inte WHMCS i sig containers, kopplar lagring, applicerar ACL:er eller bekräftar att tjänsten faktiskt går att nå. Så någon får göra det manuellt. Den ”någon” blir också indragen i logguttag, omstarter, paketändringar och lösenordsåterställningar. Några minuter per uppgift låter ofarligt tills det är 20 ärenden om dagen och vartenda ett kräver SSH.
Det eskalerar snabbt. Här är var det fallerar i verkliga team.
- Provisionering kräver samma uppsättning SSH-kommandon varje gång, och det är lätt att missa ett när det går fort.
- Support ber om loggar och containerstatistik, så drift måste kontextväxla bara för att kopiera output in i ett svar.
- Tjänsteändringar (återaktivera, pausa, avsluta) görs inkonsekvent när flera personer hanterar ärenden.
- Drift smyger sig in eftersom den ”riktiga konfigurationen” ligger i någons terminalhistorik, inte i ett granskningsbart arbetsflöde.
Lösningen: WHMCS triggar n8n, n8n kör Docker över SSH
Det här n8n-arbetsflödet fungerar som en liten API-backend för din WHMCS Docker-modul. WHMCS anropar en säkrad webhook med ett kommando (provisionera, pausa, hämta loggar, starta/stoppa, koppla lagring med mera). n8n kontrollerar att begäran är avsedd för din server, laddar dina miljöparametrar och routar kommandot till rätt åtgärd. Därefter ansluter den till din Docker-host via SSH och kör det fördefinierade scriptet för operationen. Till sist formaterar den output (ofta JSON) och returnerar ett tydligt svar till WHMCS, så att modulen kan visa status lyckad/misslyckad utan gissningar.
Flödet startar vid webhook-endpointen (”Incoming API Hook”). Därifrån validerar n8n domänen, väljer rätt router (tjänst-, container- eller appkommandon) och kör motsvarande SSH-script på Docker-servern. WHMCS får ett konsekvent svar varje gång, så processen blir repeterbar i stället för att vara tribal knowledge.
Det du får: automation vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du hanterar 15 WHMCS-tjänstehändelser i veckan som vanligtvis triggar manuellt arbete: provisionering, pausa/återaktivera, paketjusteringar och ”hämta loggar”-förfrågningar. Om varje tar cirka 15 minuter SSH-tid (anslut, kör kommandon, verifiera, klistra in resultat) blir det nästan 4 timmar i veckan. Med det här arbetsflödet skickar WHMCS kommandot direkt och n8n gör SSH-jobbet i bakgrunden, så du främst granskar utfallet. I praktiken går du från ”öppna terminal” till ”kolla svar” på ett par minuter per händelse.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- WHMCS för att trigga åtgärder i tjänstens livscykel.
- Docker-hostserver för att köra containers och Compose-driftsättningar.
- SSH-uppgifter (skapa på din Docker-serveranvändare).
- Webhook Basic Auth (skapa i n8n-credentials).
Kunskapsnivå: Medel. Du är bekväm med att sätta WHMCS-modulendpoints, skapa SSH-nycklar/uppgifter och redigera några miljöparametrar.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
WHMCS anropar webhooken. En modulåtgärd (som provisionering, pausning eller hämta loggar) anropar n8n:s webhook-endpoint, skyddad med Basic Auth så att slumpmässiga förfrågningar inte släpps in.
n8n validerar begärans kontext. Arbetsflödet laddar dina konfigurerade parametrar och kontrollerar att domänen matchar det du förväntar dig (så att en server inte råkar agera på en annan).
Rätt kommandoväg väljs. Med kommandoroutrar skickar arbetsflödet förfrågan till rätt gren: tjänstens livscykelkommandon, containeroperationer (start/stop, koppla/ta bort lagring, ACL-uppdateringar) eller appnivåoperationer som lösenordsåterställningar och versionsuppslag.
SSH körs och svaret normaliseras. n8n kör motsvarande Bash-script på Docker-hosten och formaterar sedan svaret till en förutsägbar payload som WHMCS kan visa och logga.
Du kan enkelt ändra Compose-mallen och Nginx-konfigurationen så att den matchar din standardstack utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera webhook-triggern
Konfigurera den inkommande API-ingångspunkten som driver alla kommandon för containerorkestrering.
- Lägg till och konfigurera Incoming API Hook med Path satt till
docker-immich. - Ställ in Authentication till
basicAuthoch aktivera Multiple Methods satt tilltrue. - Ställ in Response Mode till
responseNodeså att svar hanteras av Webhook Reply. - Inloggningsuppgifter krävs: Anslut era
httpBasicAuth-inloggningsuppgifter i Incoming API Hook.
body (till exempel command, domain, username, password, disk, ram, cpu).Steg 2: Definiera standardvärden för miljön och validering av domän
Ställ in standardvägar och validera den inkommande domänen innan några kommandon routas.
- I Config Parameters ställer ni in standardvärdena:
server_domain tilld01-test.uuq.pl, clients_dir till/opt/docker/clients, mount_dir till/mnt, screen_left till{{och screen_right till}}. - Konfigurera Domain Match Check för att jämföra
{{ $json.server_domain }}med{{ $('Incoming API Hook').item.json.body.server_domain }}. - Koppla false-grenen från Domain Match Check till Respond Invalid Domain med Respond With satt till
jsonoch Response Code till422.
server_domain kommer workflowet att avbrytas tidigt och returnera Invalid server domain.Steg 3: Konfigurera parallell routing från Domain Match Check
Efter validering routar workflowet förfrågningar till flera kommandogrenar samtidigt.
- Bekräfta att huvudflödet från Config Parameters går vidare till Domain Match Check.
- Domain Match Check skickar utdata parallellt till Container Info Router, Container Command Router, App Command Router och Deploy Command Gate.
- I Container Info Router säkerställer ni att reglerna mappar till
container_information_inspect,container_information_stats,container_logochdependent_containers_information_statsfrån{{ $('Incoming API Hook').item.json.body.command }}. - I Container Command Router säkerställer ni att utdata mappar till
container_start,container_stop,container_mount_disk,container_unmount_disk,container_get_acl,container_set_aclochcontainer_get_net. - I App Command Router verifierar ni utdata för
app_version,app_usersochchange_password. - I Deploy Command Gate ställer ni in villkor för
create,change_packageochunsuspendmed{{ $('Incoming API Hook').item.json.body.command }}.
Steg 4: Bygg driftsättningsmallar och tjänsteåtgärder
Förbered Nginx- och compose-mallar och routa därefter till kommandon för tjänstens livscykel.
- Konfigurera Nginx Config Set med main- och main_location-blocken exakt som definierat i nodens värden.
- I Compose Template Build sätter ni docker-compose till den fullständiga YAML-mallen med uttryck som
{{ $('Incoming API Hook').item.json.body.domain }},{{ $('Incoming API Hook').item.json.body.username }}och{{ $('Incoming API Hook').item.json.body.password }}. - Koppla Nginx Config Set → Compose Template Build → Service Command Router.
- I Service Command Router säkerställer ni att utdata är mappade till
test_connection,create,suspend,unsuspend,terminateochchange_package. - För tjänsteåtgärder (Connectivity Test, Provision Service, Suspend Service, Resume Service, Terminate Service, Adjust Package) bekräftar ni att varje nod skapar ett sh-script som kommer att köras av Remote SSH Execute.
Steg 5: Konfigurera container- och appåtgärder (grupperade set-noder)
Dessa set-noder genererar shell-script för containerinspektioner, statistik, loggar och uppgifter på appnivå. De routas av switch-noderna och körs via SSH.
- För containerinfo verifierar ni att Inspect Container, Container Stats, Fetch Logs och Dependent Stats var och en tilldelar ett sh-fält med de tillhandahållna bash-skripten.
- För containerkommandon verifierar ni att Start Container, Stop Container, Attach Storage, Detach Storage, Retrieve ACL, Update ACL och Network Usage var och en producerar ett sh-script med uttryck som
{{ $('Config Parameters').item.json.clients_dir }}och{{ $('Incoming API Hook').item.json.body.domain }}. - För appåtgärder bekräftar ni att App Version Lookup, List App Users och Reset Admin Password bygger det scriptinnehåll som krävs för respektive kommandoscenario.
Steg 6: Konfigurera fjärrkörning och svarsformatering
Alla script körs via SSH och normaliseras till ett konsekvent JSON-svar innan svar skickas till API-anroparen.
- Konfigurera Remote SSH Execute med Cwd satt till
=/och Command satt till{{ $json.sh }}. - Inloggningsuppgifter krävs: Anslut era
sshPassword-inloggningsuppgifter i Remote SSH Execute. - Behåll körflödet från alla kommandonoder till Remote SSH Execute och därefter till Format Response Script.
- I Format Response Script behåller ni den medföljande JavaScript-koden för att tolka
$json.stdoutoch returnera struktureradestatus,messageochdata. - Koppla Format Response Script till Webhook Reply och ställ in Respond With till
allIncomingItems.
Steg 7: Testa och aktivera ert workflow
Validera webhook-routing, SSH-körning och svarsformatering innan ni aktiverar produktion.
- Klicka på Execute Workflow och skicka en POST-förfrågan till
/webhook/docker-immichmed en giltigserver_domainoch ettcommandsom matchar en routerregel. - Verifiera att Domain Match Check routar förfrågan parallellt och att rätt gren når Remote SSH Execute.
- Bekräfta att svaret formateras av Format Response Script och returneras av Webhook Reply med en
statuspåsuccess(eller ett tydligt felmeddelande). - Om allt fungerar växlar ni workflowet till Active för att ta emot API-förfrågningar i produktion.
Vanliga fallgropar
- WHMCS-webhookens inloggningsuppgifter kan löpa ut eller ändras vid moduluppdateringar. Om saker slutar fungera, kontrollera först webhookens Basic Auth-credential i n8n och modulens endpoint-inställningar i WHMCS.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in din varumärkesröst tidigt, annars kommer du redigera output för alltid.
Vanliga frågor
Cirka en timme om din SSH-åtkomst och WHMCS-modul är redo.
Nej. Du konfigurerar främst credentials, redigerar några parametrar och testar varje WHMCS-åtgärd en gång.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volymer. Du behöver också räkna med serverkostnader för din Docker-host (och eventuella betalda WHMCS-modulavgifter du redan har).
Två alternativ: n8n Cloud (hanterat, enklast setup) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärt och hanterar n8n bra. Egen hosting ger dig obegränsade körningar men kräver grundläggande serveradministration.
Ja, och det bör du sannolikt göra. Uppdatera värden i ”Config Parameters” som server_domain och kataloger, och anpassa sedan ”Compose Template Build” till din föredragna Compose-struktur och ”Nginx Config Set” till dina proxy-standarder. Vanliga anpassningar är att lägga till miljövariabler, byta lagringsvägar och sätta resursbegränsningar för specifika paket.
De flesta fel beror på att Basic Auth inte matchar på webhooken, eller att domänen inte matchar och triggar vägen ”Respond Invalid Domain”. Kontrollera först WHMCS-modulens endpoint-URL och bekräfta sedan att webhook-credentialn i n8n matchar det WHMCS skickar. Verifiera därefter att arbetsflödets server_domain-parameter exakt matchar det WHMCS anropar (inklusive subdomän). Om du fortfarande sitter fast, titta på senaste webhook-körningen i n8n och jämför inkommande payload med det dina kommandoroutrar förväntar sig.
Med en typisk n8n Cloud-plan kan du hantera tusentals körningar per månad, och egen hosting tar bort körningstaket (din server blir begränsningen). I praktiken är SSH-åtgärder flaskhalsen, så räkna med några förfrågningar per minut per Docker-host om du vill ha förutsägbar prestanda. Om du behöver mer, kör flera workers eller köa förfrågningar så att provisionering inte krockar med tunga logguttag.
Oftast, ja. Zapier och Make är utmärkta för SaaS-till-SaaS-uppgifter, men SSH-drivna DevOps-flöden blir snabbt klumpiga, och routing med många grenar blir dyrt. n8n hanterar komplex växling (tjänstkommandon vs containerkommandon vs appkommandon) utan att göra din automation till en spaghettihärva. Egen hosting spelar också roll här eftersom du kan vilja att WHMCS-händelser och infrastrukturåtgärder stannar på dina egna servrar. Prata med en automationsexpert om du vill ha en snabb rekommendation för din stack.
När detta väl är på plats slutar WHMCS vara ”stället där kunder klickar på knappar” och blir systemet som faktiskt driver verkligheten för tjänsten. Arbetsflödet hanterar de repetitiva infrastrukturstegen, så att du kan fokusera på tillförlitlighet och tillväxt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.