Dina n8n-workflows förändras hela tiden. En liten justering fixar en bugg, en annan råkar förstöra ett kundflöde, och plötsligt minns ingen vad ”den senaste bra versionen” var. Manuella exporter hjälper, men de glöms lätt bort, är svåra att jämföra och blir ärligt talat en röra när du snabbt måste rulla tillbaka.
Det är här GitHub Slack backups lönar sig för DevOps-ingenjörer som hanterar miljöer, driftorienterade marknadsförare som kör kritiska automationer och byråteam som delar ägarskap för workflows mellan kunder. Du får versionshanterade backuper med pull requests, plus Slack-notiser så att ändringar inte smiter igenom i det tysta.
Nedan ser du hur workflowen beter sig end-to-end, vilka resultat du kan förvänta dig och vad du behöver koppla in för att få pålitliga, granskningsbara backuper som körs i bakgrunden.
Så fungerar den här automatiseringen
Hela n8n-workflowen, från trigger till slutresultat:
n8n Workflow Template: GitHub + Slack: versionsäkrade backuper med PR-granskning
flowchart LR
subgraph sg0["Click me to Flow"]
direction LR
n0["<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/n8n.svg' width='40' height='40' /></div><br/>n8n"]
n1["<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/merge.svg' width='40' height='40' /></div><br/>Find new workflows"]
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/merge.svg' width='40' height='40' /></div><br/>Find updated workflows"]
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/merge.svg' width='40' height='40' /></div><br/>Wait for GitHub create/edit .."]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Create new PR via GitHub API"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define Local Variables", pos: "b", h: 48 }
n6["<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/github.dark.svg' width='40' height='40' /></div><br/>Get all workflows on GitHub"]
n7["<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/github.dark.svg' width='40' height='40' /></div><br/>Get content for each workflow"]
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Base64decode workflow content", pos: "b", h: 48 }
n9["<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/merge.svg' width='40' height='40' /></div><br/>Wait for finished"]
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If there are any changes in ..", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n12["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Create new branch via GitHub.."]
n13["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get latest commit SHA on mai.."]
n14["<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/merge.svg' width='40' height='40' /></div><br/>Wait until branch created"]
n15["<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/merge.svg' width='40' height='40' /></div><br/>Wait until branch created1"]
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter empty data", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter empty data1", pos: "b", h: 48 }
n18["<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/github.dark.svg' width='40' height='40' /></div><br/>Create new commit to add new.."]
n19["<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/github.dark.svg' width='40' height='40' /></div><br/>Create new commit to update .."]
n20["<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/slack.svg' width='40' height='40' /></div><br/>Slack"]
n21@{ icon: "mdi:play-circle", form: "rounded", label: "Click me to trigger", pos: "b", h: 48 }
n0 --> n1
n0 --> n2
n16 --> n18
n9 --> n10
n17 --> n19
n1 --> n15
n1 --> n9
n21 --> n5
n5 --> n0
n5 --> n6
n2 --> n9
n2 --> n14
n14 --> n17
n15 --> n16
n6 --> n7
n4 --> n20
n8 --> n2
n8 --> n1
n7 --> n8
n12 --> n15
n12 --> n14
n18 --> n3
n10 --> n13
n10 --> n11
n3 --> n4
n19 --> n3
n13 --> n12
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 n21 trigger
class n10,n16,n17 decision
class n4,n12,n13 api
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n3,n4,n6,n7,n9,n12,n13,n14,n15,n18,n19,n20 customIcon
Problemet: workflow-backuper som inte hänger med
Att säkerhetskopiera n8n-workflows låter enkelt tills du försöker göra det konsekvent. Exporter blir utspridda i Google Drive-mappar, på skrivbord eller i ”TEMP”-kataloger som ingen litar på. Sedan inser du att du inte enkelt kan diff:a vad som ändrats, du vet inte vem som ändrade det och att återställa rätt version blir en gissningslek. Ännu värre: workflow-uppdateringar sker ofta precis före en lansering eller överlämning, när teamet redan går på knäna. Det är då saknade backuper blir produktionsstopp eller en lång natt där allt måste byggas om från minnet.
Friktionen byggs på. Här är var det brukar fallera.
- Folk glömmer att exportera workflows efter ”små” ändringar, så backupen ligger alltid efter verkligheten.
- När något går sönder finns ingen korrekt ändringshistorik att granska, vilket gör att felsökningen drar ut på tiden.
- Team kan inte samarbeta säkert utan att kliva på varandra, eftersom det saknas ett granskningssteg innan ändringar behandlas som ”slutgiltiga”.
- Att återställa en fungerande version är stressigt när filnamn som ”workflow-final-v7.json” är din enda ledtråd.
Lösningen: automatiska n8n-workflow-backuper med PR-granskning
Den här workflowen gör din n8n-instans till en källa för sanning som alltid speglas in i GitHub, med granskningsvänliga pull requests och en Slack-notis varje gång ändringar är redo. Den börjar med att hämta alla workflows från din n8n-instans och kontrollerar sedan vad som redan finns i ditt GitHub-repo. För varje workflow avkodar den exportinnehållet, jämför med den lagrade filen och separerar ”nya” workflows från ”uppdaterade”. Om något har ändrats skapar den en ny Git-branch, committar de nya/uppdaterade workflow-JSON-filerna och öppnar en pull request tillbaka till din main-branch. Slutligen får teamet en Slack-notis så att granskningen sker medan sammanhanget fortfarande är färskt.
Workflowen startar med en manuell trigger (eller så kan du schemalägga den), hämtar workflow-data från n8n och hämtar befintliga filer från GitHub. Efter jämförelser och filtrering som tar bort tomma ”ingen ändring”-poster committar den bara det som är nytt eller ändrat. En PR öppnas automatiskt och Slack postar länken så att någon snabbt kan godkänna, merga eller rulla tillbaka.
Det du får: automatisering vs. resultat
| Det den här workflowen automatiserar | Resultaten du får |
|---|---|
|
|
Exempel: så här ser det ut i praktiken
Säg att ditt team hanterar 25 workflows för några kunder och att ni försöker backa upp dem varje vecka. Manuellt tar export och uppladdning av bara 25 filer, med cirka 5 minuter per fil, ungefär 2 timmar – och då är inte ”var la jag den?”-tiden ens medräknad. Med den här workflowen triggar du den en gång (eller kör den enligt schema), väntar några minuter på att GitHub-commits och PR:en skapas, och sen är du klar. Det enda manuella steget som återstår är att granska PR:en, vilket de flesta team kan skumma igenom på runt 10 minuter.
Det du behöver
- n8n-instans (testa n8n Cloud gratis)
- Self-hosting-alternativ om du föredrar det (Hostinger fungerar bra)
- GitHub för versionshanterad lagring och pull requests.
- Slack för att notifiera teamet när en PR skapas.
- n8n API-nyckel (hämta den i dina n8n-användarinställningar under API).
Svårighetsnivå: Medel. Du kopplar in autentiseringsuppgifter och ändrar några repo-/sökvägsvariabler, men du behöver inte skriva kod.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En körning triggas. Den startar från den manuella triggern i den här mallen, men många team byter till en Schedule Trigger för att köra varje natt eller varje vecka.
Workflows hämtas från n8n och matchas mot GitHub. Workflowen hämtar alla workflows från din n8n-instans och hämtar sedan listan över befintliga workflow-filer från ditt GitHub-repo så att den kan jämföra vad som är nytt kontra vad som redan spåras.
Ändringar upptäcks och städas upp. Den avkodar workflow-payloads, filtrerar bort tomma ”ingen ändring”-poster och behåller bara workflows som antingen är nyskapade eller uppdaterade sedan senaste backupen.
En branch, commits och en PR skapas. Via GitHub API hämtar den senaste main-commitens SHA, skapar en branch, committar nya och uppdaterade workflow-filer och öppnar en pull request mot din bas-branch. Slack notifieras med PR-länken så att granskningen kan ske snabbt.
Du kan enkelt ändra sökvägen till workflow-katalogen så att den matchar din repo-struktur utifrån dina behov. Se den fullständiga implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera den manuella triggern
Ställ in arbetsflödet så att det startar manuellt så att ni kan validera backup-processen innan ni schemalägger eller aktiverar den.
- Lägg till noden Manual Execution Start som trigger.
- Lämna alla standardinställningar som de är för Manual Execution Start.
- Koppla Manual Execution Start till Initialize Local Settings.
Steg 2: koppla GitHub- och n8n-inställningar
Ange era repository-detaljer och autentisera mot n8n- och GitHub-API:erna.
- Öppna Initialize Local Settings och ställ in branch_name till
=workflows_{{ $now.format('yyyy-MM-dd-hh-mm-ss')}}. - I Initialize Local Settings, ställ in github_owner till
[YOUR_ID]och repo_name till[YOUR_ID]. - Öppna Platform API Fetch och välj credentials. Credential Required: Koppla era n8nApi-credentials.
- Öppna Retrieve Repo Workflow List och bekräfta att owner är
{{ $('Initialize Local Settings').item.json.github_owner }}och att repository är{{ $('Initialize Local Settings').item.json.repo_name }}. Credential Required: Koppla era githubApi-credentials. - Öppna Fetch Workflow File Content och ställ in filePath till
{{ $json.path }}. Credential Required: Koppla era githubApi-credentials.
[YOUR_ID] kommer alla efterföljande GitHub-anrop att misslyckas.Steg 3: sätt upp jämförelse och filtrering av arbetsflöden
Avkoda befintliga arbetsflöden i repositoryt, jämför dem med plattformens arbetsflöden och filtrera bort tomma poster.
- I Fetch Workflow File Content, bekräfta att den är kopplad till Decode Workflow Payload.
- Ställ in Decode Workflow Payload så att den returnerar JSON med jsonOutput som
{{ $json.content.base64Decode() }}. - Konfigurera Detect New Workflows med mode
combine, joinModekeepNonMatchesoch fieldsToMatchStringid. - Konfigurera Detect Updated Workflows med mode
combine, joinModekeepNonMatchesoch fieldsToMatchStringid, updatedAt. - I Remove Empty New Records och Remove Empty Updated Records, säkerställ att villkoret kontrollerar att
{{ $json.id }}inte är tomt.
Notering om parallellt flöde: Initialize Local Settings skickar utdata till både Platform API Fetch och Retrieve Repo Workflow List parallellt. Platform API Fetch skickar utdata till både Detect New Workflows och Detect Updated Workflows parallellt. Decode Workflow Payload skickar utdata till både Detect Updated Workflows och Detect New Workflows parallellt.
Steg 4: konfigurera branching, commits och pull request i GitHub
Skapa en ny branch, skriv nya/uppdaterade workflow-JSON-filer och öppna en PR när ändringar finns.
- I Check for Workflow Changes, behåll OR-villkoret som kontrollerar att
{{ $('Detect Updated Workflows').all() }}eller{{ $('Detect New Workflows').all() }}inte är tomt. - Ställ in URL:en i Fetch Main Commit SHA till
=https://api.github.com/repos/{{ $('Initialize Local Settings').item.json.github_owner }}/{{ $('Initialize Local Settings').item.json.repo_name }}/git/ref/heads/main. Credential Required: Koppla era githubApi-credentials. - Ställ in URL:en i Create Branch via GitHub till
=https://api.github.com/repos/{{ $('Initialize Local Settings').item.json.github_owner }}/{{ $('Initialize Local Settings').item.json.repo_name }}/git/refsoch JSON body till{"ref": "refs/heads/{{ $('Initialize Local Settings').item.json.branch_name }}","sha": "{{ $json.object.sha }}"}. Credential Required: Koppla era githubApi-credentials. - I Commit New Workflow File, ställ in filePath till
=workflows/{{ $json.id }}.json, fileContent till{{ $json.toJsonString() }}och commitMessage till=Add new workflow {{ $json.id }}. Credential Required: Koppla era githubApi-credentials. - I Commit Updated Workflow File, ställ in filePath till
=workflows/{{ $json.id }}.json, fileContent till{{ $json.toJsonString() }}och commitMessage till=Update workflow {{ $json.id }}. Credential Required: Koppla era githubApi-credentials. - I Open Pull Request via GitHub, ställ in url till
=https://api.github.com/repos/{{ $('Initialize Local Settings').item.json.github_owner }}/{{ $('Initialize Local Settings').item.json.repo_name }}/pullsoch jsonBody till{"title": "Automated PR for {{ $('Initialize Local Settings').item.json.branch_name }}","body": "","head": "{{ $('Initialize Local Settings').item.json.branch_name }}","base": "main"}. Credential Required: Koppla era githubApi-credentials.
Notering om parallellt flöde: Create Branch via GitHub skickar utdata till både Hold Until Branch Ready A och Hold Until Branch Ready parallellt. Detect New Workflows skickar utdata till både Hold Until Branch Ready A och Await Merge Completion parallellt. Detect Updated Workflows skickar utdata till både Await Merge Completion och Hold Until Branch Ready parallellt.
Steg 5: konfigurera notifieringar och placeholders
Skicka ett Slack-meddelande när en PR skapas och behåll placeholder-logik för säker branching.
- I Post Slack Notification, ställ in text till
:firework: {{ $workflow.name }} executed succesfully. It created a new <{{ $json.html_url }}|GitHub PR>.och välj er målkanal. Credential Required: Koppla era slackApi-credentials. - Behåll No-Op Placeholder kopplad till false-vägen från Check for Workflow Changes för felsökning eller framtida utbyggnad.
Steg 6: testa och aktivera ert arbetsflöde
Kör arbetsflödet manuellt för att verifiera skapande av branch, commits, skapande av PR och Slack-notifiering.
- Klicka på Execute Workflow för att köra Manual Execution Start och följ exekveringsgrafen.
- Bekräfta att en ny branch skapas av Create Branch via GitHub och att filer committas via Commit New Workflow File och Commit Updated Workflow File.
- Verifiera att Open Pull Request via GitHub skapar en PR och att Post Slack Notification postar PR-länken.
- När det fungerar, ställ in arbetsflödet till Active för produktionsanvändning.
Vanliga fallgropar
- GitHub-autentiseringsuppgifter kan löpa ut eller kräva specifika behörigheter. Om det strular, kontrollera först dina token-scopes (repo-åtkomst) och n8n:s credential-test.
- Om du använder Wait/merge-timing eller om GitHub är långsam med att visa den nya branchen, varierar bearbetningstiderna. Öka väntetiden om efterföljande noder fallerar för att branchen eller SHA:t inte har hunnit propagera än.
- Slack-meddelanden är bara värdefulla om de är läsbara. Standardnotisen är okej, men om du tidigt lägger till repo-namn, branch-namn och en kort ändringssammanfattning sparar du mycket fram och tillbaka senare.
Vanliga frågor
Cirka 30 minuter om din åtkomst till GitHub och Slack redan är klar.
Nej. Du kopplar främst konton och ändrar några variabler som repo-namn och mappsökväg.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver även räkna in kostnader för GitHub och Slack (ofta 0 kr om du redan använder dem), samt hosting om du kör self-hosted.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är en vanlig justering. Lägg till ett filter direkt efter n8n-steget ”Platform API Fetch” (före merges ”Detect New Workflows” och ”Detect Updated Workflows”) för att bara behålla namn/taggar du bryr dig om. Du kan också ändra sökvägen till workflow-katalogen i ”Initialize Local Settings”, justera branch-namn i requesten som skapar branchen och skriva om Slack-meddelandet så att det inkluderar taggar eller ägare.
Oftast handlar det om token-scope eller en utgången credential. Skapa en ny GitHub-token med repo-behörigheter, uppdatera sedan GitHub-credentialn i n8n och testa igen. Om steget för att skapa branch eller göra commit misslyckas, kontrollera också att dina variabler för repo owner/namn matchar exakt och att sökvägen till workflow-katalogen finns (eller att workflowen får skapa den).
I praktiken fungerar dussintals till hundratals workflows bra i en typisk setup, så länge din n8n-instans och GitHub API-gränser inte pressas hårt. På n8n Cloud Starter begränsas du av månatliga körningar; på högre planer får du fler. Om du kör self-hosted finns inget tak för körningar, så det handlar främst om serverresurser och hur ofta du kör backupen.
Ofta, ja. Det svåra här är loopar, jämförelser, branch-logik och att committa flera filer på ett korrekt sätt, vilket n8n klarar utan att tvinga dig in i dyr ”task”-prissättning för varje litet steg. Du får också ett self-hosting-alternativ, vilket är viktigt när du vill ha obegränsade interna backuper. Zapier och Make kan fungera om du bara behöver ett grundläggande ”exportera och lagra”-flöde, men PR-baserad granskning är där det ofta blir klumpigt. Prata med en automationsexpert om du vill ha hjälp att välja det enklaste alternativet för ditt team.
När detta väl rullar slutar backuper vara något du ”försöker komma ihåg”. Du får strukturerade PR:ar, tydlig historik och Slack-puffar precis när de behövs.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.