Dina n8n-arbetsflöden ändras hela tiden. Någon justerar en nod i produktion, någon annan ”fixar” en JSON-fil i GitHub, och en vecka senare sitter du med två versioner som båda ser rätt ut. Så förvandlas säkerhetskopior till en gissningslek.
Den här GitHub sync automation slår först mot n8n-administratörer, men DevOps-ansvariga och automationskonsulter känner av det också. Du vill ha en pålitlig källa till sanning, inte ”det någon senast kom ihåg att exportera”.
Det här arbetsflödet håller n8n och GitHub synkade automatiskt, så att din senaste version finns på båda ställena, varje vecka, med prydliga commits som du kan rulla tillbaka till.
Så fungerar automationen
Se hur den löser problemet:
n8n Workflow Template: GitHub-synk för pålitliga backuper och rensade versioner
flowchart LR
subgraph sg0["Scheduled Automation Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Automation Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign GitHub Details", 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/n8n.svg' width='40' height='40' /></div><br/>Query n8n 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/github.dark.svg' width='40' height='40' /></div><br/>Retrieve Repo Files"]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Records", pos: "b", h: 48 }
n5["<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/>Fetch Repo File"]
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Decode to JSON", pos: "b", h: 48 }
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/compare.svg' width='40' height='40' /></div><br/>Compare n8n and GitHub"]
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Branch by Timestamp", 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/code.svg' width='40' height='40' /></div><br/>Transform Input B"]
n10["<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/>Modify n8n Workflow"]
n11["<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/>Transform Input A"]
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Dataset Fields", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Build JSON File B", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Update Fields", pos: "b", h: 48 }
n16["<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/>Modify Repo File"]
n17@{ icon: "mdi:cog", form: "rounded", label: "Build JSON File", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base64", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Upload Fields", pos: "b", h: 48 }
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/github.dark.svg' width='40' height='40' /></div><br/>Commit New File"]
n21["<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/>Generate n8n Workflow"]
n2 --> n7
n4 --> n5
n5 --> n6
n14 --> n15
n17 --> n18
n18 --> n19
n13 --> n14
n12 --> n13
n11 --> n12
n9 --> n10
n7 --> n17
n7 --> n8
n7 --> n21
n6 --> n7
n15 --> n16
n19 --> n20
n0 --> n1
n1 --> n2
n1 --> n3
n8 --> n9
n8 --> n11
n3 --> n4
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 trigger
class n4,n8 decision
class n9,n11 code
classDef customIcon fill:none,stroke:none
class n2,n3,n5,n7,n9,n10,n11,n16,n20,n21 customIcon
Utmaningen: versionsdrift mellan n8n och GitHub
Säkerhetskopior av arbetsflöden låter enkelt tills du faktiskt försöker hålla dem uppdaterade. Exporter hoppas över när en lansering drar ut på tiden. En ”snabb hotfix” hamnar direkt i n8n och kommer aldrig in i versionshanteringen. Sedan återställer någon från GitHub under ett driftstopp och råkar tyst få tillbaka en gammal version med saknade credentials, trasiga nodkonfigurationer eller en inaktuell webhook-sökväg. Nu har du både driftstopp och ett detektivarbete. Ärligt talat är det värsta osäkerheten: du slutar lita på repot, vilket gör säkerhetskopian meningslös.
Det eskalerar snabbt. Här är var det brister i verkliga team.
- Manuella exporter glöms bort, så repot glider långsamt ifrån det som faktiskt körs.
- Ändringar sker på två ställen (n8n-gränssnittet och GitHub-filer), och ingen kan avgöra vilken version som är den senaste.
- Återställningar blir riskabla eftersom ”backupen” kanske inte matchar arbetsflödena som verksamheten är beroende av i dag.
- Commit-historiken blir rörig eller vag, vilket gör återställningar långsammare när något går fel.
Lösningen: dubbelriktad n8n ↔ GitHub-synk av arbetsflöden
Den här automationen körs varje vecka (varje måndag) och gör det otacksamma jobbet du inte ska behöva göra manuellt. Den hämtar dina aktuella arbetsflöden från n8n, hämtar arbetsflödesfilerna från ditt GitHub-repo och jämför dem. Om ett arbetsflöde bara finns i n8n säkerhetskopieras det till GitHub som en JSON-fil. Om det bara finns i GitHub skapas arbetsflödet i din n8n-instans. När arbetsflödet finns på båda ställena kontrollerar det tidsstämplar, väljer den nyaste versionen och synkar den till andra sidan så att du inte får två konkurrerande ”senaste”-kopior.
Arbetsflödet börjar med en schemalagd trigger och hämtar sedan båda datamängderna (n8n-arbetsflöden och GitHub-repofiler). Därefter jämför det poster och förgrenar baserat på vad som saknas eller är inaktuellt. Till sist skriver det tillbaka uppdateringar: committar en ny eller uppdaterad JSON-fil till GitHub, eller uppdaterar/skapar arbetsflödet i n8n.
Vad som förändras: före vs. efter
| Det här elimineras | Effekten du kommer att se |
|---|---|
|
|
Verklig effekt
Säg att ditt team hanterar cirka 30 arbetsflöden och att ni en normal vecka rör 10 av dem. En ”ansvarsfull” backuprutin kan innebära att exportera varje ändrat arbetsflöde (kanske 5 minuter styck), namnge filer och committa dem (ytterligare 10 minuter städning), så du bränner ungefär en timme varje vecka. Med det här arbetsflödet körs veckotriggningen automatiskt och sköter jämförelse- och commit-cykeln åt dig. Du kastar en blick på GitHub för att bekräfta senaste commit och går vidare.
Krav
- n8n-instans (prova n8n Cloud gratis)
- Självhostat alternativ om du föredrar det (Hostinger fungerar bra)
- GitHub för att lagra JSON-säkerhetskopior av arbetsflöden.
- n8n API-åtkomst för att läsa och uppdatera arbetsflöden.
- GitHub Personal Access Token (classic) (skaffas i GitHubs Developer settings, med repo-behörigheter)
Kunskapsnivå: Medel. Du klistrar in credentials, anger repo-detaljer och kör ett försiktigt första test.
Behöver du hjälp att implementera detta? Prata med en automationsexpert (gratis 15-minuters konsultation).
Flödet i arbetsflödet
Ett veckoschema drar i gång. Varje måndag startar arbetsflödet automatiskt, så säkerhetskopior inte hänger på att någon kommer ihåg det efter en stressig deploy.
Det hämtar båda ”sanningkällorna”. n8n ger listan över arbetsflöden (och deras uppdateringstidsstämplar). GitHub ger de aktuella JSON-filerna i den valda repomappen.
Poster jämförs och sorteras. En jämförelse av datamängder identifierar arbetsflöden som bara finns på ena sidan, och sedan avgör en gren med ”om nyare” om GitHub ska uppdateras eller om n8n ska uppdateras.
Uppdateringar skrivs tillbaka på ett prydligt sätt. När GitHub behöver ändringar konverterar arbetsflödet JSON till filer, hanterar base64-kodning och committar med ett tidsstämplat meddelande. När n8n behöver ändringar skapar eller modifierar det arbetsflödet via n8n API.
Du kan enkelt ändra schemat till att köra dagligen i stället för veckovis beroende på dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera den schemalagda automationstriggern
Det här arbetsflödet körs enligt ett veckoschema och startar processen för synkronisering av repo.
- Lägg till en nod Scheduled Automation Trigger.
- Ställ in schemaregeln till veckovis med Weeks på Day
1(som konfigurerat i regelobjektet). - Anslut Scheduled Automation Trigger till Assign GitHub Details.
Steg 2: Anslut GitHub- och n8n-källor
Det här steget sätter repo-metadata och hämtar data från både n8n och GitHub parallellt.
- I Assign GitHub Details anger ni fälten: github_account_name, github_repo_name och repo_workflows_path till era repo-värden.
- Assign GitHub Details skickar utdata till både Query n8n Workflows och Retrieve Repo Files parallellt.
- I Retrieve Repo Files ställer ni in Resource till
fileoch Operation tilllist. - Ställ in Owner till
{{ $json.github_account_name }}, Repository till{{ $json.github_repo_name }}och File Path till/{{ $json.repo_workflows_path }}. - I Query n8n Workflows behåller ni standardfiltren för att lista alla arbetsflöden.
Inloggningsuppgifter krävs: Anslut era GitHub-inloggningsuppgifter i Retrieve Repo Files, Fetch Repo File, Modify Repo File och Commit New File.
Inloggningsuppgifter krävs: Anslut era n8n-inloggningsuppgifter i Query n8n Workflows, Modify n8n Workflow och Generate n8n Workflow.
Steg 3: Filtrera och avkoda repo-arbetsflöden
Den här grenen hämtar arbetsflödesfiler från GitHub och avkodar dem till JSON för jämförelse.
- I Filter Records lägger ni till ett villkor där Left Value är
{{ $json.name }}och operatorn är notContains med Right Value satt tillplaceholder. - I Fetch Repo File ställer ni in Operation till
getoch File Path till{{ $json.path }}. - Ställ in Owner till
{{ $('Assign GitHub Details').item.json.github_account_name }}och Repository till{{ $('Assign GitHub Details').item.json.github_repo_name }}. - I Decode to JSON ställer ni in Mode till
rawoch JSON Output till{{ $json.content.base64Decode() }}. - Anslut Fetch Repo File → Decode to JSON → Compare n8n and GitHub.
Steg 4: Jämför dataset och förgrena utifrån tidsstämpel
Det här steget jämför n8n-arbetsflöden med GitHub-kopior och routar uppdateringar baserat på tidsstämplar.
- I Compare n8n and GitHub ställer ni in Merge By Fields så att
idmatchas motid. - Anslut Query n8n Workflows till Compare n8n and GitHub (Input A) och Decode to JSON till Compare n8n and GitHub (Input B).
- I Branch by Timestamp ställer ni in villkoret att jämföra
{{ $json.different.updatedAt.inputA }}before{{ $json.different.updatedAt.inputB }}. - Anslut Compare n8n and GitHub till Build JSON File och till Branch by Timestamp (för olika objekt).
⚠️ Vanlig fallgrop: Om updatedAt-fälten saknas eller är null kommer tidsstämpeljämförelsen att misslyckas. Säkerställ att båda dataset innehåller updatedAt.
Steg 5: Bygg och committa JSON-filer till GitHub
Den här grenen skapar JSON-filer för nya eller uppdaterade arbetsflöden och committar dem till repot.
- Från Compare n8n and GitHub ansluter ni till Build JSON File med Operation satt till
toJsonoch Mode satt tilleach. - Anslut Build JSON File → Convert to Base64 med Operation
binaryToPropery. - I Prepare Upload Fields ställer ni in commitDate till
{{ $now.format('dd-MM-yyyy/H:mm') }}och fileName till{{ $('Compare n8n and GitHub').item.json.name.trim().replace(/\s+/g, '-').toLowerCase() }}.json. - I Commit New File ställer ni in File Path till
{{ $('Assign GitHub Details').item.json.repo_workflows_path }}/{{ $node['Prepare Upload Fields'].json.fileName }}och File Content till{{ $('Convert to Base64').item.json.data }}. - Ställ in Commit Message till
n8n_backup_sync-{{ $node['Prepare Upload Fields'].json.commitDate }}och säkerställ att Branch ärmain.
Steg 6: Uppdatera befintliga filer och n8n-arbetsflöden
När GitHub är nyare uppdaterar ni n8n. När n8n är nyare uppdaterar ni repofilen.
- I true-grenen från Branch by Timestamp ansluter ni till Transform Input B och sedan till Modify n8n Workflow.
- I Modify n8n Workflow ställer ni in Operation till
updateoch Workflow Object till{{ $json.dataset.toJsonString() }}. - I false-grenen ansluter ni Transform Input A → Map Dataset Fields → Build JSON File B → Convert to Base.
- I Prepare Update Fields ställer ni in commitDate till
{{ $now.format('dd-MM-yyyy/H:mm') }}och fileName till{{ $('Transform Input A').item.json.dataset.name.trim().replace(/\s+/g, '-').toLowerCase() }}.json. - I Modify Repo File ställer ni in File Path till
{{ $('Assign GitHub Details').item.json.repo_workflows_path }}/{{ $node['Prepare Update Fields'].json.fileName }}och File Content till{{ $('Convert to Base').item.json.data }}.
Steg 7: Hantera nya arbetsflöden från GitHub
Om ett arbetsflöde finns i GitHub men inte i n8n skapas det automatiskt.
- Från Compare n8n and GitHub ansluter ni utdata “only in GitHub” till Generate n8n Workflow.
- I Generate n8n Workflow ställer ni in Operation till
createoch Workflow Object till{{ $json.toJsonString() }}.
Steg 8: Testa och aktivera ert arbetsflöde
Kör ett manuellt test för att verifiera att GitHub-filer och n8n-arbetsflöden synkroniseras korrekt.
- Klicka på Execute Workflow för att köra arbetsflödet manuellt.
- Bekräfta att Commit New File eller Modify Repo File skapar commits i ert GitHub-repo.
- Kontrollera n8n för att bekräfta uppdateringar från Modify n8n Workflow eller nya poster från Generate n8n Workflow.
- När allt fungerar växlar ni arbetsflödet till Active så att Scheduled Automation Trigger körs varje vecka.
Se upp med
- GitHub-credentials kan löpa ut eller kräva specifika behörigheter. Om något skapar fel, kontrollera först dina Personal Access Token-scope (repo) och felutdata i den GitHub-nod som misslyckas.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder misslyckas på grund av tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in din tonalitet tidigt, annars kommer du redigera utdata i all oändlighet.
Vanliga frågor
Cirka 30 minuter om dina tokens och ditt repo är klara.
Ja, men de behöver någon som är bekväm med API-tokens. När credentials är satta kör arbetsflödet i stort sett av sig självt.
Ja. n8n har ett gratis självhostat 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 också räkna in GitHub-användning (oftast försumbar för små JSON-filer).
Två alternativ: n8n Cloud (hanterat, enklast att komma i gång) eller självhosting på en VPS. För självhosting är Hostinger VPS prisvärd och hanterar n8n bra. Självhosting ger obegränsat antal körningar men kräver grundläggande serverhantering.
Du kan ändra synkfrekvensen i schematriggningen och sedan anpassa vad som synkas i steget Filter Records. Många team justerar också fälten i ”Assign GitHub Details” för att peka mot en annan repomapp, eller lägger till Slack/e-postnotiser efter commit- och uppdateringsåtgärderna så att du får en veckosammanfattning.
Oftast är det en token som har löpt ut eller har för snäva scope. Skapa en ny GitHub Personal Access Token (classic) med repo-behörigheter, uppdatera sedan credentialen i n8n och kör ett manuellt test igen. Det kan också vara en mismatch för repo/branch (fel ägare, fel reponamn, fel mappsökväg), vilket syns som ”not found”-fel. Om du synkar många filer på en gång kan GitHubs rate limiting dyka upp, så batchning hjälper.
På n8n Cloud Starter kan du köra tusentals exekveringar per månad, vilket räcker gott för en veckosynk. Om du självhostar finns ingen gräns för exekveringar; det beror främst på serverstorlek och hur många arbetsflöden du synkar. Det här arbetsflödet är redan byggt för att loopa igenom objekt i batchar, så det hanterar större repos smidigare. För de flesta team är synk av några dussin till några hundra arbetsflöden per vecka en normal och stabil belastning.
Ofta, ja. Zapier och Make kan anropa GitHub, men en dubbelriktad setup med ”jämför datamängder, förgrena på tidsstämpel, skapa-eller-uppdatera på båda sidor” blir snabbt klumpig, och prissättningen kan dra iväg när du hanterar många filer. n8n är byggt för den här typen av logik, särskilt när du behöver loopar, transformationer och villkorliga uppdateringar på ett ställe. Självhosting är den stora skillnaden eftersom du kan köra obegränsat antal exekveringar utan att bekymra dig om task-kostnader. Om du vill ha den enklaste möjliga 2-stegsbackupen kan de verktygen fungera. Prata med en automationsexpert om du väljer mellan dem.
När det här väl rullar slutar ditt repo vara ”bra att ha” och blir pålitligt igen. Sätt upp det, testa en gång, och låt måndagsmorgonen sköta resten.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.