Comment installer le forum Discourse avec Nginx et Let’s Encrypt SSL gratuit sur Debian 11

Discourse est une plateforme de discussion communautaire open-source construite à l’aide du langage Ruby. Elle est conçue pour fonctionner comme un forum, un logiciel de chat ou une liste de diffusion. Elle s’intègre facilement à d’autres plateformes, et ses fonctionnalités peuvent être étendues grâce à des plugins.

Dans ce tutoriel, tu vas apprendre à installer Discourse Forum avec le serveur Nginx sur un serveur basé sur Debian 11.

Conditions préalables

  • Un serveur fonctionnant sous Debian 11 avec un minimum de 1 Go de RAM et 1 cœur de processeur. L’installation de Discourse créera automatiquement une partition swap sur les systèmes avec 1 Go de RAM ou moins. Il est donc recommandé de l’installer sur un système avec au moins 2 Go de RAM.

  • Un utilisateur non-root avec des privilèges sudo.

  • Un nom de domaine (discourse.example.com) pointant vers le serveur.

  • Tout est mis à jour.

    $ sudo apt update && sudo apt upgrade
    
  • Quelques paquets dont ton système a besoin.

    $ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
    

    Certains de ces paquets sont peut-être déjà installés sur ton système.

Étape 1 – Configurer le pare-feu

La première étape consiste à configurer le pare-feu. Debian est livrée avec ufw (Uncomplicated Firewall).

Vérifie si le pare-feu fonctionne.

$ sudo ufw status

Tu devrais obtenir la sortie suivante.

Status: inactive

Autorise le port SSH pour que le pare-feu ne rompe pas la connexion en cours en l’activant.

$ sudo ufw allow OpenSSH

Autorise également les ports HTTP et HTTPS.

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

Active le pare-feu

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Vérifie à nouveau l’état du pare-feu.

$ sudo ufw status

Tu devrais voir un résultat similaire.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Étape 2 – Installe Git

Installe Git en utilisant l’Appstream par défaut.

$ sudo dnf install git

Confirme l’installation.

$ git --version
git version 2.30.2

Exécute les commandes suivantes pour configurer l’installation de Git.

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

Étape 3 – Installe Docker

Pour installer la dernière version de Docker, ajoute la clé GPG officielle de Docker.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Installe le dépôt officiel de Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Mets à jour les dépôts du système Debian.

$ sudo apt update

Installe la dernière version de Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io

Vérifie que Docker fonctionne.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-02-05 13:32:54 UTC; 1h ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 5818 (dockerd)
      Tasks: 26
     Memory: 1.4G
        CPU: 5min 34.561s
     CGroup: /system.slice/docker.service
             ?? 5818 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
             ??12162 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -contai>
             ??12169 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8080 -container-ip 172.17.0.2 -container-p>

Par défaut, Docker nécessite les privilèges de root. Si tu veux éviter d’utiliser sudo à chaque fois que tu exécutes la commande docker, ajoute ton nom d’utilisateur au groupe docker.

$ sudo usermod -aG docker $(whoami)

Pour activer cette modification, tu devras te déconnecter du serveur et te reconnecter en tant que même utilisateur.

Étape 4 – Télécharge Discourse

Crée le répertoire racine pour Discourse.

$ sudo mkdir /var/discourse

Clone le dépôt officiel Discourse Docker Github.

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

Étape 5 – Configurer Discourse

Crée le fichier de configuration app.yml en copiant l’exemple de fichier standalone.yml.

$ sudo cp samples/standalone.yml containers/app.yml

Ouvre le fichier app.yml pour le modifier.

$ sudo nano containers/app.yml

Définis le domaine

Définis la variable DISCOURSE_HOSTNAME sur le nom de domaine que tu as choisi pour ton forum. Si tu n’as pas de nom de domaine, tu peux utiliser une adresse IP ici.

DISCOURSE_HOSTNAME: 'discourse.example.com'

Configurer les ports exposés

Change la ligne "80:80 en "8080:80". Cela changera le port HTTP externe pour Discourse en 8080 puisque nous utiliserons Nginx au port 80. Mets en commentaire la ligne "443:443" car nous installerons SSL en externe.

expose:
  - "8080:80"   # http
  #- "443:443" # https

Configurer les paramètres SMTP

Remplis les variables suivantes en fonction du service d’email transactionnel que tu utilises. Définis l’email de ton compte administrateur à l’aide de la variable DISCOURSE_DEVELOPER_EMAILS. Cette étape est obligatoire, sinon ton forum ne sera pas démarré.

..
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
..
DISCOURSE_SMTP_ADDRESS: smtp.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: [email protected]
DISCOURSE_SMTP_PASSWORD: your_smtp_password
#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
#DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (required by some providers)
DISCOURSE_NOTIFICATION_EMAIL: [email protected]    # (address to send notifications from)

Paramètres de la mémoire (facultatif)

Si ton serveur a peu de RAM, tu peux configurer les variables suivantes en conséquence pour réduire l’empreinte mémoire de Discourse.

db_shared_buffers: '128MB'
UNICORN_WORKERS: 2

La variable db_shared_buffers est généralement configurée à 25% de la mémoire disponible.

Paramètres GeoLite2 (facultatif)

Si tu veux la fonction de recherche d’IP sur Discourse, inscris-toi au compte gratuit Maxmind Geolite2 et obtiens une clé de licence. Colle cette clé de licence comme valeur de la variable suivante.

DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key

Enregistre le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque tu y es invité.

Étape 6 – Installe Discourse

Exécute la commande suivante pour amorcer ton conteneur Discourse.

$ sudo ./launcher bootstrap app

Démarre l’application Discourse.

$ sudo ./launcher start app

Tu peux accéder au forum en visitant les URLs http://yourserver_IP:8080 ou http://discourse.example.com:8080 dans ton navigateur. Tu obtiendras l’écran suivant.

Accueil de la configuration de Discourse

Clique sur le bouton S’inscrire pour continuer. L’adresse e-mail définie dans le fichier app.yml sera préremplie pour toi.

Discourse Créer un compte Admin

Cliquez sur le bouton Enregistrer pour enregistrer le compte administrateur. Tu arriveras à l’écran de confirmation de l’email.

Confirmation de l'email de Discourse

Si tes paramètres SMTP sont corrects, tu recevras un mail pour activer le compte. Clique sur le lien de ton mail pour finir de configurer le compte.

Courriel de confirmation du discours

Clique sur le bouton Activer pour terminer l’installation.

Activation du compte Discourse

Tu arriveras à l’écran de l’assistant d’installation de Discourse. Tu peux soit le sauter pour passer directement au forum, soit passer par tout l’assistant.

Assistant de configuration de Discourse

Ton forum Discourse est prêt. L’étape suivante consiste à installer SSL et à placer le forum derrière le serveur Nginx.

Discourse Homepage

Étape 7 – Installer SSL

Pour installer un certificat SSL en utilisant Let’s Encrypt, nous devons installer l’outil Certbot.

Nous utiliserons l’installateur de paquets Snapd pour cela. Comme la plupart des serveurs Debian ne sont pas livrés avec, installe l’installateur Snapd.

$ sudo apt install snapd

Assure-toi que ta version de Snapd est à jour.

$ sudo snap install core && sudo snap refresh core

Installe Certbot.

$ sudo snap install --classic certbot

Utilise la commande suivante pour t’assurer que la commande Certbot peut être exécutée en créant un lien symbolique vers le répertoire /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Vérifie l’installation.

$ certbot --version
certbot 1.22.0

Génère le certificat SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d discourse.example.com

La commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/discourse.example.com de ton serveur.

Génère un certificat de groupe Diffie-Hellman.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Crée un répertoire webroot de défi pour le renouvellement automatique de Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Crée une tâche Cron pour renouveler le SSL. Elle s’exécutera tous les jours pour vérifier le certificat et le renouveler si nécessaire. Pour cela, commence par créer le fichier /etc/cron.daily/certbot-renew et ouvre-le pour le modifier.

$ sudo nano /etc/cron.daily/certbot-renew

Colle le code suivant.

#!/bin/sh
certbot renew --cert-name discourse.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"

Enregistre le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque tu y es invité.

Change les autorisations sur le fichier de tâches pour le rendre exécutable.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Étape 8 – Installe et configure Nginx

Debian est livré avec une ancienne version de Nginx. Tu dois télécharger le référentiel officiel de Nginx pour installer la dernière version.

Importe la clé de signature officielle de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
	 | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Ajoute le dépôt de la version stable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
    http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Mets à jour les dépôts Debian.

$ sudo apt update

Installe Nginx.

$ sudo apt install nginx

Vérifie l’installation. Assure-toi d’utiliser sudo chaque fois que tu exécutes la commande Nginx sur Debian. Sinon, cela ne fonctionnera pas.

$ sudo nginx -v
nginx version: nginx/1.20.2

Crée et ouvre le fichier /etc/nginx/conf.d/discourse.conf pour le modifier.

$ sudo nano /etc/nginx/conf.d/discourse.conf

Colle le code suivant dans ce fichier.

# enforce HTTPS
server {
    listen       80; 
    listen 	[::]:80;
    server_name  discourse.example.com;
    return 301   https://$host$request_uri;
}
server {
    listen       443 ssl http2;
    listen 	[::]:443 ssl http2;
    server_name  discourse.example.com;

    access_log  /var/log/nginx/discourse.access.log;
    error_log   /var/log/nginx/discourse.error.log;
    
    # SSL
    ssl_certificate      /etc/letsencrypt/live/discourse.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/discourse.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/discourse.example.com/chain.pem;
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 8.8.8.8;
    
    client_max_body_size 100m;
    
    location / {
        proxy_pass http://discourse.example.com:8080/;
        proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }    
}

Enregistre le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque tu y es invité une fois terminé.

Ouvre le fichier /etc/nginx/nginx.conf pour le modifier.

$ sudo nano /etc/nginx/nginx.conf

Ajoute la ligne suivante avant la ligne include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Enregistre le fichier en appuyant sur Ctrl + X et en entrant Y lorsque tu y es invité.

Vérifie la syntaxe du fichier de configuration de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Démarre le service Nginx pour activer la nouvelle configuration.

$ sudo systemctl start nginx

Étape 9 – Commandes Discourse

Active Discourse Administrator à partir de la ligne de commande

Si tu ne reçois pas le courriel d’activation, tu peux activer le compte administrateur depuis la ligne de commande.

Passe dans le répertoire Discourse.

$ cd /var/discourse

Entre dans le Shell du conteneur Discourse.

$ sudo ./launcher enter app

Saisis la commande rails c pour accéder à l’invite de commande Rails.

[email protected]:/var/www/discourse# rails c

Tu verras l’invite suivante.

[1] pry(main)> 

Saisis la commande pour localiser le compte administrateur.

[1] pry(main)>  User.find_by_email("[email protected]")
=> #<User:0x00005564492032a0
 id: 1,
 username: "username",
 created_at: Sun, 06 Feb 2022 14:46:58.451302000 UTC +00:00,
 updated_at: Sun, 06 Feb 2022 14:54:17.079564000 UTC +00:00,
 name: nil,
 seen_notification_id: 4,
 last_posted_at: nil,
 password_hash: "[FILTERED]",
 salt: "20d6012d3c98da70896dcfc27bc9d264",
 active: true,
 username_lower: "username",
 last_seen_at: Mon, 07 Feb 2022 08:34:12.435844000 UTC +00:00,
 admin: true,
 last_emailed_at: Sun, 06 Feb 2022 14:47:00.694121000 UTC +00:00,
 trust_level: 1,
 approved: false,
 approved_by_id: nil,
 approved_at: nil,
 previous_visit_at: Sun, 06 Feb 2022 15:40:35.804941000 UTC +00:00,
 suspended_at: nil,
 suspended_till: nil,
 date_of_birth: nil,
 views: 0,
 flag_level: 0,
 ip_address: #<IPAddr: IPv4:69.28.90.35/255.255.255.255>,
 moderator: false,
 title: nil,
 uploaded_avatar_id: 3,
:

Saisis q pour revenir à l’invite et saisis les commandes suivantes dans l’ordre.

[2] pry(main)> user.approved = true
[3] pry(main)> user.save
[4] pry(main)> EmailToken.confirm(user.email_tokens.first.token)

Tape deux fois exit pour revenir au shell. Ton compte administrateur est activé et prêt à être utilisé.

Mettre à niveau Discourse

Pour mettre à niveau le forum, tu peux utiliser l’une des deux méthodes suivantes. La première façon est de le mettre à niveau via le tableau de bord de l’administrateur. La deuxième méthode consiste à utiliser une ligne de commande.

Passe dans le répertoire Discourse.

$ cd /var/discourse

Mets à jour l’installation de Discourse en récupérant les derniers fichiers sur Github.

$ git pull

Reconstruis Discourse.

$ sudo ./launcher rebuild app

Tu dois reconstruire Discourse chaque fois que tu apportes des modifications au fichier app.yml. Après avoir apporté les modifications, exécute la commande ci-dessus. Elle détruit l’ancien conteneur, en démarre un nouveau et le lance.

Arrêter Discourse

$ sudo ./launcher stop

Voir les journaux de Discourse

$ sudo ./launcher logs

Conclusion

Ceci conclut le tutoriel. Tu as installé le forum Discourse en utilisant Docker derrière le serveur Web Nginx sur un serveur Debian 11. Si tu as des questions, publie-les dans les commentaires ci-dessous.

Vous aimerez aussi...