Despliegue sencillo y listo para producción de Listmonk, un gestor de newsletters open-source potente y ligero.
Listmonk es una herramienta de email marketing autoalojada que permite:
- Gestión de suscriptores
- Campañas de correo
- Automatización básica
- API REST
🔗 Docs oficiales: https://listmonk.app/docs/installation/
🔗 Repo: https://github.com/knadh/listmonk
- Docker
- Docker Compose
- (Recomendado) dominio tipo DuckDNS o similar
listmonk/
├── docker-compose.yml
├── .env
└── uploads/
Este es un despliegue completo con PostgreSQL incluido:
# All LISTMONK_* env variables also support the LISTMONK_*_FILE pattern for loading secrets from files with Docker secrets and Podman
x-db-credentials: &db-credentials
POSTGRES_USER: &db-user listmonk
POSTGRES_PASSWORD: &db-password listmonk
POSTGRES_DB: &db-name listmonk
services:
app:
image: listmonk/listmonk:latest
container_name: listmonk_app
restart: unless-stopped
ports:
- "4000:9000"
networks:
- listmonk
hostname: letter.genbyte.duckdns.org
depends_on:
- db
command: [sh, -c, "./listmonk --install --idempotent --yes --config '' && ./listmonk --upgrade --yes --config '' && ./listmonk --config ''"]
environment:
LISTMONK_app__address: 0.0.0.0:9000
LISTMONK_db__user: *db-user
LISTMONK_db__password: *db-password
LISTMONK_db__database: *db-name
LISTMONK_db__host: db
LISTMONK_db__port: 5432
LISTMONK_db__ssl_mode: disable
LISTMONK_db__max_open: 25
LISTMONK_db__max_idle: 25
LISTMONK_db__max_lifetime: 300s
TZ: Etc/UTC
LISTMONK_ADMIN_USER: ${LISTMONK_ADMIN_USER:-}
LISTMONK_ADMIN_PASSWORD: ${LISTMONK_ADMIN_PASSWORD:-}
volumes:
- ./uploads:/listmonk/uploads:rw
db:
image: postgres:17-alpine
container_name: listmonk_db
restart: unless-stopped
ports:
- "127.0.0.1:5432:5432"
networks:
- listmonk
environment:
<<: *db-credentials
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk"]
interval: 10s
timeout: 5s
retries: 6
volumes:
- type: volume
source: listmonk-data
target: /var/lib/postgresql/data
networks:
listmonk:
volumes:
listmonk-data:Opcional pero recomendado:
LISTMONK_ADMIN_USER=admin
LISTMONK_ADMIN_PASSWORD=SuperPassword123!👉 Si no defines esto, se creará el usuario desde la web.
docker compose up -dVer logs:
docker compose logs -f- Local: http://localhost:4000
- Dominio: http://letter.genbyte.duckdns.org:4000
- Instala automáticamente la base de datos (
--install) - Ejecuta migraciones (
--upgrade) - Arranca la app sin config file (solo ENV)
- Persiste datos en volumen Docker
- Permite subida de archivos (uploads)
| Tipo | Ubicación |
|---|---|
| DB | volumen listmonk-data |
| Archivos | ./uploads |
docker compose pull
docker compose up -d✔️ Las migraciones se aplican automáticamente.
- Usar HTTPS (NGINX / Traefik + Let's Encrypt)
- Cambiar credenciales por defecto
- No exponer PostgreSQL públicamente
- Configurar backups del volumen
No arranca la app:
docker compose logs appProblemas con DB:
docker compose logs dbTendrás un sistema completo de newsletters funcionando en minutos, listo para escalar 🚀
Si vas a usar esto en serio:
- Añade reverse proxy
- Configura SMTP (Mailgun, SES, etc.)
- Automatiza backups
💡 Setup probado, simple y sin dolores de cabeza.