Mastodon Sociaal Netwerk installeren met Docker op Ubuntu 18.04 LTS

Mastodon is een gratis, gedecentraliseerd en open-source sociaal netwerk. Het werd opgericht als alternatief voor Twitter. Net als Twitter kunnen mensen elkaar volgen, berichten, afbeeldingen en video’s plaatsen. Maar in tegenstelling tot Twitter is er geen centrale opslagplaats of autoriteit voor de inhoud.

In plaats daarvan werkt Mastodon op duizenden verschillende servers die elk door verschillende leden van de gemeenschap worden beheerd. Gebruikers die op de ene server zijn aangemeld kunnen gemakkelijk verbinding maken met gebruikers op het andere netwerk en elkaar over de instanties heen volgen.

Iedereen kan een eigen instantie van een Mastodon server installeren. Deze zelfstudie leert je hoe je een instantie van Mastodon kunt opzetten op een server met Ubuntu 18.04 met Docker.

Vereisten

  • Een Ubuntu 18.04 gebaseerde server met een niet-root sudo gebruiker.

  • Zorg ervoor dat je systeem up to date is.

    $ sudo apt update
    $ sudo apt upgrade
    
  • Mastodon stuurt e-mail meldingen naar gebruikers. Een optie om het te laten werken is je eigen mailserver op te zetten. Je kunt dat doen op dezelfde server als waarop je mastodon installeert of op een andere server. Dat doen valt buiten het bestek van deze gids.

    We zullen je aanraden een 3e partij Transactional mail dienst te gebruiken, zoals Mailgun, Sendgrid, Amazon SES of Sparkpost. De instructies in de gids zullen Mailgun gebruiken als je SMTP provider.

  • Zorg ervoor dat je een domeinnaam hebt die naar de server wijst. Voor deze handleiding gebruiken we example.com als domein.

Stap 1 - Afhankelijkheden installeren

Voor we Mastodon installeren, moeten we er zeker van zijn dat onze server bepaalde software heeft die hij nodig heeft om goed te installeren. Voer de volgende commando's uit om de afhankelijkheden te installeren.

$ sudo apt update
$ sudo apt install ca-certificates curl ufw apt-transport-https software-properties-common git -y

Sommige van de bovenstaande software kan voor je voorgeïnstalleerd zijn.

Omdat we Git geïnstalleerd hebben, moeten we die configureren voor we verder gaan.

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

Stap 2 - Firewall instellen

In onze vorige stap installeerden we, ufw (Uncomplicated Firewall). Voor we verder kunnen gaan met de installatie van Mastodon, moeten we hem configureren.

Schakel SSH in en de poort die we zojuist aanmaakten, zodat we niet buitengesloten worden.

$ sudo ufw allow OpenSSH

Schakel de ufw firewall in.

$ sudo ufw enable

We moeten ook http en https inschakelen om Mastodon te laten werken.

$ sudo ufw allow http
$ sudo ufw allow https

Controleer de status van de firewall.

$ sudo ufw status

Je zou een uitvoer als de volgende 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 3 - Installeer Docker

Voeg de GPG sleutel van Docker toe aan je systeem.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Verifieer de vingerafdruk van de gedownloade sleutel.

$ sudo apt-key fingerprint 0EBFCD88

Je zou een uitvoer als de volgende moeten zien.

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <[email protected]>
sub   rsa4096 2017-02-22 [S]

Voeg de Docker repository toe.

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Werk je pakketdatabank bij.

$ sudo apt update

Installeer Docker-CE. CE is de Community Editie van Docker.

$ sudo apt install docker-ce -y

Docker zou nu geïnstalleerd moeten zijn. Controleer of het draait.

$ sudo systemctl status docker

De uitvoer zou op het volgende moeten lijken.

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-10-22 18:26:29 UTC; 25min ago
     Docs: https://docs.docker.com
 Main PID: 3574 (dockerd)
    Tasks: 8
   CGroup: /system.slice/docker.service
   ??3574 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Druk op q om af te sluiten.

Voeg je beperkte Linux gebruikersaccount toe aan de docker groep, zodat je docker zonder sudo kunt draaien.

sudo usermod -aG docker $USER

De variabele$USER kiest en voegt de huidige ingelogde gebruiker aan de docker groep toe. Vervang $USER door de eigenlijke gebruikersnaam als je momenteel niet met die gebruiker bent ingelogd.

Schakel over naar de gebruiker die we net toegevoegd hebben. Ook al was je al ingelogd, je zult er toch weer naar moeten overschakelen om de toestemmingen opnieuw te laden.

$ su - ${USER}

Controleer of alles goed loopt door het ingebouwde "Hello World" programma uit te voeren.

$ docker run hello-world

Je zou de volgende uitvoer moeten zien die vertelt dat Docker geïnstalleerd is en goed werkt.

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

Stap 4 - Installeer Docker Compose

Het is mogelijk deze stap over te slaan en verder te gaan, maar Docker Compose geïnstalleerd hebben zal het draaien van Mastodon veel gemakkelijker maken, vooral als je het op meer dan één server wilt doen.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Op het moment van schrijven van deze zelfstudie is 1.24.1 de huidige stabiele release van Docker Compose. Je kunt naar de nieuwste release versie kijken op hun Github pagina.

Pas executable permissies toe op de docker compose binary.

$ sudo chmod +x /usr/local/bin/docker-compose

Voeg Command Completion toe aan Docker Compose.

$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

Controleer of je installatie geslaagd is.

$ docker-compose --version

Het zal de volgende uitvoer afdrukken.

docker-compose version 1.24.1, build 4667896b

Stap 5 - Installeer Mastodon

Kloon de repository van Mastodon naar je server.

$ git clone https://github.com/tootsuite/mastodon

Navigeer naar de directory waar we zojuist bestanden naar gekopieerd hebben.

$ cd mastodon

Mastodon komt met een voorbeeld configuratiebestand. We moeten het hernoemen om Mastodon te laten werken.

$ cp .env.production.sample .env.production

We moeten geheime sleutels genereren voor ons configuratiebestand. Maar voor het zover is moeten we eerst het Docker image bouwen.

$ docker-compose build

Nu het image met succes gebouwd is, moet je verschillende sleutels maken die nodig zijn om Mastodon te configureren.

Genereer eerst SECRET_KEY_BASE.

$ SECRET_KEY_BASE=$(docker-compose run --rm web bundle exec rake secret)

Voeg de bovenstaande sleutel in het configuratiebestand in.

$ sed -i -e "s/SECRET_KEY_BASE=/&${SECRET_KEY_BASE}/" .env.production

Genereer en voeg het OTP_SECRET in het configuratiebestand in.

$ OTP_SECRET=$(docker-compose run --rm web bundle exec rake secret)
$ sed -i -e "s/OTP_SECRET=/&${OTP_SECRET}/" .env.production

Genereer en voeg het PAPERCLIP_SECRET in het configuratiebestand in.

$ PAPERCLIP_SECRET=$(docker-compose run --rm web bundle exec rake secret)
$ sed -i -e "s/PAPERCLIP_SECRET=/&${PAPERCLIP_SECRET}/" .env.production

Genereer waarden voor VAPID_PRIVATE_KEY en VAPID_PUBLIC_KEY.

$ docker-compose run --rm web bundle exec rake mastodon:webpush:generate_vapid_key

Open het .env.production bestand.

$ sudo nano ./.env.production

Zoek in het bestand naar VAPID_PRIVATE_KEY en VAPID_PUBLIC_KEY en kopieer de uitvoer van het vorige commando.

Zoek de variabele LOCAL_DOMAIN en verander de waarde ervan van example.com in de domeinnaam die je voor je Mastodon installatie gekozen hebt.

Voer de waarden in die je van je SMTP provider kreeg.

SMTP_SERVER = smtp.mailgun.org
SMTP_PORT = 587
SMTP_LOGIN = username
SMTP_PASSWORD = password
SMTP_FROM_ADDRESS = [email protected]

Druk op Ctrl + X en sla het bestand op als je klaar bent.

Je moet het Docker image opnieuw bouwen om alle hierboven aangebrachte veranderingen door te voeren.

$ docker-compose build

Zet de databank op.

$ docker-compose run --rm web rails db:migrate

Precompileer de assets van Mastodon.

$ docker-compose run --rm web rails assets:precompile

Voer het volgende commando uit om de container uit te voeren.

$ docker-compose up -d

Stap 6 - Installeer en configureer Nginx

De volgende stap in onze gids is het installeren van de Nginx server om Mastodon's website te laten werken.

Voer het volgende commando uit om de Nginx server te installeren.

$ sudo apt install nginx -y

Nginx wordt geleverd met een standaard geconfigureerde site. Verwijder die.

$ sudo rm /etc/nginx/sites-available/default

Verwijder ook de symlink voor de standaard site.

$ sudo rm /etc/nginx/sites-enabled/default

Maak een Nginx configuratiebestand voor Mastodon.

$ sudo touch /etc/nginx/sites-available/mastodon

Maak een symlink voor Mastodon's configuratie.

$ sudo ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

Open Mastodon's configuratie in de Nano editor. (Je kunt elke editor kiezen die je maar wilt)

$ sudo nano /etc/nginx/sites-available/mastodon

Kopieer-plak er de volgende tekst in.

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /home/user/mastodon/public;
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;

  ssl_protocols TLSv1.2;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 80m;

  root /home/user/mastodon/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security "max-age=31536000";

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    try_files $uri @proxy;
  }
  
  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    try_files $uri @proxy;
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://127.0.0.1:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

De bovenstaande configuratie gaat er van uit dat je Let's encrypt als SSL provider gebruikt. Gebruik je een andere SSL dienst, dan moet je de plaats van de sleutels bewerken en het volgende deel van de handleiding overslaan.

Stap 7 - Installeer en configureer Let's Encrypt

Zorg ervoor dat Nginx gestopt is.

$ sudo systemctl stop nginx

Voeg de Certbot repository toe.

$ sudo add-apt-repository ppa:certbot/certbot

Werk systeempakketten bij.

$ sudo apt update

Installeer het Certbot gereedschap.

$ sudo apt install certbot

Je moet het certificaat tweemaal maken - eenmaal met de TLS SNI methode en de tweede keer met de webroot methode.

sudo certbot certonly --standalone -d example.com

Maak nu het certificaat met de webroot methode. Hiervoor moet Nginx draaien.

sudo systemctl start nginx
sudo certbot certonly --webroot -d example.com -w /home/user/mastodon/public/

Het gereedschap vraagt je of je het certificaat wilt behouden of vernieuwen. Kies de optie om te vernieuwen.

Automatische vernieuwing van SSL certificaten instellen

Let's Encrypt certificaten hebben een geldigheidsduur van 90 dagen. Daarna moet je ze opnieuw vernieuwen. Daarvoor kun je een cron job maken die dat automatisch voor je doet.

Maak een cron job.

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

Kopieer en plak het volgende in het bestand.

#!/usr/bin/env bash
certbot renew
systemctl reload nginx

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

Maak het script uitvoerbaar en herstart de cron daemon zodat ons script dagelijks loopt.

$ sudo chmod +x /etc/cron.daily/letsencrypt-renew
$ sudo systemctl restart cron

Stap 8 - Maak je Mastodon gebruiker aan

Bezoek je mastodon site in een browser. Je zou het volgende scherm moeten zien.

Mastodon gebruiker toevoegen

Voer je gewenste gebruikersnaam, e-mailadres en wachtwoord in om een nieuwe account op je Mastodon instance aan te maken. Je volledige gebruikersnaam die je nodig hebt om verbinding te maken met gebruikers van andere Mastodon servers is [email protected]

Mastodon stuurt je een bevestigingsmail om de aanmelding te verifiëren.

Je kunt de aanmelding ook handmatig bevestigen. Daarvoor moet je SSH in je Docker instantie. Maak een lijst van alle huidige Docker instances.

$ docker ps

Je ziet een uitvoer als hieronder.

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                  PORTS                      NAMES
32f2c4cd2598        tootsuite/mastodon    "/tini -- bash -c 'r…"   16 hours ago        Up 16 hours (healthy)   127.0.0.1:3000->3000/tcp   mastodon_web_1
76beca2b858d        tootsuite/mastodon    "/tini -- node ./str…"   16 hours ago        Up 16 hours (healthy)   127.0.0.1:4000->4000/tcp   mastodon_streaming_1
08f7a42b75ac        tootsuite/mastodon    "/tini -- bundle exe…"   16 hours ago        Up 16 hours                                        mastodon_sidekiq_1
bacaa8c09a85        redis:5.0-alpine      "docker-entrypoint.s…"   17 hours ago        Up 17 hours (healthy)                              mastodon_redis_1
62e9b2175a53        postgres:9.6-alpine   "docker-entrypoint.s…"   17 hours ago        Up 17 hours (healthy)                              mastodon_db_1

Om de vereiste veranderingen aan te brengen, moeten we toegang krijgen tot de streaming container. SSH naar de mastodon_streaming_1 container.

$ docker exec -it mastodon_streaming_1 /bin/bash

Dit zal een Bash shell binnenin je container starten.

Voer het volgende commando uit om je nieuw aangemaakte gebruikersnaam goed te keuren.

[email protected]:~$ RAILS_ENV=production bin/tootctl accounts modify howtoforge --confirm

Voer het volgende commando uit om van je nieuw aangemaakte account een beheerder te maken.

[email protected]:~$ RAILS_ENV=production bin/tootctl accounts modify howtoforge --role admin

Sluit de container af.

[email protected]:~$ exit

Log in op je instantie met je gebruikersnaam en wachtwoord en je wordt begroet met het volgende scherm.

Mastodon eerste stappen

Klik op Let's Go en je gaat door naar de volgende pagina's die je op de hoogte brengen van enkele basisprincipes van de werking van Mastodon.

Hoe Mastodon werkt

Antwoord - Boost - Favoriet

Klik op Tutorial afronden om begroet te worden met de startpagina van je Mastodon waar je naar hartelust kunt gaan posten.

Mastodon Dashboard

Je krijgt toegang tot de instellingen en het beheer gedeelte via het Voorkeuren menu.

Stap 9 - Onderhoud

Om de prestaties en logs van je Mastodon instantie te bekijken, ga je naar https://example.com/sidekiq/

Hier kun je een lijst bekijken van diverse processen en geplande taken met betrekking tot je Mastodon instance. Je kunt ook kijken of er mislukte taken zijn onder de sectie Dead or Retries. Het vertelt je ook het geheugengebruik van je instantie.

Mastodont onderhoud

Je kunt de gezondheid van de databank van je instantie controleren op https://example.com/pghero/

pghero

Je kunt onderhoud aan je database uitvoeren, SQL queries uitvoeren en ongebruikte indexen verwijderen.

Als je site om een of andere reden helemaal niet laadt, kun je de door Docker gegenereerde logs bekijken.

Sluit daarvoor eerst je containers af.

$ docker-compose down

Voer Docker compose uit in een aangekoppelde toestand, zodat je logs kunt bekijken die door elke container gegenereerd worden.

$ docker-compose up

Stap 10 Je Mastodon upgraden

Ga naar je mastodon directory.

$ cd /home/user/mastdon

Download updates uit de repository

$ git fetch

Als je je docker-compose.yml bestand om een of andere reden veranderd hebt, moet je eerst het volgende commando uitvoeren.

$ git status

Dit vertelt je alle wijzigingen die er in gedaan zijn. Als het bestand gewijzigd is, berg dan eerst je wijzigingen op.

$ git stash

Bekijk de nieuwste Mastodon versie. Bekijk de nieuwste versie op de releases pagina.

$ git checkout <version/tag>

Als je git stash eerder uitvoerde, voer dan het volgende commando uit om je wijzigingen in het docker-compose.yml bestand opnieuw te doen.

$ git stash pop

Bouw het docker image.

$ docker-compose build

Voer databasemigraties uit.

$ docker-compose run --rm web rails db:migrate

Pre-compileer de assets van Mastodon.

$ docker-compose run --rm web rails assets:precompile

Voer het volgende commando uit om de container uit te voeren.

$ docker-compose up -d

Dat is alles voor deze tutorial. Om meer over Mastodon te leren volg je hun docs.