15 KiB

Documentation complète du déploiement - zapwall.fr

📋 Table des matières

  1. Vue d'ensemble
  2. Architecture du déploiement
  3. Configuration initiale
  4. Mise à jour du site
  5. Configuration HTTPS
  6. Scripts disponibles
  7. Dépannage
  8. 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 :

[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 :

# 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

  1. Installation de certbot via snap :
sudo snap install certbot --classic
  1. 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
  1. 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
  2. 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

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 :

  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

# 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 :

  1. 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"'
  1. 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'
  1. 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'
  1. 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

  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


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

Dernière mise à jour : 2025-12-28