--- title: N8N Export GitHub url: https://blog.guigpap.com/fr/workflows/n8n-export-github/ url_md: https://blog.guigpap.com/fr/workflows/n8n-export-github.md category: tooling date: '2026-01-31' maturite: production techno: - n8n - github application: - automation - operations --- # N8N Export GitHub > Sauvegarde automatique et versioning des workflows N8N vers GitHub ## 1. Quoi ? — Définition et contexte Le workflow **N8N Export GitHub** exporte automatiquement les workflows N8N modifiés vers un repository GitHub dédié. Il permet le versioning, la restauration facile, et garde un historique des modifications. > **Note - Versioning** > > **Versioning** signifie garder un historique de chaque modification. Si un workflow casse après une mise à jour, vous pouvez revenir à une version précédente grâce à l'historique Git. ### Fonctionnalités | Fonction | Description | |----------|-------------| | **Export incrémental** | Seuls les workflows modifiés sont exportés | | **Filtrage intelligent** | Comparaison des timestamps `updatedAt` | | **Manifest automatique** | Métadonnées de tous les workflows | | **Extraction credentials** | Liste les credentials utilisées (sans secrets) | | **Notification Telegram** | Résumé des fichiers créés/modifiés | | **Triggers multiples** | Schedule, manuel, ou webhook | ### Structure du repository ``` stacks_vps_n8n_exports/ ├── README.md # Auto-généré avec stats ├── manifest.json # Métadonnées + updatedAt ├── credentials-manifest.json # Liste credentials (sans secrets) └── workflows/ ├── orchestrateur-telegram.json ├── notification-hub.json └── *.json ``` --- ## 2. Pourquoi ? — Enjeux et motivations ### Problèmes résolus | Problème | Sans export | Avec export | |----------|-------------|-------------| | **Perte de workflows** | Corruption DB N8N = tout perdu | Restauration depuis GitHub | | **Pas d'historique** | Impossible de revenir en arrière | Git history complet | | **Synchro équipe** | Export manuel par email | Repository partagé | | **Documentation** | Workflows non documentés | README auto-généré | ### Pourquoi un export incrémental ? | Approche | Avantage | Inconvénient | |----------|----------|--------------| | **Export complet** | Simple | Commits inutiles, gros diffs | | **Export incrémental** | Commits pertinents, historique propre | Complexité filtrage | > **Tip - Submodule Git** > > Le repo `stacks_vps_n8n_exports` est un submodule du repo principal `stacks_vps`. Cela permet de versionner les exports séparément tout en les incluant dans le projet global. --- ## 3. Comment ? — Mise en œuvre technique ### Architecture ```mermaid flowchart TD subgraph Triggers["Déclencheurs"] direction TB Sched["Schedule · dimanche 04h"] Manual["Manual"] Hook["Webhook"] end GetManifest["Get Manifest from GitHub"] ListWF["List All Workflows · N8N API"] Filter{"Filter Modified · diff updatedAt"} Skip["Notification 'No changes'"] GetFull["Loop · Get full workflow data"] Gen["Generate JSON + README + manifest"] Push["Loop · Push to GitHub · create or update"] Notify["Telegram Notification"] Triggers --> GetManifest --> ListWF --> Filter Filter -->|no changes| Skip Filter -->|modified| GetFull --> Gen --> Push --> Notify ``` ### Triggers | Trigger | Fréquence | Usage | |---------|-----------|-------| | Schedule | Dimanche 4h | Backup hebdomadaire | | Manual | On-demand | Tests et debug | | Webhook | On-demand | Intégration Claude Code | **Déclenchement via webhook :** ```bash source /home/guillaume/stacks_vps/n8n-exports/.env curl -s -X POST "$WEBHOOK_URL" \ -H "X-Export-Token: $X_EXPORT_TOKEN" ``` ### Filtrage incrémental **Filter Modified (Code) :** ```javascript const manifestNode = $('Get Manifest').first(); let existingMap = new Map(); if (manifestNode.json.content) { const manifest = JSON.parse( Buffer.from(manifestNode.json.content, 'base64').toString('utf8') ); existingMap = new Map( manifest.workflows.map(w => [w.id, w.updatedAt]) ); } const workflows = $input.all(); const modified = workflows.filter(wf => { const prevUpdatedAt = existingMap.get(wf.json.id); return !prevUpdatedAt || prevUpdatedAt !== wf.json.updatedAt; }); if (modified.length === 0) { return [{ json: { noChanges: true } }]; } return modified; ``` ### Fichiers générés **manifest.json :** ```json { "exported_at": "2026-01-20T04:00:00.000Z", "workflow_count": 25, "active_count": 18, "inactive_count": 7, "workflows": [ { "id": "abc123", "name": "Orchestrateur Telegram", "active": true, "updatedAt": "2026-01-19T15:30:00.000Z" } ] } ``` **credentials-manifest.json :** ```json { "exported_at": "2026-01-20T04:00:00.000Z", "credentials": [ { "id": "1", "name": "Telegram Bot", "type": "telegramApi" }, { "id": "2", "name": "GitHub PAT", "type": "gitHubApi" } ] } ``` > **Caution - Sécurité** > > Seuls les noms et types de credentials sont exportés, jamais les secrets. Les fichiers workflow contiennent des références aux credentials mais pas les valeurs. ### Notification Telegram ``` *N8N WORKFLOWS EXPORT* 28/01/2026 04:00 *Created (1):* - new-workflow *Updated (3):* - orchestrateur-telegram - notification-hub - manifest Unchanged: 21 [View on GitHub](https://github.com/...) ``` ### Credentials requises | Credential | Type | Usage | |------------|------|-------| | `n8n account` | n8n API | List/Get workflows | | `PAT (classic)` | GitHub API | Get/Create/Edit files | | `Telegram Bot` | Telegram API | Notifications | --- ## 4. Et si ? — Perspectives et limites ### Limites actuelles | Limite | Impact | Mitigation | |--------|--------|------------| | **Pas de restore automatique** | Import manuel dans N8N | Script de restore prévu | | **Credentials non exportés** | Recréer manuellement après restore | Seulement les noms sont sauvés | | **Historique Git uniquement** | Pas de rollback en un clic | Interface GitHub pour diff | ### Scénarios d'évolution **Si besoin de restore automatique** : - Créer un workflow de restore depuis GitHub - Sélection du workflow et de la version - Import via API N8N **Si plusieurs instances N8N** : - Adapter le manifest par instance - Sync bidirectionnelle entre instances - Gestion des conflits **Si volume de workflows augmente** : - Export par catégorie (actifs uniquement) - Compression des anciens exports - Retention policy Git ### Commandes utiles ```bash # Voir les exports récents ls -la n8n-exports/workflows/ # Voir les modifications locales cd n8n-exports && git status # Comparer avec une version précédente git diff HEAD~1 workflows/orchestrateur-telegram.json # Restaurer un workflow # 1. Copier le JSON depuis GitHub # 2. N8N → Import workflow → Paste JSON ``` ### Troubleshooting | Problème | Vérification | |----------|--------------| | Pas d'export | Workflow actif ? Cron correct ? | | 401 GitHub | PAT valide ? Permissions repo ? | | "No changes" constant | manifest.json corrompu ? Supprimer et re-run | | Fichiers en double | Vérifier le filtrage par `updatedAt` | --- ## Pages liées ### Workflows - [Notification Hub](/fr/workflows/notification-hub/) — Notifications Telegram - [Telegram Orchestrator](/fr/workflows/telegram-orchestrator/) — Trigger manuel ### Infrastructure - [N8N Queue Mode](/fr/infrastructure/n8n-queue-mode/) — Backend automation ### Références - [stacks_vps_n8n_exports](https://github.com/GuiGPaP/stacks_vps_n8n_exports) — Repository des exports ## Metadonnees agent - Cet article est issu du blog GuiGPaP Lab. - Contexte global du blog: https://blog.guigpap.com/llms.txt - Contact auteur: https://odoo.guigpap.com/mon-cv - Licence: CC-BY-SA 4.0