Zum Inhalt springen

Asp.net Core Web-App / dotnet mit Raspberry Pi hosten

Stell dir vor, du sitzt in einem gemütlichen Raum, umgeben von Büchern über Technologie und Innovation. In der einen Hand hältst du eine dampfende Tasse Kaffee und in der anderen einen kleinen, aber mächtigen Raspberry Pi. Du bist bereit, eine Reise zu beginnen, die die Grenzen dessen, was du für möglich hältst, verschieben wird. Du bist dabei, in die faszinierende Welt von Asp.net Core Web-Apps einzutauchen, die mit dotnet auf einem Raspberry Pi gehostet werden. Eine Odyssee durch die Tiefen der Konfigurationen. Bist du bereit? Dann schnall dich an und komm mit auf diese aufregende Reise!

Bevor wir starten, lass uns sicherstellen, dass wir alles haben, was wir brauchen:

  1. Raspberry Pi*: Dies ist das Herzstück unseres Projekts. Du kannst jedes Modell ab Raspbery Pi 3 verwenden. Ich habe einen Raspberry Pi 3B+ verwendet.
  2. Raspberry Pi OS (Legacy, 64-bit): Dies ist das Betriebssystem, das auf unserem Raspberry Pi läuft und mit dem die Vorgehensweise getestet wurde. Stelle sicher, dass du die 64-Bit-Version hast, um die beste Leistung und Kompatibilität zu erzielen.
  3. Stromversorgung*: Dein Raspberry Pi braucht Strom, also stelle sicher, dass du ein geeignetes Netzteil hast.
  4. microSD-Karte*: Hier installieren wir unser Betriebssystem und speichern unsere Webanwendung. Eine Karte mit mindestens 16 GB wird empfohlen.
  5. Raspberry Pi Imager: Software um das OS auf die microSD-Karte zu schreiben
  6. Internetverbindung: Der Raspberry Pi benötigt eine Internetverbindung, um Software und Updates herunterzuladen.
  7. Asp.net Core und dotnet: Diese werden wir auf unserem Raspberry Pi installieren, um unsere Webanwendung zu hosten.

Mit diesen Werkzeugen und Materialien bist du bereit, deine Reise zu beginnen.

Raspberry Pi OS mit Raspberry Pi Imager installieren

Jetzt erkläre ich dir den Installationsvorgang mit dem Raspberry Pi Imager:

  1. Raspberry Pi Imager herunterladen: Lade den Raspberry Pi Imager auf deinem Computer herunter. Du findest ihn auf der offiziellen Raspberry Pi-Website.
  2. Raspberry Pi Imager öffnen: Starte den Raspberry Pi Imager und wähle dein Raspberry Pi-Gerät aus.
  3. Betriebssystem auswählen: Klicke auf „OS wählen“ und dann auf „Raspberry Pi OS (other) > Raspberry Pi OS (Legacy, 64-Bit)“.
  4. Speichermedium auswählen: Lege die SD-Karte in deinen Computer ein. Achtung: Der Inhalt der Karte wird überschrieben. Wähle deine SD-Karte aus.
  5. Image auf die SD-Karte schreiben: Starte den Vorgang mit „Weiter“
  6. OS Anpassungen: Bevor es losgeht, sollten noch die Einstellungen bearbeitet werden. In den Einstellungen wird der W-LAN Zugriff und der Benutzer für den SSH Zugang festgelegt. Wenn du ein LAN Kabel benutzen möchtest, müssen natürlich keine W-LAN Zugangsdaten angegeben werden, der Benutzer allerdings ist zwingend erforderlich, damit später der SSH Zugang funktioniert. Einstellungen speichern und dann mit „Ja“ das Verwenden der Einstellungen bestätigen. Der Schreibvorgang wird nach dem Bestätigen gestartet.


Jetzt noch die microSD-Karte in den Raspberry-Pi stecken und dem ersten Start steht nichts mehr im Weg!

Verbinden mit PuTTY und SSH mit dem Pi

Wenn du eine Webanwendung auf deinem Raspberry Pi hosten willst, musst du in der Lage sein, ihn aus der Ferne zu steuern und zu konfigurieren. Dafür brauchst du ein Tool, das dir eine sichere Verbindung über SSH (Secure Shell) ermöglicht. PuTTY ist ein solches Tool, das dir eine textbasierte Benutzeroberfläche bietet, um Befehle auf deinem Pi auszuführen. In unserem vorherigen Artikel haben wir dir gezeigt, wie du PuTTY auf deinem Windows-Computer installieren und verbinden kannst. Wenn du diesen Artikel noch nicht gelesen hast, empfehlen wir dir, das zu tun, bevor du weitermachst. Hier ist der Link: Mit PuTTY verbinden und SSH mit Raspberry Pi nutzen. Dort findest du eine einfache Schritt-für-Schritt-Anleitung, die dir alles erklärt, wie du dich mit dem Raspberry Pi verbindest.

Verbunden und Terminalfenster von PuTTy offen

Der erste Schritt auf dem Weg zu deiner dotnet Installation auf einem Raspberry Pi ist ein Update und das Installieren von „wget“. Für das Upgrade gibst du nacheinander folgende Befehle im Terminalfenster ein:

sudo apt update
df -h
sudo apt upgrade
sudo reboot

Die erste Anweisung aktualisiert die Liste der zu aktualisierenden Pakete, die zweite Anweisung zeigt dir an, wie viel Speicherplatz noch auf dem Pi bzw. der microSD-Karte vorhanden ist. Bei der Ausführung des Upgrade-Befehls wird dir angezeigt, wie viel Speicherplatz für das Upgrade benötigt wird. Bestätigt das mit „Y“ wenn alles passt. Zum Schluss noch ein Reboot, damit die Aktualisierungen wirksam werden.

Die Ausgabe im Terminalfenster sollte in etwa so aussehen:

Vorbereiten des Raspberry Pi für die Dotnet Installation

Ich habe eine 32 GB microSD-Karte im Raspberry stecken, von der 29 GB angezeigt werden und noch 25 GB frei bzw. „Available“ sind. Das Upgrade verschlingt 8,473 kB an zusätzlichem Speicherplatz. Das passt also. Es wird noch angezeigt, dass, das Paket „libfuse2“ nicht mehr benötigt wird und mit dem folgenden Befehl entfernt werden kann. Das kann bei dir schon wieder anders sein, der Vollständigkeit halber sei es hier aber erwähnt.

sudo autoremove

Nach dem Neustart und dem neuen Verbinden mit PuTTY wird noch wget benötigt. Mit folgender Anweisung wird das Tool installiert:

sudo apt install wget

Wget ist ein Programm, das Dateien von FTP-, HTTP- oder HTTPS-Servern direkt aus einem Terminal herunterladen kann. Weitere Informationen über Wget gibt es hier.

Der Raspberry ist nun klar für dotnet

Mit wget wird nun ein Installationsscript für dotnet von Microsoft heruntergeladen:

wget https://dot.net/v1/dotnet-install.sh

Um dotnet herunterzuladen und zu installieren, musst du den soeben heruntergeladenen Script mit folgendem Befehl ausführen.

sudo bash ./dotnet-install.sh --channel LTS --install-dir /opt/dotnet/

Je nach Raspberry Pi und Verbindung braucht es eine Weile, bis dieser Vorgang fertiggestellt ist. Ich erwähne das, weil ich schon etwas nervös geworden bin, als nur eine Zeile angezeigt wurde und dann gefühlt eine Ewigkeit nichts mehr. Speziell beim „Extracting“ hat mein Raspberry Pi 3 schon etwas länger gebraucht.

Der Befehl installiert die neueste LTS-Version von dotnet und speichert sie unter dieser Adresse: /opt/dotnet/

Verfügbar machen von dotnet auf dem Raspberry Pi

Um den Befehl oder das Programm dotnet global verfügbar zu machen, müssen zwei Anweisungen ausgeführt werden. Der Befehl ln -s /opt/dotnet/dotnet /usr/local/bin erstellt einen symbolischen Link, der es ermöglicht, das dotnet-Programm von jedem Ort in der Shell auszuführen, ohne den vollständigen Pfad angeben zu müssen.

sudo ln -s /opt/dotnet/dotnet /usr/local/bin

Die Option -s steht für symbolisch, es wird quasi eine Verknüpfung im Verzeichnis /usr/local/bin auf dotnet angelegt.

Dann muss eine Zeile mit dem Pfad zu dotnet nämlich „export DOTNET_ROOT=/opt/dotnet“ in die Datei „.bashrc“ hinzugefügt werden. Das geschieht mit dieser Anweisung:

echo 'export DOTNET_ROOT=/opt/dotnet' >> /home/pi/.bashrc

Der Befehl echo 'export DOTNET_ROOT=/opt/dotnet' >> /home/pi/.bashrc fügt die Zeile export DOTNET_ROOT=/opt/dotnet zu deiner .bashrc-Datei im Home-Verzeichnis hinzu.

Die .bashrc-Datei ist eine Skriptdatei, die ausgeführt wird, wenn eine neue Bash-Shell gestartet wird. Durch das Hinzufügen der Zeile export DOTNET_ROOT=/opt/dotnet zu dieser Datei wird die Umgebungsvariable DOTNET_ROOT auf den Wert /opt/dotnet gesetzt, jedes Mal, wenn eine neue Bash-Shell gestartet wird. Das bedeutet, dass das dotnet-Befehlszeilenprogramm global verfügbar sein wird, solange der Pfad /opt/dotnet korrekt ist und das dotnet-Programm enthält.

Da die Pfadangabe „pi“ der Benutzer ist und so wie in meinem Fall der Benutzer „admin“ heißt, muss ich die Zeile dementsprechend ändern, um den richtigen Pfad zu erhalten:

echo 'export DOTNET_ROOT=/opt/dotnet' >> /home/admin/.bashrc

Das ist nur um es noch einmal deutlich zu machen, sonst ist der Frust groß, wenn die .bashrc nicht gefunden wird.

Überprüfen von dotnet auf dem Raspberry Pi

Zum Überprüfen der Installation von dotnet gebe folgende Anweisung in das Terminalfenster ein:

dotnet --info

Wenn das Ergebnis wie folgt oder ähnlich ist, dann hast du es geschafft!

Überprüfend er Dotnet Installation auf dem Raspberry Pi mit dotnet --info

Herzlichen Glückwunsch zur erfolgreichen Installation von .NET / dotnet auf deinem Raspberry Pi! Durch die Ausführung des Befehls dotnet --info kannst du die Details deiner .NET-Installation anzeigen lassen. Dieser Befehl gibt Informationen über die .NET-Version, den Laufzeitumgebung (Runtime), die installierten SDK’s und andere nützliche Informationen aus. Wenn dieser Befehl erfolgreich ausgeführt wird und die erwarteten Informationen anzeigt, bedeutet das, dass .NET korrekt auf deinem System installiert wurde und bereit ist, verwendet zu werden. Du kannst nun .NET-Projekte erstellen, ausführen und verwalten.

Erstellen eines Asp.net Core Projektes

Jetzt muss nur noch ein dotnet Projekt auf den Raspberry Pi geladen werden. Dazu habe ich in Visual Studio eine Asp.net Core Web-App erstellt.

Asp.net Core Web App mit Visual Studio

Diese wird veröffentlicht, in einen Ordner. Dieser Ordnerinhalt wird auf den Raspberry Pi kopiert. Jetzt finde ich es nicht unbedingt komfortabel, mit dem Befehl scp Dateien von meinem Windows Rechner auf den Raspberry Pi zu übertragen. Deshalb verweise ich im nächsten Abschnitt auf das Programm WinSCP, das ist wesentlich angenehmer, um Dateien zu kopieren und zu verschieben.

Verbinden mit WinSCP und SSH mit dem Pi

Um Dateien zwischen deinem Computer und deinem Raspberry Pi zu übertragen, brauchst du ein geeignetes Tool, das eine sichere und einfache Verbindung ermöglicht. WinSCP ist ein solches Tool, das dir viele Vorteile bietet, wie wir in einem vorherigen Artikel erklärt haben. Wenn du wissen willst, wie du WinSCP mit deinem Raspberry Pi verbinden kannst, lies dir bitte diesen Artikel durch: Mit WinSCP eine Verbindung zum Raspberry Pi aufbauen. Dort findest du eine Schritt-für-Schritt-Anleitung, die dir zeigt, wie du WinSCP installierst, konfigurierst und verwendest. Du wirst sehen, wie einfach es ist, Dateien zwischen deinem Computer und deinem Pi zu übertragen.

Speicherort für das asp.net Core Projekt

Es gibt keine strikte Regel, wo du dein ASP.NET Core-Projekt auf dem Raspberry Pi platzieren solltest. Allerdings ist es eine gängige Praxis, Anwendungen im Home-Verzeichnis des Benutzers zu platzieren. Ein Beispiel für einen geeigneten Ort könnte /home/pi/MyAspNetApp sein. Hierbei steht pi für den Benutzernamen und MyAspNetApp wäre der Name deines ASP.NET Core-Projekts.

In WinSCP habe ich also im /home/admin/ Verzeichnis meines Benutzers mit dem namen admin ein Verzeichnis mit dem Namen der App erstellt. Da ich Pfälzer bin und gerade ein Projekt für einen Hobby Wursthersteller am laufen habe, heißt meine App BrodWorschdApp. Das ganze sieht dann ersteinmal so aus:

Jetzt ist es ein leichtes die App per Drag&Drop aus dem Veröffentlichungsordner von Visual Studio mit WinSCP in das Verzeichnis auf dem Raspberry Pi zu kopieren.

Erster Start der App

Jetzt ist es an der Zeit die App einmal laufen zu lassen, das mache ich nun wieder mit PuTTY. Damit das wwwroot Verzeichnis korrekt gefunden wird, musst du die dich in dem Verzeichnisbefinden in der die DLL abliegt. Denn in ASP.NET Core wird das Arbeitsverzeichnis standardmäßig auf das Verzeichnis gesetzt, in dem sich die ausführbare Datei befindet. Wenn du jedoch die Anwendung mit dem dotnet-Befehl startest und den Pfad zur DLL angibst, wird das Arbeitsverzeichnis auf das Verzeichnis gesetzt, in dem du den Befehl ausgeführt hast, und nicht auf das Verzeichnis, in dem sich die DLL befindet. Es ist nicht so kompliziert wie es sich liest.

Einfach folgenden Befehl eingeben zum wechseln in das Verzeichnis der App:

cd /home/pi/brodworschdapp/

Jetzt könntest du die App starten mit dotnet BrodWorschdApp.dll , aber dann kannst du noch nicht darauf aus dem Netzwerk zugreifen, sondern nur local über den Raspberry Pi. Das ist nicht Sinn und Zweck der Übung. Mit den --urls Parametern geben wir an das jeder client aus dem Netzwerk Verbindung über den Port 5000 mit dem Raspberry Pi und unserer App aufnehmen kann.

dotnet BrodWorschdApp.dll --urls http://0.0.0.0:5000

Da du dich bereits im richtigen Verzeichnis befindest, must du nur den Namen der DLL angeben, nicht den gesamten Pfad. Jetzt ist deine App erreichbar, probier es aus mit der IP-Adresse deines Raspberry Pi mit dem Port 5000.
Bei mir sieht zum Beispiel die URL so aus:
http://192.168.178.153:5000/

Das Ergebnis ist die sichtbare Standardvorlage eines Asp.Net Core Web App Prjektes aus Visual Studio:

Automatisches starten der App nach Reboot

Wenn der Raspberry Pi neu gestartet wird soll die App auch starten, genauso nach einem Stromausfall oder wenn dotnet crashed soll nach 10 Sekunden versucht werden den Service wieder zu starten. Um diese Anforderungen zu erfüllen habe ich mich für einen systemd-Dienst entschieden. Die folgenden Punkte habe ich mit WinSCP erledigt.

Erstelle eine neue Datei unter /etc/systemd/system, z.B. myapp.service (ich nenne meine Datei brodworschdapp.service) und füge den folgenden Inhalt ein, beachte dabei den Benutzernamen in den Pfadangaben und unter User an deine Bedürfnisse anzupassen, genauso wie den namen der App:

[Unit]
Description=My .NET Core Application

[Service]
WorkingDirectory=/home/pi/brodworschdapp
ExecStart=/usr/bin/dotnet /home/pi/brodworschdapp/BrodWorschdApp.dll --urls http://0.0.0.0:5000
Restart=always
RestartSec=10  # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=pi
Environment=ASPNETCORE_ENVIRONMENT=Production 

[Install]
WantedBy=multi-user.target

Für meine Bedürfnisse muss die Datei brodworschdapp.service so aussehen:

systemd Dienst zum Starten der dotnet Anwendung auf dem Raspberry Pi
  • Aktualisiere die systemd-Konfiguration mit dem Befehl sudo systemctl daemon-reload
  • Aktivieren den Dienst mit dem Befehl sudo systemctl enable brodworschdapp.service
  • Starte den Dienst mit dem Befehl sudo systemctl start brodworschdapp.service
  • Der Status kann abgefragt werden mit sudo systemctl status brodworschdapp.service

Jetzt sollte die Anwendung jedes Mal starten, wenn der Raspberry Pi hochfährt.

Noch etwas, bitte beachten das die Pfadangaben in der systemd-Dienstdatei case-sensitiv sind. Das bedeutet, dass Groß- und Kleinschreibung unterschieden werden. Stelle sicher, dass du den genauen Pfad zur Anwendung und zu allen anderen benötigten Dateien oder Verzeichnissen angibst. Wenn der Pfad nicht genau übereinstimmt, einschließlich der Groß- und Kleinschreibung, wird systemd die benötigten Dateien oder Verzeichnisse nicht finden können.

Zum guten Schluss

Abschließend haben wir gemeinsam gesehen, wie kraftvoll und vielseitig der Raspberry Pi in Kombination mit .NET Core sein kann. Mit den richtigen Tools und ein bisschen Geduld haben wir eine voll funktionsfähige .NET Core-Anwendung auf einem Raspberry Pi zum Laufen gebracht. Das öffnet eine Welt voller Möglichkeiten für dich als Entwickler, um die Power von .NET Core und die Flexibilität des Raspberry Pi zu nutzen. Egal, ob du eine IoT-Anwendung, einen Webserver oder einfach nur ein cooles Projekt erstellen möchtest, die Möglichkeiten sind endlos. Ich hoffe, dieser Artikel hat dir geholfen, den Einstieg zu finden und inspiriert dich zu deinen eigenen kreativen Projekten. Also, ran an die Tasten und viel Spaß beim Coden!

Schreibe einen Kommentar

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