Du ”fixar” till slut ett workflow, publicerar det, och en vecka senare går något sönder. Nu letar du igenom gamla exporter, gissar vilken version som var den bra, och hoppas att du inte råkade skriva över den.
Det är exakt det GitHub backup alerts är till för att förhindra. Marketing Ops-team märker det när lead routing fallerar. Byråägare märker det när en kundautomation stannar. Och personen som underhåller n8n (ibland är det du) tvingas till akut arkeologi.
Det här workflowet säkerhetskopierar varje n8n-workflow till ett enda GitHub-repo med datumstämplade mappar och skickar tydliga Discord-notiser för start, lyckat resultat och fel. Du får se vad det automatiserar, vad du får ut av det och hur du kör det pålitligt.
Så fungerar den här automatiseringen
Hela n8n-workflowet, från trigger till slutligt resultat:
n8n Workflow Template: GitHub + Discord: säkra backuper med ändringslarm
flowchart LR
subgraph sg0["Execute Workflow Flow"]
direction LR
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Execute Workflow Trigger", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Return", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If file too large", 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/merge.svg' width='40' height='40' /></div><br/>Merge Items"]
n6@{ icon: "mdi:cog", form: "rounded", label: "Same file - Do nothing", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "File is different", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "File is new", 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/github.dark.svg' width='40' height='40' /></div><br/>Create new file"]
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/github.dark.svg' width='40' height='40' /></div><br/>Edit existing file"]
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Create sub path", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Config", pos: "b", h: 48 }
n17["<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 file data"]
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/>Get file"]
n22["<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/>verifyTheDifference"]
n23@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n14 --> n5
n14 --> n17
n23 --> n6
n23 --> n7
n23 --> n8
n20 --> n5
n8 --> n9
n5 --> n22
n17 --> n4
n9 --> n3
n13 --> n23
n7 --> n10
n4 --> n20
n4 --> n5
n10 --> n3
n22 --> n13
n6 --> n3
n1 --> n14
end
subgraph sg1["On clicking 'execute' Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "On clicking 'execute'", 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/>n8n"]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n12@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
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/discord.svg' width='40' height='40' /></div><br/>Starting Message"]
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/discord.svg' width='40' height='40' /></div><br/>Completed Notification"]
n18@{ icon: "mdi:cog", form: "rounded", label: "Execute Workflow", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n24@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n25["<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/discord.svg' width='40' height='40' /></div><br/>Inform Success Flows"]
n26["<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/discord.svg' width='40' height='40' /></div><br/>Inform Failed Flows"]
n2 --> n11
n19 --> n26
n21 --> n16
n24 --> n25
n11 --> n21
n11 --> n18
n18 --> n24
n18 --> n19
n12 --> n15
n15 --> n2
n26 --> n11
n25 --> n11
n0 --> n15
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 n1,n0,n12 trigger
class n4,n23 decision
class n22 code
classDef customIcon fill:none,stroke:none
class n5,n9,n10,n17,n20,n22,n2,n15,n16,n25,n26 customIcon
Problemet: ändringar i n8n-workflows är lätta att tappa bort
n8n-workflows ändras hela tiden. Du justerar ett villkor, lägger till en nod, uppdaterar credentials, finjusterar timing. Helt rimligt. Problemet är att de flesta team inte har en felfri, sökbar historik över de här ändringarna, så ”vad ändrades?” blir en tidstjuv precis när du inte har råd med det. Exporter sparas på skrivbord med namn som ”final_v3_REALLY_FINAL.json”. Under tiden sitter personen som måste rulla tillbaka och jämför filer manuellt, eller ännu värre: bygger om från minnet. Ärligt talat är det inte den typen av jobb du ska göra mitt i en incident.
Friktionen eskalerar snabbt. Här är var det brukar brista i verkligheten.
- Workflow-exporter är inte centraliserade, så ”senaste fungerande version” blir en gissningslek.
- Utan versionshistorik lägger du lätt cirka en timme per incident bara på att lista ut vad som ändrats.
- Backuper hoppas över eftersom de bygger på att någon kommer ihåg att göra det efter ändringar.
- När en backup misslyckas utan att någon märker det får du veta det först när du faktiskt behöver den.
Lösningen: automatiska GitHub-backuper + Discord-statusmeddelanden
Det här workflowet hämtar alla befintliga n8n-workflows enligt schema (eller vid begäran) och skriver sedan varje workflow till ett GitHub-repository med en datumstruktur som yyyy/MM/dd. Under körningen skickar det Discord-meddelanden så att du ser att det startat, vilka workflow-backuper som lyckades, vilka som misslyckades och en slutlig sammanfattning. Om ett workflow redan finns i GitHub hämtar automatiseringen den sparade filen, jämför den med den senaste workflow-datan och routar sedan resultatet. Oförändrade objekt hoppas över, ändrade uppdateras och helt nya workflows skapas i repot. Ett par Wait-steg fördröjer notiserna lite för att undvika Discords rate limits.
Workflowet startar med en schematrigger (eller manuell trigger) och postar direkt en ”startar”-notis till Discord. Sedan loopar det igenom dina n8n-workflows, jämför ”befintligt vs senaste” och skriver nya eller uppdaterade filer till GitHub under dagens mapp. Till sist postar det uppdateringar för lyckat/misslyckat och ett avslutande meddelande.
Det du får: automatisering vs resultat
| Det här workflowet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du hanterar 30 n8n-workflows och försöker ”vara på den säkra sidan” genom att exportera varje vecka. Om export, namngivning och uppladdning av varje workflow tar kanske 3 minuter blir det cirka 90 minuter rutinjobb varje vecka, och du får ändå inte reda på vad som ändrades. Med det här workflowet är den ”manuella tiden” i princip noll efter setup: schematriggern kör, GitHub-filer skapas eller uppdateras i datumstämplade mappar och Discord postar ett startmeddelande plus en sammanfattning när allt är klart. De flesta team får tillbaka ungefär en timme i veckan, och incidentåterställning går snabbare när en dålig ändring smiter igenom.
Det du behöver
- n8n-instans (testa n8n Cloud gratis)
- Möjlighet att self-hosta om du föredrar det (Hostinger fungerar bra)
- GitHub för att lagra datumstämplade backupfiler för workflows
- Discord för att posta notiser för start/lyckat/misslyckat
- GitHub-token + Discord-webhook (skapa i GitHub Developer Settings och i din Discord-kanals integrationer)
Kompetensnivå: Medel. Du kopplar konton, klistrar in tokens/webhooks och redigerar några konfigurationsfält som repo-ägare/namn och format för backupmapp.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett schema eller en manuell körning sätter igång allt. Du kan starta från Schedule Trigger för helt hands-off backuper, eller använda Manual Trigger när du precis har släppt en riskfylld ändring och vill ta en omedelbar ögonblicksbild.
n8n frågas efter dina aktuella workflows. Workflowet hämtar din workflow-lista och loopar igenom varje objekt i batchar, vilket håller körningen stabil även när du har många workflows.
GitHub kontrolleras och sedan jämförs innehållet. Det hämtar först metadata för filen, kontrollerar storlek, hämtar befintligt innehåll när det är relevant och använder ett Code-steg för att jämföra ”fanns redan vs senaste workflow-data” så att du inte skriver om filer i onödan.
Backuper skrivs till en datumstämplad mapp och Discord rapporterar vad som hände. Nya workflows får en ny fil i GitHub, ändrade uppdateras och oförändrade markeras helt enkelt som oförändrade. Discord postar ett startmeddelande, per-workflow-notiser för lyckat/misslyckat (med små fördröjningar för att undvika rate limits) och en slutlig sammanfattning.
Du kan enkelt ändra formatet på backupmappen så att det matchar teamets arbetssätt (till exempel månadsmappar i stället för dagliga) utifrån era behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera den manuella triggern
Det här arbetsflödet kan startas manuellt eller enligt ett schema. Konfigurera båda ingångarna så att ni kan testa vid behov och köra veckovis.
- Öppna Manual Launch Start och låt den vara den manuella triggern för testning.
- Öppna Planned Trigger och bekräfta att schemaregeln använder veckointervall med triggerAtDay satt till
6och triggerAtHour satt till1. - Verifiera att både Manual Launch Start och Planned Trigger är kopplade till Start Discord Notice.
Steg 2: anslut Discord-notiser
Discord-meddelanden annonserar start, lyckat resultat, fel och slutförande av backuper.
- Öppna Start Discord Notice och ställ in Content till
=The Git backup here. Below is the latest activity: ``` 👉 Starting Workflow Backup [{{ $execution.id }}] ```. - Autentiseringsuppgifter krävs: Anslut era discordBotApi-autentiseringsuppgifter i Start Discord Notice.
- Upprepa inställningen av autentiseringsuppgifter för Completion Discord Notice, Notify Success och Notify Failure (alla kräver discordBotApi).
- Verifiera att innehållet i slutförandenotisen i Completion Discord Notice är
=The Git backup here. Below is the latest activity: ``` ✅ Backup has completed - {{ $('n8n Workflow Fetch').all().length }} workflows have been processed. ```.
[YOUR_ID].Steg 3: anslut n8n API och hämta arbetsflöden
Backuperna bygger på att alla arbetsflöden hämtas från er n8n-instans.
- Öppna n8n Workflow Fetch och behåll standardfilter och förfrågningsalternativ.
- Autentiseringsuppgifter krävs: Anslut era n8nApi-autentiseringsuppgifter i n8n Workflow Fetch.
- Bekräfta att flödet fortsätter till Iterate Records för att bearbeta arbetsflöden ett i taget.
Steg 4: konfigurera körning av delarbetsflöde och timing
Arbetsflödet triggar ett delarbetsflöde per post och använder fördröjningar för att hantera notiser vid lyckat resultat och fel.
- Öppna Run Sub-Workflow (Configure Required) och välj det arbetsflöde ni vill köra i workflowId.
- Säkerställ att Run Sub-Workflow (Configure Required) är kopplad till både Delay Success Notice och Delay After Run.
- Bekräfta att Delay Success Notice har amount satt till
10och leder till Notify Success. - Bekräfta att Delay After Run leder till Notify Failure för felmeddelanden.
Steg 5: konfigurera GitHub-backupvägar och sammanställning av data
Det här avsnittet bygger backup-payloaden och en datumbaserad mappstruktur.
- Öppna Configuration Set och ställ in repo_owner till
={{ '[YOUR_ID]' }}och repo_name till={{ '[YOUR_REPO]' }}. - Säkerställ att Configuration Set bygger data med uttrycket som mappar nodes, connections, pinData och meta från Subworkflow Trigger Inbound.
- Öppna Build Subdirectory och ställ in subPath till
={{ $now.setZone('UTC').toFormat('yyyy') }}/{{ $now.setZone('UTC').toFormat('MM') }}/{{ $now.setZone('UTC').toFormat('dd') }}. - Bekräfta att Configuration Set skickar output till både Combine Records och Fetch File Metadata parallellt.
[YOUR_ID] och [YOUR_REPO] kommer GitHub-filoperationer att misslyckas. Uppdatera båda värdena i Configuration Set.Steg 6: konfigurera GitHub-filkontroller och statusrouting
Arbetsflödet kontrollerar om en fil redan finns, jämför JSON-innehåll och routar till spår för ny, ändrad eller oförändrad fil.
- Öppna Fetch File Metadata och bekräfta att filePath är
={{ $now.setZone('UTC').toFormat('yyyy') }}/{{ $now.setZone('UTC').toFormat('MM') }}/{{ $now.setZone('UTC').toFormat('dd') }}/{{ $('Subworkflow Trigger Inbound').item.json.id }}.json. - Autentiseringsuppgifter krävs: Anslut era githubApi-autentiseringsuppgifter i Fetch File Metadata, Retrieve File Content, Generate New File och Modify Existing File.
- I Check File Size, verifiera att de två villkoren använder
={{ $json.content }}exists och={{ $json.error }}not exists. - Granska Compare Workflow Data för att behålla JavaScript-logiken som sätter
githubStatustillnew,sameellerdifferent. - I Route by Status, bekräfta att regelvillkoren matchar
={{ $('Compare Workflow Data').first().json.githubStatus }}motsame,differentochnew.
Steg 7: konfigurera GitHub-filskrivningar
Filer skapas eller uppdateras baserat på jämförelseresultat, och därefter returneras en slutförandepayload.
- I Generate New File, ställ in filePath till
={{ $('Build Subdirectory').item.json.subPath }}/{{ $('Subworkflow Trigger Inbound').first().json.id }}.jsonoch fileContent till={{ JSON.stringify($('Configuration Set').first().json.data) }}. - I Modify Existing File, ställ in operation till
editoch behåll samma uttryck för filePath och fileContent som ovan. - Bekräfta att Return Payload sätter Done till
trueför att slutföra outputen. - Observera att Unchanged File Path, Changed File Path och New File Path är no-op-routingplatshållare för statusbaserad förgrening.
Steg 8: testa och aktivera ert arbetsflöde
Verifiera backupflödet från start till mål innan ni växlar till schemalagda körningar i produktion.
- Klicka på Execute Workflow från Manual Launch Start för att köra ett test.
- En lyckad körning ska skicka meddelanden från Start Discord Notice och Completion Discord Notice, och GitHub ska få en ny eller uppdaterad JSON-fil i den datumbaserade mappen.
- Verifiera att Notify Success eller Notify Failure triggas för varje post som hanteras av Iterate Records.
- När allt är verifierat, aktivera arbetsflödet så att Planned Trigger körs veckovis.
Vanliga fallgropar
- GitHub-credentials kan gå ut eller kräva specifika behörigheter. Om något slutar fungera: kontrollera först token-scopes och repo-åtkomst i GitHub Developer Settings och i repository-inställningarna.
- Om du använder Wait-noder eller extern rendering varierar processtider. Öka väntetiden om nedströmsnoder misslyckas på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du att redigera utdata i all evighet.
Vanliga frågor
Cirka 30 minuter om ditt GitHub-repo och din Discord-kanal är klara.
Nej, ingen kodning krävs. Du klistrar mest in credentials och redigerar ett par konfigurationsfält som repo-ägare/namn och sökvägen för backupmappen.
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 också räkna in kostnader för GitHub och Discord, som vanligtvis är 0 USD för små team som använder standardtokens/webhooks.
Två alternativ: n8n Cloud (managed, enklast setup) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och klarar n8n bra. Self-hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja. Du kan ändra logiken för mappnamn i steget ”Create sub path” (subdirectory) så att det skriver till en vecko- eller månadsstruktur, och du kan även justera Schedule Trigger så att den körs i den takt du vill. Många team anpassar också Discord-meddelandena (start, per workflow lyckat/misslyckat och slutsammanfattning) så att de matchar ert interna incidentspråk.
Oftast handlar det om en utgången token eller saknade repo-behörigheter. Skapa en ny GitHub-token, bekräfta att den har rätt scopes för att skriva filer, och uppdatera credential i n8n. Dubbelkolla också fälten för repo-ägare och repo-namn i Config-noden, eftersom ett litet skrivfel kan se ut som ett autentiseringsproblem.
Väldigt många.
Ofta, ja, eftersom du loopar över många workflows, jämför filinnehåll och routar på ”ny/ändrad/oförändrad” — den typen av logik blir snabbt krånglig (och dyr) i enklare verktyg. n8n ger dig också ett self-host-alternativ, så du betalar inte per liten delsteg när detta växer. En annan fördel är kontroll: du kan lägga in fördröjningar för att respektera Discords rate limits och hålla notiserna läsbara. Zapier eller Make kan fortfarande funka för väldigt små upplägg, men så fort du vill ha riktig versionshanterad backup plus larm är n8n det mer flexibla valet. Vill du ha en snabb rekommendation utifrån din volym, prata med en automationsexpert.
Backuper du kan lita på förändrar hur du jobbar. Sätt upp detta en gång, och nästa ”vad ändrade vi?”-ögonblick blir en snabb GitHub-koll och en lugn rollback.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.