So installierst du BookStack mit Nginx auf Ubuntu 20.04

BookStack ist eine einfach zu bedienende, selbst gehostete Open-Source-Plattform zum Organisieren und Speichern von Informationen. Sie kann für verschiedene Zwecke genutzt werden, z. B. als Wiki, Dokumentations-Website und Anwendung für Notizen. Sie wurde mit dem Laravel-PHP-Framework entwickelt und nutzt MySQL zur Datenspeicherung. Für die Bearbeitung kannst du zwischen einem WYSIWYG- und einem Markdown-Editor wählen. Sie unterstützt die Multi-Faktor-Authentifizierung und den Dark Mode und ist mehrsprachig.

In diesem Tutorial lernst du, wie du BookStack auf einem Ubuntu 20.04-basierten Server installierst.

Voraussetzungen

  1. Ein Server, auf dem Ubuntu 20.04 läuft
  2. Ein Fully Qualified Domain Name (FQDN), der auf den Server zeigt.
  3. Ein Nicht-Root-Benutzer mit sudo-Rechten.
  4. PHP Version 7.3 oder höher.
  5. MySQL>=5.6 und MariaDB>=10.0
  6. Git und Composer.

Schritt 1 – Firewall konfigurieren

Der erste Schritt besteht darin, die Firewall zu konfigurieren. Ubuntu wird standardmäßig mit ufw (Uncomplicated Firewall) ausgeliefert.

Überprüfe, ob die Firewall aktiv ist.

$ sudo ufw status

Du solltest die folgende Ausgabe erhalten.

Status: inactive

Erlaube den SSH-Port, damit die Firewall die aktuelle Verbindung nicht unterbricht, wenn du sie aktivierst.

$ sudo ufw allow OpenSSH

Lasse auch HTTP- und HTTPS-Ports zu.

$ sudo ufw allow 80
$ sudo ufw allow 443

Aktiviere die Firewall

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

Überprüfe den Status der Firewall erneut.

$ sudo ufw status

Du solltest eine ähnliche Ausgabe sehen.

Status: active

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

Schritt 2 – Git installieren

Der erste Schritt ist die Installation von Git. Es wird benötigt, um BookStack herunterzuladen und zu aktualisieren. Führe den folgenden Befehl aus, um Git zu installieren.

$ sudo apt install git

Überprüfe die Installation.

$ git --version

Schritt 3 – PHP und Erweiterungen installieren

Da BookStack auf PHP angewiesen ist, musst du PHP und seine Erweiterungen installieren.

Ubuntu wird mit einer veralteten PHP-Version ausgeliefert. Zuerst müssen wir Ondrejs PHP-Repository hinzufügen.

$ sudo add-apt-repository ppa:ondrej/php

Als Nächstes installierst du PHP und die für BookStack benötigten Erweiterungen.

$ sudo apt install php7.4-fpm php7.4-mbstring php7.4-gd php7.4-xml unzip php7.4-bcmath php7.4-curl php7.4-mysql

Überprüfe die Installation.

$ php --version
PHP 7.4.25 (cli) (built: Oct 22 2021 12:34:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.25, Copyright (c), by Zend Technologies

Schritt 4 – MariaDB installieren und konfigurieren

Ubuntu wird mit einer älteren Version von MariaDB ausgeliefert. Um die neueste Version zu installieren, füge das offizielle MariaDB-Repository hinzu. Führe die folgenden Befehle aus, um das Repository hinzuzufügen.

$ curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
$ sudo bash mariadb_repo_setup --mariadb-server-version=10.6

Führe den folgenden Befehl aus, um den MariaDB-Server zu installieren.

$ sudo apt install mariadb-server

Sichere die MariaDB-Installation.

$ sudo mysql_secure_installation

Du wirst verschiedene Eingabeaufforderungen sehen. Beantworte sie wie folgt.

Enter current password for root (enter for none): Press Enter
Switch to unix_socket authentication [Y/n] Type y
Change the root password? [Y/n] Type n
Remove anonymous users? [Y/n] Type y
Disallow root login remotely? [Y/n] Type y
Remove test database and access to it? [Y/n] Type y
Reload privilege tables now? [Y/n] Type y

Verbinde dich mit der MariaDB-Shell mit folgendem Befehl.

$ sudo mysql

Erstelle eine neue Datenbank für Bookstack.

$ create database bookstack;

Erstelle einen neuen Datenbankbenutzer.

$ CREATE USER 'bookstackuser'@'localhost' identified by 'bookstackpassword';

Wähle ein sicheres Passwort.

Erteile dem Benutzer Berechtigungen für die Datenbank.

$ grant CREATE,ALTER,SELECT,INSERT,UPDATE,DELETE on `bookstack`.* to 'bookstackuser'@'localhost';

Beende die MySQL-Shell.

$ exit

Schritt 5 – Installiere Composer

Composer ist ein Abhängigkeitsmanagement-Tool für PHP und wird von Laravel benötigt, auf dem BookStack basiert.

Lade das Composer-Installationsskript herunter.

$ curl -sS https://getcomposer.org/installer -o composer-setup.php

Führe die folgenden Befehle aus, um das Installationsprogramm zu überprüfen.

$ HASH=`curl -sS https://composer.github.io/installer.sig`
$ echo $HASH
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Die obigen Befehle erfassen den Hash-Wert des Installers und gleichen ihn mit deinem heruntergeladenen Skript ab. Wenn das Installationsprogramm sicher ausgeführt werden kann, solltest du die folgende Ausgabe sehen.

Installer verified

Installiere Composer.

$ sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Überprüfe die Installation, indem du die Version überprüfst.

$ composer --version
Composer version 2.1.9 2021-10-05 09:47:38

Schritt 6 – BookStack herunterladen und installieren

Erstelle den Stammordner für die BookStack-App.

$ sudo mkdir -p /var/www/bookstack

Ändere die Eigentümerschaft des Verzeichnisses /var/www/bookstack auf den aktuell angemeldeten Benutzer.

$ sudo chown -R $USER:$USER /var/www/bookstack

Klone den Release-Zweig des BookStack-Github-Repositorys in den neu erstellten Ordner.

$ cd /var/www/bookstack
$ git clone https://github.com/BookStackApp/BookStack.git --branch=release --single-branch .

Vergiss nicht das dot am Ende des clone Befehls. Er sorgt dafür, dass alle Dateien in das aktuelle Verzeichnis heruntergeladen werden, anstatt ein neues zu erstellen.

Starte den Composer-Installer aus dem Verzeichnis /var/www/bookstack.

$ composer install --no-dev

Kopiere die Datei .env.example nach .env, um Umgebungsvariablen für die Installation zu speichern.

$ cp .env.example .env

Öffne die Datei zur Bearbeitung.

$ sudo nano .env

Gib die Anwendungs-URL und die Datenbankdetails ein. Wenn du die E-Mail-Funktionen nutzen willst, gib die SMTP-Daten ein oder lösche sie aus der Datei.

APP_URL=https://example.com
DB_HOST=localhost
DB_DATABASE=bookstack
DB_USERNAME=bookstackuser
DB_PASSWORD=bookstackpassword

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst. Es gibt noch viele weitere Einstellungen, die du vornehmen kannst. Um mehr darüber zu erfahren, öffne die Datei .env.example.complete und kopiere die Einstellungen, die du brauchst, in deine Datei .env.

Erstelle einen eindeutigen Anwendungsschlüssel. Dieser Wert wird automatisch in der Datei .env eingetragen. Gib yes ein, um mit dem Befehl fortzufahren.

$ php artisan key:generate
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

Application key set successfully.

Aktualisiere die Datenbank.

$ php artisan migrate
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.12 seconds)
.......

Schritt 7 – Let’s Encrypt SSL installieren

Um ein SSL-Zertifikat mit Let’s Encrypt zu installieren, müssen wir das Tool Certbot installieren.

Dazu verwenden wir den Snapd-Paketinstaller. Die meisten Ubuntu-Server werden nicht mit dem Snap-Tool ausgeliefert. Um das zu ändern, installiere Snap.

$ sudo apt install snapd

Stelle sicher, dass deine Version von Snapd auf dem neuesten Stand ist.

$ sudo snap install core 
$ sudo snap refresh core

Installiere Certbot.

$ sudo snap install --classic certbot

Stelle mit dem folgenden Befehl sicher, dass der Certbot-Befehl ausgeführt werden kann, indem du einen symbolischen Link auf das Verzeichnis /usr/bin erstellst.

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

Überprüfe die Installation.

$ certbot --version
certbot 1.20.0

Erstelle das SSL-Zertifikat.

$ sudo certbot certonly --standalone --agree-tos --preferred-challenges http -m name@example.com -d example.com

Mit dem obigen Befehl wird ein Zertifikat in das Verzeichnis /etc/letsencrypt/live/etherpad.example.com auf deinem Server heruntergeladen.

Erstelle ein Diffie-Hellman-Gruppenzertifikat.

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

Erstelle ein Challenge-Web-Root-Verzeichnis für die automatische Erneuerung von Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Erstelle einen Cron Job zur Erneuerung des SSL-Zertifikats. Er wird jeden Tag ausgeführt, um das Zertifikat zu überprüfen und bei Bedarf zu erneuern. Erstelle dazu zunächst die Datei /etc/cron.daily/certbot-renew und öffne sie zur Bearbeitung.

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

Füge den folgenden Code ein.

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

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Ändere die Berechtigungen für die Aufgabendatei, um sie ausführbar zu machen.

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

Schritt 8 – Nginx installieren und konfigurieren

Ubuntu wird mit einer älteren Version von Nginx ausgeliefert. Um die neueste Version zu installieren, musst du das offizielle Nginx-Repository herunterladen.

Füge das Repository für die stabile Version von Nginx hinzu.

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

Installiere Nginx.

$ sudo apt install nginx

Überprüfe die Installation.

$ nginx -v
nginx version: nginx/1.20.1

Aktiviere den Nginx-Dienst.

$ sudo systemctl enable nginx

PHP-FPM konfigurieren

Öffne die Datei /etc/php/7.4/fpm/pool.d/www.conf.

$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf

Wir müssen den Unix-Benutzer/die Unix-Gruppe der PHP-Prozesse auf nginx setzen. Finde die Zeilen user=www-data und group=www-data in der Datei und ändere sie in nginx.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = nginx
group = nginx
...

Finde auch die Zeilen listen.owner=www-data und listen.group=www-data in der Datei und ändere sie in nginx.

listen.owner = nginx
listen.group = nginx

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Starte den PHP-fpm-Prozess neu.

$ sudo systemctl restart php7.4-fpm

Nginx konfigurieren

Erstelle und öffne die Datei /etc/nginx/conf.d/bookstack.conf zum Bearbeiten.

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

Füge den folgenden Code in die Datei ein.

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

    access_log  /var/log/nginx/bookstack.access.log;
    error_log   /var/log/nginx/bookstack.error.log;
    
    ssl_certificate      /etc/letsencrypt/live/bookstack.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/bookstack.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/bookstack.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;

    root /var/www/bookstack/public;
    index index.php index.html;

    location / {
      try_files $uri $uri/ /index.php?$query_string;
    }
  
    location ~ \.php$ {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
}

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

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Öffne die Datei /etc/nginx/nginx.conf und bearbeite sie.

$ sudo nano /etc/nginx/nginx.conf

Füge die folgende Zeile vor der Zeile include /etc/nginx/conf.d/*.conf; ein.

server_names_hash_bucket_size  64;

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst. Überprüfe Nginx erneut.

Überprüfe die Syntax der Nginx-Konfigurationsdatei.

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

Starte schließlich den Nginx-Dienst, um die neue Konfiguration zu aktivieren.

$ sudo systemctl start nginx

Ändere die Eigentümerschaft des Verzeichnisses auf den Benutzer nginx, damit der Webserver auf den Ordner zugreifen und darin schreiben kann.

$ sudo chown -R nginx:nginx /var/www/bookstack

Schritt 9 – BookStack ausführen

Dein Bookstack ist jetzt einsatzbereit. Öffne die URL https://bookstack.example.com in deinem Browser und du wirst die Anmeldeseite erhalten.

BookStack Login-Seite

Melde dich mit dem Standard-Administratorkonto admin@admin.com und dem Passwort password an. Öffne die Seite Einstellungen >> Benutzer und klicke auf die Schaltfläche NEUEN BENUTZER HINZUFÜGEN.

BookStack Neuen Benutzer hinzufügen

Gib die Benutzerdaten ein, markiere das Kästchen Admin unter Benutzerrollen und entferne das Häkchen bei Benutzereinladung per E-Mail senden, da wir keine SMTP-Details festgelegt haben. Wähle ein sicheres Passwort. Klicke auf Speichern, wenn du fertig bist.

BookStack Neue Benutzerseite

Klicke als Nächstes auf den Standardbenutzer Admin und lösche ihn, indem du auf die Schaltfläche Benutzer löschen klickst.

Admin-Benutzer löschen

Übertrage den Besitz des Admin-Benutzers auf deinen neu erstellten Benutzer, indem du ihn aus dem Dropdown-Menü auswählst, bevor du ihn löschst. Klicke zum Abschluss auf Bestätigen. Wenn du mit diesem Benutzer eingeloggt bist, wirst du automatisch abgemeldet. Du musst dich dann mit dem neu erstellten Benutzer wieder anmelden.

Benutzer löschen Bestätigung

BookStack sichern und wiederherstellen

BookStack sichern

Du musst die Datenbank und die Dateien separat sichern. Um die Datenbank zu sichern, verwende das Tool mysqldump.

$ sudo mysqldump -u bookstackuser bookstack > bookstack.backup.sql

Du musst auch die folgenden Dateien und Ordner sichern.

  1. .env – Datei mit wichtigen Konfigurationsdaten.
  2. public/uploads – Ordner mit den hochgeladenen Bildern.
  3. storage/uploads – den Ordner mit den hochgeladenen Seitenanhängen.

Führe den folgenden Befehl aus, um ein komprimiertes Archiv mit den oben genannten Dateien und Ordnern zu erstellen.

$ sudo tar -czvf bookstack-files-backup.tar.gz .env public/uploads storage/uploads

BookStack wiederherstellen

Führe den folgenden Befehl aus, um die Datenbank wiederherzustellen.

$ sudo mysql -u bookstack < bookstack.backup.sql

Wenn du auf eine neue Version von BookStack wiederherstellst, musst du den Befehl sudo php artisan migrate ausführen.

Um die oben erstellten komprimierten Dateien wiederherzustellen, verwende den folgenden Befehl.

$ sudo tar -xvzf bookstack-files-backup.tar.gz

Du musst auch die Berechtigungen ändern.

BookStack aktualisieren

Bevor du BookStack aktualisierst, stelle sicher, dass du ein ordentliches Backup mit dem oben beschriebenen Verfahren erstellst.

Um BookStack zu aktualisieren, ziehst du die Originaldateien aus dem Git-Repository.

$ cd /var/www/bookstack
$ sudo git pull origin release

Führe die folgenden Befehle aus, um die Installation fortzusetzen.

$ sudo composer install --no-dev
$ sudo php artisan migrate

Außerdem musst du die folgenden Befehle ausführen, um den Cache zu löschen.

$ sudo php artisan cache:clear
$ sudo php artisan config:clear
$ sudo php artisan view:clear

Fazit

Damit ist unsere Anleitung zur Installation von BookStack auf einem Ubuntu 20.04 Server abgeschlossen. Wenn du Fragen hast, schreibe sie unten in die Kommentare.

Das könnte dich auch interessieren …