- Piku est un outil inspiré de Dokku qui permet de déployer des applications par
git push, même sur de petits serveurs auto-hébergés
- Il vise un flux de travail de type Heroku/CloudFoundry, mais comme Dokku ne fonctionnait pas alors sur ARM et que Docker pouvait être excessif, l’objectif était une approche de déploiement plus simple
- Lors du déploiement, il détecte le runtime, installe les dépendances, lit le
Procfile puis lance les workers avec uwsgi, avec une prise en charge de Python, Node, Java, Clojure, Ruby et Go
- Plusieurs applications peuvent être déployées, gérées et mises à l’échelle indépendamment sur un même hôte, avec prise en charge des hôtes virtuels, de SSL, des sites statiques, du mapping de chemins d’URL et du cache des réponses backend
- Il nécessite Python 3.10 ou supérieur, ainsi que Python,
nginx, uwsgi et SSH, et le projet est considéré comme stable, avec pour objectif la prise en charge des deux dernières versions majeures de Debian et Ubuntu LTS
Le problème que résout Piku
- Piku est un outil qui permet le déploiement par
git push sur son propre serveur
- Il est inspiré de Dokku et vise à fonctionner même sur de très petites machines
- L’objectif était de retrouver une expérience de déploiement proche de Heroku/CloudFoundry sur quelques cartes ARM, mais comme Dokku ne fonctionnait pas alors sur ARM et que Docker pouvait être disproportionné, une solution plus simple était nécessaire
- Il permet aujourd’hui de déployer, gérer et mettre à l’échelle indépendamment plusieurs applications par hôte, sur architectures ARM comme Intel
- Il fonctionne chez les fournisseurs cloud comme sur du bare metal, dès lors qu’il est possible d’exécuter Python,
nginx et uwsgi
Installation et état du projet
- L’installation de base se fait avec la commande suivante
curl https://piku.github.io/get | sh
- La documentation d’installation décrit aussi d’autres méthodes, notamment
cloud-init et l’installation manuelle
- Le projet est considéré comme STABLE
- l’ensemble des fonctionnalités est quasiment complet
- des mises à jour sont publiées lors de l’ajout de nouveaux runtimes ou de l’apparition de bugs reproductibles
- Python 3.10 ou supérieur est actuellement requis, et les tests portent également sur Python 3.10+
- L’objectif de support couvre les deux dernières versions majeures de Debian et Ubuntu LTS
Workflow basé sur Git Push
- Piku prend en charge un workflow similaire à Heroku
- Il suffit de créer une remote Git SSH pointant vers le serveur Piku, en utilisant le nom de l’application comme nom de dépôt
git remote add piku piku@yourserver:appname
- Le déploiement se fait en poussant le code
git push piku master
- Pour pousser une branche autre que la branche courante, on utilise par exemple
git push piku release-branch-name
- Pendant le déploiement, Piku détecte le runtime, installe les dépendances nécessaires et effectue les étapes de build requises
- les applications Python isolent leurs dépendances dans un virtualenv par application
- les applications Go définissent un
GOPATH distinct par application
- les applications Node installent dans
node_modules les éléments définis dans package.json
- les applications Java sont construites selon
pom.xml ou build.gradle
- les applications Clojure peuvent utiliser
leiningen ou la CLI Clojure avec un fichier deps.edn
- les applications Ruby installent les gems dans un dossier isolé via
bundle install
Modèle d’exécution et configuration
- Piku lit le
Procfile et exécute les workers correspondants via uwsgi
uwsgi est utilisé comme gestionnaire de processus générique
- Il est possible de définir un worker
release optionnel, exécuté une seule fois lors du déploiement de l’application
- Il est possible de modifier à distance la configuration de l’application ou d’augmenter et réduire le nombre de processus worker
config:set permet de modifier la configuration de l’application
ps:scale permet de mettre à l’échelle les processus worker
- Le fichier
ENV peut contenir la configuration de l’application ainsi que celle de nginx
- Le type de worker
static permet aussi de déployer des sites statiques de type gh-pages
- le chemin racine est fourni en argument
- il est également possible d’exécuter une tâche
release qui effectue des traitements côté serveur après git push
Hôtes virtuels, SSL et chemins statiques
- Piku prend entièrement en charge les hôtes virtuels
- plusieurs applications peuvent être hébergées sur le même VPS
- des alias DNS permettent d’accéder aux applications via des noms d’hôte différents
- Pour activer SSL, on peut configurer un certificat privé ou obtenir un certificat Let's Encrypt
- Pour un accès sur un réseau local depuis des clients macOS, iOS ou Linux,
piku/avahi-aliases permet d’annoncer différents hôtes pour une même IP via Avahi/mDNS/Bonjour
- Au-delà des sites statiques, il est aussi possible de mapper directement un préfixe d’URL vers un chemin du système de fichiers
- La mise en cache des réponses backend pour réduire la charge applicative est également prise en charge
- Les chemins statiques et le cache se configurent via des valeurs dans le fichier
ENV
Plateformes et runtimes pris en charge
- Piku est conçu pour fonctionner dans un environnement de type POSIX disposant de Python,
nginx, uwsgi et SSH
- Les déploiements recensés incluent Linux, FreeBSD, Cygwin et le Windows Subsystem for Linux
- Le développement a commencé sur un Raspberry Pi Model B de 256 Mo, et il fonctionne encore aujourd’hui de manière fiable sur cette machine
- Son usage principal est celui d’un micro-PaaS pour exécuter des applications sur des serveurs cloud équipés de CPU Intel ou ARM
- Les plateformes cibles sont Debian et Ubuntu Linux
- Il prend actuellement en charge les applications Python, Node, Clojure et Java, tandis que certaines autres comme Go sont en cours de développement
- En règle générale, si quelque chose peut être appelé depuis un shell, cela peut être exécuté dans Piku
Principes de conception
- priorité à l’exécution sur du matériel peu puissant
- doit rester accessible aux développeurs hobbyistes et aux écoles K-12
- vise environ 1500 lignes de code lisibles
- privilégie un style de code fonctionnel
- cherche à limiter les dépendances
- suit les principes du 12 factor app
- accorde une grande importance à la simplicité de l’expérience utilisateur
- vise à couvrir 80 % des cas d’usage courants
- fournit des valeurs par défaut raisonnables pour toutes les fonctionnalités
- s’appuie sur les paquets des distributions Raspbian, Debian et Ubuntu
- la prise en charge d’Alpine et de RHEL est en cours
- exploite des outils standard comme
git, ssh, uwsgi et nginx
- maintient si possible la rétrocompatibilité
1 commentaires
Avis de Hacker News
J’aime piku, j’ai donc écrit un tutoriel d’application web pour piku, et il a été intégré comme dépôt de l’organisation GitHub officielle de piku
https://github.com/piku/webapp-tutorial?tab=readme-ov-file#b...
Il explique comment piku fonctionne en interne et montre aussi, du point de vue utilisateur, un exemple minimal d’application web Python
Elle donnait l’impression de supposer qu’on savait déjà tout ce qu’il fallait pour exécuter et utiliser piku, ce qui m’a fait abandonner ; ce tutoriel comble cette lacune
Pourtant, même après avoir pas mal cherché, je ne l’avais pas trouvé, et sans ce commentaire je n’aurais même pas su qu’il existait
Il faudrait au minimum le mettre en lien bien visible depuis le dépôt piku et la page d’accueil de la documentation, et si possible l’intégrer entièrement à cette page
Mieux encore, ajouter un tutoriel de bout en bout partant d’un nouveau serveur bare metal jusqu’à un domaine personnalisé et un certificat SSL accessibles publiquement serait beaucoup plus utile
Même si certaines étapes semblent ne pas être directement liées à piku, ce que veulent réellement les nouveaux utilisateurs, c’est mettre leur site en ligne sur quelque chose comme un Droplet à 5 $, et ils ne connaissent souvent pas encore les étapes intermédiaires
Peu importe la méthode choisie ; ceux qui veulent discuter de la méthode savent déjà laquelle ils préfèrent
À titre de référence, voici un exemple de bout en bout côté Coolify : https://billyle.dev/posts/self-hosting-your-website-with-coo...
L’objectif n’est pas de rendre cela fonctionnellement possible, mais de permettre à davantage de personnes de démarrer facilement et d’augmenter fortement l’adoption de piku
Je ne savais absolument pas ce qu’était Heroku ni ce que ça faisait
Si j’ai bien compris, piku installe un agent sur la machine distante et un hook de commit sur la machine locale ?
Je me demande si l’overhead n’aurait pas pu être réduit en faisant simplement de la machine distante un dépôt Git distant, puis en lui faisant effectuer tout le travail côté distant lors d’un push vers une branche donnée
Ça a l’air bien, et Dokku a aussi été très stable pour moi, mais si l’on supprime la dépendance à Docker, on se retrouve alors limité aux options fournies par le système d’exploitation
Ce n’est pas idéal pour des apps qui peuvent tourner pendant des années sans maintenance, et on se retrouve vite confronté au besoin d’une version précise du système d’exploitation
Pour héberger de petits side projects sur un VPS, j’ai fait passer mon installation Dokku par 3 ou 4 mises à niveau d’Ubuntu LTS, et tout a continué à très bien fonctionner
docker run, même si ce n’est évidemment pas conçu pour cet usageLa plupart des déploiements que j’ai vus tournaient sur des distributions très stables, généralement des versions LTS, donc il n’était pas nécessaire de mettre à niveau le runtime tous les six mois ; mon site web aussi a continué à tourner sur piku pendant au moins deux changements d’Ubuntu LTS
Il suffit de définir des variables d’environnement pour utiliser facilement des outils comme
pyenvounvenvMon système de domotique a maintenant besoin de deux versions de Node différentes, et j’en ai configuré une par application
Je comprends l’élégance de l’approche “ça marche, tout simplement”, et aussi que Docker ne peut pas être utilisé partout à cause de son overhead technique et mental, mais ce que j’aime avec les conteneurs, c’est qu’ils isolent tout et peuvent presque figer le temps, de sorte que, cinq ans plus tard, “ça marche toujours”
Dans mon petit workflow, la gestion des conteneurs passe par lazydocker, le déploiement par push par un workflow GitLab, et la build, le push vers le registre GitLab ainsi que l’exécution sont gérés par un petit VPS
C’est un peu excessif, et je pense qu’une combinaison
Dockerfile,compose.ymletdocker compose buildpourrait aussi suffireJe n’ai pas encore vraiment réglé la question de la montée en charge, mais pour l’instant je n’en ai heureusement pas besoin ; si cela devient nécessaire, je remplacerai sans doute Docker par k8s et lazydocker par k9s
Je viens tout juste d’arriver dans le DevOps, donc toutes les suggestions sont les bienvenues
Il y a moins d’abstractions magiques, donc ça me convient mieux que Dokku
Ce n’est pas directement lié au déploiement par
git push, mais c’est étroitement lié à l’expérience PaaS : l’équipe dont je fais partie teste en avant-première Cloud Native Buildpacks (CNB), une spécification ouverte de la CNCFIl s’agit de Buildpacks ciblant OCI, ce qui signifie qu’on peut créer localement des images Docker avec un outil de build qui détecte la prise en charge des langages et applique le traitement approprié, à la manière de la logique
git pushde HerokuVoici un tutoriel pour construire une app Rails avec un buildpack que je maintiens : https://www.schneems.com/2024/05/01/build-a-ruby-on-rails-ap...
Si vous l’essayez, que votre retour soit positif, négatif ou indifférent, laisser votre expérience dans la discussion liée aidera à l’améliorer
Je découvrais piku pour la première fois
Je ne sais pas pourquoi, mais cette sensation où le déploiement démarre avec un
git push, comme avec piku, m’a toujours paru magique, et j’ai l’impression qu’on ne peut pas faire plus simpleJustement, hier, j’ai publié en open source un projet pour Kubernetes dans le même domaine ; il est ici : https://github.com/pier-oliviert/sequencer
En tout cas, félicitations, ça a l’air bien
Sur le serveur, il suffit de créer un dépôt Git avec
git init --bareet de configurergit config receive.denyCurrentBranch updateInsteadEnsuite, avec un hook Git, plus précisément un hook push-to-checkout, on peut recevoir l’upload, compiler et exécuter
Le hook est un simple script shell, et dans sa forme la plus basique, une variante de
compile && install && systemctl restart servicesuffitEnsuite, une fois le dépôt cloné en local, le hook configuré s’exécute quand on pousse des changements
git clone root@yourserver.com:/path/to/git/folderD’après la description, il semble plutôt gérer des templates Kubernetes et
kubectl, pas un déploiement pargit push, donc ça ressemble à un projet d’un tout autre domaineLa nouvelle documentation remaniée de piku est disponible ici : https://piku.github.io/
Le commit initial remonte à il y a 8 ans ?
J’aurais aimé connaître ce projet il y a environ 18 mois : je cherchais une façon de déployer sur un Raspberry Pi avec une expérience de développement à la Heroku, et piku semble viser exactement cela
Je viens de configurer un nouveau VPS avec CapRover, et pendant environ une heure de recherches comparant les « PaaS self-hosted façon Heroku », j’ai vu Dokku, CapRover, Coolify et Dokploy, mais pas du tout piku
Je suis mainteneur et co-auteur
Si vous aimez les outils de déploiement simples et minimalistes, vous pouvez aussi jeter un œil à https://github.com/rcarmo/ground-init, qui traite cloud-init de façon beaucoup plus réaliste
Je me demande s’il existe une façon de gérer les déploiements sans interruption
Par exemple, si un service Python tourne derrière nginx sur le port 8080 d’une machine, comment piku bascule-t-il vers une nouvelle instance sur le même port ?
git pushterminéLa gestion des sockets et des sessions dépend de la façon dont le code est écrit, selon qu’on utilise
uwsgiou qu’on lance directement un démon HTTPL’une des fonctionnalités déjà prises en charge de manière optionnelle consiste à arrêter les instances inutilisées et inactives, puis à les démarrer à la demande avec un délai quand une nouvelle connexion arrive
J’aime bien Epinio, qui fait la même chose sur Kubernetes
Il est soutenu par SUSE et, par exemple, il est plus léger que KNative, qui sert de base à GCP Cloud Run, mais comme il repose sur Kubernetes, il nécessite tout de même plus de ressources que Dokku ou piku
Cela dit, je préfère k8s, car l’écosystème de solutions matures est vaste
On peut tout faire tourner même sur un seul serveur, mais il faut simplement une machine un peu plus grosse
Le nouveau Hetzner CX42 offre 8 vCPU, 16 Go de RAM et 160 Go de disque pour 16,40 € par mois, ou 0,0273 € de l’heure, ce qui est suffisant ; avec le projet Kube Hetzner, on peut mettre en place en moins de 5 minutes un cluster Kubernetes basé sur MicroOS avec mises à jour automatiques
https://github.com/epinio/epinio/
https://github.com/kube-hetzner/terraform-hcloud-kube-hetzne...
Le cœur de piku semble être d’offrir une expérience à la Heroku sans Docker, avec une architecture vraiment simple, et qui fonctionne aussi sur ARM
J’admets que Kubernetes fonctionne sur ARM, mais à ma connaissance Kubernetes exige une forme de conteneur, Docker ou autre, et son architecture n’est clairement jamais simple pour des raisons évidentes
En plus, je ne suis même pas sûr qu’Epinio permette un flux avec
git pushLe tutoriel de démarrage rapide semble demander d’utiliser une commande comme
epinio push manifest.yamlpour déployer une application, donc ça ne correspond pas non plus à une « expérience à la Heroku »Au final, j’ai l’impression que leur seul point commun est de gérer le déploiement
J’aime l’approche minimaliste, donc je vais l’essayer
Il y a aussi des choses similaires à regarder
https://kamal-deploy.org/
https://github.com/basecamp/kamal
https://dokku.com/
https://github.com/dokku/dokku/
https://clace.io/
https://github.com/claceio/clace