{"id":13557746,"url":"https://github.com/maxking/docker-mailman","last_synced_at":"2025-05-16T02:06:28.723Z","repository":{"id":19270283,"uuid":"86519467","full_name":"maxking/docker-mailman","owner":"maxking","description":"Dockerfiles for the Mailman suite.","archived":false,"fork":false,"pushed_at":"2025-03-08T03:48:06.000Z","size":1223,"stargazers_count":241,"open_issues_count":24,"forks_count":108,"subscribers_count":18,"default_branch":"main","last_synced_at":"2025-04-08T12:09:06.791Z","etag":null,"topics":["containers","django","docker","exim","mailman","mailman-suite","mta","postfix"],"latest_commit_sha":null,"homepage":"https://asynchronous.in/docker-mailman/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxking.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-29T00:06:41.000Z","updated_at":"2025-03-08T03:47:44.000Z","dependencies_parsed_at":"2024-01-06T02:56:19.253Z","dependency_job_id":"7c01a7b0-4240-4fe1-af30-5b8e0260e4d0","html_url":"https://github.com/maxking/docker-mailman","commit_stats":{"total_commits":477,"total_committers":50,"mean_commits":9.54,"dds":"0.35220125786163525","last_synced_commit":"3486d4d21139a8e1776a89465d7fbb65841c3856"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxking%2Fdocker-mailman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxking%2Fdocker-mailman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxking%2Fdocker-mailman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxking%2Fdocker-mailman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxking","download_url":"https://codeload.github.com/maxking/docker-mailman/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254453645,"owners_count":22073616,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["containers","django","docker","exim","mailman","mailman-suite","mta","postfix"],"created_at":"2024-08-01T12:04:31.427Z","updated_at":"2025-05-16T02:06:28.693Z","avatar_url":"https://github.com/maxking.png","language":"Python","funding_links":[],"categories":["Python","docker"],"sub_categories":[],"readme":"---\npermalink: /\n---\n\n\n# GNU Mailman 3 Deployment with Docker\n\n\n\n[![CircleCI](https://circleci.com/gh/maxking/docker-mailman/tree/main.svg?style=svg)](https://circleci.com/gh/maxking/docker-mailman/tree/main)\n\nThis repository hosts code for two docker images `maxking/mailman-core` and\n`maxking/mailman-web` both of which are meant to deploy [GNU Mailman 3][1] in\na production environment.\n\n[Docker][2] is a container ecosystem which can run containers on several\nplatforms. It consists of a tool called [docker-compose][3] which can be used to\nrun multi-container applications. This repository consists of a\n[`docker-compose.yaml`][19] file which is a set of\nconfigurations that can be used to deploy the [Mailman 3 Suite][4].\n\nPlease see [release page](https://github.com/maxking/docker-mailman/releases)\nfor the releases and change log.\n\n## Release\n\n\nThe tags for the images are assumed to be release versions for images. This is\ngoing to be a somewhat common philosophy of distributing Container images where\nthe images with same tags are usually updated with the new functionality.\n\nReleases will follow the following rules:\n\n* Images tagged like A.B.C will never change. If you want to pin down versions\n  of Images, use these tags.\n\n* Images tagged with A.B will correspond to the latest A.B.C version\n  released. Releases in A.B series are supposed to be backwards compatible,\n  i.e., any existing installation should not break when upgrading between\n  subversions of A.B.C. So, if you want the latest updates and want to\n  frequently update your installation without having to change the version\n  numbers, you can use this.\n\n* Any changes in the minor version of Mailman components of the images will\n  cause a bump in the minor version, e.g., A.(B+1) can have one or more\n  updated Mailman components from A.B. Also, significant change in functionality,\n  that might change how Images work or how people interact with the containers\n  can also cause a bump in the minor version.\n\n* Major versions will change either when there are backwards incompatible\n  changes or when the releases reach a certain set milestone or when there are\n  bugfix releases for the internal components or both.\n\n\n## Container Registries\n\nThe container images are available from multiple container registries. Do specify an [explicit version tag](https://hub.docker.com/r/maxking/mailman-web/tags?page=1\u0026ordering=last_updated\u0026name=0.) (e.g. `0.4.5` , MAJOR.MINOR like `0.4` also works as floating tag pointing to latest patch version) as tag `latest` is **not** updated anymore.\n\n### Mailman Core\n\n- `ghcr.io/maxking/mailman-core`\n- `docker.io/maxking/mailman-core`\n\n### Mailman Web\n\n- `ghcr.io/maxking/mailman-web`\n- `docker.io/maxking/mailman-web`\n\n### Postorius\n\n- `ghcr.io/maxking/postorius`\n- `docker.io/maxking/postorius`\n\n## Rolling Releases\n\nRolling releases are made up of Mailman Components installed from [git\nsource](https://gitlab.com/mailman). **Note that these releases are made up of\nun-released software and should be assumed to be beta quality.**\n\nEvery commit is tested with Mailman's CI infrastructure and is included in\nrolling releases only if they have passed the complete test suite.\n\n```bash\n$ docker pull docker.io/maxking/mailman-web:rolling\n$ docker pull docker.io/maxking/mailman-core:rolling\n```\n\nRolling releases are built with every commit and also re-generated nightly. You\ncan inspect the images to get which commit it was built using:\n\n```bash\n$ docker inspect --format '{{json .Config.Labels }}' mailman-core | python -m json.tool\n{\n    \"version.git_commit\": \"45a4d7805b2b3d0e7c51679f59682d64ba02f05f\",\n}\n\n$ docker inspect --format '{{json .Config.Labels }}' mailman-web | python -m json.tool\n{\n    \"version.git_commit\": \"45a4d7805b2b3d0e7c51679f59682d64ba02f05f\",\n}\n\n```\n\n- `version.git_commit` : This is the commit hash of the Dockerfile in the\n  [Github repo](https://github.com/maxking/docker-mailman)\n\n## Dependencies\n\n- Docker\n- Docker-compose-plugin\n\nTo install these on Ubuntu/Debian:\n\n```\n$ sudo apt install docker.io docker-compose-plugin\n```\n\nFor other systems, you can read the official Docker documentation to install\n[Docker from here][5] and [docker compose from here][6].\n\n\n## Configuration\n\nMost of the common configuration is handled through environment variables in the\n`docker-compose.yaml`. However, there is need for some extra configuration that\ninteracts directly with the application. There are two configuration files on\nthe host that interact directly with Mailman's settings. These files exist on\nthe host running the containers and are imported at runtime in the containers.\n\n* `/opt/mailman/core/mailman-extra.cfg` : This is the configuration for Mailman\n  Core and anything that you add here will be added to Core's configuration. You\n  need to restart your mailman-core container for the changes in this file to\n  take effect.\n\n* `/opt/mailman/web/settings_local.py` : This is the Django configuration that\n  is imported by the [existing configuration][2]\n  provided by the mailman-web container. **This file is referred to as\n  `settings.py` in most of the Postorius and Django documentation.** To change\n  or override any settings in Django/Postorius, you need to create/edit this file.\n  A useful configuration for troubleshooting is `DEBUG = True`.\n\n[2]: https://github.com/maxking/docker-mailman/blob/master/web/mailman-web/settings.py\n\nAlso, note that if you need any other files to be accessible from the host to\ninside the container, you can place them at certain directories which are\nmounted inside the containers.\n\n\n* `/opt/mailman/core` in host maps to `/opt/mailman/` in mailman-core container.\n* `/opt/mailman/web` in host maps to `/opt/mailman-web-data` in mailman-web\n   container.\n\n### Mailman-web\nThese are the settings that you MUST change in your docker-compose.yaml before deploying:\n\n- `SERVE_FROM_DOMAIN`: The domain name from which Django will be served. To be\n  added to `ALLOWED_HOSTS` in django settings. Default value is not set. This\n  also replaces Django's default `example.com` SITE and becomes the default SITE\n  (with SITE_ID=1).\n\n- `HYPERKITTY_API_KEY`: Hyperkitty's API Key, should be set to the same value\n  as set for the mailman-core. (Not needed in case of Postorius-only version.)\n\n- `MAILMAN_ADMIN_USER`: The username for the admin user to be created by default.\n\n- `MAILMAN_ADMIN_EMAIL`: The email for the admin user to be created by default.\n\n- `SECRET_KEY`: Django's secret key, mainly used for signing cookies and others.\n\nPlease note here that if you choose to create the admin user using the\nenvironment variables mentioned above (`MAILMAN_ADMIN_USER` \u0026\n`MAILMAN_ADMIN_EMAIL`), no password is set for your admin account. To set a\npassword, plese follow the \"Forgot Password\" link on the \"Sign In\" page.\n\nMailman web is already configured to send emails through `$SMTP_HOST` as the\nMTA's address. If you want to modify it, you can set the value in under\ndocker-compose.yaml for mailman-web container. By default, `SMTP_HOST` points\nto the gateway of the web container, which is the host itself.\n\nYou can also use the environment variables `SMTP_HOST` (defaults to\nthe container's gateway), `SMTP_PORT` (defaults to `25`), `SMTP_HOST_USER` (defaults to\nan empty string), `SMTP_HOST_PASSWORD` (defaults to an empty string),\n`SMTP_USE_TLS` (defaults to `False`) and `SMTP_USE_SSL` (defaults to `False`).\n\nThis is required in addition to the [Setup your MTA](#setting-up-your-mta)\nsection below, which covers email setup for Mailman Core.\n\nFor more details on how to configure this image, please look at\n[Mailman-web's Readme](web/)\n\n### Mailman-Core\n\nThese are the variables that you MUST change in your docker-compose.yaml before deploying:\n\n- `HYPERKITTY_API_KEY`: Hyperkitty's API Key, should be set to the same value as\n  set for the mailman-web. Skip the variable in case of non-Hyperkitty deployment.\n\n- `DATABASE_URL`: URL of the type\n  `driver://user:password@hostname:port/databasename` for the django to use. If\n  not set, the default is set to\n  `sqlite:///opt/mailman-web-data/mailmanweb.db`. The standard\n  docker-compose.yaml comes with it set to a postgres database. There is no need\n  to change this if you are happy with PostgreSQL.\n\n- `DATABASE_TYPE`: Its value can be one of `sqlite`, `postgres` or `mysql` as\n  these are the only three database types that Mailman 3 supports. Its default\n  value is set to `sqlite` along with the default database class and default\n  database url above.\n\n- `DATABASE_CLASS`: Default value is\n  `mailman.database.sqlite.SQLiteDatabase`. The values for this can be found in\n  the mailman's documentation [here][11].\n- `SMTP_HOST`\t: outgoing host for SMTP connections\n- `SMTP_PORT`\t: use this port. 25, 587, whatever your host asks for.\n- `SMTP_HOST_USER`: authenticate this user\n- `SMTP_HOST_PASSWORD`: and use this password\n- `SMTP_SECURE_MODE`: security mode for smtp connection - can be `smtp` (no encryption), `smtps` or `starttls`\n- `SMTP_VERIFY_HOSTNAME`: defaults to `true` - verify, that certificate hostname is identical to `SMTP_HOST`\n- `SMTP_VERIFY_CERT`: defaults to `true` - verify, that certificate is valid\n\nFor more details on how to configure this image, please look [Mailman-core's\nReadme](core/)\n\n\nWhile the above configuration will allow you to run the images and possibly view\nthe Web Frontend, it won't be functional until it is fully configured to to send\nemails.\n\nTo configure the mailman-core container to send emails, see the [Setting your MTA\nsection below](#setting-up-your-mta).\n\n## Running\n\nTo run the containers, simply run:\n\n```bash\n$ mkdir -p /opt/mailman/core\n$ mkdir -p /opt/mailman/web\n$ git clone https://github.com/maxking/docker-mailman\n$ cd docker-mailman\n# Change some configuration variables as mentioned above.\n$ docker compose up -d\n```\n\nNote that the web frontend in the mailman-web container is, by default, only\nconfigured to serve dynamic content. Anything static like stylesheets, etc., is\nexpected to be served directly by the web server. The static content exists at\n`/opt/mailman/web/static` and should be _aliased_ to `/static/` in the web\nserver configuration.\n\nSee [the nginx configuration][17] as an example.\n\nThis command will do several things, most importantly:\n\n- Run a wsgi server using [`uwsgi`][7] for the Mailman's Django-based web\n  frontend listening on port 8000. It will run 2 worker\n  processes with 4 threads each. You may want to change the setting\n  `ALLOWED_HOSTS` in the settings before deploying the application in\n  production.\n\n- Run a PostgreSQL server with a default database, username, and password as\n  mentioned in the `docker-compose.yaml`. You will have to change configuration\n  files too if you change any of these.\n\n- Run mailman-core listening on port 8001 for REST API and port 8024 (LMTP\n  server) for messages from your MTA. You will have to configure your MTA to\n  send messages at this address.\n\nSome more details about what the above system achieves is mentioned below. If you\nare only going to deploy a simple configuration, you don't need to read\nthis. However, these are very easy to understand if you know how docker works.\n\n- First create a bridge network called `mailman` in the\n  `docker-compose.yaml`. It will probably be named something else in your\n  machine. All the containers\n  mentioned (mailman-core, mailman-web, database) will join this network and are\n  assigned static IPs. The host operating system is the default gateway\n  from within these containers.\n\n- Spin off a mailman-core container attached to the mailman bridge network created above. It has\n  GNU Mailman 3 core running inside it. Mailman core's REST API is available at\n  port 8001 and LMTP server listens at port 8024.\n\n- Spin off a mailman-web container which has a Django application running with\n  both Mailman's web frontend Postorius and Mailman's web-based Archiver\n  running. [Uwsgi][7] server is used to run a web server with the configuration\n  provided in this repository [here][2]. You may want to\n  change the setting `ALLOWED_HOSTS` in the settings before deploying the\n  application in production. You can do that by adding a\n  `/opt/mailman/web/settings_local.py` which is imported by the Django when\n  running.\n\n- Spin off a PostgreSQL database container which is used by both mailman-core\n  and mailman-web as their primary database.\n\n- mailman-core mounts `/opt/mailman/core` from host OS at `/opt/mailman` in the\n  container. Mailman's var directory is stored there so that it is accessible\n  from the host operating system. Configuration for Mailman core is generated on\n  every run from the environment variables provided. Extra configuration can\n  also be provided at `/opt/mailman/core/mailman-extra.cfg` (on host), and will\n  be added to generated configuration file. Mailman also needs another\n  configuration file called\n  [mailman-hyperkitty.cfg][3] and is also\n  expected to be at `/opt/mailman/core/` on the host OS.\n\n[3]: https://github.com/maxking/docker-mailman/blob/master/core/assets/mailman-hyperkitty.cfg\n\n- mailman-web mounts `/opt/mailman/web` from the host OS to\n  `/opt/mailman-web-data` in the container. It consists of the logs and\n  settings_local.py file for Django.\n\n- database mounts `/opt/mailman/database` at `/var/lib/postgresql/data` so that\n  PostgreSQL can persist its data even if the database containers are\n  updated/changed/removed.\n\n## Setting up your MTA\n\nThe provided docker containers do not have an MTA in-built. You can either run\nyour own MTA inside a container and have them relay emails to the mailman-core\ncontainer or just install an MTA on the host and have them relay emails.\n\n### Exim4\n\nTo use [Exim4][8], it should be setup to relay emails from mailman-core and\nmailman-web. The mailman specific configuration is provided in the\nrepository at `core/assets/exim`. There are three files\n\n- [25_mm3_macros](core/assets/exim/25_mm3_macros) to be placed at\n  `/etc/exim4/conf.d/main/25_mm3_macros` in a typical Debian install of\n  exim4. Please change MY_DOMAIN_NAME to the domain name that will be used to\n  serve mailman. Multi-domain setups will be added later.\n\n- [455_mm3_router](core/assets/exim/455_mm3_router) to be placed at\n  `/etc/exim4/conf.d/router/455_mm3_router` in a typical Debian install of exim4.\n\n- [55_mm3_transport](core/assets/exim/55_mm3_transport) to be placed at\n  `/etc/exim4/conf.d/transport/55_mm3_transport` in a typical Debian install of exim4.\n\n\nAlso, the default configuration inside the mailman-core image has the MTA set\nto Exim, but just for reference, it looks like this:\n\n```\n# mailman.cfg\n[mta]\nincoming: mailman.mta.exim4.LMTP\noutgoing: mailman.mta.deliver.deliver\nlmtp_host: $MM_HOSTNAME\nlmtp_port: 8024\nsmtp_host: $SMTP_HOST\nsmtp_port: $SMTP_PORT\nconfiguration: python:mailman.config.exim4\n```\n\n### Postfix\n\nTo use [Postfix][12], edit the `main.cf` configuration file, which is typically\nat `/etc/postfix/main.cf` on Debian-based operating systems.  Add\nmailman-core and mailman-web to `mynetworks` so it will relay emails from\nthe containers and add the following configuration lines:\n\n```\n# main.cf\n\n# Support the default VERP delimiter.\nrecipient_delimiter = +\nunknown_local_recipient_reject_code = 550\nowner_request_special = no\n\ntransport_maps =\n    regexp:/opt/mailman/core/var/data/postfix_lmtp\nlocal_recipient_maps =\n    regexp:/opt/mailman/core/var/data/postfix_lmtp\nrelay_domains =\n    regexp:/opt/mailman/core/var/data/postfix_domains\n```\n\nTo configure Mailman to use Postfix, add `MTA=postfix` under mailman-core's\nenvironment section in the `docker-compose.yaml`:\n\n```\n  mailman-core:\n    \u003csnip\u003e\n    environment:\n    - MTA=postfix\n```\n\nThis will auto-generate the configuration to talk to Postfix assuming that\nPostfix is available at the gateway address for the container's bridge network\nat port 25. The final configuration can be found by executing:\n\n```\n$ docker exec mailman-core cat /etc/mailman.cfg\n```\n\nThe postfix configuration that is generated looks like this:\n```\n[mta]\nincoming: mailman.mta.postfix.LMTP\noutgoing: mailman.mta.deliver.deliver\nlmtp_host: $MM_HOSTNAME\nlmtp_port: 8024\nsmtp_host: $SMTP_HOST\nsmtp_port: $SMTP_PORT\nconfiguration: /etc/postfix-mailman.cfg\n```\n\nSo, if you need to update the values, you can set `SMTP_HOST`, `SMTP_PORT`,\n`MM_HOSTNAME` environment variables in `mailman-core` container.\n\nPlease verify the output for `[mta]` section to ensure that it points to\nthe right `smtp_host` (address to reach postfix from mailman-core container)\nand `lmtp_host` (address to reach mailman-core container from postfix).\n\nThe configuration file `/etc/postfix-mailman.cfg` is also generated automatically\ninside the `mailman-core` container and contains the configuration specific\nfor Postfix.\n\n## Site Owner\n\nSetup site owner address. By default, mailman is setup with the site_owner set to 'changeme@example.com'. This should be pointing to a valid mailbox. Add the following to the '/opt/mailman/core/mailman-extra.cfg'.\n\n```\n[mailman]\n# This address is the \"site owner\" address.  Certain messages which must be\n# delivered to a human, but which can't be delivered to a list owner (e.g. a\n# bounce from a list owner), will be sent to this address.  It should point to\n# a human.\nsite_owner: changeme@example.com\n```\n\n## Setting up search indexing\n\nHyperkitty in mailman-web image support full-text indexing. The current default\nindexing engine is [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html)\nfor historical reasons. It is highly recommended that you instead use Xapian for\nproduction use cases. The default will change when the next major version bump\nhappens.\n\nTo configure your Mailman-web container to use Xapian, add the following to your\n`settings_local.py`:\n\n```python\nHAYSTACK_CONNECTIONS = {\n    'default': {\n        'ENGINE': 'xapian_backend.XapianEngine',\n        'PATH': \"/opt/mailman-web-data/fulltext_index\",\n    },\n}\n```\n\nIf you have been using the default search indexing engine, you might have to\nre-index emails using the following command:\n\n```bash\n$ docker compose exec mailman-web ./manage.py rebuild_index\n```\n\nThis command can take some time if you a lot of emails, so please be patient!\n\n## Setting up your web server\n\nIt is advisable to run your Django (interfaced through WSGI server) through an\n_actual_ webserver in production for better performance.\n\nIf you are using v0.1.0, the uwsgi server is configured to listen to requests at\nport `8000` using the `HTTP` protocol. Make sure that you preserve the `HOST`\nheader when you proxy the requests from your Web Server. In Nginx you can do\nthat by adding the following to your configuration:\n\n```\n    # Nginx configuration.\n    location /static {\n        alias /opt/mailman/web/static;\n        autoindex off;\n    }\n\n    location / {\n\t\t  proxy_pass http://127.0.0.1:8000;\n\t\t  include uwsgi_params;\n\t\t  uwsgi_read_timeout 300;\n\t\t  proxy_set_header Host $host;\n\t\t  proxy_set_header X-Forwarded-For $remote_addr;\n    }\n\n```\n\nMake sure you are using `proxy_pass` for the `HTTP` protocol.\n\n### uwsgi\n\n\nStarting from v0.1.1, the uwsgi server is configured to listen to requests at\nport `8000` with the http protocol and port `8080` for the uwsgi\nprotocol.\n\n**Please make sure that you are using port 8080 for uwsgi protocol.**\n\nIt is advised to use the uwsgi protocol as it has better performance. Both\nApache and Nginx have native support for the uwsgi protocol through plugins which\nare generally included in the distro packages.\n\nTo move to uwsgi protocol in the above nginx configuration use this\n\n```\n    # Nginx configuration.\n    location /static {\n        alias /opt/mailman/web/static;\n        autoindex off;\n    }\n\n    location / {\n\t\t  uwsgi_pass localhost:8080;\n\t\t  include uwsgi_params;\n\t\t  uwsgi_read_timeout 300;\n    }\n```\n\nPlease make sure that you are using v0.1.1 or greater if you use this configuration.\n\n\n### Serving static files\n\nUWSGI by default doesn't serve static files so, when running\n`mailman-web` using the provided `docker-compose.yaml` file, you won't see any\nCSS or JS files being served.\n\nTo enable serving of static files using UWSGI, add the following environment\nvariable to your `docker-compose.yaml` file under `mailman-web`:\n\n```\nUWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static\n```\n\nIt is recommended to use web-server to serve static files instead of UWSGI for\nbetter performance. You will have to add an alias rule in your web server to\nserve the static files. See [here][18] for instructions on how to configure your\nweb server. The STATIC_ROOT for you would be `/opt/mailman/web/static`.\n\n### SSL certificates\n\nSSL Certificates from Lets Encrypt need to be renewed every 90 days. You can\nsetup a cron job to do the job. I have this small shell script (certbot-renew.sh)\nthat you can put up in `/etc/cron.monthly` to get the job done.\n\n```\n#! /bin/bash\n\ncd /opt/letsencrypt/\n./certbot-auto --config /etc/letsencrypt/renewal/MY_DOMAIN_NAME.conf certonly\n\nif [ $? -ne 0 ]\n then\n        ERRORLOG=`tail /var/log/letsencrypt/letsencrypt.log`\n        echo -e \"The Let's Encrypt cert has not been renewed! \\n \\n\" \\\n                 $ERRORLOG\n else\n        nginx -s reload\nfi\n\nexit 0\n```\n\n**Please do not forget to make the script executable (`chmod +x certbot-renew.sh`).**\n\n## LICENSE\n\nThis repository is licensed under the MIT License. Please see the LICENSE file for\nmore details.\n\n[1]: http://list.org\n[2]: https://www.docker.com/\n[3]: https://docs.docker.com/compose/\n[4]: http://docs.mailman3.org/en/latest/\n[5]: https://docs.docker.com/engine/installation/\n[6]: https://docs.docker.com/compose/install/\n[7]: https://uwsgi-docs.readthedocs.io/en/latest/\n[8]: http://exim.org/\n[9]: https://letsencrypt.org/\n[10]: https://certbot.eff.org/\n[11]: https://mailman.readthedocs.io/en/latest/src/mailman/docs/database.html\n[12]: http://www.postfix.org/\n[13]: http://semver.org/\n[14]: https://docs.docker.com/engine/security/trust/content_trust/\n[15]: http://docs.mailman3.org/en/latest/config-web.html#setting-up-email\n[17]: https://docs.mailman3.org/en/latest/install/virtualenv.html#nginx-configuration\n[18]: http://docs.list.org/en/latest/pre-installation-guide.html#django-static-files\n[19]: https://github.com/maxking/docker-mailman/blob/master/docker-compose.yaml\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxking%2Fdocker-mailman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxking%2Fdocker-mailman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxking%2Fdocker-mailman/lists"}