Background image: Matthieu's World Background image: Matthieu's World
Social Icons

Fix OAuth Google 400 sur n8n + Coolify (fev. 2026)

3 min de lecture
Par Matthieu Cousin

Table des matières

Mon OAuth Google marchait très bien sur n8n, hébergé sur le Coolify que je monte dans le guide VPS. Et un jour, en voulant connecter un nouveau credential YouTube : Erreur 400 invalid_request. Aucune explication claire de Google.

Ce fix date de février 2026, sur n8n v2. Coolify a corrigé son template principal depuis, mais pas celui avec PostgreSQL : la fin de l'article dit où on en est et ce qui reste à faire selon le template que tu as pris.

Le symptôme

Quand tu cliques "Sign in with Google" dans n8n, Google te bloque avec :

"You can't sign in to this app because it doesn't comply with Google's OAuth 2.0 policy"

Le détail qui tue, c'est dans l'URL d'erreur :

redirect_uri=n8n.example.com/rest/oauth2-credential/callback

Il manque https://. Google compare avec l'URI configurée dans ta Cloud Console (https://n8n.example.com/...), ça matche pas, il rejette.

La cause

Le template Coolify par défaut pour n8n inverse deux variables dans le docker-compose :

# Le template bugué
- 'N8N_EDITOR_BASE_URL=${SERVICE_FQDN_N8N}'  # FQDN = sans https
- 'WEBHOOK_URL=${SERVICE_FQDN_N8N}'           # pareil
- 'N8N_HOST=${SERVICE_URL_N8N}'               # URL = avec https (mauvais ici)

SERVICE_FQDN = juste le hostname. SERVICE_URL = avec le protocole. Le template les utilise à l'envers.

Ça marchait avant parce que les anciennes versions de n8n toléraient une URL sans protocole. Depuis la v2, le parsing est plus strict.

Le piège

La variable editee dans l interface Coolify est ignoree, celle du docker-compose arrive dans le conteneur.
Le piège qui m'a coûté le plus de temps, et il ne concerne pas que n8n.

J'ai d'abord modifié les variables d'environnement dans l'interface Coolify. Redeploy. Rien. Le printenv dans le container montrait toujours les anciennes valeurs.

Le docker-compose écrase les variables de l'interface. C'est là qu'il faut modifier.

C'est un cas particulier d'une cause plus générale, celle que je mets en tête de ma liste dans ce qui marche en dev mais pas en prod : les variables d'environnement qui ne valent pas ce que tu crois.

Le fix

Dans Coolify, va dans le docker-compose de ton service n8n. Remplace ces 3 lignes :

# Avant
- 'N8N_EDITOR_BASE_URL=${SERVICE_FQDN_N8N}'
- 'WEBHOOK_URL=${SERVICE_FQDN_N8N}'
- 'N8N_HOST=${SERVICE_URL_N8N}'

# Après
- 'N8N_EDITOR_BASE_URL=${SERVICE_URL_N8N}'
- 'WEBHOOK_URL=${SERVICE_URL_N8N}'
- 'N8N_HOST=${SERVICE_FQDN_N8N}'

Ensuite :

  1. Redeploy depuis Coolify
  2. Vérifie avec printenv | grep N8N_EDITOR que la valeur commence par https://
  3. Supprime le credential Google/YouTube dans n8n et recrée-le, car n8n verrouille l'URL OAuth à la création

À garder en tête

En modifiant le docker-compose, tu t'écartes du template officiel Coolify. Le jour où Coolify corrige ce bug dans son template, tes modifs manuelles seront toujours là. Si un jour quelque chose casse après une MAJ, la méthode simple : installe une instance n8n vierge via Coolify, compare son docker-compose avec le tien, et réaligne. Ta base Postgres et tes données ne sont pas touchées par le docker-compose, c'est juste de la config.

Mise à jour : Coolify a corrigé, mais pas partout

Depuis, le template a bougé. Le n8n.yaml officiel de Coolify est aujourd'hui exactement dans l'état que je décrivais comme correct :

- 'N8N_EDITOR_BASE_URL=${SERVICE_URL_N8N}'
- 'WEBHOOK_URL=${SERVICE_URL_N8N}'
- 'N8N_HOST=${SERVICE_FQDN_N8N}'

Si tu déploies n8n via ce template aujourd'hui, tu n'as rien à faire. Le bug est mort.

Sauf que Coolify propose deux templates n8n. Et le second, n8n-with-postgresql, celui que tu prends si tu veux ta base Postgres dédiée, garde encore N8N_HOST=${SERVICE_URL_N8N}. Donc le protocole en trop, donc la même erreur 400 au bout du chemin.

Le fix décrit plus haut reste valable pour ce template-là. Une ligne à changer au lieu de trois.

Si tu appliques ce fix sur le template simple, tu te retrouves dans le cas que j'évoquais juste au-dessus : des modifications manuelles qui restent en place alors que l'upstream est déjà corrigé. Rien ne casse, les valeurs sont identiques. Mais c'est exactement le moment de comparer avec une instance vierge et de réaligner.

Besoin d’un coup de main pour cette partie technique ?

Je sais que parfois, même bien expliqué, un workflow reste intimidant.
Si tu préfères qu’on le mette en place ensemble, contacte-moi : je suis freelance en automatisation, et je peux t’aider à passer de “je devrais le faire” à “c’est déjà en place”.

Sinon, continue de piocher dans les ressources du site, elles sont faites pour ça ✌️

Commentaires