Discourse Forum installeren met Nginx en Gratis Let’s Encrypt SSL op Debian 11

Discourse is een open-source discussieplatform voor gemeenschappen, gebouwd met de taal Ruby. Het is ontworpen om te werken als forum, chatsoftware of mailinglijst. Het integreert gemakkelijk met andere platforms, en zijn functionaliteit kan uitgebreid worden met plugins.

In deze handleiding leer je hoe je Discourse Forum met de Nginx server kunt installeren op een Debian 11 gebaseerde server.

Vereisten

  • Een server met Debian 11 met minimaal 1 GB RAM en 1 Core CPU. De setup van Discourse maakt automatisch een swap-partitie aan op systemen met 1GB of minder RAM. Daarom is het aan te bevelen het te installeren op een systeem met minstens 2GB RAM.

  • Een niet-root gebruiker met sudo privileges.

  • Een Domeinnaam (discourse.example.com) die naar de server wijst.

  • Alles is bijgewerkt.

    $ sudo apt update && sudo apt upgrade
    
  • Enkele pakketten die je systeem nodig heeft.

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

    Sommige van deze pakketten kunnen al op je systeem geïnstalleerd zijn.

Stap 1 – Firewall instellen

De eerste stap is het instellen van de firewall. Debian wordt geleverd met ufw (Uncomplicated Firewall).

Controleer of de firewall draait.

$ sudo ufw status

Je zou de volgende uitvoer moeten krijgen.

Status: inactive

Sta de SSH poort toe, zodat de firewall de huidige verbinding niet verbreekt bij het inschakelen ervan.

$ sudo ufw allow OpenSSH

Sta ook HTTP en HTTPS poorten toe.

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

Schakel de firewall in

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

Controleer nogmaals de status van de firewall.

$ sudo ufw status

Je zou een gelijkaardige uitvoer moeten zien.

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)

Stap 2 – Git installeren

Installeer Git met de standaard Appstream.

$ sudo dnf install git

Bevestig de installatie.

$ git --version
git version 2.30.2

Voer de volgende commando’s uit om de Git installatie te configureren.

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

Stap 3 – Installeer Docker

Om de nieuwste versie van Docker te installeren, voeg je de officiële GPG sleutel van Docker toe.

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

Installeer de officiële Docker repository.

$ 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

Werk de Debian systeemrepositories bij.

$ sudo apt update

Installeer de nieuwste versie van Docker.

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

Controleer of Docker draait.

$ 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>

Docker vereist standaard root privileges. Als je wilt voorkomen dat je telkens sudo gebruikt als je het commando docker uitvoert, voeg dan je gebruikersnaam toe aan de docker groep.

$ sudo usermod -aG docker $(whoami)

Om deze verandering mogelijk te maken, moet je uitloggen uit de server en weer inloggen als dezelfde gebruiker.

Stap 4 – Download Discourse

Maak de hoofddirectory voor Discourse.

$ sudo mkdir /var/discourse

Kloon de officiële Discourse Docker Github repository.

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

Stap 5 – Configureer Discourse

Maak het configuratiebestand app.yml door het voorbeeldbestand standalone.yml te kopiëren.

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

Open het app.yml om te bewerken.

$ sudo nano containers/app.yml

Stel domein in

Stel de variabele DISCOURSE_HOSTNAME in op de domeinnaam, die je voor je forum koos. Als je geen domeinnaam hebt, kun je hier een IP adres gebruiken.

DISCOURSE_HOSTNAME: 'discourse.example.com'

Configureer blootgestelde poorten

Verander de regel "80:80 in "8080:80". Dit verandert de externe HTTP poort voor Discourse in 8080 omdat we Nginx op poort 80 zullen gebruiken. Commentarieer de regel "443:443" uit omdat we SSL extern zullen installeren.

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

Configureer SMTP Instellingen

Vul de volgende variabelen in, afhankelijk van de transactie email dienst die je gebruikt. Stel het e-mailadres voor je beheerdersaccount in met de variabele DISCOURSE_DEVELOPER_EMAILS. Deze stap is verplicht anders wordt je forum niet opgestart.

..
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)

Geheugeninstellingen (optioneel)

Als je server weinig RAM heeft, kun je de volgende variabelen dienovereenkomstig instellen om Discourse’s geheugengebruik te beperken.

db_shared_buffers: '128MB'
UNICORN_WORKERS: 2

De variabele db_shared_buffers wordt gewoonlijk ingesteld op 25% van het beschikbare geheugen.

GeoLite2 instellingen (optioneel)

Als je de IP lookup functie op Discourse wilt, meld je dan aan voor het gratis Maxmind Geolite2 account en krijg een licentiesleutel. Plak die licentiesleutel als de waarde voor de volgende variabele.

DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Stap 6 – Installeer Discourse

Voer het volgende commando uit om je Discourse container op te starten.

$ sudo ./launcher bootstrap app

Start de Discourse toepassing.

$ sudo ./launcher start app

Je kunt het forum openen door in je browser de URLs http://yourserver_IP:8080 of http://discourse.example.com:8080 te bezoeken. Je krijgt het volgende scherm.

Discourse Setup Home

Klik op de knop Register om verder te gaan. Het e-mail id dat in het app.yml bestand is ingesteld wordt voor je vooringevuld.

Discourse Beheerdersaccount aanmaken

Klik op de Register knop om de beheerdersaccount te registreren. Je gaat door naar het e-mail bevestigingsscherm.

Discourse E-mail bevestigen

Als je SMTP instellingen juist zijn, ontvang je een mail om de account te activeren. Klik op de link uit je e-mail om het instellen van de account te voltooien.

Discours Bevestigingsmail

Klik op de Activate knop om de installatie te voltooien.

Discourse Account activeren

Je komt nu in het Discourse’s Setup Wizard scherm. Je kunt het overslaan om direct naar het forum te gaan of de hele wizard doorlopen.

Discourse Instellingen Wizard

Je Discourse forum is klaar. De volgende stap is SSL installeren en het forum achter de Nginx server zetten.

Discours Homepage

Stap 7 – SSL installeren

Om een SSL certificaat te installeren met Let’s Encrypt, moeten we het Certbot gereedschap installeren.

We zullen daarvoor het Snapd pakket installatieprogramma gebruiken. Omdat de meeste Debian servers er niet mee geleverd worden, installeer je het Snapd installatieprogramma.

$ sudo apt install snapd

Zorg ervoor dat je versie van Snapd up to date is.

$ sudo snap install core && sudo snap refresh core

Installeer Certbot.

$ sudo snap install --classic certbot

Gebruik het volgende commando om ervoor te zorgen dat het Certbot commando gedraaid kan worden door een symbolische link te maken naar de /usr/bin directory.

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

Verifieer de installatie.

$ certbot --version
certbot 1.22.0

Genereer het SSL certificaat.

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

Het bovenstaande commando downloadt een certificaat naar de /etc/letsencrypt/live/discourse.example.com directory op je server.

Genereer een Diffie-Hellman groepscertificaat.

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

Maak een uitdagende webroot directory voor Let’s Encrypt auto-renewal.

$ sudo mkdir -p /var/lib/letsencrypt

Maak een Cron Job om de SSL te vernieuwen. Deze zal elke dag lopen om het certificaat te controleren en zo nodig te vernieuwen. Maak daarvoor eerst het bestand /etc/cron.daily/certbot-renew en open het om te bewerken.

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

Plak er de volgende code in.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Verander de permissies op het taakbestand om het uitvoerbaar te maken.

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

Stap 8 – Installeer en configureer Nginx

Debian wordt geleverd met een oudere versie van Nginx. Je moet de officiële Nginx repository downloaden om de nieuwste versie te installeren.

Importeer de officiële Nginx signeer sleutel.

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

Voeg de repository voor de stabiele versie van Nginx toe.

$ 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

Werk de Debian repositories bij.

$ sudo apt update

Installeer Nginx.

$ sudo apt install nginx

Verifieer de installatie. Zorg ervoor dat je sudo gebruikt telkens als je het Nginx commando op Debian uitvoert. Anders werkt het niet.

$ sudo nginx -v
nginx version: nginx/1.20.2

Maak en open het bestand /etc/nginx/conf.d/discourse.conf om te bewerken.

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

Plak er de volgende code in.

# 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;
    }    
}

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt als je klaar bent.

Open het bestand /etc/nginx/nginx.conf om het te bewerken.

$ sudo nano /etc/nginx/nginx.conf

Voeg de volgende regel toe vóór de regel include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Controleer de syntaxis van het Nginx configuratiebestand.

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

Start de Nginx dienst om de nieuwe configuratie in te schakelen.

$ sudo systemctl start nginx

Stap 9 – Discourse commando’s

Activeer Discourse Administrator vanaf de command-line

Als je geen activeringsmail ontvangt, kun je de beheerdersaccount activeren vanaf de commandoregel.

Ga naar de Discourse directory.

$ cd /var/discourse

Ga de Discourse container Shell binnen.

$ sudo ./launcher enter app

Voer het commando rails c in om de Rails commandoprompt te openen.

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

Je ziet de volgende prompt.

[1] pry(main)> 

Voer het commando in om de beheerdersaccount te lokaliseren.

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

Geef q om terug te keren naar de prompt en voer achtereenvolgens de volgende commando’s in.

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

Type tweemaal exit om terug te keren naar de shell. Je beheerdersaccount is geactiveerd en klaar voor gebruik.

Discourse upgraden

Om het forum te upgraden kun je een van de twee manieren gebruiken. De eerste manier is om het te upgraden via het beheerdersdashboard. De tweede methode is via een commandoregel.

Ga naar de Discourse map.

$ cd /var/discourse

Werk de Discourse installatie bij door de nieuwste bestanden van Github te pakken.

$ git pull

Herbouw Discourse.

$ sudo ./launcher rebuild app

Je moet Discourse herbouwen telkens als je wijzigingen aanbrengt in het app.yml bestand. Na het aanbrengen van de veranderingen, voer je het bovenstaande commando uit. Het vernietigt de oude container, bootstrapt een nieuwe en start die.

Stop Discourse

$ sudo ./launcher stop

Bekijk Discourse logboeken

$ sudo ./launcher logs

Conclusie

Hiermee is de tutorial beëindigd. Je hebt het Discourse forum geïnstalleerd met Docker achter de Nginx webserver op een Debian 11 server. Als je nog vragen hebt, stel ze dan in de opmerkingen hieronder.