Heimserver für Nextcloud und Matrix-Synapse

Aus DebianforumWiki
Wechseln zu: Navigation, Suche
Baustelle.png Baustelle: Dieser Artikel ist eine Baustelle. Das heißt, jemand hat sich dieses Artikels angenommen und überarbeitet ihn gerade.


to do

Seite umbenennen: es geht um Nextcloud und ejabberd

Einleitung

Diese Anleitung beschreibt, wie man einen Heimserver mit Nextcloud und ejabberd aufsetzt. Als Datenbank wird jeweils PostgreSQL verwendet. Die Zertifikate zum Absichern der Verbindungen werden von Let’s Encrypt bereitgestellt.

Die Beschreibung wird anhand eines LXC-Containers erstellt, in dem Debian 10 betrieben wird. Man kann die Dienste auch ohne einen Container betreiben, ein Container hat aber den Vorteil, dass man diesen – ein geeignetes Dateisystem vorausgesetzt – snapshotten oder auf eine andere Maschine umziehen kann. In der Anleitung wird von einem btrfs-Dateisystem auf dem Host ausgegangen und der Container entsprechend eingerichtet.

Als Subdomains für die Dienste werden nextcloud.domain.tld und jabber.domain.tld angegeben; diese müssen bei Verwendung der Anleitung durch die tatsächlichen Subdomains ersetzt werden. Der Host heißt demo und der Container container.

Um Nextcloud und ejabberd hinter einem Router betreiben zu können, müssen am Router Portfreigaben eingerichtet werden. Die Ports werden in der Anleitung genannt, nicht aber die Einrichtung am Router erklärt, da dies bei jedem Router anders funktioniert.

Erstellen des Containers

Allgemeines

LXC-Container lassen sich privilegiert oder unprivilegiert betreiben. Ein unprivilegierter Container verwendet einen Bereich von Sub-UIDs und Sub-GIDs anstelle der UID/GID des betreibenden Users. Für Nextcloud und ejabberd ist ein unprivilegierter Container ausreichend. Der Container wird systemweit (von root) betrieben, damit spart man sich weitere Maßnahmen, um den Container automatisch zu starten und Netzwerkzugriff zu geben.

Erstellen der Netzwerkbrücke

Damit Container Netzzugriff haben und von außen erreichbar sind, müssen sie mit einer Netzwerkbrücke verbunden werden. Diese muss auf dem Host eingrichtet werden, bspw. nach dieser Anleitung. In der weiteren Beschreibung wird angenommen, dass die Netzwerkbrücke br0 heißt.

Installation und Konfiguration von LXC

Zunächst wird LXC aus main installiert:

# apt install lxc

Danach wird werden root Sub-UIDs/Sub-GIDs gem. Anleitung zugeteilt, damit systemweite Container unprivilegiert laufen können. Dazu wird in die Dateien /etc/subuid und /etc/subgid (ggf. anlegen) jeweils die Zeile

root:100000:65536

eingefügt. Danach trägt man in die Datei /etc/lxc/default.conf die Zeilen

lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536

ein.

Erstellen und Konfigurieren des Containers

Container werden anhand von Templates erstellt. Das Template download bietet den Download u.a. vorgefertigter Images für Debian an.

root@demo:~# lxc-create -n container -t download -B btrfs
Setting up the GPG keyring
Downloading the image index

---
DIST    RELEASE ARCH    VARIANT BUILD
---
alpine  3.10    amd64   default 20190909_13:00
alpine  3.10    arm64   default 20190909_13:00
...
debian  buster  amd64   default 20190910_05:24
...
 voidlinux       current i386    default 20190909_17:10
---

Distribution: 
debian
Release: 
buster
Architecture: 
amd64

Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs

---
You just created a Debian buster amd64 (20190910_05:24) container.

To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.

Vor dem ersten Start wird der Container mit der Netzwerkbrücke br0 verbunden, indem man die Konfigurationsdatei /var/lib/lxc/container/config bearbeitet.

# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.hwaddr = 00:16:3e:00:00:01
lxc.net.0.flags = up

Über hwaddr wird der virtuellen Netzwerkkarte des Containers eine MAC zugewiesen, so dass der heimische Router den Container wiedererkennen kann. Die ersten drei Byte (00:16:3e) zeigen den Hersteller an und gehören in diesem Fall Xensource; LXC vergibt zufallsgenerierte MAC-Adressen aus diesem Bereich.

Der Container erhält vom Router via DHCP eine IPv4-Adresse zugewiesen. Möchte man eine solche fest zuweisen, so kann man diese auch in der Konfigurationsdatei angeben:

lxc.net.0.ipv4.address = 192.168.178.2/24
lxc.net.0.ipv4.gateway = 192.168.178.1

Weitere Netzwerkkonfiguration innerhalb des Containers erübrigt sich in beiden Fällen.

Außerdem wird dafür gesorgt, dass der Container zukünftig beim Start des Hosts automatisch mitgestartet wird:

lxc.start.auto = 1

Danach wird der Container gestartet und man kann ausprobieren, ob man sich mit ihm verbinden kann:

root@demo:~# lxc-start -n container
root@demo:~# lxc-attach -n container
root@container:~# uname -a
Linux container 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2 (2019-08-28) x86_64 GNU/Linux
root@container:~# 

Als allererstes sollte man im Container die gewünschten Locales generieren und eine davon als Vorgabe einstellen (für Deutschland sollte man de_DE.UTF-8 wählen):

# dpkg-reconfigure locales

Wer möchte, kann nun auch openssh-server und einen User einrichten. Bei der Gelegenheit kann man root auch ein Passwort geben. Außerdem sind im Container viele Tools, die man als selbstverständlich annimmt, nicht installiert. Dazu gehören bspw. less, nano und sogar man. Deren Installation kann man nun auch nachholen.

Wer viele Container betreibt, sollte über die Verwendung eines Paketcaches wie bspw. apt-cacher-ng nachdenken – schon allein, um die Debian-Spiegel zu entlasten.

Grundlegende Software installieren

Nun ist es an der Zeit, etwas grundlegende Software zu installieren:

root@container:~# apt install apache2 libapache2-mod-php python3-certbot-apache postgresql php-pgsql

Damit ist ein LAPP (Linux, Apache, PosgreSQL, PHP) grundlegend aufgesetzt und mit Certbot kann dieser mit Zertifikaten von Let’s Encrypt versehen werden. Dass der Webserver funktioniert, kann durch Eingabe von http://container (durch den korrekten internen Hostnamen ersetzen) im Browser geprüft werden. Man sieht dann die mitgelieferte Startseite von Apache unter Debian.

Nun aktivieren wir die SSL-Unterstützung im Apache:

root@container:~# a2ensite default-ssl.conf
Enabling site default-ssl.
To activate the new configuration, you need to run:                            
  systemctl reload apache2
root@container:~# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2
root@container:~# systemctl restart apache2

Der Aufruf von https://container sollte nun auch die Startseite zeigen. Da das verwendete SSL-Zertifikat ein „Schlangenöl-Zertifikat“ ist, muss man zuvor im Browser eine Sicherheitswarnung bestätigen.

Die https-Startseite kann nun wieder deaktiviert werden, da wir sie nicht benötigen:

root@demo:~# a2dissite default-ssl.conf && systemctl reload apache2

Zur Sicherheit noch ein kleiner Blick auf PostgreSQL:

root@container:~# sudo -i -u postgres psql                                          
psql (11.5 (Debian 11.5-1+deb10u1))
Geben Sie »help« für Hilfe ein.

postgres=# \l+

Nun sollten die Systemtabellen und Templates samt Größe angezeigt werden:

                                                                    Liste der Datenbanken
   Name    | Eigentümer | Kodierung | Sortierfolge | Zeichentyp  |  Zugriffsprivilegien  |  Größe  | Tablespace |                Beschreibung                
-----------+------------+-----------+--------------+-------------+-----------------------+---------+------------+--------------------------------------------
 postgres  | postgres   | UTF8      | de_DE.UTF-8  | de_DE.UTF-8 |                       | 7709 kB | pg_default | default administrative connection database
 template0 | postgres   | UTF8      | de_DE.UTF-8  | de_DE.UTF-8 | =c/postgres          +| 7569 kB | pg_default | unmodifiable empty database
           |            |           |              |             | postgres=CTc/postgres |         |            | 
 template1 | postgres   | UTF8      | de_DE.UTF-8  | de_DE.UTF-8 | =c/postgres          +| 7569 kB | pg_default | default template for new databases
           |            |           |              |             | postgres=CTc/postgres |         |            | 

Das reicht erst mal, also gehen wir wieder raus.

postgres=# \q

Weiteres Feintuning von PostgreSQL oder das Deaktivieren von Copy-on-Write für dessen Datenverzeichnis lassen wir an dieser Stelle weg. (Wer im Netz sucht, findet genug Stimmen, die das Deaktivieren von Copy-on-Write für Spielzeugdatenbanken als überflüssig erachten. Und die Datenbank einer heimischen Nextcloud mit einer handvoll User ist Spielzeug.)

Der eingebaute Datenbank-Superuser postgres hat kein Passwort. Wir geben ihm auch keines, da wir für Nextcloud und ejabberd separate User anlegen und den Superuser postgres nur wie oben gezeigt lokal über sudo aufrufen werden.

Spätestens jetzt sollte man den Container herunterfahren und die bisherige Arbeit als Snapshot festhalten:

root@demo:~# lxc-stop -n container
root@demo:~# lxc-snapshot -n container
root@demo:~# ls /var/lib/lxc/container/snaps/
snap0
root@demo:~#

Installation von Nextcloud

Die nachfolgende Anleitung orientiert sich an der offiziellen Installationsanleitung für Nextcloud 16, wendet diese aber auf Debian 10 und weicht an einigen Punkten (begründet) ab.

PostgreSQL für Nextcloud einrichten

Zu allererst richten wir eine Datenbank und einen Benutzer ein. Abweichend zur offiziellen Anleitung vergeben wir ein Passwort.

root@container:~# sudo -u postgres psql
psql (11.5 (Debian 11.5-1+deb10u1))
Geben Sie »help« für Hilfe ein.

postgres=# CREATE USER nextcloud PASSWORD 'hierdaspasswordangeben';
CREATE ROLE
postgres=# CREATE DATABASE nextcloud OWNER nextcloud;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;
GRANT
postgres=# \q
root@container:~#

Hier ist es wichtig, CREATE USER und nicht CREATE ROLE zu verwenden, da das LOGIN-Privileg benötigt wird, das bei CREATE USER automatisch vergeben wird.

Nextcloud herunterladen und entpacken

Als nächsten Schritt laden wir uns auf https://nextcloud.com/install/#instructions-server die Installationsdatei herunter und entpacken diese. Danach finden wir ein Verzeichnis nextcloud vor. Dieses verschieben wir nach /var/www/ und setzen den Eigentümer auf den des Webservers:

# mv nextcloud/ /var/www/
# chown -R www-data:www-data /var/www/nextcloud/

Apache einrichten

Danach bauen wir uns eine Konfigurationsdatei für Apache2 zusammen, indem wir die Beispieldatei nehmen, diese als /etc/apache2/sites-available/nextcloud.conf ablegen und die Konfiguration aktivieren.

# a2ensite nextcloud.conf

Die Aufforderung zum Neuladen der Apache-Konfiguration ignorieren wir.

Außerdem aktivieren wir ein paar Apache-Module wie empfohlen:

# a2enmod rewrite
# a2enmod headers
# a2enmod env
# a2enmod dir
# a2enmod mime

Die Aufforderungen zum Neustarten von Apache ignorieren wir.

Jetzt müssen eine Menge PHP-Module nachinstalliert werden:

# apt install php-gd php-json php-curl php-mbstring php-intl php-imagick php-xml php-zip

Jetzt starten wir Apache2 neu und schauen, ob wir den Nextcloud-Installer unter http://container/nextcloud/ aufrufen können.

# systemctl restart apache2

Ab da klicken wir uns durch den grafischen Installer.

  • Als Anwender richten wir sicherheitshalber einen separaten Admin-Account ein.
  • Das Datenverzeichnis lassen wir wie vorgeschlagen.
  • Bei der Datenbankkonfiguration geben wir Datenbank, Benutzer und Passwort wie oben vergeben an. Der DB-Server ist localhost, die Portnummer kann man weglassen.

Die ganzen Warnungen, dass die Verbindung unverschlüsselt ist, ignorieren wir erst mal. SSL kommt später.

Nach dem Klick auf den Button ganz unten arbeitet das System eine Weile, während die Datenbank eingerichtet wird. Danach landet man direkt in der Nextcloud.

Spätestens jetzt sollte man den Container verlassen, herunterfahren und das bislang erreichte vermittels lxc-snapshot festhalten.

Installation von ejabberd

ejabberd mit psql

Config für Apache2

Zertifikat mit Let’s Encrypt holen

Deployment-Skript für Zertifikat

Datenbank anlegen und betanken

ejabberd konfigurieren

admin anlegen und konfigurieren

Weblinks

unprivilegierte LXC-Container: https://linuxcontainers.org/lxc/getting-started/#creating-unprivileged-containers-as-a-user

Netzwerkbrücke mit systemd-networkd: https://wiki.debian.org/SystemdNetworkd#setting_up_a_network_bridge

Installationsanleitung Nextcloud: https://docs.nextcloud.com/server/16/admin_manual/installation/source_installation.html#

Konfigurationsdatei Apache2: https://docs.nextcloud.com/server/16/admin_manual/installation/source_installation.html#apache-web-server-configuration

Datenbankkonfiguration Nextcloud: https://docs.nextcloud.com/server/16/admin_manual/configuration_database/index.html (Achtung, richtet DB-User ohne Passwort ein)

Zertifikat holen: https://certbot.eff.org/lets-encrypt/debianbuster-apache