7 Punkte von GN⁺ 2024-08-27 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Dokku ist eine Open-Source-PaaS, mit der sich ein einzelner VPS wie Heroku nutzen lässt, und eignet sich gut für Einzelpersonen oder kleine Teams, die mehrere Apps günstig auf selbst kontrollierter Infrastruktur deployen wollen
  • Nicht-GPU-Workloads laufen auf einem OVHcloud-VPS für 7 US-Dollar pro Monat und senken in Umgebungen wie LLM-Consulting, in denen häufig Apps bereitgestellt werden müssen, Kosten und Komplexität des Deployments
  • Dockerfile-basierte Apps lassen sich deployen, indem man eine Dokku-App erstellt, ein Git-Remote hinzufügt und nur git push dokku main ausführt; mit dokku ps:scale kann die Zahl der Prozesse angepasst werden
  • Auch statische Websites können mit _site, .static, dem nginx-Buildpack und dokku-http-auth aus einem privaten GitHub-Repository deployt und per Passwort geschützt werden
  • Verbindet man GitHub Actions, entfernte SSH-Befehle, das Invalidieren des Docker-Caches und Rebuilds ohne Push, lässt sich eine persönliche PaaS in eine reproduzierbare Betriebsumgebung verwandeln

Dokku: einen einzelnen VPS wie Heroku nutzen

  • Dokku ist eine Open-Source-PaaS, die auf einem einzelnen Server nach Wahl des Nutzers läuft
  • Es bietet ein Deployment-Erlebnis ähnlich wie Heroku, aber die Infrastruktur gehört dem Nutzer selbst
  • Da Heroku-Kosten stark ansteigen können, ist bei LLM-Consulting-Projekten mit mehreren Anwendungen eine kosteneffiziente Deployment-Plattform wichtig
  • Für Nicht-GPU-Workloads wird ein OVHcloud-VPS für 7 US-Dollar pro Monat als Dokku-Server betrieben

Deployment-Erlebnis wie bei Heroku und Betriebsfunktionen

  • Dokku bietet einen leicht nutzbaren Deployment-Workflow ähnlich wie Heroku
  • Es unterstützt automatisches SSL-Zertifikatsmanagement über Let’s Encrypt
  • Websites lassen sich mit Basic Auth per Passwort schützen
  • Scale-up und Scale-down sind mit einem einzigen Befehl möglich
  • Es verarbeitet verschiedenste Apps wie Node oder Python, und bei Bedarf können Docker-Container auch direkt definiert werden
  • Es gibt viele offizielle Plugins, mit denen sich die meisten benötigten Funktionen erweitern lassen
  • Deployments können allein mit Git-Befehlen durchgeführt werden

Apps als Docker-Container deployen

  • Nach der Installation von Dokku auf dem VPS kann eine App als Docker-Container deployt werden, wenn sich im Root des App-Repositories eine Dockerfile befindet
  • Die Beispiel-Dockerfile verwendet das Image python:3.10, kopiert den Code nach /app und führt anschließend pip install . aus
  • entrypoint.sh wird verwendet, um die App lokal oder im Docker-Container einfach zu starten
    • Im Beispiel wird eine FastAPI-App mit uvicorn main:app --port "$PORT" --host 0.0.0.0 gestartet
  • Zuerst wird auf dem Dokku-Host die App erstellt
dokku apps:create myapp
  • Lokal werden in ~/.ssh/config die Zugangsdaten für den Dokku-Host hinterlegt und der Hostname auf dokku gesetzt
  • Fügt man dem lokalen Git-Repository Dokku als Remote hinzu und pusht, wird deployt
git remote add dokku dokku@dokku:myapp
git push dokku main
  • Nach dem Deployment wird in den lokalen Logs die App-URL ausgegeben; standardmäßig hat sie die Form myapp.yourdomain.com
  • Die Zahl der Worker kann mit folgendem Befehl angepasst werden
dokku ps:scale myapp web=2

Private statische Websites und Basic Auth

  • GitHub Pages ist unpraktisch, weil für das einfache Deployment privater statischer Websites ein teures Enterprise-Konto nötig ist
  • Mit Dokku lassen sich statische Websites aus einem privaten GitHub-Repository deployen und per Passwort schützen
  • Es wird angenommen, dass sich die statische Website im Ordner _site des Git-Repositories befindet
  • Auf dem Dokku-Host wird eine App erstellt und die Umgebungsvariable NGINX_ROOT auf _site gesetzt
dokku apps:create mysite
dokku config:set static-site NGINX_ROOT=_site
sudo dokku plugin:install https://github.com/dokku/dokku-http-auth.git
sudo chmod +x /home/dokku
  • Im Root des Git-Repositories mit der statischen Website werden die folgenden Schritte ausgeführt
touch .static
echo BUILDPACK_URL=https://github.com/dokku/buildpack-nginx > .env
git remote add dokku dokku@dokku:mysite
  • .static teilt Dokku mit, dass es sich um eine statische Website handelt
  • BUILDPACK_URL legt fest, dass das nginx-Buildpack verwendet werden soll
    • Normalerweise wird es automatisch erkannt, aber in Projekten, die sowohl Code als auch statische Websites enthalten, verhindert die explizite Angabe des nginx-Buildpacks Verwirrung
  • Das Deployment erfolgt mit git push dokku main
  • Die Authentifizierung wird auf dem Dokku-Host mit folgendem Befehl aktiviert
dokku http-auth:enable mysite <username> <password>
  • Es können mehrere Benutzername/Passwort-Kombinationen hinzugefügt und bestimmte IPs gefiltert werden
  • HTTPS lässt sich mit dem Let’s-Encrypt-Plugin einrichten; automatische Erneuerung wird ebenfalls unterstützt
  • Wenn HTTPS über einen Cloudflare-Proxy abgewickelt wird, kann statt des Let’s-Encrypt-Plugins eine Konfiguration genutzt werden, die dies Cloudflare überlässt

Automatisches Deployment mit GitHub Actions

  • Dokku-Apps können automatisch mit GitHub Actions deployt werden
  • Wiederholtes manuelles Pushen direkt auf den Dokku-Host ist damit nicht mehr nötig
  • Der Beispiel-Workflow läuft bei workflow_dispatch und bei Pushes auf den Branch main
  • Die concurrency-Einstellung bricht vorherige Jobs ab, um einen Deploy-Lock von Dokku zu vermeiden
  • Der Workflow checkt den Code aus, erstellt aus secrets.DOKKU_SSH_PRIVATE_KEY einen SSH-Private-Key, fügt ein Git-Remote hinzu und führt einen Force-Push zu Dokku aus
name: CI
on:
  workflow_dispatch:
  push:
    branches: [main]

concurrency:
  group: ${{ github.ref }}
  cancel-in-progress: true

jobs:
  deploy-dokku:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Install SSH key
        run: |
          echo "${{ secrets.DOKKU_SSH_PRIVATE_KEY }}" > private_key.pem
          chmod 600 private_key.pem

      - name: Add remote and push
        run: |
          git remote add dokku dokku@rechat.co:llm-eval
          GIT_SSH_COMMAND="ssh -i private_key.pem -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git push dokku main -f

Remote-Befehle für den Betrieb und Rebuilds

  • Im Beispiel heißt die App llm-eval, der Host ist rechat.co
  • Auch ohne direkte SSH-Anmeldung auf dem Dokku-Host können Remote-Befehle als Nutzer dokku ausgeführt werden
ssh dokku@rechat.co apps:list
  • Ein neuer Build kann erzwungen werden, indem der Docker-Cache invalidiert wird
ssh dokku@rechat.co repo:purge-cache llm-eval
  • Wenn ein Rebuild ohne Push nötig ist, gibt es mehrere Wege; eine Möglichkeit ist der folgende Befehl
ssh dokku@rechat.co ps:rebuild llm-eval

Persönliche Referenz für wiederholte Deployments

  • Diese Notizen wurden zusammengestellt, weil bei jedem neuen App-Deployment dieselben Details erneut nachgeschlagen werden mussten
  • Sie dienen als wiederverwendbare Referenz für den Aufbau einer persönlichen Deployment-Plattform mit Dokku

Noch keine Kommentare.

Noch keine Kommentare.