Skip to content

Mein erster eigener Server

14. Jan. 2024 (vor 3 Monaten)

8 Minuten Lesezeit

MacBook Desktop

Das ist mein erster Linux-Server mit einem virtuellen privaten Server und Docker. In diesem Artikel geht es um meine Erfahrungen mit meinem ersten Server und wie ich ihn eingerichtet habe.

Inhaltsverzeichnis

Warum ein Server?

Bisher habe ich alle meine Projekte bei Vercel gehostet, was immer eine sehr gute Erfahrung war. Aber ich wollte mehr Kontrolle über meine Projekte haben und auch einige andere Dienste wie einen Minecraft-Server oder meinen eigenen Git-Server hosten. Also habe ich mich entschieden, einen virtuellen privaten Server zu mieten und einige meiner Projekte darauf zu hosten und einfach damit zu experimentieren.

Anbieter

Es gibt viele Anbieter da draußen und jeder hat seine Vor- und Nachteile. Für mich war es wichtig, einen Anbieter in Deutschland mit einem guten Preis-Leistungs-Verhältnis zu haben. Ich habe mich für Ionos entschieden, weil ich bereits meine Domain dort habe und das Preis-Leistungs-Verhältnis meiner Meinung nach wirklich gut ist. Ich habe den VPS Linux M gewählt, der 2 vCores, 4 GB RAM und 160 GB SSD-Speicher für 8 €/Monat bietet.

Betriebssystem

Das vorinstallierte Betriebssystem ist Ubuntu, was für mich eine gute Wahl ist, weil ich bereits Erfahrung damit habe. Es gibt viele Self-Hosting-Lösungen, die eine einfache Installation und Verwaltung verschiedener Dienste bieten, aber ich wollte alles selbst machen, um mehr darüber zu lernen. Also entschied ich mich, Docker zu verwenden, um alle meine Dienste zu verwalten, und Docker Compose für die Verwaltung der Container.

Konfigurationen

Um meine Konfiguration im Blick zu behalten, habe ich ein privates Repository auf GitHub, in dem ich alle meine Konfigurationsdateien speichere. Ich verwende auch GitHub Actions, um meine Konfiguration automatisch auf den Server zu deployen, wenn ich in das Repository pushe.

Sicherheit

Eine der wichtigsten Dinge ist die Sicherheit. Ich möchte meinen Server so sicher wie möglich halten und auch darüber informiert sein, was auf meinem Server passiert. Ein Vorteil meines Anbieters ist ihre Firewall, mit der ich konfigurieren kann, welche Ports geöffnet und welche geschlossen sind. Ich habe nur die Ports geöffnet, die für meine Dienste benötigt werden.

SSH

Ich möchte kein Passwort für die Anmeldung an meinen Server verwenden, also habe ich mich entschieden, SSH-Keys zu nutzen. Außerdem habe ich den Port des SSH-Servers auf einen zufälligen Port geändert, um es Angreifern schwerer zu machen, den SSH-Server zu finden.

# /etc/ssh/sshd_config
PasswordAuthentication no
Port 15729
StrictModes yes
MaxAuthTries 5
MaxSessions 3

Mit dieser SSH-Konfiguration kann ich sicherstellen, dass der SSH-Server gegen die meisten Angriffe geschützt ist.

CrowdSec

Nach dem Schutz des SSH-Servers wollte ich den Rest des Servers schützen, weshalb ich CrowdSec installiert habe.

🔒

CrowdSec ist eine Open-Source-Software, die bösartige Akteure auf verschiedenen Ebenen durch Log-Analyse und Bedrohungsmuster, sogenannte Szenarien, erkennt und blockiert.

Ich habe CrowdSec so konfiguriert, dass es die Protokolle meines Nginx-Servers liest und dann einen "Bouncer" verwendet, um bösartige Anfragen zu blockieren.

Services

Minecraft Server

Das Wesentliche für jeden Server. Ich denke, ich muss nicht erwähnen, warum jemand einen Minecraft-Server braucht. Ich kann es sehr empfehlen, einen Minecraft-Server selbst einzurichten, wenn man nicht mit Docker vertraut sind und es lernen möchten. Es ist eine gute Möglichkeit zu lernen, wie man Docker verwendet und konfiguriert.

Portainer

Zur Verwaltung aller meiner Container verwende ich Portainer, was auch als Docker-Container installiert werden kann. Es ist bei weitem das einfachste Setup aller Container, weil man nur den Container starten muss und dann auf die Weboberfläche zugreifen kann.

# docker-compose.yml
services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    ports:
      - '9443:9443'
    volumes:
      - ./portainer-data:/data
      - /var/run/docker.sock:/var/run/docker.sock

Nginx

Nginx ist der Webserver, der alles zusammenführt. Der komplizierteste Teil hier war das Konfigurieren der Subdomains und der SSL-Zertifikate, aber danach können einfach Routen hinzugefügt werden.

location /portainer/ {
        proxy_pass http://portainer:9000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
}

Netdata

Netdata ist ein Überwaltungstool, das Metriken über den Server bereitstellt. Meiner Meinung nach ist das ein Muss für jeden Server, weil es viele Informationen über die Servernutzung und seine Dienste liefert.

Netdata dashboard

Ein großer Vorteil von Netdata sind die Webhook-Benachrichtigungen, die verwendet werden können, um Benachrichtigungen an Discord, E-Mail oder Slack zu senden. Ich habe mich entschieden, einen Discord-Server zu erstellen, auf dem ich alle Arten von Benachrichtigungen von meinem Server erhalten kann. Wenn mein Server nicht erreichbar ist, erhalte ich jetzt eine Benachrichtigung von Netdata und kann überprüfen, was passiert.

Watchtower

Watchtower ist ein Container, der automatisch alle anderen Container-Images aktualisiert. Das ist eine großartige Möglichkeit, alle Container auf dem neuesten Stand zu halten, ohne das manuell machen zu müssen. Es hat auch die Möglichkeit, Benachrichtigungen an Discord zu senden, was großartig ist, um die Updates im Auge zu behalten.

Gitea

Gitea ist ein selbstgehosteter Git-Dienst, der eine gute Alternative zu GitHub ist. Ich habe nicht vor, alle meine Repositories auf meinen eigenen Git-Server zu verschieben, aber ich habe einen Mirror für alle meine Repositories eingerichtet. So kann ich immer noch GitHub verwenden, aber auch eine Sicherung meiner Repositories auf meinem eigenen Server haben.

Es hat auch eine eingebaute Container-Registry für verschiedene Pakete wie npm, Docker und mehr.

Beim Einrichten von Gitea habe ich zunächst dieselbe Subdomain für alles verwendet und einfach eine Route für jeden Dienst hinzugefügt. Das hat gut funktioniert, bis ich die Container-Registry verwenden wollte. Docker kann keine Routen verarbeiten und verwendet nur die Subdomain, um auf die Registry zuzugreifen, weshalb ich die Konfiguration ändern musste.

Ich habe zuerst eine neue Route für die Container-Registry hinzugefügt und später dann die Konfiguration geändert, um für jeden Dienst eine Subdomain zu verwenden. So habe ich eine saubere Konfiguration und kann auch die Container-Registry verwenden.

Gitea Runner

Das Pendant zu GitHub Actions sind die Gitea Actions, die verwendet werden können, um Jobs auf dem Server auszuführen. Actions benötigen einen Runner, der ein Dienst ist, der die Jobs ausführt. Ich denke nicht, dass ich diese Funktion viel verwenden werde, aber ich wollte es mal ausprobieren und sehen, wie es funktioniert.

Docker Deploy API

Die Docker Deploy API ist ein Projekt von einem Freund von mir. Sie stellt eine API bereit, die zum Bereitstellen und Aktualisieren von Docker-Containern verwendet werden kann. Sowas kann sehr nützlich sein, wenn man Container aus einer CI/CD-Pipeline oder einfach aus einem Skript heraus bereitstellen möchte.

Werkzeuge

Um mit dem Server zu arbeiten, benötigte ich einige Werkzeuge, um das Bearbeiten von Dateien zu erleichtern.

Neovim

AstroNvim

Mein zweiter Lieblingseditor nach VS Code ist Neovim. Ich verwende es für einige meiner Projekte und auch, um Dateien auf dem Server zu bearbeiten. Meine bevorzugte Konfiguration für Neovim ist AstroNvim, weil es viele nützliche Plugins und eine gute Konfiguration zum einfachen Einstieg hat. Ich habe meine eigene Konfiguration hinzugefügt, um sie noch besser zu machen.

Tmux

Um mehrere Dinge gleichzeitig zu erledigen, verwende ich Tmux, einen Terminal-Multiplexer. Er ermöglicht es mir, das Terminal in mehrere Paneele aufzuteilen und auch mehrere Sitzungen zu erstellen, damit ich gleichzeitig Dateien bearbeiten und Befehle ausführen kann.

Acme.sh

Eine der lästigsten Aufgaben ist es, ein SSL-Zertifikat für eine Domain zu erhalten. Glücklicherweise gibt es Acme.sh, ein großartiges Tool, um kostenlos SSL-Zertifikate zu erhalten. Es hat auch Unterstützung für Domains meines Anbieters, was es noch einfacher macht, ein Zertifikat zu erhalten.

Um ein Zertifikat zu erhalten, muss ich nur den folgenden Befehl ausführen:

acme.sh --issue --dns dns_ionos -d my-domain.com \
    --webroot nginx/html \
    --cert-file nginx/ssl/my-domain.com.crt \
    --key-file nginx/ssl/my-domain.com.key \
    --fullchain-file nginx/ssl/my-domain.com.fullchain.crt \
    --reloadcmd "docker restart nginx"

Ich habe auch ein Skript erstellt, das die Zertifikate automatisch alle paar Monate erneuert, damit ich mir darüber keine Sorgen mehr machen muss.

Backups

Das letzte, was ich einrichten wollte, ist eine Backup-Lösung, um sicherzustellen, dass ich keine Daten meiner Dienste verliere. Es gibt viele Optionen wie Borg, aber glücklicherweise hat mein Anbieter bereits eine Backup-Lösung, die ich verwenden kann. Es handelt sich um einen Flex-Plan, was bedeutet, dass ich für das bezahle, was ich benutze, und es hat bereits einen einfach zu installierenden Backup-Agenten. Nach der Einrichtung habe ich einen Backup-Plan erstellt. Dieser Plan kombiniert inkrementelle und vollständige Backups, um sicherzustellen, dass ich alles wiederherstellen kann, wenn es nötig ist, und zwar jederzeit.

Fazit und Aussicht

Das war mein erster Server, und ich habe viel über Docker und Linux gelernt. Obwohl es für andere vielleicht nicht nützlich ist, wollte ich trotzdem darüber schreiben, um meinen Fortschritt festzuhalten und meine Erfahrungen zu teilen. Insgesamt bin ich sehr zufrieden mit dem Server, und ich freue mich darauf, weitere Dienste darauf zu hosten.

Über Feedback zu meinem Server und zu diesem Artikel würde ich mich freuen. Bei Fragen oder Anmerkungen, könnt ihr mich gerne auf X/Twitter erreichen.