Skip to content

Instantly share code, notes, and snippets.

@twispr
Last active October 7, 2024 20:54
Show Gist options
  • Select an option

  • Save twispr/1356d9edf7f4e15603c851323b77ad1f to your computer and use it in GitHub Desktop.

Select an option

Save twispr/1356d9edf7f4e15603c851323b77ad1f to your computer and use it in GitHub Desktop.
Configuration d'un VPS OVH / LAMP / Ci-CD Symfony 6

Pré-requis

  • Un projet Symfony 5/6 versionné avec "git" et hébergé (GitHub, GitLab...).
  • Un VPS OVH et un nom de domaine.

Création des clés SSH sur votre poste local

Générez les clés SSH publique et privée sur votre poste local. Vérifiez que votre répertoire $HOME contient un dossier .ssh. Si le dossier n’existe pas, créez-le :

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

Utilisez la commande suivante pour créer une clé RSA 4096 bits :

$ cd ~/.ssh
$ ssh-keygen -b 4096

L’utilisation de l’option -t avec cette commande vous permet de spécifier une autre méthode de chiffrement, par exemple :

$ ssh-keygen -t ecdsa -a 256

Donnez un nom à votre clé SSH ou laissez le nom par défaut id_rsa et ajoutez une passphrase pour plus de sécurité. Ceci génère deux fichiers : nom_clé (clé privée), et nom_clé.pub (clé publique), dans le dossier .ssh.

Ajout de la clé SSH sur OVH

Dans votre espace client OVH, accédez à votre compte en cliquant sur votre nom en haut à droite puis sur l'icône Mes services située sous le titre Raccourcis ou directement sur la barre latérale à gauche. Enfin, cliquez sur l'onglet Clés SSH.

Pour enregistrer une nouvelle clé SSH, cliquez sur le bouton Ajouter une clé SSH puis sur Dédié.

Affichez votre clé publique sur votre poste local :

$ cat ~/.ssh/nom_clé.pub

Copiez-collez le résulat sur OVH puis validez.

Réinstallation du VPS avec la clé SSH

NOTE : Attention ! Ceci supprimera toutes les données sur votre serveur.

Dans le menu principal sur OVH, cliquez sur le lien Bare Metal Cloud, puis sur Serveurs privés virtuels dans la barre latérale à gauche et enfin sur le nom de votre VPS.

Dans la section Votre VPS, cliquez sur l'icône ... à droite de OS/Distribution puis sur Réinstaller mon VPS.

Sélectionnez la distribution que vous souhaitez installer (ici Ubuntu 20.04 LTS) puis sélectionnez la clé SSH précédemment ajouter sur votre compte. Cliquez ensuite sur le bouton Confirmer.

Connexion au VPS et mise à jour

Par défaut, OVH créer pour vous un utilisateur avec des droits restreints ainsi qu'un mot de passe. Entrez la commande suivante pour vous connectez au VPS :

$ ssh nom_d_utilisateur@vps-xxxxxxxxx.ovh.net

NOTE : Si vous avez effectué une réinstallation et que vous vous étiez déjà connecté en SSH sur le serveur, supprimez la clé commençant par vps-xxxxxxxxx.ovh.net située dans le fichier ~/.ssh/known_hosts de votre poste local.

Lors de la première connexion, un message de confirmation va apparaître pour ajouter l'empreinte de l'hôte dans le fichier ~/.ssh/known_hosts

The authenticity of host 'vps-xxxxxxxxx.ovh.net (000.00.000.000)' can't be established.
ECDSA key fingerprint is SHA256:*****************************************.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Entrez yes puis appuyez sur ENTRÉE pour vous connecter.

Enfin, mettez à jour les dépendances de votre distribution (ici Ubuntu) puis effectuez un soft reboot de VPS :

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot

NOTE : Si vous souhaitez effectuer un hard reboot, dans ce cas il faudra vous rendre sur la page de votre VPS sur OVH, dans la section Votre VPS, cliquez sur l'icône ... à droite de Boot puis sur Redémarrer mon VPS.

Sécurisation du VPS

Modifier le port d’écoute par défaut du service SSH

Pour commencer, configurez le service SSH en changeant le port d’écoute. Il est défini sur le port 22 par défaut :

$ sudo nano /etc/ssh/sshd_config

Trouvez ensuite la ligne suivante :

#Port 22

NOTE : Pour Ubuntu 23.04 et versions ultérieures :

Décommentez et remplacez le numéro 22 par le numéro de port de votre choix. N’entrez pas de numéro de port déjà utilisé sur votre système. Pour des raisons de sécurité, utilisez un nombre compris entre 49152 et 65535.

Pour voir les ports utilisés :

$ netstat -nat | grep LISTEN
tcp        0      0 127.0.0.*:**           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.*:****         0.0.0.0:*               LISTEN

Enregistrez et quittez le fichier de configuration.

Redémarrez le service :

$ sudo systemctl restart sshd

Cela devrait suffire pour appliquer les modifications. Si jamais cela ne fonctionne pas, effectuez un soft reboot du VPS :

$ sudo reboot

N'oubliez pas que, désormais, vous devez indiquer le nouveau port chaque fois que vous demandez un connexion SSH à votre VPS, par exemple :

$ ssh nom_d_utilisateur@vps-xxxxxxxxx.ovh.net -p nouveau_port

Modifier les mots de passe utilisateurs

Il est recommandé de modifier votre mot de passe utilisateur :

$ sudo passwd nom_d_utilisateur
New password: ******
Retype new password: ******
passwd: password updated successfully

NOTE : Les mots de passes ne sont pas affichés pour des raisons de sécurité.

Basculez ensuite vers l’utilisateur root et définissez votre mot de passe administrateur :

$ sudo su -
$ passwd
New password: ******
Retype new password: ******
passwd: password updated successfully

Effectuez un soft reboot pour appliquer les modifications :

$ sudo reboot

Désactivation de l’accès au serveur via l’utilisateur root

L’utilisateur root est créé par défaut sur les systèmes GNU/Linux. L’accès root signifie avoir le plus d’autorisations sur un système d’exploitation. Il n’est pas recommandé et même dangereux de laisser votre VPS accessible uniquement par le biais de l’accès root, car ce compte peut effectuer des opérations irréversiblement dommageables.

Il est recommandé de désactiver l’accès direct à l’utilisateur root via le protocole SSH. Si vous n'avez pas, n’oubliez pas de créer un autre utilisateur avec des droits restreints avant de suivre les étapes ci-dessous.

Modifiez le fichier de configuration SSH :

$ sudo nano /etc/ssh/sshd_config

Localisez la section suivante :

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes

Décommentez la ligne PermitRootLogin et remplacez prohibit-password par no.

Enregistrez et quittez le fichier de configuration.

Redémarrez le service :

$ sudo systemctl restart sshd

Si vous avez besoin d'accéder à l'utilisateur root, utilisez la commande :

$ su root

Définition de la locale du VPS

Afin de résoudre les messages d'erreurs éventuels lors de la mise à jour des paquets, définissez la locale par défaut du VPS :

$ sudo dpkg-reconfigure locales

Dans la liste des locales qui s'affiche, sélectionnez en_US.UTF-8 UTF-8 grace aux flèches directionnelles et appuyez sur ENTRÉE. Sélectionnez ensuite en_US.UTF-8 pour appuyez à nouveau sur ENTRÉE pour valider.

Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.

Entrez ensuite la commande suivante :

$ sudo localedef -i en_US -c -f UTF-8 en_US.UTF-8

Éditez le fichier /etc/default/locale :

$ sudo nano /etc/default/locale

Remplacez le contenu de ce dernier par le contenu suivant :

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8

Sauvegardez et quittez l'édition puis effectuez un soft reboot du VPS :

$ sudo reboot

Activation du firewall UFW

Pour libérer le port SSH par défaut :

$ sudo ufw allow ssh

Pour libérer uniquement les connexions entrantes du nouveau port (recommandé) :

$ sudo ufw allow nouveau_port/tcp

Activez le firewall :

$ sudo ufw enable

Pour afficher le statut et les règles du firewall :

$ sudo ufw status verbose

Pour supprimer une règle :

$ sudo ufw delete allow ssh

Sécurisation de la mémoire partagée

La mémoire partagée peut être utilisée lors d'une attaque contre un service en cours d'exécution.

Modifiez le fichier /etc/fstab pour ajouter une protection :

tmpfs   /run/shm    tmpfs   defaults,noexec,nosuid  0   0

Installation et configuration de Fail2Ban

Fail2Ban est un framework de prévention contre les intrusions dont le but est de bloquer les adresses IP inconnues qui tentent de pénétrer dans votre système. Ce paquet est recommandé, voire indispensable, pour vous prémunir contre toute tentative de brute force sur vos services.

NOTE : Fail2Ban scanne les logs et interdit les adresses IP qui affichent des signes malveillants (trop d'échecs de mot de passe, mauvais nom d'utilisateur...) En général, Fail2Ban est utilisé pour mettre à jour les règles du pare-feu afin de rejeter les adresses IP pendant une durée donnée, bien que toute autre action arbitraire puisse également être configurée. D'autre part, Fail2Ban est livré avec des filtres pré-configurés pour différents services (apache, courrier, ftp, SSH, etc).

L’installation s’effectue avec la commande suivante :

$ sudo apt-get install fail2ban

Modifiez le fichier de configuration pour l’adapter à la vôtre. Avant toute modification, il est recommandé de faire une sauvegarde de ce fichier en entrant la commande suivante :

$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.backup

Apportez ensuite vos modifications sur le fichier :

$ sudo nano /etc/fail2ban/jail.conf

Si vous souhaitez recevoir des e-mails de Fail2Ban informant si des hôtes sont bannis, modifiez la ligne suivante par votre adresse e-mail.

destemail = monemail@exemple.fr

Modifiez également la ligne action = %(action_)s par :

action = %(action_mwl)s

Activez tous les services que vous souhaitez que Fail2Ban surveille en ajoutant enabled = true. Si vous avez remplacé le port SSH par défaut, vous devez remplacer tous les port = ssh par port = nouveau_port.

[sshd]

enabled = true
#mode   = normal
port    = nouveau_port
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Vous pouvez également créer des filtres pour les différents services que vous souhaitez surveiller avec Fail2Ban et qui ne sont pas fournis par défaut en les plaçant dans le fichier suivant :

$ sudo nano /etc/fail2ban/jail.local

Une fois la configuration terminée, redémarrez le service à l’aide de cette commande :

$ sudo /etc/init.d/fail2ban restart

Linux Apache MySQL PHP

Vérifiez si des mises à jour sont disponibles et installez-les :

$ sudo apt-get update && sudo apt-get upgrade

Apache

Installez la dernière version d'Apache :

$ sudo apt install apache2

Avant de tester Apache, il est nécessaire de modifier les paramètres du pare-feu pour permettre à l’extérieur d’accéder aux ports web par défaut. En supposant que vous ayez suivi les instructions des conditions préalables, vous devriez avoir un pare-feu UFW configuré pour restreindre l’accès à votre serveur.

Lors de l’installation, Apache s’enregistre auprès de l’UFW pour fournir quelques profils d’application qui peuvent être utilisés pour activer ou désactiver l’accès à Apache à travers le pare-feu.

Listez les profils d’application ufw en tapant :

$ sudo ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH
  • Apache : ce profil n’ouvre que le port 80 (trafic web normal, non crypté).
  • Apache Full : ce profil ouvre à la fois le port 80 (trafic web normal, non crypté) et le port 443 (trafic crypté TLS/SSL).
  • Apache Secure : ce profil n’ouvre que le port 443 (trafic crypté TLS/SSL).

Il est recommandé d’activer le profil le plus restrictif qui autorisera tout de même le trafic que vous avez configuré. Comme vous n’avez pas encore configuré le SSL pour votre VPS, vous devez seulement autoriser le trafic sur le port 80 :

$ sudo ufw allow 'Apache'

Vérifiez le changement en saisissant :

$ sudo ufw status

Vérifiez avec le système systemd pour vous assurer que le service fonctionne en tapant :

$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-05-03 09:45:01 UTC; 8min ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 2730 (apache2)
      Tasks: 55 (limit: 2281)
     Memory: 5.2M
     CGroup: /system.slice/apache2.service
             ├─2730 /usr/sbin/apache2 -k start
             ├─2732 /usr/sbin/apache2 -k start
             └─2733 /usr/sbin/apache2 -k start

Comme le message le confirme, le service est démarré. Cependant, la meilleure façon de le tester consiste à demander une page à Apache.

Vous pouvez accéder à la page d’accueil par défaut d’Apache pour confirmer que cela fonctionne correctement grâce au nom de votre VPS. Entrez la ligne suivante dans votre navigateur :

http://vps-xxxxxxxxx.ovh.net

Vous devriez voir la page web par défaut d’Apache pour votre distribution :

Cette page indique qu’Apache fonctionne correctement. Elle contient également des informations de base sur les fichiers Apache et les emplacements de répertoires importants.

Voici quelques commandes de gestion de base en utilisant systemctl.

Pour arrêter le serveur web :

$ sudo systemctl stop apache2

Pour démarrer le serveur web :

$ sudo systemctl start apache2

Pour arrêter puis redémarrer le serveur web :

$ sudo systemctl restart apache2

Si vous procédez uniquement à des modifications de configuration, il se peut qu’Apache recharge souvent sans interrompre les connexions. Pour ce faire, utilisez cette commande :

$ sudo systemctl reload apache2

Par défaut, Apache est configuré pour un lancement automatique au démarrage du serveur. Si ce n’est pas ce que vous souhaitez, désactivez ce comportement en tapant :

$ sudo systemctl disable apache2

Pour réactiver le service de lancement automatique au démarrage :

$ sudo systemctl enable apache2

Désormais, Apache devrait démarrer automatiquement au redémarrage du serveur.

MySQL

Installez la dernière version de MySQL :

$ sudo apt install mysql-server

Cette commande install MySQL, mais ne vous demande pas de définir un mot de passe ou de faire d’autres changements de configuration. Cela rend votre installation de MySQL non sécurisée pour le moment.

Pour les nouvelles installations de MySQL, vous devrez exécuter le script de sécurité inclus dans le SGBD. Ce script modifie certaines des options par défaut les moins sûres pour des choses comme les connexions root distantes et les sample users.

Exécutez le script de sécurité :

$ sudo mysql_secure_installation

Vous êtes maintenant guidé à travers une série d'invites où vous pourrez apporter quelques modifications aux options de sécurité de votre installation MySQL. La première invite vous demande si vous souhaitez configurer le plugin Validate Password, que vous pouvez utiliser pour tester la solidité de votre mot de passe MySQL.

Si vous choisissez de mettre en place ce plugin, le script vous demandera de choisir un niveau de validation du mot de passe. Le niveau le plus fort - que vous sélectionnez en entrant 2 - exigera que votre mot de passe comporte au moins huit caractères, dont un mélange de majuscules, de minuscules, de chiffres et de caractères spéciaux :

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

Que vous choisissiez ou non de configurer le plugin Validate Password, l’invite suivante vous demandera de définir un mot de passe pour l’utilisateur root de MySQL. Entrez et confirmez le mot de passe sécurisé de votre choix :

Please set the password for root here.

New password: 

Re-enter new password:

Si vous avez utilisé le plugin Validate Password, vous recevrez des commentaires sur la force de votre nouveau mot de passe. Ensuite, le script vous demandera si vous voulez continuer avec le mot de passe que vous venez de saisir ou si vous voulez en saisir un nouveau. En supposant que vous êtes satisfait de la force du mot de passe que vous venez d’entrer, saisissez Y pour poursuivre le script :

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

À partir de là, vous pouvez appuyer sur Y puis sur ENTRÉE pour accepter les valeurs par défaut pour toutes les questions suivantes. Cela supprimera les utilisateurs anonymes et la base de données de test, désactivera les connexions root à distance, et chargera ces nouvelles règles afin que MySQL respecte immédiatement les modifications que vous avez apportées.

Notez que même si vous avez défini un mot de passe pour l’utilisateur MySQL root, cet utilisateur n’est pas configuré pour s’authentifier avec un mot de passe lors de la connexion au shell MySQL. Si vous le souhaitez, vous pouvez ajuster ce paramètre en suivant les instructions ci-dessous.

Dans les systèmes Ubuntu fonctionnant sous MySQL 5.7 (et versions ultérieures), l’utilisateur MySQL root est configuré pour s’authentifier en utilisant le plugin auth_socket par défaut plutôt qu’avec un mot de passe. Cela permet d’améliorer la sécurité et la convivialité dans de nombreux cas, mais cela peut aussi compliquer les choses si vous devez autoriser un programme externe (par exemple, phpMyAdmin) à accéder à l’utilisateur.

Afin d’utiliser un mot de passe pour se connecter à MySQL en tant que root, vous devrez changer sa méthode d’authentification de auth_socket à un autre plugin, tel que caching_sha2_password ou mysql_native_password. Pour ce faire, ouvrez l’invite MySQL depuis votre terminal :

$ sudo mysql

Ensuite, vérifiez la méthode d’authentification utilisée par chacun de vos comptes utilisateurs MySQL à l’aide de la commande suivante :

$ SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+------------------------------------------------------------------------+-----------------------+
| user             | authentication_string                                                  | plugin                |
+------------------+------------------------------------------------------------------------+-----------------------+
| debian-sys-maint | $A$005$wfI>X S27teIhp M#.Dl6r3I9GAxF.OkzpPwj3DEdxHUjwojJ18M7DIG4jVC    | caching_sha2_password |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| root             |                                                                        | auth_socket           |
+------------------+------------------------------------------------------------------------+-----------------------+
5 rows in set (0.00 sec)

Dans cet exemple, vous pouvez voir que l’utilisateur root s’authentifie effectivement en utilisant le plugin auth_socket. Pour configurer le compte root afin qu’il s’authentifie avec un mot de passe, lancez une instruction ALTER USER pour modifier le plugin d’authentification utilisé et définir un nouveau mot de passe.

Veillez à remplacer password par un mot de passe fort de votre choix, et souvenez-vous que cette commande modifiera le mot de passe root que vous avez défini lors de l'étape précédente :

$ ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Exécutez ensuite FLUSH PRIVILEGES qui ordonne au serveur de recharger les tableaux de subventions et de mettre vos nouvelles modifications en vigueur :

$ FLUSH PRIVILEGES;

Vérifiez à nouveau les méthodes d’authentification utilisées par chacun de vos utilisateurs pour confirmer que root ne s’authentifie plus à l’aide du plugin auth_socket :

$ SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+------------------------------------------------------------------------+-----------------------+
| user             | authentication_string                                                  | plugin                |
+------------------+------------------------------------------------------------------------+-----------------------+
| debian-sys-maint | $A$005$wfI>X S27teIhp M#.Dl6r3I9GAxF.OkzpPwj3DEdxHUjwojJ18M7DIG4jVC | caching_sha2_password    |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| root             | *6663065B4A952ABAEC91BE221995E753738ABA5C                              | mysql_native_password |
+------------------+------------------------------------------------------------------------+-----------------------+
5 rows in set (0.00 sec)

Vous pouvez maintenant quitter le shell MySQL :

$ exit

Quelle que soit la manière dont vous l’avez installé, MySQL a dû commencer à fonctionner automatiquement. Pour le tester, vérifiez son état :

$ systemctl status mysql.service
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-05-03 10:12:49 UTC; 20min ago
   Main PID: 4069 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 2281)
     Memory: 358.3M
     CGroup: /system.slice/mysql.service
             └─4069 /usr/sbin/mysqld

Si MySQL est stoppé, vous pouvez le démarrer avec :

$ sudo systemctl start mysql

Pour une vérification supplémentaire, vous pouvez essayer de vous connecter à la base de données en utilisant l’outil mysqladmin qui est un client vous permettant d’exécuter des commandes administratives. Par exemple, cette commande indique de se connecter à MySQL en tant que root (-u root), de demander un mot de passe (-p) et de renvoyer la version.

$ sudo mysqladmin -p -u root version
mysqladmin  Ver 8.0.28-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          8.0.28-0ubuntu0.20.04.3
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/run/mysqld/mysqld.sock
Uptime:                 22 min 49 sec

Threads: 2  Questions: 20  Slow queries: 0  Opens: 141  Flush tables: 3  Open tables: 60  Queries per second avg: 0.014

Cela signifie que MySQL est opérationnel.

PHP

Installez la dernière version (8.1 à l'heure actuelle) de PHP :

$ sudo apt-get install -y software-properties-common
$ sudo add-apt-repository -y ppa:ondrej/php
$ sudo apt-get update -y
$ sudo apt-get install php8.1 libapache2-mod-php8.1 php8.1-mysql php8.1-intl php8.1-xml php8.1-mbstring php8.1-zip php8.1-gd

Exécuter la commande suivante pour vérifier votre version de PHP :

$ php -v
PHP 8.1.5 (cli) (built: Apr 21 2022 10:14:45) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.5, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.5, Copyright (c), by Zend Technologies

PHP a beaucoup de modules qui peuvent être facilement installés pour améliorer ses fonctionnalités. Recherchez ces modules supplémentaires avec apt-cache :

$ apt-cache search php8.1 | less

Testez votre installation de PHP en créant un fichier info.php :

$ sudo nano /var/www/html/info.php

Ajoutez y le code suivant pour afficher la configuration de php :

<?php phpinfo(); ?>

Enregistrez le fichier.

Modifiez la timezone en éditant le fichier php.ini :

$ sudo nano /etc/php/8.1/cli/php.ini

Retirez le commentaire ; devant date.timezone et indiquez le fuseau horaire souhaité :date.timezone = Europe/Paris.

NOTE : Pour vérifier l'heure et le fuseau horaire du VPS utilisez : timedatectl status. Pour le modifier entrez : sudo timedatectl set-timezone suivi de votre fuseau horaire Europe/Paris ou UTC. Une liste est disponible timedatectl list-timezones. Si vous avez des tâches cron n'oubliez pas de les redémarrer.

Ouvrez votre navigateur et accédez à http://vps-xxxxxxxxx.ovh.net/info.php. Si vous voyez le PHP Info, PHP est correctement installé !

CLI Symfony

Vérifiez si des mises à jour sont disponibles et installez-les :

$ sudo apt-get update && sudo apt-get upgrade

Installez la dernière version de la CLI Symfony : (Documentation)

$ echo 'deb [trusted=yes] https://repo.symfony.com/apt/ /' | sudo tee /etc/apt/sources.list.d/symfony-cli.list
$ sudo apt update
$ sudo apt install symfony-cli

Exécuter la commande suivante pour vérifier votre version de la CLI :

$ symfony -v
Symfony CLI version 5.4.8 (c) 2017-2022 Symfony SAS (2022-04-20T07:48:08Z - stable)
Symfony CLI helps developers manage projects, from local code to remote infrastructure

Composer

Installez la dernière version de Composer: (Documentation)

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ sudo mv composer.phar /usr/local/bin/composer

Exécuter la commande suivante pour vérifier votre version de Composer :

$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.3.5 2022-04-13 16:43:00

Yarn

Pour commencer, installez la dernière version (16.15.0 à l'heure actuelle) de Node.js :

$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt-get install -y nodejs

Exécuter la commande suivante pour vérifier votre version de Node.js :

$ node -v
v16.15.0

Installez la dernière version de Yarn : (Documentation)

$ sudo corepack enable
$ yarn set version stable

Exécuter la commande suivante pour vérifier votre version de Yarn :

$ yarn -v
3.2.0

CI Linters projet Symfony

#.github/workflows/linters.yml

name: "Linters"

on:
    pull_request:

env:
    fail-fast: true
    
jobs:
    php-cs-fixer:
        name: PHP-CS-Fixer
        runs-on: ubuntu-latest
        steps:
            - name: "Checkout code"
              uses: actions/checkout@v2

            - name: PHP-CS-Fixer
              uses: docker://oskarstark/php-cs-fixer-ga
              with:
                  args: --diff --dry-run
    linters:
        name: Linters
        runs-on: ubuntu-latest
        strategy:
            matrix:
                php-version: ['8.1']

        steps:
            - name: "Checkout code"
              uses: actions/checkout@v2.3.3

            - name: "Installation de PHP avec extensions"
              uses: shivammathur/setup-php@2.7.0
              with:
                  coverage: "none"
                  extensions: intl
                  php-version: ${{ matrix.php-version }}
                  tools: composer:v2

            - name: "Répertoire cache composer"
              id: composer-cache
              run: echo "::set-output name=dir::$(composer config cache-files-dir)"

            - name: "Cache composer"
              uses: actions/cache@v2.1.2
              with:
                  path: ${{ steps.composer-cache.outputs.dir }}
                  key: ${{ runner.os }}-${{ matrix.php-version }}-composer-${{ hashFiles('composer.lock') }}
                  restore-keys: ${{ runner.os }}-${{ matrix.php-version }}-composer-

            - name: "Composer install"
              run: composer install --no-interaction --no-progress

            - name: Installation de PHPUnit
              id: install
              run: vendor/bin/simple-phpunit install

            - name: Lint fichiers YAML
              if: always() && steps.install.outcome == 'success'
              run: ./bin/console lint:yaml config --parse-tags

            - name: Lint templates Twig
              if: always() && steps.install.outcome == 'success'
              run: ./bin/console lint:twig templates --env=prod

            - name: Lint traductions XLIFF
              if: always() && steps.install.outcome == 'success'
              run: ./bin/console lint:xliff translations

            - name: Lint Paramètres et Services
              if: always() && steps.install.outcome == 'success'
              run: ./bin/console lint:container --no-debug

            - name: Lint entités Doctrine
              if: always() && steps.install.outcome == 'success'
              run: ./bin/console doctrine:schema:validate --skip-sync -vvv --no-interaction

            - name: Lint configuration Composer
              if: always() && steps.install.outcome == 'success'
              run: composer validate --strict

            - name: Téléchargement de la CLI Symfony
              if: always() && steps.install.outcome == 'success'
              run: wget https://get.symfony.com/cli/installer -O - | bash

            - name: Vérifie si des dépendances sont compromises
              if: always() && steps.install.outcome == 'success'
              run: /home/runner/.symfony/bin/symfony check:security

            - name: Lance PHPStan
              if: always() && steps.install.outcome == 'success'
              run: ./vendor/bin/phpstan analyze

CI Tests pour projet Symfony

#.github/workflows/tests.yml

name: "Tests"

on:
    pull_request:

env:
    fail-fast: true
    PHPUNIT_FLAGS: "-v"
    SYMFONY_PHPUNIT_DIR: "$HOME/symfony-bridge/.phpunit"
    SYMFONY_REQUIRE: ">=6.0"
    SYMFONY_DEPRECATIONS_HELPER: 40

jobs:
    test:
        name: "${{ matrix.operating-system }} / PHP ${{ matrix.php-version }}"
        runs-on: ${{ matrix.operating-system }}
        continue-on-error: false

        strategy:
            matrix:
                operating-system: ['ubuntu-latest']
                php-version: ['8.1']

        services:
            mysql:
                image: "mysql:latest"
                env:
                    MYSQL_ROOT_PASSWORD: "password"
                ports:
                    - "3306:3306"

        steps:
            - name: "Checkout code"
              uses: actions/checkout@v2.3.3

            - name: "Installation de PHP avec extensions"
              uses: shivammathur/setup-php@2.7.0
              with:
                  coverage: "none"
                  extensions: "mbstring, xml, ctype, iconv, intl"
                  php-version: ${{ matrix.php-version }}
                  tools: composer:v2

            - name: "Ajoute le matcher PHPUnit"
              run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

            - name: "Répertoire cache composer"
              id: composer-cache
              run: echo "::set-output name=dir::$(composer config cache-files-dir)"

            - name: "Cache composer"
              uses: actions/cache@v2.1.2
              with:
                  path: ${{ steps.composer-cache.outputs.dir }}
                  key: ${{ runner.os }}-${{ matrix.php-version }}-composer-${{ hashFiles('composer.json') }}
                  restore-keys: ${{ runner.os }}-${{ matrix.php-version }}-composer-

            - name: "symfony/flex"
              run: composer global require --no-progress --no-scripts --no-plugins symfony/flex

            - run: composer update

            - name: "Installation des dépendances Yarn"
              run: yarn install

            - name: "Construit les assets"
              run: yarn encore production

            - name: "Télécharge la CLI Symfony"
              run: wget https://get.symfony.com/cli/installer -O - | bash

            - name: "Installation de PHPUnit"
              run: vendor/bin/simple-phpunit install

            - name: "Version de PHPUnit"
              run: vendor/bin/simple-phpunit --version

            - name: "Prépare la base de données"
              run: |
                /home/runner/.symfony/bin/symfony console doctrine:database:create --env=test --if-not-exists
                /home/runner/.symfony/bin/symfony console doctrine:migrations:migrate --env=test -n
                /home/runner/.symfony/bin/symfony console doctrine:fixtures:load --env=test -n

            - name: "Lance les tests"
              run: vendor/bin/simple-phpunit ${{ env.PHPUNIT_FLAGS }}

Copie des clés SSH sur votre VPS

Copiez les clés SSH publique et privée sur votre VPS depuis votre poste local. Vérifiez que votre répertoire $HOME contient un dossier .ssh. Si le dossier n’existe pas, créez-le :

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

Utilisez la commande suivante pour copier les clés SSH :

$ cd ~/.ssh
$ scp -p -P port_ssh nom_clé nom_d_utilisateur@vps-xxxxxxxxx.ovh.net:~/.ssh/nom_clé
$ scp -p -P port_ssh nom_clé.pub nom_d_utilisateur@vps-xxxxxxxxx.ovh.net:~/.ssh/nom_clé.pub

Ajout de la clé SSH publique sur GitHub

Rendez-vous sur le répertoire GitHub de votre projet, cliquez sur l'onglet Settings dans le menu du haut, puis sur Deploy keys situé sur la barre latérale à gauche et enfin sur le bouton Add deploy key pour ajouter une clé SSH.

Affichez votre clé publique sur votre VPS :

$ cat ~/.ssh/nom_clé.pub

Copiez-collez le résulat sur GitHub, donnez un nom à cette clé (ex : nom de votre VPS), ne cochez pas la case Allow write access et validez.

GitHub vous demandera certainement votre mot de passe pour des raisons évidentes de sécurité.

Créez ensuite un fichier config dans ~/.ssh :

$ sudo nano ~/.ssh/config

Entrez le contenu suivant :

Host github.com
HostName github.com
IdentityFile ~/.ssh/nom_clé
User git

NOTE : Attention, le chemin au nivrau de IdentityFile correspond au chemin vers la clé privée et non clé publique.

Enregistrez le fichier et fermez le.

Ajout de la clé SSH privée sur GitHub

Rendez-vous sur le répertoire GitHub de votre projet, cliquez sur l'onglet Settings dans le menu du haut, puis sur Secrets -> Actions situé sur la barre latérale à gauche et enfin sur le bouton New repository secret et ajoutez les clés suivantes :

Nom : SSH_PRIVATE_KEY

Valeur : contenu_clé_secrète_vps ex : $ cat ~/.ssh/nom_clé


Nom : SSH_HOST

Valeur : vps-xxxxxxxxx.ovh.net


Nom : SSH_PORT

Valeur : 49XXX


Nom : SSH_USER

Valeur : nom_d_utilisateur_ssh

Création de la structure du projet

Créez le répertoire du projet :

$ sudo mkdir /var/www/nomduprojet.fr

Configuration du projet

Créez le dossier shared utile à deployer :

$ sudo mkdir /var/www/shared

Modifiez les autorisations en faveur de l'utilisateur courant :

$ sudo chown -R $USER:$USER /var/www/nomduprojet.fr

Modifiez les autorisations en faveur de l'utilisateur www-data :

$ sudo apt-get install acl
$ sudo setfacl -R -m u:www-data:rX /var/www/nomduprojet.fr

Vérifiez que tous les composants utiles à Symfony sont bien présents :

$ symfony check:requirements

Si ce n'est pas le cas, installer les composants nécessaires.

Sur votre poste local, au niveau de votre projet, entrez la commande suivante pour générer le fichier .env.local.php pour l'environnement de production.

$ symfony composer dump-env prod

Générez un nouveau APP_SECRET à l'aide de la commande suivante et modifiez ensuite le fichier .env.local.php nouvellement créé avec les informations correctes pour la version en ligne.

$ php -r "print(hash('sha1', uniqid(mt_rand(), true)));"

Ensuite, copiez le fichier .env.local.php local vers le dossier shared de votre VPS :

$ scp -p -P port_ssh ~/nomduprojet_local/.env.local.php utilisateur_ssh@vps-xxxxxxxxx.ovh.net:/var/www/nomduprojet/shared/.env.local.php

Création de la base de données

Créez la base de données du projet sur votre VPS :

$ mysql -u root -p
$ CREATE DATABASE nom_de_la_db;

Vérifiez si la base de données a bien été créée :

$ SHOW DATABASES;

Quittez le shell MySQL :

$ exit

Installation de Deployer

Sur votre poste local, au niveau de votre projet, installez Deployer :

$ composer require deployer/deployer:^7.0.0-rc.8 --dev

Créez un fichier deploy.php à la racine de votre projet et configurez le :

<?php

/** @noinspection ALL */

declare(strict_types=1);

namespace Deployer;

require 'recipe/common.php';

set('application', 'ex_nomduprojet.fr'); // Nom du dossier sur le VPS

set('keep_releases', 4);

// Configuration
set('symfony_version', function () {
    $result = run('{{bin/console}} --version');
    preg_match_all('/(\d+\.?)+/', $result, $matches);

    return $matches[0][0] ?? 6.0;
});

set('repository', 'git@github.com:XXX/XXXXXX.git'); // Répertoire GitHub

set('shared_dirs', ['var/log']);
set('shared_files', ['.env.local.php']);
set('writable_dirs', ['var', 'var/cache', 'var/log', 'var/sessions', 'public/uploads', 'public/medias']);

set('migrations_config', '');

set('doctrine_schema_validate_config', '');

set('bin/console', '{{bin/php}} {{release_or_current_path}}/bin/console');

set('console_options', function () {
    return '--no-interaction';
});

// Serveur
host(getenv('SSH_HOST'))
    ->set('remote_user', getenv('SSH_USER'))
    ->set('port', getenv('SSH_PORT'))
    ->set('deploy_path', '/var/www/{{ application }}');

// Tâches
desc('Build assets');
task('assets:build', function () {
    cd('{{release_path}}');
    run('yarn install && yarn build');
});

desc('Migrates database');
task('database:migrate', function () {
    $options = '--allow-no-migration';
    if ('' !== get('migrations_config')) {
        $options = "$options --configuration={{release_or_current_path}}/{{migrations_config}}";
    }

    run('cd {{release_or_current_path}} && {{bin/console}} doctrine:migrations:migrate $options {{console_options}}');
});

desc('Validate the Doctrine mapping files');
task('doctrine:schema:validate', function () {
    run('cd {{release_or_current_path}} && {{bin/console}} doctrine:schema:validate {{doctrine_schema_validate_config}} {{console_options}}');
});

desc('Clears cache');
task('deploy:cache:clear', function () {
    if (false !== mb_strpos(get('composer_options', ''), '--no-scripts')) {
        run('{{bin/console}} cache:clear {{console_options}}');
    }
});

desc('Deploys project');
task('deploy', [
    'deploy:prepare',
    'deploy:vendors',
    'assets:build',
    'database:migrate',
    'doctrine:schema:validate',
    'deploy:cache:clear',
    'deploy:publish',
]);

after('deploy:failed', 'deploy:unlock');

Créez un fichier deploy.yml dans le dossier .git > workflows :

name: "Deploy"

on:
    push:
        branches:
            - main

concurrency: production_environment

jobs:
    deploy:
        runs-on: ubuntu-20.04

        steps:
        - uses: actions/checkout@v2

        - name: Setup PHP
          uses: shivammathur/setup-php@v2
          with:
            php-version: '8.1'

        - name: Deploy
          uses: deployphp/action@v1
          env:
            SSH_HOST: ${{ secrets.SSH_HOST }}
            SSH_PORT: ${{ secrets.SSH_PORT }}
            SSH_USER: ${{ secrets.SSH_USER }}
          with:
            private-key: ${{ secrets.SSH_PRIVATE_KEY }}
            dep: deploy
            deployer-version: "7.0.0-rc.8"

Copie des dossiers utiles

Si vous avez des dossiers à transférer sur le VPS uniquement au moment de la première mise en ligne, c'est ici que ça ce passe. Ex : public/uploads :

$ scp -r -P port_ssh /nomduprojet_local/public/uploads utilisateur_ssh@vps-xxxxxxxxx.ovh.net:/var/www/nomduprojet/current/public/uploads

Exportation et importation de la base de données

Exporter votre base de données au format SQL depuis votre poste local.

Si vous ne possédez pas d'utilitaire (ex : adminer), vous pouvez effectuer l'opération en ligne de commande :

$ mysqldump -u nom_d_utilisateur -p nom_de_la_bdd > data-dump.sql

La commande ne produira aucune sortie visuelle, mais vous pouvez inspecter le contenu de data-dump.sql pour vérifier s'il s'agit d'un fichier de dump SQL légitime.

$ head -n 5 data-dump.sql

Copiez le fichier .sql vers votre VPS pour pouvoir l'importer par la suite :

$ cd /dossier_vers_fichier_sql
$ scp -p -P port_ssh data-dump.sql nom_d_utilisateur@vps-xxxxxxxxx.ovh.net:/var/www/nomduprojet.fr/data-dump.sql

Importez vos données au format SQL :

$ mysql -u nom_d_utilisateur -p nom_de_la_bdd < /var/www/data-dump.sql

Enfin, supprimez le fichier .sql de votre VPS.

$ sudo rm /var/www/nomduprojet.fr/data-dump.sql

Configuration du nom de domaine

Sur votre espace client OVH, cliquez sur le lien Web Cloud dans le menu principal en haut, puis sur votre nom de domaine situé dans la barre latéral à gauche sous l'onglet Noms de domaine.

Cliquez ensuite sur l'onglet Redirection puis sur Ajouter une redirection.

  • Ici, ne remplissez pas le champ sous domaine et cliquez sur le bouton Suivant.
  • Sélectionnez ensuite vers un serveur OVH ou ailleurs et cliquez sur le bouton Suivant.
  • A l'étape 3, sélectionnez avec une adresse IP puis sur le bouton Suivant.
  • Ici, entrez l'adresse IPv4 de votre VPS et cliquez sur le bouton Suivant.
  • Pour finir, vérifiez les informations et cliquez sur le bouton Valider.

Maintenant, faite exactement la même chose mais avec l'adresse IPv6 de votre VPS.

Toujours dans la section Redirection, cliquez à nouveau sur Ajouter une redirection.

  • Cette fois-ci, remplissez le champ sous domaine avec www et cliquez sur le bouton Suivant.
  • Sélectionnez ensuite vers une adresse web et cliquez sur le bouton Suivant.
  • A l'étape 3, sélectionnez avec une redirection visible puis sur le bouton Suivant.
  • Ici, sélectionnez Permanente (301) puis entrez https://nomdedomaine.fr et cliquez sur le bouton Suivant.
  • Pour finir, vérifiez les informations et cliquez sur le bouton Valider.

Ajout des VirtualHosts

Créez une nouvelle VirtualHost :

$ sudo nano /etc/apache2/sites-available/nomdedomaine.fr.conf
<VirtualHost *:80>
	ServerAdmin contact@nomdedomaine.fr
	ServerName  nomdedomaine.fr

	DocumentRoot /var/www/nomdedomaine.fr/current/public
  DirectoryIndex /index.php

	<Directory /var/www/nomdedomaine.fr/current/public>
    Options +Indexes +FollowSymLinks
		AllowOverride None
		Order Allow,Deny
		Allow from All
    FallbackResource /index.php

		<IfModule mod_rewrite.c>
			Options -MultiViews
			RewriteEngine On

			RewriteCond %{REQUEST_FILENAME} !-f
			RewriteRule ^(.*)$ index.php [QSA,L]
		</IfModule>
	</Directory>

	ErrorLog /var/log/apache2/nomdedomaine.fr_error.log
	CustomLog /var/log/apache2/nomdedomaine.fr_access.log combined
</VirtualHost>

Vérifiez la configuration Apache :

$ sudo apache2ctl configtest

Activez la VirtualHost de l'application et désactivez celle par défaut :

$ sudo a2ensite nomdedomaine.fr.conf
$ sudo a2dissite 000-default.conf

$ sudo a2enmod rewrite

Relancez Apache :

$ sudo systemctl reload apache2

Sécurisation de Apache avec Let's Encrypt

Installer le client Let's Encrypt :

$ sudo apt-get update
$ sudo apt install certbot python3-certbot-apache

Autorisez du HTTPS à travers le pare-feu :

$ sudo ufw allow 'Apache Full'
$ sudo ufw delete allow 'Apache'

Vérifiez la configuration de votre pare-feu :

$ sudo ufw status

Obtenez un certificat SSL :

$ sudo certbot --apache

Ce script vous invitera à répondre à une série de questions afin de configurer votre certificat SSL. Tout d’abord, il vous demandera une adresse électronique valide. Cette adresse électronique sera utilisée pour les notifications de renouvellement et les avis de sécurité :

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): contact@nomdedomaine.fr

Après avoir fourni une adresse électronique valide, appuyez sur ENTRÉE pour passer à l’étape suivante. Vous serez ensuite invité à confirmer si vous acceptez les conditions d’utilisation du service Let’s Encrypt. Vous pouvez confirmer en appuyant sur A et ensuite sur ENTRÉE :

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

Ensuite, il vous sera demandé si vous souhaitez partager votre adresse électronique avec l’Electronic Frontier Foundation pour recevoir des nouvelles et d’autres informations. Si vous ne souhaitez pas vous abonner à leur contenu, tapez N. Sinon, tapez Y. Ensuite, appuyez sur ENTRÉE pour passer à l’étape suivante.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

La prochaine étape vous invitera à informer Certbot des domaines pour lesquels vous souhaitez activer le HTTPS. Les noms de domaine listés sont obtenus automatiquement à partir de la configuration de votre hôte virtuel Apache, c’est pourquoi il est important de s’assurer que vous avez le paramètre ServerName correct configuré dans votre virtualHost. Si vous souhaitez activer le HTTPS pour tous les noms de domaine répertoriés (recommandé), vous pouvez laisser l’invite vide et appuyer sur ENTRÉE pour continuer. Sinon, sélectionnez les domaines pour lesquels vous souhaitez activer le HTTPS en énumérant chaque numéro approprié, séparé par des virgules et/ou des espaces, puis appuyez sur ENTRÉE.

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: nomdedomaine.fr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 

Vous verrez une réponse de ce type :

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for nomdedomaine.fr
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/nomdedomaine.fr-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/nomdedomaine.fr-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/nomdedomaine.fr-le-ssl.conf

Ensuite, vous serez invité à choisir si vous voulez ou non que le trafic HTTP soit redirigé vers le HTTPS. En pratique, cela signifie que lorsqu’une personne visite votre site web par des canaux non cryptés (HTTP), elle sera automatiquement redirigée vers l’adresse HTTPS de votre site web. Choisissez 2 pour activer la redirection, ou 1 si vous souhaitez conserver HTTP et HTTPS comme méthodes distinctes d’accès à votre site web.

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Après cette étape, la configuration de Certbot est terminée, et les dernières remarques sur votre nouveau certificat vous seront présentées, ainsi que l’emplacement des fichiers générés et la manière de tester votre configuration à l’aide d’un outil externe qui analyse l’authenticité de votre certificat :

Added an HTTP->HTTPS rewrite in addition to other RewriteRules; you may wish to check for overall consistency.
Redirecting vhost in /etc/apache2/sites-enabled/nomdedomaine.fr.conf to ssl vhost in /etc/apache2/sites-available/nomdedomaine.fr-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://nomdedomaine.fr

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=nomdedomaine.fr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/nomdedomaine.fr/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/nomdedomaine.fr/privkey.pem
   Your cert will expire on 2022-08-02. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Votre certificat est maintenant installé et chargé dans la configuration d’Apache.

Modification des VirtualHosts


$ sudo nano /etc/apache2/sites-available/nomdedomaine.fr-le-ssl.conf

<VirtualHost *:80>
    ServerAdmin contact@nomdomaine.fr
    ServerName nomdomaine.fr

    DocumentRoot /var/www/nomdomaine.fr/current/public

    <IfModule mod_rewrite.c>
        Options -MultiViews
        RewriteEngine On

        RewriteCond %{SERVER_NAME} =nomdomaine.fr
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    </IfModule>
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerAdmin contact@nomdomaine.fr
        ServerName  nomdomaine.fr

        DocumentRoot /var/www/nomdomaine.fr/current/public
        DirectoryIndex /index.php
        
        <Directory /var/www/nomdomaine.fr/current/public>
          Options +Indexes +FollowSymLinks
          AllowOverride None
          Order Allow,Deny
          Allow from All
          FallbackResource /index.php

          <IfModule mod_rewrite.c>
              Options -MultiViews
              RewriteEngine On

              RewriteCond %{REQUEST_FILENAME} !-f
              RewriteRule ^(.*)$ index.php [QSA,L]
          </IfModule>
    </Directory>

    ErrorLog /var/log/apache2/nomdomaine.fr_error.log
    CustomLog /var/log/apache2/nomdomaine.fr_access.log combined

    SSLCertificateFile /etc/letsencrypt/live/nomdomaine.fr/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/nomdomaine.fr/privkey.pem

    Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
</IfModule>

Vérifiez la configuration Apache :

$ sudo apache2ctl configtest

Désactivez l'ancienne VirtualHost. La nouvelle a déjà été activée :

$ sudo a2dissite nomdedomain.fr.conf

Relancez Apache :

$ sudo systemctl reload apache2

Verification du renouvellement automatique de Certbot

Pour vérifier le statut de ce service et vous assurer qu’il est actif et qu’il fonctionne, vous pouvez utiliser :

$ sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Wed 2022-05-04 10:19:14 CEST; 42min ago
    Trigger: Wed 2022-05-04 15:21:12 CEST; 4h 19min left
   Triggers: ● certbot.service

Pour tester le processus de renouvellement, vous pouvez faire un essai avec certbot :

$ sudo certbot renew --dry-run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment