Deploy RomM on Pethost in one click
A library and in-browser player for your retro games
What happens
- You sign in to Pethost or make an account, with a passkey, GitHub or Google.
- No machine yet? You pick a plan, and we prepare one for you. The link waits in your browser until it is ready.
- New project opens at the app, and you click Create project.
- In a minute or two the app is live at its own address with HTTPS. Its secrets are made for it at random, and its data is in the nightly backup.
- It is a project like any other: its compose.yaml, its .env, its logs and a terminal are in the panel, and your agent can change it, roll it back or restore it.
First steps
Open the address and go through the setup wizard: pick your platforms, then create the admin account. Do it right away: until then the page is open to whoever has the address. Games go into /romm/library/roms/<platform> in the romm service, for example roms/snes: copy them over SFTP or upload them in RomM, then run a scan. Keys of metadata services, such as IGDB_CLIENT_ID and IGDB_CLIENT_SECRET, go into the project’s .env; deploy again after.
What it runs
The template is this compose.yaml and the variables it writes into the project’s .env. Pethost runs the file as it is written.
services:
romm:
image: rommapp/romm:5
restart: unless-stopped
depends_on:
db:
condition: service_healthy
# Metadata services' keys (IGDB_CLIENT_ID, SCREENSCRAPER_USER, ...) go into .env.
env_file: .env
environment:
ROMM_BASE_URL: ${URL}
ROMM_AUTH_SECRET_KEY: ${ROMM_AUTH_SECRET_KEY}
# TLS ends at the machine's proxy, which says so in X-Forwarded-Proto.
ROMM_SESSION_SECURE_COOKIE: "true"
DB_HOST: db
DB_NAME: romm
DB_USER: romm
DB_PASSWD: ${DB_PASSWORD}
# Matches games by their files' hashes, with no key, as RomM's own compose file does.
HASHEOUS_API_ENABLED: "true"
# Four API workers by default; two are plenty for a household and leave memory to the
# machine's other projects.
WEB_SERVER_CONCURRENCY: "2"
# The image declares /romm a volume: the library, assets, resources and config are in it.
volumes:
- romm:/romm
- redis-data:/redis-data
# The page answers once the first start's migrations are done.
healthcheck:
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:8080/api/heartbeat"]
interval: 10s
timeout: 5s
retries: 5
start_period: 180s
db:
image: mariadb:11.8
restart: unless-stopped
environment:
MARIADB_DATABASE: romm
MARIADB_USER: romm
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 5s
retries: 12
start_period: 60s
volumes:
romm:
redis-data:
db: