Mettre en ligne chez OVH
Temps 1 · séance 5 · ~45 min
Les slides du chapitre (PDF)PDF
- Préparer le portfolio pour la production : dépendances sans les outils de développement, assets compilés en local.
- Envoyer le projet par FTP, dossier
public/buildcompris. - Configurer l'hébergement OVH : domaine, version de PHP,
.env, certificat SSL. - Servir les images de couverture sans lien symbolique.
- Vérifier en ligne une page, une image et l'envoi d'un vrai e-mail de contact.
Votre portfolio tourne sur votre machine. Ce chapitre le met à son adresse publique, sur un hébergement mutualisé d'OVH. Un hébergement mutualisé exécute PHP et sert des fichiers, rien d'autre : pas de Node, pas de Composer, pas de terminal. Tout ce qui demande ces outils se fait donc sur votre machine, avant l'envoi.
1. Préparer le projet
1.1. La base de données part avec le code
Votre portfolio utilise SQLite depuis le chapitre 1.04. Sa base est un seul fichier, database/database.sqlite, qui contient vos projets, vos étiquettes, votre compte du back-office et les messages de contact. Il part avec le reste du code : rien à exporter, rien à importer.
Le seeder ne tourne donc pas en ligne. La base part déjà remplie, et les images du disque public, captures du seeder comme images téléversées, partent elles aussi par FTP (section 6).
Attention
Les projets que vous avez encodés dans le back-office n'existent que dans database/database.sqlite. Ne lancez pas php artisan migrate:fresh --seed avant l'envoi : la commande vide toutes les tables, puis les remplit avec le seeder.
1.2. Les dépendances PHP sans les outils de développement
Le dossier vendor/ part lui aussi par FTP, puisque le serveur n'a pas Composer. Avant l'envoi, réinstallez-le sans les paquets de développement :
composer install --no-dev
Pest, Pint et les autres outils de développement sont retirés. Ils ne servent à rien sur le serveur, et le dossier à envoyer est plus petit. Après la mise en ligne, relancez composer install sans option sur votre machine : vos tests en ont besoin.
1.3. Les assets compilés
Vite compile vos pages Vue, le CSS de Tailwind et les polices. Le serveur d'OVH ne peut pas le faire à votre place. Arrêtez composer run dev avec Ctrl+C, puis compilez :
npm run build
✓ 3552 modules transformed.
✓ built in 3.07s
Le résultat est dans public/build : un fichier manifest.json, qui dit à Laravel quel fichier charger pour chaque page, le JavaScript et le CSS compilés, et les polices du chapitre 1.18. La commande régénère aussi les fichiers de Wayfinder (chapitre 1.08).
Ce dossier est ignoré par Git, et c'est voulu : on ne versionne pas un fichier qu'une commande produit. Un client FTP, lui, envoie ce qui est sur votre disque, Git ou pas. Après chaque modification d'une page, d'un composant ou de app.css, relancez npm run build et renvoyez public/build.
2. Envoyer les fichiers par FTP
Un client FTP comme FileZilla se connecte à l'espace d'hébergement avec l'adresse du serveur FTP, un nom d'utilisateur et un mot de passe. OVH les donne à la création de l'hébergement, et son interface permet de les retrouver ou de les changer.
Une fois connecté, envoyez le dossier du projet entier, sauf node_modules. Ce dossier contient les paquets JavaScript qui ont servi à compiler : plusieurs centaines de mégaoctets qui n'ont aucun rôle sur le serveur. Vérifiez que le fichier .env et les dossiers vendor et storage sont bien partis. Certains clients FTP cachent les fichiers dont le nom commence par un point.
Attention
Dans le dossier public, supprimez le fichier hot s'il existe. composer run dev le crée au démarrage de Vite, et ne le supprime pas toujours à l'arrêt. Tant qu'il est sur le serveur, Laravel demande les assets au serveur de Vite de votre machine, et la page reste blanche.

Après le transfert, vérifiez l'arborescence sur le serveur.
public/index.phpest présent : c'est le point d'entrée de l'application.bootstrap,configetstoragesont présents et contiennent leurs fichiers.public/buildcontientmanifest.jsonet le dossierassets. Sans lui, le site répond par une erreur 500, et le journalstorage/logs/laravel.logdu serveur contientVite manifest not found at:suivi du chemin du fichier.database/database.sqliteest présent.
3. Configurer l'hébergement
3.1. Le domaine pointe vers public
Dans l'interface OVH, ouvrez votre hébergement, puis la section « Multisite ». Elle liste les domaines et sous-domaines servis par l'hébergement, et le dossier que chacun sert.

Ajoutez votre domaine ou votre sous-domaine, ou modifiez celui qui existe. Le dossier racine doit être le dossier public de votre projet : c'est le seul dossier qu'un visiteur peut atteindre. Le reste du projet, .env et database.sqlite compris, reste hors de portée.


3.2. La version de PHP
L'interface OVH règle aussi la version de PHP de l'hébergement. Laravel 13 demande PHP 8.3 au moins, et les paquets installés dans votre portfolio demandent PHP 8.4.1 ou plus. Choisissez PHP 8.4, ou une version plus récente.
Composer vérifie la version au démarrage, dans vendor/composer/platform_check.php. Avec un PHP trop ancien, l'application refuse de démarrer, avec le message Your Composer dependencies require a PHP version ">= 8.4.1".
4. Le .env de production
Le fichier .env du serveur n'est pas celui de votre machine. Ouvrez-le avec votre client FTP et modifiez ces lignes :
APP_NAME="Nora Benali"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://votre-adresse.be
MAIL_MAILER=smtp
MAIL_SCHEME=null
MAIL_HOST=ssl0.ovh.net
MAIL_PORT=465
MAIL_USERNAME=contact@votre-adresse.be
MAIL_PASSWORD=mot_de_passe_du_compte_e-mail
MAIL_FROM_ADDRESS="contact@votre-adresse.be"
MAIL_FROM_NAME="${APP_NAME}"
Remplacez le nom, l'adresse du site et le compte e-mail par les vôtres. Ligne par ligne :
APP_ENV=productionetAPP_DEBUG=false. Une erreur n'affiche plus sa pile d'appels au visiteur, avec vos chemins et vos variables. Elle reste écrite dansstorage/logs/laravel.log.APP_KEYgarde la valeur de votre machine. Laravel chiffre avec elle les sessions et les cookies. Si la ligne est vide, générez-la en local avecphp artisan key:generateet recopiez-la.APP_URLest l'adresse publique du site, enhttps. Laravel construit avec elle l'adresse de chaque image de couverture (chapitre 1.14) et la baliseog:image(chapitre 1.19). Avecportfolio.testresté ici, chaque image pointe vers votre machine.MAIL_MAILER=smtpremplacelog: l'e-mail de contact du chapitre 1.20 part pour de vrai, par le serveur d'e-mail d'OVH.MAIL_HOSTetMAIL_PORTsont ceux d'un compte e-mail d'hébergement mutualisé OVH,ssl0.ovh.netsur le port 465 en SSL. L'interface OVH les affiche dans la fiche de votre compte e-mail : relisez-les là.MAIL_USERNAMEest l'adresse complète du compte,MAIL_PASSWORDson mot de passe.MAIL_SCHEME=nullreste tel quel. Avec le port 465 et aucun schéma, Laravel choisit lui-même une connexion chiffrée,smtps.MAIL_FROM_ADDRESSsert deux fois : c'est l'expéditeur de l'e-mail, et son destinataire, puisqueContactControllerenvoie le message à cette adresse. Utilisez une adresse du compte OVH. Un serveur d'e-mail refuse souvent d'envoyer au nom d'une adresse qui n'est pas la sienne.
Avec SQLite, la ligne DB_CONNECTION=sqlite du kit ne change pas : Laravel trouve database/database.sqlite sans autre réglage.
5. Le certificat SSL
Un certificat SSL chiffre ce qui passe entre le visiteur et le serveur, et donne le cadenas de la barre d'adresse. Sans lui, le navigateur affiche « Non sécurisé » devant votre portfolio, et le formulaire de contact envoie le message du visiteur en clair.
Dans l'interface OVH, ouvrez l'hébergement, puis sa gestion du SSL. OVH fournit un certificat gratuit, Let's Encrypt. Activez-le, ou régénérez-le si vous venez d'ajouter un domaine. L'installation prend de quelques minutes à quelques heures.

6. Les images sans lien symbolique
La bonne pratique est celle de votre machine. Le disque public écrit dans storage/app/public, hors du dossier que le serveur web sert. Le lien symbolique public/storage, créé par php artisan storage:link au chapitre 1.06, rend ce dossier visible au navigateur. Sur un serveur où vous avez un terminal, vous lancez la même commande une fois, et rien d'autre ne change.
OVH est une exception. Son hébergement mutualisé ne suit pas les liens symboliques, et vous n'y avez pas de terminal. Là seulement, le disque public écrit directement dans public/storage.
Ce qui change entre votre machine et le serveur se règle dans .env, jamais dans le code : c'est ce que vous avez fait pour APP_URL et pour l'e-mail. La racine du disque suit la même règle. Dans config/filesystems.php, dans la section disks, une seule ligne du disque public change, root. Elle valait storage_path('app/public') :
'public' => [
'driver' => 'local',
'root' => env('FILESYSTEM_PUBLIC_ROOT') === 'public'
? public_path('storage')
: storage_path('app/public'),
'url' => rtrim((string) env('APP_URL', 'http://localhost'), '/').'/storage',
'visibility' => 'public',
'throw' => false,
'report' => false,
],
Sans la variable, le disque garde storage/app/public : rien ne change sur votre machine, et vos captures restent dans le dossier versionné. Dans le .env du serveur, celui de la section 4, ajoutez la ligne qui déclenche l'exception :
FILESYSTEM_PUBLIC_ROOT=public
Le fichier config/filesystems.php modifié part avec le code, comme n'importe quel autre fichier.
Sur le serveur, supprimez le dossier ou le lien public/storage que le transfert a pu créer, puis créez un vrai dossier public/storage. Envoyez-y tout le contenu de votre storage/app/public local : le dossier images, avec les captures du seeder, et le dossier projects, avec les images téléversées depuis votre back-office. La colonne cover_path de chaque projet contient un chemin relatif au disque, comme images/meteo-wavre.jpg ou projects/4ayJrdZUcgdYpkLWFkKDnh9KJ9rxhzsP2pfcjaGy.jpg. Avec la nouvelle racine, images/meteo-wavre.jpg désigne public/storage/images/meteo-wavre.jpg, et son adresse reste /storage/images/meteo-wavre.jpg.
Testez ensuite depuis le back-office en ligne : téléversez une nouvelle image pour un projet. Elle arrive dans public/storage/projects, et sa fiche l'affiche.
7. Vérifier le portfolio en ligne
Ouvrez votre site à son adresse publique, en https, dans une fenêtre de navigation privée.
- Une page. L'accueil s'affiche avec vos couleurs et vos polices, sans erreur dans la console du navigateur. Le cadenas est présent.
- Une image. Une fiche de projet montre son image de couverture. Clic droit sur l'image, « Ouvrir l'image dans un nouvel onglet » : son adresse commence par votre
APP_URL, suivie de/storage/images/pour un projet du seeder, ou de/storage/projects/pour une image téléversée depuis le back-office. - Le formulaire de contact. Envoyez-vous un message depuis le site. Le message de confirmation s'affiche, et un vrai e-mail arrive dans la boîte de
MAIL_FROM_ADDRESS. « Répondre » écrit à l'adresse saisie dans le formulaire. - Le back-office.
/loginaccepte votre compte, et/admin/projetsliste vos projets. Changez le mot de passepassworddu seeder dans les réglages du compte : en production, le kit exige au moins douze caractères. - L'aperçu Open Graph. Collez l'adresse d'une fiche dans un outil d'aperçu, comme le débogueur de partage de Facebook ou opengraph.xyz. La carte montre le titre, le résumé et l'image du projet (chapitre 1.19).
Si une page répond par une erreur 500, lisez la fin de storage/logs/laravel.log sur le serveur, avec votre client FTP. APP_DEBUG=false cache le détail aux visiteurs, mais Laravel l'écrit toujours dans ce journal.
Pratique : votre portfolio en ligne (25 min)
Temps annoncé : 25 minutes.
- Le dossier
public/buildest sur le serveur, et le fichierpublic/hotn'y est pas. - La version de PHP de l'hébergement est 8.4 ou plus.
- Le
.envdu serveur aAPP_ENV=production,APP_DEBUG=falseet l'adresse publique du site dansAPP_URL. - L'accueil s'affiche en
https, avec vos couleurs et vos polices. - Une fiche de projet montre son image de couverture, servie depuis
/storage/images/ou/storage/projects/. - Un message envoyé par le formulaire de contact arrive dans votre boîte e-mail.
- Le mot de passe du seeder est remplacé.
- Un outil d'aperçu montre l'image et le résumé d'une fiche.
Ce que votre portfolio contient maintenant
Une adresse publique en https, chez OVH. Le site compilé sert vos pages, vos polices et vos images, et le formulaire de contact envoie un vrai e-mail. Un lien vers une fiche, partagé sur un réseau, montre son titre, son résumé et son image.
À retenir
- Le serveur n'exécute que PHP, donc
composer install --no-devetnpm run buildse font en local, etvendorcommepublic/buildpartent par FTP. - Le fichier
public/hotne doit jamais être sur le serveur, sinon la page reste blanche. - Le portfolio demande PHP 8.4.1 ou plus, à régler dans l'interface d'OVH, et le domaine pointe vers le dossier
public. - En ligne,
APP_URLest l'adresse publique enhttps,APP_DEBUGvautfalse, etMAIL_MAILER=smtpenvoie l'e-mail de contact par le serveur d'OVH. - Le disque
storage/app/publicet son lien symbolique restent la bonne pratique. OVH est l'exception :FILESYSTEM_PUBLIC_ROOT=publicdans le.envdu serveur fait écrire le disque danspublic/storage, où vous envoyez toutstorage/app/public,images/etprojects/, puisque le seeder ne tourne pas en ligne.
