# Guide de Déploiement en Production dans un Conteneur LXC Debian 12 Ce guide vous accompagne pas à pas pour déployer et configurer l'application **ChatbotAGGLO** au sein d'un conteneur LXC sous Debian 12 (Bookworm). --- ## 📋 Prérequis Système Le projet étant développé avec **Laravel 11+ / PHP 8.3**, **Vite** (Node.js), et un parseur PDF écrit en **Python**, les dépendances système requises sont : - **PHP 8.3** (avec extensions FPM, SQLite, cURL, MBString, XML, Zip, etc.) - **Composer** (Gestionnaire de dépendances PHP) - **Node.js 20+ & NPM** (Compilation des assets JS/CSS avec Vite) - **Nginx** (Serveur Web) - **Python 3 & dépendances** (`python-is-python3`, `PyMuPDF`/`fitz`, `requests`) - **Git** (Pour cloner et mettre à jour l'application) --- ## 🛠️ Guide d'Installation Pas à Pas ### Étape 1 : Mise à jour du système et installation des outils de base Connectez-vous à votre conteneur LXC et exécutez : ```bash apt update && apt upgrade -y apt install -y curl git unzip gnupg2 ca-certificates lsb-release apt-transport-https python-is-python3 ``` --- ### Étape 2 : Installation de PHP 8.3 (via le dépôt Sury) Debian 12 vient par défaut avec PHP 8.2. Pour installer PHP 8.3, nous ajoutons le dépôt officiel de Ondřej Surý : ```bash # Ajouter la clé GPG et le dépôt PHP curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list # Mettre à jour et installer PHP 8.3 et ses extensions apt update apt install -y php8.3-cli php8.3-fpm php8.3-sqlite3 php8.3-curl php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath php8.3-intl php8.3-readline php8.3-redis ``` --- ### Étape 3 : Installation de Composer Téléchargez et installez Composer globalement : ```bash curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer chmod +x /usr/local/bin/composer ``` --- ### Étape 4 : Installation de Node.js & NPM Utilisez le script officiel NodeSource pour installer Node.js LTS (version 20) : ```bash curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt install -y nodejs ``` --- ### Étape 5 : Installation des dépendances Python pour le parseur PDF Le script d'ingestion de PDF utilise les librairies Python `fitz` (PyMuPDF) et `requests`. Sous Debian 12 (norme PEP 668), il est recommandé de les installer via le gestionnaire de paquets système ou avec l'argument `--break-system-packages` : ```bash apt install -y python3-pip pip3 install pymupdf requests --break-system-packages ``` --- ### Étape 6 : Cloner l'application et installer les dépendances Déplacez-vous dans le répertoire de déploiement (généralement `/var/www/`) : ```bash cd /var/www git clone https://github.galiniere.net/jeremy/ChatbotAGGLO.git chatbot-agglo cd chatbot-agglo ``` #### Dépendances PHP & Node.js : ```bash # Installation des dépendances Composer pour la production composer install --no-dev --optimize-autoloader # Installation des dépendances NPM et compilation des assets de production npm install npm run build ``` --- ### Étape 7 : Configuration de l'environnement (`.env`) Copiez le fichier de configuration d'exemple : ```bash cp .env.example .env ``` Éditez le fichier `.env` (`nano .env`) pour y renseigner vos variables de production : - `APP_ENV=production` - `APP_DEBUG=false` - `APP_URL=https://chatbot.votre-domaine.fr` - Configurez vos clés d'API : - `MISTRAL_API_KEY=votre_cle_mistral` - `WEAVIATE_HOST=votre_hote_weaviate` - `WEAVIATE_API_KEY=votre_cle_weaviate` Générez la clé d'application Laravel : ```bash php artisan key:generate ``` --- ### Étape 8 : Base de données SQLite et permissions Créez la base de données SQLite vide et attribuez les droits d'écriture à l'utilisateur de Nginx (`www-data`) : ```bash touch database/database.sqlite chown -R www-data:www-data /var/www/chatbot-agglo chmod -R 775 /var/www/chatbot-agglo/storage chmod -R 775 /var/www/chatbot-agglo/bootstrap/cache chmod -R 775 /var/www/chatbot-agglo/database ``` Exécutez les migrations de base de données : ```bash php artisan migrate --force ``` --- ### Étape 9 : Configuration de Nginx & Augmentation de la capacité d'upload (100 Mo) #### 1. Configuration PHP-FPM et PHP-CLI Pour autoriser des uploads de 100 Mo, vous devez modifier la configuration de PHP. Éditez le fichier de configuration de PHP-FPM : ```bash nano /etc/php/8.3/fpm/php.ini ``` Et modifiez/ajoutez les valeurs suivantes (utilisez `Ctrl+W` pour rechercher) : ```ini upload_max_filesize = 100M post_max_size = 100M memory_limit = 256M max_execution_time = 300 ``` *(Faites de même dans `/etc/php/8.3/cli/php.ini` si nécessaire pour la CLI).* Redémarrez le service PHP-FPM pour appliquer : ```bash systemctl restart php8.3-fpm ``` #### 2. Configuration de Nginx Par défaut, Nginx limite les uploads à 1 Mo. Créez la configuration Nginx : ```bash nano /etc/nginx/sites-available/chatbot-agglo ``` Collez la configuration suivante (notez le `client_max_body_size 100M;`) : ```nginx server { listen 80; server_name chatbot.votre-domaine.fr; root /var/www/chatbot-agglo/public; # Limite d'upload à 100 Mo client_max_body_size 100M; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } } ``` Activez le site et redémarrez Nginx : ```bash ln -s /etc/nginx/sites-available/chatbot-agglo /etc/nginx/sites-enabled/ nginx -t systemctl restart nginx ``` --- ### Étape 10 : Configuration du Worker (Queue) Le système d'ingestion de sites web et de documents PDF utilise des files d'attente (Queues) en arrière-plan. Il est indispensable de faire tourner un daemon de file d'attente en production. Créez un service Systemd : ```bash nano /etc/systemd/system/laravel-worker.service ``` Ajoutez-y la configuration suivante : ```ini [Unit] Description=Laravel queue worker (ChatbotAGGLO) After=network.target [Service] User=www-data Group=www-data Restart=always ExecStart=/usr/bin/php /var/www/chatbot-agglo/artisan queue:work --queue=default --tries=3 --timeout=120 LimitNOFILE=65536 [Install] WantedBy=multi-user.target ``` Activez et démarrez le service : ```bash systemctl daemon-reload systemctl enable laravel-worker.service systemctl start laravel-worker.service ``` --- ### Étape 11 : Optimisations de Production Laravel Pour maximiser les performances de l'application en production, exécutez : ```bash php artisan config:cache php artisan route:cache php artisan view:cache php artisan event:cache ``` *(Note : Répétez ces commandes après chaque mise à jour du code).* --- ## 🔄 Comment mettre à jour le serveur distant après une modification du code ? Lorsque vous faites des modifications en local (comme changer la taille d'upload dans le code Laravel), voici la procédure pour mettre à jour votre serveur LXC distant via Git : 1. **Pousser les modifications depuis votre machine locale :** ```bash git add . git commit -m "Description des modifications" git push ``` 2. **Se connecter à votre conteneur LXC distant et récupérer les modifications :** ```bash cd /var/www/chatbot-agglo git pull origin main ``` 3. **Mettre à jour les dépendances (si composer.json ou package.json ont changé) :** ```bash composer install --no-dev --optimize-autoloader npm install npm run build ``` 4. **Exécuter les nouvelles migrations de base de données (si nécessaire) :** ```bash php artisan migrate --force ``` 5. **Vider et reconstruire le cache de Laravel (très important pour que les changements de config soient pris en compte) :** ```bash php artisan config:clear php artisan cache:clear php artisan config:cache php artisan route:cache php artisan view:cache ``` 6. **Redémarrer le worker de file d'attente (pour recharger le code PHP en cache CLI) :** ```bash systemctl restart laravel-worker.service ```