Zum Inhalt

Selfhosting - Einfach oder doch zu viel Aufwand...?

Selfhosting Bild


Wie ihr wisst bin ich ja quasi ein Quereinsteiger in der Techwelt aber ich habe mir in den letzten Wochen die Zeit genommen und mich in die schier unendlichen Weiten der selbstgehosteten Apps begeben...

Vorbereitungen - Server, Webserver und Docker

Apps und Programme selbst zu hosten ist immer so eine Sache. Zum einen muss man erst einmal ein technisches Verständnis dafür entwickeln, wie die Dinge grundsätzlich funktionieren. Dann braucht man auch noch eine geeigete Infrastruktur in Form eines geegneten Servers, eines geeigneten Netzwerks und wenn man die Programme auch noch öffentlich zugänglich machen will auch noch eine statische IP Adresse und eine eigene Domain.

Wenn man die Grundausrüstung (Geeignete Hardware, Netzwerk, IP Adresse, eigene Domain,...) einmal soweit vorbereitet hat geht es mal an die Auswahl wie ich die Apps auf dem jeweiligen Server bzw. der virtuellen Maschine installieren will. Nach einiger Recherche bin ich dann zu em Schluss gekommen, dass sich für mich und mein Environment Docker Container am besten eignen. Laienhaft erklärt (zumindest habe ich das so am besten für mich verständlich gemacht 😅) ist ein Docker Container eigentlich nichts anderes als eine kleine virtuelle Maschine, die ich auf einem Server (bzw. auf einer virtuellen Maschine) installieren und betreiben kann. Das hat den großen Vorteil, dass man in dem Fall dann nur eine virtuelle Maschine mit einer statischen IP Adresse braucht und man über einen geeigneten Webserver Reverse Proxys zu den jeweiligen Containern zeigen lassen kann. Ich bin hier, aufgrund seiner Einfachheit, ein riesen Fan von Caddy geworden. Der vorteil bei diesem Webserver ist, dass man hier den Reverse Proxy recht einfach mit einer Zeile im Caddyfile (das findet man unter etc/caddy/Caddyfile) hinterlegen kann.

Hier ein Beispiel, wie ein Reverse Proxy Eintrag im Caddyfile ausschauen kann:

subdomain.domain.com {
    reverse_proxy localhost:<Port>
}

Zudem hat der Caddy Webserver auch den Vorteil, dass der Server sich für die, im Caddyfile hinterlegte Subdomain, die dann auf den Docker Container zeigt, automatisch ein HTTPS Zertifikat zieht. Ich weiß, dass man mit dem Webserver auch noch viel mehr machen kann, aber so tief bin ich dann auch noch nicht in das Thema Webserver eingetaucht. Das soll aber auch nicht das heutige Thema sein. Also wieder zurück im Text...

Wir gehen nun davon aus, dass wir bereits eine virtuelle Maschine erstellt haben und auch bereits Caddy als Webserver installiert haben. Nun fehlt uns noch Docker und Docker Compoose, was wir auf unserer virtuellen Maschine installieren müssen. Dafür gibt es direkt auf der Docker Seite eine geeignete Installationsanleitung wo man dann die jeweilige Linux Distribution auswählen kann. Nachdem ich auf meiner virtuellen Maschine Debian installiert habe wähle ich in meinem Fall dann die entsprechende Installatiosanleitung für Debian.

Zusammengefasst muss man im ersten Schritt Docker und Docker Compose zum apt respository hinzufügen und dann Docker und Docker Compose installieren. Dazu muss man bei folgendes machen:

  1. Hinzufügen von Docker in das apt respository:

    # Add Docker's official GPG key:
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # Add the repository to Apt sources:
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    

  2. Installieren der Docker Pakete:

    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

Damit ist unser Server dann auch schon bereit für den ersten selbst gehosteten Docker-Container. 🐳


Recherche zur Auswahl der passenden Apps

Bevor wir nun unsere erste App auf unserem "Docker Server" installieren müssen wir uns aber noch einen Überblick verschaffen, welche Apps wir wollen. Denn wie ich festgestellt habe gibt es wirklich eine Fülle an verschiedenen Apps und Möglichkeiten was wir nun installieren können. Um euch das Googlen ein bisschen zu ersparen habe ich hier eine kleine Liste an Quellen zusammengestellt, die mir bei meiner Auswahl sehr geholfen haben:

  • Die Webseite selfh.sh
  • Opensource is Awsome OSiA + der dazugehörige Youtube Kanal
  • Die Webseite vom Youtuber Dennis Schröder mit seinen Videos vom Youtube Kanal Raspberry Pi Cloud
  • Die Webseite von Marius Hosting - hier wird vorwiegend darauf eingegangen, wie man Docker Container über eine NAS laufen lassen kann, aber die Installationsanleitungen kann man auch wunderbar für den eigenen Docker Server hernehmen.
  • Und nachdem ich ein bisschen Notiz-Apps verrückt bin auch noch noted.lol

Docker Container Manager?

Wenn wir die passende Auswahl an Apps getroffen haben ist dann noch die Frage, ob wir den oder die Docker Container so wie sie sind auf unserem Server laufen lassen wollen, oder ob wir das ganz über einen "Docker Container Manager" laufen lassen wollen. Aber erst einmal vorab - was ist überhaupt ein Docker Container Manager?

Ein Docker Container Manager ist für die Verwaltung einzelner Docker Container oder sogenannter Docker Stacks (einige Programme benötigen mehrere Docker Container zB. einen für die App selber und dann noch einen anderen für die Datenbank) verantwortlich. Der Vorteil dabei ist, wenn er einmal installiert ist muss man für die Verwaltung seiner Docker Container oder für das hinzufügen von Docker Containern nicht mehr gezwungenermaßen ins Terminal. Zudem hat ein Docker Manager auch den Vorteil, dass man auch direkt die Daten des jeweiligen Docker Containers auslesen kann und zudem bieten die einzelnen Docker Manager auch die Möglichkeit direkt aus dem Browserfenster heraus in das Docker-Terminal einzusteigen.
Kurz um erleichtert einem ein Dockermanager doch erheblich das Leben.

Aber Achtung ☝️

Wenn man man den Docker Manager über eine öffentliche Subdomain zugänglich macht muss man ein wirklich sehr starkes Passwort wählen (zumindest 10 Zeichen lang mit Nummern, Groß-Klein Schreibung und Sonderzeichen) und man sollte unbedingt die Docker Terminal Funktion des Docker Managers ausschalten.

Auch hier hat man wieder die Qual der Wahl, denn es gibt unterschiedliche Docker Container Manager:

Ich habe in der Zwischenzeit schon sehr viel darüber gelesen und auch den ein oder anderen Vor- oder Nachteil von dem einen oder dem anderen ausmachen können. Soweit ich weiß ist bei vielen Portainer der Container Manager der Wahl, aber ich habe mich als erstes einmal auf Komodo gestürzt, da es laut der Community der Sweet-Spot zwischen Funktionalität und einfacher Bedienung ist. Aber weil ich auch sehr neugierig bin habe ich zum Vergleich auch Dockge auf einem meiner Server installiert. Und ich kann die Community eigentlich nur bestätigen - Dockge ist sehr einfach gehalten und hat nicht die vielen verschiedenen Einstellungen, die zB. Komodo mit sich bringt. Aber auf der anderen Seite bietet Komodo auch die Möglichkeit, einige Dinge mehr einzustellen und hat zudem auch einen integrierten Update-Manager, der regelmäßig kontrolliert, ob es ein Update gibt und dieses, wenn man das möchte, auch gleich automatisch installiert.
Ich persönlich mag eigentlich sowohl Dockge als auch Komodo, wobei ich, wenn wenige Docker Container auf einem Server installiert werden sollen vermutlich Dockge den Vorzug geben würde.

Und wie installiere ich nun einen Dockermanager?

Am Beispiel von Dockge ist das eigentlich auch kein großer Aufwand. Der erste Schritt ist immer ein Blick auf die Dockge Homepage.

Hier findet man auch auf der ersten Seite gleich die Installationsanleitung:

# Create directories that store your stacks and store Dockge's stack
mkdir -p /opt/stacks /opt/dockge
cd /opt/dockge

# Download your compose.yaml
curl "https://dockge.kuma.pet/compose.yaml?port=5001&stacksPath=%2Fopt%2Fstacks" --output compose.yaml

# Start the Server
docker compose up -d

# If you are using docker-compose V1 or Podman
# docker-compose up -d

Wobei das docker-compose.yaml - File auch ein sehr einfach gehaltenes ist:

services:
  dockge:
    image: louislam/dockge:1
    restart: unless-stopped
    ports:
      - 5001:5001
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data
      # Stacks Directory
      # ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH.
      # ⚠️ 1. FULL path only. No relative path (MUST)
      # ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST)
      - /opt/stacks:/opt/stacks
    environment:
      # Tell Dockge where to find the stacks
      - DOCKGE_STACKS_DIR=/opt/stacks

In einfachen Worten nochmal zusammengefasst: im Ordner opt/ einen Ordner stacks und einen Ordner dockge erstellen. In den Ordner opt/dockge hinein gehen, das docker-compose.yaml File erstellen und mit

docker compose up -d
den Docker Container starten. Und schon ist unser Docker Container Manager unter http://<IP Adresse des Servers>:5001 im Browser erreichbar.

Wenn man Dockge nun mit einer Subdomain öffentlich zugänglich machen will einfach den gewählten Port (der ist im docker-compose.yaml File definiert - in unserem Beispiel oben Port: 5001) in der Firewall freigeben, noch den Reverse-Proxy Eintrag im Caddifile hinterlegen und den Caddyserver neu starten mit

sudo systemctl restart caddy.service
- fertig.

Ein paar Sekunden warten (ein bisschen dauert es bis sich der Caddy Server das HTTPS Zertifikat holt) und schon erreichen wir unseren Docker Manager öffentlich im Browser unter https://subdomain.domain.com erreichbar. Beim ersten Login meldet man sich dann auch gleichzeitig als Admin an und sollte die Daten dann entsprechend seiner Bedürfnisse ändern.


Installation unseres ersten selbst gehosteten Programms

Wenn man genau ist haben wir eigentlich unseren ersten Docker Container bzw. unser erstes Programm bereits installiert - nämlich den Docker Manager Dockge. Und damit haben wir eigentlich auch schon das schwierigste hinter uns gebracht.
Aber in dem Beitrag möchte ich ja mit euch gemeinsam ein kleines Programm installieren, dass wir dann auch gemeinsam verwenden können.

Installation der Notizapp Docmost

Aus der Fülle von unterschiedlichen Programmen habe ich hier als Beispiel einmal die App Docmost gewählt, die ich hier einmal durchgehen möchte. (Weil ich persönlich sehr begeistert von dieser App bin habe ich auch noch einmal ein separates Review dieser App geplant. Hier soll es nun aber erst einmal nur um die Installation von Docmost gehen. Falls euch Docmost auch interessiert findet ihr hier auch noch einmal die entsprechende Installationsanleitung von Docmost direkt)

Um die App nun auf unserem Server zu installieren gehen wir in unseren Dockge Docker Manager und klicken auf + Compose

Dockge Screenshot 1

Danach öffnet sich dann ein Fenster wo wir unterschiedliche Dinge und die Config von Docmost eintragen können. Als erstes müssen wir das neue Stack benennen und deswegen tragen wir hier unter Stack-Name Docmost ein.

Dockge Screenshot 2

Wenn wir das erledigt haben finden wir auf der linken Seite dann auch schon den Bereich in den wir die Dinge eintragen, die in unserem docker-compose.yaml stehen sollen. Ich habe euch hierzu auch nochmal das docker-compose.yaml File direkt von der Docmost Installationsanleitung heraus kopiert:

docmost/docker-compose.yaml
version: "3"

services:
docmost:
image: docmost/docmost:latest
depends_on:
  - db
  - redis
environment:
  APP_URL: "http://localhost:3000"
  APP_SECRET: "REPLACE_WITH_LONG_SECRET"
  DATABASE_URL: "postgresql://docmost:STRONG_DB_PASSWORD@db:5432/docmost?schema=public"
  REDIS_URL: "redis://redis:6379"
ports:
  - "3000:3000"
restart: unless-stopped
volumes:
  - docmost:/app/data/storage

db:
    image: postgres:16-alpine
environment:
  POSTGRES_DB: docmost
  POSTGRES_USER: docmost
  POSTGRES_PASSWORD: STRONG_DB_PASSWORD
restart: unless-stopped
volumes:
  - db_data:/var/lib/postgresql/data

redis:
    image: redis:7.2-alpine
    restart: unless-stopped
    volumes:
      - redis_data:/data

volumes:
    docmost:
    db_data:
    redis_data:

Das kopiert ihr einfach in das Feld:

Dockge Screenshot 2

Wenn ihr dann alles soweit eingerichtet und konfiguriert habt (A-Record für die Subdomain gesetzt, Port in der Firewall freigegeben, Reverse Proxy im Caddy Webserver gesetzt und Caddy neu gestartet) dann müsst ihr in Dockge einfach nur noch auf Speichern und dann auf 🚀 Deployen klicken. Damit werden dann die Docker Container runter geladen und gestartet. Wenn ihr nun eure Seite im Browser eingebt https://docmost.subdomain.com öffnet sich gleich das Erstlogin Fenster von Docmost und schon könnt ihr Docmost nach belieben verwenden.

Und das war's auch schon, Mit diesen paar Schritten haben wir nun einen Webserver (Caddy), Docker, einen Docker - Manager (Dockge) und unsere aller erste App Docmost auf unserem Server installiert.


Fazit

Auch wenn es auf den ersten Blick überwältigend kompliziert aussieht ist es am Ende des Tages eigentlich gar nicht so schwer ein Programm / eine App selbst zu hosten. Ich gebe zu für einen kompletten Laien kann es schon ein wenig überfordernd sein, aber wenn man sich die Dokumentation gewissenhaft durchliest - Betonung auf GEWISSENHAFT ☝️ (ich kann euch sagen hier spreche ich selbst aus Erfahrung 🙈) - dann ist es eigentlich gar nicht so schwer seine Programme auf dem eigenen Server selbst zu hosten.
Bleibt auf jeden Fall dran, denn ich habe vor hier noch die ein oder andere App zu reviewen.