612 lines
15 KiB
Markdown

# 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** : `<IP>`
- **Utilisateur** : `<USER>`
- **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=<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 <USER>@<IP>
# 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 <USER>@<IP> "cd /var/www/zapwall.fr && tar -xzf -"
# Puis sur le serveur
ssh <USER>@<IP>
cd /var/www/zapwall.fr
npm ci
npm run build
sudo systemctl restart zapwall
```
### Gestion des stashes Git
```bash
# Voir les stashes
ssh <USER>@<IP> 'cd /var/www/zapwall.fr && git stash list'
# Restaurer le dernier stash
ssh <USER>@<IP> 'cd /var/www/zapwall.fr && git stash pop'
# Supprimer un stash
ssh <USER>@<IP> '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 <USER>@<IP>
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 <USER>@<IP> 'sudo journalctl -u zapwall -f'
# Vérifier le statut du service
ssh <USER>@<IP> 'sudo systemctl status zapwall'
# Voir les stashes Git
ssh <USER>@<IP> 'cd /var/www/zapwall.fr && git stash list'
# Restaurer un stash
ssh <USER>@<IP> 'cd /var/www/zapwall.fr && git stash pop'
```
---
## Dépannage
### Le service ne démarre pas
```bash
# Voir les logs
ssh <USER>@<IP> 'sudo journalctl -u zapwall -n 50'
# Vérifier le statut
ssh <USER>@<IP> 'sudo systemctl status zapwall'
# Vérifier que le répertoire existe
ssh <USER>@<IP> 'ls -la /var/www/zapwall.fr'
# Vérifier que l'application est construite
ssh <USER>@<IP> 'ls -la /var/www/zapwall.fr/.next'
```
### Le port 3001 n'est pas en écoute
```bash
# Vérifier que le service est actif
ssh <USER>@<IP> 'sudo systemctl status zapwall'
# Redémarrer le service
ssh <USER>@<IP> 'sudo systemctl restart zapwall'
# Vérifier les processus
ssh <USER>@<IP> '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 <USER>@<IP> '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 <USER>@<IP> '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 <USER>@<IP> '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 <USER>@<IP> 'sudo docker restart lecoffre_nginx_test'
```
3. **Vérifier la configuration zapwall.fr.conf** :
```bash
# Vérifier la configuration
ssh <USER>@<IP> '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 <USER>@<IP> 'sudo docker exec lecoffre_nginx_test nginx -t'
# Recharger nginx
ssh <USER>@<IP> 'sudo docker exec lecoffre_nginx_test nginx -s reload'
```
4. **Tester avec curl** :
```bash
# Simuler une requête pour zapwall.fr
ssh <USER>@<IP> '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 <USER>@<IP> '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 <USER>@<IP> 'cat > /var/www/zapwall.fr/next.config.js'
```
### Problèmes de certificats SSL
```bash
# Vérifier les certificats
ssh <USER>@<IP> 'sudo ls -la /etc/letsencrypt/live/zapwall.fr/'
# Vérifier dans le conteneur
ssh <USER>@<IP> 'sudo docker exec lecoffre_nginx_test ls -la /etc/letsencrypt/live/zapwall.fr/'
# Vérifier la configuration nginx
ssh <USER>@<IP> '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 <USER>@<IP> 'sudo journalctl -u zapwall -f'
```
#### Vérifier le statut du service
```bash
ssh <USER>@<IP> 'sudo systemctl status zapwall'
```
#### Redémarrer le service
```bash
ssh <USER>@<IP> 'sudo systemctl restart zapwall'
```
#### Vérifier les ports
```bash
# Port application
ssh <USER>@<IP> 'sudo ss -tuln | grep 3001'
# Ports HTTP/HTTPS
ssh <USER>@<IP> 'sudo ss -tuln | grep -E "(80|443)"'
```
#### Vérifier la configuration nginx
```bash
# Tester la configuration
ssh <USER>@<IP> 'sudo docker exec lecoffre_nginx_test nginx -t'
# Voir la configuration
ssh <USER>@<IP> 'sudo docker exec lecoffre_nginx_test cat /etc/nginx/conf.d/zapwall.fr.conf'
```
#### Vérifier le conteneur Docker
```bash
# Statut du conteneur
ssh <USER>@<IP> 'sudo docker ps | grep lecoffre_nginx_test'
# Logs du conteneur
ssh <USER>@<IP> '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*