Skip to content

Debian 10 Buster und Froxlor 0.9 auf einem Hetzner EX52-Server installieren

Nach diversen Vorfällen mit schlechter Performance, mieser Netzwerkanbindung und völlig veralteter Software (Debian 8 im Jahr 2019, wtf?) bin ich nun endlich beim renommierten Server-Anbieter Hetzner gelandet. Hooray!

So ein Hetzner EX52-Server ist eine schöne Sache. Mit zwei 8TB-Platten (die ich noch um zwei SSD’s ergänzt habe) und 64GB DDR4-RAM hat man schon einen enormen Haufen Leistung zur Verfügung.

Allerdings galt es, zwei Hürden auf dieser Maschine zu meistern, über die ich im Folgenden berichten werde:

  1. Debian 10 wird in Kürze veröffentlicht und daher machte es für mich keinen Sinn, noch auf Debian 9 zu setzen. Es werden allerdings noch keine offiziellen Images von Hetzner angeboten und die Version 9 ist so alt, dass es keine Netzwerktreiber für den EX52 gibt.
  2. Froxlor 0.9 unterstützt offiziell auch noch kein Debian 10. Dies wird erst mit Version 0.10 kommen, die sich gerade im Release Candidate befindet.

Die Initialinstallation

Zuerst einmal musste ich daher über das Hetzner Rescue-System ein Debian 9 installieren und dieses per chroot auf die Version 10 aktualisieren. Bei der Installation wählte ich aus, dass die beiden SSD’s in der Kiste als RAID 1 angesprochen werden sollen. Dieses wird daraufhin automatisch erzeugt – die Debian-Daten sind nach der Installation unter dem Device /dev/md2 ansprechbar.

Die Debian 9-Installation ließ sich recht einfach auf /mnt einhängen und als Rootverzeichnis ansprechen:

mount /dev/md2 /mnt
chroot /mnt

Bevor wir dies nun auf Debian 10 aktualisieren können, muss außerhalb des chroots noch sichergestellt werden, dass /dev/, /proc/ und /boot/ auch verfügbar sind, da sonst der Bootloader nicht korrekt geschrieben wird und die Kiste nicht mehr hochkommt.

mount -o bind /dev /mnt/dev
mount -t proc none /mnt/proc
mount /dev/md/1 /mnt/boot

Innerhalb des chroots kann nun mit folgenden Befehlen ein Upgrade auf Debian 10 Buster durchgeführt werden.

Erstmal wird die Version 9 auf den neusten Stand gebracht:

apt-get update
apt-get -y upgrade
apt-get -y dist-upgrade

Danach ändern wir in den Paketquellen alle Referenzen auf die neue Version 10 ab:

sed -i 's/stretch/buster/g' /etc/apt/sources.list

Zum Schluss aktualisieren wir die Paketquellen und führen das Upgrade durch:

apt-get update
apt-get -y upgrade
apt-get -y dist-upgrade

Nach einem Reboot sind wir auf dem aktuellen Stand und der Server ist nun dank aktueller Netzwerktreiber auch von außen erreichbar.

Festplatten konfigurieren und einhängen

Speicherplatz ist teuer. Die eingebaute SSD bietet doch recht wenig Platz für alle Kunden und ich möchte daher für die reinen Website-Daten die beiden 8TB-Platten im RAID 1 nutzen.

Auf beiden Platten befindet sich aus vorherigen Tests noch eine alte RAID-Konfiguration, die ich lösche indem ich die ersten 100MB ausnulle:

dd if=/dev/zero of=/dev/sda bs=100M count=1
dd if=/dev/zero of=/dev/sdb bs=100M count=1

Danach erstelle ich mit dem Programm cfdisk auf beiden Platten eine GPT-Partitionstabelle (dies ist bei über 2TB wichtig!) und richte jeweils die gleiche Partition ein.

Das RAID lässt sich nun mit Hilfe von mdadm erstellen:

mdadm --create /dev/md/127 --level=1 --raid-devices=2 /dev/sda1 /dev/sda2

Ich möchte das RAID dauerhaft unter dem Mountpoint /storage verfügbar machen. Dazu lese ich zuerst die UUID aus (denn Device-Namen können sich nach einem Reboot ändern)

lsblk -o NAME,UUID

und trage dies in die /etc/fstab ein:

UUID=8a4fcd51-d646-4aa9-8e3f-483d28822e12 /storage ext4 defaults,usrquota 0 0

Die Option “usrquota” ist für die Quota-Funktion von Froxlor später noch relevant.

Abhängigkeiten für Froxlor installieren

Der Server läuft nun und alle Storage-Devices werden beim Booten vernünftig eingehangen. Das ist super – jedoch benötigen wir nun noch einen Webserver, Mailserver, die Datenbanken, SSL und Froxlor an sich. Diese Installation habe ich auf folgende Weise vorgenommen.

SSL-Zertifikat ausstellen

Der Server soll unter der Adresse server4.example.com laufen. Froxlor wird zwar später die Erstellung der SSL-Zertifikate ohne Zusatztools erledigen können, für die Erstkonfiguration entscheide ich mich jedoch für den leichtgewichtigen LetsEncrypt-Client acme.sh und erstelle mir erstmal ein Zertifikat:

apt install git socat
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh && ./acme.sh --install --home ~/myacme --cert-home /etc/acme
acme.sh --issue -d server4.example.com –standalone

Webserver und MariaDB installieren

Für den Webserver können wir ganz einfach den Apache 2.4 aus den Debian-Repositories nehmen:

apt install apache2

Was die Datenbank (MariaDB) angeht, setze ich ungern auf die Debian-eigenen Pakete, da diese erfahrungsgemäß schnell anstauben. Aktuelle Versionen bekommen wir direkt auf der Webseite des Projektes: https://downloads.mariadb.org/mariadb/repositories/

Für Debian Buster wird dort zwar über den Konfigurator nur die RC-Version 10.4 angeboten, aber der sources.list-Eintrag kann auch auf 10.3 geändert werden, um eine stabile Version zu erhalten.

MariaDB wird nun einfach über apt installiert. An dieser Stelle wird auch das Root-Passwort gesetzt, das man sich unbedingt notieren sollte.

apt install mariadb-server

PHP 7.3 über sury.org erhalten

PHP gammelt im Debian-Projekt erfahrungsgemäß immer recht schnell weg – da ich auch hier auf dem neusten Stand sein möchte, verwende ich die Pakete von Ondřej Surý, die ständig auf dem neusten Stand gehalten werden und es mir ermöglichen, auch RC-Versionen vorab zu testen, bevor ich sie deploye.

Die Installation erfolgt über diese Befehle:

echo "deb https://packages.sury.org/php/ buster main" > /etc/apt/sources.list.d/php.list
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xB188E2B695BD4743
apt install php7.3

Welche Erweiterungen für PHP noch benötigt werden, ist je nach Projekt unterschiedlich und müsst ihr selbst entscheiden.

Ich bereite meine Instanz für FPM vor, da php-fcgid Probleme mit großen Dateien und Nextcloud hat und installiere mir die Datenbank-Erweiterung:

apt install php7.3-fpm
a2enmod proxy_fcgi setenvif
a2enconf php7.3-fpm
a2dismod php7.3 mpm_prefork
a2enmod mpm_worker
apt install php-mysql

Froxlor installieren

Nun geht es ans Eingemachte. Im letzten Schritt wird Froxlor endgültig eingerichtet.

Verzeichnisse vorbereiten

Da es kein .deb-Paket für Froxlor gibt, muss ich den VirtualHost für Apache selbst erzeugen, um die Installation dann manuell vornehmen zu können.

Ich erstelle mir mit dem folgenden Befehl einen VHost:

mcedit /etc/apache2/sites-available/001-froxlor.conf

und füge diesen Inhalt ein:

<VirtualHost *:80>
        ServerName server4.example.com
        Redirect permanent / https://server4.example.com/
</VirtualHost>

<VirtualHost *:443>
  ServerName server4.example.com
  ServerAdmin webmaster@example.com
  Header always set Strict-Transport-Security "max-age=15768000; includeSubdomains;"
  Header always append X-Frame-Options SAMEORIGIN
  Header always append X-XSS-Protection "1; mode=block"
  Header always append X-Content-Type-Options nosniff
  Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

  SSLEngine on
  SSLCertificateFile /etc/acme/server4.example.com/server4.example.com.cer
  SSLCertificateKeyFile /etc/acme/server4.example.com/server4.example.com.key
  SSLCertificateChainFile /etc/acme/server4.example.com/fullchain.cer

  DocumentRoot /var/www/froxlor/html

  <Directory /var/www/froxlor/html/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/froxlor/php-starter .php
      Order allow,deny
      Allow from all
  </Directory>

  LogLevel debug
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Dieser VHost nutzt das vorher über acme.sh erstellte Zertifikat und macht Froxlor über https://server4.example.com verfügbar. Froxlor muss dafür in /var/www/froxlor/html liegen.

Wir benötigen noch einen Nutzer, unter dem Froxlor laufen wird:

useradd -s /bin/false -U froxlorlocal

Danach erstellen wir das Verzeichnis für Froxlor

mkdir –p /var/www/froxlor/html

und erstellen uns einen PHP-Starter, der über fcgid angesprochen wird, um die Inhalte auszuliefern:

mcedit /var/www/froxlor/php-starter
chmod +x php-starter

Inhalt:

#!/bin/bash
export PHPRC="/etc/php/7.3/cgi"
exec /usr/bin/php-cgi7.3

Nun werden die Froxlor-Dateien in das html-Verzeichnis extrahiert, die Rechte angepasst und fcgid aktiviert (welches später wieder durch FPM ersetzt wird):

cd /var/www/froxlor/html/
chown –R froxlorlocal:froxlorlocal *apt install libapache2-mod-fcgid php-cgi
a2ensite 001-froxlor && a2enmod headers ssl fcgid && service apache2 restart

Die eigentliche Installation und Nacharbeiten

Froxlor kann nun über den Webinstaller installiert werden, indem man einfach die angegebene URL aufruft. Eventuell müssen noch PHP-Extensions nachinstalliert werden, darüber erhält man im Setup eine Übersicht.

Nach der erfolgreichen Installation ist Froxlor dann zwar verfügbar, aber nicht ganz korrekt eingerichtet:

  • Zunächst einmal müssen unter “IPs und Ports” die korrekten Ports und IP-Adressen eingetragen werden.
  • PHP-FPM muss in den Einstellungen aktiviert werden, damit nicht mehr FCGI verwendet wird.
    • Das Kommando zum Neustarten von PHP-FPM ist: service php7.3-fpm restart
    • Der Pfad zu den php-fpm-Konfigurationen ist: /etc/php/7.3/fpm/pool.d/
    • Die Konfiguration muss noch durchgearbeitet werden (unter dem gleichnamigen Punkt). Hier kann die Config für Debian Stretch verwendet werden, diese funktioniert auch für Buster noch problemlos.

Wenn all diese Einstellungen korrekt vorgenommen wurden, können wir FCGI und die Standard-FPM-Konfiguration abschalten sowie danach den Froxlor-Cronjob laufen lassen, um alle Konfigurationsdateien in Zukunft automatisch zu erzeugen. acme.sh kann danach ebenfalls entfernt werden.

a2disconf php7.3-fpm
apt remove libapache2-mod-fcgid php-cgi
a2dissite 001-froxlor
php /var/www/froxlor/html/scripts/froxlor_master_cronjob.php --force --debug

Fertig! Froxlor ist nun komplett auf Debian 10 Buster lauffähig.

Ich habe lediglich noch einen Symlink auf meine Platte gesetzt, um die Kundendaten auf dieser anstatt der SSD zu speichern:

mv /var/customers /storage/
ln -s /storage/customers /var/customers

Hinweis: Froxlor nutzt in der Standardkonfiguration einige stark “abgespeckte” Einstellungen. So wird z.B. kein Spamfilter und kein TLS beim Mailserver eingesetzt.

Für diese Einstellungen ist die Anleitung hier nicht gedacht. Bitte befasst euch mit der weiteren Konfiguration des Systems, bevor ihr eure Maschine als Produktivsystem ans Netz lasst.

Dieser Beitrag hat 2 Kommentare

    1. Die Anleitung wurde noch zu einem Zeitpunkt geschrieben, als es keine offiziellen Debian-Pakete gab.

      Ich würde mittlerweile sehr dazu raten, die offiziellen DEB-Pakete einzusetzen. Damit PHP 7.4 funktioniert, müssen die PHP-FPM-Einstellungen auch richtig gesetzt sein (und FPM muss laufen).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

An den Anfang scrollen