migration: mark executed 2026-08-01, record deviations from the written procedure

This commit is contained in:
2026-08-02 06:10:30 +01:00
parent a80f96b9a7
commit 658ea65627
+38 -2
View File
@@ -1,5 +1,35 @@
# Plex Migration — Windows → Linux, nothing lost
> ## ✅ EXECUTED 2026-08-01 — M0 through M4 complete in one day
>
> Plex is live on Linux with its original identity (`eb69ec8a…`), watch state
> intact, direct play verified with a real session. In soak (M5). This file is
> now the **record of the procedure**; deviations that a future re-run must
> know about:
>
> 1. **VACUUM is mandatory after the remap.** The no-backslash gate greps the
> raw DB file and hits deleted rows lingering on SQLite **free pages**.
> Plain sqlite3/python cannot open the DB (custom `icu_root` collation —
> do NOT fake it); run VACUUM with **Plex's own SQLite** via
> `docker run --entrypoint`.
> 2. **Expect phantom rows from dead eras.** 1,715 backslash rows survived
> the remap legitimately: Sync+ cache from old D:/E:/G: drive letters
> (+ orphan `media_items`), 6 rows for a dead `\\tesla` NAS, and 115 UNC
> blobs in `download_queue_items.decision_result`. All deleted; 3 real
> theme-music paths re-pathed. The remap itself was correct — these
> predate the current library roots.
> 3. **Verify staged copies with `rsync -an --delete --stats`** (0 transferred
> / 0 deleted), never `du -sb` equality — directory apparent sizes differ
> across filesystems.
> 4. **First boot needs `systemctl start --no-block`** in cloud-init runcmd —
> `enable` alone misses the boot it runs in (fixed in `user-data`).
> 5. Post-go-live, the Plex image pin was **reversed** (Mike, 2026-08-02):
> `:latest` + watchtower daily 05:00 with ntfy. Watchtower needs
> `DOCKER_API_VERSION=1.44` against Engine 29.
>
> Cleanup 2026-08-02: staging dir + `.pre-remap`/`.pre-syncfix` sidecars
> deleted. Rollback net = NAS `media_pc` backup + Plex's scheduled DB backups.
Supersedes the earlier "forward-only, fresh Plex" decision. That call was made
before the library was measured. At **27 TB, 25,148 video items and 337 GB of
already-generated preview cache**, rebuilding fresh costs one to three weeks of
@@ -200,6 +230,11 @@ paths remain, that the counts moved 1:1, that the "Dr. Korval" tag and the
four Liaden book summaries are **untouched**, and finally stats 200 random
remapped paths against the real filesystem.
**As executed:** the no-backslash gate additionally required deleting phantom
Sync+ cache rows from dead drive-letter eras, 6 dead `\\tesla` rows and 115
`download_queue_items` UNC blobs, then **VACUUM with Plex's own SQLite**
(see the banner at the top) before the raw-file grep came back clean.
No claim token. The server already has its identity. The compose bind-mounts
`/srv/data/plex-media` over `.../Plex Media Server/Media`, so the migrated
thumbnails are in place from the first start.
@@ -236,5 +271,6 @@ decision, not a cleanup step.
Before M3 step 3 (the format), `D:` is intact and everything is reversible on
the data side — Windows itself is gone after M1, but a reinstall from the USB
takes ~20 minutes and every copy still exists. After the format, the NAS
`media_pc` backup is the recovery source: it outlives every step here, and
`migrate-db.sh` leaves a `.pre-remap` copy beside every database it touches.
`media_pc` backup is the recovery source: it outlives every step here.
(The on-box `.pre-remap`/`.pre-syncfix` sidecars were deleted 2026-08-02
after the soak-start all-clear.)