Commit Graph

6 Commits

Author SHA1 Message Date
Jules Neny
090fb581ee feat(v1.6): ajout LinkedIn API V2 comme 3e source journal
- Node Fetch-linkedin (LinkedIn REST API v2/posts, OAuth2 predefined credential)
- Parser parseLinkedIn() dans Normalise : extrait commentary + UGC text, URL post, thumbnail
- Fonction safeJson() parallèle à safeText() pour payloads JSON (vs XML)
- Variable LINKEDIN_MEMBER_ID (env n8n) dans l'URL du endpoint
- .env.example documenté avec LINKEDIN_MEMBER_ID + comment récupération
- counts.linkedin ajouté dans le payload journal.json

Prerequis L.1 bloquants (humain Jules) :
- Redirect URL n8n dans LinkedIn Developer Portal
- Credential LinkedIn OAuth2 créé dans n8n UI
- Member ID Jules récupéré via /v2/me et stocké dans env n8n

Branche depuis feat/v1.5-E-rsshub (V1.5 pas encore mergé sur main).
Pas de modif Astro/Vue — JournalFeed (JournalList.vue) déjà platform-agnostic.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 08:37:47 +02:00
Jules Neny
458a152525 V1.5-E RSSHub journal feed (E.1-E.8)
Bascule Behold -> RSSHub self-host (rss.trans-former.fr) :

- InstaFeed.vue : consomme PUBLIC_JOURNAL_URL (journal unifie n8n)
  au lieu de feeds.behold.so direct. Filtre platform=instagram +
  account dans l'url. Plus de feedId Behold a passer.
- ColInsta.astro : supprime props feedId, passe seulement account
  handle (aep.politique, julesneny) pour filtrage cote client.
- .env.example : PUBLIC_BEHOLD_* deprecies (conservees pour compat),
  PUBLIC_JOURNAL_URL note V1.5-E source RSSHub.
- docs/n8n-workflow-journal-aggregate-v2-rsshub.json : workflow V2
  a importer dans n8n. Remplace 3 nodes Behold par : Substack natif
  (julesneny.substack.com/feed) + RSSHub Insta x2 (rss.trans-former.fr/
  instagram/user/*). Cron 3h -> 4h UTC (anti-rate-limit). Parser RSS
  ajoute (CDATA, dedup par GUID).
- carte-o.json : regen prebuild auto.

Ops VPS realisees hors repo (E.1-E.3, E.8 conf) :
- docker pull diygod/rsshub:latest (image officielle, pas rsshub/rsshub)
- /opt/rsshub/docker-compose.yml : RSSHub + Redis cache, port 3006 local
- Caddy : bloc rss.trans-former.fr -> reverse_proxy 127.0.0.1:3006

CHECKPOINT E.4 BLOQUANT : DNS OVH 'rss' IN A 178.104.106.195 a pousser
manuellement par Jules. Sans DNS, rss.trans-former.fr inaccessible.

LIMITE FONCTIONNELLE detectee : RSSHub /instagram/* requiert config
Instagram cookie (ConfigNotFoundError 503). Tant que les env vars
INSTAGRAM_USERNAME/PASSWORD ou cookie ne sont pas fournis a RSSHub,
les routes Insta retourneront vide. Le journal aura 0 item insta et
ColInsta affichera fallbackBio. Substack et Gitea sources OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 00:56:36 +02:00
Jules Neny
beb8e9a0bd feat(v11-i): footer CTA infolettre + endpoint /api/subscribe Kit V4 2026-05-11 15:04:58 +02:00
Jules Neny
be7fc09085 feat: PC7 chatbot V1 onglet centre HAUT + endpoint Astro proxy SSR
- ChatbotV2.vue : Vue island, thread chat (input + messages bot/user),
  persistance sessionStorage, bandeau beta '120 fiches AEP, RAG-PE bientot',
  gestion erreurs 429/502/504 ; pas de streaming ni markdown V1
- /api/chatbot.ts : endpoint Astro server proxy POST vers CHATBOT_UPSTREAM
  (default https://aep.trans-former.fr/api/chatbot), timeout 25s,
  body { question, history } -> upstream classique chatbot AEP Mistral Small
- astro.config.mjs : output 'server' + adapter @astrojs/node standalone
  (Astro 6 a supprime mode hybrid ; on opt-in prerender sur les pages)
- Toutes les pages publiques (index, manifeste, manifeste/commander,
  a-propos, mentions-legales) ont 'export const prerender = true'
- ColCentre.astro : remplace ChatbotPlaceholder par ChatbotV2 dans le tab
- .env.example : ajoute CHATBOT_UPSTREAM (V1.5 = switch LightRAG-PE 1 ligne)

Decision V1 : endpoint AEP /api/chatbot (classique, repond bien) au lieu
de /api/chatbot-v2 qui retourne v2_ready=false ('base vectorielle en cours').
Bandeau beta reste valide ; switch v2 quand ready cote AEP via env var.

Note PC8 deploy : Coolify doit booter avec 'node ./dist/server/entry.mjs'
(SSR Node standalone) au lieu de servir dist/client/ static.

Test end-to-end OK : SSR boot port 4399 + curl POST /api/chatbot ->
reponse_texte 800+ chars de l'AEP backend.
2026-05-09 01:22:01 +02:00
Jules Neny
e22dd6654a feat: PC6 journal unifie + n8n workflow agregateur (V1 MVP)
Composant Vue JournalList :
- fetch PUBLIC_JOURNAL_URL (defaut data.trans-former.fr/journal.json)
- ecoute event 'hashtag-filter-change' emis par ColJournal (PC2)
- filtre par hashtag actif, tri desc respecte (n8n cote serveur)
- fallback gracieux : loading / errored / empty / no-match

Cabling :
- ColJournal.astro importe et rend <JournalList client:visible />
- placeholder remplace par le composant Vue

Workflow n8n (docs/n8n-workflow-journal-aggregate.json) :
- Schedule trigger cron 0 3 * * *
- Fetch Gitea Atom (jules.atom) + Behold AEP + Behold julesneny (skip si feed IDs absents)
- Code Node normalisation 3 sources -> format JSON commun
- Tri desc + cap top 100
- Write Binary File vers /home/node/.n8n/journal/journal.json (volume Docker partage)

Sources V1 actives :
- Gitea Atom (#stack) - active, 200 OK confirme
- Behold @aep (#aep-politique) - conditionnel feed ID
- Behold @julesneny (#peinture) - conditionnel feed ID

Sources skipped (V1.5/V2) :
- GitHub.com : username 'julesneny' n'existe pas (HTTP 404), pivot Gitea
- Substack 'transformations' : pris par 'WoodHorse' (pas Jules), handle a confirmer
- LinkedIn, Castopod, Blog : V2

Mock journal.json en public/data/ pour dev local (fallback si data.trans-former.fr indisponible).

Setup VPS prepare (cf docs/PC6-JOURNAL-N8N-SETUP.md) :
- Caddyfile bloc data.trans-former.fr ajoute en commentaire (active apres DNS)
- Dossier /var/lib/docker/volumes/vps-kit_n8n_data/_data/journal/ cree
- journal.json initial deploye
- Caddy reload OK valide (config valide)
- Workflow JSON copie sur VPS /tmp/n8n-workflow-journal-aggregate.json (import manuel UI)

Checkpoint Jules requis :
- Ajout DNS A 'data' -> 178.104.106.195 (OVH)
- Decommenter bloc Caddy + reload
- Import workflow n8n via UI (creds basic auth deprecies, login email user)
- Run manuel + activation cron

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 01:13:51 +02:00
Jules Neny
71053ec9a6 feat: PC5 col D embeds Insta via Behold (avec fallback profil statique)
- InstaFeed.vue (Vue island) : consomme feeds.behold.so/{feedId}, skeleton loading, grid 2x3 thumbnails, fallback profil si placeholder ou erreur
- ColInsta.astro enrichi : 2 sections @aep.politique + @julesneny, hydratation client:visible (lazy)
- .env.example committe (PUBLIC_BEHOLD_AEP/JULESNENY vides) ; .env.local deja gitignore
- docs/BEHOLD-SETUP.md : procedure inscription + recup feed IDs + alternatives + note CSP PC8

Action Jules requise (async) : inscription Behold + connexion 2 comptes Insta + remplir .env.local.
2026-05-09 00:55:01 +02:00