Déployer le site CV — Nginx + HTTPS (OVH / Debian)

Guide pas-à-pas basé sur ma mise en prod OVH VPS Debian Nginx Let’s Encrypt

1) Prérequis

2) Upload des fichiers

Depuis Windows (WinSCP)
Hôte : @IP
Utilisateur : debian
Mot de passe : <votre mdp>
Dossier distant : /var/www/nico-cv/
Depuis Linux / PowerShell (SCP)
scp -r /chemin/local/cvsite/public/* mrobot@IP:/var/www/nico-cv/

Permissions (si besoin) :

sudo chown -R www-data:www-data /var/www/nico-cv
sudo find /var/www/nico-cv -type d -exec chmod 755 {} \;
sudo find /var/www/nico-cv -type f -exec chmod 644 {} \;

3) DNS OVH

Vérifier :

nslookup nicolas-sapin.fr
dig +short A nicolas-sapin.fr

4) Nginx — vhost initial (HTTP)

Créer le vhost :

sudo nano /etc/nginx/sites-available/nicolas-sapin.fr
server {
  listen 80;
  listen [::]:80;
  server_name nicolas-sapin.fr www.nicolas-sapin.fr;
  root /var/www/nico-cv;
  index index.html;
  access_log /var/log/nginx/nicolas-sapin_access.log;
  error_log  /var/log/nginx/nicolas-sapin_error.log;

  location / {
    try_files $uri $uri/ =404;
  }
}
sudo ln -s /etc/nginx/sites-available/nicolas-sapin.fr /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

5) Activer HTTPS (Let’s Encrypt)

Générer et configurer le certificat automatiquement :

sudo certbot --nginx -d nicolas-sapin.fr -d www.nicolas-sapin.fr

Tester la tâche de renouvellement :

sudo certbot renew --dry-run
Note : si erreur options-ssl-nginx.conf introuvable, laisser certbot --nginx régénérer le bloc SSL. Éviter de référencer manuellement des chemins Let’s Encrypt tant que le package ne les a pas créés.

6) Vhost propre (redirect + headers + cache)

Pour un vhost « propre » (après Certbot), vous pouvez utiliser ce modèle :

server {
  listen 80;
  listen [::]:80;
  server_name nicolas-sapin.fr www.nicolas-sapin.fr;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name nicolas-sapin.fr www.nicolas-sapin.fr;

  root /var/www/nico-cv;
  index index.html;

  # Certbot gère ces chemins (ne pas modifier manuellement)
  ssl_certificate     /etc/letsencrypt/live/nicolas-sapin.fr/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/nicolas-sapin.fr/privkey.pem;

  # Sécurité (basique)
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-Content-Type-Options "nosniff" always;
  add_header Referrer-Policy "strict-origin-when-cross-origin" always;
  add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

  # Static & cache
  location ~* \.(?:css|js|png|jpg|jpeg|gif|ico|svg|webp|pdf|woff2?)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000, immutable";
    try_files $uri =404;
  }

  location / {
    try_files $uri $uri/ =404;
  }

  access_log /var/log/nginx/nicolas-sapin_access.log;
  error_log  /var/log/nginx/nicolas-sapin_error.log;
}
sudo nginx -t && sudo systemctl reload nginx

7) Dépannage (issues rencontrées)

8) Vérifications rapides

curl -I http://nicolas-sapin.fr
curl -I https://nicolas-sapin.fr

Et contrôles navigateur : cadenas TLS, redirection HTTP→HTTPS, pas d’erreurs console, 200 sur /assets/*, pas de cookies non voulus.

← Retour aux réalisations
OVH Debian Nginx Let’s Encrypt