Nachdem ich mich dazu durchgerungen habe die große finanzielle Verpflichtung von 12€/Jahr einzugehen, muss ich sagen, war der Server, mit Hilfe meines Kollegen, fix eingerichtet. Wenn man mal weiß wo man hin fassen muss, geht es eigentlich. Im Nachgang habe ich noch ein wenig experimentiert und die übrigen Speicherplatz noch eingebunden. Am liebsten würde ich mir jetzt noch so einen Server holen, damit ich’s gleich nochmal austesten kann, denn meinen möchte ich jetzt eigentlich nicht zurücksetzen.
Ich habe versucht auch immer noch die entsprechenden Artikel zu verlinken, die mir beim Einrichten geholfen haben. Da findet man dann im Regelfall noch etwas mehr Details zu den Themen.
Installation
Netcup bietet einige vordefinierte Images für die Installation an. Ubuntu schien mir da symphytisch, da ich mit Ubuntu schon hin und wieder mal meine Erfahrungen gesammelt habe. Bei der Installation wird man dann noch gefragt, wie man die Partitionen haben möchte. Hab‘ da einfach eins genommen weil ich mir dachte, Partitionen kann man auch im Nachgang noch anpassen.
Schnell noch ein paar Passwörter vergeben und schon nach wenigen Minuten konnte man sich per SSH schon auf die Kiste verbinden. Ich hab das direkt über die Weboberfläche von Netcup gemacht, doch es geht natürlich auch über jeden anderen SSH Client.
Benötigte Tools & Anwendungen
Während der Konfiguration stößt man über das ein oder andere Tool, dass man brauche wird. Deutlich mehr, als ich mir am Anfang erwartet habe. Ich gehe mal davon das ihr mit ein paar Basisbefehlen vertraut seit, ohne die man so ein Projekt gar nicht anfängt: cd, pwd, cat, mkdir, …
Ich kam ja schon öfter mal mit Linux in Berührung, von daher sind mir die gängigsten Dateistrukturen und Befehle auch ein Begriff. Auch wenn man viele davon über die Jahre vergessen hat. Man kommt aber wieder schnell rein – zwangsweise 🙂
Was man (je nach Anwendungsfall) auch brauchen wird
nano | Ein kleiner Texteditor (keine Sorge, die sind alle grausig zu bedienen) |
tmux | Damit kann man in der Konsole mehrere Sessions aufmachen |
ufw | Eine Firewall |
curl | Kommandozeilen „Browser“ |
Alles installieren
Wenn man schon dabei ist den Installer anzuwerfen, biete sich vielleicht auch an, dass man gleich alles installiert, was man brauchen wird. In meinem Fall waren das: .NET Core Runtime und was man dazu braucht. Node.Js, weil ich gerne auch meinen Discord Bot auf der Kiste laufen lassen würde und Nginx.
Schnell mal die Paketlisten aktualisieren und dann kann es auch direkt los gehen.
sudo apt-get update |
Da ich mir nicht sicher war, wie ich mein Projekt am Ende erstellen werde, habe ich beide Runtimes installiert. (Bevor am Ende was fehlt und man verzweifelt sucht …). Das SDK braucht man sowieso, weil dort dann glaube ich der ‚dotnet‘ Befehl mit dabei ist.
sudo apt-get install -y dotnet-sdk-8.0 sudo apt-get install -y aspnetcore-runtime-8.0 sudo apt-get install -y dotnet-runtime-8.0 |
Weiter geht’s mit Node. Der erste Aufruf startet die Installation. Mit dem zweiten Aufruf kann man prüfen ob’s erfolgreich installiert wurde, denn dann sollte die Versionsnummer ausgegeben werden. Am Ende braucht’s natürlich noch NPM, damit man die ganzen tollen Pakete nachinstallieren kann, die von den Projekten benötigt werden.
sudo apt install nodejs node -v sudo apt install npm |
Quelle: https://linuxconfig.org/how-to-install-node-js-on-ubuntu-24-04
Jetzt fehlt nur noch Nginx
sudo apt install nginx |
Quelle: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04
Firewall
Bei den ersten Tests – ohne Nginx – habe ich noch viel an der Firewall herum gespielt. Vermutlich hätte mir einfach das Packet Forwarding gefehlt. (Sprich ggf. wäre ich mit der Anleitung auch ohne Nginx durch gekommen für einen ersten Test: Set up a Port Forward Using UFW)
Mit Nginx ist das dann aber so gut wie alles weg gefallen. Man muss am Ende nur die Nginx Regel aktivieren. Trotzdem mal knapp die wichtigsten Befehle für die Firewall
sudo apt-get install ufw | Installieren, falls sie nicht drauf sein sollte |
sudo ufw enable | Firewall einschalten |
sudo ufw disable | Firewall ausschalten |
sudo ufw status | Regeln auflisten |
sudo ufw allow 81 | Port 81 aufmachen |
sudo ufw status numbered | Regeln nummeriert auflisten |
sudo ufw delete 3 | Regel mit einer bestimmten Nummer z.B. 3 löschen |
Quellen: https://ubuntu-user.de/tipps-tricks/wie-gebe-ich-bei-ubuntu-die-firewall-ports-frei/
https://www.cyberciti.biz/faq/how-to-delete-a-ufw-firewall-rule-on-ubuntu-debian-linux/
Nginx Einrichten
Firewall
Wie oben schon erwähnt, gibt’s für Nginx eine eigene Regel, die man in der Firewall aktivieren kann. Diese sollte nach der Installation von Nginx zur Verfügung stehen und man aktiviert die Regel, die man braucht. Mit den folgenden drei befehlen, listet man die bekannten Anwendungsregeln auf, aktiviert die gewünschte und überprüft den Status.
sudo ufw app list sudo ufw allow 'Nginx HTTP' sudo ufw status |
Quelle: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04
Server Konfiguration
Hier wird es dann natürlich sehr individuell. Generell findet man unter /etc/nginx/sites-available eine Datei, in der man seine Nginx Seiten konfigurieren kann. Das könnte z.B. so aussehen. Anfragen auf den Port 80 werden dann an den lokalen Ordner weitergeleitet
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html/landing; index index.html; } |
Gut zu wissen ist auch, dass man mit folgendem Befehl verifizieren kann ob der Aufbau der Konfigurationsdatei gültig ist.
sudo nginx -t |
Und am Ende fehlt eigentlich nur noch der Befehl um den Service neu zu starten. Je nach Betriebssystem sollte einer der folgende Befehle das erledigen
sudo service nginx restart sudo systemctl restart nginx.service /etc/init.d/nginx restart |
Die ersten Feldversuche
ASP.NET Core Web API
Die Web-API zum laufen zu bekommen war dann in der Tat recht einfach. Ein Deployment mit Bereitstellung in einem Ordner hatte ich die Tage vorher schon konfiguriert. Als Zielruntime habe ich dort ‚portierbar‘ gewählt. Den Ordner habe ich per FTP auf meinen Server in ein Unterverzeichnis im Home-Verzeichnis kopiert. Jetzt nur noch starten:
dotnet MeineAnwendung.dll |
Wenn man wie ich in der API auch einen Get Endpunkt definiert hat ohne weitere Parameter, kann man auch schnell prüfen ob die Anwendung läuft. Am einfachsten mit dem Befehl CURL. Als Serveradresse ist’s die lokale IP / Localhost und der Port, den man in der API konfiguriert hat (z.B. 1234). Die Adresse und der Post sollte ja beim hochstarten der API in der Ausgabe auch angezeigt worden sein. Es sollten dann die Daten des Endpunktes zurück geliefert werden.
curl localhost:1234 |
Discord Bot
Noch schneller als die Web-API war nur der Discord Bot gestartet. Auch hier habe ich nur die Dateien in ein Verzeichnis übertragen und zwei Befehle ausgeführt. Zum einen die Pakte zu installieren, die von der Anwendung benötigt wurden
npm ci |
Und dann natürlich Node um den Bot zu starten
node dbot.js |
Nginx: Mehrere Webseiten unter verschiedenen Ports
An sich wollte ich gerne so was wie eine ‚Landing-Page‘ haben, falls man mal zufällig über die Domain stolpert oder auch als Test, dass die Seite erreichbar ist. Von daher biete sich da Port 80 an. Man kann dann aber auch gleich noch einen zweiten Server in der default config im Ordner ‚/etc/nginx/sites-available‘ eintragen unter welcher Adresse dann die Web-API erreichbar ist. Beispielsweise so:
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html/landing; index index.html; } server { listen 81; listen [::]:81; server_name _; location / { proxy_pass http://localhost:1234/; } } |
Ich habe gelesen, dass im Standard eigentlich alle Ports zu sind. Und alle Ports, die ich zum Test aufgemacht habe, hatte ich auch wieder geschlossen. Als ich dann einige Tage später meinen NGINX erweitern wollte, so dass ich über verschiedene Ports verschiedene Webseiten / APIs zurück liefern kann, habe ich mich ewig gewundert, warum der Zugriff intern zwar klappt, aber von extern nicht. Bins ich drauf gekommen bin, dass ich den Port vielleicht an der Firewall wieder freigeben muss ….
A Record hinzufügen
Jetzt hat man einen Server, auf dem alles hübsch eingerichtet ist. Doch will man sich jetzt die IP Adresse merken müssen? Ich könnte doch eine Sub-Domain auf den Server umleiten. Ja, kann man, doch so toll wie ich mir das vorgestellt habe, hat das nicht funktioniert. Hmm. Meine Kollegen reden doch immer von CNAMES & A Records. Kann ich nicht so was machen. Na klar. Netcup biete dafür eine Eingabemaske an. Über die bin ich schon mal gestolpert. Kurz Google bemüht: Ich brauch einen A Record. Bis die DNS Änderung überall durch war hat es ein wenig gedauert aber es hat (natürlich) funktioniert.
Zum Überprüfen kann ich diese Seite von Google empfehlen: https://dns.google/query?name=DEINE.ADRESSE.DE&rr_type=A&ecs=
Daten-Partition hinzufügen
Nachdem so weit alles lief, habe ich mir das mit den Partitionen nochmal angesehen. Ich habe ja 30 GB Platz. Nicht genug für meine Musiksammlung, doch vielleicht für ein Bilder Backup aus dem Urlaub oder Platz um nach dem Festival mal Bilder mit Freunden zu tauschen? Da ich mich beim Anlegen des Servers aber nicht mit den Partitionen beschäftigt habe, müssen wir mal schauen, ob der Platz auch vollständig zur Verfügung steht. Also gucken wir uns mal den belegten Speicherplatz an.
df -TH |
Okay. Von den 30 GB fehlten mir noch 20 GB. Somit werden wir noch eine neue Partition brauchen. Um einen Überblick zu bekommen, kann man sich Partitionen erst einmal auflisten lassen.
sudo fdisk -l |
Im Anschluss startet man das Partitionstool für die entsprechende Platte. Beispielsweise bei mir ‚vda‚
sudo fdisk /dev/vda |
Wir lassen uns durch den kurzen Dialog leiten. Nummer (die sollte man sich aber merken)? Startsektor? Endsektor? Ich habe die Vorgaben bestätigt, was dafür gesorgt hat, das sich am Ende eine vierte Partition mit den fehlenden 20 GB hatte – also exakt das, was ich wollte.
Man wurde ja nach der Nummer gefragt. Im Regelfall wurde die fortlaufend vergeben. Mein Partition war jetzt die Nummer 4, sprich ‚vda4′ meine neue Partition. Idealerweise formatiert man die jetzt noch mit dem gewünschten Dateisystem
sudo mkfs -t ext4 /dev/vda4 |
Was uns jetzt noch fehlt ist ein Verzeichnis, wo wir die neue Partition einbinden. Als Basispfad ist hier /mnt im Regelfall eine gute Anlaufstelle. Da ich bei mir dort ‚Daten‘ ablegen will, habe ich mein Unterverzeichnis einfach ‚data‘ genannt.
cd /mnt sudo mkdir data |
Und jetzt noch mounten.
mount -t ext4 /dev/vda4 /mnt/data |
Gute Quelle: Partition, format, and mount a drive on Ubuntu
Wissenswertes
Am Ende noch ein paar Sachen, die ich während der Einrichtung aufgeschnappt habe, was man vielleicht wieder brauchen kann
TMUX
Ich habe irgendwo mal beiläufig erwähnt, dass ich mich beim ersten mal über den Browser per SSH auf den Server verbunden habe. Das war ja auch alles okay. Doch wie kann ich in einem Terminal Fenster meine API dann hochfahren und im Anschluss noch was testen? Es läuft ja die API in dem Prozess. Über externe Tools kann man einfach eine weitere SSH Verbindung aufbauen. Oder man nutzt TMUX. Damit wird eine weitere Session geöffnet. Hier schnell die wichtigsten Befehle
tmux | Startet eine neue Session |
STRG+B D | Wechselt aus der Session wieder zurück |
tmux list-sessions | Listet die aktiven Sessions auf |
tmux attach | Wechselt zur letzten Session zurück |
tmux attach -t 0 | Wechselt zur Session mit der angegebenen Nummer |
Status, Freigaben, Ports & Logs
Wenn man sich einen Server für 1€ holt, möchte man natürlich auch wissen, wann man an die Leistungsgrenzen kommt, bzw. wie viel Puffer man hat. Auch dafür gibt’s ein Befehlt (ggf. muss man das vorher auch installieren, bei mir war’s schon mit dabei:
htop |
CPU Infos auslesen
cat /proc/cpuinfo |
Man kann über folgenden Befehl den Nginx Status prüfen
service nginx status |
Falls man mal die Log-Dateien zum nginx braucht, die findet man in Regelfall hier:
cd /var/log/nginx |
Auf welchen lokalen Ports laufen Anwendungen?
ss -ant |
Alle Regeln für Datenpakete auflisten
sudo iptables -L |
Wartung
Am Ende sollte man dann vielleicht auch immer gucken, dass man den Server aktuell hält. Da fehlen wir jetzt noch ein wenig die Erfahrungswerte doch im Prinzip würde ich sagen, wäre das mit Sicherheit ein guter Startpunkt. Liste der aktuellen Pakete laden
sudo apt update |
Neue Pakete installieren; keine alten Löschen
sudo apt upgrade |
Neue Pakete installieren; ggf. alte Löschen, wenn diese nicht mehr benötigt werden
sudo apt full-upgrade |
Alte Pakete entfernen, die nicht mehr gebraucht werden
sudo apt autoremove |
Fazit
Schönes Spiel & Bastelprojekt ist das. Für 1€ im Monat zum Erfahrungen sammeln und lernen auch nicht zu teuer. Für kleine Projekte oder einfach nur zum ausprobieren ideal geeignet. Und auch 30 GB Speicherplatz im Web, über den man dann ja frei verfügen kann, weil es ja sein ‚eigener‘ Server ist, ist nicht unattraktiv, um z.B. vom Urlaub aus dort Bilder weg zu sichern. Was ich auch schon gehört habe, ist, dass alleine die Statische IP Adresse den Euro schon wert wäre.
Am Ende nochmal ein Danke an cmxl, der mich bei der ersten Basiskonfiguration mit Informationen und bei der Fehleranalyse unterstützt hat.
„This is a fantastic guide! Setting up a server, especially on a budget, can be both exciting and frustrating. I recently went through a similar experience while setting up my own VPS with Ubuntu and Nginx. One of the biggest struggles I faced was dealing with firewall configurations and getting Nginx to correctly serve my applications. I kept running into issues where the server would refuse connections, only to realize later that I hadn’t properly configured UFW to allow traffic on the necessary ports.
I found this **[comprehensive guide on setting up UFW rules](https://ubuntu-user.de/tipps-tricks/wie-gebe-ich-bei-ubuntu-die-firewall-ports-frei/)** really helpful in troubleshooting firewall issues. After that, everything started falling into place.
One thing I’d add is that if you’re running multiple services (e.g., a web API and a Discord bot like I was), using **tmux** or **screen** is a game-changer. It allows you to keep your processes running even when you close your SSH session. If anyone else is struggling with this, I highly recommend checking out **[this tutorial on tmux](https://linuxize.com/post/getting-started-with-tmux/)**.
Thanks for sharing your experience—I wish I had this article when I was setting up my first server!“