- 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.