Dotnet API Projekt Deployment auf einen Ubuntu Server
In dem Artikel fasse ich alle Schritte zusammen die ich für mein lokales Testsystem eines Dotnet API Projekts mit Deployment auf einem Ubuntu Server durchgeführt habe. Damit hast du einen Startpunkt um schnell eine eigene in .NET erstellte REST API zu implementieren und zu testen.
Dotnet API Projekt Deployment auf einen Ubuntu Server
Anstatt gleich in die Cloud zu gehen und dafür monatlich zu zahlen setze ich einen virtuellen Ubuntu Server auf um das .NET API Projekt zu hosten und dieses weiterzuentwickeln und gleichzeitig einen Client zu bauen. Als Testumgebung läuft diese API dann auf einer Linux VM bevor man den Schritt in ein Produktivsystem in der Cloud wagen kann.
Ubuntu Server
Ausgangspunkt ist ein frisch installierter Ubuntu Server. Ich habe mir mit VirtualBox eine neue VM erstellt und dort von einer *.iso Datei das System installiert. Alternativ gibt in der Cloud oder bei Hostern um wenige Euro virtuelle Ubuntu Systeme.
Damit auf dem System die mit .NET entwickelte API Anwendung läuft muss die Dotnet Runtime installiert werden. Es gibt mehrere Möglichkeiten, ich habe mir das komplette SDK mit
sudo apt-get update && sudo apt-get install -y dotnet6
installiert, alternativ reicht nur für die Ausführung vom Code auch die Runtime alleine:
sudo apt-get update && sudo apt-get install -y dotnet-runtime-6.0
Auf einem Entwicklungssystem macht das komplette SDK Sinn, auf einem Produktivsystem würde ich lediglich nur die Runtime empfehlen.
Ein kurzer Test bestätigt, dass der Server einsatzbereit ist:
Optional: Zuletzt habe ich noch der Anleitung von Microsoft die Powershell installiert. Damit habe ich die gleiche Shell wie unter Windows und wollte damit ursprünglich das Deployment zu automatisieren. Ich habe dafür aber eine andere Methode gefunden.
Damit die unter localhost gehostete Applikation von außen erreichbar ist benötigt man einen Reverse Proxy. Ich verwende dafür den als Reverse Proxy konfigurierten Nginx Webserver. Installiert wird der mit:
sudo apt-get install nginx
Mit dem folgenden Befehl wird der Webserver gestartet.
sudo systemctl start nginx
Gibt man nun im Browser die IP Adresse des Ubuntu Servers ein wird man von einer Erfolgsmeldung des Webservers begrüßt:
Der Server ist soweit fertig und der Webserver ist installiert und gestartet. Bevor ich nun Nginx als Reverse Proxy konfigurieren kann fehlt nur noch eine Applikation die auf dem Server läuft und über den Webserver aufrufbar gemacht werden soll.
.NET Projekt erstellen
Das ist der Step für den im Projekt die meiste Zeit eingeplant werden muss. Für den Anfang erstelle ich ein neues WebAPI Projekt in Visual Studio. Startet man dieses lokal wird die bekannte WeatherForecast Swagger Seite gezeigt. Für das lokale Deployment habe ich ein neues Standardprofil erstellt bei dem die API als portable dotnet Applikation auf der Festplatte abgelegt wird.
Danach habe ich mich mit WinSCP mit dem Server verbunden und den Inhalt des publish Ordner in den api Ordner vom Benutzerverzeichnis kopiert. Dort hin soll künftig die API deployed werden. Ein kurzer Test mit
dotnet Api.dll
zeigt, dass die Applikation korrekt gestartet wird. Sie wäre lokal über den Port 5000 erreichbar, jetzt wird es Zeit den Reverse Proxy zu konfigurieren.
In einem zweiten Konsolenfenster kann man mit curl auch den Output der Applikation testen:
Reverse Proxy
Mit Nginx ist ein Reverse Proxy schnell eingerichtet. Konfiguriert wird diese über Konfigurationsdateien. Für den Fall, dass man auf dem Server nur eine einzige Webseite hosten will reicht das Ändern der default Webseite. Dazu öffnet man im Texteditor der Wahl die Datei
sudo nano /etc/nginx/sites-available/default
Achtung: es werden root Rechte benötigt. Für mein .NET API Projekt habe ich folgende Konfiguration verwendet:
server { listen 80; root /home/werner/api; location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Die Variable root zeigt dabei auf das Verzeichnis der Applikation. proxy_pass zeigt auf die Applikation – in meinem Fall zum Port 5000. Will man HTTPS verwenden bräuchte man noch ein Zertifikat und man müsste auf Port 5001 zeigen. Den Vorschlag für genau diese Konfiguration findet man übrigens in der offiziellen Dokumentation von Microsoft.
Die neue Konfiguration kann man nun prüfen und sofern keine Fehler gefunden werden gleich aktivieren.
sudo nginx -t sudo nginx -s reload
Der Webserver wird mit dem Befehl:
sudo systemctl restart nginx
neu gestartet. Hat alles funktioniert, dann zeigt der Server nun eine leere Seite und man kann die einzelnen Endpoints ansteuern:
Nun kann ich mit meinem API Projekt für ein Logistikunternehmen in Hamburg beginnen und die ersten Endpoints aufzubauen und die Frontends dafür zu konfigurieren.
Fazit
Ich habe gezeigt wie man einen Ubuntu Server konfiguriert um eine Dotnet API Applikation zu hosten. In wenigen Minuten baut man sich so ein Entwicklungssystem für eine Anwendung mit einer REST Schnittstelle. Im folgenden Artikel kümmere ich mich nun noch um das Thema automatisches Deployment. Aktuell muss man noch manuell die aktuelle Version der Applikation auf den Server kopieren und neu starten.