15 KiB
Documentation complète du déploiement - zapwall.fr
📋 Table des matières
- Vue d'ensemble
- Architecture du déploiement
- Configuration initiale
- Mise à jour du site
- Configuration HTTPS
- Scripts disponibles
- Dépannage
- 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
-
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)
- Conteneur :
-
Application Next.js : Application principale
- Service :
zapwall.service(systemd) - Port : 3001
- Répertoire :
/var/www/zapwall.fr
- Service :
-
Git : Dépôt source
- URL :
https://git.4nkweb.com/4nk/story-research-zapwall.git - Branche par défaut :
main
- URL :
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 :
[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 :
- Stash des modifications locales
- Pull depuis Git
- Installation des dépendances
- Construction de l'application
- Redémarrage du service
Utilisation :
# Depuis votre machine locale
./deploy.sh
# Ou depuis une autre branche
./deploy.sh develop
Méthode manuelle : Git sur le serveur
# 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 :
# 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
# 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
- Installation de certbot via snap :
sudo snap install certbot --classic
- Obtention des certificats (mode standalone, nginx arrêté) :
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
-
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
- Les certificats sont stockés dans
-
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 pourwww.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
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 :
# 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 :
sudo nano /usr/local/bin/renew-zapwall-cert.sh
Contenu :
#!/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 :
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 :
# Déploiement depuis la branche main (par défaut)
./deploy.sh
# Déploiement depuis une autre branche
./deploy.sh develop
Fonctionnalités :
- Vérifie et initialise le dépôt Git si nécessaire
- Sauvegarde les modifications locales (stash)
- Nettoie les fichiers non suivis
- Met à jour depuis la branche spécifiée (par défaut:
main) - Installe les dépendances (
npm ci) - Construit l'application (
npm run build) - Redémarre le service systemd
- 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
# 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
# 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
# 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 :
- Vérifier que la configuration zapwall.fr.conf est chargée :
# 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"'
- Si conf.d n'est pas inclus, corriger nginx.conf :
# 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'
- Vérifier la configuration zapwall.fr.conf :
# 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'
- Tester avec curl :
# 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 :
# 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
# 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
ssh <USER>@<IP> 'sudo journalctl -u zapwall -f'
Vérifier le statut du service
ssh <USER>@<IP> 'sudo systemctl status zapwall'
Redémarrer le service
ssh <USER>@<IP> 'sudo systemctl restart zapwall'
Vérifier les ports
# 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
# 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
# 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
- Mise à jour du code : Utiliser
update-remote-git.shrégulièrement - Renouvellement des certificats : Automatisé via cron (à configurer)
- Mise à jour des dépendances :
npm auditetnpm updatesi nécessaire - Nettoyage des logs : Rotation automatique via systemd/journald
- 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éploiementupdate-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 :
- Consulter les logs :
sudo journalctl -u zapwall -n 100 - Vérifier le statut :
sudo systemctl status zapwall - Vérifier la configuration : Utiliser les scripts de vérification
- Consulter cette documentation : Section Dépannage
Dernière mise à jour : 2025-12-28