Publishing, checked 2026-09-07
listmonk: Docker configuration reference
Self-hosted newsletter and mailing list manager with a Postgres backend and a visual email builder.
At a glance
- Image:
listmonk/listmonk - Tags:
latest,v6.2.0,v6.2.0-amd64,v6.2.0-arm64v8,nightly - Licence: AGPL-3.0
- Source: https://github.com/knadh/listmonk
- Docs: https://listmonk.app/docs/
Ports
| Port | What listens | Source |
|---|---|---|
9000 | HTTP listener for the admin UI, the public subscriber pages and the API. Route the proxy here. | source for port 9000 |
Environment variables
| Variable | Required | What it does | Example | Source |
|---|---|---|---|---|
LISTMONK_app__address | No | Interface and port the app listens on inside the container. Mirrors the app.address key in config.toml. | 0.0.0.0:9000 | source for LISTMONK_app__address |
LISTMONK_db__host | Yes | Postgres host, one of the LISTMONK_db__* variables that together mirror the [db] section of config.toml. | db | source for LISTMONK_db__host |
LISTMONK_ADMIN_USER | No | If set together with LISTMONK_ADMIN_PASSWORD on the very first docker compose up, the super admin user is created automatically. Otherwise it is set up on first visit to the web UI. | admin | source for LISTMONK_ADMIN_USER |
LISTMONK_ADMIN_PASSWORD | No | Paired with LISTMONK_ADMIN_USER for first-run super admin creation. Has no effect after the admin account already exists. | a strong random password | source for LISTMONK_ADMIN_PASSWORD |
Volumes that must persist
| Path | What is in it | Source |
|---|---|---|
/var/lib/postgresql/data (db) | The entire dataset: subscribers, lists, campaigns and templates. The listmonk app container itself is stateless. | source for /var/lib/postgresql/data |
/listmonk/uploads | Optional local storage for the media library, only used once Admin, Settings, Media is pointed at this path instead of S3. | source for /listmonk/uploads |
Behind a reverse proxy
- Route the domain to container port 9000. No websocket upgrade is required. source for this reverse-proxy note
- The official compose command runs with --config '' so it reads only env vars. A mounted config.toml instead takes precedence over LISTMONK_* variables, a common cause of settings that seem ignored. source for this reverse-proxy note
- The compose file recommends setting hostname to the real FQDN, since it is used as a default in some generated URLs. source for this reverse-proxy note
What it needs alongside it
| Dependency | Why | Source |
|---|---|---|
| PostgreSQL | Required application database. The bundled compose file pairs listmonk with postgres:17-alpine. | source for PostgreSQL |
Release timeline
| Version | Date | Breaking | What changed | Source |
|---|---|---|---|---|
v6.2.0 | 2026-06-26 | No | Security fixes for campaign and list permission validation in multi-user environments, plus inline CID images and trusted redirect URLs. | source for release v6.2.0 |
v6.1.0 | 2026-03-29 | No | Security fixes for campaign and list permission validation, a new campaigns:send permission separate from campaigns:manage, and S3 media proxying. | source for release v6.1.0 |
v6.0.0 | 2026-01-02 | No | Major release adding TOTP two-factor authentication, a forgot-password flow, list archiving and CORS origin configuration. | source for release v6.0.0 |
v5.1.0 | 2025-09-09 | No | Security update for a CSRF issue, CVE-2025-58430, along with minor bug fixes. | source for release v5.1.0 |
v5.0.3 | 2025-07-06 | No | Fixed SMTP errors not being captured and displayed while sending test mails. | source for release v5.0.3 |
If it is not coming up
- ECONNREFUSED / ENOTFOUND / connection to server at "postgres" port 5432 failed
- Coolify volume data lost after redeploy / a new empty volume is created every deploy
- Backing Up Postgres on Coolify, Then Proving It
Read from the upstream documentation, repository and container registry by Keita Emsden on 2026-09-07. Every row links the page it came from. Upstream changes without telling anyone, so check the source link before you rely on a value.