Disclaimer: This application has been developed by the Romm community.
RomM (ROM Manager) is a game library manager focused on retro gaming. It enables you to efficiently manage and organize all your games from a web browser.
Inspired by Jellyfin, RomM allows you to handle all your games through a modern interface while enhancing them with IGDB metadata.
- Scan your game library (all at once or by platform) and enrich it with IGDB metadata.
- Access your library via your web browser.
- Easily choose from matching IGDB results if the scan doesn't find the right one.
- Compatible with EmuDeck folder structures.
- Supports games with multiple files.
- Download games directly from your web browser.
- Edit your game files directly from your web browser.
- Upload games directly from your web-browser
- Set a custom cover for each game
- Includes region, revision/version, and extra tags support.
- Works with SQLite or MariaDB.
- Features a responsive design with dark mode support.
Direct install via oci://:
helm install my-paperless oci://harbor.crystalnet.org/charts/romm
install using chartMuseum:
helm repo add crystalnet https://charts.crystalnet.org
helm install my-paperless crystalnet/romm
This chart bootstraps a Romm deployment on a Kubernetes cluster using the Helm package manager.
Join the discussion on RomM's discord server in the helm channel: https://discord.gg/MmR2RBznMp
- Helm 3+
- PV provisioner support in the underlying infrastructure
Kubernetes: >=1.22.0-0
Repository | Name | Version |
---|---|---|
https://charts.bitnami.com/bitnami | mariadb(mariadb) | ~15.2.0 |
https://charts.bitnami.com/bitnami | redis(redis) | ~18.7.0 |
To install the chart with the release name my-release
:
Direct install via oci://:
helm install my-release oci://harbor.crystalnet.org/charts/romm
install using chartMuseum:
helm repo add crystalnet https://charts.crystalnet.org
helm install my-release crystalnet/romm
These commands deploy romm on the Kubernetes cluster in the default configuration. The Parameters section lists the parameters that can be configured during installation.
Tip: List all releases using
helm list
To uninstall/delete the my-release
deployment:
helm delete my-release
The command removes all the Kubernetes components associated with the chart and deletes the release.
Key | Description | Default |
---|---|---|
global.commonLabels |
Labels to apply to all resources. | {} |
global.imagePullSecrets |
Reference to one or more secrets to be used when pulling images (kubernetes.io/docs) | [] |
Key | Description | Default |
---|---|---|
fullnameOverride |
String to fully override common.names.fullname template |
"" |
nameOverride |
String to partially override common.names.fullname template (will maintain the release name) |
"" |
Key | Description | Default |
---|---|---|
image.pullPolicy |
pull policy, if you set tag to latest, this should be set to Always to not end up with stale builds | "IfNotPresent" |
image.repository |
referencing the docker image to use for the deployment | "zurdi15/romm" |
image.tag |
Overrides the image tag whose default is the chart appVersion. | "" |
romm.config.auth.enabled |
enable romm's integrated authentication mechanics (this requires redis to be available) | false |
romm.config.auth.existing_secret |
use an pre-existing secret to provide credentials it should contain the keys romm-user and romm-pass | nil |
romm.config.auth.password |
default password for the admin user | "admin" |
romm.config.auth.username |
default username for the admin user | "admin" |
romm.config.filesystem_watcher.enabled |
enable inotify filesystem watcher mechanics to automatically add new roms and pick up changes as they happen | true |
romm.config.filesystem_watcher.scan_delay |
5 |
|
romm.config.igdb_api.client_id |
setup your igdb api client_id, get one from api-docs.igdb.com/#getting-starte | "CHANGEME_IGDB_CLIENT_ID" |
romm.config.igdb_api.client_secret |
setup your igdb api client_secret, get it from api-docs.igdb.com/#getting-starte | "CHANGEME_IGDB_CLIENT_SECRET" |
romm.config.igdb_api.existing_secret |
use an pre-existing secret to provide credentials it should contain the keys igdb-client-id and igdb-client-secret | nil |
romm.config.scheduled_tasks.filesystem_scan.cron |
Cron expression for the scheduled scan (default: 0 3 * * * - At 3:00 AM every day) | "0 3 * * *" |
romm.config.scheduled_tasks.filesystem_scan.enabled |
true |
|
romm.config.scheduled_tasks.mame_xml_update.cron |
Cron expression to update mame xml database (default: 0 5 * * * - At 5:00 AM every day) | "0 5 * * *" |
romm.config.scheduled_tasks.mame_xml_update.enabled |
true |
|
romm.config.scheduled_tasks.switch_titledb_update.cron |
Cron expression to update switch titledb (default: 0 4 * * * - At 4:00 AM every day) | "0 4 * * *" |
romm.config.scheduled_tasks.switch_titledb_update.enabled |
true |
|
romm.config.steamgriddb_api.api_key |
work in progress and not fully implemented yet | "CHANGEME_STEAMGRIDDB_API_KEY" |
romm.settings.exclude.platforms |
Exclude platforms to be scanned | ["romm"] |
romm.settings.exclude.roms |
Exclude roms or parts of roms to be scanned | See values.yaml |
romm.settings.exclude.roms.multi_file.names |
Exclude matched 'folder' (RomM identifies folders as multi file games) names to be scanned | ["my_multi_file_game","DLC"] |
romm.settings.exclude.roms.multi_file.parts.extensions |
Exclude all files with certain extensions to be scanned from multi file roms | ["txt"] |
romm.settings.exclude.roms.multi_file.parts.names |
Exclude matched file names to be scanned from multi file roms Keep in mind that RomM doesn't scan folders inside multi files games, so there is no need to exclude folders from inside of multi files games. | ["data.xml"] |
romm.settings.exclude.roms.single_file.extensions |
Exclude all files with certain extensions to be scanned | ["xml"] |
romm.settings.exclude.roms.single_file.names |
Exclude matched file names to be scanned | ["info.txt"] |
romm.settings.system.platforms |
use to overwrite romm's expected folder names for platforms with your own custom names | See values.yaml |
Key | Description | Default |
---|---|---|
podSecurityContext.fsGroup |
set filesystem group access to the same as runAsGroup | 1000 |
podSecurityContext.fsGroupChangePolicy |
change fs mount permissions if they are not matching desired fsGroup | "OnRootMismatch" |
podSecurityContext.runAsGroup |
run the deployment as a group with this GID, should match fsGroup above | 1000 |
podSecurityContext.runAsNonRoot |
ensure the container dosnt run with not-needed root permissions | true |
podSecurityContext.runAsUser |
run the deployment as a user with this UID | 1000 |
podSecurityContext.seccompProfile.type |
secure computing mode - see: kubernetes.io/docs | "RuntimeDefault" |
securityContext.allowPrivilegeEscalation |
Controls whether a process can gain more privileges than its parent process | false |
securityContext.capabilities.drop |
drop unneccessary permissions | ["ALL"] |
securityContext.readOnlyRootFilesystem |
mount / as readonly, writeable directorys are explicitely mounted | true |
Key | Description | Default |
---|---|---|
affinity |
define affinity, to have the pod run on the same node as other specific things | {} |
nodeSelector |
Define a subset of worker nodes where the deployment can be scheduled on | {} |
podAnnotations |
If needed, set some annotations to the deployed pods | {} |
resources |
Limit the pods ressources if needed | {} |
tolerations |
setup tolerations if you for example want to have a dedicated worker node that only runs romm | [] |
Key | Description | Default |
---|---|---|
ingress.annotations |
add annotations to the ingress object (for example to have certificates managed by cert-manager) | {"nginx.ingress.kubernetes.io/proxy-body-size":"256m"} |
ingress.className |
uses the default ingress class if not set | "" |
ingress.enabled |
Enable creation of an ingress object for the deployment | false |
ingress.hosts[0] |
Hostname the ingress should react for | {"host":"chart-example.local","paths":[{"path":"/","pathType":"ImplementationSpecific"}]} |
ingress.tls |
[] |
|
service.type |
usually ClusterIP if you have an ingress in place, could also be set to LoadBalancer if for example metallb is in place | "ClusterIP" |
serviceAccount.annotations |
Annotations to add to the service account | {} |
serviceAccount.create |
Specifies whether a service account should be created | true |
serviceAccount.name |
The name of the service account to use. If not set and create is true, a name is generated using the fullname template | "" |
Key | Description | Default |
---|---|---|
persistence.database.enabled |
Enable roms database persistence using PVC . only needed when database backend is sqlite |
true |
persistence.database.volumeClaimSpec.accessModes[0] |
"ReadWriteOnce" |
|
persistence.database.volumeClaimSpec.resources.requests.storage |
"2Gi" |
|
persistence.logs.enabled |
Enable logs persistence using PVC . If false, use emptyDir |
true |
persistence.logs.volumeClaimSpec.accessModes[0] |
"ReadWriteOnce" |
|
persistence.logs.volumeClaimSpec.resources.requests.storage |
"256Mi" |
|
persistence.resources.enabled |
Enable roms metadata (covers) persistence using PVC . If false, use emptyDir |
true |
persistence.resources.volumeClaimSpec.accessModes[0] |
"ReadWriteOnce" |
|
persistence.resources.volumeClaimSpec.resources.requests.storage |
"2Gi" |
Key | Description | Default |
---|---|---|
mariadb.auth.database |
define database schema name that should be available | "romm" |
mariadb.auth.password |
password to connect to the database | "changeme" |
mariadb.auth.rootPassword |
dedicated root password for the database (normally not used but needed for creation of schemas etc.) | "changeme" |
mariadb.auth.username |
username to connect to the database | "romm" |
mariadb.enabled |
provision an instance of the mariadb sub-chart | true |
mariadb.primary.persistence.enabled |
enable to not loose your database contents on updates | false |
romm.config.database.mariadb |
only needed when type is mariadb and mariadb.enabled is set to false meaning you would use an external already existing mariadb instance | See values.yaml |
romm.config.database.mariadb.existing_secret |
use an pre-existing secret to provide credentials it should contain the keys mysql-user and mysql-pass | nil |
romm.config.database.mariadb.host |
hostname where your external mariadb is reachable | "localhost" |
romm.config.database.mariadb.pass |
mariadb password to use for our connection | "password" |
romm.config.database.mariadb.port |
port to connect to | 3306 |
romm.config.database.mariadb.schema |
database schema that holds the romm tables | "romm" |
romm.config.database.mariadb.user |
mariadb user to use for our connection | "romm-user" |
romm.config.database.type |
type can either be mariadb or sqlite | "sqlite" |
Key | Description | Default |
---|---|---|
redis.architecture |
can be set to replication to spawn a full redis cluster with 3 nodes instead | "standalone" |
redis.auth.enabled |
enable redis authentication mode | true |
redis.auth.password |
password that gets used for the connection between romm and redis | "changeme" |
redis.enabled |
provision an instance of the redis sub-chart | true |
redis.redisPort |
default port for redis to listen on | 6379 |
Key | Description | Default |
---|---|---|
mediaVolume |
The list of additional volumes that will be mounted inside romm pod, this one to /romm/library . |
See values.yaml |
Specify each parameter using the --set key=value[,key=value]
argument to helm install
. For example,
helm install my-release --set fullnameOverride=my-romm oci://harbor.crystalnet.org/charts/romm
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
helm install my-release -f values.yaml oci://harbor.crystalnet.org/charts/romm
Tip: You can use the default values.yaml
Licensed under the GNU General Public License v3.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
https://github.com/zurdi15/romm/blob/release/LICENSE
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.