FastApi auf Windows

Django, Flask, Bottle, WSGI, CGI…
Antworten
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo zusammen,

ich möchte eine FastApi Webapp in einem lokalen Netzwerk auf einer Windows VM (VMWare) einsetzen.
Ich habe das sowohl hinter einem Nginx - als auch IIS Reverse-Proxyserver hinbekommen.

Mit uvicorn (hypercorn) kann man dann FastApi laufen lassen.

Das Problem ist dann aber, dass das im Terminal läuft und beim Schließen des Terminals uvicorn beendet wird.

In der FastApi Doku steht da nur der Satz:
You might want to set up some tooling to make sure it is restarted automatically if it stops.
Unter Linux kann man dafür recht einfach einen Service einrichten, unter Windows ist das anscheinend Raketentechnik (jedenfalls für mich).
Ich habe es geschafft uvicorn über pm2 zu kontrollieren. Dass ich dafür extra nodejs mit npm installieren muss, möchte ich aber lieber vermeiden.

Hat jemand Erfahrung damit oder einen Idee wie man uvicorn als Windows-Service einrichtet?

Vielleicht geht auch WSL? Dabei ist das Problem aber dass man sich die Linux Distributionen wohl nur über den Windows Store installieren kann. Das ist auch kein gangbarer Weg.
Ich kann auch grundsätzlich eine Linux VM aufsetzen, da die aber vom Internet getrennt betrieben wird, weiß ich nicht wie ich dann später Updates oder zusätzliche Pakete installieren kann.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt einen Scheduler fuer Windows. Dem kann man solche Dateien wie unten angefuegt vorwerfen, und der startet die dann. Angeblich auch mit Neustart nach Absturz, das habe ich aber nicht hinbekommen, und darum nochmal ein Python-Skritp "supervisor" dazwischen geklemmt, das meine eigentlichen Prozesse beaufsichtigt.

Das ganze hat natuerlich auch eine knoedelige grafische Oberflaeche, mit der man sich erstmal zusammen basteln kann, was man braucht. Ggf. reicht das ja auch schon, aber ich wollte diese Konfiguration auch versionieren.

https://docs.microsoft.com/en-us/window ... start-page

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2017-05-14T13:06:01.154641</Date>
    <Author>MAGICBOOK\vulcaneum</Author>
    <URI>\Vulcaneum\start supervisor</URI>
  </RegistrationInfo>
  <Triggers>
    <LogonTrigger>
      <Enabled>true</Enabled>
    </LogonTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-4040627295-494061514-1862243200-1001</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
    <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\Users\vulcaneum\AppData\Local\Programs\Python\Python36\python.exe</Command>
      <Arguments>supervisor.py -v -f</Arguments>
      <WorkingDirectory>C:\Users\vulcaneum\projects\GH28\magic-book</WorkingDirectory>
    </Exec>
  </Actions>
</Task>
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@__deets__,

Vielen Dank! Das funktioniert sehr gut. Ich hatte dem Taskplaner wohl zu wenig Beachtung geschenkt.

Ob ich mir dazu auch so eine Prozessüberwachung anlegen muss überlege ich noch. Die Anforderungen sind erstmal nicht sehr hoch.
Ich bin schonmal froh, dass uvicorn im Hintergrund läuft.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

rogerb hat geschrieben: Sonntag 15. August 2021, 11:24 Ich kann auch grundsätzlich eine Linux VM aufsetzen, da die aber vom Internet getrennt betrieben wird, weiß ich nicht wie ich dann später Updates oder zusätzliche Pakete installieren kann.
Gegenfrage: Die Windows-VM kann aber ans Internet angebunden werden, oder wie wird die aktuell gehalten? Über einen lokale Mirror (das gibt's auch für Linux, aber das muss natürlich auch eingerichtet und gepflegt werden)? Netzwerkdienste, die man nicht aktualisieren kann, sind unabhängig vom OS keine gute Idee, auch wenn sie nur in einem lokalen Netzwerk laufen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@nezzcart,

ich fände es auch besser, wenn ich Updates einfach herunterladen könnte. Das ist in diesem Fall aber keine Option.
Das mit dem lokalen Mirror habe ich noch nicht ganz ausgeschlossen, der Aufwand wäre im Vergleich zur aktuellen Lösung aber eher zu groß.
Darauf würde ich nur ausweichen, wenn es wieder erwarten doch noch Probleme gibt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Gerade bei Linux ist das doch viel einfacher, sich regelmäßig ein aktualisiertes lauffähiges Image einer Distribution zu ziehen und dann per USB-Stick in das getrennt Netz zu tragen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

... sich regelmäßig ein aktualisiertes lauffähiges Image einer Distribution zu ziehen ...
Auch die Möglichkeit ist durchaus interessant. Man kann das Image soweit vorbereiten, dass alles Notwendige installiert ist, und man die veraltete VM einfach durch die aktualisierte ersetzt.
Mal sehen, ich lasse erstmal mehrere Optionen offen.
Antworten