- Dokku est un PaaS open source qui permet d’utiliser un VPS unique comme Heroku, bien adapté aux usages personnels ou aux petites équipes qui veulent déployer plusieurs applications à moindre coût sur une infrastructure qu’elles possèdent elles-mêmes
- Les charges de travail non-GPU tournent sur un VPS OVHcloud à 7 dollars par mois, ce qui réduit les coûts et la complexité de déploiement dans des contextes comme le conseil autour des LLM, où il faut souvent mettre des apps en ligne
- Les applications basées sur un Dockerfile se déploient simplement en créant une app Dokku, en ajoutant un remote Git, puis avec
git push dokku main, et le nombre de processus se règle avec dokku ps:scale
- Pour les sites statiques, la combinaison de
_site, .static, du buildpack nginx et de dokku-http-auth permet un déploiement à partir d’un dépôt GitHub privé avec protection par mot de passe
- En l’intégrant à GitHub Actions, à des commandes SSH distantes, à l’invalidation du cache Docker et aux rebuilds sans push, on peut transformer ce PaaS personnel en environnement d’exploitation reproductible
Dokku : utiliser un VPS unique comme Heroku
- Dokku est un PaaS open source qui s’exécute sur un serveur unique choisi par l’utilisateur
- Il offre une expérience de déploiement proche de Heroku, tout en laissant l’infrastructure à la charge de l’utilisateur
- Comme les coûts de Heroku peuvent vite grimper, une plateforme de déploiement économique est importante dans des activités comme le conseil autour des LLM, où plusieurs applications doivent être déployées
- Un serveur Dokku est exploité sur un VPS OVHcloud à 7 dollars par mois pour les charges de travail non-GPU
Expérience de déploiement à la Heroku et fonctions d’exploitation
- Dokku propose un flux de déploiement simple, à la manière de Heroku
- Il prend en charge la gestion automatique des certificats SSL via Let’s Encrypt
- Il permet de protéger un site par mot de passe avec Basic Auth
- Il permet de faire du scale up/down avec une seule commande
- Il gère des applications Node, Python et bien d’autres, et permet aussi de définir directement des conteneurs Docker si nécessaire
- Il dispose de nombreux plugins officiels, ce qui permet d’étendre la plupart des fonctions nécessaires
- Le déploiement peut se faire uniquement avec des commandes Git
Déployer une application avec un conteneur Docker
- Après avoir installé Dokku sur le VPS, il suffit de placer un Dockerfile à la racine du dépôt de l’application pour la déployer sous forme de conteneur Docker
- Le Dockerfile d’exemple utilise l’image
python:3.10, copie le code dans /app, puis exécute pip install .
entrypoint.sh sert à lancer facilement l’application en local ou dans un conteneur Docker
- L’exemple exécute une app FastAPI avec
uvicorn main:app --port "$PORT" --host 0.0.0.0
- Il faut d’abord créer l’application sur l’hôte Dokku
dokku apps:create myapp
- En local, les informations d’accès à l’hôte Dokku sont configurées dans
~/.ssh/config, avec le nom d’hôte dokku
- Une fois Dokku ajouté comme remote au dépôt Git local, un push déclenche le déploiement
git remote add dokku dokku@dokku:myapp
git push dokku main
- Après le déploiement, l’URL de l’application s’affiche dans les logs locaux ; par défaut, elle prend la forme
myapp.yourdomain.com
- Le nombre de workers peut être ajusté avec la commande suivante
dokku ps:scale myapp web=2
Sites statiques privés et Basic Auth
- GitHub Pages est peu pratique pour déployer facilement un site statique privé, car cela demande un compte Enterprise coûteux
- Avec Dokku, il est possible de déployer un site statique depuis un dépôt GitHub privé et de le protéger par mot de passe
- On suppose que le site statique se trouve dans le dossier
_site du dépôt Git
- Sur l’hôte Dokku, créer l’application et définir la variable d’environnement
NGINX_ROOT sur _site
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
- À la racine du dépôt Git contenant le site statique, effectuer les opérations suivantes
touch .static
echo BUILDPACK_URL=https://github.com/dokku/buildpack-nginx > .env
git remote add dokku dokku@dokku:mysite
.static indique à Dokku qu’il s’agit d’un site statique
BUILDPACK_URL force l’utilisation du buildpack nginx
- Il est en général détecté automatiquement, mais dans les projets qui contiennent à la fois du code et un site statique, il vaut mieux expliciter le buildpack nginx pour éviter toute confusion
- Le déploiement se fait avec
git push dokku main
- L’authentification s’active sur l’hôte Dokku avec la commande suivante
dokku http-auth:enable mysite <username> <password>
- Il est possible d’ajouter plusieurs couples identifiant/mot de passe et d’appliquer aussi un filtrage par IP
- Le HTTPS peut être configuré avec le plugin Let’s Encrypt, qui prend aussi en charge le renouvellement automatique
- Si HTTPS est géré via le proxy Cloudflare, la configuration peut être confiée à Cloudflare au lieu du plugin Let’s Encrypt
Déploiement automatique avec GitHub Actions
- Les applications Dokku peuvent être déployées automatiquement avec GitHub Actions
- Cela évite de répéter manuellement les pushs directs vers l’hôte Dokku
- Le workflow d’exemple s’exécute via
workflow_dispatch et lors des pushs sur la branche main
- Le paramètre
concurrency annule les jobs précédents afin d’éviter le verrou de déploiement de Dokku
- Le workflow checkout le code, crée une clé privée SSH à partir de
secrets.DOKKU_SSH_PRIVATE_KEY, ajoute le remote Git, puis force le push vers Dokku
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
Commandes d’exploitation à distance et rebuild
- Le nom d’application utilisé dans l’exemple est
llm-eval et l’hôte est rechat.co
- Il n’est pas nécessaire de se connecter directement en SSH à l’hôte Dokku : des commandes distantes peuvent être exécutées avec l’utilisateur
dokku
ssh dokku@rechat.co apps:list
- Il est possible d’invalider le cache Docker pour forcer une nouvelle build
ssh dokku@rechat.co repo:purge-cache llm-eval
- Lorsqu’un rebuild est nécessaire sans push, plusieurs méthodes existent ; en voici une
ssh dokku@rechat.co ps:rebuild llm-eval
Notes personnelles pour des déploiements répétés
- Ces notes ont été réunies parce qu’il fallait retrouver les mêmes détails à chaque nouveau déploiement d’application
- Elles servent de référence réutilisable pour mettre en place de façon répétée une plateforme de déploiement personnelle avec Dokku
Aucun commentaire pour le moment.