- Jinja 58.1%
- Shell 32.6%
- Python 9.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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> |
||
| .forgejo/workflows | ||
| .vibe | ||
| docs | ||
| files | ||
| handlers | ||
| tasks | ||
| templates | ||
| tests | ||
| .clinerules | ||
| .cursorrules | ||
| .windsurfrules | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| GEMINI.md | ||
| iac.json | ||
| README.md | ||
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.