# 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`.