4 puntos por GN⁺ 2024-06-10 | 1 comentarios | Compartir por WhatsApp
  • Piku es una herramienta inspirada en Dokku que permite implementar aplicaciones con el método git push incluso en servidores propios pequeños
  • Apunta a un flujo similar al de Heroku/CloudFoundry, pero como en ese momento Dokku no funcionaba en ARM y Docker podía ser excesivo, busca un método de despliegue más simple
  • Durante el despliegue, detecta el runtime, instala dependencias, lee el Procfile y ejecuta workers con uwsgi; incluye manejo para Python, Node, Java, Clojure, Ruby y Go
  • Permite implementar, administrar y escalar varias apps de forma independiente en un solo host, y soporta hosts virtuales, SSL, sitios estáticos, mapeo de rutas URL y caché de respuestas del backend
  • Requiere Python 3.10 o superior, además de Python, nginx, uwsgi y SSH; es un proyecto en estado estable que apunta a soportar las dos versiones principales más recientes de Debian y Ubuntu LTS

El problema que resuelve Piku

  • Piku es una herramienta que permite desplegar con git push en tu propio servidor
  • Está inspirada en Dokku y apunta a funcionar incluso en servidores muy pequeños
  • Se quería una experiencia de despliegue similar a Heroku/CloudFoundry en algunas placas ARM, pero en ese momento Dokku no funcionaba en ARM y Docker a veces era excesivo, por lo que hacía falta una solución más simple
  • Actualmente permite desplegar, administrar y escalar de forma independiente varias aplicaciones por host, tanto en arquitecturas ARM como Intel
  • Funciona en proveedores cloud y entornos bare metal capaces de ejecutar Python, nginx y uwsgi

Instalación y estado del proyecto

  • La instalación básica puede hacerse con el siguiente comando
curl https://piku.github.io/get | sh
  • La documentación de instalación también incluye otros métodos, como cloud-init e instalación manual
  • El proyecto se considera en estado STABLE
    • El conjunto de funcionalidades está casi completo
    • Se actualiza cuando se agregan nuevos runtimes de lenguaje o aparecen bugs reproducibles
  • Actualmente requiere Python 3.10 o superior, y las pruebas también apuntan a Python 3.10 o superior
  • El objetivo de soporte son las dos versiones principales más recientes de Debian y Ubuntu LTS

Flujo de trabajo basado en Git Push

  • Piku soporta un flujo de trabajo similar al de Heroku
  • Usa el nombre de la app como nombre del repositorio y crea un remote Git por SSH que apunte al servidor Piku
git remote add piku piku@yourserver:appname
  • Despliega haciendo push del código
git push piku master
  • Para hacer push de una rama distinta a la rama actual, se usa así
git push piku release-branch-name
  • Durante el despliegue, Piku detecta el runtime, instala las dependencias necesarias y realiza los builds requeridos
    • Las apps Python separan sus dependencias mediante un virtualenv por app
    • Las apps Go definen un GOPATH separado por app
    • Las apps Node instalan en node_modules los elementos definidos en package.json
    • Las apps Java se compilan según pom.xml o build.gradle
    • Las apps Clojure pueden usar leiningen o la CLI de Clojure junto con el archivo deps.edn
    • Las apps Ruby ejecutan bundle install de las gems en una carpeta aislada

Modelo de ejecución y configuración

  • Piku lee el Procfile y ejecuta los workers correspondientes mediante uwsgi
  • uwsgi se usa como gestor de procesos de propósito general
  • Opcionalmente se puede definir un worker release, que se ejecuta una vez durante el despliegue de la app
  • Es posible cambiar la configuración de la aplicación o aumentar y reducir los procesos worker de forma remota
    • config:set cambia la configuración de la aplicación
    • ps:scale escala los procesos worker
  • El archivo ENV puede incluir la configuración de la aplicación y de nginx
  • Con el tipo de worker static, también se pueden desplegar sitios estáticos al estilo gh-pages
    • Se especifica la ruta raíz como argumento
    • También se puede ejecutar una tarea release que realice procesamiento en el servidor después de git push

Hosts virtuales, SSL y rutas estáticas

  • Piku soporta plenamente hosts virtuales
    • Permite alojar varias apps en el mismo VPS
    • Se puede acceder a las apps con distintos nombres de host usando alias DNS
  • Para habilitar SSL, se puede configurar un certificado privado u obtener un certificado de Let's Encrypt
  • Si se accede desde una LAN con clientes macOS, iOS o Linux, se puede usar piku/avahi-aliases para anunciar distintos hosts para la misma IP mediante Avahi/mDNS/Bonjour
  • Además de sitios estáticos, se puede mapear directamente un prefijo de URL específico a una ruta del sistema de archivos
  • También soporta caché de respuestas del backend para reducir la carga de la aplicación
  • Las rutas estáticas y la caché se configuran mediante valores en el archivo ENV

Plataformas y runtimes soportados

  • Piku está diseñado para funcionar en entornos tipo POSIX con Python, nginx, uwsgi y SSH
  • Los casos de despliegue incluyen Linux, FreeBSD, Cygwin y Windows Subsystem for Linux
  • El desarrollo comenzó en una Raspberry Pi Model B de 256 MB y todavía se ejecuta de forma estable en ese equipo
  • Su uso principal es como micro PaaS para ejecutar apps en servidores cloud con CPU Intel y ARM
  • Las plataformas objetivo son Debian y Ubuntu Linux
  • Actualmente soporta apps Python, Node, Clojure y Java, y también se está trabajando en algunos lenguajes como Go
  • Como principio general, si se puede invocar desde el shell, se puede ejecutar dentro de Piku

Principios de diseño

  • Prioriza ejecutarse en dispositivos de bajos recursos
  • Debe ser accesible también para desarrolladores aficionados y escuelas K-12
  • Apunta a unas 1500 líneas de código fácil de leer
  • Prefiere un estilo de código funcional
  • Busca tener pocas dependencias
  • Sigue el enfoque de 12 factor app
  • Prioriza simplificar la experiencia de usuario
  • Apunta a cubrir el 80% de los casos de uso comunes
  • Ofrece valores predeterminados razonables para todas las funciones
  • Aprovecha los paquetes de distribución de Raspbian, Debian y Ubuntu
    • El soporte para Alpine y RHEL está en desarrollo
  • Usa herramientas estándar como git, ssh, uwsgi y nginx
  • Mantiene la compatibilidad hacia atrás siempre que sea posible

1 comentarios

 
GN⁺ 2024-06-10
Opiniones de Hacker News
  • Me gusta piku, así que escribí un tutorial de una app web para piku, y terminó entrando como repositorio en la organización oficial de piku en GitHub
    https://github.com/piku/webapp-tutorial?tab=readme-ov-file#b...
    Explica cómo funciona piku internamente y también muestra, desde la perspectiva del usuario, un ejemplo mínimo de una app web en Python

    • La nueva documentación de piku se ve bonita, pero para un usuario nuevo que quiere probar piku era casi inútil
      Sentí que la documentación asumía que ya sabía todo lo necesario para ejecutar y usar piku, así que me rendí; este tutorial llena ese vacío
      Sin embargo, aunque busqué bastante durante mucho tiempo, no encontré este documento, y si no fuera por este comentario ni habría sabido que existía
      Como mínimo, deberían enlazarlo de forma visible desde el repositorio de piku y la página principal de la documentación; si es posible, sería mejor incluirlo completo en la página principal de la documentación
      Más aún, sería mucho más útil agregar un tutorial de punta a punta que vaya desde un servidor bare metal nuevo hasta un dominio personalizado y certificado SSL accesibles públicamente
      Aunque parezcan pasos no relacionados directamente con piku, lo que en realidad quiere un usuario nuevo es subir su propio sitio a algo como un Droplet de US$5, y muchas veces todavía no conoce los pasos intermedios
      No importa qué método elijan; quien quiera discutir el método ya sabe cuál prefiere
      Como referencia, aquí hay un ejemplo de punta a punta de Coolify: https://billyle.dev/posts/self-hosting-your-website-with-coo...
      El objetivo no es simplemente hacer que sea funcionalmente posible, sino facilitar que más gente empiece y así aumentar mucho la adopción de piku
    • Me gustó que explicara qué es el “despliegue al estilo Heroku
      No tenía idea de qué era Heroku ni qué hacía
    • Viendo solo el repositorio oficial no quedaba lo suficientemente claro, pero la explicación ayudó
      Si entendí bien, ¿piku instala un agente en la máquina remota y un hook de commit en la máquina local?
      Me pregunto si no se podría reducir el overhead haciendo que la máquina remota sea simplemente un repositorio Git remoto y que, al hacer push a una rama específica, todo el trabajo se haga del lado remoto
    • Este tutorial ahora está enlazado desde la página principal de la documentación
  • Se ve bien, y Dokku también me resultó muy estable, pero si se elimina la dependencia de Docker, quedas atado a las opciones que ofrece el sistema operativo
    No es ideal para apps que podrían correr durante años sin mantenimiento, y al final te encuentras rápidamente con que necesitas una versión específica del sistema operativo

    • Es un nicho distinto al de piku, pero también recomiendo Dokku
      Lo usé para subir pequeños proyectos secundarios a un VPS y actualicé la instalación de Dokku a través de 3 o 4 versiones de Ubuntu LTS sin problemas; funcionó muy bien
    • A veces Docker es excesivo, y de verdad se agradece que existan herramientas que se puedan usar sin Docker
    • Se puede usar piku junto con Docker. Tengo algunos Procfile con sentencias docker run, aunque por supuesto no fue diseñado para ese uso
      La mayoría de los despliegues que he visto están sobre distribuciones muy estables, normalmente versiones LTS, así que no hizo falta actualizar el runtime cada 6 meses, y mi sitio web siguió corriendo en piku durante más de dos cambios de Ubuntu LTS
      Con solo configurar variables de entorno, también se pueden usar fácilmente cosas como pyenv y nvenv
      Mi sistema de automatización del hogar ahora necesita dos versiones de Node distintas, y tengo configurada una por app
    • ¿Cómo se puede resolver el infierno de dependencias al usar herramientas como esta?
      Entiendo que la actitud de “simplemente funciona” es elegante, y que Docker no puede usarse en todas partes por su overhead técnico y mental, pero lo bueno de los contenedores es que aíslan todo y permiten dejarlo fijo como si se detuviera el tiempo, de modo que 5 años después “simplemente funcione”
      En mi pequeño flujo de trabajo, la gestión de contenedores la hago con lazydocker, el despliegue por push con un workflow de GitLab, y la compilación, el push al registry de GitLab y la ejecución con un pequeño VPS
      Es un poco excesivo, así que creo que también podría hacerse con una combinación de Dockerfile, compose.yml y docker compose build
      Todavía no tengo resuelto el escalado, pero por suerte ahora no lo necesito; si llegara a necesitarlo, probablemente cambiaría Docker por k8s y lazydocker por k9s
      Recién estoy entrando en DevOps, así que cualquier sugerencia es bienvenida
    • Yo uso docker compose + traefik
      Para mí es mejor que Dokku porque tiene menos abstracciones mágicas
  • No está directamente relacionado con el despliegue con git push, pero sí muy ligado a la experiencia PaaS: el equipo en el que estoy está probando una vista previa de Cloud Native Buildpacks (CNB), una especificación abierta de la CNCF
    Son Buildpacks orientados a OCI, lo que significa que puedes crear imágenes Docker localmente con una herramienta de build que detecta el soporte de lenguaje y actúa en consecuencia, como la lógica de git push de Heroku
    Aquí hay un tutorial para compilar una app Rails con un buildpack que mantengo: https://www.schneems.com/2024/05/01/build-a-ruby-on-rails-ap...
    Si lo pruebas, ya sea que tu reacción sea buena, mala o indiferente, dejar tu experiencia en la discusión enlazada ayudará a mejorarlo

  • Vi piku por primera vez.
    No sé por qué, pero esa sensación de que el despliegue empieza con git push, como en piku, siempre me pareció mágica, y siento que no puede ser más simple que eso.
    Justo ayer publiqué como open source un proyecto para Kubernetes en el mismo ámbito; está aquí: https://github.com/pier-oliviert/sequencer
    En fin, felicitaciones, se ve bien.

    • Funciona como por arte de magia, pero si quieres aprender, hacerlo tú mismo también es muy simple.
      En el servidor, creas un repositorio Git con git init --bare y configuras git config receive.denyCurrentBranch updateInstead.
      Luego, con un hook de Git, más específicamente un hook push-to-checkout, puedes recibir la subida, compilar y ejecutar.
      El hook es un script de shell sencillo, y en su forma más básica basta con una variante como compile && install && systemctl restart service.
      Después, si clonas el repositorio en local, al hacer push de los cambios se ejecuta el hook configurado.
      git clone root@yourserver.com:/path/to/git/folder
    • No sé si me estoy perdiendo algo obvio, pero si sequencer se parece a Heroku/Dokku/piku, me da curiosidad cómo hace el despliegue con Git.
      Por la descripción, parece que maneja plantillas de Kubernetes y kubectl, no despliegues con git push, así que parece un proyecto de un ámbito completamente distinto.
  • La documentación renovada de piku se puede ver aquí: https://piku.github.io/

    • ¿Esto es el sucesor de Dokku? No sabía que había un segundo proyecto.
  • ¿El commit inicial fue hace 8 años?
    Ojalá hubiera conocido este proyecto hace unos 18 meses, cuando estaba buscando una forma de desplegar en una Raspberry Pi con una experiencia de desarrollo tipo Heroku; piku parece apuntar exactamente a eso.

    • Exacto. Hay un problema de visibilidad.
      Acabo de configurar un VPS nuevo con CapRover y, mientras buscaba durante más o menos una hora comparativas de “PaaS self-hosted al estilo Heroku”, vi Dokku, CapRover, Coolify y Dokploy, pero no vi piku en absoluto.
  • Soy maintainer y coautor.
    Si te gustan las herramientas de despliegue simples y minimalistas, también agradecería que vieras https://github.com/rcarmo/ground-init, que aborda cloud-init de una forma mucho más realista.

    • Viendo solo el README, no queda muy claro por qué no debería ser cloud-init.
  • Me da curiosidad si hay alguna forma de manejar despliegues sin downtime.
    Por ejemplo, si un servicio Python está corriendo detrás de nginx en el puerto 8080 de una máquina, ¿cómo hace piku para cambiar a una nueva instancia en el mismo puerto?

    • Actualmente, solo finaliza el proceso en ejecución después de que termina el nuevo despliegue por git push.
      El manejo de sockets y sesiones depende de cómo esté escrito el código y de si usa uwsgi o levanta un daemon HTTP directamente.
      Una de las funciones que ya se soportan opcionalmente es finalizar instancias no usadas e instancias inactivas, y hacer arranque diferido cuando llega una conexión nueva.
    • Un poco fuera de tema, pero con activación de sockets de systemd se pueden hacer despliegues sin downtime.
  • Me gusta Epinio, que hace lo mismo sobre Kubernetes.
    Está respaldado por SUSE y, por ejemplo, es más liviano que KNative, que es la base de GCP Cloud Run, pero al estar basado en Kubernetes sigue requiriendo más recursos que Dokku o piku.
    Aun así, prefiero k8s porque tiene un ecosistema amplio de soluciones maduras.
    También se puede correr todo en un solo servidor, solo que se necesita uno un poco más grande.
    El nuevo Hetzner CX42 tiene 8 vCPU, 16 GB de RAM y 160 GB de disco por €16.40 al mes, €0.0273 por hora, así que alcanza; y con el proyecto Kube Hetzner se puede configurar en menos de 5 minutos un clúster Kubernetes basado en MicroOS con actualizaciones automáticas.
    https://github.com/epinio/epinio/
    https://github.com/kube-hetzner/terraform-hcloud-kube-hetzne...

    • Si “Epinio hace lo mismo sobre Kubernetes”, ¿no significa en realidad que no es para nada lo mismo?
      El punto central de piku parece ser ofrecer una experiencia tipo Heroku sin Docker, con una arquitectura realmente simple, y que además funcione en ARM.
      Concedo que Kubernetes funciona en ARM, pero hasta donde sé Kubernetes requiere algún tipo de contenedor, ya sea Docker u otra cosa, y su arquitectura, por razones obvias, nunca es simple.
      Además, ni siquiera tengo claro si Epinio permite un flujo con git push.
      El tutorial de inicio rápido parece indicar que para desplegar una aplicación se use un comando como epinio push manifest.yaml, así que tampoco encaja con la “experiencia tipo Heroku”.
      Al final, creo que lo único que tienen en común es que gestionan despliegues.
  • Me gusta el enfoque minimalista, así que pienso probarlo.
    También hay cosas similares que vale la pena mirar.
    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