media: stage dedicated RomM MariaDB target
Some checks failed
secret-guardrails / artifact-secret-scan (push) Has been cancelled
secret-guardrails / gitleaks (push) Has been cancelled

This commit is contained in:
Fizzlepoof
2026-05-26 00:38:56 +00:00
parent f0764c4aa6
commit 68bab888db
3 changed files with 70 additions and 5 deletions

View File

@@ -327,8 +327,9 @@ Chosen target layout (2026-05-25):
- place both services in the PD `media` stack so they follow the same steady-state placement already documented for PD media/library apps - place both services in the PD `media` stack so they follow the same steady-state placement already documented for PD media/library apps
- attach both services to: - attach both services to:
- `media-net` for local app adjacency - `media-net` for local app adjacency
- `ix-databases_shared-databases` for shared DB access
- `pangolin` for internal ingress / public exposure - `pangolin` for internal ingress / public exposure
- attach only GameVault to `ix-databases_shared-databases` because it keeps using PD `shared-postgres`
- keep RomM on `media-net` + `pangolin`; its database will be a dedicated sibling service on `media-net`, not a shared DB consumer
- preserve the current host ports on PD because live checks showed them free there: - preserve the current host ports on PD because live checks showed them free there:
- GameVault: `8785:8080` - GameVault: `8785:8080`
- RomM: `8457:8080` - RomM: `8457:8080`
@@ -358,9 +359,11 @@ Chosen database layout:
- GameVault -> PD `shared-postgres` on `ix-databases_shared-databases` - GameVault -> PD `shared-postgres` on `ix-databases_shared-databases`
- target DB: `gamevault` - target DB: `gamevault`
- target DB user: `gamevault` - target DB user: `gamevault`
- RomM -> PD `shared-mariadb` on `ix-databases_shared-databases` - RomM -> dedicated PD `romm-db` service on `media-net`
- target image pin: `mariadb:12.2`
- target DB: `romm` - target DB: `romm`
- target DB user: `romm` - target DB user: `romm`
- target data path: `/mnt/docker-ssd/docker/appdata/romm-db/mysql`
Routing/proxy notes to preserve during implementation: Routing/proxy notes to preserve during implementation:
- RomM upstream docs call out reverse-proxy sensitivity; keep websocket support intact when the route is moved behind PD Traefik - RomM upstream docs call out reverse-proxy sensitivity; keep websocket support intact when the route is moved behind PD Traefik
@@ -369,7 +372,7 @@ Routing/proxy notes to preserve during implementation:
### Card D2 — stage PD database targets for the wave ### Card D2 — stage PD database targets for the wave
Definition of done: Definition of done:
- GameVault target DB/user created on PD shared-postgres or explicit exception documented - GameVault target DB/user created on PD shared-postgres or explicit exception documented
- RomM target DB/user created on PD shared-mariadb or explicit exception documented - RomM target DB/user created on the chosen PD MariaDB target or explicit exception documented
- connection details verified from the future PD app network context - connection details verified from the future PD app network context
- migration rollback notes captured before any source export - migration rollback notes captured before any source export
@@ -385,6 +388,8 @@ Execution notes (2026-05-25):
- pre-change backup of PD media env: `/mnt/docker-ssd/docker/compose/media/.env.pre-serenity-wave2-d2-20260525-182938` - pre-change backup of PD media env: `/mnt/docker-ssd/docker/compose/media/.env.pre-serenity-wave2-d2-20260525-182938`
- if D3/D4 later uncover an issue, keep the staged DBs unused, restore the prior media `.env` if needed, and rotate/drop the staged users before re-attempting - if D3/D4 later uncover an issue, keep the staged DBs unused, restore the prior media `.env` if needed, and rotate/drop the staged users before re-attempting
- no Serenity source data was touched yet in D2; this card only prepared empty PD landing zones - no Serenity source data was touched yet in D2; this card only prepared empty PD landing zones
- note after D3b:
- the staged shared-mariadb `romm` target is now superseded by the dedicated `romm-db` plan and should not be used for RomM cutover
### Card D3 — export and validate Serenity source databases ### Card D3 — export and validate Serenity source databases
Definition of done: Definition of done:
@@ -414,7 +419,46 @@ Execution notes (2026-05-25):
- treat this as a compatibility / target-selection issue, not a dump-corruption issue; the dump itself is populated and preserved in backup storage - treat this as a compatibility / target-selection issue, not a dump-corruption issue; the dump itself is populated and preserved in backup storage
- net result: - net result:
- D3 is complete for GameVault - D3 is complete for GameVault
- D3 is only partially complete for RomM until the MariaDB target strategy is revised and the restore path is proven - D3 export validation is complete for RomM, but the original PD shared-mariadb landing target is rejected
### Card D3b — resolve RomM PD database target compatibility
Decision:
- do not upgrade PD `shared-mariadb` just to fit RomM
- keep PD `shared-mariadb` on its current conservative shared-infra track unless a separate approved maintenance change is planned for all consumers
- provision a dedicated PD MariaDB target for RomM instead
Evidence behind the decision:
- the RomM source dump repeatedly uses reused foreign-key names such as `CONSTRAINT \`1\`` and `CONSTRAINT \`2\`` across multiple tables
- MariaDB docs state that foreign-key names must be unique per database before MariaDB 12.1, and only become reusable across tables in MariaDB 12.1+
- Serenity `MariaDB-Official` is MariaDB 12.2.2, which explains why the source schema can exist there
- PD `shared-mariadb` is MariaDB 11.4.11, where the same dump fails with `errno: 121` while creating `device_save_sync`
- the PD databases stack currently provisions MariaDB specifically for Uptime Kuma via `databases/initdb-mariadb/01-create-uptime-kuma-db.sh`; there is no evidence in repo or live stack layout that shared-mariadb was intentionally upgraded or validated as a broad multi-app MariaDB landing zone
- RomM's own setup docs commonly show a dedicated MariaDB container and even call out compatibility-conscious MariaDB version choices in example guides
Operational recommendation:
- create a dedicated PD MariaDB service for RomM, isolated from `shared-mariadb`
- pin that dedicated service to a MariaDB 12.x line compatible with the Serenity source behavior unless RomM docs or release notes later justify a different pin
- attach PD RomM only to its own DB service plus the networks it already needs for ingress/library access
- leave `shared-mariadb` untouched for now to avoid coupling the RomM migration to a shared-database major-version change and validation cycle
Definition of done for D3b:
- dedicated PD MariaDB target for RomM is chosen and documented
- target image/version pin recorded
- restore path is re-tested successfully against that dedicated target before RomM cutover proceeds
Execution notes (2026-05-26):
- restore-path proof was executed on PD using an isolated test container pinned to `mariadb:12.2`
- test target details:
- container: `romm-db-d3b-test`
- image/runtime version: `mariadb:12.2` / `12.2.2-MariaDB`
- data path: `/mnt/docker-ssd/docker/appdata/romm-db-d3b-test/mysql`
- the preserved Serenity RomM dump `/home/fizzlepoof/serenity-wave2-d3-work/20260525-184736-serenity-romm.sql` imported cleanly into the 12.2 target on PD
- post-import verification on the PD test target returned:
- `20` tables in schema `romm`
- approximately `10.42 MB` logical table+index footprint
- result:
- the compatibility blocker is resolved for a dedicated MariaDB 12.2 target
- RomM should proceed against dedicated `romm-db`, not `shared-mariadb`
### Card D4 — sync appdata for GameVault and RomM to PD staging paths ### Card D4 — sync appdata for GameVault and RomM to PD staging paths
Definition of done: Definition of done:

View File

@@ -18,7 +18,8 @@ GAMEVAULT_DB_NAME=gamevault
GAMEVAULT_DB_USER=gamevault GAMEVAULT_DB_USER=gamevault
GAMEVAULT_DB_PASS=changeme GAMEVAULT_DB_PASS=changeme
# RomM MariaDB target on shared-mariadb # RomM dedicated MariaDB target on the PD media stack
ROMM_DB_ROOT_PASSWORD=changeme
ROMM_DB_NAME=romm ROMM_DB_NAME=romm
ROMM_DB_USER=romm ROMM_DB_USER=romm
ROMM_DB_PASS=changeme ROMM_DB_PASS=changeme

View File

@@ -8,6 +8,26 @@ networks:
services: services:
romm-db:
container_name: romm-db
image: mariadb:12.2
restart: unless-stopped
networks:
- media-net
environment:
MARIADB_ROOT_PASSWORD: ${ROMM_DB_ROOT_PASSWORD}
MARIADB_DATABASE: ${ROMM_DB_NAME}
MARIADB_USER: ${ROMM_DB_USER}
MARIADB_PASSWORD: ${ROMM_DB_PASS}
volumes:
- /mnt/docker-ssd/docker/appdata/romm-db/mysql:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
plex: plex:
container_name: ix-plex-plex-1 container_name: ix-plex-plex-1
image: lscr.io/linuxserver/plex:latest image: lscr.io/linuxserver/plex:latest