Document WCX project split analysis

This commit is contained in:
2026-07-19 15:54:17 +02:00
parent 40008906ba
commit 2fcd9168b2
3 changed files with 1128 additions and 0 deletions

View File

@ -0,0 +1,101 @@
# Sammanfattning: uppdelning av WCX-projektet
## Databasschemarisken
Den viktigaste risken före en projektuppdelning är att det versionshanterade
databasschemat inte återskapar den databas som produktionen faktiskt använder.
`database/wcx.db` innehåller OCR-kolumnerna `ocr_status`, `ocr_raw_text`,
`ocr_error` och `ocr_processed_at` i tabellen `movie`, men kolumnerna saknas i
`scripts/schema.sql`. Samtidigt förutsätter OCR-skripten och dokumentationen att
de finns.
En ny databas skapad enbart från Git blir därför inte kompatibel med hela
facitflödet. Efter en uppdelning kan detta se ut som ett fel i den flyttade
koden, trots att grundorsaken är ett ofullständigt schema. Facitschemat måste
därför göras komplett och reproducerbart innan filer eller drift flyttas.
Ändringen ska utvecklas och verifieras mot en ny, disposable databas och inte
tillämpas blint på `database/wcx.db`.
Filhanteringen har dessutom ett direkt kontrakt mot tabellerna `movie`,
`movie_name_alias` och `movie_history`. Inkompatibla ändringar i dessa tabeller
kan bryta det andra projektet. Detta läskontrakt behöver dokumenteras och
versionshanteras eller åtminstone omfattas av en tydlig ändringsprocess.
## Föreslagen målarkitektur
Repositoryt delas i två självständiga Git-projekt:
1. **Facitprojektet** äger schema, migrationsdata, webbsynkronisering, import,
OCR och schemalagd uppdatering. Det är ensam ägare av och enda skrivare till
tabellerna `movie`, `movie_history` och `movie_name_alias`.
2. **Filhanteringsprojektet** äger filinventering, `ffprobe`-integration,
matchningskod, tester och matchningsdokumentation. Det läser facitdatabasen
genom en konfigurerbar SQLite-sökväg och ansluter strikt skrivskyddat med
`mode=ro`. Filsystemsrättigheter bör också neka skrivning där det är
praktiskt möjligt.
Gränsen mellan projekten bör inledningsvis vara ett litet, dokumenterat
SQLite-läskontrakt. Ett API eller gemensamt Python-bibliotek behövs inte för den
nuvarande lokala användningen. Om filhanteringen senare behöver lagra lokala
filsökvägar, manuella beslut eller bearbetningsstatus ska den få en egen
databas. Den får referera till ett stabilt `movie.id`, men ska aldrig skriva
lokalt tillstånd i facitdatabasen.
Runtime-data ska hållas tydligt åtskild från Git-spårad kod. Den genererade
`import/wcx_site_index.json` bör behandlas enligt ett uttryckligt beslut om
runtime-data och normalt inte följa med som källfil till ett nytt repository.
## Beslut före implementation
Följande behöver avgöras innan den fysiska uppdelningen:
- Ska ett korrigerat komplett grundschema vara tillräckligt, eller behövs även
en versionshanterad migrationsmekanism för framtida schemaändringar?
- Var ska facitdatabasen ligga: i facitprojektets runtime-katalog eller i en
separat, stabil datakatalog?
- Ska projekten köras med samma operativsystemkonto, eller ska
filhanteringsprocessen få ett separat konto utan skrivrättighet till facit?
- Hur versionssätts läskontraktet, och hur samordnas inkompatibla
schemaändringar mellan projekten?
- Är `movie.id` tillräckligt stabilt för framtida externa referenser från en
separat filhanteringsdatabas?
- Ska `import/wcx_site_index.json` tas bort ur Git-indexet och endast genereras
vid körning?
- Var finns de externa systemd-enheterna, och vilka sökvägar, miljövariabler,
rättigheter och låsfiler måste ändras?
- Vilka namn och installationsplatser ska de två nya Git-projekten ha?
- Om produktionsdatabasen ska flyttas: vilken slutlig runtime-plats,
backupmetod och rättighetsmodell ska användas?
Direkt SQLite-läsning antas ge tillräcklig samtidighet och tillgänglighet. Om
det antagandet inte gäller behöver arkitekturen omprövas innan implementation.
## Rekommenderad migreringsordning
1. **Fastställ ansvar och läskontrakt.** Dokumentera att facitprojektet är ensam
skrivare samt exakt vilka tabeller och kolumner filhanteringen får läsa.
2. **Gör schemat reproducerbart.** Komplettera schemahanteringen och verifiera
en helt ny disposable databas, inklusive import- och OCR-operationer. Lämna
produktionsdatabasen orörd.
3. **Bestäm hanteringen av genererade filer.** Rätta Git-index och
dokumentation om import-JSON ska vara ren runtime-data.
4. **Gör sökvägar flyttbara i nuvarande repository.** Behåll explicita
kommandoradsargument, gör databassökvägar konfigurerbara och använd relativa
skriptsökvägar där det passar. Kontrollera även verklig systemd-konfiguration.
5. **Tvinga fram read-only.** Byt filhanteringens anslutningar till SQLite URI
med `mode=ro` och verifiera både normal läsning och att skrivning nekas.
Använd inte `immutable=1` för en databas som uppdateras samtidigt.
6. **Separera dokumentation och filstruktur logiskt.** Gör respektive projekt
självständigt begripligt och verifiera att gamla absoluta sökvägar är borta.
7. **Skapa de två Git-projekten.** Flytta först när schema, konfiguration och
read-only-gräns är verifierade. Testa facitimport och filmatchning separat
och behåll det gamla repositoryt tills båda fungerar.
8. **Flytta drift och systemd sist.** Kör facit manuellt från den nya platsen
före schemalagd produktionsdrift. Använd en säker SQLite-backupmetod om
databasen måste flyttas medan systemet är i bruk.
9. **Inför en separat filhanteringsdatabas endast vid konkret behov.** Detta är
en senare funktionsändring, inte en förutsättning för projektuppdelningen.
Schemaändring, read-only-förstärkning, filflytt och produktionsdrift bör göras
som separata, granskningsbara förändringar så att eventuella fel går att
isolera.