- 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.