Skip to content

feat(validatie): multi-machine bootstrap (rclone+Box) + beheerpagina#59

Merged
EdF2021 merged 2 commits intomainfrom
feat/multi-machine-beheerpagina
May 9, 2026
Merged

feat(validatie): multi-machine bootstrap (rclone+Box) + beheerpagina#59
EdF2021 merged 2 commits intomainfrom
feat/multi-machine-beheerpagina

Conversation

@EdF2021
Copy link
Copy Markdown
Contributor

@EdF2021 EdF2021 commented May 9, 2026

Summary

Lost de "DB komt niet mee bij pull op andere computer"-pijn op door oeren/ centraal in Box te hosten en de DB altijd lokaal te herbouwen via één bootstrap-commando. Per machine éénmalig rclone config, daarna ./scripts/bootstrap.sh.

Onderdelen

Scripts

  • scripts/sync_oeren.sh — rclone-wrapper. Valideert dat rclone geïnstalleerd is en de remote in config staat. Override via RCLONE_REMOTE / RCLONE_OEREN_PAD / OEREN_PAD env-vars.
  • scripts/bootstrap.sh — chained uv sync --extra devsync_oeren.shingest --allesseed.py. Flags: --skip-sync, --skip-seed, --seed-bulk.

Beheerpagina (/beheer)

  • Beschermd via BEHEER_ENABLED=true in .env (default uit, dus geen blootstelling op gedeelde servers).
  • 4 tabs:
    • 📊 Status — # OERs per instelling, # geïndexeerd, laatste ingest-run met scope/timestamp/duur, # PDFs+MD op schijf. Verse SQLite-connectie zodat subprocess-commits direct zichtbaar zijn (gecachte _db.get_conn() lost dat niet op).
    • ☁️ Sync oeren — knop draait sync_oeren.sh, output live in scrollende code-block.
    • 🗄 Re-ingest — scope-dropdown (alles + 5 instellingen) + --reset checkbox, draait ingest.
    • 🌱 Seedseed.py (basis 3+2 accounts) of seed_bulk.py (~1000 studenten).
  • Subprocess-streaming via subprocess.Popen(stdout=PIPE, bufsize=1) + lazy generator dat regels yieldt; UI vernieuwt placeholder met laatste 300 regels.

DB

  • Nieuwe tabel ingest_runs (id, tijdstip, scope, n_oers, n_kerntaken, duur_seconden).
  • voeg_ingest_run_toe() + laatste_ingest_run() helpers in db.py.
  • ingest.main() logt elke run met start/eind-tijd en counts.

Documentatie

  • CLAUDE.md uitgebreid met: multi-machine setup-stappen (rclone install → config → bootstrap), BEHEER_ENABLED env-var, beheerpagina-tabs.

Eenmalige setup-flow voor andere machines

curl https://rclone.org/install.sh | sudo bash
rclone config       # remote "box", storage "box", default flags
git clone git@github.com:cedanl/samenwijzer.git
cd samenwijzer/validatie_samenwijzer
./scripts/bootstrap.sh

Test plan

  • uv run python -m pytest (63/63 groen)
  • uv run ruff check src/ app/ scripts/
  • bash -n scripts/sync_oeren.sh scripts/bootstrap.sh (syntax-check)
  • Browser smoke-test: /beheer zonder flag → toegang geweigerd; met flag → 4 tabs renderen, ingest-subprocess streamt live, exit=0, status-tab toont nieuwe run
  • Reviewer: pak een 2e machine, draai bootstrap, check of oer_documenten correct gevuld wordt
  • Reviewer: bevestig dat BEHEER_ENABLED niet per ongeluk in een prod .env staat

Tradeoffs / aandachtspunten

  • rclone is een externe binary: vereist installatie per machine. Voorgesteld bewust boven boxsdk Python omdat rclone OAuth-flow visueel afhandelt en geen tokens-in-env nodig is.
  • Beheerpagina draait subprocesses op de Streamlit-host. Lokaal prima, op gedeelde server een security-vraag — daarom env-flag-bewaakt.
  • Status-tab gebruikt verse SQLite-connectie i.p.v. de gecachte _db.get_conn(). Lichte overhead per render, maar nodig om commits van net-afgesloten subprocesses te zien.

🤖 Generated with Claude Code

EdF2021 and others added 2 commits May 9, 2026 13:32
Lost de "DB komt niet mee bij pull op andere computer"-pijn op door oeren/
centraal in Box te hosten en de DB altijd lokaal te herbouwen via één
bootstrap-commando. Eenmalige `rclone config` per machine, daarna
`./scripts/bootstrap.sh`.

- `scripts/sync_oeren.sh`: rclone-wrapper, valideert config en remote-naam.
- `scripts/bootstrap.sh`: chained `uv sync` → sync → ingest → seed met
  `--skip-sync`, `--skip-seed`, `--seed-bulk` flags.
- `app/pages/9_beheer.py`: 4-tab beheerpagina (Status, Sync, Re-ingest, Seed)
  beschermd via `BEHEER_ENABLED=true` env-flag. Subprocess-output wordt
  live gestreamd via `subprocess.Popen` + scrollende code-block. Status-tab
  gebruikt verse SQLite-connectie zodat subprocess-commits direct zichtbaar
  zijn na een ingest-run.
- `ingest_runs`-tabel + `voeg_ingest_run_toe()` / `laatste_ingest_run()`
  helpers; ingest-CLI logt elke run met scope, # OERs, # kerntaken en duur.

Documentatie in CLAUDE.md uitgebreid met multi-machine workflow, rclone-setup
en beheerpagina-tabs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Eén klik = `uv sync` → `rclone copy` → `ingest --alles` → `seed`. Bedoeld voor
nieuwe machines en volledige DB-rebuild. Drie checkboxes (--skip-sync, --skip-seed,
--seed-bulk) plus een verplichte bevestigings-checkbox vóór de Start-knop
geactiveerd wordt; voorkomt accidentele rebuild van een gevulde DB.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@EdF2021 EdF2021 merged commit 5ac36ca into main May 9, 2026
1 check passed
@EdF2021 EdF2021 deleted the feat/multi-machine-beheerpagina branch May 9, 2026 11:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant