qm-companion

qm-companion

Docker app from lewlewglitch's Repository

Overview

Self-hosted companion for the Quartermaster phone app. It provides service discovery, encrypted setup transfers and an optional Docker dashboard.

Unraid

Community Apps installs Quartermaster Companion as two containers. The socket proxy is kept separate so the main application never mounts the Docker socket.

Install

Open the Unraid terminal and generate two different keys:

printf 'SECRET_KEY='; openssl rand -hex 32
printf 'QM_PROXY_KEY='; openssl rand -hex 32

Keep both values private. SECRET_KEY protects the saved Companion state and must not change during an upgrade. QM_PROXY_KEY authenticates the connection between the two containers.

  1. Install qm-socket-proxy from Apps. Keep that container name, enter the generated QM_PROXY_KEY, and leave Docker writes and Container shell set to 0.
  2. Install qm-companion. Enter the same QM_PROXY_KEY, the separate SECRET_KEY, and the LAN or Tailscale address of the Unraid server in Server address.
  3. Open the Companion Web UI and create the owner account. If the first-run token is requested, open the qm-companion container log in Unraid.

Do not add a host port to qm-socket-proxy. Companion reaches it through an internal Docker link.

This installation supports the web panel and the standard setup transfer. The optional persistent mobile connection on port 8788 needs the manual Docker Compose mobile profile described in Mobile connections.

Unraid creates the default appdata directory for its nobody:users account (99:100), which is also the account used by the Companion template. If a custom directory already exists, make sure that account can write to it before starting the container.

Service config files

Companion can discover supported containers without mounting their appdata. A read-only config file mount lets it also find the service API key. The template includes optional paths for the supported file formats under Advanced View.

Select the config file on the Unraid host and keep the container path supplied by the template. Do not mount an entire appdata parent directory. Duplicate instances can use another matching folder beneath /stack, such as /stack/radarr-4k/config.xml.

Docker access

The default installation is read only. To allow more, edit both containers and keep these settings aligned:

Access available in Companion qm-companion DOCKER_ACCESS_MAX qm-socket-proxy POST qm-socket-proxy EXEC
Status, logs and discovery read 0 0
Container and image management manage 1 0
Management and container shell shell 1 1

After raising the installed maximum, Companion still starts with Read only selected. The owner can change the active mode from Docker access in the web interface.

DOCKER_DEPLOY_BIND_ROOTS controls which host directories Marketplace deployments may mount. Leave it blank to permit named volumes only. Docker management and shell access are host-level permissions, so enable only what is needed.

Reverse proxies

The default Web UI uses plain HTTP and should stay on a trusted private network. When a trusted reverse proxy provides HTTPS, set Trusted reverse proxy to true in the qm-companion template. Keep it false for direct HTTP access.

Media gallery

1 / 3

Install qm-companion on Unraid in a few clicks.

Find qm-companion in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for qm-companion Review the template variables and paths Click Install

Requirements

Install qm-socket-proxy first. Use the same QM_PROXY_KEY in both templates and a separate SECRET_KEY for Companion. The default Docker access level is read only.

Categories

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/lewlew-glitch/qm-companion:latest
Last Updated2026-09-01
First Seen2026-09-01

Runtime arguments

Web UI
http://[IP]:[PORT:8787]
Network
bridge
Shell
sh
Privileged
false
Extra Params
--restart=unless-stopped --read-only --cap-drop=ALL --security-opt=no-new-privileges --tmpfs=/tmp:size=16m,mode=1777 --label=qm.protected=true --user=99:100 --link=qm-socket-proxy:socket-proxy

Template configuration

Web UI portPorttcp

Host port for the Companion web interface.

Target
8787
Default
8787
AppdataPathrw

Persistent encrypted state. Back up this directory and keep the same SECRET_KEY during upgrades.

Target
/data
Default
/mnt/user/appdata/qm-companion
Encryption keyVariable

64 hexadecimal characters used to encrypt saved credentials. Generate it once with openssl rand -hex 32 and keep it for upgrades.

Target
SECRET_KEY
Proxy keyVariable

Key used to authenticate to qm-socket-proxy. Enter the same QM_PROXY_KEY used by the proxy template.

Target
QM_PROXY_KEY
Server addressVariable

LAN or Tailscale address of this Unraid server that the phone can reach. Enter a host only, without a scheme, port or path.

Target
QM_HOST
Away addressVariable

Optional host name or Tailscale address suggested for away routes.

Target
QM_REMOTE_HOST
Docker access limitVariable

Installed maximum: read, manage or shell. Keep read unless the proxy POST and EXEC settings are changed to match.

Target
DOCKER_ACCESS_MAX
Default
read
Bind addressVariable

Listener inside the container. Keep 0.0.0.0 for the Unraid port mapping.

Target
BIND_ADDRESS
Default
0.0.0.0
Docker hostVariable

Internal address of qm-socket-proxy. Do not expose this port on the host.

Target
DOCKER_HOST
Default
tcp://socket-proxy:2375
Trusted reverse proxyVariable

Set true only when the panel is behind a trusted HTTPS reverse proxy.

Target
TRUST_PROXY
Default
false
Marketplace bind rootsVariable

Optional host roots allowed for Marketplace bind mounts. Leave blank to allow named volumes only.

Target
DOCKER_DEPLOY_BIND_ROOTS
Marketplace bind addressVariable

Optional host address used for ports published by Marketplace deployments.

Target
DOCKER_DEPLOY_BIND_ADDRESS
Radarr configPathro

Optional host path to Radarr config.xml.

Target
/stack/radarr/config.xml
Sonarr configPathro

Optional host path to Sonarr config.xml.

Target
/stack/sonarr/config.xml
Lidarr configPathro

Optional host path to Lidarr config.xml.

Target
/stack/lidarr/config.xml
Prowlarr configPathro

Optional host path to Prowlarr config.xml.

Target
/stack/prowlarr/config.xml
Bazarr configPathro

Optional host path to Bazarr config.yaml.

Target
/stack/bazarr/config.yaml
SABnzbd configPathro

Optional host path to SABnzbd sabnzbd.ini.

Target
/stack/sabnzbd/sabnzbd.ini
Jellyseerr configPathro

Optional host path to Jellyseerr settings.json.

Target
/stack/jellyseerr/settings.json
Overseerr configPathro

Optional host path to Overseerr settings.json.

Target
/stack/overseerr/settings.json
Tautulli configPathro

Optional host path to Tautulli config.ini.

Target
/stack/tautulli/config.ini
Jackett configPathro

Optional host path to Jackett ServerConfig.json.

Target
/stack/jackett/ServerConfig.json
NZBHydra2 configPathro

Optional host path to NZBHydra2 nzbhydra.yml.

Target
/stack/nzbhydra2/nzbhydra.yml