You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
motief/thoughts/shared/plans/2026-03-26-motief-deploymen...

3.1 KiB

Deployment Plan: motief.sgeboers.nl

Date: 2026-03-26
Subdomain: motief.sgeboers.nl
Stack: Streamlit · uv · systemd · Nginx · Drone CI
Target: VPS, webapps user at /home/webapps/motief/


Already done

  • VPS directory /home/webapps/motief/data/ created
  • motions.db uploaded to VPS
  • nginx vhost configured for motief.sgeboers.nl
  • TLS cert via certbot

Step A — Install uv on VPS

SSH in as webapps:

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.cargo/env   # or re-login
uv --version              # verify

Step B — Clone repo and install dependencies

cd /home/webapps
git clone <your-gitea-url>/sgeboers/stemwijzer motief
cd motief
uv sync

The motions.db you already uploaded should live at:

/home/webapps/motief/data/motions.db

Step C — Create systemd user service

Create ~/.config/systemd/user/motief.service:

[Unit]
Description=motief.sgeboers.nl Streamlit app
After=network.target

[Service]
WorkingDirectory=/home/webapps/motief
ExecStart=/home/webapps/.local/bin/uv run streamlit run Home.py --server.port=8501 --server.headless=true
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

Enable and start:

systemctl --user daemon-reload
systemctl --user enable motief
systemctl --user start motief
systemctl --user status motief   # verify it's running

Enable linger so the service survives logout:

# Needs sudo (once only)
sudo loginctl enable-linger webapps

Step D — Configure Drone secrets

In drone.sgeboers.nlsgeboers/stemwijzerSettings → Secrets:

Secret Value
DEPLOY_HOST VPS hostname or IP
DEPLOY_SSH_PORT 22 (or custom)
DEPLOY_USER webapps
DEPLOY_PASSWORD webapps SSH password

Step E — First auto-deploy

git push origin main

Drone will SSH in and run:

cd /home/webapps/motief
git pull origin main
uv sync
systemctl --user restart motief

Step F — Verify

# On VPS
systemctl --user status motief
journalctl --user -u motief -f

# From browser
open https://motief.sgeboers.nl

Checklist:

  • Home.py loads with nav to Stemwijzer and Explorer
  • Compass tab renders with correct party positions (GL-PvdA top-left, PVV bottom-right)
  • SVD tab scree plot shows with highlighted top-2 bars
  • Similarity search returns results

Ongoing: data updates

The scheduler.py can be run as a separate user service or a cron job. To set it up as a service:

Create ~/.config/systemd/user/motief-scheduler.service:

[Unit]
Description=motief scheduler (weekly pipeline)
After=network.target

[Service]
WorkingDirectory=/home/webapps/motief
ExecStart=/home/webapps/.local/bin/uv run python scheduler.py
Restart=on-failure

[Install]
WantedBy=default.target

Dependency order

A (install uv)  ─┐
B (clone + sync) ─┤─► C (systemd service) ─► E (push to main) ─► F (verify)
                  └─► D (Drone secrets) ────┘

Total estimated time: 20 minutes.