Cannot Install Web UI
I'm trying to install the web UI for mailman3. I am getting the following failure. Can someone help? TIA.
(venv) mailman :~$ pip install mailman-web mailman-hyperkitty Collecting mailman-web Downloading mailman_web-0.0.9-py3-none-any.whl.metadata (3.2 kB) Collecting mailman-hyperkitty Downloading mailman-hyperkitty-1.2.1.tar.gz (22 kB) Preparing metadata (setup.py) ... done Collecting django<4.3,>=4.0 (from mailman-web) Downloading django-4.2.25-py3-none-any.whl.metadata (4.2 kB) Collecting hyperkitty (from mailman-web) Downloading hyperkitty-1.3.12-py3-none-any.whl.metadata (3.6 kB) Collecting postorius (from mailman-web) Downloading postorius-1.3.13-py3-none-any.whl.metadata (2.9 kB) Collecting whoosh (from mailman-web) Downloading Whoosh-2.7.4-py2.py3-none-any.whl.metadata (3.1 kB) Requirement already satisfied: mailman in ./venv/lib/python3.12/site-packages (from mailman-hyperkitty) (3.3.10) Requirement already satisfied: requests in ./venv/lib/python3.12/site-packages (from mailman-hyperkitty) (2.32.5) Requirement already satisfied: zope.interface in ./venv/lib/python3.12/site-packages (from mailman-hyperkitty) (8.0.1) Requirement already satisfied: asgiref<4,>=3.6.0 in ./venv/lib/python3.12/site-packages (from django<4.3,>=4.0->mailman- web) (3.10.0) Requirement already satisfied: sqlparse>=0.3.1 in ./venv/lib/python3.12/site-packages (from django<4.3,>=4.0->mailman-we b) (0.5.3) Collecting django-compressor>=1.3 (from hyperkitty->mailman-web) Downloading django_compressor-4.5.1-py2.py3-none-any.whl.metadata (5.0 kB) Collecting django-extensions>=1.3.7 (from hyperkitty->mailman-web) Downloading django_extensions-4.1-py3-none-any.whl.metadata (6.1 kB) Collecting django-gravatar2>=1.0.6 (from hyperkitty->mailman-web) Downloading django_gravatar2-1.4.5-py2.py3-none-any.whl.metadata (4.3 kB) Collecting django-haystack>=2.8.0 (from hyperkitty->mailman-web) Downloading django_haystack-3.3.0.tar.gz (467 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 467.3/467.3 kB 3.8 MB/s eta 0:00:00 Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Collecting django-q2>=1.0.0 (from hyperkitty->mailman-web) Downloading django_q2-1.8.0-py3-none-any.whl.metadata (9.5 kB) Collecting django_mailman3>=1.3.13 (from hyperkitty->mailman-web) Downloading django_mailman3-1.3.15-py3-none-any.whl.metadata (5.4 kB) Collecting djangorestframework>=3.0.0 (from hyperkitty->mailman-web) Downloading djangorestframework-3.16.1-py3-none-any.whl.metadata (11 kB) Requirement already satisfied: flufl.lock>=4.0 in ./venv/lib/python3.12/site-packages (from hyperkitty->mailman-web) (8. 2.0) Collecting mailmanclient>=3.3.3 (from hyperkitty->mailman-web) Downloading mailmanclient-3.3.5.tar.gz (89 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 89.6/89.6 kB 1.2 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Collecting mistune>=3.0 (from hyperkitty->mailman-web) Downloading mistune-3.1.4-py3-none-any.whl.metadata (1.8 kB) Collecting networkx>=2.0 (from hyperkitty->mailman-web) Downloading networkx-3.5-py3-none-any.whl.metadata (6.3 kB) Requirement already satisfied: python-dateutil>=2.0 in ./venv/lib/python3.12/site-packages (from hyperkitty->mailman-web ) (2.9.0.post0) Collecting robot-detection>=0.3 (from hyperkitty->mailman-web) Downloading robot-detection-0.4.tar.gz (6.4 kB) Preparing metadata (setup.py) ... done Requirement already satisfied: aiosmtpd>=1.4.3 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (1.4.6) Requirement already satisfied: alembic!=1.7.0,>=1.6.2 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hype rkitty) (1.17.0) Requirement already satisfied: atpublic in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (6.0.2 ) Requirement already satisfied: authheaders>=0.16 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitt y) (0.16.3) Requirement already satisfied: authres>=1.0.1 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (1.2.0) Requirement already satisfied: click>=8.0.0 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (8 .3.0) Requirement already satisfied: dnspython>=1.14.0 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitt y) (2.8.0) Requirement already satisfied: falcon>=3.1.3 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) ( 4.1.0) Requirement already satisfied: flufl.bounce>=4.0 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitt y) (4.0) Requirement already satisfied: flufl.i18n>=3.2 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (5.2.0) Requirement already satisfied: gunicorn in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (23.0. 0) Requirement already satisfied: lazr.config in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (3. 1) Requirement already satisfied: passlib in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (1.7.4) Requirement already satisfied: sqlalchemy>=1.4.0 in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitt y) (2.0.44) Requirement already satisfied: zope.component in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (7.0) Requirement already satisfied: zope.configuration in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkit ty) (7.0) Requirement already satisfied: zope.event in ./venv/lib/python3.12/site-packages (from mailman->mailman-hyperkitty) (6.0 ) Collecting readme_renderer[md] (from postorius->mailman-web) Downloading readme_renderer-44.0-py3-none-any.whl.metadata (2.8 kB) Requirement already satisfied: charset_normalizer<4,>=2 in ./venv/lib/python3.12/site-packages (from requests->mailman-h yperkitty) (3.4.4) Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.12/site-packages (from requests->mailman-hyperkitty) ( 3.11) Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.12/site-packages (from requests->mailman-hyperki tty) (2.5.0) Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.12/site-packages (from requests->mailman-hyperki tty) (2025.10.5) Requirement already satisfied: attrs in ./venv/lib/python3.12/site-packages (from aiosmtpd>=1.4.3->mailman->mailman-hype rkitty) (25.4.0) Requirement already satisfied: Mako in ./venv/lib/python3.12/site-packages (from alembic!=1.7.0,>=1.6.2->mailman->mailma n-hyperkitty) (1.3.10) Requirement already satisfied: typing-extensions>=4.12 in ./venv/lib/python3.12/site-packages (from alembic!=1.7.0,>=1.6 .2->mailman->mailman-hyperkitty) (4.15.0) Requirement already satisfied: dkimpy>=0.7.1 in ./venv/lib/python3.12/site-packages (from authheaders>=0.16->mailman->ma ilman-hyperkitty) (1.1.8) Requirement already satisfied: publicsuffix2 in ./venv/lib/python3.12/site-packages (from authheaders>=0.16->mailman->ma ilman-hyperkitty) (2.20191221) Collecting django-appconf>=1.0.3 (from django-compressor>=1.3->hyperkitty->mailman-web) Downloading django_appconf-1.1.0-py3-none-any.whl.metadata (5.2 kB) Collecting rcssmin==1.1.2 (from django-compressor>=1.3->hyperkitty->mailman-web) Downloading rcssmin-1.1.2-cp312-cp312-manylinux1_x86_64.whl.metadata (4.5 kB) Collecting rjsmin==1.2.2 (from django-compressor>=1.3->hyperkitty->mailman-web) Downloading rjsmin-1.2.2-cp312-cp312-manylinux1_x86_64.whl.metadata (4.4 kB) Requirement already satisfied: packaging in ./venv/lib/python3.12/site-packages (from django-haystack>=2.8.0->hyperkitty ->mailman-web) (25.0) Collecting django-allauth>=0.63 (from django-allauth[openid,socialaccount]>=0.63->django_mailman3>=1.3.13->hyperkitty->m ailman-web) Downloading django_allauth-65.12.1.tar.gz (2.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 7.1 MB/s eta 0:00:00 Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Collecting django-picklefield<4.0,>=3.1 (from django-q2>=1.0.0->hyperkitty->mailman-web) Downloading django_picklefield-3.3-py3-none-any.whl.metadata (12 kB) Requirement already satisfied: psutil in ./venv/lib/python3.12/site-packages (from flufl.lock>=4.0->hyperkitty->mailman- web) (7.1.0) Requirement already satisfied: six>=1.5 in ./venv/lib/python3.12/site-packages (from python-dateutil>=2.0->hyperkitty->m ailman-web) (1.17.0) Requirement already satisfied: greenlet>=1 in ./venv/lib/python3.12/site-packages (from sqlalchemy>=1.4.0->mailman->mail man-hyperkitty) (3.2.4) Requirement already satisfied: setuptools in ./venv/lib/python3.12/site-packages (from lazr.config->mailman->mailman-hyp erkitty) (80.9.0) Requirement already satisfied: lazr.delegates in ./venv/lib/python3.12/site-packages (from lazr.config->mailman->mailman -hyperkitty) (2.1.1) Collecting nh3>=0.2.14 (from readme_renderer[md]->postorius->mailman-web) Downloading nh3-0.3.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (466 bytes) Collecting docutils>=0.21.2 (from readme_renderer[md]->postorius->mailman-web) Downloading docutils-0.22.2-py3-none-any.whl.metadata (15 kB) Collecting Pygments>=2.5.1 (from readme_renderer[md]->postorius->mailman-web) Downloading pygments-2.19.2-py3-none-any.whl.metadata (2.5 kB) Collecting cmarkgfm>=0.8.0 (from readme_renderer[md]->postorius->mailman-web) Downloading cmarkgfm-2025.10.20.tar.gz (145 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 145.8/145.8 kB 2.2 MB/s eta 0:00:00 Installing build dependencies ... done Getting requirements to build wheel ... error error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> [41 lines of output] Traceback (most recent call last): File "/opt/mailman/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", li ne 353, in <module> main() File "/opt/mailman/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", li ne 335, in main json_out['return_val'] = hook(**hook_input['kwargs']) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/mailman/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", li ne 118, in get_requires_for_build_wheel return hook(config_settings) ^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", line 331, in g et_requires_for_build_wheel return self._get_build_requires(config_settings, requirements=[]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", line 301, in _ get_build_requires self.run_setup() File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", line 317, in r un_setup exec(code, locals()) File "<string>", line 5, in <module> File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/__init__.py", line 115, in set up return distutils.core.setup(**attrs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 148, in setup _setup_distribution = dist = klass(attrs) ^^^^^^^^^^^^ File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/dist.py", line 321, in __init_ _ _Distribution.__init__(self, dist_attrs) File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 309, in __init__ self.finalize_options() File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/dist.py", line 784, in finaliz e_options ep(self) File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/setuptools/dist.py", line 804, in _finali ze_setup_keywords ep.load()(self, ep.name, value) File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/cffi/setuptools_ext.py", line 229, in cff i_modules add_cffi_module(dist, cffi_module) File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/cffi/setuptools_ext.py", line 50, in add_ cffi_module execfile(build_file_name, mod_vars) File "/tmp/pip-build-env-uf_5f2aq/overlay/lib/python3.12/site-packages/cffi/setuptools_ext.py", line 26, in exec file exec(code, glob, glob) File "src/cmarkgfm/build_cmark.py", line 21, in <module> with open(CMARK_DEF_H_PATH, encoding='utf-8') as fh: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [Errno 2] No such file or directory: '/tmp/pip-install-y364_cvm/cmarkgfm_9fcba25730114ac4a08d1e 7733112a45/src/cmarkgfm/cmark.cffi.h' [end of output]
note: This error originates from a subprocess, and is likely not a problem with pip. error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
On 10/20/25 10:32, Dennis Putnam via Mailman-users wrote:
I'm trying to install the web UI for mailman3. I am getting the following failure. Can someone help? TIA.
(venv) mailman :~$ pip install mailman-web mailman-hyperkitty ... FileNotFoundError: [Errno 2] No such file or directory: '/tmp/pip-install-y364_cvm/cmarkgfm_9fcba25730114ac4a08d1e 7733112a45/src/cmarkgfm/cmark.cffi.h' [end of output]
note: This error originates from a subprocess, and is likely not a problem with pip. error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
I think I've seen a similar error, but I don't recall what I did to work around it. In this case cmarkgfm is a dependency of readme_renderer which in turn is a dependency of postorius. In your venv try
pip install cmarkgfm
first and then
pip install mailman-web mailman-hyperkitty
That may avoid this.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
On Montag, 20. Oktober 2025 19:56:39 CEST Mark Sapiro wrote:
On 10/20/25 10:32, Dennis Putnam via Mailman-users wrote:
I'm trying to install the web UI for mailman3. I am getting the following failure. Can someone help? TIA.
(venv) mailman :~$ pip install mailman-web mailman-hyperkitty
...
FileNotFoundError: [Errno 2] No such file or directory:'/tmp/pip-install-y364_cvm/cmarkgfm_9fcba25730114ac4a08d1e 7733112a45/src/cmarkgfm/cmark.cffi.h'
[end of output]note: This error originates from a subprocess, and is likely not a
problem with pip. error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
I think I've seen a similar error, but I don't recall what I did to work around it. In this case cmarkgfm is a dependency of readme_renderer which in turn is a dependency of postorius. In your venv try
pip install cmarkgfm
first and then
pip install mailman-web mailman-hyperkitty
That may avoid this.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
It seems to me cmarkgfm is broken today. I tried to update it in my working environment and get the same error:
(venv) mailman@lists:~> pip install -U cmarkgfm Requirement already satisfied: cmarkgfm in ./venv/lib64/python3.11/site- packages (2024.11.20) Collecting cmarkgfm Using cached cmarkgfm-2025.10.20.tar.gz (145 kB) Installing build dependencies ... done Getting requirements to build wheel ... error error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> [41 lines of output] Traceback (most recent call last): File "/opt/mailman/venv/lib64/python3.11/site-packages/pip/_vendor/ pyproject_hooks/_in_process/_in_process.py", line 389, in <module> main() File "/opt/mailman/venv/lib64/python3.11/site-packages/pip/_vendor/ pyproject_hooks/_in_process/_in_process.py", line 373, in main json_out["return_val"] = hook(**hook_input["kwargs"]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/mailman/venv/lib64/python3.11/site-packages/pip/_vendor/ pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel return hook(config_settings) ^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/build_meta.py", line 331, in get_requires_for_build_wheel return self._get_build_requires(config_settings, requirements=[]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/build_meta.py", line 301, in _get_build_requires self.run_setup() File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/build_meta.py", line 317, in run_setup exec(code, locals()) File "<string>", line 5, in <module> File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/__init__.py", line 115, in setup return distutils.core.setup(**attrs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/_distutils/core.py", line 148, in setup _setup_distribution = dist = klass(attrs) ^^^^^^^^^^^^ File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/dist.py", line 321, in __init__ _Distribution.__init__(self, dist_attrs) File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/_distutils/dist.py", line 309, in __init__ self.finalize_options() File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/dist.py", line 784, in finalize_options ep(self) File "/tmp/pip-build-env-mdd_0nfr/overlay/lib/python3.11/site- packages/setuptools/dist.py", line 804, in _finalize_setup_keywords ep.load()(self, ep.name, value) File "/tmp/pip-build-env-mdd_0nfr/overlay/lib64/python3.11/site- packages/cffi/setuptools_ext.py", line 229, in cffi_modules add_cffi_module(dist, cffi_module) File "/tmp/pip-build-env-mdd_0nfr/overlay/lib64/python3.11/site- packages/cffi/setuptools_ext.py", line 50, in add_cffi_module execfile(build_file_name, mod_vars) File "/tmp/pip-build-env-mdd_0nfr/overlay/lib64/python3.11/site- packages/cffi/setuptools_ext.py", line 26, in execfile exec(code, glob, glob) File "src/cmarkgfm/build_cmark.py", line 21, in <module> with open(CMARK_DEF_H_PATH, encoding='utf-8') as fh: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [Errno 2] No such file or directory: '/tmp/pip- install-8e12fhsc/cmarkgfm_dbeb0911a2014cbe9bb4b5b09ee7602f/src/cmarkgfm/ cmark.cffi.h' [end of output]
note: This error originates from a subprocess, and is likely not a problem with pip. error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
-- Mit freundlichen Gruessen, Andreas Vetter
Andreas Vetter writes:
It seems to me cmarkgfm is broken today. I tried to update it in my working environment and get the same error:
(venv) mailman@lists:~> pip install -U cmarkgfm Requirement already satisfied: cmarkgfm in ./venv/lib64/python3.11/site- packages (2024.11.20) Collecting cmarkgfm Using cached cmarkgfm-2025.10.20.tar.gz (145 kB) Installing build dependencies ... done Getting requirements to build wheel ... error error: subprocess-exited-with-error
Thanks for the report, Andreas. That's very helpful. I'm assuming your "cached cmarkgfm-2025.10.20.tar.gz" was installed into a working Mailman system (specifically mailman-web). No confirmation needed, only if I'm mistaken.
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
This is a real struggle, at least on Ubuntu. After figuring out the how and where for setting.py here are some things that I had to do that were undocumented, at least for MySQL.
<venv> pip install pymysql
In settings I had to add:
import pymysql pymysql.install_as_MySQLdb()
I had to change (expected)"
'ENGINE': 'django.db.backends.mysql', 'PORT': '3306',
Now I'm struggling with uwsgi.ini. the default file uses mailman for user and group but the directories were created using www-data for group and user. I got that part fixed but now when I try to start mailmanweb, I get this error:
!!! UNABLE to load uWSGI plugin: ./python3_plugin.so: cannot open shared object file: No such file or directory
I suspect I need to specify the path in the ini file but I cannot find where those plugins are.
On 10/22/25 11:35, dap1--- via Mailman-users wrote:
Now I'm struggling with uwsgi.ini. the default file uses mailman for user and group but the directories were created using www-data for group and user. I got that part fixed but now when I try to start mailmanweb, I get this error:
!!! UNABLE to load uWSGI plugin: ./python3_plugin.so: cannot open shared object file: No such file or directory
https://askubuntu.com/questions/286699/uwsgi-with-python3-how-to-get-the-plu... may help.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
dap1--- via Mailman-users writes:
Now I'm struggling with uwsgi.ini.
If you need uwsgi, you need it, but gunicorn works fine even on sites with 20,000 lists and millions of posts per month if you don't.
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
Mark: That didn't help.
Steve: I don't know if I NEED uwsgi but that was the next item in the install documentation. I assume I need something for the web UI. I'll look at the documentation for gunicorn.
Thanks to you both.
OK, so gnuicorn is easier to install and set up. However, it has its own glitch not in the docs. I'm getting the following error trying to start web:
gunicorn[42860]: !!! !!! WARNING: configuration file should have a valid Python extension. gunicorn[42860]: !!! gunicorn[42860]: Error: Error: '/opt/mailman/mm/var/logs/error.log' isn't writable [PermissionErr>
The docs say to use conf but I think the error implies it should be py. In addition I'm guessing I have to change the log and access file names to something like gunicorn.error.log.
On 10/23/25 11:57, dap1--- via Mailman-users wrote:
OK, so gnuicorn is easier to install and set up. However, it has its own glitch not in the docs. I'm getting the following error trying to start web:
gunicorn[42860]: !!! !!! WARNING: configuration file should have a valid Python extension.
This is just a warning and can be ignored.
gunicorn[42860]: !!! gunicorn[42860]: Error: Error: '/opt/mailman/mm/var/logs/error.log' isn't writable [PermissionErr>
The docs say to use conf but I think the error implies it should be py. In addition I'm guessing I have to change the log and access file names to something like gunicorn.error.log.
The access.log and error.log names are correct. They should be owned by
mailman and your /etc/systemd/system/mailmanweb.service should include
User=mailman
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
dap1--- via Mailman-users writes:
Steve: I don't know if I NEED uwsgi but that was the next item in the install documentation.
We probably should change that to gunicorn. Most users are going to install uwsgi from distro packages, and that's likely to cause problems with ownership and filesystem structure.
The point of the virtual environment install is to make the Mailman suite as self-contained and independent of the OS as we can reasonably do, since they all do things a little bit differently.
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
I made all the suggested changes and now am down to the next layer of the onion when starting mailmanweb:
gunicorn[53945]: Traceback (most recent call last): gunicorn[53945]: File "/opt/mailman/venv/bin/gunicorn", line 5, in <module> gunicorn[53945]: from gunicorn.app.wsgiapp import run gunicorn[53945]: ModuleNotFoundError: No module named 'gunicorn.app'; 'gunicorn' is not a package
I hope all this gets added to the docs for the next poor sole that has to do this on Ubuntu. :-)
dap1--- via Mailman-users writes:
I made all the suggested changes and now am down to the next layer of the onion when starting mailmanweb:
You should have gunicorn installed in your Mailman virtual environment. Here's what that looks like for me (your "/opt/mailman3" may vary, your "/.v" almost certainly does, the part from /lib on down should be the same except maybe for the minor version of python3):
$ ls /opt/mailman3/.v/lib/python3.13/site-packages/gunicorn/ __init__.py app debug.py http reloader.py util.py __main__.py arbiter.py errors.py instrument sock.py workers __pycache__ config.py glogging.py pidfile.py systemd.py $
gunicorn[53945]: ModuleNotFoundError: No module named 'gunicorn.app'; 'gunicorn' is not a package
This error message appears to be saying that the file __init__.py is missing (that's how Python defines a folder to be a package). It's also possible that the gunicorn package is installed somewhere other than Mailman's virtual environment, and so missing entirely from Mailman's virtual environment.
I hope all this gets added to the docs for the next poor sole that has to do this on Ubuntu. :-)
I'm not really sure what to add, except to recommend gunicorn instead of uwsgi. uwsgi is a FAQ because it's usually installed as a system package, and so has different ideas where things go in the file system from Mailman. uwsgi is not a Python app so can't be installed automatically in the virtual environment. uwsgi issues come up several times a year.
gunicorn has traditionally been unproblematic because it's a requirement of Mailman core anyway. When we figure out why your installation doesn't seem to have gunicorn, maybe there will be something to say.
Steve
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
On 10/24/2025 12:40 PM, Stephen J. Turnbull wrote:
dap1--- via Mailman-users writes:
I made all the suggested changes and now am down to the next layer of the onion when starting mailmanweb:
You should have gunicorn installed in your Mailman virtual environment. Here's what that looks like for me (your "/opt/mailman3" may vary, your "/.v" almost certainly does, the part from /lib on down should be the same except maybe for the minor version of python3):
$ ls /opt/mailman3/.v/lib/python3.13/site-packages/gunicorn/ __init__.py app debug.py http reloader.py util.py __main__.py arbiter.py errors.py instrument sock.py workers __pycache__ config.py glogging.py pidfile.py systemd.py $ *I don't have /opt/mailman3, it is /opt/mailman:
$ ls /opt/mailman/venv/lib/python3.12/site-packages/gunicorn app debug.py http __main__.py reloader.py util.py arbiter.py errors.py __init__.py pidfile.py sock.py workers config.py glogging.py instrument __pycache__ systemd.py
Do I need to specify a path somewhere?
gunicorn[53945]: ModuleNotFoundError: No module named 'gunicorn.app'; 'gunicorn' is not a package
This error message appears to be saying that the file __init__.py is missing (that's how Python defines a folder to be a package). It's also possible that the gunicorn package is installed somewhere other than Mailman's virtual environment, and so missing entirely from Mailman's virtual environment.
I hope all this gets added to the docs for the next poor sole that has to do this on Ubuntu. :-)
I'm not really sure what to add, except to recommend gunicorn instead of uwsgi. uwsgi is a FAQ because it's usually installed as a system package, and so has different ideas where things go in the file system from Mailman. uwsgi is not a Python app so can't be installed automatically in the virtual environment. uwsgi issues come up several times a year.
*I think the main thing is the MySQL stuff in settings.py:
<venv> pip install pymysql
Add lines:
import pymysql pymysql.install_as_MySQLdb()
At least so far.*
gunicorn has traditionally been unproblematic because it's a requirement of Mailman core anyway. When we figure out why your installation doesn't seem to have gunicorn, maybe there will be something to say.
Steve
Mailman's content filtering has removed the following MIME parts from this message.
Replaced multipart/alternative part with first alternative.
On 10/24/25 10:19, Dennis Putnam via Mailman-users wrote:
Do I need to specify a path somewhere?
Sort of.
What is the shebang line in /opt/mailman/mm/venv/bin/gunicorn? It should be
#!/opt/mailman/mm/venv/bin/python
I.e., it should point to the Python in your venv.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
Dennis Putnam via Mailman-users writes:
$ ls /opt/mailman/venv/lib/python3.12/site-packages/gunicorn app� � � � �debug.py� � �http� � � � �__main__.py� reloader.py util.py arbiter.py� errors.py� � __init__.py� pidfile.py� �sock.py workers config.py� �glogging.py� instrument� �__pycache__� systemd.py
That looks OK. Are all the files readable by the mailman user?
Is it possible that mailman-web was installed somewhere other than that virtual environment?
Do I need to specify a path somewhere?
Not if you follow this procedure (note: assumes venv already exists and Mailman core was installed into the venv):
- cd /opt/mailman
- sudo su mailman # or somehow be the mailman user
- . venv/bin/activate
- python -m pip install mailmanweb # maybe that's mailman-web
The point of activating the venv is that the installation process will ensure that the Python installation in the venv is referenced by all packages installed in the venv.
You should ensure that all of the executable paths in the systemd mailman (or mailman3) and mailman-web unit files are absolute paths pointing into the venv.
*I think the main thing is the MySQL stuff in settings.py:
<venv> pip install pymysql
Add lines:
import pymysql pymysql.install_as_MySQLdb()
At least so far.*
Thank you! That's useful.
Steve
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
On 10/25/2025 2:54 AM, Stephen J. Turnbull wrote:
Dennis Putnam via Mailman-users writes:
$ ls /opt/mailman/venv/lib/python3.12/site-packages/gunicorn app debug.py http __main__.py reloader.py util.py arbiter.py errors.py __init__.py pidfile.py sock.py workers config.py glogging.py instrument __pycache__ systemd.py
That looks OK. Are all the files readable by the mailman user? *Yes*
Is it possible that mailman-web was installed somewhere other than that virtual environment? *Not that I can find.*
Do I need to specify a path somewhere?
Not if you follow this procedure (note: assumes venv already exists and Mailman core was installed into the venv):
- cd /opt/mailman
- sudo su mailman # or somehow be the mailman user
- . venv/bin/activate
- python -m pip install mailmanweb # maybe that's mailman-web *Yes, it is mailman-web. In any case everything is satisfied.*
The point of activating the venv is that the installation process will ensure that the Python installation in the venv is referenced by all packages installed in the venv.
You should ensure that all of the executable paths in the systemd mailman (or mailman3) and mailman-web unit files are absolute paths pointing into the venv. *This looks right to me but nothing points to /opt/mailman/venv/lib. Should there be a lib_dir parameter set in mailman.cfg?
[Unit] Description=GNU Mailing List Manager After=syslog.target network.target
[Service] Type=forking PIDFile=/opt/mailman/mm/var/master.pid User=mailman Group=mailman Environment="MAILMAN_CONFIG_FILE=/etc/mailman3/mailman.cfg" ExecStart=/opt/mailman/venv/bin/mailman start ExecReload=/opt/mailman/venv/bin/mailman restart ExecStop=/opt/mailman/venv/bin/mailman stop Restart=on-failure RestartSec=15
[Install] WantedBy=multi-user.target*
*I think the main thing is the MySQL stuff in settings.py:
<venv> pip install pymysql
Add lines:
import pymysql pymysql.install_as_MySQLdb()
At least so far.*
Thank you! That's useful.
Steve
Mailman's content filtering has removed the following MIME parts from this message.
Replaced multipart/alternative part with first alternative.
Dennis Putnam via Mailman-users writes:
On 10/25/2025 2:54 AM, Stephen J. Turnbull wrote:
That looks OK. Are all the files readable by the mailman user? *Yes*
Good.
Is it possible that mailman-web was installed somewhere other than that virtual environment? *Not that I can find.*
I thought it was very unlikely but ... stuff happens sometimes.
You should ensure that all of the executable paths in the systemd mailman (or mailman3) and mailman-web unit files are absolute paths pointing into the venv. *This looks right to me but nothing points to /opt/mailman/venv/lib. Should there be a lib_dir parameter set in mailman.cfg?
No. That's handled by the virtual environment.
Environment="MAILMAN_CONFIG_FILE=/etc/mailman3/mailman.cfg" ExecStart=/opt/mailman/venv/bin/mailman start ExecReload=/opt/mailman/venv/bin/mailman restart ExecStop=/opt/mailman/venv/bin/mailman stop
Those are the critical paths and all are consistent with how you have described your installation.
I really don't see anything here that explains the most recent problems. Maybe Mark does.
Steve
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
On 10/25/25 08:06, Dennis Putnam via Mailman-users wrote:
On 10/25/2025 2:54 AM, Stephen J. Turnbull wrote:
You should ensure that all of the executable paths in the systemd mailman (or mailman3) and mailman-web unit files are absolute paths pointing into the venv.
*This looks right to me but nothing points to /opt/mailman/venv/lib. Should there be a lib_dir parameter set in mailman.cfg?
[Unit] Description=GNU Mailing List Manager After=syslog.target network.target
[Service] Type=forking PIDFile=/opt/mailman/mm/var/master.pid User=mailman Group=mailman Environment="MAILMAN_CONFIG_FILE=/etc/mailman3/mailman.cfg" ExecStart=/opt/mailman/venv/bin/mailman start ExecReload=/opt/mailman/venv/bin/mailman restart ExecStop=/opt/mailman/venv/bin/mailman stop Restart=on-failure RestartSec=15
[Install] WantedBy=multi-user.target*
And what about mailmanweb.service? And did you check the shebang line in /opt/mailman/mm/venv/bin/gunicorn - see https://lists.mailman3.org/archives/list/mailman-users@mailman3.org/message/...
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
Sadly it is correct:
#!/opt/mailman/venv/bin/python3
$ ls -l /opt/mailman/venv/bin/python3 lrwxrwxrwx 1 mailman mailman 16 Oct 18 16:32 /opt/mailman/venv/bin/python3 -> /usr/bin/python3
On 10/26/25 08:31, dap1--- via Mailman-users wrote:
Sadly it is correct:
#!/opt/mailman/venv/bin/python3
$ ls -l /opt/mailman/venv/bin/python3 lrwxrwxrwx 1 mailman mailman 16 Oct 18 16:32 /opt/mailman/venv/bin/python3 -> /usr/bin/python3
Again, what is the content of /etc/systemd/system/mailmanweb.service?
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
Sorry, I thought I posted that:
[Unit] Description=GNU Mailman Web UI After=syslog.target network.target mailman3.service
[Service] Environment="PYTHONPATH=/etc/mailman3/" User=mailman Group=mailman ExecStart=/opt/mailman/venv/bin/gunicorn -c /etc/mailman3/gunicorn.py mailman_web.wsgi:application KillSignal=SIGINT
[Install] WantedBy=multi-user.target
Now that I look at it shouldn't PYTHONPATH=/opt/mailman/venv?
Tried that path and that seems to have fixed it.
● mailmanweb.service - GNU Mailman Web UI Loaded: loaded (/etc/systemd/system/mailmanweb.service; disabled; preset: enabled) Active: active (running) since Mon 2025-10-27 14:18:42 EDT; 25min ago Main PID: 107897 (gunicorn) Tasks: 4 (limit: 8814) Memory: 163.4M (peak: 163.9M) CPU: 4.060s CGroup: /system.slice/mailmanweb.service ├─107897 /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/gunicorn -c /etc/mailman3> ├─107898 /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/gunicorn -c /etc/mailman3> ├─107899 /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/gunicorn -c /etc/mailman3> └─107900 /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/gunicorn -c /etc/mailman3>
Oct 27 14:18:42 dap002 systemd[1]: Started mailmanweb.service - GNU Mailman Web UI. Oct 27 14:18:43 dap002 gunicorn[107900]: Updated PYTHONPATH to : /opt/mailman3/venv:/etc/mailman3 Oct 27 14:18:43 dap002 gunicorn[107899]: Updated PYTHONPATH to : /opt/mailman3/venv:/etc/mailman3 Oct 27 14:18:43 dap002 gunicorn[107898]: Updated PYTHONPATH to : /opt/mailman3/venv:/etc/mailman3
Now when I try to access it (http://localhost/mailman) I get a 404 error.
On 10/27/25 11:55, dap1--- via Mailman-users wrote:
Now when I try to access it (http://localhost/mailman) I get a 404 error.
The correct url is http://localhost/mailman3
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
dap1--- via Mailman-users writes:
Now that I look at it shouldn't PYTHONPATH=/opt/mailman/venv?
You shouldn't need a PYTHONPATH setting at all, unless you have local packages installed in nonstandard places. I don't have one, anyway, not in any of the Mailman 3 installations I'm managing at the moment.
If setting PYTHONPATH to include the venv directory changes Mailman behavior, I wonder if your virtual environment is misconfigured somehow. There are no Python libraries (*.py) or packages (a directory containing a __init__.py file) in that directory normally, so it is a no-op. Unfortunately I don't know enough about the internals to be of help with diagnosing it.
IIRC, the Python library search path is managed by (1) the virtual environment and (2) the directory containing the configuration file in use is first on the path (either the current working directory is changed to that, or it's explicitly added to the path). That file is specified explicitly with either with a command line option or an environment variable in the systemd unit file. (There's also a search path for mailman.cfg if there is no explicit setting, but its directory is always added to the path.)
It's a little bit tricky but in practice it works fine.
-- GNU Mailman consultant (installation, migration, customization) Sirius Open Source https://www.siriusopensource.com/ Software systems consulting in Europe, North America, and Japan
On 10/28/25 08:39, dap1--- via Mailman-users wrote:
Mark: That is what I used. Sorry, I missed the 3 key.
What's in your web server config to proxy Mailman requests?
Whats in your venv's site-packages/mailman_web/urls.py?
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
I created a file named /etc/mailman/sites-available/mailman.conf:
Alias /static "/opt/mailman/web/static" <Directory "/opt/mailman/web/static"> Require all granted </Directory>
<IfModule mod_headers.c> RequestHeader unset X-Forwarded-Proto <If "%{HTTPS} =~ /on/"> RequestHeader set X-Forwarded-Proto "https" </If> </IfModule>
<IfModule mod_proxy.c> ProxyPreserveHost On ProxyPass "/mailman3" "http://127.0.0.1:8000/mailman3" ProxyPass "/archives" "http://127.0.0.1:8000/archives" ProxyPass "/accounts" "http://127.0.0.1:8000/accounts" ProxyPass "/admin" "http://127.0.0.1:8000/admin" ProxyPass "/user-profile" "http://127.0.0.1:8000/user-profile" </IfModule>
I don't have a directory site-packages. Where/when should that have been created?
It should be in sites-enabled/ or conf-enabled/.
-- Best regards, Odhiambo WASHINGTON, Nairobi,KE +254 7 3200 0004/+254 7 2274 3223 In an Internet failure case, the #1 suspect is a constant: DNS. "Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-) [How to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html]
On Tue, Oct 28, 2025, 20:28 dap1--- via Mailman-users < mailman-users@mailman3.org> wrote:
Another typo: /etc/apache2/sites-available/mailman.conf
Mailman-users mailing list -- mailman-users@mailman3.org To unsubscribe send an email to mailman-users-leave@mailman3.org https://lists.mailman3.org/mailman3/lists/mailman-users.mailman3.org/ Archived at: https://lists.mailman3.org/archives/list/mailman-users@mailman3.org/message/...
This message sent to odhiambo@gmail.com
On October 28, 2025 10:33:50 AM PDT, Odhiambo Washington via Mailman-users <mailman-users@mailman3.org> wrote:
It should be in sites-enabled/ or conf-enabled/.
Actually sites-enabled/mailman.conf should be a symlink to sites available/mailmen.conf.
-- Mark Sapiro <mark@msapiro.net> Sent from my Not_an_iThing with standards compliant, open source software.
On October 28, 2025 10:55:21 AM PDT, Mark Sapiro <mark@msapiro.net> wrote:
Actually sites-enabled/mailman.conf should be a symlink to sites available/mailmen.conf.
Obviously that should be mailman, not mailman.
Also, the symlink can be created by a2ensite.
-- Mark Sapiro <mark@msapiro.net> Sent from my Not_an_iThing with standards compliant, open source software.
On Tue, Oct 28, 2025 at 8:55 PM Mark Sapiro <mark@msapiro.net> wrote:
On October 28, 2025 10:33:50 AM PDT, Odhiambo Washington via Mailman-users <mailman-users@mailman3.org> wrote:
It should be in sites-enabled/ or conf-enabled/.
Actually sites-enabled/mailman.conf should be a symlink to sites available/mailmen.conf.
True. But putting a file inside sites-enabled/ or conf-enabled/ still achieves the same result. Apache's a2ensite/a2enmod will create the symlinks in the *-enabled/ subdirs, but putting files in there, with the right extensions still does it.
-- Best regards, Odhiambo WASHINGTON, Nairobi,KE +254 7 3200 0004/+254 7 2274 3223 In an Internet failure case, the #1 suspect is a constant: DNS. "Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-) [How to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html]
On 10/28/25 14:41, dap1--- via Mailman-users wrote:
That should be added to the docs. In any case adding that symlink didn't help.
What's in Apache's error.log?
The doc assumes you will be adding to an existing *.conf for the site.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
I moved the parameters into 000-default.conf which already exists. That didn't help either. The only other existing file is default-ssl.conf which doesn't seem like the appropriate place to me. Nothing interesting showed up in the error log:
[Wed Oct 29 12:55:02.605034 2025] [mpm_event:notice] [pid 132252:tid 132296053331840] AH00492: caught SIGWINCH, shu tting down gracefully [Wed Oct 29 12:55:02.691348 2025] [mpm_event:notice] [pid 149006:tid 140404998248320] AH00489: Apache/2.4.58 (Ubunt u) configured -- resuming normal operations [Wed Oct 29 12:55:02.691598 2025] [core:notice] [pid 149006:tid 140404998248320] AH00094: Command line: '/usr/sbin/ apache2'
On 10/29/25 10:02, dap1--- via Mailman-users wrote:
I moved the parameters into 000-default.conf which already exists. That didn't help either. The only other existing file is default-ssl.conf which doesn't seem like the appropriate place to me. Nothing interesting showed up in the error log:
It may not be named error.log. look at all the relevant *error.log files
in /var/log/apache2. You are looking for lines matching the pattern
not (exist:|found).
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
The only files are access.log and error.log. Access.log contains as expected:
2600:1700:5cac:4600:5398:3572:2b43:6b41 - - [30/Oct/2025:09:58:57 -0400] "GET /mailman3 HTTP/1.1" 40 4 485 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0"
On 10/30/25 08:26, dap1--- via Mailman-users wrote:
The only files are access.log and error.log. Access.log contains as expected:
2600:1700:5cac:4600:5398:3572:2b43:6b41 - - [30/Oct/2025:09:58:57 -0400] "GET /mailman3 HTTP/1.1" 40 4 485 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0"
What about /opt/mailman/mm/var/logs/error.log?
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
On 10/28/25 14:28, Odhiambo Washington via Mailman-users wrote:
True. But putting a file inside sites-enabled/ or conf-enabled/ still achieves the same result. Apache's a2ensite/a2enmod will create the symlinks in the *-enabled/ subdirs, but putting files in there, with the right extensions still does it.
Yes it works, but it also breaks a2(en|dis)(site|mod|conf) functionality for that site/mod/conf.
Configurations should always be in a *-available/ directory with symlinks in the corresponding *-enabled/ directory so that the tools work as advertised.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
After some testing I found that while apache is listening on port 80, it is not listening on port 443. Not sure why at this point. Should mailmanweb be available via port 80?
When I set up virtual host for 443, what should I set document root to? I currently have /var/www/html.
On Thu, Oct 30, 2025 at 8:18 PM dap1--- via Mailman-users < mailman-users@mailman3.org> wrote:
When I set up virtual host for 443, what should I set document root to? I currently have /var/www/html.
MM3's DocumentRoot would equate to /path/to/mailman/web/static. But it is not required to be defined. You can see that at the bottom of this page: https://docs.mailman3.org/en/latest/install/virtualenv.html
-- Best regards, Odhiambo WASHINGTON, Nairobi,KE +254 7 3200 0004/+254 7 2274 3223 In an Internet failure case, the #1 suspect is a constant: DNS. "Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-) [How to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html]
On 10/30/25 10:18, dap1--- via Mailman-users wrote:
When I set up virtual host for 443, what should I set document root to? I currently have /var/www/html.
/var/www/html is OK. It only matters for requests that don't match ProxyPass directives.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
I don't know where to go from here. I've verified that ports 443 and 8000 are both listening.
On 10/31/25 08:16, dap1--- via Mailman-users wrote:
I don't know where to go from here. I've verified that ports 443 and 8000 are both listening.
If they weren't, you wouldn't be getting 404 errors. If you were proxying to a port that wasn't listening you'd get a 503 Service unavailable and if your web server wasn't listening your browser wouldn't be able to connect.
To recap, the issue is http://localhost/mailman3 and presumably https://localhost/mailman3 give a 404. What about other urls like
https://localhost/mailman3/lists/ https://localhost/archives https://localhost/accounts https://localhost/user-profile
And again, is there anything relevant in /opt/mailman/mm/var/logs/error.log?
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
All those links return a 404 error. As for the logs, oddly nothing is being logged:
<venv>$ ls -l total 0 -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 bounce.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 debug.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 mailman.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 plugins.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 smtp.log
Maybe that is a clue.
On 10/31/25 11:35, dap1--- via Mailman-users wrote:
All those links return a 404 error. As for the logs, oddly nothing is being logged:
<venv>$ ls -l total 0 -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 bounce.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 debug.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 mailman.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 plugins.log -rw-rw---- 1 mailman mailman 0 Oct 19 11:07 smtp.log
Maybe that is a clue.
If your gunicorn.conf contains
accesslog = "/opt/mailman/mm/var/logs/access.log" errorlog = "/opt/mailman/mm/var/logs/error.log"
as recommended at https://docs.mailman3.org/en/latest/install/virtualenv.html#setting-up-gunic... and there is no /opt/mailman/mm/var/logs/error.log file, gunicorn isn't running.
Also, the fact that mailman.log is empty says mailman core isn't running. Either that or your logs are elsewhere.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
mm/var not var. Confusing. Anyway I found the logs. Here is the error.log
[2025-10-27 14:18:42 -0400] [107897] [INFO] Starting gunicorn 23.0.0 [2025-10-27 14:18:42 -0400] [107897] [INFO] Listening at: http://127.0.0.1:8000 (107897) [2025-10-27 14:18:42 -0400] [107897] [INFO] Using worker: sync [2025-10-27 14:18:42 -0400] [107898] [INFO] Booting worker with pid: 107898 [2025-10-27 14:18:43 -0400] [107899] [INFO] Booting worker with pid: 107899 [2025-10-27 14:18:43 -0400] [107900] [INFO] Booting worker with pid: 107900 [2025-10-30 14:03:41 -0400] [107897] [INFO] Handling signal: int [2025-10-30 18:03:41 +0000] [107898] [INFO] Worker exiting (pid: 107898) [2025-10-30 14:03:41 -0400] [107897] [INFO] Shutting down: Master [2025-10-30 14:03:42 -0400] [174273] [INFO] Starting gunicorn 23.0.0 [2025-10-30 14:03:42 -0400] [174273] [INFO] Listening at: http://127.0.0.1:8000 (174273) [2025-10-30 14:03:42 -0400] [174273] [INFO] Using worker: sync [2025-10-30 14:03:42 -0400] [174274] [INFO] Booting worker with pid: 174274 [2025-10-30 14:03:42 -0400] [174275] [INFO] Booting worker with pid: 174275 [2025-10-30 14:03:42 -0400] [174276] [INFO] Booting worker with pid: 174276 [2025-10-31 15:12:04 +0000] [174276] [WARNING] Invalid request from ip=127.0.0.1: Invalid HTTP request line: 'ÿ ôÿý\x06\x04'
That looks like something is garbled up.
El sáb, 01-11-2025 a las 16:17 +0000, dap1--- via Mailman-users escribió:
mm/var not var. Confusing. Anyway I found the logs. Here is the error.log
8<---- snip ----8<
[2025-10-31 15:12:04 +0000] [174276] [WARNING] Invalid request from ip=127.0.0.1: Invalid HTTP request line: 'ÿ ôÿý\x06\x04'
That looks like something is garbled up.
How are you proxying your webserver to django/mailman-web? It looks like whatever it is, it is using a binary proxy protocol.
-- Victoriano Giralt Retired sysadmin
Note: signature.asc is the electronic signature of present message A: Yes.
Q: Are you sure ?
A: Because it reverses the logical flow of conversation.
Q: Why is top posting annoying in email ?
On 11/1/25 10:13, dap1--- via Mailman-users wrote:
See post from 10/28 at 5:25.
If you want to refer to a prior post, it is much better to refer to it with a link to the archive, in this case https://lists.mailman3.org/archives/list/mailman-users@mailman3.org/message/...
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
On 11/1/25 09:17, dap1--- via Mailman-users wrote:
mm/var not var. Confusing. Anyway I found the logs. Here is the error.log
[2025-10-31 15:12:04 +0000] [174276] [WARNING] Invalid request from ip=127.0.0.1: Invalid HTTP request line: 'ÿ ôÿý\x06\x04'
That looks like something is garbled up.
Try setting
loglevel = 'debug'
in your gunicorn.conf and restarting gunicorn.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
The only thing added to the error log was when mailmanweb was restarted. Nothing when the web page was accessed:
[2025-11-01 14:58:54 -0400] [220272] [DEBUG] Current configuration: config: /etc/mailman3/gunicorn.py wsgi_app: None bind: ['127.0.0.1:8000'] backlog: 2048 workers: 3 worker_class: sync threads: 1 worker_connections: 1000 max_requests: 0 max_requests_jitter: 0 timeout: 30 graceful_timeout: 30 keepalive: 2 limit_request_line: 4094 limit_request_fields: 100 limit_request_field_size: 8190 reload: False reload_engine: auto reload_extra_files: [] spew: False check_config: False print_config: False preload_app: False sendfile: None reuse_port: False chdir: /opt/mailman/mm daemon: False raw_env: [] pidfile: /opt/mailman/mm/var/gunicorn.pid worker_tmp_dir: None user: 1001 group: 1001 umask: 0 initgroups: False tmp_upload_dir: None secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'} forwarded_allow_ips: ['127.0.0.1', '::1'] accesslog: /opt/mailman/mm/var/logs/access.log disable_redirect_access_to_syslog: False access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" errorlog: /opt/mailman/mm/var/logs/error.log loglevel: debug capture_output: False logger_class: gunicorn.glogging.Logger logconfig: None logconfig_dict: {} logconfig_json: None syslog_addr: udp://localhost:514 syslog: False syslog_prefix: None syslog_facility: user enable_stdio_inheritance: False statsd_host: None dogstatsd_tags: statsd_prefix: proc_name: mailman-web default_proc_name: mailman_web.wsgi:application pythonpath: None paste: None on_starting: <function OnStarting.on_starting at 0x7e196c340e00> on_reload: <function OnReload.on_reload at 0x7e196c340f40> when_ready: <function WhenReady.when_ready at 0x7e196c341080> pre_fork: <function Prefork.pre_fork at 0x7e196c341260> post_fork: <function Postfork.post_fork at 0x7e196c3413a0> post_worker_init: <function PostWorkerInit.post_worker_init at 0x7e196c3414e0> worker_int: <function WorkerInt.worker_int at 0x7e196c341620> worker_abort: <function WorkerAbort.worker_abort at 0x7e196c341760> pre_exec: <function PreExec.pre_exec at 0x7e196c3418a0> pre_request: <function PreRequest.pre_request at 0x7e196c3419e0> post_request: <function PostRequest.post_request at 0x7e196c341a80> child_exit: <function ChildExit.child_exit at 0x7e196c341bc0> worker_exit: <function WorkerExit.worker_exit at 0x7e196c341d00> nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7e196c341e40> on_exit: <function OnExit.on_exit at 0x7e196c341f80> ssl_context: <function NewSSLContext.ssl_context at 0x7e196c342160> proxy_protocol: False proxy_allow_ips: ['127.0.0.1', '::1'] keyfile: None certfile: None ssl_version: 2 cert_reqs: 0 ca_certs: None suppress_ragged_eofs: True do_handshake_on_connect: False ciphers: None raw_paste_global_conf: [] permit_obsolete_folding: False strip_header_spaces: False permit_unconventional_http_method: False permit_unconventional_http_version: False casefold_http_method: False forwarder_headers: ['SCRIPT_NAME', 'PATH_INFO'] header_map: drop [2025-11-01 14:58:54 -0400] [220272] [INFO] Starting gunicorn 23.0.0 [2025-11-01 14:58:54 -0400] [220272] [DEBUG] Arbiter booted [2025-11-01 14:58:54 -0400] [220272] [INFO] Listening at: http://127.0.0.1:8000 (220272) [2025-11-01 14:58:54 -0400] [220272] [INFO] Using worker: sync [2025-11-01 14:58:54 -0400] [220273] [INFO] Booting worker with pid: 220273 [2025-11-01 14:58:54 -0400] [220274] [INFO] Booting worker with pid: 220274 [2025-11-01 14:58:54 -0400] [220275] [INFO] Booting worker with pid: 220275 [2025-11-01 14:58:54 -0400] [220272] [DEBUG] 3 workers
As an aside, mailmanweb will not start with gunicorn named gunicorn.conf. It only works if it is named gunicorn.py. I don't know if that is an Ubuntu thing but it probably needs to be documented.
On 11/1/25 12:14, dap1--- via Mailman-users wrote:
As an aside, mailmanweb will not start with gunicorn named gunicorn.conf. It only works if it is named gunicorn.py. I don't know if that is an Ubuntu thing but it probably needs to be documented.
For me it issues a warning but starts up just fine.
I don't know what's wrong with your installation, but it seems to have serious issues compared to one which I created by following the doc at https://docs.mailman3.org/en/latest/install/virtualenv.html
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
That's what I tried to follow but there are a few missing notes for Ubuntu installation in the docs. Given that it seem like everything works except getting the web page there must be a hook missing between mailmanweb and apache2. Is the proxy stuff the only place there is a hook? If so that must be where the issue lies. at least for Ubuntu.
I may have found the problem but would like confirmation before I mess things up.. The proxy stuff added to apache.conf asks for the modules mod_headers.c and mod_proxy.c. They do not exist in /etc/apache2/mods-available. However, none of the modules in that directory are file type 'c'. In any case if those modules are not loaded would not that explain my problem? I'm not sure it is appropriate to add those modules with a2enmod.
Got it. Something else that needs to be added as an Ubuntu note. The following need to be enabled:
sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
On 11/2/25 07:57, dap1--- via Mailman-users wrote:
Got it. Something else that needs to be added as an Ubuntu note. The following need to be enabled:
sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
Actually, of the above, only proxy and proxy_http are enabled on the working systems I support.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
On 11/2/25 07:30, dap1--- via Mailman-users wrote:
I may have found the problem but would like confirmation before I mess things up.. The proxy stuff added to apache.conf asks for the modules mod_headers.c and mod_proxy.c. They do not exist in /etc/apache2/mods-available. However, none of the modules in that directory are file type 'c'. In any case if those modules are not loaded would not that explain my problem? I'm not sure it is appropriate to add those modules with a2enmod.
If they don't exist in mods-available, they needed to be added with apt or whatever the package manager is in your distro. If they are in mods-available but not mods-enabled, they can be enabled with a2enmod.
The docs assume that if you see required modules in IfModule statements in the config you are adding, you would ensure those modules are enabled. Perhaps this assumption is unwarranted, but there is a line somewhere between an installation doc and a tutorial on system administration.
-- Mark Sapiro <mark@msapiro.net> The highway is for gamblers, San Francisco Bay Area, California better use your sense - B. Dylan
participants (7)
-
Andreas Vetter -
dap1@bellsouth.net -
Dennis Putnam -
Mark Sapiro -
Odhiambo Washington -
Stephen J. Turnbull -
Victoriano Giralt