Skip to content

Latest commit

 

History

History
145 lines (111 loc) · 3.14 KB

deploying.md

File metadata and controls

145 lines (111 loc) · 3.14 KB

Deploying Wahlfang for Production Use

Install

To install wahlfang simply install it from PyPi

$ pip install wahlfang

Database

We recommend setting up a postgresql database for production use, although django allows mysql and sqlite (please do not use this one for production use, please) as well. All database backends supported by django can be used.

Settings

Wahlfang can be customized using a configuration file at /etc/wahlfang/settings.py. The path to this configuration file can be changed by setting the WAHLFANG_CONFIG environment variable.

A starting point for a minimum production ready settings file can be found here.

After configuring your database make sure to not forget the required database migrations. Simply run

$ wahlfang migrate

After configuring a suitable STATIC_ROOT for your deployment which will contain all static assets served by your webserver run

$ wahlfang collectstatic

Management commands

You can create a local election management user with:

$ wahlfang create_admin

Non-Python Requirements

  • Nginx
  • Daphne
  • Redis
  • PDFLatex (only needed when you want to print invite lists for elections)

Nginx + Daphne

daphne.service

[Unit]
Description = daphne daemon
After = network.target

[Service]
User = www-data
Group = www-data
RuntimeDirectory = daphne
ExecStart = daphne wahlfang.asgi:application
ExecReload = /bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Example nginx config.

nginx

upstream daphne_server {
    server localhost:8000;
}
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    
    server_name _;
    
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    ssl_certificate /path/to/ssl/fullchainfile;
    ssl_certificate_key /path/to/ssl/key;
    charset utf-8;

    location /static {
        # as configured in settings.py under STATIC_ROOT
        alias /var/www/wahlfang/static;
    }

    location /media {
        # as configured in settings.py under MEDIA_ROOT
        alias /var/www/wahlfang/media;
    }

    location / {
        proxy_pass http://daphne_server;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Periodic tasks

Create a systemd service to run periodic tasks such as sending reminder e-mails for elections where this feature has been enabled.

wahlfang-reminders.timer

[Unit]
Description=Wahlfang Election Reminders Timer

[Timer]
OnCalendar=*:0/10

[Install]
WantedBy=timers.target

wahlfang-reminders.service

[Unit]
Description=Wahlfang Election reminders

[Service]
# the specific user that our service will run as
User = www-data
Group = www-data
ExecStart = wahlfang process_reminders
TimeoutStopSec = 5
PrivateTmp = true