SUPPORT TECHNIQUE
17 MAI 2026
VERSION 17.05.26-4
— Paramétrage & Points critiques

Coolify OVH
& Migration Supabase
sans catastrophe.

Tout ce qu'il faut activer sur le nouveau Coolify, et tout ce qui peut planter si tu oublies de le faire pendant la migration Supabase. Format QQOQCP, liens entre sections.

Partie 01 — Paramétrage Coolify OVH

Source Git — GitHub App Étape zéro

Sans ça, Coolify ne peut pas puller tes repos. À configurer avant tout déploiement d'application — avant même les Shared Variables.

Qui
Qui fait l'action ?
Toi, une seule fois au niveau Team. Ensuite chaque app hérite automatiquement de l'accès.
Quoi
C'est quoi concrètement ?
Une connexion OAuth entre Coolify et GitHub. Une GitHub App installée sur ton compte GitHub donne à Coolify l'accès à tous tes repos privés en une fois.
Où configurer ?
coolify.<ton-domaine> → Sources → Add New → GitHub App → suivre le flow OAuth. GitHub te redirige vers Coolify automatiquement à la fin.
Quand
À quel moment ?
En premier, avant tout le reste. Première action après l'installation Coolify et la configuration SSH du VPS bootstrap.
Comment
Comment ça marche ensuite ?
Quand tu crées une app dans Coolify, tu sélectionnes la GitHub App comme source, tu choisis le repo et la branche. Coolify installe automatiquement un webhook sur le repo GitHub.
Pourquoi
Pourquoi GitHub App et pas Deploy Key ?
Tu as 21+ microservices. Une GitHub App = accès à tous d'un coup. Une Deploy Key = une clé SSH à déposer manuellement sur chaque repo. Pas le même travail.

Ce que ça débloque : l'auto-deploy sur push

Une fois la GitHub App connectée, dans chaque app Coolify tu peux activer Auto Deploy. Le flux devient :

# Flux automatique après configuration
git push origin main
  → GitHub reçoit le push
  → GitHub envoie un webhook à Coolify (via le webhook_secret sécurisé)
  → Coolify pull le nouveau code
  → Coolify rebuild le container
  → Coolify redéploie
  → Notification Telegram "✅ bi.zoomali.io déployé"

Zéro intervention manuelle. Du push au déploiement en production en 2-3 minutes.

Paramètre à activer dans chaque app

ParamètreValeur recommandée
Auto Deploy App → General → Auto Deploy Activé sur la branche main
Watch branches App → General → Branch main uniquement en prod
Preview Deployments App → General → Preview Deployments À décider app par app — crée un sous-domaine par PR GitHub
Webhook secret Coolify génère automatiquement un webhook_secret par GitHub App et le configure côté GitHub. Ne pas modifier manuellement ce secret — il sert à vérifier que les webhooks viennent bien de GitHub et pas d'une source externe.
Bonne nouvelle pour la migration Tu peux connecter la même GitHub App sur le Coolify OVH et sur le Coolify Hostinger (si tu l'as). Tes repos GitHub ne changent pas — seule la destination du déploiement change quand tu bascules le DNS.

Shared Variables Priorité haute

Configurer avant le premier déploiement d'application. Tout le reste en dépend.

Qui
Qui fait l'action ?
Toi, dans l'interface Coolify OVH. Une seule fois.
Quoi
C'est quoi concrètement ?
Des variables d'environnement définies une fois au niveau Team, injectées automatiquement dans toutes les apps qui les référencent.
Où dans l'interface ?
coolify.<ton-domaine> → Team Settings → Shared Variables
Quand
À quel moment ?
Avant tout déploiement d'app. C'est la première chose à faire après l'installation Coolify.
Comment
Comment ça marche ?
Tu crées la variable au niveau Team. Dans chaque app, au lieu de coller la valeur, tu références la Shared Variable. Coolify l'injecte au démarrage du container.
Pourquoi
Pourquoi c'est important ?
Quand Supabase change d'IP, tu modifies une ligne au lieu de mettre à jour 21 apps manuellement.

Variables à créer au niveau Team

Variable Description Sensibilité
SUPABASE_URL URL publique de l'instance Supabase OVH Normale
SUPABASE_ANON_KEY Clé publique Supabase (côté client) Normale
SUPABASE_SERVICE_ROLE_KEY Clé service Supabase (accès total) Haute — ne jamais exposer côté client
JWT_SECRET Secret de signature des tokens — voir point critique S-01 Critique — identique à Hostinger
BREVO_SMTP_HOST smtp-relay.brevo.com Normale
BREVO_SMTP_PORT 587 Normale
BREVO_API_KEY Clé API Brevo pour les envois transactionnels Moyenne
OPENAI_API_KEY Clé API OpenAI partagée entre apps Haute — facturation directe
TELEGRAM_BOT_TOKEN Si partagé entre apps (pas le bot de monitoring) Moyenne
Règle de décision Si une variable apparaît dans 2 apps ou plus → Shared Variable. Si elle est vraiment spécifique à une seule app (ex: un domaine, un feature flag) → reste au niveau app.

Notifications Telegram Priorité haute

Recevoir un message à chaque déploiement réussi ou raté, directement dans ta conversation Telegram.

Qui
Qui fait l'action ?
Toi, une seule fois dans l'interface Coolify.
Quoi
C'est quoi concrètement ?
Coolify envoie un message Telegram à chaque événement : déploiement OK, déploiement raté, container stoppé.
Où dans l'interface ?
coolify.<ton-domaine> → Team Settings → Notifications → Add Notification → Telegram
Quand
À quel moment ?
Juste après les Shared Variables. Avant le premier déploiement réel.
Comment
Quelle config ?
Bot Token : @zoomali_bot. Chat ID : ton ALLOWED_CHAT_ID. Événements : Deployment Success + Deployment Failed + Container Stopped.
Pourquoi
Pourquoi c'est important ?
Tu n'as plus à surveiller l'interface. Tu sais en temps réel si un déploiement a planté sans te connecter au VPS.
Bonus Le bot de monitoring que tu as déjà sur OVH (@zoomali_bot) peut recevoir les notifications Coolify dans le même chat. Une seule conversation pour tout surveiller.

Réseau privé Docker Priorité haute

Tes apps et Supabase sont sur le même VPS. Fais-les parler en interne, pas par Internet.

Qui
Qui fait l'action ?
Claude Code (configuration Docker) + toi (validation des variables d'env dans chaque app).
Quoi
C'est quoi concrètement ?
Les apps qui tournent sur le même serveur Coolify partagent un réseau Docker interne. Communication directe sans passer par DNS public.
Où configurer ?
Dans les variables d'env de chaque app, remplacer l'URL Supabase publique par l'adresse interne Docker.
Quand
À quel moment ?
Au moment du déploiement de Supabase sur OVH. Avant de migrer les apps.
Comment
Quelle config concrète ?
Toutes les apps Coolify d'un même serveur sont déjà sur le réseau coolify. Il suffit d'utiliser le nom du service comme hostname.
Pourquoi
Pourquoi c'est important ?
Plus rapide (pas de round-trip Internet). Plus sécurisé (pas exposé). Économise ta bande passante OVH.

Exemple concret

# Avant (passe par Internet)
SUPABASE_DB_URL=postgresql://postgres:password@db.zoomali.io:5432/postgres

# Après (réseau Docker interne — plus rapide, plus sûr)
SUPABASE_DB_URL=postgresql://postgres:password@supabase-db:5432/postgres
Attention L'URL interne ne fonctionne que pour les connexions container-à-container. L'URL publique reste nécessaire pour le client JavaScript côté navigateur (il ne peut pas accéder au réseau Docker).

Health Checks + Restart auto Priorité moyenne

Si un container plante, Coolify le redémarre seul et t'envoie une notification Telegram.

Qui
Qui fait l'action ?
Toi, dans chaque app Coolify. À faire au moment du déploiement de chaque service.
Quoi
C'est quoi concrètement ?
Un endpoint HTTP que Coolify appelle régulièrement. Si le container ne répond plus, Coolify redémarre automatiquement.
Où dans l'interface ?
Dans chaque app → Settings → Health Check. + Ajouter la route /health dans le code de chaque microservice.
Quand
À quel moment ?
Au déploiement de chaque app sur OVH. Pas besoin de tout faire d'un coup.
Comment
Quelle config recommandée ?
Endpoint : GET /health → retourne 200 OK. Interval : 30s. Timeout : 5s. Retries : 3 avant redémarrage.
Pourquoi
Pourquoi c'est important ?
Tes microservices se remettent seuls d'un crash. Tu es prévenu par Telegram. Tu n'as pas à surveiller en permanence.
Type d'appEndpointIntervalTimeout
Next.js / API RESTGET /api/health30s5s
n8nGET /healthz60s10s
Supabase APIGET /rest/v1/60s10s

Backups S3 — Cloudflare R2 Critique

Si le VPS meurt, tu perds au maximum 24h de données et tu reconstruis en quelques heures. Sans ça, tu perds tout.

Qui
Qui fait l'action ?
Toi : créer le bucket R2 chez Cloudflare + configurer dans Coolify. Ensuite automatique.
Quoi
C'est quoi concrètement ?
Coolify compresse et envoie tes volumes Docker vers un stockage objet distant selon un planning. Rétention configurable.
Où configurer ?
Étape 1 : Cloudflare Dashboard → R2 → Créer bucket multibrasservices-backups.
Étape 2 : Coolify → Team Settings → S3 Storages → Add.
Quand
À quel moment ?
Avant le cutover DNS de Supabase. Pas de migration de données de prod sans filet de sécurité.
Comment
Quelle config ?
Endpoint R2 : https://<account-id>.r2.cloudflarestorage.com. Region : auto. Fréquence : quotidien. Rétention : 30 jours.
Pourquoi
Pourquoi Cloudflare R2 ?
Gratuit jusqu'à 10 Go/mois. Ton volume estimé (~360 Mo/backup × 30j = ~10 Go) rentre dans la limite. Coût : 0€.

Volumes à sauvegarder

VolumeTaille estimée (après nettoyage)FréquenceRétention
PostgreSQL Supabase (dump)~150 Mo compresséQuotidien30 jours
Volume n8n (SQLite + workflows)~200 Mo compresséQuotidien30 jours
Config Coolify~10 MoHebdomadaire90 jours
# Config Coolify → S3 Storage
Endpoint  : https://<account-id>.r2.cloudflarestorage.com
Bucket    : multibrasservices-backups
Region    : auto
Access Key: → Cloudflare Dashboard → R2 → Manage API tokens
Secret Key: → idem

Rollback en un clic Natif

Coolify garde l'historique des déploiements. Retour arrière immédiat sans toucher à Git.

Qui
Qui fait l'action ?
Toi, depuis l'interface Coolify. En cas d'urgence uniquement.
Quoi
C'est quoi concrètement ?
Coolify conserve les images Docker de chaque déploiement passé. Tu peux relancer n'importe quelle version précédente en un clic.
Où dans l'interface ?
Dans chaque app → Deployments → choisir un déploiement passé → Redeploy.
Quand
À quel moment ?
Quand un déploiement casse quelque chose en prod. Avant un cutover DNS : vérifier que l'historique est disponible.
Comment
Bonne pratique ?
Avant chaque cutover DNS d'une app, ouvrir l'onglet Deployments et vérifier qu'il y a au moins un déploiement stable disponible en rollback.
Pourquoi
Pourquoi c'est important ?
La migration se fait app par app. Si l'une plante en prod, tu reviens en arrière en 30 secondes au lieu de debugger sous pression.

Restriction d'accès Selon les apps

Mettre une app en ligne visible sur Internet mais accessible uniquement à certains utilisateurs. Deux méthodes actives selon le contexte, une méthode avancée en réserve.

Pourquoi pas la restriction par IP ? L'IP de ton téléphone change constamment (4G, wifi maison, wifi café). Ton FAI peut aussi changer ton IP fixe. Tu passerais ton temps à mettre à jour la liste. Les méthodes ci-dessous sont bien plus robustes et ne dépendent d'aucun appareil spécifique.

Méthode A — Supabase Auth Méthode principale

Pour toutes les apps que tu développes toi-même. Tu as déjà l'infra — autant l'utiliser.

Qui
Qui est concerné ?
Toi seul pour les outils perso, ou tes utilisateurs pour les apps SaaS. Contrôle total depuis Supabase Dashboard → Auth → Users.
Quoi
C'est quoi concrètement ?
Une page de login qui appelle supabase.auth.signInWithPassword(). Si la session est valide → contenu affiché. Sinon → redirect vers le login.
Où configurer ?
Dans le code de l'app. Un middleware vérifie la session Supabase sur chaque route protégée. Zéro configuration côté Coolify ou serveur.
Quand
Cas d'usage ?
Ce guide HTML mis en ligne → login perso
bi.zoomali.io → accès équipe
saas.zoomali.io → accès clients
Tout outil Next.js/React que tu codes
Comment
Exemple concret ?
Page /login + middleware Next.js qui vérifie supabase.auth.getSession(). Si pas de session → redirect /login. Le navigateur mémorise la session.
Pourquoi
Pourquoi c'est le meilleur choix ?
Infra déjà en place. Ton compte Supabase existe. Tu te connectes avec ton email/password habituel. Fonctionne sur laptop et mobile sans rien installer.
// middleware.ts — Next.js
export async function middleware(request) {
  const { data: { session } } = await supabase.auth.getSession()
  if (!session) {
    return NextResponse.redirect(new URL('/login', request.url))
  }
}

Méthode B — Basic Auth via Caddy Services tiers

Pour les services que tu déploies mais dont tu ne contrôles pas le code. Pas de code, mais nécessite de hasher le mot de passe au terminal.

Correction v4 Il n'existe pas de bouton "Basic Auth" dans Settings. Deux chemins selon ta version de Coolify : toggle natif dans Configuration → General → HTTP Basic Authentication (ajouté en beta.434, avril 2025) ou, pour les déploiements Docker Compose, labels Caddy dans Configuration → Advanced → Labels. Dans les deux cas, le mot de passe doit être hashé en bcrypt — pas de texte clair.
Qui
Qui est concerné ?
Toi seul. Le login/password est défini dans Coolify et mémorisé par le navigateur sur chaque appareil.
Quoi
C'est quoi concrètement ?
Avant même que la page se charge, le navigateur affiche une fenêtre système login/password. C'est Caddy qui bloque, pas l'app. Rien à coder dans l'app.
Où configurer ?
Option 1 (UI native, beta.434+)
App → Configuration → General → HTTP Basic Authentication → activer + username + mot de passe hashé.

Option 2 (Docker Compose / toutes versions)
App → Configuration → Advanced → Labels → ajouter :
caddy_0.basicauth.0_MON_USER=$$2a$$14$$hash...
(les $ du hash bcrypt doivent être doublés en $$ dans compose)
Quand
Cas d'usage ?
n8n → interface d'admin workflows
Supabase Studio → interface BDD
Tout outil open source déployé sans auth intégrée
Coolify → sécurité supplémentaire si souhaité
Comment
L'expérience utilisateur ?
Fenêtre grise système du navigateur. Moche mais efficace. Le navigateur mémorise les credentials — tu ne le vois qu'une fois par appareil.
Pourquoi
Pourquoi pas pour les apps que tu codes ?
Pas de gestion de rôles, pas de sessions élégantes, pas de "Se souvenir de moi". Dès que tu maîtrises le code → Supabase Auth. Basic Auth = filet de sécurité rapide.

Générer le hash bcrypt (obligatoire)

Caddy refuse les mots de passe en clair. Commande à lancer une fois sur n'importe quelle machine où Caddy est installé (ou sur le VPS OVH) :

# Génère un hash bcrypt du mot de passe
caddy hash-password -p "ton_mot_de_passe"
# Sortie : $2a$14$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# → coller ce hash dans l'UI ou dans le label (en doublant les $ dans compose)
Piège docker-compose Dans un fichier docker-compose, le signe $ est un caractère spécial. Le hash $2a$14$abc... doit être écrit $$2a$$14$$abc... dans les labels — sinon Docker tronque la valeur et Caddy refuse l'auth.

Méthode C — Tailscale Option avancée — plus tard

À ne pas activer maintenant pour ne pas complexifier la stack. Documenté ici pour référence future.

Tailscale est un VPN mesh qui fait disparaître une app d'Internet complètement. Seuls les appareils connectés à ton réseau Tailscale peuvent y accéder. Gratuit jusqu'à 100 appareils.

Cas d'usage futurs uniquement N'utilise pas Tailscale pour n8n (besoin de webhooks entrants) ni pour Supabase (besoin d'accès client navigateur). Réservé à des outils d'admin que tu veux faire sortir d'Internet entièrement — si ce besoin émerge.

Récap — Quelle méthode pour quel service dans ta stack

ServiceMéthodeRaison
bi.zoomali.io, saas.zoomali.io Supabase Auth Apps que tu codes, gestion des rôles utilisateurs
Ce guide HTML et outils perso Supabase Auth Ton compte Supabase existant, visible mais privé
n8n Basic Auth Coolify Doit rester public pour les webhooks entrants
Supabase Studio Basic Auth Coolify Service tiers, API doit rester publique
Coolify Login natif Coolify Sécurité renforcée dans les versions récentes — suffisant
Tailscale Option future Ne pas activer maintenant — complexité inutile à ce stade
Partie 02 — Points critiques migration Supabase

JWT_SECRET Critique absolu

Si tu rates ça, tous tes utilisateurs connectés sont déconnectés de force au moment du cutover. Leurs sessions deviennent invalides.

Qui
Qui est concerné ?
Tous les utilisateurs avec une session active sur n'importe quelle app ZoomAli.io au moment du cutover.
Quoi
C'est quoi le problème ?
Le JWT_SECRET signe les tokens d'authentification. Si OVH a un secret différent de Hostinger, tous les tokens existants sont rejetés.
Où récupérer la valeur ?
Sur Hostinger : dans le fichier .env du déploiement Supabase, variable JWT_SECRET. Claude Hostinger peut la récupérer (sans la commiter).
Quand
À quel moment agir ?
Avant de déployer Supabase sur OVH. C'est la première valeur à récupérer côté Hostinger.
Comment
Comment faire correctement ?
Récupérer la valeur hors-repo (hors Git). L'injecter dans les Shared Variables Coolify OVH. Ne jamais générer une nouvelle valeur aléatoire.
Pourquoi
Pourquoi c'est si critique ?
24 utilisateurs en production. Tous déconnectés de force = mauvaise expérience + perte de confiance. Invisible jusqu'au cutover.

Règle absolue : Le JWT_SECRET OVH doit être identique octet pour octet au JWT_SECRET Hostinger.

Ne pas copier-coller via un fichier committé. Transmettre via une variable d'environnement directe ou un canal sécurisé hors Git.

Une fois défini dans les Shared Variables Coolify, ne plus jamais le modifier en prod sans plan de déconnexion maîtrisée.

GOTRUE_URI_ALLOW_LIST Priorité haute

Actuellement, seul saas.zoomali.io est autorisé comme redirect URI. Toutes tes autres apps échouent silencieusement à la redirection post-login.

Qui
Qui est impacté ?
Tout utilisateur qui tente de se connecter via une app autre que saas.zoomali.io.
Quoi
C'est quoi le problème ?
Supabase Auth refuse les redirections vers des URLs non listées dans GOTRUE_URI_ALLOW_LIST. L'utilisateur reste bloqué après login sans message d'erreur clair.
Où modifier ?
Hostinger (décision validée) : variable d'env du conteneur gotrue. OVH : dans les Shared Variables Coolify dès le déploiement Supabase.
Quand
À quel moment ?
Sur Hostinger : maintenant (décision déjà validée). Sur OVH : au déploiement Supabase, avant de migrer la première app.
Comment
Quelle valeur cible ?
Wildcard https://*.zoomali.io/** + https://*.zoomali.fr/** couvre tous les sous-domaines actuels et futurs.
Pourquoi
Pourquoi c'est urgent ?
C'est probablement un bug existant en prod aujourd'hui. Et sur OVH, si tu l'oublies, aucune app ne pourra authentifier ses utilisateurs.
# Valeur actuelle (trop restrictive)
GOTRUE_URI_ALLOW_LIST=https://saas.zoomali.io/**

# Valeur cible (couvre tout)
GOTRUE_URI_ALLOW_LIST=https://saas.zoomali.io/**,https://bi.zoomali.io/**,https://*.zoomali.io/**,https://*.zoomali.fr/**
Procédure sur Hostinger Redémarrer uniquement le conteneur gotrue, pas toute la stack Supabase. Tester le login sur saas.zoomali.io immédiatement après.

SERVICE_PASSWORD_VAULTENC — pgsodium Priorité haute

Le pendant du JWT_SECRET pour le chiffrement des données en base. Même logique : doit être identique entre Hostinger et OVH.

Qui
Qui est concerné ?
Toutes les données chiffrées via l'extension pgsodium dans PostgreSQL (Supabase Vault).
Quoi
C'est quoi le problème ?
Si la clé de chiffrement pgsodium diffère entre Hostinger et OVH, les données chiffrées importées depuis Hostinger sont illisibles sur OVH.
Où récupérer la valeur ?
Sur Hostinger : variable SERVICE_PASSWORD_VAULTENC dans le fichier .env Supabase. Même transmission hors-repo que JWT_SECRET.
Quand
À quel moment ?
En même temps que le JWT_SECRET — les deux se récupèrent en même temps avant le déploiement Supabase OVH.
Comment
Comment s'en assurer ?
Après le déploiement Supabase OVH, faire un test de lecture sur une donnée chiffrée importée. Si elle est lisible : OK. Si elle retourne une erreur de déchiffrement : clé incorrecte.
Pourquoi
Pourquoi c'est critique ?
Les données corrompues par une mauvaise clé sont silencieusement illisibles. Pas d'erreur visible côté app — juste des champs vides ou des valeurs incorrectes.
À récupérer en même temps que JWT_SECRET Ces deux variables voyagent ensemble. Crée une request dans vps-migration-bridge pour que Claude Hostinger les récupère simultanément et te les transmette hors-repo.

Préservation des UUID auth.users Priorité haute

Tes 24 utilisateurs ont des UUID qui servent de clé étrangère dans toutes tes tables métier. Changer ces UUID = casser toutes les relations de données.

Qui
Qui est impacté ?
Tous les 24 utilisateurs, et toutes les tables métier qui référencent leur UUID (ex: bi_users.auth_id, bi_invoices.user_id).
Quoi
C'est quoi le problème ?
Si on recrée les utilisateurs via l'interface Supabase, de nouveaux UUID sont générés. Toutes les foreign keys existantes pointent vers des utilisateurs fantômes.
Quelle table migrer ?
Tables dans l'ordre : auth.usersauth.identitiesauth.refresh_tokens. Puis les tables métier du schema public.
Quand
Dans quel ordre ?
Auth en premier, avant de migrer les tables métier. Les UUID doivent exister côté OVH avant d'importer les données qui les référencent.
Comment
Comment procéder ?
Export pg_dump des tables auth.* depuis Hostinger. Import via psql sur OVH avec --data-only. Les hashes bcrypt sont préservés → mots de passe inchangés.
Pourquoi
Pourquoi les bcrypt ?
Les mots de passe sont stockés en hash bcrypt. Si on les préserve, les utilisateurs se connectent avec leur mot de passe actuel sans rien remarquer.
Bonne nouvelle Tu n'as que 24 utilisateurs. Le dump/import de auth.* prend 2 minutes. Le risque est faible en volume, mais la procédure doit être respectée dans l'ordre.

Migration n8n SQLite Priorité haute

n8n ne stocke pas ses données dans PostgreSQL. C'est une base SQLite dans un volume Docker. La migration se fait différemment.

Qui
Qui est concerné ?
Tes 48 workflows (24 actifs), tes ~70 credentials, et l'historique d'exécution n8n.
Quoi
Quel est le piège ?
n8n utilise SQLite, pas PostgreSQL. Un pg_dump ne fonctionnera pas. La migration se fait par copie du volume Docker complet.
Quel fichier copier ?
Le volume Docker n8n sur Hostinger. Identifié par Claude Hostinger dans l'inventaire. Copie via scp ou rsync entre VPS.
Quand
À quel moment ?
Après nettoyage du binaryData (décision validée). Le conteneur n8n Hostinger doit être arrêté pendant la copie.
Comment
Procédure ?
1) Arrêter n8n Hostinger. 2) Copier le volume. 3) Démarrer n8n OVH avec ce volume. 4) Vérifier les workflows. 5) Arrêter n8n Hostinger définitivement.
Pourquoi
Pourquoi arrêter le conteneur ?
SQLite est un fichier. Si n8n écrit dessus pendant la copie, tu peux obtenir un fichier corrompu ou incomplet. L'arrêt est impératif.
Fenêtre d'indisponibilité n8n sera indisponible pendant la copie du volume. Prévoir cette fenêtre à un moment creux. Durée estimée : 15-30 minutes selon la taille résiduelle après nettoyage binaryData.

Re-enregistrement webhooks Telegram Priorité moyenne

Tes 4 bots Telegram configurés dans n8n sont en mode webhook. Après migration, ils pointent toujours vers l'ancienne URL n8n Hostinger.

Qui
Qui est impacté ?
Les 4 bots Telegram configurés dans n8n via des credentials. Tous leurs workflows qui reçoivent des messages s'arrêteront de répondre.
Quoi
Quel est le problème ?
Telegram envoie les messages à une URL webhook enregistrée. Cette URL contient le hostname n8n Hostinger. Elle doit pointer vers le nouveau hostname n8n OVH.
Où faire la mise à jour ?
Via l'API Telegram directement : setWebhook avec la nouvelle URL. Ou via les credentials n8n si le workflow le permet.
Quand
À quel moment ?
Juste après la migration n8n et la vérification que n8n OVH répond correctement. Avant de couper n8n Hostinger.
Comment
Commande concrète ?
curl -X POST "https://api.telegram.org/bot<TOKEN>/setWebhook" -d "url=https://n8n.zoomali.io/webhook/<id>" — à répéter pour chacun des 4 bots.
Pourquoi
Pourquoi ce n'est pas automatique ?
Telegram ne sait pas que tu as déménagé. Il continue d'envoyer au webhook enregistré, indéfiniment, jusqu'à ce que tu le mettes à jour manuellement.

OAuth Google / Microsoft Priorité moyenne

Si tes apps permettent la connexion via Google ou Microsoft, les redirect URIs OAuth doivent inclure les nouveaux domaines OVH.

Qui
Qui est impacté ?
Tout utilisateur qui utilise "Se connecter avec Google" ou "Se connecter avec Microsoft" dans tes apps.
Quoi
Quel est le problème ?
Google et Microsoft ont une liste blanche des URLs autorisées après login OAuth. Si le nouveau domaine n'est pas dans la liste, la connexion échoue avec une erreur redirect_uri_mismatch.
Où faire la mise à jour ?
Google : console.cloud.google.com → Credentials → OAuth 2.0 → Authorized redirect URIs.
Microsoft : portal.azure.com → App registrations → Redirect URIs.
Quand
À quel moment ?
Avant le cutover DNS de chaque app concernée. Ajouter les nouvelles URLs sans supprimer les anciennes pendant la transition.
Comment
Procédure ?
Ajouter les nouvelles URLs OVH dans les consoles Google/Microsoft. Garder les URLs Hostinger actives pendant toute la période de transition. Supprimer les anciennes seulement après décommissionnement Hostinger.
Pourquoi
Pourquoi avant le cutover ?
La propagation DNS peut prendre quelques minutes. Pendant ce temps, certains utilisateurs arrivent sur l'ancien serveur, d'autres sur le nouveau. Les deux doivent fonctionner simultanément.
Synthèse — Ordre de migration recommandé

Dans quel ordre faire quoi

Un ordre qui garantit qu'à chaque étape, tu peux reculer sans dommages.

  1. Configurer Coolify OVH — Shared Variables + Notifications Avant tout déploiement. Récupérer JWT_SECRET et SERVICE_PASSWORD_VAULTENC depuis Hostinger hors-repo. → C-01 / C-02 / S-01 / S-03
  2. Configurer les Backups S3 — Cloudflare R2 Avant de migrer la moindre donnée en prod. → C-05
  3. Corriger GOTRUE_URI_ALLOW_LIST sur Hostinger Décision déjà validée. Claude Hostinger peut agir maintenant. → S-02
  4. Nettoyer binaryData n8n sur Hostinger Décision déjà validée. Réduit le volume de transfert de 3 Go à ~500 Mo. → S-05
  5. Déployer Supabase sur OVH via Coolify Avec les bonnes valeurs : JWT_SECRET identique, GOTRUE_URI_ALLOW_LIST élargi, réseau privé configuré. → C-03 / S-02
  6. Migrer auth.users → puis tables métier Dans l'ordre. UUID préservés. Hashes bcrypt préservés. → S-04
  7. Valider Supabase OVH sur zoomali.fr (staging) Tester login, RLS, lecture/écriture avant de toucher à zoomali.io.
  8. Migrer n8n — arrêt Hostinger + copie volume + démarrage OVH Puis re-enregistrer les 4 webhooks Telegram. → S-05 / S-06
  9. Migrer les apps une par une — cutover DNS progressif Pour chaque app : ajouter redirect URI OAuth si besoin → déployer OVH → tester → baisser TTL → couper DNS. → S-07 / C-06
  10. Décommissionner Hostinger Seulement quand 0 trafic depuis plusieurs jours et tous les backups S3 confirmés.
Le principe directeur Un changement à la fois. Si quelque chose casse, tu sais immédiatement laquelle des étapes est en cause — et tu peux reculer sans impacter le reste.