Skip to content

Container List

Below is a list of all currently implemented containers.

Have one you want to add? Submit an Issue or Pull Request!

The container map controls which containers are enabled, if they are accessible via Traefik, protected by Authentik, integrated with Homepage, and the proxy rule used to access the container if behind Traefik.

By default, the container map is in inventory/group_vars/all/container_map.yml

If both Jellyfin and Emby are enabled, then Emby will be available on ports 8097 and 8921 (if ports are being exposed for both Jellyfin and Emby)

Service Name Enabled by Default Container Name Host Port (if enabled) Container Port Accessible via Traefik Homepage Integration
Watchtower watchtower
Plex plex 32400 32400
Sonarr sonarr 8989 8989
Sonarr (Separate 4K instance) sonarr-4k 8990 8989
Radarr radarr 7878 7878
Radarr (Separate 4K instance) radarr-4k 7879 7878
Prowlarr prowlarr 9696 9696
Overseerr overseerr 5055 5055
Jellyseerr jellyseerr 5056 5055
Seerr seerr 5055 5055
Requestrr requestrr 4545 4545
Transmission UI Proxy transmission-proxy 8081 8080
Transmission (HTTP Proxy) transmission 8888 8888
Transmission (RPC) transmission 9091 9091
Portainer portainer 9000 9000
Bazarr bazarr 6767 6767
Tautulli tautulli 8181 8181
Traefik traefik 80, 8080, 443 80, 8080, 443
Nzbget nzbget 6789 6789
Sabnzbd sabnzbd 8082 8080
Authentik authentik-server 9001, 9443 9000, 9443
Tdarr tdarr 8265, 8266 8265, 8266
HomePage homepage 3000 3000
Flaresolverr flaresolverr 8191 8191
Uptime Kuma uptime-kuma 3001 3001
Heimdall heimdall 8000, 8443 80, 443
Kavita kavita 5000 5000
Calibre calibre 8083, 8182, 8084 8080, 8181, 8081
Jellyfin jellyfin 8096, 8920, 7359 8096, 8920, 7359
Emby emby 8096, 8920 8096, 8920
Maintainerr maintainerr 6246 6246
Lidarr lidarr 8686 8686
Librariarr librariarr 3100 3000
Autobrr autobrr 7474 7474
Notifiarr notifiarr 5454 5454
Speedtest-Tracker speedtest 8090, 8444 80, 443
tinyMediaManager tmm 5900, 4000 5900, 4000
PASTA pasta 8085 80
Wizarr wizarr 5690 5690
qBittorrent qbittorrent 8086 8086
qBittorrent (HTTP Proxy) qbittorrent 8118 8118
Deluge deluge 8112 8112
Deluge (HTTP Proxy) deluge 8119 8118
Tubearchivist tubearchivist 8001 8001
Pinchflat pinchflat 8945 8945
Checkrr checkrr 8585 8585
Backrest backrest 9898 9898
Cleanuparr cleanuparr 11011 11011
Fileflows fileflows 19200 5000
Unmanic unmanic 8889 8888
Dispatcharr dispatcharr 9191 9191
Cloudflare Tunnel cloudflare-tunnel
Tailscale tailscale
Tracearr tracearr 3002 3000
Cross-Seed cross-seed 2468 2468
n8n n8n 5678 5678
Dockhand dockhand 3003 3000
Scrutiny scrutiny 8087 8080
Beszel beszel 8091 8090
Byparr byparr 8192 8191

Here is an example of a container map entry for Sonarr:

...
sonarr: # <-- Do **NOT** modify this value, this is the "key"
authentik: false # If container should be protected by Authentik
authentik_provider_type: proxy # (This does not exist on a majority of containers) The type of integration with Authentik. Only required to set to `oauth2` if you know it's OAuth2, otherwise `proxy` is the default
directory: true # Do **NOT** modify, controls if a container "app" folder is created
enabled: true # Enables or disables the container named above
expose_ports: false # If the container ports should be open on the host
expose_to_public: false # If the container should be exposed to public (0.0.0.0/0) traffic through Traefik IP allowlist rules
homepage: true # If the integration with the Homepage container should be enabled
homepage_stats: false # Enables advanced stats for the container within Homepage (CPU, RAM, RX/TX)
proxy_host_rule: sonarr # The subdomain that will route to the container
traefik: true # If container should be accessible via Traefik
...

If you’d like to have a container added, please submit a Discussion post or a Pull Request!

If wanting to submit a pull request, the following Compose file settings are typically used across all containers. The below is an example Jinja2 template, which is how all of the container .yml files are generated

A list of the locations where items will need to be updated:

  1. This documentation (docs-astro/src/content/docs/container-list.mdx)

  2. roles/hmsdocker/defaults/main/container_map.yml

  3. roles/hmsdocker/templates/containers/ will store the compose template file (example below) with the naming format of <container name>.yml.j2

  4. Any additional container-specific configuration in roles/hmsdocker/defaults/main/service_misc.yml

  5. Any API keys/secrets in roles/hmsdocker/templates/env.j2

    a. If API keys need to be read from a file to auto-populate the .env, there is a task file in roles/hmsdocker/tasks/app_api_key_reader.yml that retrieves the keys from the file

  6. If any tasks/prerequisits need to be ran before the container starts, create a <container name>.yml Ansible task file in roles/hmsdocker/tasks/container_prereqs/

  7. If any tasks need to be ran after the container starts, create a <container name>.yml Ansible task file in roles/hmsdocker/tasks/container_postreqs/

  8. If the container needs to be restarted after any config changes, create a new handler task in roles/hmsdocker/handlers/main.yml

roles/hmsdocker/templates/containers/container_name.yml
services:
<container name>:
image: <container image>
container_name: <container name>
restart: ${RESTART_POLICY}
# Some containers do not work with this (e.g. anything that needs to escalate privileges
# at runtime). If so, leave it commented out with a note explaining why, as done in
# `tdarr.yml.j2` and `fileflows.yml.j2`
security_opt:
- no-new-privileges:true
logging:
options:
max-size: "12m"
max-file: "5"
driver: json-file
# Depends on the network access it needs, proxy_net is required for Traefik
networks:
- proxy_net
{% if '<container name>' in expose_ports_enabled_containers %}
# Check the container map to see if any existing containers will cause an overlap
# If so, the host port (left side) will need to be changed to no longer overlap
ports:
- <container UI port>:<container UI port>
{% endif %}
environment:
# Some containers may not support using the PUID/PGID environment variables
# If so, add the `user: ${PUID}:${PGID}` compose setting
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TIMEZONE}
volumes:
- ${HMSD_APPS_PATH}/<container name>/config:/config
# If the container needs access to your media data, add the below
- ${HMSD_MOUNT_PATH}:/data
{% if '<container name>' in traefik_enabled_containers or '<container name>' in homepage_enabled_containers %}
labels:
{% if '<container name>' in traefik_enabled_containers %}
- traefik.enable=true
- traefik.http.services.<container name>-${COMPOSE_PROJECT}.loadbalancer.server.port=<container UI port>
- traefik.http.routers.<container name>-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['<container name>']['proxy_host_rule'] | default('<container name>') }}.${HMSD_DOMAIN}`)
- traefik.http.routers.<container name>-${COMPOSE_PROJECT}.middlewares={{ 'external' if '<container name>' in expose_public_enabled_containers else 'internal' }}-{{ 'secured' if traefik_security_hardening else 'ipallowlist' }}@file{{ ',authentik-proxy-${COMPOSE_PROJECT}-<container name>-midware@docker' if '<container name>' in authentik_enabled_containers }}
{% endif %}
# Below is only for Homepage
{% if '<container name>' in homepage_enabled_containers %}
- homepage.group=<Homepage group name>
- homepage.name=<container name>
- homepage.icon=<container name>.png
- homepage.href=http://{{ hms_docker_container_map['<container name>']['proxy_host_rule'] | default('<container name>') }}.${HMSD_DOMAIN}
- homepage.description=<homepage description>
# If the container supports a widget, there is an additional task that runs to "slurp" the API key from a file automatically (if supported) in `tasks/app_api_key_reader.yml` that is then inserted into the `.env` file template
- homepage.widget.type=<container name>
- homepage.widget.url=http://<container name>:<container UI port>
- homepage.widget.key=${<CONTAINER NAME>_KEY:-apikeyapikeyapikey}
{% if '<container name>' in homepage_stats_enabled_containers %}
- homepage.showStats=true
{% endif %}
{% endif %}
{% endif %}
healthcheck:
test: curl -f http://127.0.0.1:<container UI port>/ || exit 1
interval: 5s
timeout: 2s
retries: 3
start_period: 30s