From 658ea65627fd36e502a1c597b531d5febe984727 Mon Sep 17 00:00:00 2001 From: thethreemagi Date: Sun, 2 Aug 2026 06:10:30 +0100 Subject: [PATCH] migration: mark executed 2026-08-01, record deviations from the written procedure --- migration/README.md | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/migration/README.md b/migration/README.md index 7d639f7..08b01a9 100644 --- a/migration/README.md +++ b/migration/README.md @@ -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.)