Image Docker WordPress optimisée basée sur FrankenPHP avec installation automatique et support complet pour Kubernetes.
- FrankenPHP 1.11 avec PHP 8.4
- Installation automatique de WordPress au premier démarrage
- WP-CLI intégré pour la gestion en ligne de commande
- Extensions PHP optimisées : bcmath, exif, gd, intl, mysqli, zip, imagick, opcache
- OPcache configuré pour des performances maximales
- Support multi-tenant pour WordPress-as-a-Service
- Compatible Kubernetes avec healthchecks et configuration via variables d'environnement
- Installation rapide
- Variables d'environnement
- Utilisation
- Fonctionnalités avancées
- Développement
- Architecture
# Cloner le repository
git clone https://github.com/Gskill75/wordpress-frankenphp.git
cd wordpress-frankenphp
# Copier et éditer la configuration
cp .env.example .env
vim .env
# Démarrer la stack
docker-compose up -d
# Voir les logs d'installation
docker-compose logs -f wordpressAccédez à WordPress sur http://localhost:8080
# Construire l'image
docker build -t wordpress-frankenphp .
# Démarrer MySQL
docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=wordpress \
mysql:8.0
# Démarrer WordPress
docker run -d --name wordpress \
--link mysql:mysql \
-p 8080:80 \
-e WORDPRESS_DB_HOST=mysql:3306 \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=wordpress \
-e WORDPRESS_URL=http://localhost:8080 \
-e WORDPRESS_ADMIN_USER=admin \
-e WORDPRESS_ADMIN_PASSWORD=SecurePass123! \
-e WORDPRESS_ADMIN_EMAIL=admin@example.com \
wordpress-frankenphp| Variable | Description | Défaut |
|---|---|---|
WORDPRESS_DB_HOST |
Hôte de la base de données | - |
WORDPRESS_DB_NAME |
Nom de la base de données | - |
WORDPRESS_DB_USER |
Utilisateur de la base de données | - |
WORDPRESS_DB_PASSWORD |
Mot de passe de la base de données | - |
| Variable | Description | Défaut |
|---|---|---|
WORDPRESS_URL |
URL du site WordPress | http://localhost |
WORDPRESS_TITLE |
Titre du site | Mon Site WordPress |
WORDPRESS_ADMIN_USER |
Nom d'utilisateur admin | admin |
WORDPRESS_ADMIN_PASSWORD |
Mot de passe admin | Généré automatiquement |
WORDPRESS_ADMIN_EMAIL |
Email de l'administrateur | admin@example.com |
WORDPRESS_LOCALE |
Langue de WordPress | fr_FR |
| Variable | Description | Défaut |
|---|---|---|
WORDPRESS_TIMEZONE |
Fuseau horaire | - |
WORDPRESS_PERMALINK_STRUCTURE |
Structure des permaliens | - |
WORDPRESS_AUTO_UPDATE |
Mises à jour automatiques | true |
Le fichier docker-compose.yml fourni est prêt pour le développement local :
services:
wordpress:
build: .
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_URL: http://localhost:8080
# ... autres variables
volumes:
- wordpress_data:/app/public/wp-content
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
# ... configuration MySQLCommandes utiles :
# Démarrer
docker-compose up -d
# Arrêter
docker-compose down
# Arrêter et supprimer les volumes
docker-compose down -v
# Voir les logs
docker-compose logs -f
# Redémarrer WordPress
docker-compose restart wordpress
# Exécuter WP-CLI
docker-compose exec wordpress wp --help# Construire l'image
docker build -t wordpress-frankenphp:latest .
# Lancer avec variables d'environnement
docker run -d \
--name my-wordpress \
-p 8080:80 \
-e WORDPRESS_DB_HOST=mysql:3306 \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=wordpress \
-v wordpress_data:/app/public/wp-content \
wordpress-frankenphp:latest
# Accéder au conteneur
docker exec -it my-wordpress bash
# Utiliser WP-CLI
docker exec my-wordpress wp plugin list --allow-rootapiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: ghcr.io/gskill75/wordpress-frankenphp:latest
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: "mysql-service:3306"
- name: WORDPRESS_DB_NAME
valueFrom:
secretKeyRef:
name: wordpress-secrets
key: db-name
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: wordpress-secrets
key: db-user
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: wordpress-secrets
key: db-password
- name: WORDPRESS_URL
value: "https://mon-site.example.com"
- name: WORDPRESS_TITLE
value: "Mon Site"
- name: WORDPRESS_ADMIN_USER
valueFrom:
secretKeyRef:
name: wordpress-secrets
key: admin-user
- name: WORDPRESS_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: wordpress-secrets
key: admin-password
- name: WORDPRESS_ADMIN_EMAIL
value: "admin@example.com"
- name: WORDPRESS_LOCALE
value: "fr_FR"
- name: WORDPRESS_TIMEZONE
value: "Europe/Paris"
- name: WORDPRESS_PERMALINK_STRUCTURE
value: "/%postname%/"
volumeMounts:
- name: wordpress-storage
mountPath: /app/public/wp-content
livenessProbe:
httpGet:
path: /wp-admin/install.php
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /wp-admin/install.php
port: 80
initialDelaySeconds: 10
periodSeconds: 5
volumes:
- name: wordpress-storage
persistentVolumeClaim:
claimName: wordpress-pvc
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-service
spec:
selector:
app: wordpress
ports:
- port: 80
targetPort: 80
type: ClusterIPapiVersion: v1
kind: ConfigMap
metadata:
name: wordpress-config
data:
WORDPRESS_LOCALE: "fr_FR"
WORDPRESS_TIMEZONE: "Europe/Paris"
WORDPRESS_PERMALINK_STRUCTURE: "/%postname%/"
WORDPRESS_AUTO_UPDATE: "false"L'entrypoint vérifie automatiquement si WordPress est installé :
- Vérification de la base de données : Attend jusqu'à 30 secondes que MySQL soit prêt
- Détection de l'installation : Utilise WP-CLI pour vérifier si WordPress est déjà configuré
- Installation si nécessaire : Configure WordPress complètement avec les paramètres fournis
- Idempotence : Peut être relancé sans risque de réinstallation
# Lister les plugins
docker-compose exec wordpress wp plugin list --allow-root
# Installer un plugin
docker-compose exec wordpress wp plugin install akismet --activate --allow-root
# Mettre à jour WordPress
docker-compose exec wordpress wp core update --allow-root
# Créer un utilisateur
docker-compose exec wordpress wp user create john john@example.com --role=editor --allow-root
# Export de la base de données
docker-compose exec wordpress wp db export - --allow-root > backup.sql
# Import de la base de données
docker-compose exec -T wordpress wp db import - --allow-root < backup.sqlOPcache est préconfiguré pour des performances optimales :
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.validate_timestamps=1Les erreurs PHP sont loguées dans stderr pour une intégration facile avec les systèmes de monitoring :
# Voir les logs d'erreur PHP
docker-compose logs wordpress | grep -i error# Build de l'image
docker build -t wordpress-frankenphp:dev .
# Build avec arguments
docker build \
--build-arg WORDPRESS_VERSION=6.9 \
--build-arg USER=appuser \
-t wordpress-frankenphp:dev .# Démarrer l'environnement de test
docker-compose up -d
# Vérifier l'installation
curl -I http://localhost:8080
# Tester WP-CLI
docker-compose exec wordpress wp --info --allow-root
# Vérifier les extensions PHP
docker-compose exec wordpress php -m.
├── .github/ # GitHub Actions workflows
├── Dockerfile # Image WordPress FrankenPHP
├── entrypoint.sh # Script d'installation automatique
├── docker-compose.yml # Stack de développement
├── .env.example # Variables d'environnement exemple
├── LICENSE # Licence MIT
└── README.md # Cette documentation
- Base : FrankenPHP 1.11 (Caddy + PHP 8.4)
- WordPress : 6.9 (configurable)
- Extensions PHP : bcmath, exif, gd, intl, mysqli, zip, imagick, opcache
- Outils : WP-CLI pour l'automatisation
80/tcp: HTTP (FrankenPHP/Caddy)
/app/public/wp-content: Contenu WordPress (thèmes, plugins, uploads)/config/caddy: Configuration Caddy (optionnel)/data/caddy: Données Caddy (certificats, etc.)
Par défaut, l'application s'exécute sous l'utilisateur appuser (non-root) pour plus de sécurité.
- Secrets : Utilisez des Kubernetes Secrets ou Docker Secrets en production
- HTTPS : FrankenPHP supporte HTTPS automatique avec Let's Encrypt
- Mots de passe : Utilisez des mots de passe forts (min. 12 caractères)
- Updates : Maintenez WordPress et les plugins à jour
- Non-root : L'application s'exécute avec un utilisateur non-privilégié
- FrankenPHP Documentation
- WordPress Documentation
- WP-CLI Documentation
- Docker Documentation
- Kubernetes Documentation
Les contributions sont les bienvenues ! N'hésitez pas à :
- Fork le projet
- Créer une branche (
git checkout -b feature/ma-fonctionnalite) - Commiter vos changements (
git commit -am 'Ajout d\'une fonctionnalité') - Pousser vers la branche (
git push origin feature/ma-fonctionnalite) - Créer une Pull Request
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
- FrankenPHP pour le serveur d'applications PHP moderne
- WordPress pour le CMS
- WP-CLI pour l'outil en ligne de commande
Développé avec ❤️ pour WordPress-as-a-Service sur Kubernetes