Plateforme d'automatisation. Elle sert notamment à envoyer une notification Telegram quand un conteneur est mis à jour.
Architecture
| Conteneur | Rôle |
|---|---|
| n8n | Application |
| n8n-postgres | Base PostgreSQL 15 |
n8n est sur deux réseaux : proxy (SWAG et docker-socket-proxy) et n8n_net (sa base, isolée).
Variables d'environnement
| Variable | Rôle |
|---|---|
| N8N_HOST | Nom de domaine d'accès |
| N8N_EDITOR_BASE_URL, WEBHOOK_URL | URL publique complète, en https |
| N8N_ENCRYPTION_KEY | Clé de chiffrement des identifiants enregistrés |
| POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB | Accès à la base |
| GENERIC_TIMEZONE | Fuseau horaire des déclencheurs planifiés |
Stack
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
depends_on:
- postgres
environment:
N8N_HOST: ${N8N_HOST}
N8N_PROTOCOL: https
N8N_PORT: 5678
N8N_EDITOR_BASE_URL: ${N8N_EDITOR_BASE_URL}
WEBHOOK_URL: ${WEBHOOK_URL}
N8N_EXPRESS_TRUST_PROXY: "true"
N8N_CORS_ALLOW_ORIGIN: <URL_N8N>
N8N_PROXY_HOPS: 1
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_SECURE_COOKIE: "true"
N8N_DIAGNOSTICS_ENABLED: "false"
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
volumes:
- <APPDATA>/n8n:/home/node/.n8n
networks:
- proxy
- n8n_net
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/ > /dev/null || exit 1"]
interval: 30s
timeout: 5s
retries: 10
start_period: 20s
postgres:
image: postgres:15-alpine
container_name: n8n-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- <APPDATA>/n8n-db:/var/lib/postgresql/data
networks:
- n8n_net
networks:
proxy:
external: true
name: proxy
n8n_net:
driver: bridge
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
depends_on:
- postgres
environment:
N8N_HOST: ${N8N_HOST}
N8N_PROTOCOL: https
N8N_PORT: 5678
N8N_EDITOR_BASE_URL: ${N8N_EDITOR_BASE_URL}
WEBHOOK_URL: ${WEBHOOK_URL}
N8N_EXPRESS_TRUST_PROXY: "true"
N8N_CORS_ALLOW_ORIGIN: <URL_N8N>
N8N_PROXY_HOPS: 1
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_SECURE_COOKIE: "true"
N8N_DIAGNOSTICS_ENABLED: "false"
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
volumes:
- <APPDATA>/n8n:/home/node/.n8n
networks:
- proxy
- n8n_net
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/ > /dev/null || exit 1"]
interval: 30s
timeout: 5s
retries: 10
start_period: 20s
postgres:
image: postgres:15-alpine
container_name: n8n-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- <APPDATA>/n8n-db:/var/lib/postgresql/data
networks:
- n8n_net
networks:
proxy:
external: true
name: proxy
n8n_net:
driver: bridge
- N8N_PROXY_HOPS: 1 : seul SWAG est un intermédiaire. Authelia ne compte pas, il valide les requêtes sans les relayer. Passer à 2 si un proxy Cloudflare est ajouté devant.
- N8N_EXPRESS_TRUST_PROXY et N8N_SECURE_COOKIE sont nécessaires derrière SWAG en https.
Workflow : notification des mises à jour Docker
Toutes les 10 minutes, le workflow :
- lit la liste des conteneurs, arrêtés compris, via l'API de docker-socket-proxy (http://dockersocket:2375/containers/json?all=1) ;
- compare l'image et la date de création de chaque conteneur avec l'état relevé au passage précédent, conservé dans les données statiques du workflow ;
- envoie un message Telegram listant les conteneurs mis à jour, recréés ou nouveaux.
Au premier lancement, il enregistre l'état sans rien envoyer. Un déclencheur manuel permet de réinitialiser cet état.
Prérequis :
- docker-socket-proxy sur le réseau proxy, avec la lecture des conteneurs autorisée (CONTAINERS=1) ;
- le jeton du bot Telegram enregistré comme identifiant dans n8n, jamais écrit en clair dans une URL de nœud.
Sauvegarde
Dump SQL de n8n-postgres et dossier <APPDATA>/n8n par le script de Sauvegarde.