# 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`:

```bash
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

```bash
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`:

```ini
[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:

```bash
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:

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

---

## Step D — Configure Drone secrets

In `drone.sgeboers.nl` → `sgeboers/stemwijzer` → **Settings → 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

```bash
git push origin main
```

Drone will SSH in and run:
```bash
cd /home/webapps/motief
git pull origin main
uv sync
systemctl --user restart motief
```

---

## Step F — Verify

```bash
# 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`:

```ini
[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**.
