Auto-hébergement de Windmill sur Ubuntu : tutoriel complet de configuration Docker avec résolution des problèmes PostgreSQL
Les plateformes d’automatisation des flux de travail sont essentielles pour les équipes de développement modernes, mais les solutions cloud comme Windmill Cloud peuvent devenir coûteuses à mesure que l’utilisation augmente. Nous vous montrons comment configurer votre propre instance Windmill sur Ubuntu avec Docker Compose et l’intégration Traefik, en surmontant les problèmes critiques d’authentification PostgreSQL qui peuvent faire échouer votre installation.
Ce que vous allez construire
À la fin de ce tutoriel, vous disposerez de :
- Une installation Windmill entièrement fonctionnelle avec HTTPS
- Certificats SSL automatiques délivrés par Let’s Encrypt via Traefik
- Base de données PostgreSQL prête pour la production avec authentification correctement configurée
- Configuration des workers optimisée pour l’utilisation des ressources
- Intégration à l’infrastructure Docker existante
- Configuration prête pour la production pour l’automatisation professionnelle des flux de travail
Coût mensuel : à partir de 5,99 € HT, avec une adresse IPv4 principale incluse (Hetzner CX23, 4 Go de RAM, en octobre 2026) + frais de domaine – la même infrastructure peut gérer plusieurs outils d’automatisation
Prérequis
- Serveur Ubuntu 24.04 LTS avec Docker et Docker Compose installés
- Configuration existante du proxy inverse Traefik (voir notre guide de configuration n8n pour la configuration Traefik)
- Nom de domaine pointant vers l’IP de votre serveur
- Au moins 4 Go de RAM et 2 vCPU recommandés
- Accès SSH et connaissances de base en ligne de commande
Comprendre Windmill
Windmill est un moteur de flux de travail open source qui fournit :
- Éditeur visuel de flux de travail prenant en charge TypeScript/Python/Go
- Planification de tâches et gestion de l’exécution
- Fonctionnalités d’intégration d’API
- Fonctionnalités de collaboration en équipe
- Auto-hébergeable, avec des exécutions illimitées dans la Community Edition gratuite
Contrairement à l’approche par nœuds de n8n, Windmill se concentre sur les flux de travail conçus autour du code avec un puissant environnement de développement.
Étape 1 : préparation du serveur et structure des répertoires
Tout d’abord, préparons notre environnement serveur. Nous utiliserons une convention de nommage basée sur la nourriture pour les instances Windmill afin d’éviter les conflits :
# Create Windmill directory (first instance: "pizza")
mkdir -p /opt/windmill-pizza
cd /opt/windmill-pizza
# Create required subdirectories
mkdir -p postgres-data windmill-data lsp-cache
# Verify directory structure
ls -la
Convention de nommage : Utilisez des noms de plats simples pour les différentes instances Windmill :
- Première instance :
pizza - Instances supplémentaires :
pasta,salad,soup,burger, etc. - Cela évite les conflits et facilite la gestion
Étape 2 : configuration de l’environnement
Créez un fichier d’environnement sécurisé avec des identifiants adéquats :
# Generate a secure hex password (no special characters!)
SECURE_PASSWORD=$(openssl rand -hex 16)
echo "Generated password: $SECURE_PASSWORD"
# Create environment file
cat > /opt/windmill-pizza/.env << EOF
# Windmill Image Version
WM_IMAGE=ghcr.io/windmill-labs/windmill:main
# Database Configuration - SECURE PASSWORDS
DATABASE_URL=postgresql://postgres:${SECURE_PASSWORD}@windmill-pizza-db:5432/windmill_pizza?sslmode=disable
POSTGRES_PASSWORD=${SECURE_PASSWORD}
POSTGRES_DB=windmill_pizza
POSTGRES_USER=postgres
# Windmill Configuration
BASE_URL=https://windmill.yourdomain.com
RUST_LOG=info
# Worker Configuration
WORKER_GROUP=default
KEEP_JOB_DIR=false
# Instance Identifier
INSTANCE_NAME=pizza
EOF
chmod 600 /opt/windmill-pizza/.env
Critique : Remplacez windmill.yourdomain.com par votre domaine réel !
Étape 3 : configuration Docker Compose
Créez la configuration Docker Compose principale :
cat > /opt/windmill-pizza/docker-compose.yml << 'EOF'
version: "3.8"
services:
# PostgreSQL Database for Windmill
windmill-db:
image: postgres:16
container_name: windmill-pizza-db
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
- proxy
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
# Windmill Server
windmill-server:
image: ${WM_IMAGE}
container_name: windmill-pizza-server
restart: unless-stopped
environment:
- DATABASE_URL=${DATABASE_URL}
- BASE_URL=${BASE_URL}
- RUST_LOG=${RUST_LOG}
- MODE=server
networks:
- proxy
depends_on:
windmill-db:
condition: service_healthy
volumes:
- ./windmill-data:/tmp/windmill
labels:
- "traefik.enable=true"
- "traefik.http.routers.windmill-pizza.rule=Host(`windmill.yourdomain.com`)"
- "traefik.http.routers.windmill-pizza.entrypoints=https"
- "traefik.http.routers.windmill-pizza.tls.certresolver=letsencrypt"
- "traefik.http.services.windmill-pizza.loadbalancer.server.port=8000"
# Windmill Worker
windmill-worker:
image: ${WM_IMAGE}
container_name: windmill-pizza-worker
restart: unless-stopped
environment:
- DATABASE_URL=${DATABASE_URL}
- BASE_URL=${BASE_URL}
- RUST_LOG=${RUST_LOG}
- MODE=worker
- WORKER_GROUP=${WORKER_GROUP}
- KEEP_JOB_DIR=${KEEP_JOB_DIR}
networks:
- proxy
depends_on:
windmill-db:
condition: service_healthy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./windmill-data:/tmp/windmill
- worker_dependency_cache:/tmp/windmill/cache
deploy:
resources:
limits:
cpus: '1'
memory: 2G
networks:
proxy:
external: true
volumes:
worker_dependency_cache:
driver: local
EOF
Important : Mettez à jour le domaine dans les labels Traefik pour correspondre à votre configuration !
Étape 4 : le problème des mots de passe PostgreSQL (problème critique)
C’est ici que la plupart des installations Windmill échouent, et il a fallu un important travail de diagnostic pour en identifier la cause :
Le problème : les caractères spéciaux dans les mots de passe
Lors de l’utilisation de openssl rand -base64 32 pour générer des mots de passe, la sortie peut contenir +, / et =. Dans DATABASE_URL, ces caractères doivent être encodés en pourcentage ; sans cet encodage, ils peuvent perturber l’analyse de l’URL et se manifester par des échecs d’authentification PostgreSQL. Les mots de passe hexadécimaux évitent entièrement cette étape d’encodage.
Exemple de mot de passe problématique :
# This WILL cause authentication failures:
PASSWORD="305t6m9KrC/kvbyNEF+EYQ6pqAGlApn9rbJPH3D5y9g="
La solution : des mots de passe hexadécimaux uniquement
Utilisez des mots de passe hexadécimaux qui ne contiennent aucun caractère spécial :
# This WORKS reliably:
PASSWORD=$(openssl rand -hex 16)
# Example result: 5781b14ec0ec1bc184653ffa5e379411
Problèmes de configuration PostgreSQL supplémentaires
- Configuration utilisateur : Utilisez le superutilisateur
postgres, comme dans l’exemple de configuration de Windmill. Un utilisateur personnalisé ne fonctionne qu’après avoir reçu les rôleswindmill_adminetwindmill_userrequis par les migrations de Windmill (voir la documentation d’auto-hébergement de Windmill) - Persistance des volumes : PostgreSQL ignore les variables d’environnement
POSTGRES_PASSWORDlorsque les volumes de données existants contiennent des identifiants différents - Format d’URL : Incluez
?sslmode=disabledans l’URL de la base de données lorsque celle-ci n’est accessible que sur le réseau Docker interne, comme dans l’exemple de configuration de Windmill ; utilisez un mode SSL tel querequirepour les bases de données accessibles via d’autres réseaux
Étape 5 : installation et démarrage
Installons maintenant Windmill avec notre configuration corrigée :
cd /opt/windmill-pizza
# Verify configuration syntax
docker compose config --quiet
# Pull images
docker compose pull
# Start services
docker compose up -d
# Check status
docker compose ps
Vous devriez voir une sortie comme :
NAME STATUS PORTS
windmill-pizza-db Up (healthy) 5432/tcp
windmill-pizza-server Up 8000/tcp
windmill-pizza-worker Up 8000/tcp
Étape 6 : résolution des problèmes courants
Problème 1 : échecs d’authentification PostgreSQL
Symptômes :
windmill-pizza-server | Error: password authentication failed for user "postgres"
Solution : Cette opération supprime toutes les données de la base de données Windmill. Ne l’utilisez que sur une nouvelle installation ou après une sauvegarde vérifiée. Les deux commandes sed écrivent le nouveau mot de passe dans POSTGRES_PASSWORD et DATABASE_URL.
# Stop containers
docker compose down --volumes
# Remove old data
rm -rf postgres-data/*
# Regenerate hex password
NEW_PASSWORD=$(openssl rand -hex 16)
sed -i "s/POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$NEW_PASSWORD/" .env
sed -i "s#postgresql://postgres:[^@]*@#postgresql://postgres:$NEW_PASSWORD@#" .env
# Restart
docker compose up -d
Problème 2 : le conteneur ne démarre pas
Symptômes :
- Le conteneur s’arrête immédiatement
- Erreurs d’allocation de ressources
Solution :
# Check container logs
docker logs windmill-pizza-server
docker logs windmill-pizza-db
# Check system resources
docker stats
free -h
Problème 3 : problèmes de certificat SSL
Symptômes :
- HTTPS ne fonctionne pas
- Erreurs de certificat
Solution :
# Check Traefik logs
docker logs traefik
# Verify DNS resolution
nslookup windmill.yourdomain.com
# Restart Traefik if needed
docker restart traefik
Étape 7 : accès et configuration initiale
Une fois l’installation terminée :
- Accédez à Windmill : https://windmill.yourdomain.com
- Identifiants par défaut :
- E-mail :
[email protected] - Mot de passe :
changeme
- E-mail :
- Terminez la configuration :
- Changez le mot de passe de l’administrateur
- Configurez l’URL de base
- Créez les comptes utilisateurs
Étape 8 : optimisation des ressources
Allocation de mémoire (pour un serveur de 8 Go)
Notre configuration alloue les ressources efficacement :
- Serveur Windmill : ~800 Mo
- Worker Windmill : 2 Go (limité)
- PostgreSQL : ~500 Mo
- Réserve système : ~4,7 Go
Allocation de CPU (pour un serveur de 4 vCPU)
- Worker : 1 vCPU (limité)
- Autres services : 3 vCPU (partagés)
Règle de dimensionnement : 1 worker par vCPU avec 1-2 Go de RAM chacun
Étape 9 : renforcement pour la production
Créer un script de sauvegarde
cat > /opt/windmill-pizza/backup.sh << 'EOF'
#!/bin/bash
set -euo pipefail
cd /opt/windmill-pizza
DATE=$(date +%Y%m%d_%H%M%S)
FILE=/opt/backups/windmill_pizza_${DATE}.sql
mkdir -p /opt/backups
if ! docker compose exec -T windmill-db pg_dump -U postgres windmill_pizza > "$FILE"; then
rm -f "$FILE"
echo "Backup failed" >&2
exit 1
fi
echo "Backup created: $FILE"
EOF
chmod +x /opt/windmill-pizza/backup.sh
Configurer la supervision
# Monitor container health
docker compose ps
# Check resource usage
docker stats
# Monitor logs
docker compose logs -f windmill-server
Configurer les mises à jour automatisées
cat > /opt/windmill-pizza/update.sh << 'EOF'
#!/bin/bash
cd /opt/windmill-pizza
docker compose pull
docker compose up -d --force-recreate
EOF
chmod +x /opt/windmill-pizza/update.sh
Étape 10 : configuration avancée
Intégration avec un serveur SMTP existant
Si vous avez un serveur de messagerie (comme dans notre configuration n8n), intégrez-le :
# Add to docker-compose.yml environment for windmill-server:
- SMTP_HOST=mailserver
- SMTP_PORT=25
- SMTP_USERNAME=
- SMTP_PASSWORD=
- [email protected]
Plusieurs instances Windmill
Pour les équipes nécessitant des environnements isolés, la deuxième instance reçoit ses propres répertoires de données vides, sa propre base de données et son propre mot de passe :
# Create second instance with its own empty data directories
mkdir -p /opt/windmill-pasta/postgres-data /opt/windmill-pasta/windmill-data /opt/windmill-pasta/lsp-cache
cp /opt/windmill-pizza/.env /opt/windmill-pizza/docker-compose.yml /opt/windmill-pasta/
chmod 600 /opt/windmill-pasta/.env
# Update configuration
sed -i 's/pizza/pasta/g' /opt/windmill-pasta/.env
sed -i 's/windmill.yourdomain.com/pasta.yourdomain.com/g' /opt/windmill-pasta/.env
# Generate new password
NEW_PASSWORD=$(openssl rand -hex 16)
sed -i "s/POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$NEW_PASSWORD/" /opt/windmill-pasta/.env
sed -i "s#postgresql://postgres:[^@]*@#postgresql://postgres:$NEW_PASSWORD@#" /opt/windmill-pasta/.env
# Update docker-compose.yml
sed -i 's/pizza/pasta/g' /opt/windmill-pasta/docker-compose.yml
sed -i 's/windmill.yourdomain.com/pasta.yourdomain.com/g' /opt/windmill-pasta/docker-compose.yml
Considérations de sécurité
Isolation réseau
- PostgreSQL n’est accessible que depuis les conteneurs du réseau Docker partagé
proxy; utilisez un réseau interne distinct pour une isolation plus stricte - Aucun port de base de données externe exposé
- Terminaison HTTPS au niveau de Traefik
Limites de ressources
- Les conteneurs workers ont des limites CPU et mémoire
- Les limites de ressources réduisent l’impact des tâches incontrôlées et des tentatives d’épuisement des ressources
- Configurable selon la capacité du serveur
Sécurité SSL
- Certificats Let’s Encrypt automatiques
- Redirections HTTP vers HTTPS
- Configuration TLS moderne
Supervision et maintenance
Contrôles hebdomadaires de l’état des services
# Container status
docker compose ps | grep -E "(healthy|Up)"
# Network connectivity
docker network inspect proxy
# Database connection
docker compose exec windmill-db psql -U postgres -d windmill_pizza -c "SELECT version();"
# Log analysis
docker compose logs --tail 50 windmill-server | grep -E "(ERROR|WARN)"
Maintenance mensuelle
# Backup database first
cd /opt/windmill-pizza
./backup.sh
# Update containers
./update.sh
# Clean old data
docker system prune -f
Répartition des coûts et comparaison
Coûts mensuels
Configuration auto-hébergée :
- Hetzner CX23 (4 Go de RAM) : 5,99 €/mois HT, avec une adresse IPv4 principale incluse (en octobre 2026)
- Frais de domaine : ~1 €/mois
- Total : ~7 €/mois HT
Comparaison avec Windmill Cloud :
- Cloud : 20 $/mois par siège développeur, 10 $/mois par opérateur (en octobre 2026)
- Économies : 250 $+ par an dès que deux développeurs ou plus ont besoin de sièges
Avantages en termes de performance
Avantages de l’auto-hébergement :
- Exécutions de flux de travail illimitées
- Aucune limitation de débit externe
- Contrôle total des données
- Intégrations personnalisées
- Flexibilité de dimensionnement des ressources
Référence de dépannage
Diagnostics rapides
# Container health
docker compose ps | grep -E "(healthy|Up)"
# Network connectivity
docker network inspect proxy
# Database connection
docker compose exec windmill-db psql -U postgres -d windmill_pizza -c "SELECT version();"
# Log analysis
docker compose logs --tail 50 windmill-server | grep -E "(ERROR|WARN)"
Erreurs courantes
- « password authentication failed » → Utilisez des mots de passe hexadécimaux ; ne videz les volumes qu’après une sauvegarde ou sur une nouvelle installation
- « connection refused » → Vérifiez la configuration réseau
- « certificate errors » → Vérifiez le DNS et la configuration Traefik
- « out of memory » → Ajustez les limites de ressources des workers
Montée en charge de votre infrastructure Windmill
Montée en charge horizontale
Pour les environnements traitant de gros volumes :
# Add additional workers
windmill-worker-2:
image: ${WM_IMAGE}
container_name: windmill-pizza-worker-2
environment:
- DATABASE_URL=${DATABASE_URL}
- MODE=worker
- WORKER_GROUP=heavy
deploy:
resources:
limits:
cpus: '2'
memory: 4G
Montée en charge verticale
Augmentez les ressources du serveur (prix Hetzner HT, avec une adresse IPv4 principale incluse en octobre 2026) :
- CX33 (8 Go de RAM) : 8,99 €/mois pour les charges de travail lourdes
- CX43 (16 Go de RAM) : 16,49 €/mois pour un usage en entreprise
Intégration à l’infrastructure existante
Utilisation avec n8n
Si vous utilisez déjà n8n (présenté dans nos tutoriels précédents) :
- Windmill gère les flux de travail conçus autour du code
- n8n gère les automatisations visuelles et simples
- Les deux partagent le même proxy Traefik
- Des bases de données séparées évitent les conflits
Services partagés
Exploitez l’infrastructure existante :
- Traefik : Gère le SSL pour tous les services
- Serveur de messagerie : SMTP partagé pour les notifications
- Supervision : Journalisation et métriques unifiées
- Sauvegardes : Stratégie de sauvegarde centralisée
Conclusion
L’auto-hébergement de Windmill fournit une automatisation des flux de travail de niveau entreprise à une fraction des coûts d’hébergement cloud. La clé du succès est de comprendre comment les identifiants PostgreSQL sont transmis et conservés, et d’utiliser des mots de passe hexadécimaux uniquement pour éviter les problèmes d’encodage d’URL qui peuvent faire échouer les installations.
Principaux avantages de cette configuration
- Rentable : Économisez plusieurs centaines par an par rapport aux solutions cloud
- Prêt pour la production : Gère de manière fiable les charges de travail en entreprise
- Sécurisé : HTTPS, aucun port de base de données exposé et limites de ressources (le montage du socket Docker donne toujours au worker un accès au niveau de l’hôte)
- Évolutif : Ajoutez facilement des workers et des ressources selon les besoins
- Privé : Votre code et vos données restent sur votre infrastructure, sauf si vos flux de travail les envoient à des services externes
Cette configuration a été testée dans des environnements de production et offre la fiabilité nécessaire pour l’automatisation des flux de travail critiques. Les étapes de dépannage répondent aux problèmes rencontrés en conditions réelles lors du déploiement, en particulier les problèmes d’authentification PostgreSQL qui affectent de nombreuses installations auto-hébergées.
Pour des besoins complexes en matière de flux de travail ou des déploiements d’entreprise, envisagez une consultation professionnelle pour optimiser votre cas d’utilisation spécifique et assurer une allocation optimale des ressources.
Prochaines étapes
- Explorez les techniques de dépannage des webhooks applicables à Windmill
- Consultez l’optimisation des charges utiles pour la gestion de grands ensembles de données
- Envisagez l’intégration avec les installations n8n existantes
À propos de tva
tva assure la gestion complète de l’infrastructure des systèmes de bases de données, des environnements cloud et des chaînes d’approvisionnement mondiales. Notre approche méthodique combine des protocoles de sécurité rigoureux avec l’optimisation des performances, tandis que nos services de conseil stratégique permettent une coordination précise des capacités numériques et des actifs physiques – en maintenant les normes les plus élevées d’excellence opérationnelle et de conformité dans toutes nos missions.
Visitez tva.sg pour des informations sur nos services et d’autres tutoriels d’automatisation.
Analyses connexes
Pour aller plus loin
Auto-hébergement de n8n sur Hetzner Cloud : tutoriel complet de configuration Docker
Auto-héberger Windmill en 2026 : workers, PostgreSQL, isolation et mises à niveau sûres
Guide complet de dépannage de n8n auto-hébergé 2025 : résoudre les problèmes de taille des données d’exécution et de webhooks avec Traefik