Dokku est un clone d’Heroku, et permet de déployer (simplement) des applications web.

Dokku permet de faire de l’hébergement de conteneurs, et est basé sur git. L’utilisateur push sur un dépôt et dokku s’occupe du reste (c’est à dire de déployer un container basé sur ce qui est dans le dépôt).

L’utilisation est très simple et pour avoir un conteneur, il suffit de demander à contact@rezel.net. Les seuls besoins sont une clé SSH (qui permettra de push dans le dépôt de l’application) et le nom du conteneur.

Le conteneur est disponible à app-name.apps.rezel.net, mais on peut ajouter autant de noms de domaines qu’on souhaite, pas forcément chez Rezel.

Déploiement

Clonage et évolution du dépôt

Dokku repose simplement sur… un dépôt git ! On push sur le serveur, qui déploie ce qu’on lui donne. Si le déploiement échoue, le push est annulé.

Pour pouvoir push sur le dépôt, il suffit de push sur dokku@apps.rezel.net:app-name.

Dockerfile

Le Dockerfile permet de construire notre image étape par étape. On utilise une image de base (par exemple un OS), puis on installe les dépendances. On peut ensuite vouloir déployer les fichiers, et exécuter une commande permettant de lancer le conteneur.

Un article qui explique à quoi sert et comment fonctionne le Dockerfile :

https://putaindecode.io/articles/les-dockerfiles/

Un exemple de Dockerfile :

https://github.com/heroku/alpinehelloworld/blob/master/Dockerfile

Stockage et données

Le stockage est non-persistent dans un conteneur, donc quand on push sur ce dernier, Dokku prend le dépôt git et le redéploie en entier. Tous les fichiers créés entre-temps sont perdus.

Il est par contre possible de connecter un conteneur à une base de données, qui elle est persistante. Rezel s’occupe de sa configuration. L’URL de la base de données est ensuite accessible par la variable d’environnement DATABASE_URL depuis le conteneur.

Ajouter le https

Vous pouvez faire vous-même le letsencrypt sur l’app pour avoir le https.

dokku config:set app-name DOKKU_LETSENCRYPT_EMAIL=<EMAIL>
dokku letsencrypt app-name

Accès et debug

Vous pouvez manipuler votre conteneur, vérifier son contenu, regarder les logs, le redémarrer, …

Par exemple, pour regarder les logs :

ssh dokku@apps.rezel.net logs app-name

Bien sûr, il faut être habilité pour manipuler un conteneur…

Voici une liste non exhaustive des commandes exécutables par un client :

  • Débug
    • enter - permet de rentrer dans l’app
    • logs - affiche les logs des conteneurs de l’app
  • Infos
    • urls - liste les URLs alias de l’app (en plus de app - name.apps.rezel.net)
  • Gestion de l’app
    • ps:rebuild - reconstruit le conteneur docker de l’app sans avoir besoin de re-push
    • ps:restart - redémarre les conteneurs de l’app
    • ps:stop - stoppe les conteneurs de l’app
    • ps:start - démarre les conteneurs de l’app
  • Configuration
    • config - permet de gérer les variables d’environnement de l’app (et d’avoir entre autres des infos sur la base de données)
    • config:set app-name VAR=val - permet de choisir une valeur
    • config:unset app-name VAR - permet de choisir une valeur
  • Locks : quand vous faites un push, un lock est mis en place et empêche de push. Si vous arrêtez le push en cours, le lock n’est pas enlevé. Il peut être utile d’enlever ce lock.
    • apps:unlock app-name
  • Gestion des noms de domaine
    • domains:report app-name - voir les noms de domaine actifs
    • une fois un domaine ajouté, letsencrypt app-name

Usage

Il peut être pratique d’ajouter un alias pour pouvoir manipuler plus facilement les conteneurs :

alias dokku='ssh -t dokku@apps.rezel.net'

Il suffit ensuite de faire dokku <command> app-name [valeur]