listmonk requires Postgres ⩾ 12.
See the "Tutorials" section at the bottom for detailed guides.
./listmonk --new-config
to generate config.toml. Then, edit the file../listmonk --install
to install the tables in the Postgres DB../listmonk
and visit http://localhost:9000
.The latest image is available on DockerHub at listmonk/listmonk:latest
!!! note
Listmonk's docs and scripts use `docker compose`, which is compatible with the latest version of docker. If you installed docker and docker-compose from your Linux distribution, you probably have an older version and will need to use the `docker-compose` command instead, or you'll need to update docker manually. [More info](https://gist.github.com/MaximilianKohler/e5158fcfe6de80a9069926a67afcae11#docker-update).
Use the sample docker-compose.yml to run listmonk and Postgres DB with docker compose
as follows:
mkdir listmonk-demo && cd listmonk-demo
sh -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-demo.sh)"
wget -O docker-compose.yml https://raw.githubusercontent.com/knadh/listmonk/master/docker-compose.yml
docker compose up -d demo-db demo-app
!!! warning
The demo does not persist Postgres after the containers are removed. **DO NOT** use this demo setup in production.
This setup is recommended if you want to quickly setup listmonk
in production.
mkdir listmonk && cd listmonk
sh -c "$(curl -fsSL https://raw.githubusercontent.com/knadh/listmonk/master/install-prod.sh)"
The above shell script performs the following actions:
docker-compose.yml
and generates a config.toml
.listmonk
container.!!! note
It's recommended to examine the contents of the shell script, before running in your environment.
The following workflow is recommended to setup listmonk
manually using docker compose
. You are encouraged to customise the contents of docker-compose.yml
to your needs. The overall setup looks like:
docker compose up db
to run the Postgres DB.docker compose run --rm app ./listmonk --install
to setup the DB (or --upgrade
to upgrade an existing DB).config.toml.sample
to your directory and make the following changes:
app.address
=> 0.0.0.0:9000
(Port forwarding on Docker will work only if the app is advertising on all interfaces.)db.host
=> listmonk_db
(Container Name of the DB container)docker compose up app
and visit http://localhost:9000
.To mount a local config.toml
file, add the following section to docker-compose.yml
:
app:
<<: *app-defaults
depends_on:
- db
volumes:
- ./path/on/your/host/config.toml:/listmonk/config.toml
!!! note
Some common changes done inside `config.toml` for Docker based setups:
- Change `app.address` to `0.0.0.0:9000`.
- Change `db.host` to `listmonk_db`.
Here's a sample config.toml
you can use:
[app]
address = "0.0.0.0:9000"
admin_username = "listmonk"
admin_password = "listmonk"
# Database.
[db]
host = "listmonk_db"
port = 5432
user = "listmonk"
password = "listmonk"
database = "listmonk"
ssl_mode = "disable"
max_open = 25
max_idle = 25
max_lifetime = "300s"
Mount the local config.toml
inside the container at listmonk/config.toml
.
!!! tip
- See [configuring with environment variables](configuration.md) for variables like `app.admin_password` and `db.password`
- Ensure that both `app` and `db` containers are in running. If the containers are not running, restart them `docker compose restart app db`.
- Refer to [this tutorial](https://yasoob.me/posts/setting-up-listmonk-opensource-newsletter-mailing/) for setting up a production instance with Docker + Nginx + LetsEncrypt SSL.
!!! info
The example `docker-compose.yml` file works with Docker Engine 24.0.5+ and Docker Compose version v2.20.2+.
To change the port for listmonk:
docker ps | grep listmonk
.custom-port:9000
Eg: 3876:9000
. This will expose the port 3876 on your local network to the container's network interface on port 9000.<MACHINE_IP>:3876
. You can also run NGINX as a docker container within the listmonk's container (for that you need to add a service nginx
in the docker-compose.yml). If you do that, then proxy_pass will be set to http://app:9000
. Docker's network will resolve the DNS for app
and directly speak to port 9000 (which the app is exposing within its own network).
To compile the latest unreleased version (master
branch):
go
, nodejs
, and yarn
are installed on your system.git clone git@github.com:knadh/listmonk.git
cd listmonk && make dist
. This will generate the listmonk binary
.The master
branch with bleeding edge changes is periodically built and published as listmonk/listmonk:rc
on DockerHub. To run the latest pre-release version, replace all instances of listmonk/listmonk:latest
with listmonk/listmonk:rc
in the docker-compose.yml file and follow the Docker installation steps above. While it is generally safe to run release candidate versions, they may have issues that only get resolved in a general release.