--- title: Obsidian Publisher & Sync url: https://blog.guigpap.com/fr/workflows/obsidian-publish/ url_md: https://blog.guigpap.com/fr/workflows/obsidian-publish.md category: automation date: '2026-03-28' maturite: production techno: - astro - n8n - odoo - github - qdrant application: - automation - content - knowledge --- # Obsidian Publisher & Sync > Publication automatique depuis Obsidian vers le blog Astro et synchronisation bidirectionnelle avec Odoo Knowledge ## 1. Quoi ? — Definition et contexte Le [Content Pipeline](/fr/workflows/content-pipeline/) capture les idees dans un vault Obsidian. Mais ensuite ? Deux workflows completent la chaine : l'un publie les notes de blog vers le site Astro Starlight, l'autre synchronise le vault avec Odoo Knowledge pour un acces multi-canal. > **Note - Astro Starlight** > > **Astro Starlight** est le framework qui genere ce blog. Il lit des fichiers MDX (Markdown + composants) pour produire des pages statiques. Publier un article, c'est creer un fichier MDX dans le bon repertoire et ouvrir une Pull Request. ### Deux workflows complementaires | Workflow | Nodes | Declenchement | Role | |----------|-------|---------------|------| | **Obsidian Blog Publisher** | ~12 | Callback Telegram | Note Obsidian → PR blog Astro | | **Obsidian-Odoo Sync** | ~40 | GitHub webhook + Odoo + schedule | Sync bidirectionnelle vault ↔ Odoo Knowledge | ### Architecture ```mermaid flowchart TD Vault["Obsidian vault · GitHub repo guigpap/obsidian-vault"] subgraph Publisher["Blog Publisher · ~12 nodes"] direction TB Trigger1["Callback content_publish_"] Parse["Parse frontmatter YAML"] Route["Route by tags · workflows / infrastructure / reference"] Convert["Convert wikilinks + callouts → MDX"] PR["Create branch + commit + open PR"] end subgraph Sync["Obsidian-Odoo Sync · ~40 nodes"] direction TB GHHook["GitHub webhook · push notes/*"] OdooSched["Schedule horaire · Odoo articles modifiés"] SyncLogic["Mapping tags → categories Knowledge"] Embed["Embedding · text-embedding-3-small"] Qdrant["Upsert Qdrant"] Article["Upsert knowledge.article"] end BlogRepo["Blog Astro · GuiGPaP/blog"] OdooKB["Odoo Knowledge"] Vault --> Trigger1 --> Parse --> Route --> Convert --> PR --> BlogRepo Vault --> GHHook --> SyncLogic OdooKB --> OdooSched --> SyncLogic SyncLogic --> Article SyncLogic --> Embed --> Qdrant Article --> OdooKB ``` --- ## 2. Pourquoi ? — Enjeux et motivations ### Problemes resolus | Probleme | Sans ces workflows | Avec ces workflows | |----------|--------------------|--------------------| | **Publication manuelle** | Copier-coller, convertir le format | Un bouton dans Telegram | | **Connaissances en silo** | Notes dans Obsidian, articles dans Odoo | Sync bidirectionnelle | | **Recherche fragmentee** | Chercher dans 3 endroits differents | Recherche unifiee via Qdrant | --- ## 3. Comment ? — Mise en oeuvre technique ### Blog Publisher Quand une note dans le vault a le frontmatter `type: blog` et `status: ready`, l'utilisateur peut declencher la publication depuis Telegram via un callback `content_publish_{shortId}`. Le workflow : 1. **Parse** le frontmatter YAML de la note Obsidian (titre, tags, description) 2. **Route** vers le bon repertoire selon les tags : | Tags | Repertoire blog | |------|----------------| | workflow, automation | `workflows/` | | infrastructure, docker, stack | `infrastructure/` | | reference, glossary | `reference/` | | (defaut) | `workflows/` | 3. **Convertit** la syntaxe Obsidian en MDX Starlight : - Wikilinks `[[page|label]]` → liens Markdown `[label](/docs/fr/path/)` - Callouts `> [!note]` → composants `> **Note** > > ` > > 4. **Cree** une branche Git, commit le fichier MDX, et ouvre une Pull Request avec un titre auto-genere > > 5. **Notifie** sur Telegram avec le lien vers la PR > > ### Obsidian-Odoo Sync > > La synchronisation bidirectionnelle fonctionne en trois phases : > > **Phase 1 — GitHub → Odoo** (webhook push) > > Quand un fichier est modifie dans le vault (`notes/*` ou `knowledge/*`), le webhook GitHub declenche la sync : > - Parse du frontmatter YAML > - Mapping des tags Obsidian vers les categories Odoo Knowledge > - Upsert de l'article dans `knowledge.article` > - Generation d'un embedding (OpenAI `text-embedding-3-small`) > - Upsert du vecteur dans Qdrant > > **Phase 2 — Odoo → GitHub** (schedule horaire) > > Les articles Odoo modifies (hors source "obsidian") sont convertis en Markdown avec frontmatter YAML et commites dans le vault. La strategie de conflit est "le plus recent gagne", et les suppressions declenchent un archivage (pas de destruction). > > **Phase 3 — Recherche unifiee** (commande Telegram) > > La commande `/search` dans Telegram interroge Qdrant avec un embedding de la requete et retourne les 5 resultats les plus pertinents, groupes par source (Obsidian, Odoo, YouTube). > >