Laravel : – Images ne se chargent après nettoyage du VPS

04:50:20

Le problème : –  Après un nettoyage du VPS, les images ne se chargent plus car les fichiers physiques ont probablement été supprimés du serveur alors que les références en base de données existent encore.

Diagnostic rapide  en local :

Vérifier la structure de stockage
ls -la back/storage/app/public/
ls -la back/public/storage/

# Vérifier le lien symbolique
php artisan storage:link

 

Diagnostic en production via Docker

1. Vérifier l’état du stockage dans le conteneur API

# Entrer dans le conteneur API Laravel
docker exec -it api bash

# Vérifier la structure du stockage
ls -la storage/app/public/
ls -la storage/app/public/uploads/

# Vérifier le lien symbolique
ls -la public/storage/

# Sortir du conteneur
exit

2. Vérifier les logs des conteneurs

# Logs du conteneur API (Laravel)
docker logs api --tail=50

# Logs du conteneur frontend
docker logs frontend --tail=50

# Logs Traefik (proxy)
docker logs traefik --tail=50

Tester l’accès direct aux images

# Dans le conteneur API, tester si une image existe
docker exec -it api bash
curl -I http://localhost/storage/uploads/V40dVl1jPzXqrJzbfmocdEQPBsZHCxiOqGFle6va.jpg
exit

4. Vérifier la configuration Laravel dans le conteneur

# Entrer dans le conteneur API
docker exec -it api bash

# Vérifier la configuration
php artisan config:show filesystems
php artisan route:list | grep storage

# Recréer le lien symbolique si nécessaire
php artisan storage:link

# Vérifier les permissions
ls -la storage/
ls -la public/

exit

Solution immédiate

# Dans le conteneur API
docker exec -it api bash

# Créer le lien symbolique manquant
php artisan storage:link

# Vérifier que le lien est créé
ls -la public/storage/

# Tester l'accès à une image
curl -I http://localhost/storage/uploads/V40dVl1jPzXqrJzbfmocdEQPBsZHCxiOqGFle6va.jpg

exit

Test depuis le navigateur

Après avoir créé le lien, testez directement dans votre navigateur : https://api.xxx.com/storage/uploads/V40dVl1jPzXqrJzbfmocdEQPBsZHCxiOqGFle6va.jpg

Pour éviter le problème à l’avenir

Option 1 : Modifier le Dockerfile du backend

Fichier : back/Dockerfile dockerfile/**

/**
 * 🇬🇧 Add storage link creation in the Docker build
 * 🇫🇷 Ajouter la création du lien de stockage dans le build Docker
 */

# Après l'installation des dépendances, ajouter :
RUN php artisan storage:link

Option 2 : Modifier le script de déploiement

Fichier : deploy/deploy.sh

#!/bin/bash

/**
 * 🇬🇧 Ensure storage link exists after deployment
 * 🇫🇷 S'assurer que le lien de stockage existe après le déploiement
 */

# Ajouter après le démarrage des conteneurs :
docker exec api php artisan storage:link