# Coudert Clément — CV et documentation

Version préparée le 16 septembre 2026 pour l’hébergement OVH Perso existant.

## Ce qui est inclus

- Présentation et CV reprenant la bannière, les photos, la police Heebo,
  les rubriques et le pied de page bleu foncé du site WordPress d’origine.
- Documentation avec catégories et sous-catégories imbriquées.
- Recherche par mots-clés dans les titres, descriptions et noms de fichiers.
- Compte administrateur unique, sans inscription publique.
- Ajout, remplacement, suppression et publication de PDF ou DOCX.
- Brouillons accessibles uniquement à l’administrateur connecté.
- PDF intégrés ; aperçu DOCX isolé du reste du site.
- PDF associé facultatif pour une mise en page fidèle au Word.
- Création, renommage, déplacement et ordre des catégories.
- Installation par navigateur, sans Composer ni terminal sur OVH.

Les lecteurs sont fournis localement. Les documents ne sont pas envoyés à un
service Microsoft, Google ou autre service de conversion. Les images distantes
liées dans un Word doivent être incorporées au fichier. Les DOCX à macros sont
refusés. Certains éléments Word complexes peuvent ne pas apparaître dans
l’aperçu ; un PDF associé prend alors la place de cet aperçu.

## Compatibilité

PHP 8.4 minimum. PHP 8.5 convient également ; inutile de modifier le réglage
actuel pour cette version. Une base MySQL dédiée et vide est nécessaire.
L’installeur vérifie les extensions PHP avant de démarrer.

Le dossier vendor/ contient les dépendances de production. Aucun serveur
Node.js, processus permanent, LibreOffice ou accès SSH interactif n’est requis
sur OVH.

Limites : document PDF/DOCX 15 Mo ; PDF associé 20 Mo. Le serveur peut imposer
une limite inférieure. public/.user.ini propose des limites compatibles.

## Installation initiale sur un sous-domaine

1. Créer une NOUVELLE base MySQL depuis OVH, dans **Bases de données**.
   Noter son serveur, son nom, son utilisateur et son mot de passe.
   Le champ « Web Cloud Databases : 0 » concerne un service distinct ;
   ta capture affiche bien « Bases de données : 1/5 ».

2. Décompresser l’archive sur ton ordinateur. Le dossier site/ contient
   l’application. Conserver migration/ sur ton ordinateur : c’est un
   export du contenu public actuel, pas des fichiers à servir sur le web.

3. Se connecter en SFTP :

   | Paramètre | Valeur |
   |---|---|
   | Serveur | ftp.cluster100.hosting.ovh.net |
   | Port | 22 |
   | Utilisateur | couderm |
   | Répertoire personnel | /home/couderm |

4. Créer /home/couderm/portfolio puis y transférer LE CONTENU de site/,
   y compris les fichiers commençant par un point et le dossier vendor/.
   Le fichier attendu est /home/couderm/portfolio/public/index.php.
   Utiliser un nouveau dossier, distinct du WordPress existant.

5. Ajouter un sous-domaine, par exemple nouveau.coudertclement.fr, dans
   **Multisite**, avec comme dossier racine portfolio/public. Activer son SSL.
   Vérifier le pointage DNS et attendre que HTTPS fonctionne.

   Seul public/ doit être exposé. La racine portfolio/, .env, vendor/ et
   storage/ ne sont pas des dossiers publics. Ne pas déplacer index.php
   à la racine du projet. La page d’attente avant installation est normale.

6. Ouvrir https://nouveau.coudertclement.fr/installation.php.
   Copier la clé privée du fichier installation.key, puis renseigner
   l’adresse HTTPS du sous-domaine, la nouvelle base vide et les identifiants
   du compte administrateur que tu souhaites créer.

7. Une fois l’installation terminée, supprimer public/installation.php
   via SFTP. L’installeur se verrouille aussi automatiquement et supprime la
   clé. Se connecter à /admin/connexion.

8. Tester avec un PDF et un DOCX réels, puis essayer une publication et
   un passage en brouillon. Vérifier les URL de fichiers dans une fenêtre
   privée pour confirmer que les brouillons restent inaccessibles.

L’installeur refuse une base contenant déjà des tables. Il ne supprime
aucune table et n’intervient pas dans WordPress.

## Utilisation

La barre de recherche de la documentation cherche dans les titres, descriptions
et noms des fichiers publiés. Plusieurs mots permettent d’affiner les résultats,
même s’ils apparaissent dans des champs différents. La recherche se combine
avec une catégorie et toutes ses sous-catégories ; les mots-clés restent actifs
lorsqu’on change de catégorie ou de page. « Effacer la recherche » revient à la
liste de la catégorie sélectionnée. Les brouillons restent masqués.
Le texte contenu dans les PDF et DOCX n’est pas indexé dans cette version.

Dans **Documents**, ajouter un fichier, son titre et sa catégorie. Cocher
« Publier sur le site » pour le rendre visible. Décocher pour le conserver en
brouillon. Un remplacement garde l’URL du document ; joindre à nouveau le PDF
associé si le Word a changé, car l’ancien aperçu est retiré.

Dans **Catégories**, créer une catégorie à la racine ou choisir sa parente.
Ouvrir une catégorie existante pour changer son nom, sa parente ou son ordre.
Un nombre plus petit apparaît d’abord parmi les catégories de même niveau.
Une catégorie doit être vidée avant suppression.

Dans **Mon compte**, changer le mot de passe avec vérification de l’ancien.
Les autres sessions deviennent invalides à leur prochaine requête protégée
après le changement.

## Contenu du CV

Le CV reprend la page publique https://coudertclement.fr/cv/.
L’âge et les affirmations sur l’emploi actuel, potentiellement obsolètes, sont
omis. Le contenu est regroupé dans config/profile.php. La gestion du CV
depuis l’administration n’est pas incluse dans cette première version.
Actualiser notamment les dates et le poste actuel avant publication finale.

Les images de présentation et la police sont incluses dans public/assets/identity/,
sans dépendance au WordPress. Le fichier public/assets/identity.css contient
l’identité visuelle ; les vues de documentation et d’administration conservent
leur organisation et leurs fonctionnalités.

## Documentation WordPress existante

Le dossier séparé migration/ contient les réponses publiques WordPress :

- wordpress-docs.json : 22 documentations, texte HTML, titres et URL ;
- wordpress-pages.json : 4 pages publiques ;
- wordpress-media.json : 92 fiches de médias avec leurs URL.

Ce n’est pas une sauvegarde complète de WordPress. Les images et fichiers
binaires ne sont pas intégrés à cet export. Les 22 documentations ne sont pas
importées dans la nouvelle application. Elles doivent encore être reprises
en PDF/DOCX ou faire l’objet d’un import adapté. Ne pas supprimer l’ancien
site avant cette reprise.

Les catégories de départ sont modifiables et ne contiennent pas de faux
documents. Les anciennes adresses /cv et /docs sont redirigées vers les
nouvelles pages ; les URL individuelles des anciens articles devront être
mappées lors de leur migration.

## Passage sur le domaine principal

Après validation du nouveau site et reprise des contenus :

1. Sauvegarder les fichiers et la base du WordPress actuel.
2. Changer APP_URL dans .env pour https://coudertclement.fr.
3. Faire pointer le domaine principal et son éventuel alias www vers
   portfolio/public dans Multisite. Conserver HTTPS.
4. Vérifier connexion, fichiers, formulaires et redirections.

Revenir à l’ancien dossier racine dans Multisite permet de réafficher le
WordPress conservé. Le ZIP livré ne modifie aucun réglage OVH.

## Sauvegardes et maintenance

Sauvegarder ensemble la base MySQL, storage/app/private/, .env et le code.
La base contient les catégories, les métadonnées et le compte ; les PDF et
DOCX sont dans storage/app/private/, hors du dossier public.

Une mise à jour du code doit conserver .env, storage/ et les documents.
Les mises à jour de Laravel et des lecteurs se préparent en local avec le
fichier de verrouillage ; ne pas remplacer l’installation par une archive
vierge.

## En cas d’échec d’installation

Consulter storage/logs/installation.log par SFTP. Vérifier les informations
MySQL, les droits d’écriture, les extensions PHP et le transfert complet de
vendor/. Ne pas activer l’affichage des erreurs sur le site public.

Si .env a été créé pendant une installation partielle, l’installeur refuse
une deuxième exécution. Après analyse du journal, préparer une nouvelle base
vide, conserver une copie de la configuration échouée hors du serveur, puis
retirer .env et storage/installed.flag s’il existe. Retirer les caches PHP
générés dans bootstrap/cache/ en conservant le dossier. Recréer installation.key
avec 64 caractères hexadécimaux aléatoires avant de réessayer. Ne supprimer
aucune table d’une base qui n’est pas dédiée à cet essai.

La réinitialisation d’un mot de passe oublié par e-mail n’est pas incluse :
le propriétaire peut rétablir l’accès par une intervention de maintenance.

## Validation de cette livraison

- 17 tests d’intégration, 133 assertions : authentification et limitation des
  essais, mot de passe, autorisations, brouillons, lecture, dépôt/remplacement
  PDF/DOCX, nettoyage des fichiers, catégories, échappement HTML et CSRF en
  configuration production. Recherche : champs, mots-clés combinés, catégories,
  pagination, caractères spéciaux, validation et exclusion des brouillons.
- Tests exécutés avec PHP 8.5.10 et SQLite isolé.
- Syntaxe vérifiée avec la grammaire PHP 8.4.
- Dépendances résolues pour PHP 8.4 et verrouillées dans composer.lock.
- Les trois vues de l’aperçu ont été générées sans erreur et leurs ressources
  locales vérifiées. Le navigateur de vérification bloque les fichiers locaux :
  le rendu visuel reste à valider sur ordinateur et mobile. Aucun test sur OVH
  ou sa base MySQL. Vérifier l’installation et la lecture des fichiers sur le
  sous-domaine avant la bascule.

Le fichier HTML d’aperçu est un rendu statique des mêmes vues. Il permet
d’examiner la présentation, sans connexion ni enregistrement de fichiers.
