Einen Homeserver einrichten

Zuletzt aktualisiert am 2. Februar 2024 9 Minuten

VorWort

Wir leben in digitalen Zeiten, und im Zeitalter der externen Dienste, in denen wir alles auslagern. Wir verlieren so die Hoheit über unsere Daten: Alles liegt fragmentiert bei verschiedenen, fremden Dienstleistern. Dem möchte ich etwas entgegen wirken, und einen eigenen Server aufbauen. Welche Anwendungen / Dienste sollen darauf laufen?

  • Allgemeine Dateiablage
    • Verzeichnisse für Nutzer im Netzwerk verfügbar.
  • Medienbibliothek
    • Emby / Jellyfin fürs Streamen von Audio und Video
    • Callibre-Web für eBooks / Audiobooks
  • Timetracker
    • Wakapi
  • Notizen / TODO Listen / Recherchen
    • Joplin. Der Joplin-Server sorgt dabei für die zentrale Datenhaltung. Die Notiz-App gibt es für jedes Betriebssystem.
  • Webserver / Wordpress
    • Ein Apache mit PHP und mySQL Datenbank.
    • Spezielle Wordpress Instanzen
  • Versionsverwaltung für Quellcodes und andere Dokumente
    • GIT Repository
  • Cloud?

Dazu kommen noch für die Verwaltung:

  • Docker, zum orchestrieren der Anwendungen.
  • Evtl. weitere Tools zum administrieren.
  • Absicherung des Systems…
  • Eine Backup Strategie…

Die Hürden, um so ein Projekt um zu setzten sind relativ niedrig. Natürlich geht das nicht ganz ohne technisches Verständnis, aber es ist durch moderne Technologien wie Docker einfacher denn je. Was kommt, ist die Verantwortung und Aufwand für Betrieb - die Zeit fehlt dann für anderes.

Erste Schritte hatte ich bereits mit einem Raspberry-pi unternommen. Den möchte ich jetzt durch einen passiv gekühlten leistungsfähigeren Barebone ablösen, und um weitere Dienste ergänzen. Das ganze soll so minimalistisch und einfach wie möglich gehalten werden, und wann immer möglich und sinnvoll auf OpenSource basieren.

Der Server soll zunächst nur im Intranet laufen. Später aber auch insgesamt, oder in Teilen über die Fritz!Box im Internet zugänglich sein.

Die Hardware

Die Wahl fiel im Januar 2022 auf folgendes Gerät:

  • ZOTAC ZBOX CI662 NANOexternal link , den ich ausstatte mit:
  • Speicher: 2x16GB Kingston D4-266 KCP426 SD8/16
  • Interne Festplatte: 1TB Samsung für das System.
  • Externe USB Festplatten: 2x 3TB WD eine für Daten und eine als Backup
  • und dazu demnächst noch ein kleines Raid…

Alternativen wären gewesen:

Aktuellere Systeme mit mehr Leistung, aber auch deutlich teuerer:

Betriebssystem OpenMedia Vault / Debian

Das wird die Basis des Servers. Kommt mit einem schlanken Debian Linux.

Danach kann der Stick nicht mehr vom Mac gelesen werden. 

  • Das macht aber nix. Die Meldung einfach ignorieren, und den Stick vom Mac abziehen.

  • Tastatur und Bildschirm anschließen.

  • USB-Stick In den Server stecken und Gerät einschalten.

  • Setup durchlaufen.

SSH funktioniert oft of the Box, damit kann Tastatur und Monitor abgeklemmt werden.

  • server.local

  • User: root

  • Passwort: dasrootpasswort

  • Servername: server

  • Webzugang: http://server.local

  • user: admin

  • Passwort: openmediavault

Konfiguration…

  • Allgemeine Einstellungen
    • System -> Allgemeine Einstellungen
    • Port: 81 (auf 80 möchte ich den Apache-Webserver legen)
    • Automatische Abmeldung: 30 Minuten
    • ssl kommt später
    • Hier sollte auch das Passwort geändert werden.
    • Speichern

Danach ist der  Webzugang erreichbar über: http://server.local:81external link

  • Zertifikate
    • System -> Zertifikate ->  hinzufügen
    • Ein Zertifikat anlegen für sftp und https. Ich hab eine Gültigkeit von 10 Jahren festgelegt, das Zertifikat kann ich aber jederzeit austauschen. So ein Selbstzertifikat sorgt im Browser immer für doofe Meldungen.  Man muss ihm Vertrauen, und es zu der Liste der vertrauenswürdigen Zertifikate hinzufügen. Danach lässt sich die Seite problemlos und ohne Sperre aufrufen.
  • SFTP einrichten
    • Über ein zusätzliches Plugin.
  • SMB Zugriff
  • OMV Extras installieren
    •  Terminal des OMV-Rechners mit root-Rechten:

sudo wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash

Danach befindest sich ein neuer Menü-Eintrag in OMV: Systen -> OVM-Extras

  1. Systen -> OVM-Extras -> Reiter Docker -> Button Docker -> installieren
  2. Systen -> OVM-Extras -> Reiter Docker -> Button Portainer -> installieren
  3. Systen -> OVM-Extras -> Reiter Docker -> Button Yacht -> installieren
  4. Systen -> OVM-Extras -> Reiter Cockpit -> Button Cockpit -> installieren

Portainer / Yacht

Yacht ist eine Portainer Alternative. Ich kann so beide mal testen.

Cockpit

Ist eine Webschnittstelle, über die das Basis dienende Debian-Linux die bequem administriert werden kann. Zum Beispiel können Updates eingespielt werden, User angelegt, VMs eingerichtet werden, etc.

Freigabe einrichten

In OpenMediaVault muss eine Freigabe für das Verzeichnis angelegt werden in dem die Docker Container ihre Daten ablegen dürfen.

OMV -> Zugriffskontrolle -> Freigaben

Es reicht meist eine zentrale Freigabe auf das Root Verzeichnis der Docker-Daten. Bei mir ist das zB. der folgende absolute Pfad zu einer externen Festplatte mit dem schönen Namen MEDIA_LIB:

/srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA_LIB/

Den Absoluten Pfad muss erst wie folgt angezeigt werden. Dann kann man ihn abtippen, oder etwas tricky mit Copy and Paste aus dem Quelltext entnehmen:

In OpenMediaFault den absoluten Pfad einer Freigabe ermitteln (Browser Safari).

Applikationen  installieren

Das funktioniert schön bequem über Docker. Passwörter und Pfade in den Skripten müssen natürlich entsprechend angepasst werden.

Wakapi Time Tracking

Wakapiexternal link ist ein automatisiertes Timetracking Tool.

Den Container bringe ich übers Terminal ans laufen:

docker run -d \\
  -p 3000:3000 \\
  -e "WAKAPI\_PASSWORD\_SALT=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-32} | head -n 1)" \\
  -v /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/wakapi-data:/data \\
  --name wakapi n1try/wakapi

Emby / Jellyfin

Der Medienserver. Dazu hab ich hier schon einiges geschrieben als ich das auf dem Raspberry-Pi eingerichtet habe. UID und GID bestimme ich auf dem Server über das Terminal:

id admin
uid=998(admin) gid=100(users) groups=100(users),993(openmediavault-admin)

Bei den Volumes wieder darauf achten das eine Freigabe in OVM existiert.

version: "2.3"
services:
  emby:
    image: emby/embyserver
    container\_name: embyserver
    network\_mode: host # Enable DLNA and Wake-on-Lan
    environment:
      - UID=998 # The UID to run emby as (default: 2)
      - GID=100 # The GID to run emby as (default 2)
      - GIDLIST=100 # A comma-separated list of additional GIDs to run emby as (default: 2)
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/jellyfin:/config
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/:/medialib/
    ports:
      - 8096:8096 # HTTP port
      - 8920:8920 # HTTPS port
    devices:
      - /dev/dri:/dev/dri # VAAPI/NVDEC/NVENC render nodes
    restart: unless-stopped

Calibre-Web

eBook Management mit Calibreexternal link , und dazu eine schöne Weboberfläche mit Calibre-Web:

Die Anwendung des Docker Compose Skripts war problemslos. Im Verzeichnis /books/ wird die Callibre Datenbank abgelegt, daraus bedient sich dann das Web Frontend um die Webseite auf zu bauen.

version: "2.1"
services:
  calibre-web:
    image: lscr.io/linuxserver/calibre-web
    container\_name: calibre-web
    environment:
      - PUID=998
      - PGID=100
      - TZ=Europe/London
      - DOCKER\_MODS=linuxserver/calibre-web:calibre #optional
      - OAUTHLIB\_RELAX\_TOKEN\_SCOPE=1 #optional
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/calibre-web/config:/config
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/calibre-web/books:/books
    ports:
      - 8090:8083
    restart: unless-stopped

Da die Calibre Datenbank noch lokal auf meinem Rechner liegt, sorge ich mit einem Hazelexternal link Kopier-Task dafür das Calibre-Web mit den Änderungen versorgt wird:

Joplin

Joplinexternal link ist eine leistungsfähige, Markdownexternal link basierte, OpenSource Notiz-App, mit einer freundlichen und regen Community. Die Apps sind nicht fertig und etwas ungeschliffen, das merkt man an jeder Ecke, der Server entsteht auch gerade erst. Das schränkt aber die generelle Brauchbarkeit nicht ein, und Hey: Ich bin wieder Herr über meine Daten! Das ist eh unbezahlbar. Wenn man von der hochpolierten Konkurrenz zB. Evernote kommt wird man vielleicht dezent enttäuscht sein, vor allem was das Thema Zusammenarbeit angeht. Meine persönlichen Notizen Todo-Listen wandern jetzt jedenfalls erst mal von der Mac App Notizen und dem hervorragenden Thingsexternal link nach Joplin.

Das Setup des Servers war mit dem Docker Compose Skript komplett problemlos. Der Pfad zu den Volums und die User und Passwörter müssen wieder natürlich individuell angepasst werden. Selbiges gilt evtl. für die Ports.

version: "3"
services:
  db:
    image: postgres:13
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/docker-data/joplin:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped
    environment:
      - POSTGRES\_PASSWORD=joplinpw
      - POSTGRES\_USER=joplinuser
      - POSTGRES\_DB=joplindb
  app:
    image: joplin/server:latest
    depends\_on:
      - db
    ports:
      - "22300:22300"
    restart: unless-stopped
    environment:
      - APP\_PORT=22300
      - APP\_BASE\_URL=http://server.local:22300
      - DB\_CLIENT=pg
      - POSTGRES\_PASSWORD=joplinpw
      - POSTGRES\_DATABASE=joplindb
      - POSTGRES\_USER=joplinuser
      - POSTGRES\_PORT=5432
      - POSTGRES\_HOST=db

Er ist danach unter der Adresse erreichbar: http://server.local:22300/external link und kann nach dem ersten Login mit admin@localhost und dem Passwort admin weiter konfiguriert, und weitere Nutzer eingerichtet werden.

Die Clients erfordern auch etwas Konfiguration. Es gibt eine große Anzahl an Plugins für die Desktop Apps, mit denen die Funktion erweitert werden kann. Diese stehen allerdings noch nicht auf den Smartphone Versionen zur Verfügung.

Schreiben und verwalten der Notizen ist am Desktop am komfortabelsten. unterwegs Notizen mit den anderen Apps erfassen, auch ohne Verbindung zum Server. zu Hause wird wieder synchronisiert. Nach ein paar Umbauten und neuer Strukturierung schaut das bei mir so aus:

Wer viel auf dem Desktop schreibt - als Autor oder Journalist zum Beispiel, dem empfehle ich dazu das ebenso kostenlose OpenSource Programm Zettlrexternal link . Es harmoniert super mit Joplin. Damit kann man störungsfrei schreiben, denn es hat einen Ablenkungsfreien Modus, sowie einen Schreibmaschinen Modus. Wie mächtig Zettl trotz Minimalismus ist, kann man der Anleitung entnehmen:

Der Web-Clipperexternal link für die Browser Mozillaexternal link und Chromeexternal link - leider (derzeit) nicht für Safari - hilft bei der Recherche bzw. dem Sammeln von Quellen. Das ganze funktioniert ein bisschen wie DevonThinkexternal link “superlight”.

Apache / php / mySQL

Eine klassische Umgebung zum Entwickeln von Web-Anwendungen. Der Container läuft noch nicht ganz rund. Hier solle auch [diese meine Web(re)präsentation] eine zweite Heimat finden.

version: "3"
services:
  db:
    image: bitnami/mysql:5.7
    environment:
      - MYSQL\_ROOT\_PASSWORD=rootpw
      - MYSQL\_USER=admin
      - MYSQL\_PASSWORD=pw
    ports:
      - '3306:3306'
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/apache-01/mysql/data:/bitnami/mysql/data
  php:
    image: bitnami/php-fpm:7.4
    depends\_on:
      - redis
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/apache-01/www:/app:delegated
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/apache-01/php/php.ini:/opt/bitnami/php/etc/conf.d/php.ini:ro
  apache:
    image: bitnami/apache:2.4
    ports:
      - '80:8080'
      - '443:8443'
    depends\_on:
      - php
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/apache-01/www:/app:delegated
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/apache-01/apache/my\_vhost.conf:/vhosts/myapp.conf:ro
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/apache-01/apache/certs:/certs
  redis:
    image: bitnami/redis:6.0
    environment:
      - REDIS\_PASSWORD=apache01pw
  phpmyadmin:
    image: bitnami/phpmyadmin:latest
    ports:
      - '82:8080'
      - '8143:8443'

- [http://server.local/](http://server.local) - Webverzeichnis
- [http://server.local:82/](http://server.local:82/) - phpMyAdmin
- Mit der Datenbank verbinden:
    - host: server.local
    - Port: 3306
    - User: admin
    - Passwort: pw

Beim Anmelden bei phpMyAdmim gibts noch eine Fehlermeldung zu Bewundern:

phpMyAdmin kann noch nicht mit der Datenbank reden, obwohl alle Container im selben Netzwerk laufen. Der Rest geht aber soweit. Das ganze muss jetzt noch weiter konfiguriert werden…

Wordpress

Ein isolierter Wordpress Container mit allem was nötig ist um mal schnell eine Wordpress-Instanz zu betreiben:

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS\_DB\_HOST: db
      WORDPRESS\_DB\_USER: db\_user
      WORDPRESS\_DB\_PASSWORD: db\_pw
      WORDPRESS\_DB\_NAME: db\_wp
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/wordpress-01/web:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL\_DATABASE: db\_wp
      MYSQL\_USER: db\_user
      MYSQL\_PASSWORD: db\_pw
      MYSQL\_RANDOM\_ROOT\_PASSWORD: '1'
    volumes:
      - /srv/dev-disk-by-uuid-3be5a412-3266-4e6b-a816-3bcd77d4da1b/MEDIA\_LIB/config/wordpress-01/database:/var/lib/mysql

GIT Server

Das ist knifflig… Fortsetzung folgt…