WPOpsX déploie, sécurise, supervise et maintient des sites WordPress avec Docker et Traefik : routage HTTP/HTTPS automatique, certificats Let's Encrypt, monitoring, sauvegardes et mises à jour automatisées, interface de gestion Docker.
- Déploiement en une commande d'un site WordPress (base, cache, TLS, sauvegardes, cron)
- Certificats SSL automatiques (Let's Encrypt, un domaine par site)
- Infrastructure cloisonnée : chaque base de données est sur un réseau interne, jamais exposée au proxy
- Sauvegardes automatiques (base + fichiers) avec rotation et contrôle d'intégrité
- Mises à jour automatiques : WordPress, extensions, thèmes, traductions
- Monitoring : Prometheus, Grafana, Jaeger, Node Exporter, cAdvisor
- Portainer : gestion graphique des conteneurs, stacks, volumes et réseaux
- Porte de vérification (
scripts/verify.sh) exécutée en local et en CI
WPOpsX/
├── scripts/
│ ├── init.sh # prérequis hôte : réseau proxy, traefik/acme.json, .env des modules
│ └── verify.sh # porte de vérification (YAML, Bash, Compose, config Traefik)
│
├── traefik/ # reverse proxy + gestion des certificats
│ ├── traefik.yml # configuration STATIQUE
│ ├── dynamic/ # configuration DYNAMIQUE (middlewares partagés, rechargée à chaud)
│ ├── acme.json # certificats + compte ACME — à préserver, jamais régénéré
│ ├── docker-compose.yml
│ └── update-domains.sh # inventaire/contrôle des domaines déployés
│
├── wordpress/
│ └── template/ # modèle de site (copié par deploy.sh)
│ ├── deploy.sh # déploiement d'un site
│ ├── docker-compose.yml
│ ├── backup.sh # sauvegarde base + fichiers (rotation 7 jours)
│ ├── update.sh # mises à jour WordPress
│ └── .env.example
│
├── portainer/ # interface de gestion Docker (accès authentifié)
└── monitoring/ # Prometheus, Grafana, Jaeger, exporters
- Docker avec le plugin
docker composev2 (la commandedocker-composev1 est en fin de vie depuis 2023) - Accès root ou sudo
- Ports 80 et 443 libres
- Un enregistrement DNS par domaine, pointant vers le serveur
./scripts/init.shCrée le réseau Docker externe proxy, le fichier traefik/acme.json (mode 600, stockage des
certificats et du compte ACME) et les .env des modules depuis leurs .env.example, puis valide toutes
les configurations.
cd traefik
# Personnaliser l'email Let's Encrypt dans traefik.yml (il ne peut pas venir du .env)
docker compose up -dÀ faire une seule fois par infrastructure : tous les sites s'y raccrochent ensuite.
cd wordpress/template
./deploy.sh mon-site mon-site.exemple.comLe script génère les mots de passe, écrit le .env (mode 600), démarre la base, le cache et WordPress,
vérifie la réponse HTTPS, puis installe deux tâches cron : sauvegarde quotidienne (02h00) et mises à jour
hebdomadaires (dimanche 03h00).
./deploy.sh --clean mon-site mon-site.exemple.com # repartir de zéro (SUPPRIME les données)
./deploy.sh --no-cron mon-site mon-site.exemple.com # sans tâches planifiéescd portainer && cp .env.example .env && chmod 600 .env && docker compose up -d
cd monitoring && cp .env.example .env && chmod 600 .env && docker compose up -dChaque module exige son .env (domaine, identifiants) : docker compose up échoue volontairement si
un mot de passe est absent, plutôt que de déployer une interface d'administration sans protection.
- Aucun mot de passe par défaut : les
.envrefusent de démarrer sans identifiants explicites. - Interfaces d'administration (Traefik, Portainer, monitoring) derrière Traefik, en HTTPS et authentifiées.
- Aucun port d'administration publié sur l'hôte : tout passe par le reverse proxy.
- Bases de données sur un réseau Docker interne, hors de portée du proxy.
security_opt: no-new-privilegessur tous les conteneurs applicatifs,cap_drop: ALLsur Traefik.- Secrets jamais écrits en clair dans les scripts ni dans la crontab (lecture depuis
.env). .env,traefik/acme.jsonet les journaux sont ignorés par Git.
Voir SECURITY.md pour la procédure de signalement.
# Vérifier l'infrastructure avant tout commit
./scripts/verify.sh # YAML, Bash, Compose, chargement réel de la config Traefik
./scripts/verify.sh --fast # sans Docker
# Sauvegarder / mettre à jour un site
cd wordpress/mon-site && ./backup.sh
cd wordpress/mon-site && ./update.sh
# Sauvegarder les certificats (traefik/acme.json : à inclure dans la sauvegarde serveur)
cp traefik/acme.json ~/acme-$(date +%F).json && chmod 600 ~/acme-$(date +%F).json
# Contrôler les domaines et les certificats
cd traefik && ./update-domains.shtraefik/README.md— configuration, certificats, pièges vérifiés, migrationwordpress/template/README.md— déploiement, sauvegarde, restaurationmonitoring/README.md— supervisionportainer/README.md— gestion Dockerdocs/— guides, FAQcoming_soon.md— feuille de route (dont le mode Lite)
Les contributions sont bienvenues : ouvrir une issue, proposer une PR.
Avant de proposer un changement : ./scripts/verify.sh doit passer, et le message de commit suivre
Conventional Commits.
MIT — libre d'usage, de modification et de redistribution, y compris commercial.
Eurin HASH — eurinhash.com | digitaleflex.com
./scripts/verify.shsignale les erreurs de configuration avant toute chose.- Vérifier que Docker et le plugin
docker composev2 sont installés (docker compose version). - Vérifier que les ports 80 et 443 sont libres.
- Consulter les journaux :
cd wordpress/<site> && docker compose logs.
traefik/acme.jsondoit exister et être en mode 600 (./scripts/init.sh), sinon Traefik désactive l'ACME.- Le port 80 doit être joignable depuis Internet (challenge HTTP-01).
- Le DNS du domaine doit pointer vers le serveur.
docker logs traefik 2>&1 | grep -i acme.- Détail et réparation :
traefik/README.md.
- Le conteneur doit être sur le réseau
proxyet porter le labeltraefik.docker.network=proxy(sinon Traefik peut choisir le mauvais réseau interne).
wp-contentdoit appartenir àwww-data(uid 33) : le servicewordpress-inits'en charge au démarrage. Relancer avecdocker compose up -d --force-recreate.
- Base / Redis : éditer le
.envdu site puisdocker compose up -d(les volumes conservent les données). - Grafana / Portainer : via leurs interfaces, ou en modifiant leur
.envavant le premier démarrage.
cd wordpress/<site> && ./backup.sh(base + fichiers, rotation 7 jours).- La procédure de restauration est documentée en tête de
backup.sh.
./deploy.sh <site> <nouveau-domaine>puis mettre à jour le DNS : Traefik découvre le router tout seul et émet le certificat. Aucune modification de fichier de configuration n'est nécessaire.
