Déploiement : Laravel - HE-Arc/slides-devweb GitHub Wiki

Prérequis

  1. Clés publiques des membres du projet ajoutées sur Github
  2. Container créé
  3. Mail d'information reçu contenant : votre port, URL, etc...
  4. Au minimum le projet par défaut de laravel fonctionnel

Infos du container

  • 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

Connexion ssh au container

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]

Particularités de vos containers

Dossier sauvegardé

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.

Automatisation

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.

⚠️[IMPORTANT] Ajout de clé SSH supplémentaire⚠️

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 $'\nSSHKEY' >> /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. Le $ permet de prendre en compte le retour de ligne ajouter après le single quote du début.

Redémarrer le container et tester le script de démarrage

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 :

  1. Récupérer le PID du service tail en exécutant la commande top par exemple
  2. 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.

Logs

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.

Récupération de votre projet

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

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

Dossiers sauvegardés

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 :

Sauvegarde de la configuration

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

Restauration de la configuration

Si vous avez sauvegardé votre configuration, vous pouvez la restaurer avec

sudo cp /home/laravel/project/nginx-conf /etc/nginx/sites-enabled/default

Connexion à la base de données

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

Accès à l'application

L'url de votre application est la suivante : https://<PROJECT>.k8s.ing.he-arc.ch


Erreurs courantes

Pas d'erreurs apparentes / page blanches

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.

Problèmes de droits avec laravel.log

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

Problèmes de mixed-content

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

Documentations d'étudiants

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 :

⚠️ **GitHub.com Fallback** ⚠️