MoinMoin

!MoinMoin is a wiki software. Version 1 (current release) runs on Python 2 with vendored dependencies, a complex plugin ecosystem, and no plan for security support. Version 2 (unstable) runs on Python 3 with the Flask ecosystem.


Server Setup

!MoinMoin requires a running web server running Python and uWSGI. The below walkthrough skims over security and configuration details.

NGINX

NGINX can run a 'good-enough' web server with minimal configuration. Create a server location that passes into the !MoinMoin socket. then enable and start the NGINX service.

server {
        listen 80 default_server;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location / {
                include /etc/nginx/uwsgi_params;
                uwsgi_pass unix:///var/www/moin/moin.sock;
                uwsgi_modifier1 30;
        }
}

Often, uWSGI apps recommend adding uwsgi_modifier1 30 to rewrite PATH_INFO and SCRIPT_NAME. This is a deprecated measure, and is unstable for Python 3+. Instead, configure uWSGI.

See here for more details on setting up NGINX.

Let's Encrypt

certbot can quickly and freely encrypt the wiki, using its NGINX plugin.

sudo certbot --nginx -d wiki.dominic-ricottone.com

See here for more details on setting up SSL.

uWSGI

See here for more details on setting up uWSGI.


MoinMoin

Python Dependencies

To insulate the !MoinMoin instance from the wider web server, it should be installed inside a virtual environment.

sudo apt install python-pip
sudo pip install virtualenv
sudo virtualenv /var/www/moin/pythonenv

!MoinMoin and its dependencies can now be installed safely.

#download
cd /tmp
wget http://static.moinmo.in/files/moin-1.9.10.tar.gz
tar zxvf moin-1.9.10.tar.gz
cd ./moin-1.9.10

#install
source /var/www/moin/pythonenv/bin/activate
python ./setup.py install

Minimum Running Configuration

In order to run, !MoinMoin expects a specific directories and scripts. Unpack these from the downloaded package.

cp -r /tmp/wiki /var/www/moin
cp /tmp/config/wikiconfig.py /var/www/moin/wiki/
cp /tmp/server/moin.wsgi /var/www/moin/wiki/

Insert the below into wikiconfig.py, after import os but before from MoinMoin.config import multiconfig, url_prefix_static.

import sys
sys.path.insert(0, '/var/www/moin/pythonenv/lib/python2.7/site-packages/')
sys.path.insert(0, '/var/www/moin/wiki/')

Create a new file, uwsgi.ini.

[uwsgi]
uid = moin
gid = www-data
socket = /var/www/moin/moin.sock
chmod-socket = 660
plugin = python

chdir = /var/www/moin/wiki
wsgi-file = /var/www/moin/wiki/moin.wsgi

master
workers = 3
max-requests = 200
harakiri = 60
die-on-term

Permissions

You know you'll have permissions errors eventually. Preempt them.

chown www-data:www-data -R /var/www/moin
chmod g+w,o-rwx -R /var/www/moin

Service File

Create a service file at /etc/systemd/system/moinmoin.service. It should call uWSGI with the configuration we just setup.

[Unit]
Description=Start uwsgi for MoinMoin wiki
After=network.target

[Service]
Type=simple
User=www-data
ExecStart=/usr/bin/uwsgi --ini /var/www/moin/wiki/uwsgi.ini

[Install]
WantedBy=multi-user.target

Enable and start the service.


Configuration

Follow the on-screen instructions to setup a superuser, install language packs and addons, and set the front page.


CategoryRicottone