# Documentation complète du déploiement - zapwall.fr ## 📋 Table des matières 1. [Vue d'ensemble](#vue-densemble) 2. [Architecture du déploiement](#architecture-du-déploiement) 3. [Configuration initiale](#configuration-initiale) 4. [Mise à jour du site](#mise-à-jour-du-site) 5. [Configuration HTTPS](#configuration-https) 6. [Scripts disponibles](#scripts-disponibles) 7. [Dépannage](#dépannage) 8. [Maintenance](#maintenance) --- ## Vue d'ensemble ### Informations du serveur - **Serveur** : `` - **Utilisateur** : `` - **Domaine** : `zapwall.fr` - **Répertoire de l'application** : `/var/www/zapwall.fr` - **Port application** : `3001` - **Service systemd** : `zapwall.service` - **Nginx** : Conteneur Docker `lecoffre_nginx_test` ### État actuel - ✅ Application déployée et fonctionnelle - ✅ Service systemd actif - ✅ HTTPS configuré avec redirection automatique - ✅ Firewall configuré (ports 80/443 ouverts) - ✅ Certificats Let's Encrypt configurés (valides jusqu'au 2026-03-28) --- ## Architecture du déploiement ### Schéma d'architecture ``` Internet │ ▼ [Port 80/443] ← Firewall (UFW) │ ▼ [Nginx Docker Container] lecoffre_nginx_test │ (reverse proxy) ▼ [Port 3001] ← Application Next.js │ ▼ [zapwall.service] (systemd) │ ▼ [/var/www/zapwall.fr] (répertoire de l'application) ``` ### Composants 1. **Nginx (Docker)** : Reverse proxy gérant HTTP/HTTPS - Conteneur : `lecoffre_nginx_test` - Configuration : `/etc/nginx/conf.d/zapwall.fr.conf` (dans le conteneur) - Ports : 80 (HTTP), 443 (HTTPS) 2. **Application Next.js** : Application principale - Service : `zapwall.service` (systemd) - Port : 3001 - Répertoire : `/var/www/zapwall.fr` 3. **Git** : Dépôt source - URL : `https://git.4nkweb.com/4nk/story-research-zapwall.git` - Branche par défaut : `main` --- ## Configuration initiale ### Prérequis - Accès SSH au serveur - Docker installé et configuré - Node.js et npm installés - Git installé ### Structure des fichiers sur le serveur ``` /var/www/zapwall.fr/ # Répertoire de l'application ├── .next/ # Build de production Next.js ├── .git/ # Dépôt Git (si initialisé) ├── node_modules/ # Dépendances npm ├── pages/ # Pages Next.js ├── components/ # Composants React ├── lib/ # Bibliothèques ├── hooks/ # Hooks React ├── public/ # Fichiers statiques ├── styles/ # Styles CSS ├── package.json # Configuration npm └── next.config.js # Configuration Next.js /etc/systemd/system/zapwall.service # Service systemd ``` ### Service systemd Le service `zapwall.service` est configuré ainsi : ```ini [Unit] Description=Zapwall Next.js Application After=network.target [Service] Type=simple User= WorkingDirectory=/var/www/zapwall.fr Environment=NODE_ENV=production Environment=PORT=3001 ExecStart=/usr/bin/node /var/www/zapwall.fr/node_modules/.bin/next start -p 3001 Restart=always RestartSec=10 [Install] WantedBy=multi-user.target ``` ### Configuration Nginx La configuration nginx pour zapwall.fr se trouve dans le conteneur Docker à : `/etc/nginx/conf.d/zapwall.fr.conf` Elle configure : - Redirection HTTP → HTTPS - Reverse proxy vers `http://172.17.0.1:3001` - Headers de sécurité (HSTS, X-Frame-Options, etc.) - Support SSL/TLS --- ## Mise à jour du site ### Méthode recommandée : Script automatique Le script `deploy.sh` effectue automatiquement : 1. Stash des modifications locales 2. Pull depuis Git 3. Installation des dépendances 4. Construction de l'application 5. Redémarrage du service **Utilisation :** ```bash # Depuis votre machine locale ./deploy.sh # Ou depuis une autre branche ./deploy.sh develop ``` ### Méthode manuelle : Git sur le serveur ```bash # Se connecter au serveur ssh @ # Aller dans le répertoire cd /var/www/zapwall.fr # Sauvegarder les modifications locales git stash # Récupérer les dernières modifications git pull origin main # Installer les dépendances npm ci # Construire l'application npm run build # Redémarrer le service sudo systemctl restart zapwall # Vérifier le statut sudo systemctl status zapwall ``` ### Méthode alternative : Transfert depuis dépôt local Si Git n'est pas configuré sur le serveur : ```bash # Depuis votre machine locale tar --exclude='node_modules' \ --exclude='.next' \ --exclude='.git' \ --exclude='*.tsbuildinfo' \ --exclude='.env*.local' \ --exclude='.cursor' \ -czf - . | ssh @ "cd /var/www/zapwall.fr && tar -xzf -" # Puis sur le serveur ssh @ cd /var/www/zapwall.fr npm ci npm run build sudo systemctl restart zapwall ``` ### Gestion des stashes Git ```bash # Voir les stashes ssh @ 'cd /var/www/zapwall.fr && git stash list' # Restaurer le dernier stash ssh @ 'cd /var/www/zapwall.fr && git stash pop' # Supprimer un stash ssh @ 'cd /var/www/zapwall.fr && git stash drop stash@{0}' ``` --- ## Configuration HTTPS ### État actuel ✅ **Certificats Let's Encrypt configurés** pour `zapwall.fr` (obtenus via certbot snap). Les certificats sont valides jusqu'au **2026-03-28** et seront renouvelés automatiquement. ### Configuration des certificats Let's Encrypt Les certificats ont été obtenus via **certbot snap** (pour éviter le bug avec certbot et Python 3.11). #### Méthode utilisée 1. **Installation de certbot via snap** : ```bash sudo snap install certbot --classic ``` 2. **Obtention des certificats** (mode standalone, nginx arrêté) : ```bash sudo docker stop lecoffre_nginx_test sudo certbot certonly --standalone \ -d zapwall.fr \ --non-interactive \ --agree-tos \ --email admin@zapwall.fr sudo docker start lecoffre_nginx_test ``` 3. **Copie des certificats dans le volume monté** : - Les certificats sont stockés dans `/etc/letsencrypt/live/zapwall.fr/` sur l'hôte - Ils sont copiés dans `/home/debian/sites/test-lecoffreio.4nkweb.com/deploy/nginx/certbot/conf-test/` - Ce répertoire est monté dans le conteneur nginx en lecture seule à `/etc/letsencrypt` 4. **Mise à jour de la configuration nginx** : - `ssl_certificate /etc/letsencrypt/live/zapwall.fr/fullchain.pem;` - `ssl_certificate_key /etc/letsencrypt/live/zapwall.fr/privkey.pem;` #### Note importante - Les certificats sont valides uniquement pour `zapwall.fr` (pas pour `www.zapwall.fr`) - Pour ajouter `www.zapwall.fr`, il faut d'abord configurer le DNS pour pointer vers ce serveur, puis relancer certbot avec `-d zapwall.fr -d www.zapwall.fr` #### Option 2 : acme.sh ```bash ssh @ curl https://get.acme.sh | sh ~/.acme.sh/acme.sh --issue -d zapwall.fr --standalone ``` ### Renouvellement automatique des certificats Certbot snap configure automatiquement le renouvellement. Pour vérifier : ```bash # Vérifier le renouvellement automatique sudo snap run certbot renew --dry-run # Voir les tâches planifiées sudo systemctl list-timers | grep certbot ``` #### Script de renouvellement personnalisé (si nécessaire) Si vous devez copier les certificats dans le volume monté après renouvellement : ```bash sudo nano /usr/local/bin/renew-zapwall-cert.sh ``` Contenu : ```bash #!/bin/bash set -e DOMAIN="zapwall.fr" MOUNTED_LETSENCRYPT="/home/debian/sites/test-lecoffreio.4nkweb.com/deploy/nginx/certbot/conf-test" NGINX_CONTAINER="lecoffre_nginx_test" # Renouveler les certificats sudo certbot renew --quiet # Copier les nouveaux certificats dans le volume monté sudo cp /etc/letsencrypt/archive/${DOMAIN}/* ${MOUNTED_LETSENCRYPT}/archive/${DOMAIN}/ # Recharger nginx sudo docker exec ${NGINX_CONTAINER} nginx -s reload ``` Rendre exécutable et ajouter au cron : ```bash sudo chmod +x /usr/local/bin/renew-zapwall-cert.sh sudo crontab -e # Ajouter : 0 3 * * * /usr/local/bin/renew-zapwall-cert.sh ``` --- ## Script de déploiement ### `deploy.sh` Script unique pour déployer ou mettre à jour l'application. **Utilisation :** ```bash # Déploiement depuis la branche main (par défaut) ./deploy.sh # Déploiement depuis une autre branche ./deploy.sh develop ``` **Fonctionnalités :** 1. Vérifie et initialise le dépôt Git si nécessaire 2. Sauvegarde les modifications locales (stash) 3. Nettoie les fichiers non suivis 4. Met à jour depuis la branche spécifiée (par défaut: `main`) 5. Installe les dépendances (`npm ci`) 6. Construit l'application (`npm run build`) 7. Redémarre le service systemd 8. Vérifie que le service fonctionne correctement **Exemple de sortie :** ``` === Déploiement de zapwall.fr === Branche: main 1. Vérification du dépôt Git... ✓ Dépôt Git détecté Branche actuelle: main 2. Récupération des dernières modifications... 3. Sauvegarde des modifications locales... 4. Nettoyage des fichiers non suivis... 5. Vérification de la branche main... 6. Mise à jour depuis la branche main... 7. Dernier commit: abc1234 Fix: correction du bug 8. Installation des dépendances... 9. Construction de l'application... 10. Redémarrage du service zapwall... 11. Vérification du service... ✓ Service actif 12. Vérification du port 3001... ✓ Port 3001 en écoute === Déploiement terminé avec succès === ``` ### Commandes utiles après déploiement ```bash # Voir les logs en temps réel ssh @ 'sudo journalctl -u zapwall -f' # Vérifier le statut du service ssh @ 'sudo systemctl status zapwall' # Voir les stashes Git ssh @ 'cd /var/www/zapwall.fr && git stash list' # Restaurer un stash ssh @ 'cd /var/www/zapwall.fr && git stash pop' ``` --- ## Dépannage ### Le service ne démarre pas ```bash # Voir les logs ssh @ 'sudo journalctl -u zapwall -n 50' # Vérifier le statut ssh @ 'sudo systemctl status zapwall' # Vérifier que le répertoire existe ssh @ 'ls -la /var/www/zapwall.fr' # Vérifier que l'application est construite ssh @ 'ls -la /var/www/zapwall.fr/.next' ``` ### Le port 3001 n'est pas en écoute ```bash # Vérifier que le service est actif ssh @ 'sudo systemctl status zapwall' # Redémarrer le service ssh @ 'sudo systemctl restart zapwall' # Vérifier les processus ssh @ 'sudo ss -tuln | grep 3001' ``` ### Nginx ne sert pas le bon site Si nginx sert un autre site au lieu de zapwall.fr : 1. **Vérifier que la configuration zapwall.fr.conf est chargée** : ```bash # Vérifier si zapwall.fr est dans la configuration chargée ssh @ 'sudo docker exec lecoffre_nginx_test nginx -T 2>&1 | grep "server_name zapwall.fr"' # Si aucun résultat, vérifier que conf.d est inclus dans nginx.conf ssh @ 'sudo docker exec lecoffre_nginx_test cat /etc/nginx/nginx.conf | grep "include.*conf.d"' ``` 2. **Si conf.d n'est pas inclus, corriger nginx.conf** : ```bash # Le fichier est monté depuis l'hôte, modifier sur l'hôte ssh @ 'sudo tail -5 /home/debian/sites/test-lecoffreio.4nkweb.com/deploy/nginx/nginx-test.conf' # Ajouter l'inclusion avant la fermeture du bloc http (avant }) # Ajouter ces lignes avant le dernier } # # Include site configurations # include /etc/nginx/conf.d/*.conf; # Redémarrer le conteneur pour prendre en compte la modification ssh @ 'sudo docker restart lecoffre_nginx_test' ``` 3. **Vérifier la configuration zapwall.fr.conf** : ```bash # Vérifier la configuration ssh @ 'sudo docker exec lecoffre_nginx_test cat /etc/nginx/conf.d/zapwall.fr.conf' # Vérifier que proxy_pass pointe vers 172.17.0.1:3001 # Vérifier que server_name contient zapwall.fr # Tester la configuration ssh @ 'sudo docker exec lecoffre_nginx_test nginx -t' # Recharger nginx ssh @ 'sudo docker exec lecoffre_nginx_test nginx -s reload' ``` 4. **Tester avec curl** : ```bash # Simuler une requête pour zapwall.fr ssh @ 'sudo docker exec lecoffre_nginx_test curl -s -k -H "Host: zapwall.fr" https://localhost | head -5' ``` Voir aussi : `fixKnowledge/nginx-conf-d-not-loaded.md` pour plus de détails. ### Erreurs de build Si le build échoue à cause d'erreurs ESLint : ```bash # Vérifier que next.config.js ignore les erreurs ESLint ssh @ 'cat /var/www/zapwall.fr/next.config.js' # Si nécessaire, copier la configuration depuis le dépôt local cat next.config.js | ssh @ 'cat > /var/www/zapwall.fr/next.config.js' ``` ### Problèmes de certificats SSL ```bash # Vérifier les certificats ssh @ 'sudo ls -la /etc/letsencrypt/live/zapwall.fr/' # Vérifier dans le conteneur ssh @ 'sudo docker exec lecoffre_nginx_test ls -la /etc/letsencrypt/live/zapwall.fr/' # Vérifier la configuration nginx ssh @ 'sudo docker exec lecoffre_nginx_test grep ssl_certificate /etc/nginx/conf.d/zapwall.fr.conf' ``` --- ## Maintenance ### Commandes utiles #### Voir les logs en temps réel ```bash ssh @ 'sudo journalctl -u zapwall -f' ``` #### Vérifier le statut du service ```bash ssh @ 'sudo systemctl status zapwall' ``` #### Redémarrer le service ```bash ssh @ 'sudo systemctl restart zapwall' ``` #### Vérifier les ports ```bash # Port application ssh @ 'sudo ss -tuln | grep 3001' # Ports HTTP/HTTPS ssh @ 'sudo ss -tuln | grep -E "(80|443)"' ``` #### Vérifier la configuration nginx ```bash # Tester la configuration ssh @ 'sudo docker exec lecoffre_nginx_test nginx -t' # Voir la configuration ssh @ 'sudo docker exec lecoffre_nginx_test cat /etc/nginx/conf.d/zapwall.fr.conf' ``` #### Vérifier le conteneur Docker ```bash # Statut du conteneur ssh @ 'sudo docker ps | grep lecoffre_nginx_test' # Logs du conteneur ssh @ 'sudo docker logs lecoffre_nginx_test --tail 50' ``` ### Tâches de maintenance régulières 1. **Mise à jour du code** : Utiliser `update-remote-git.sh` régulièrement 2. **Renouvellement des certificats** : Automatisé via cron (à configurer) 3. **Mise à jour des dépendances** : `npm audit` et `npm update` si nécessaire 4. **Nettoyage des logs** : Rotation automatique via systemd/journald 5. **Surveillance** : Vérifier régulièrement les logs et le statut du service ### Sauvegarde Les fichiers importants à sauvegarder : - `/var/www/zapwall.fr/` : Code source et build - `/etc/systemd/system/zapwall.service` : Configuration du service - `/etc/letsencrypt/live/zapwall.fr/` : Certificats SSL (si Let's Encrypt) - Configuration nginx dans le conteneur Docker --- ## Références ### Documentation liée - `README-DEPLOYMENT.md` : Guide de déploiement détaillé - `RESUME-DEPLOIEMENT.md` : Résumé du déploiement - `update-summary.md` : Résumé des mises à jour ### Liens utiles - Dépôt Git : `https://git.4nkweb.com/4nk/story-research-zapwall.git` - Documentation Next.js : https://nextjs.org/docs - Documentation Let's Encrypt : https://letsencrypt.org/docs/ - Documentation systemd : https://www.freedesktop.org/software/systemd/man/ --- ## Support En cas de problème : 1. Consulter les logs : `sudo journalctl -u zapwall -n 100` 2. Vérifier le statut : `sudo systemctl status zapwall` 3. Vérifier la configuration : Utiliser les scripts de vérification 4. Consulter cette documentation : Section [Dépannage](#dépannage) --- *Dernière mise à jour : 2025-12-28*