![listmonk](https://user-images.githubusercontent.com/547147/89733021-43fbf700-da70-11ea-82e4-e98cb5010257.png) listmonk is a standalone, self-hosted, newsletter and mailing list manager. It is fast, feature-rich, and packed into a single binary. It uses a PostgreSQL database as its data store. [![listmonk-dashboard](https://user-images.githubusercontent.com/547147/89733057-87566580-da70-11ea-8160-855f6f046a55.png)](https://listmonk.app) Visit [listmonk.app](https://listmonk.app) ## Installation ### Docker The latest image is available on DockerHub at `listmonk/listmonk:latest`. Use the sample [docker-compose.yml](https://github.com/knadh/listmonk/blob/master/docker-compose.yml) to run listmonk and Postgres DB with docker-compose as follows: #### Demo ```bash mkdir listmonk-demo sh -c "$(curl -sSL https://raw.githubusercontent.com/knadh/listmonk/master/install-demo.sh)" ``` The demo does not persist Postgres after the containers are removed. DO NOT use this demo setup in production. #### Production - `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) - Run `docker-compose up app` and visit `http://localhost:9000`. More information on [docs](https://listmonk.app/docs). __________________ ### Binary #### prerequisites Debian: system user and PostgreSQL - install `sudo` - install PostgreSQL `apt install postgresql` - --create system user with config.toml data for the database: `adduser listmonkuser`-- - create the postgreSQL database, the user and grant permissions: `su - postgres` and then acces de PostgreSQL console `psql` ``` postgres=# CREATE DATABASE listmonkdatabase; postgres=# CREATE USER listmonkuser WITH PASSWORD 'listmonkpassword'; postgres=# GRANT ALL PRIVILEGES ON DATABASE listmonkdatabase TO listmonkuser; ``` #### download an prepare config file - `cd /var/www/` and make the directory `mkdir listmonk` - `cd listmonk` - Download the [latest release](https://github.com/knadh/listmonk/releases) and extract the listmonk binary. ``` wget https://github.com/knadh/listmonk/releases/download/v1.0.0/listmonk_1.0.0_linux_amd64.tar.gz wget https://github.com/knadh/listmonk/releases/download/v1.0.0/listmonk_1.0.0_checksums.txt sha256sum listmonk_1.0.0_linux_amd64.tar.gz cat listmonk_1.0.0_checksums.txt |grep linux ``` - change ownership of files `chown -R www-data:www-data /var/www/listmonk` - generate config file `sudo -u www-data ./listmonk --new-config` - edit the config file with the data we created previously and more options `vim /var/www/listmonk/confif.toml` #### reverse proxy - create the apache config to work behind a reverse proxy `/etc/apache2/sites-available/listmonk.doamain.tdl.conf` ``` ServerName listmonk.domain.tdl ServerSignature Off ErrorLog /var/log/apache2/listmonk.domain.tdl_error.log TransferLog /var/log/apache2/listmonk.domain.tdl_access.log LogLevel warn ProxyPreserveHost On ProxyPass "/" "http://127.0.0.1:9000/" ProxyPassReverse "/" "http://127.0.0.1:9000/" ``` - enable the proxy module `a2enmod proxy_http` enable the site `a2ensite listmonk.domain.tdl` and restart apache `systemctl reload apache2` #### proceed to install - `sudo -u www-data ./listmonk --install` to setup the Postgres DB (or `--upgrade` to upgrade an existing DB. Upgrades are idempotent and running them multiple times have no side effects). - Run `sudo -u www-data ./listmonk` and visit `http://listmonk.domain.tdl` #### after install, fine tunning oncen checked it works, stop the process. - move the files to where you like most, usually `/opt/listmonk/` or inside `/var/www/html/` - change ownership of the files to `www-data` or whatever user you have assigned the webserver `chown -R www-data:www-data listmonk` - run listmonk as a service, create `/etc/systemd/system/listmonk.service` with: ``` [Unit] Description=Listmonk domain.tdl server After=syslog.target network.target postgressql.target [Service] Type=simple # the user and group executing the service User=www-data Group=www-data # the directory where you have listmonk WorkingDirectory=/var/www/html/listmonk # the file to execute ExecStart=/var/www/html/listmonk/listmonk Restart=always RestartSec=10 [Install] WantedBy=multi-user.target ``` - enable the service `systemct enable listmonk.service` and restart the daemon `systemctl daemon-restart` or you can start just the service `systemctl start listmonk.service` #### fixing small dependencies - uploads fail: `mkdir /var/www/html/listmonk/uploads` and `chown -R www-data:www-data /var/www/html/listmonk` ___________________ ### Heroku Using the [Nginx buildpack](https://github.com/heroku/heroku-buildpack-nginx) can be used to deploy listmonk on Heroku and use Nginx as a proxy to setup basicauth. This one-click [Heroku deploy button](https://github.com/bumi/listmonk-heroku) provides an automated default deployment. [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/bumi/listmonk-heroku) Please note that [configuration options](https://listmonk.app/docs/configuration) must be set using [environment configuration variables](https://devcenter.heroku.com/articles/config-vars). ## Developers listmonk is a free and open source software licensed under AGPLv3. If you are interested in contributing, refer to the [developer setup](https://listmonk.app/docs/developer-setup). The backend is written in Go and the frontend is Vue with Buefy for UI. ## License listmonk is licensed under the AGPL v3 license.