ASP.NET Core WebAPI auf eigenem Server

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

nanoEin kleiner Texteditor (keine Sorge, die sind alle grausig zu bedienen)
tmuxDamit kann man in der Konsole mehrere Sessions aufmachen
ufwEine Firewall
curlKommandozeilen „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

Quellen: https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu-install?pivots=os-linux-ubuntu-2404&tabs=dotnet8

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 ufwInstallieren, falls sie nicht drauf sein sollte
sudo ufw enableFirewall einschalten
sudo ufw disableFirewall ausschalten
sudo ufw statusRegeln auflisten
sudo ufw allow 81Port 81 aufmachen
sudo ufw status numberedRegeln nummeriert auflisten
sudo ufw delete 3Regel 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 ….

Quelle: https://serverfault.com/questions/655067/is-it-possible-to-make-nginx-listen-to-different-ports/655072#655072

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

tmuxStartet eine neue Session
STRG+B DWechselt aus der Session wieder zurück
tmux list-sessionsListet die aktiven Sessions auf
tmux attachWechselt zur letzten Session zurück
tmux attach -t 0Wechselt 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert