Orchestrateur Qwen
Faire tourner MyCleanHub en solo sans cramer 80% de mes journées sur l'admin, le support, le social et le reporting. Budget OpenAI = zéro.
VPS Hetzner CCX23 (8 vCPU / 32 Go) + Qwen3:8b en local + 48 Edge Functions + 20 pg_cron + 4 agents IA stratégiques + dashboard live auto-update 15 min.
20 pg_cron + 9 crons VPS actifs 24/7, 1 376 prospects scrapés, 94 cold mails envoyés, 38 bookings/sem, ~6h/sem économisées, 0€ coût marginal IA.
Le contexte
Faire tourner MyCleanHub en solo sans cramer 80% de mes journées sur de l'admin, du support, du social, du reporting. La réponse : un VPS qui tourne un LLM en local, qui orchestre tout ce qui peut être automatisé, et qui a des agents IA qui analysent en continu ce qui se passe pour me dire quoi faire.
L'infra
- VPS Hetzner CCX23 — 8 vCPU dédiés, 32 GB RAM (1.7 GB utilisés actuellement, 28 GB libres), IP fixe, 600 Mbps
- Ollama + Qwen3:8b comme moteur LLM principal (5,2 GB Q4_K_M, suffisant pour les tâches structurées en mode
/no_think+format=json) - Supabase : 48 Edge Functions actives + 20 pg_cron jobs côté base + 60+ tables PostgreSQL
- Crons Linux VPS pour les scrapers et agents IA (9 crons actifs)
- Redis pour les queues et rate-limiting
- Tesseract / Whisper / Playwright / FFmpeg dispos à la demande
- n8n pour les workflows visuels d'automation
- Umami pour les analytics web
Le cerveau : 4 agents IA qui tournent 24/7
Stack ajoutée pour que le système m'envoie des recommandations stratégiques sans que je demande :
| Agent | Fréquence | Mission | |---|---|---| | strategist | toutes les 2h | 3 insights par run (acquisition / monétisation / opérations) | | competitor_watcher | toutes les 6h | diff prix concurrents (Wecasa, Helpling, Yoojo, Ouihelp) | | site_analyzer | toutes les 12h | audit copy/UX/CTA des pages clés (/fondateur, /inscription-pro) | | recommender | toutes les 4h | méta-agent qui synthétise les autres → 1 action prio du jour |
Chaque agent fait 1 à 3 calls à Qwen3:8b en mode /api/generate + format=json (skip thinking sur CPU → ~25-90 s par call). Les insights sont stockés dans mch_agent_insights (Postgres) avec priority 1-3, evidence JSONB, action exécutable. Dedup auto si insight similaire récent.
Dashboard interne — pilotage live
J'ai construit un tableau de bord interne (accès Basic Auth, perso) qui auto-update toutes les 15 min avec 7 onglets de pilotage, 8 sections data :
- 🤖 Insights IA — derniers insights des 4 agents, boutons ✓ dismiss
- 🎛️ Centre de commande — 11 boutons pour trigger :
scrape PJ par dept,Google Maps IDF,email finder,competitor scrape,cold-send-now,auto-validate,score-now,promote-raw,agent-run,rebuild dashboard - 🏥 Health Score — composite 0-100 sur 6 dimensions (tracking, multi-touch, freshness, conversion, reviews, crons)
- 🔮 Forecast 7j — projection users/pros/bookings via régression sur 14j
- ❤️ Cron health — dernière activité de chaque job + statut OK/stale
- 💰 Revenue — CA total complété, ticket moyen, top pros
- ⭐ Reviews — distribution + radar 4 axes (ponctualité / propreté / communication / valeur)
- 🎯 Cohortes signups — taux d'activation par semaine ISO
Workflows automatisés
Cold outreach (Gmail SMTP)
Pipeline complète :
- Scrapers VPS (3x/sem) : Pages Jaunes par dept IDF, Google Maps Places (dim 5h), enrichissement Pappers, email finder fast mode (MX + contact@ → 89 % de taux récup)
- Validation auto (xx:40, pg_cron) : règles email pro + ville IDF + source whitelist → débloque les prospects en
to_validate - Scoring heuristique (xx:50, pg_cron) : note 0-10 par prospect (ville premium IDF +3, email pro +2, phone +2, etc.)
- send-cold-email (toutes les 10 min) : tire le prospect score le plus élevé, multi-touch J+7 / J+14, 3 subject variants par touch, UTM auto-tag, qwen-personalized opening, daily cap warm-up 15→30→50
- Tracking : pixel d'ouverture + redirect clic via Edge Functions Supabase
SMS Tracker
Page interne pour le tracking SMS des prospects, persistance cross-device via Supabase :
- Table
sms_tracker_events(append-only, RLS) - Edge function
sms-tracker-eventavec shared secret - Hook JS qui POST chaque clic de statut (todo/sent/yes/callback/signed/no/dead)
- Vue
sms_tracker_latest(DISTINCT ON dernier statut par prospect)
Briefing matinal (8h chaque jour)
Cron déclenche un script qui agrège les KPIs des dernières 24h → push à Qwen → mail récap + Telegram.
Posts FB groupes (7h15 + 19h45)
Cron send-fb-posts-telegram tire 3 angles sur 9 templates rotatifs, insère le compteur fondateurs live, m'envoie les posts prêts à copier dans Telegram.
Posts Instagram auto (cron 5h)
Pipeline pubgen → queue JSON → cron 5min → worker → Cloudinary → Graph API.
Relances inactifs (9h chaque jour)
Détecte pros sans dispo 7+ j, clients sans booking 14+ j, leads froids → drafte un mail personnalisé Qwen → envoie ou drafts.
Cancel rate monitor (8h UTC daily)
Surveille le taux d'annulation 7j glissants. Si > 20 % → insight auto inséré dans mch_agent_insights avec priorité 1.
Auto contact reply (toutes les 10 min)
Cron mch-qwen-contact-reply-draft drafte les réponses aux contact_messages non-traités via qwen-contact-reply.
Stats actuelles
- 20 pg_cron jobs actifs sur Supabase + 9 crons VPS côté Hetzner
- 1 376 prospects en base, 983 prêts à envoyer, dont 114 score 9/10
- 94 cold mails envoyés, multi-touch J+7/J+14 actif
- 304 messages outbound total cross-canaux (cold mail · DM in-app · relances · Insta DM)
- 78 bookings dont 33 completed, CA 2 196 €, ticket moyen 66 €, note moyenne 4,77 / 5
- 22 pros actifs, 63 users, +38 bookings sur 7 jours (croissance forte)
- ~6h/semaine économisées sur l'admin et le social
Ce que j'aime de cette stack
Tout est rejouable et auditable. Les Edge Functions logguent dans Supabase. Les crons Linux dans /var/log/. Les agents IA insèrent leur raisonnement (evidence JSONB) dans la DB. Si une auto m'envoie un mail bizarre, je peux retracer la décision Qwen via le prompt + la réponse.
Et surtout : le VPS est le mien. Pas de quota OpenAI, pas de coupure surprise quand un provider change ses prix. Coût marginal d'une décision IA = ~0 €.
Le bon enseignement
Qwen3:8b en CPU sur /api/chat rentre en mode "thinking" qui mange tous les num_predict tokens et renvoie du vide. Bascule sur /api/generate + format=json + /no_think keyword → JSON propre en 25-90 s. Indispensable à savoir pour faire tenir un agent IA sur CPU.