docs/00-reprise/20-infrastructure.md —
ce document se lit aussi dans le dépôt, sans serveur.
Infrastructure
Où tourne quoi, chez qui, et comment y entrer.
Les faits de ce document sont vérifiés dans le dépôt et sur le serveur au 22 septembre 2026. Ce qui n'a pas pu l'être est marqué à compléter — ne pas supposer que le reste est à jour sans regarder.
Les adresses
| Quoi | Adresse | Sert à |
|---|---|---|
| Boutique | www.monsieurcle.fr | WordPress + WooCommerce. La vente. |
| ERP Darsy | darsy.monsieurcle.fr | Cet outil. L'ERP interne. |
| API Darsy | darsy.monsieurcle.fr/api/v1/… | Ce que l'ERP appelle. Même hébergement. |
| Support public | www.monsieurcle.fr/support/ | Le formulaire client (côté WordPress, pas dans ce dépôt). Reçoit des fichiers, contrairement à celui du dépôt. |
| Aide & SAV | sav.monsieurcle.fr | Les quatre guichets d'aide réunis : suivi, contact, FAQ, Certi'Clé. Pointé sur darsy/public/sav. |
| Certi'Clé | sav.monsieurcle.fr/certicle/ | Vérification de factures pour les assureurs. certicle.monsieurcle.fr redirige, et doit le rester. |
| Application Pro | voir la configuration Pro | PWA pour les professionnels. |
À compléter : confirmer l'adresse de l'application Pro, et dire qui l'utilise. Celle de Certi'Clé est confirmée depuis le 27/09/2026.
L'hébergement
OVH, hébergement mutualisé.
| Accès SSH | ssh01.cluster130.gra.hosting.ovh.net |
| Utilisateur | mrclefs |
| Racine de l'ERP | /home/mrclefs/darsy |
| Centre de données | GRA (Gravelines, France) |
| PHP en production | 8.4.22 |
| MySQL en production | 8.4 |
OPcache est actif avec validate_timestamps = 1 et revalidate_freq = 2 : un fichier modifié est vu au plus deux secondes après. Cette fenêtre a déjà causé une panne — voir DEPLOIEMENT.md, section A3.
À compléter : le contrat OVH (offre, échéance, sur quel compte il est facturé), qui détient les identifiants de l'espace client OVH, et qui est le contact technique déclaré.
Ce que « mutualisé » implique
Pas d'accès root, pas de service à installer, pas de tâche planifiée arbitraire. C'est une contrainte assumée : Darsy n'a aucune tâche cron et n'en veut pas. Tout ce qui doit tourner régulièrement est déclenché à la main, depuis l'ERP ou en SSH.
Les deux bases
| Base | Contenu | Accès depuis Darsy |
|---|---|---|
darsy | Tout ce que l'ERP ajoute : factures, stock, comptabilité, utilisateurs, audit | Lecture et écriture |
boutique | WordPress + WooCommerce (préfixe wp_) : produits, commandes, clients | Lecture seule |
La règle est absolue : aucune requête ne joint les deux bases. Chaque côté répond à sa question, et le PHP rapproche. Deux raisons : elles peuvent vivre sur deux serveurs, et une jointure inter-bases rendrait impossible de changer l'un sans l'autre.
L'écriture dans boutique passe toujours par le plugin WordPress (darsy-plugin/), jamais par SQL. Voir par où commencer.
WooCommerce est en mode HPOS : les commandes sont dans wp_wc_orders et non plus dans wp_posts.
À compléter : sur quel serveur MySQL chaque base tourne, et si la boutique est sur le même hébergement OVH ou ailleurs.
Le code
| Dépôt | github.com/arpara75/darsy |
| Branche de production | master |
| Poste de développement | c:\xampp\htdocs\darsy, PHP 8.2 |
| Intégration continue | GitHub Actions — PHP 8.2 et 8.4, MySQL 8.4, à chaque poussée |
Le plugin WordPress vit dans le même dépôt (darsy-plugin/) mais se déploie séparément, dans l'installation WordPress de la boutique.
À compléter : qui a accès au dépôt GitHub, et sous quel compte il est détenu.
Ce que la CI vérifie
- La suite de tests complète, sur les deux versions de PHP.
- PHPStan (analyse statique) — la base de référence ne doit que rétrécir.
- Le format du code (
php-cs-fixer). - ESLint sur
public/— le fichiereslint-suppressions.jsonest un cliquet : il ne doit jamais grandir.
Un test ignoré fait échouer la CI. C'est voulu : un test qu'on saute en silence ne protège plus rien.
La configuration et les secrets
Tous les réglages vivent dans .env, à la racine, sur le serveur. Ce fichier n'est jamais dans Git — .env.example liste les clés attendues, sans valeurs.
Les secrets qu'il contient :
| Clé | Ce que c'est | Si elle fuit |
|---|---|---|
DARSY_DB_*, BOUTIQUE_DB_* | Accès aux deux bases | Accès complet aux données |
JWT_SECRET | Signe les jetons de session de l'ERP | Quelqu'un peut se fabriquer une session |
ENCRYPT_KEY | Chiffre les données sensibles en base | Déchiffrement possible |
WP_DARSY_CLE | Authentifie Darsy auprès du plugin WordPress | Écriture possible dans la boutique |
LAPOSTE_API_KEY | Suivi des colis | Usage de votre quota |
MAIL_DSN | Envoi des e-mails | Envoi en votre nom |
CERTICLE_TURNSTILE_SECRET | Anti-robot de Certi'Clé | Contournement du filtre |
Faire tourner une clé
Chaque secret se remplace sans arrêter le service, mais pas de la même façon :
JWT_SECRET— remplacer, puis toutes les sessions en cours tombent. Tout le monde se reconnecte. Sans conséquence au-delà.WP_DARSY_CLE— doit être changée des deux côtés en même temps : dans le.envde Darsy et dans la configuration du plugin WordPress. Entre les deux, l'écriture vers la boutique ne marche plus.php workers/plugin_doctor.phpvérifie que les deux côtés s'accordent.- Mots de passe de base — changer dans OVH, puis dans
.env. Le service est coupé entre les deux.
Ne jamais afficher la valeur deWP_DARSY_CLEdans une conversation, un journal ou une capture d'écran. Elle a déjà fuité une fois parce qu'un masquage automatique cherchaitKEY,SECRETetPASS— et pas le mot françaisCLE.
À compléter : où sont conservés les secrets hors du serveur (gestionnaire de mots de passe ? coffre ? qui y a accès ?). C'est le point le plus critique d'une reprise : sans eux, l'ERP ne redémarre pas ailleurs.
Les sauvegardes
MySQL n'annule pas une modification de schéma. Une migration qui casse au milieu laisse la base entre deux états, et le seul retour arrière est le fichier de sauvegarde pris avant.
mkdir -p ~/backups
mysqldump -u USER -p --single-transaction --routines darsy > ~/backups/darsy_$(date +%F_%H%M).sql
gzip ~/backups/darsy_*.sql
À compléter : existe-t-il une sauvegarde automatique (OVH en propose une) ? À quelle fréquence, gardée combien de temps, et a-t-elle déjà été restaurée pour vérifier qu'elle fonctionne ? Une sauvegarde jamais restaurée n'est pas une sauvegarde.
Les services extérieurs
| Service | Rôle | Où c'est configuré |
|---|---|---|
| La Poste / Colissimo | Suivi des colis, étiquettes | LAPOSTE_API_KEY, et le plugin Colissimo côté WordPress |
| Monetico | Encaissement bancaire | Côté WooCommerce |
| Cloudflare Turnstile | Anti-robot sur Certi'Clé | CERTICLE_TURNSTILE_* |
| Trustpilot | Avis clients | Module Avis de l'ERP |
| Envoi d'e-mails | Factures, devis, commandes fournisseurs | MAIL_DSN |
À compléter : les contrats, les coûts, les échéances et les contacts pour chacun. Un repreneur doit savoir ce qui est facturé et à qui.
Ce qui n'existe pas, et c'est voulu
- Pas de tâche cron. Rien ne tourne tout seul.
- Pas de recette. Le développement est local, la production est la seule autre instance.
- Pas de déploiement automatique. Un humain fait
git pull. - Pas de purge automatique des données sensibles. Caviardage et suppression de pièces d'identité sont des gestes mensuels, à la main, avec un aperçu avant effacement.
Ces absences sont des décisions, pas des oublis. Les réintroduire demande d'en parler d'abord.