Problem: node and cross-cutting narratives lived at the repo root
(containers/, vms/, infrastructure/, host .md files), interleaved with the
machine-readable substrate.
Change:
- Move containers/ -> knowledge/wiki/containers/, vms/ -> knowledge/wiki/vms/,
infrastructure/ -> knowledge/wiki/infrastructure/, hosts/{hubris,strong}.md ->
knowledge/wiki/hosts/, infrastructure/references/ -> knowledge/sources/references/,
GLOSSARY.md -> knowledge/GLOSSARY.md.
- Add knowledge/{index.md,log.md,sources/index.md} scaffolding.
- Rewrite all relative links repo-wide via a path-resolving mapper (inbound +
outbound + between-moved-files), including .hermes/, runbooks, operations,
investigations, plans, README, AGENTS.
- Repoint inventory.yaml doc_page fields and regenerate hosts/*.yaml (which
embed doc_page); update oikos/gen-topology.py output path, candidate doc
paths, and footer links; update code-comment doc paths.
Substrate untouched in place: inventory.yaml, hosts/*.yaml (regenerated,
idempotent), oikos/ code, mcp/, secrets/, bin/.
Verification:
- Logical broken-link set identical to pre-move baseline (net 128 -> 127; the
topology regen fixed one, introduced none). Remaining are pre-existing refs
to destroyed/archived nodes, out of scope for this move.
- gen-topology.py --check exit 0 (in sync); cards carry knowledge/wiki/ doc paths.
- build_host_files.py idempotent; all inventory doc_page targets resolve.
- MCP contract verified: get_page/search_docs/get_changelog resolve moved pages.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
82 lines
2.7 KiB
Markdown
82 lines
2.7 KiB
Markdown
# 134 — `romm`
|
|
|
|
Self-hosted ROM manager ([RomM](https://romm.app)). Browse, search, and play
|
|
your retro game library from the browser. Runs on Docker Compose with a
|
|
MariaDB sidecar.
|
|
|
|
## At a glance
|
|
|
|
- **Hostname:** `romm`
|
|
- **IP:** `192.168.8.249/28` (static, vmbr1 on strong)
|
|
- **Privilege:** privileged
|
|
- **Resources:** 1 core / 2 GiB RAM / 16 GiB rootfs (Debian 13, ludo-lvm)
|
|
- **Mounts:** `/mnt/media_local` → `/mnt/library`
|
|
- **Public hostname:** `roms.hubris.network`
|
|
|
|
## Service / port map
|
|
|
|
| Service | Listen | Notes |
|
|
|---------|--------|-------|
|
|
| RomM | `192.168.8.249:80` | HTTP (Caddy terminates TLS) |
|
|
| MariaDB | internal only | Sidecar in the same compose stack |
|
|
|
|
## Compose
|
|
|
|
Located at `/opt/romm/docker-compose.yml`. Key points:
|
|
|
|
- Image: `rommapp/romm:latest`
|
|
- DB sidecar: `mariadb:latest` with healthcheck
|
|
- ROM library: `/mnt/library/roms` → `/romm/library` (writable)
|
|
- Resources (covers, etc.): Docker named volume `romm_resources` → `/romm/resources`
|
|
- Saves/states: `/opt/romm/assets` → `/romm/assets`
|
|
- Config: `/opt/romm/config` → `/romm/config`
|
|
- Auth key: auto-generated, stored in `/opt/romm/.env`
|
|
|
|
Environment (`/opt/romm/.env`):
|
|
- `DB_ROOT_PASSWD` / `DB_PASSWD` — MariaDB credentials
|
|
- `DB_USER=romm-user` / `DB_NAME=romm`
|
|
- `ROMM_AUTH_SECRET_KEY` — auto-generated
|
|
|
|
## ROM library structure
|
|
|
|
RomM expects `/mnt/library/roms/<platform>/<game>/<rom>`. Create platform
|
|
directories as needed:
|
|
|
|
```
|
|
/mnt/media_local/roms/
|
|
├── gba/
|
|
│ └── Pokemon - Emerald/
|
|
│ └── Pokemon Emerald.gba
|
|
├── snes/
|
|
│ └── Super Mario World/
|
|
│ └── Super Mario World.sfc
|
|
└── psx/
|
|
└── Final Fantasy VII/
|
|
└── Final Fantasy VII.bin
|
|
```
|
|
|
|
## Media permissions
|
|
|
|
The `/mnt/media_local/roms` directory is owned `root:media` with mode `2775`
|
|
(setgid). New files inherit the `media` GID (10000). The LXC is privileged so
|
|
no idmap block is needed — in-container UID/GID matches the host. Docker
|
|
containers within the LXC run as-is (read-only mount).
|
|
|
|
## Related
|
|
|
|
- [Strong host](../hosts/strong.md)
|
|
- [Caddy (121)](121-caddy.md) — `roms.hubris.network → 192.168.8.249:80`
|
|
- [DNS (107)](107-dns.md) — `roms.hubris.network A 192.168.8.175`
|
|
- [Media permissions](../infrastructure/media-permissions.md)
|
|
- [RomM docs](https://docs.romm.app)
|
|
|
|
## Changelog
|
|
|
|
### 2026-07-05 — provisioned
|
|
|
|
LXC 134 created on strong (Debian 13, privileged, `192.168.8.249/28`).
|
|
Docker + Compose installed. RomM stack deployed at `/opt/romm/`.
|
|
Created `/mnt/media_local/roms` with setgid `media:GID=10000` mode `2775`.
|
|
Caddy `roms.hubris.network` → `192.168.8.249:80`.
|
|
DNS `roms A 192.168.8.175` added to Technitium.
|
|
Hubris /32 route for `.249` added to `50-strong-route`. |