No description
  • Jinja 58.1%
  • Shell 32.6%
  • Python 9.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Kevin Heyer 2f827cc181
Some checks failed
/ lint (push) Successful in 9s
/ image (push) Failing after 12m35s
/ publish (push) Has been skipped
Add the app romm
RomM built from the release tag (verified against the tag commit of
the GitHub API), following docker/Dockerfile of the release and taking
every pin from it: Node.js major, Python 3.14 and uv version, RAHasher
and nginx mod_zip commits, sha256 of rom-converto and of the browser
players (EmulatorJS, Ruffle, js-dos, FAKE-08, EasyRPG). nginx and njs of
Debian with mod_zip built for the installed nginx instead of Angie from
a vendor repository. MariaDB and Valkey as modules, five sandboxed
services as user romm, first administrator "admin" with a generated
password while no administrator exists.

adopt.sh takes over installations of the community script ct/romm.sh in
place: database (dumped first), library and secret key stay, own .env
values go to romm.local.env, Angie and the old services are disabled,
/opt/romm moves to /opt/romm.pre-iac; resumable after an abort.

Tested: check-app.sh green (lint, template files, dev container twice,
second run changed=1); systemd-analyze security 1.3 for all units;
scan of test ROMs, single download via X-Accel byte-identical,
multi-disc download as zip with m3u through mod_zip and njs, COOP/COEP
headers for the players. Adopt of a community-like RomM 5.3.1 (Angie,
redis-server, root services, admin user, a ROM): 5.4.0 afterwards, the
old admin logs in with the old password, secret key kept, DB dump in
/var/backups/iac, smoke green, update run changed=1, a second adopt is
refused. Peak disk use of a build 2.5 GiB. Not tested: VM image and
boot test (CI), a real community-script guest on Proxmox.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:04:04 +02:00
.forgejo/workflows Add the app romm 2026-10-22 22:04:04 +02:00
.vibe Add the app romm 2026-10-22 22:04:04 +02:00
docs Add the app romm 2026-10-22 22:04:04 +02:00
files Add the app romm 2026-10-22 22:04:04 +02:00
handlers Add the app romm 2026-10-22 22:04:04 +02:00
tasks Add the app romm 2026-10-22 22:04:04 +02:00
templates Add the app romm 2026-10-22 22:04:04 +02:00
tests Add the app romm 2026-10-22 22:04:04 +02:00
.clinerules Add the app romm 2026-10-22 22:04:04 +02:00
.cursorrules Add the app romm 2026-10-22 22:04:04 +02:00
.windsurfrules Add the app romm 2026-10-22 22:04:04 +02:00
AGENTS.md Add the app romm 2026-10-22 22:04:04 +02:00
CHANGELOG.md Add the app romm 2026-10-22 22:04:04 +02:00
CLAUDE.md Add the app romm 2026-10-22 22:04:04 +02:00
GEMINI.md Add the app romm 2026-10-22 22:04:04 +02:00
iac.json Add the app romm 2026-10-22 22:04:04 +02:00
README.md Add the app romm 2026-10-22 22:04:04 +02:00

iac-romm

RomM – ROM-Verwaltung: scannt die Spielesammlung, holt Metadaten und Cover und spielt Spiele im Browser (EmulatorJS, Ruffle, js-dos, FAKE-08, EasyRPG). Als LXC oder VM auf Proxmox VE (Debian 13). Teil von iac.

Installation (auf der Proxmox-Node)

bash -c "$(curl -fsSL https://iac.heyer.systems/romm/ct.sh)"   # LXC
bash -c "$(curl -fsSL https://iac.heyer.systems/romm/vm.sh)"   # VM

Ohne Dialog: IAC_NONINTERACTIVE=1 und var_*-Variablen – am einfachsten mit dem Generator auf https://iac.heyer.systems/apps/romm/.

Standard: 2 CPU, 4 GiB RAM (der Bau der Web-Oberfläche braucht so viel), 20 GiB Disk. Die Spiele selbst gehören meist auf eine eigene Disk: auf dem Proxmox-Host als Mountpoint /var/lib/romm/library einhängen (z. B. pct set <ID> -mp0 <storage>:<GiB>,mp=/var/lib/romm/library).

Zugang

Web-Oberfläche: http://<ip>/, Anmeldung als admin. Das Passwort erzeugt iac bei der Installation:

grep romm_admin_password /etc/iac/settings.env

Den Einrichtungsassistenten von RomM gibt es deshalb nicht – iac legt den ersten Administrator an, solange es keinen gibt. Ein geändertes Passwort und weitere Benutzer bleiben bei jedem update. Port 80 ist offen; für HTTPS einen Reverse-Proxy davor setzen (z. B. iac-traefik) und in /etc/romm/romm.local.env ROMM_BASE_URL=https://… und ROMM_SESSION_SECURE_COOKIE=true setzen.

Spiele

ROMs gehören nach /var/lib/romm/library/roms/<plattform>/, BIOS-Dateien nach /var/lib/romm/library/bios/<plattform>/ (Ordnernamen der Plattformen: Liste von RomM). Neue Dateien scannt RomM von selbst (romm-watcher), sonst in der Oberfläche „Scan“. Metadaten brauchen eigene API-Schlüssel (IGDB, ScreenScraper, RetroAchievements …) in /etc/romm/romm.local.env.

Aufbau

RomM veröffentlicht nur Docker-Images, keine fertigen Dateien und keine Prüfsummen. iac baut jede Version im Gast so, wie docker/Dockerfile des Releases es tut, und nimmt alle Pins aus dieser Datei:

Quelle git clone des Release-Tags, geprüft gegen den Commit, den die GitHub-API für den Tag meldet
Web-Oberfläche gebaut mit Node.js (nodejs.org, geprüft gegen SHASUMS256.txt) und npm aus package-lock.json. Node.js wird nach dem Bau gelöscht
Python Python 3.14 von uv (Debian 13 hat 3.13; uv prüft den Download selbst), Pakete aus uv.lock mit Prüfsummen
Werkzeuge RAHasher (RetroAchievements) aus dem gepinnten Commit gebaut, rom-converto mit gepinnter sha256; 7z, bsdtar und node von Debian
Player EmulatorJS, Ruffle, js-dos, FAKE-08 (PICO-8) und EasyRPG mit den sha256 aus dem Dockerfile. Nicht dabei: der Chiptune-Player gme (sein Bau braucht das Emscripten-SDK)
Webserver nginx von Debian mit njs von Debian und mod_zip (Download mehrteiliger Spiele als ZIP), gebaut aus dem Quellcode der installierten nginx-Version und dem gepinnten Commit – neu gebaut, wenn sich eines von beiden ändert
Programm /opt/romm/releases/romm-<version>, aktiv ist der Link /opt/romm/current. Die vorige Version bleibt liegen
Dienste romm (gunicorn auf 127.0.0.1:5000), romm-worker, romm-scan-worker, romm-scheduler, romm-watcher – als User romm in einer systemd-Sandbox, schreiben nur in /var/lib/romm
Datenbank MariaDB (Modul mariadb), Datenbank romm; Warteschlange und Cache in Valkey (Modul valkey)
Daten /var/lib/romm: library (ROMs, BIOS), resources (Cover, Screenshots), assets (Spielstände), config/config.yml, tmp
Einstellungen /etc/romm/romm.env (von iac), eigene Werte in /etc/romm/romm.local.env – alle Umgebungsvariablen von RomM; danach systemctl restart romm romm-worker romm-scan-worker romm-scheduler romm-watcher
Logs journalctl -u romm -u romm-worker -u romm-scan-worker

romm-manage startet Python von RomM mit dessen Einstellungen, z. B. romm-manage -m alembic current.

Update (im Gast)

update

Baut die getestete RomM-Version aus iac.json (Renovate hebt sie nach einem grünen CI-Lauf an, nur innerhalb der Major-Version) – das dauert etwa 15 Minuten, RomM läuft währenddessen weiter. Danach migriert RomM die Datenbank beim Start. Zurück zur vorigen Version (nur ohne Datenbank-Migration dazwischen): ln -sfn /opt/romm/releases/romm-<alt> /opt/romm/current && systemctl restart romm romm-worker romm-scan-worker romm-scheduler romm-watcher.

Bestehende Installation übernehmen

Installationen des Proxmox-VE-Community-Scripts (ct/romm.sh) übernimmt adopt.sh im bestehenden Gast – Datenbank, Spiele, Cover, Spielstände, Benutzer und eigene Einstellungen bleiben. Ablauf und andere Wege: docs/MIGRATION.md.

bash -c "$(curl -fsSL https://iac.heyer.systems/romm/adopt.sh)"

Selbsttest (im Gast)

bash /var/lib/iac/src/core/bin/iac-smoke

Prüft neben Diensten, Port und Health: Web-Oberfläche, gemeldete Version, kein Einrichtungsassistent, Anmeldung als admin mit dem erzeugten Passwort, User romm, mod_zip in nginx, RAHasher, rom-converto und EmulatorJS – ohne Internet.