
Hace un tiempo vibe-coded una app de gestión de proyectos (que sigo usando hoy) porque prácticamente todas las opciones existentes como Monday, Asana y MS Project son una porquería de una manera u otra, o te cobran de más por las funciones que necesitaba. Recuerdo que busqué la forma más fácil y menos dolorosa de deployarla y resultó que los containers eran la respuesta. Súper directo.
¿Docker O Podman?

Hay muchas opciones para correr containers pero generalmente se reduce a Docker o Podman.
Docker funciona bien, pero necesita un daemon (dockerd) corriendo todo el tiempo, y no quiero otro servicio en segundo plano en mi sistema. Para un servidor personal no me fío del todo de mí mismo, así que cuanto menos, mejor.
Podman no tiene daemon. Corrés podman run y el container es simplemente un proceso. Es un modelo que me gusta.
Si estás en Fedora o cualquier distro basada en RHEL, Podman ya está instalado. Si no, instalalo desde el source o el repo de tu distro. Si ya usás Docker, Podman va a funcionar igual, misma sintaxis, registries e images funcionan igual.
Incluso podés hacer un alias de docker a podman:
alias docker=podman
Quadlets Vs Compose
Para correr una app completa con múltiples servicios tenés: podman-compose (o docker-compose) o Quadlets.
podman-compose
La mayoría de las guías y tutoriales te muestran cómo correr stacks con docker-compose y podman-compose funciona igual.
Esto está bien. El problema es que hay algunas “features” que pueden no funcionar tan bien en podman-compose y algo podría romperse en silencio. Además, cada vez que querés reinicios automáticos, hooks de actualización o persistencia al arrancar, estás añadiendo cosas encima. Todas las guías de “cómo hago para que esto corra al reiniciar” en el mundo Docker son básicamente pegar compose a systemd con cinta de embalar. Una porquería.
Quadlets
Los Quadlets son una forma de correr containers de Podman con integración nativa de systemd. Solo tenés que escribir un archivo .container y recargar el daemon de systemd para correr el container como un servicio de systemd. De forma nativa.
Lo único malo es que cada “componente” (container, network, volume) necesita su propio archivo, así que los stacks con múltiples servicios se vuelven verbosos y engorrosos. También hay muchas menos guías para esto en comparación con compose, lo cual es molesto. Pero es una configuración de una sola vez y nunca más tenés que pensar en ello.
Para usar Quadlets, creá un archivo .container en ~/.config/containers/systemd/ (para containers rootless):
[Container]
Image=localhost/myapp:latest
PublishPort=3000:3000
Environment=NODE_ENV=production
[Service]
Restart=always
[Install]
WantedBy=default.target
Luego recargá el daemon de systemd para implementar los cambios:
systemctl --user daemon-reload
systemctl --user enable --now myapp
Ahora tu app arranca al inicio, se reinicia cuando falla, y los logs van al journal (incluso podés configurarlo para que descargue actualizaciones automáticamente de un container registry):
journalctl --user -u myapp -f
De nuevo, lo que me encanta de Quadlet es que el “dolor” (tampoco es tanto) lo tenés solo en la configuración inicial y después te olvidás.
Exponiendo Tu App Con Caddy
Si usás Caddy como reverse proxy (lo cual recomiendo), no necesitás nada especial. El container expone un puerto, Caddy lo proxea, todo normal:
myapp.yourdomain.com {
reverse_proxy localhost:3000
}
Una cosa: los containers rootless no pueden vincularse a puertos por debajo de 1024. Exponé algo en los 3000 y dejá que Caddy se encargue del 80 y 443.
El Dolor Con SELinux
Si estás usando SELinux, puede que te aparezcan algunos errores al correr containers. De todas formas, mantenelo habilitado.
Volume Mounts: SELinux bloquea silenciosamente a los containers de leer directorios del host montados. Para solucionarlo, agregá :Z a tus volume mounts:
podman run -v ./data:/app/data:Z myapp
Rootless Permission Errors: Algunas images fueron creadas asumiendo que corren como root y tiran errores de permisos raros en modo rootless. Solucionalo con --userns=keep-id, que mapea tu UID al container para que los permisos de archivos coincidan:
podman run --userns=keep-id -v ./data:/app/data:Z myapp
¿Resumiendo?

Creá una app vibe-coded, corréla como container, construí la image, tirá un archivo Quadlet, habilitá el servicio “container”, apuntá Caddy al puerto, accedé a la app desde el puerto expuesto o el nombre DNS (si está configurado). Sin Docker daemon, sin procesos root, sin archivos compose.
Vengo corriendo todos mis proyectos personales de esta forma y una vez que el workflow está configurado se vuelve muy fácil de mantener, seguro, y los rollouts se vuelven super fáciles y rápidos. ¿Quizás haga más posts sobre Podman containers? ¿Quizás no?