-
Notifications
You must be signed in to change notification settings - Fork 13
Déploiement : Laravel
- Clés publiques des membres du projet ajoutées sur Github
- Container créé
- Mail d'information reçu contenant : votre port, URL, etc...
- Au minimum le projet par défaut de laravel fonctionnel
- Image Docker : basée sur debian bullseye 11.6
- Nginx : 1.18.0
- PHP : 8.2.4
- Node.js : 18.18
- NPM : 9.8.1
Connectez-vous en ssh avec l'utilisateur laravel
avec la clé que vous avez ajoutée sur github et sur le port communiqué par email.
Avant de vous connecter, vérifiez que votre clé ssh est ajoutée dans votre agent ssh local.
ssh -p<PORT> [email protected]
Tout se qui se trouve dans le dossier /home/laravel/project/
seront sauvegardés. Nous avons donc mis en place des liens symboliques entre plusieurs fichiers de configuration placés à divers endroits sur votre container. Vous pourrez travailler uniquement dans le dossier project, afin de permettre d'éviter tout problème avec vos configurations en cas de redémarrage de votre container, plus de détails vous seront donnés dans la suite de cette documentation.
En cas de modification / recréation du container, seul le contenu de ce dossier "project" sera restauré veillez à garder les éléments importants dans ce dossier.
En cas de redémarrage de votre container, tout est supprimé et remis à zéro, sauf votre dossier "project".
Dans certains cas vous pourriez avoir besoin d'installer des bibliothèques, avoir besoin de mettre en place un CICD, avoir besoin de démarrer certaines commandes pour automatiser une partie ou tout votre déploiement, etc.
Afin de vous permettre de mettre ces choses en place, sans les perdre en cas de redémarrage et remise à zéro de votre container, nous vous avons mis en place un fichier nommé custom-start.sh
placé dans le dossier sauvegardé "project". Ce fichier est un script qui est exécuté automatiquement à chaque redémarrage de votre container.
Exemple 1: si vous souhaitez installer automatiquement les dépendances de votre projet Django, vous pourriez imaginer de le faire via ce script.
Exemple 2 : si vous souhaitez mettre en place un CICD, vous pourriez scripter les étapes de configuration afin de les automatiser.
Vous n'êtes évidemment pas obligé de faire cela, mais dans le cas d'un crash ou redémarrage incontrôlé ou contrôlé de votre container, vous serez responsable de réaliser à nouveau toutes les étapes de configuration que vous avez réalisées la première fois.
Pour ajouter des clés SSH supplémentaires sur vos serveur, vous pouvez utiliser la commande suivante dans le script de démarrage custom-starth.sh
.
echo "SSHKEY" >> /home/laravel/.ssh/authorized_keys
Remplacer SSHKEY
par le contenu d'une clé publique et dupliquer la ligne si vous souhaitez en ajouter d'autre.
Afin de tester si votre script de redémarrage fonctionne correctement il faut faire redémarrer votre container, afin d'éviter que vous deviez venir nous demander de le faire toutes les 5min, vous pouvez simplement effectuer les étapes suivantes :
- Récupérer le PID du service
tail
en exécutant la commandetop
par exemple - Exécuter la commande
sudo kill <PID>
, où peut être remplacé par le PID du service tail
Suite à cette commande, le container va "crash". Notre système Kubernetes prendra ensuite le relais en détectant automatiquement le "crash" et redémarrera votre container. Ce processus ne devrait pas prendre plus de quelques secondes, soyez un petit peu patient ;) Si vous n'avez toujours pas accès à votre container après 5min environ, c'est qu'il y a un autre problème, n'hésitez pas à nous contacter.
Il existe également un fichier nommé custom-start.log
qui stocke toutes les erreurs provoquées par votre script en cas de problème au démarrage du container. Cela vous sera utile en cas de redémarrage pour savoir si votre script à eu des soucis et lesquels, pas besoin donc de toucher à ce fichier, il est géré par le container lui-même.
Vous pouvez cloner votre projet sur le serveur de déploiement dans le dossier /home/laravel/project/
. Utilisez idéalement SSH avec une clé de déploiement.
Source pour générer et utiliser des clés de déploiement : https://docs.github.com/en/developers/overview/managing-deploy-keys#deploy-keys
Nginx est utilisé comme serveur web sur le container. La configuration se trouve dans /etc/nginx/sites-enabled/default
Configuration par défaut :
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
La configuration par défaut pointe vers
/var/www
.
Modifier (sudo) ce fichier pour faire pointer la configuration vers le dossier public de votre projet, par exemple /home/laravel/project/MY_PROJECT/public
.
Si vous souhaitez ajouter un frontend séparé. Vous pouvez modifier ce fichier en conséquence en ajoutant par exemple :
location /app {
root <WHEREMYFRONTENDIS>;
index index.html index.php;
}
Si vous changez la configuration nginx, vous devrez redémarrer nginx avec sudo service nginx restart
Les fichiers placés dans /home/laravel/project
seront sauvegardés. Si vous faites des modifications sur la configuration Nginx, veillez à garder l'ancienne et la nouvelle version dans ce dossier.
En cas de modification / recréation du container, seul le contenu de ce dossier sera restauré veillez à garder tout document important dans ce dossier
Il est également recommandé de placer votre projet dans ce dossier pour le maintenir sauvegardé.
Si vous avez besoin de sauvegarder ou restaurer la configuration Nginx, vous pouvez utiliser cp
comme expliqué ci-dessous :
Pour sauvegarder votre configuration nginx vous pouvez faire une copie dans le dossier backup
sudo cp /etc/nginx/sites-enabled/default /home/laravel/project/nginx-conf
Si vous avez sauvegardé votre configuration, vous pouvez la restaurer avec
sudo cp /home/laravel/project/nginx-conf /etc/nginx/sites-enabled/default
Dans le dossier /root/config-mount
et /root/secret-mount
vous trouverez vos identifiants de connexion à la base de données. Notamment mysql-host
, mysql-database
, mysql-username
, mysql-password
et mysql-port
. Ceux-ci sont uniquement accessibles en root (sudo su).
Vous devrez utiliser ces données dans votre .env
pour que laravel puisse se connecter à la base de données
L'url de votre application est la suivante : https://<PROJECT>.k8s.ing.he-arc.ch
Mettre le paramètre APP_DEBUG
du .env
à true
pour que Laravel vous renvoie davantage de détails sur les erreurs.
IMPORTANT : Une fois votre déploiement réussi, remettez ce paramètre à
false
.
Laravel affiche une page blanche ou certaines fonctionnalités ne fonctionnent pas correctement.
Cela est probablement dû au fait que Laravel n'a pas les droits suffisant pour accéder à certains fichiers sur le serveur, vous pouvez vérifier les droits sur les dossiers dans votre projet. Voici ce que vous devriez faire si jamais les mauvais droits seront appliqués aux dossiers :
# permet de modifier la propriété de tous les dossiers et fichiers du projet
sudo chown laravel:www-data -R /home/laravel/project/<my_project>
# permet de modifier les permissions de tous les dossiers et fichiers du projet
sudo chmod -R 770 /home/laravel/project/<my_project>
# permet de modifier les permissions de tous les dossiers et fichiers du dossier public
sudo chmod -R 775 /home/laravel/project/<my_project>/public
Le site fonctionne en local, mais pas en prod / le site à des erreurs de mixed-content / seul la page d'accueil charge.
Le problème vient du fait que le serveur utilise du HTTPS, et Laravel n'est pas configuré pour utiliser du HTTPS sur toutes les requêtes. Pour résoudre le problème il faut éditer le fichier app/Providers/AppServiceProvider.php, en particulier la méthode boot et ajoutez-y le code suivant:
if (env('APP_ENV') === 'production') {
URL::forceScheme('https');
}
N'oubliez pas d'inclure en début de fichier.
use Illuminate\Support\Facades\URL;
Pour ceux qui souhaitent plus de détails, voir https://shouts.dev/force-laravel-to-use-https-connection#step2
Si vous avez écrit de la documentation à propos de votre déploiement, sur le wiki de votre projet ou ailleurs, vous pouvez indiquer le lien de cette dernière ci-dessous :