7 puntos por GN⁺ 2024-08-27 | Aún no hay comentarios. | Compartir por WhatsApp
  • Dokku es una PaaS open source que permite usar un solo VPS como si fuera Heroku, ideal para trabajos personales y equipos pequeños que quieren desplegar varias apps en infraestructura propia y a bajo costo
  • Las cargas de trabajo sin GPU se ejecutan en un VPS de OVHcloud de 7 dólares al mes, lo que reduce el costo y la complejidad de despliegue en entornos donde hay que subir apps con frecuencia, como consultoría de LLM
  • Las apps basadas en Dockerfile se despliegan con solo crear la app en Dokku, agregar el remote de Git y ejecutar git push dokku main; con dokku ps:scale se puede ajustar la cantidad de procesos
  • Los sitios estáticos también pueden desplegarse desde repositorios privados de GitHub y protegerse con contraseña combinando _site, .static, el buildpack de nginx y dokku-http-auth
  • Al integrar GitHub Actions, comandos remotos por SSH, invalidación de caché de Docker y rebuilds sin push, se puede convertir una PaaS personal en un entorno operativo repetible

Usar un solo VPS como si fuera Heroku con Dokku

  • Dokku es una PaaS open source que se ejecuta en un único servidor elegido por el usuario
  • Ofrece una experiencia de despliegue similar a Heroku, pero la infraestructura es propiedad del usuario
  • Como los costos de Heroku pueden crecer bastante, en trabajos de consultoría de LLM donde hay que desplegar varias aplicaciones es importante contar con una plataforma de despliegue rentable
  • Para cargas de trabajo sin GPU, se opera un servidor Dokku en un VPS de OVHcloud de 7 dólares al mes

Experiencia de despliegue al estilo Heroku y funciones operativas

  • Dokku ofrece un flujo de despliegue fácil de usar, como Heroku
  • Soporta gestión automática de certificados SSL mediante Let’s Encrypt
  • Permite proteger sitios con contraseña usando Basic Auth
  • Permite hacer scale up/down con un solo comando
  • Maneja varias apps como Node y Python, y cuando hace falta también permite definir directamente contenedores Docker
  • Tiene muchos plugins oficiales, por lo que se puede ampliar la mayoría de las funciones necesarias
  • El despliegue puede realizarse solo con comandos Git

Desplegar apps como contenedores Docker

  • Después de instalar Dokku en el VPS, si se coloca un Dockerfile en la raíz del repositorio de la app, se puede desplegar como contenedor Docker
  • El Dockerfile de ejemplo usa la imagen python:3.10, copia el código a /app y luego ejecuta pip install .
  • entrypoint.sh se usa para ejecutar fácilmente la app en local o dentro de un contenedor Docker
    • El ejemplo ejecuta una app FastAPI con uvicorn main:app --port "$PORT" --host 0.0.0.0
  • Primero se crea la app en el host Dokku
dokku apps:create myapp
  • En local, se configura la información de acceso al host Dokku en ~/.ssh/config y se asigna a ese host el nombre dokku
  • Al agregar Dokku como remote en el repositorio Git local y hacer push, se despliega
git remote add dokku dokku@dokku:myapp
git push dokku main
  • Después del despliegue, la URL de la app se muestra en los logs locales; por defecto tiene la forma myapp.yourdomain.com
  • La cantidad de workers se puede ajustar con el siguiente comando
dokku ps:scale myapp web=2

Sitios estáticos privados y Basic Auth

  • GitHub Pages resulta incómodo para desplegar fácilmente sitios estáticos privados, porque requiere una costosa cuenta Enterprise
  • Con Dokku se puede desplegar un sitio estático desde un repositorio privado de GitHub y protegerlo con contraseña
  • Se asume que el sitio estático está en la carpeta _site del repositorio Git
  • En el host Dokku, se crea la app y se configura la variable de entorno NGINX_ROOT como _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
  • En la raíz del repositorio Git que contiene el sitio estático, se ejecuta lo siguiente
touch .static
echo BUILDPACK_URL=https://github.com/dokku/buildpack-nginx > .env
git remote add dokku dokku@dokku:mysite
  • .static le indica a Dokku que es un sitio estático
  • BUILDPACK_URL especifica que se use el buildpack de nginx
    • Normalmente se detecta automáticamente, pero en proyectos que combinan código y sitio estático conviene declarar explícitamente el buildpack de nginx para reducir confusiones
  • El despliegue se realiza con git push dokku main
  • La autenticación se activa en el host Dokku con el siguiente comando
dokku http-auth:enable mysite <username> <password>
  • Se pueden agregar varios nombres de usuario/contraseñas y también filtrar por IP específica
  • HTTPS puede configurarse con el plugin de Let’s Encrypt, que también soporta renovación automática
  • Si se gestiona HTTPS con un proxy de Cloudflare, se usa una configuración que lo deja en manos de Cloudflare en lugar del plugin de Let’s Encrypt

Despliegue automático con GitHub Actions

  • Las apps de Dokku pueden desplegarse automáticamente con GitHub Actions
  • No hace falta repetir manualmente el push directo al host Dokku
  • El workflow de ejemplo se ejecuta con workflow_dispatch y ante push a la rama main
  • La configuración concurrency cancela jobs anteriores para evitar el deploy lock de Dokku
  • El workflow hace checkout del código, crea una clave privada SSH desde secrets.DOKKU_SSH_PRIVATE_KEY, agrega el remote de Git y hace push forzado a 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

Comandos remotos de operación y rebuild

  • El nombre de la app de ejemplo es llm-eval y el host es rechat.co
  • Se pueden ejecutar comandos remotos como el usuario dokku sin iniciar sesión por SSH directamente en el host Dokku
ssh dokku@rechat.co apps:list
  • Se puede invalidar la caché de Docker para realizar un nuevo build
ssh dokku@rechat.co repo:purge-cache llm-eval
  • Cuando se necesita hacer rebuild sin push, hay varias formas; una de ellas es el siguiente comando
ssh dokku@rechat.co ps:rebuild llm-eval

Referencia personal para despliegues repetidos

  • Se organizó esta información porque cada vez que se despliega una app nueva hay que volver a buscar los mismos detalles
  • Queda como referencia reutilizable para configurar una plataforma personal de despliegue con Dokku

Aún no hay comentarios.

Aún no hay comentarios.