Tout ce qu’il faut pour démarrer
Connecter un site prend moins d’une minute, brancher votre stockage de sauvegarde environ dix. Le reste de cette page couvre l’affichage des valeurs, la restauration, l’API et les pannes courantes.
Connecter un site
Trois étapes, aucune configuration serveur.
- 01
Créez le site dans le Hub
Sites → Connecter un site. Renseignez l’URL, le Hub génère un code d’installation à usage unique.
- 02
Installez l’extension
Téléchargez l’archive, puis Extensions → Ajouter → Téléverser dans votre WordPress. Activez-la.
- 03
Collez le code
Réglages → WP Control Hub, collez le code, validez. Le Hub détecte la connexion automatiquement.
Avec WP-CLI
Si vous gérez vos sites en ligne de commande, une seule commande suffit :
wp wpch connect WPCH-7K2P-9QX4Hub auto-hébergé
L’extension pointe par défaut vers le service hébergé. Pour un autre Hub, définissez la constante dans wp-config.php :
define( 'WPCH_HUB_URL', 'https://hub.mondomaine.fr' );Afficher une valeur
Quatre manières, selon l’endroit où vous écrivez. Toutes lisent le même cache local : aucune requête réseau au chargement d’une page.
Shortcode
Dans un article, une page, un widget ou un constructeur de pages.
[wpch_value key="company.phone"]PHP
Dans un gabarit de thème. Renvoie la chaîne déjà formatée et échappée.
<?php echo wpch_get_value( 'company.phone' ); ?>Bloc Gutenberg
Ajoutez le bloc « Valeur WP Control Hub » et choisissez la clé dans la liste.
Elementor
Dans n’importe quel champ texte, cliquez sur l’icône de contenu dynamique et choisissez « Valeur WP Control Hub ».
Attributs et options
default: Texte affiché si la valeur est vide.format: raw (défaut), html, ou link. Le format link produit un lien tel:, mailto: ou href selon le type.
[wpch_value key="company.email" format="link" default="-"]Valeur brute
Pour les types structurés (adresse, horaires, liste, JSON), récupérez la donnée plutôt que son rendu :
<?php $hours = wpch_get_raw( 'company.opening_hours' ); ?>Héritage des valeurs
Une valeur peut être définie à trois niveaux. La plus spécifique gagne.
- Surcharge du site
- Valeur du groupe le plus prioritaire
- Valeur de l’organisation
- Valeur par défaut de la variable
Si un site appartient à plusieurs groupes, celui dont la priorité est la plus élevée l’emporte. À priorité égale, le groupe le plus ancien. La résolution est déterministe : le même déploiement produit toujours le même résultat.
Vide volontaire
Effacer une valeur la fait hériter du niveau supérieur. Pour dire « ce site n’a pas de numéro », marquez-la comme volontairement vide : la chaîne d’héritage s’arrête là.
Sauvegardes et restauration
Chaque nuit, chaque site chiffre sa base de données et son wp-content, puis les dépose dans un espace de stockage qui vous appartient. Le hub programme, vérifie et restaure ; il ne détient jamais les archives.
Où vont les octets
C’est la décision de conception dont tout le reste découle : l’archive va du site au stockage sans passer par nos serveurs. Nous n’hébergeons aucune destination, à aucun tarif, et il n’existe pas d’option pour en obtenir une.
Ce que le hub conserve
- L’inventaire : quel site, quelle date, complète ou incrémentale, et de quelle chaîne l’archive fait partie.
- La taille de chaque morceau et son empreinte SHA-256, relevées avant l’envoi puis comparées à ce que le stockage annonce.
- L’emplacement exact des objets dans votre stockage, pour savoir quoi lire le jour d’une restauration.
- Les identifiants de la destination, chiffrés au repos. Le hub s’en sert pour signer chaque envoi, cinq minutes et un seul objet à la fois. Ils ne sont jamais déposés sur un site WordPress, et vous pouvez les révoquer chez votre fournisseur à tout moment.
- Le journal d’audit : qui a lancé, annulé, supprimé ou restauré, et depuis quelle adresse.
Ce que le hub ne conserve jamais
- Les octets des archives. Ils vont de votre site à votre stockage sans transiter par nous, et nous ne les téléchargeons pas.
- Le contenu de vos bases de données, donc les données personnelles de vos visiteurs et les empreintes de mots de passe de vos utilisateurs.
- wp-config.php, qui n’est pas sauvegardé du tout : seules les constantes utiles sont relevées une par une, pour ne pas déposer un mot de passe de base dans un bucket.
- Une destination que nous hébergerions. Il n’en existe pas : toute destination appartient à une organisation cliente.
Le cas de la clé de chiffrement
Par défaut, la clé de votre organisation est gardée par le hub, chiffrée au repos, pour qu’une restauration ne vous demande rien. Dans ce mode nous détenons donc de quoi déchiffrer une archive, sans détenir l’archive. Le mode phrase secrète supprime cette contrepartie : la clé est dérivée d’un secret que nous ne voyons jamais, et une phrase perdue est une archive perdue. L’écran indique toujours le mode en vigueur.
Choisir entre les deux destinations
Deux endroits possibles, et ils ne se valent pas. Le choix se fait par politique de sauvegarde, et rien n’empêche d’avoir les deux : le disque du site pour revenir en arrière après une mise à jour ratée, votre stockage pour tout le reste.
Un espace de stockage à vous
L’archive quitte l’hébergement du site. Le hub interroge ensuite le stockage morceau par morceau, taille et empreinte comprises : c’est cette réponse, et elle seule, qui permet d’écrire « Contrôlée par nous ». Comptez dix minutes la première fois et quelques euros par mois.
Le disque du site lui-même
Rien à créer, rien à payer, une sauvegarde le soir même. L’archive reste sur l’hébergement du client, chiffrée, dans un répertoire que le site vérifie inaccessible depuis Internet avant chaque exécution.
Ce que « partage le sort du site » veut dire
- Le disque tombe : le site et ses sauvegardes tombent au même instant.
- L’hébergement est suspendu, pour une facture en litige ou un abus signalé : plus de site, et plus d’accès aux archives.
- Quelqu’un entre sur le site : il trouve les sauvegardes posées à côté et les efface en premier, parce que c’est exactement ce que font les rançongiciels.
- Une restauration ratée sur un disque plein n’a plus de filet, puisque le filet est sur ce disque.
Ce que le site affirme, et ce que nous avons vérifié
Le hub va voir chez votre hébergeur si la sauvegarde est vraiment là. Le disque du site, lui, est derrière un pare-feu : nous ne pouvons pas aller y regarder, et le site répondrait de lui-même. Une sauvegarde locale porte donc « Sur parole du site », jamais « Vérifiée par nous ». À la place, nous désignons un morceau précis de l’archive et nous demandons au site de le relire : il ne peut pas répondre sans lire vraiment, et nous comparons sa réponse à ce que nous avions noté avant que les octets existent. Cela repère une archive effacée, tronquée ou abîmée. Cela ne protège pas d’un site dont quelqu’un a pris le contrôle. La réponse porte sa date et expire au bout de deux cycles : l’écran revient alors à « nous ne savons pas ».
Le site refuse plutôt que d’avertir
Avant chaque sauvegarde locale, le site écrit un fichier témoin dans le répertoire des archives et tente de le récupérer par HTTP. S’il y parvient, ou s’il ne parvient pas à trancher, la sauvegarde est refusée et rien n’est écrit. Une archive téléchargeable, ce serait wp-config.php et la base complète à la portée d’un inconnu : ce n’est pas un avertissement que l’on ignore. Le chiffrement, lui, reste actif et n’est pas désactivable pour cette destination.
Surveiller la place
Les archives locales occupent le quota d’hébergement de votre client. L’onglet Sauvegardes de chaque site affiche ce qu’elles occupent aujourd’hui, ce que la conservation prévue occupera, et l’espace libre annoncé par l’hébergement. Le tableau de bord du parc compte, lui, les sites qui n’ont aucune copie hors site.
Brancher un bucket
Un site ne peut pas sauvegarder tant que son organisation n’a pas de destination validée. Comptez dix minutes la première fois.
- 01
Créez un bucket privé
Chez Backblaze B2, Scaleway, Wasabi, OVH, Amazon S3 ou votre propre MinIO, dans la région de votre choix. Aucun accès public, et de préférence un bucket dédié aux sauvegardes.
- 02
Créez une clé d’accès restreinte
Restreinte à ce seul bucket, avec quatre droits : PutObject, GetObject, ListBucket et DeleteObject. Rien d’autre n’est nécessaire.
- 03
Déclarez la destination
Sauvegardes → Destinations → Ajouter. Fournisseur, région, nom du bucket, préfixe facultatif, identifiant et secret. Le secret est chiffré à l’enregistrement.
- 04
Laissez le hub tester
Il écrit un objet, le relit, le supprime, et affiche le résultat. Une destination qui n’a pas passé ce test ne peut pas être rattachée à une politique.
Droits minimum de la clé
La politique ci-dessous suffit. Remplacez le nom du bucket et, si vous en utilisez un, le préfixe.
{
"Version": "2012-10-17",
"Statement": [
{ "Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::mon-bucket/wpch/*" },
{ "Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": "arn:aws:s3:::mon-bucket" }
]
}Activez le versioning
Sur un bucket sans versioning, un effacement ou une réécriture est définitif. C’est la meilleure protection contre un rançongiciel qui atteindrait aussi vos sauvegardes. Le hub détecte l’état du versioning et affiche un avertissement quand il est désactivé.
Ce qui se passe chaque nuit
Le site pilote, le hub autorise et vérifie. Une requête PHP tuée en cours de route est le cas normal, pas l’exception.
- Une politique se pose sur l’organisation, un groupe ou un site, comme une valeur de contenu : elle définit la fenêtre, la fréquence, la rétention et la destination. Un site qui rejoint le groupe est protégé le soir même.
- Le site découpe, compresse et chiffre sa base et son wp-content en morceaux, et les envoie un par un avec des URL signées par le hub pour cinq minutes. Chaque étape enregistre sa progression avant de rendre la main, et reprend là où elle s’était arrêtée.
- À la fin, le hub interroge le stockage : chaque objet existe-t-il, à la bonne taille, avec la bonne empreinte. Une sauvegarde n’est verte qu’après cette réponse, jamais sur la parole du site.
- Un site qui a cessé de sauvegarder est signalé sous vingt-quatre heures, par un contrôle indépendant de la mécanique qu’il surveille. C’est la seule façon de voir une sauvegarde qui n’a jamais démarré.
Ce que fait une restauration
Restaurer réécrit des fichiers et des tables sur un site en production. La capacité est réservée aux administrateurs, et chaque étape est annoncée avant d’être exécutée.
- L’écran annonce ce qui sera écrasé, et attend une confirmation explicite.
- Une sauvegarde de sécurité de la base est prise avant la première écriture, et verrouillée contre la suppression.
- Chaque étape destructrice écrit son intention dans un journal avant d’agir, ce qui rend le retour en arrière possible même après une interruption.
- Trois issues, jamais quatre : terminée, revenue en arrière, ou « à vérifier », avec la liste des fichiers et des tables touchés. Aucune quatrième issue ne ressemble à un succès.
- Le contenu géré par le hub se resynchronise ensuite : vous ne restaurez pas le numéro de téléphone du mois dernier avec le site.
Ce que nous ne promettons pas
Écrit ici plutôt que découvert le mauvais jour. Ces limites sont des choix de conception, pas des correctifs en attente.
Pas de cohérence à l’instant près
Une sauvegarde de 2 Go sur un hébergement mutualisé s’étale sur des heures. Le manifeste porte l’heure de début et de fin de chaque table, et l’interface affiche la durée réelle au lieu d’un horodatage unique qui serait une fiction. Un fichier téléversé entre le parcours des fichiers et le vidage de la base est référencé par un article et absent de l’archive.
Ni le cœur de WordPress, ni wp-config.php
Le cœur se retélécharge et le manifeste note sa version exacte. wp-config.php est un fichier d’identifiants : un expurgateur automatique finit toujours par en laisser passer un, alors nous relevons les constantes utiles (préfixe de tables, constantes multisite, chemins, mémoire) plutôt que le fichier.
Pas de restauration d’un article isolé
Extraire une ligne d’un fichier SQL demande d’interpréter du SQL, ce que ce format refuse de faire. La réponse honnête est de restaurer la table sous un préfixe de travail et d’y recopier la ligne ; la commande est documentée.
Aucune garde sur votre stockage
Votre stockage est le vôtre, y compris quand il perd des objets. Une règle de cycle de vie, une politique trop stricte ou une clé supprimée peuvent faire disparaître des archives que nous croyons présentes. La vérification nocturne s’en aperçoit sous vingt-quatre heures, pas plus tôt.
La fenêtre perdue
Entre la dernière sauvegarde réussie et l’incident, les données sont perdues. Toujours. Aucun produit ne change cela ; ceux qui laissent croire le contraire vous le font découvrir le mauvais jour.
API
API REST authentifiée par clé, à créer dans Paramètres → Clés API. Chaque clé porte des portées explicites.
Authentification
curl -H "Authorization: Bearer wpch_live_…" \
https://wpcontrolhub.app/api/v1/sitesPoints d’entrée
| GET /api/v1/sites | Liste des sites |
| GET /api/v1/sites/:id | Détail d’un site |
| GET /api/v1/variables | Liste des variables |
| GET /api/v1/values?siteId=… | Valeurs résolues pour un site |
| POST /api/v1/values | Modifier une valeur (crée un déploiement) |
| GET /api/v1/deployments | Liste des déploiements |
| POST /api/v1/deployments/:id/rollback | Annuler un déploiement |
Webhooks
Chaque livraison est signée en HMAC-SHA256. Vérifiez l’en-tête avant de traiter le corps :
const expected = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
// compare with the x-wpch-signature header (sha256=…)Quand ça ne marche pas
Les causes réelles, par ordre de fréquence. La page Santé d’un site affiche déjà le diagnostic ; ceci en donne le détail.
Le site est joignable mais le Hub reçoit un 403
Un pare-feu applicatif (Wordfence, Sucuri, Cloudflare, ModSecurity) bloque les appels entrants vers l’API REST. Autorisez la route /wp-json/wpch/v1/ ou l’adresse IP du Hub. Ce n’est pas bloquant : le site continue de récupérer ses valeurs par lui-même à chaque cycle.
Signature refusée
Les requêtes sont signées avec un horodatage toléré à 5 minutes. Si l’horloge du serveur WordPress dérive au-delà, toutes les signatures sont rejetées. Vérifiez la synchronisation NTP du serveur.
Extension introuvable (404)
L’API REST du site répond mais la route n’existe pas : l’extension est désactivée, supprimée, ou l’API REST est bloquée par un plugin de sécurité.
La valeur a changé dans le Hub mais pas sur la page
Un cache de page (WP Rocket, LiteSpeed, W3 Total Cache, Cloudflare) sert encore l’ancienne version. Videz le cache du site. La page Santé indique la version réellement appliquée par l’extension.
Le Hub est indisponible
Les valeurs déjà reçues restent stockées dans WordPress et continuent de s’afficher. Aucune page ne se vide, aucun contenu ne disparaît. Les modifications en attente reprennent dès le retour du service.
Prêt à connecter votre premier site ?
Gratuit pour l’instant, sans carte bancaire.