Environment variables
For a seed-managed installation, use the seed inputs. Manage registration, release channels, host policy, the library and stored secrets in the admin UI.
The other sections are process settings for a legacy Compose
install or a source checkout, set in
deploy/.env.
Many node agent settings can also be set per host in Admin ▸ Fleet ▸ Hosts ▸ Settings. Precedence: per-host override, then agent environment, then default.
This is the practical subset. The full list is docs/configuration.md in the repository.
Seed inputs
Section titled “Seed inputs”Read once, on a clean machine. Afterwards the machine’s own state wins, so you can remove the enrollment string from the stack. See Install with Docker.
| Variable | Default | Purpose |
|---|---|---|
QUASAR_ROLE |
gpu |
gpu, combined or control-only. |
QUASAR_ENROLLMENT |
required on a GPU host | The single-use qenr1.… string from Fleet ▸ Hosts ▸ Add host. Stored as a secret file. |
QUASAR_HOME_ROOT |
required with an agent | Host path of the home root, mounted at the same path in the agent. If set on a control-only machine, every GPU host must use it. |
QUASAR_TEMPLATE_ROOT |
templates beside the home root |
Host path of the template root. |
QUASAR_NODE_NAME |
the host name | The agent’s node name. Must match a name bound into the enrollment string. |
QUASAR_AGENT_IMAGE |
required with an agent | The node-agent image: a tag (…/quasar-node-agent:latest, pinned to its digest at install) or repository@sha256:<digest>. On a control-only machine, optional: the agent Add host installs when no release names one. |
QUASAR_APP_PUID, QUASAR_APP_PGID |
the image’s user | Owner of game and save data (Unraid: 99 and 100). |
QUASAR_CONTAINER_NETWORK |
none |
App container network: none, bridge or host. |
On the first machine (combined or control-only), also:
| Variable | Default | Purpose |
|---|---|---|
QUASAR_CONTROL_PLANE_IMAGE |
required | The control-plane image: a tag (pinned at install) or repository@sha256:<digest>. |
QUASAR_PUBLIC_HOST |
unset; set it | The console’s name or LAN address. The certificate names it. |
QUASAR_TLS_HOSTS |
unset | More certificate names, comma-separated. |
QUASAR_TRUSTED_PROXIES |
unset | Reverse proxies in front of the console. First-run setup and sign-in through a proxy on the HTTP port need it. /0 or a malformed entry refuses the install. |
QUASAR_HSTS_MAX_AGE |
unset (off) | Seconds of HSTS on the HTTPS listener. Read HSTS first. |
QUASAR_HTTP_PORT, QUASAR_TLS_PORT |
8080, 8443 |
Host ports for HTTP (agents, /health) and HTTPS (console). |
QUASAR_POSTGRES_IMAGE |
built in | Quasar’s own Postgres, by tag (pinned at install) or digest. Created once, never updated. |
QUASAR_DATABASE_HOST |
unset | Use your own database instead of creating one. |
QUASAR_DATABASE_PORT, QUASAR_DATABASE_USER, QUASAR_DATABASE_NAME |
5432, quasar, quasar |
Your database’s connection. |
QUASAR_DATABASE_SSLMODE |
disable |
Use require or verify-full for a remote database. |
QUASAR_DATABASE_PASSWORD |
required with QUASAR_DATABASE_HOST |
Take it from the stack’s .env. Read only at install. |
QUASAR_AWAIT_RESTORE |
unset | 1 holds the new control plane until you load a Compose dump. Quasar’s own database only. See Move a Compose install. |
QUASAR_ENROLL_SEED_IMAGE, QUASAR_ENROLL_AGENT_IMAGE |
the installed release’s | Overrides the images Add host installs, by tag (pinned at install) or digest. |
The seed also needs two mounts: the engine socket, and the quasar-machine volume
read-only at /var/lib/quasar-machine.
The recovery actor’s trust settings
Section titled “The recovery actor’s trust settings”Also seed inputs.
| Variable | Default | Purpose |
|---|---|---|
QUASAR_UPDATER_ALLOWED_NAMESPACES |
ghcr.io/accreleus/quasar |
Registry namespaces platform images may come from, comma-separated. Blank means the default. The first machine also checks developer applies against it. |
QUASAR_UPDATER_SIGNATURE_MODE |
off |
off, verify or require. See Release signatures. |
QUASAR_UPDATER_TRUSTED_KEYS |
none | <key-id>:<base64 public key>, comma-separated. |
QUASAR_UPDATER_MANIFEST_BASE_URL |
the project’s GitHub Releases | Where signatures are fetched from. |
QUASAR_UPDATER_MANIFEST_TIMEOUT_S |
15 |
Timeout for that fetch. |
QUASAR_PLATFORM_INSECURE_REGISTRIES |
unset | First machine: plain-HTTP registries allowed for a developer apply. |
Agent variables
Section titled “Agent variables”Also seed inputs, on a GPU or combined host. These are the node agent’s own settings. The most common one:
| Variable | Default | Purpose |
|---|---|---|
QUASAR_APP_MOUNT_ALLOW |
unset | Host folders apps may bind besides the home root, comma-separated. Read-only unless an entry ends :rw, e.g. /mnt/games,/mnt/saves:rw. |
Most QUASAR_* node-agent settings in the sections below work here too, such
as QUASAR_ENCODER and the ABR knobs. The full list is “Agent variables” in
docs/configuration.md. A setting the install manages, like the render node or
the enrollment file, is refused.
To change an input later:
docker exec -it quasar-recovery quasar-recovery reconfigure --yes QUASAR_UPDATER_SIGNATURE_MODE=verifyreconfigure accepts the trust settings, QUASAR_HOME_ROOT,
QUASAR_TEMPLATE_ROOT, QUASAR_APP_PUID, QUASAR_APP_PGID,
QUASAR_CONTAINER_NETWORK, the agent variables, and on the first machine
QUASAR_PUBLIC_HOST, QUASAR_TLS_HOSTS, QUASAR_TRUSTED_PROXIES, QUASAR_HSTS_MAX_AGE, the ports and
the Add host images. An empty value (QUASAR_APP_MOUNT_ALLOW=) removes a setting.
It replaces the affected services and rolls back if they don’t verify. Database
inputs and the node name need a reinstall.
Changing QUASAR_HOME_ROOT doesn’t move saves. Move the old root’s contents
into the new root first, or players start with fresh homes. It worked when the
host’s Settings show the new root as verified and an existing save loads.
Required on a legacy Compose install
Section titled “Required on a legacy Compose install”| Variable | Notes |
|---|---|
DATABASE_URL |
Postgres connection string. |
CONTROL_PLANE_URL |
Agent side. WebSocket URL of the control plane. |
POSTGRES_PASSWORD |
Compose. Generated on a fresh install. |
redeploy.sh generates missing secrets and never overwrites existing ones.
Hosts join with a QUASAR_ENROLLMENT string from Add host, or with
ENROLLMENT_TOKEN set to a token minted there (the part of the string after
its last .).
Setup and identity
Section titled “Setup and identity”| Variable | Default | Purpose |
|---|---|---|
BOOTSTRAP_ADMIN_EMAIL |
unset | Creates the first admin at boot. Idempotent. |
BOOTSTRAP_ADMIN_USERNAME |
unset | With the above. |
BOOTSTRAP_ADMIN_PASSWORD |
unset | With the above. Set all three or none. |
REGISTRATION_MODE |
closed |
Initial registration mode for a fresh database. The admin UI wins afterwards. |
PUBLIC_BASE_URL |
unset | Public URL for invite links and signaling. Set it when a proxy rewrites Host. |
NODE_NAME |
hostname | Agent side. Stable identity for this host. |
QUASAR_ENROLLMENT |
unset | Agent side. The Add host string: control-plane address, pinned fingerprint and a single-use token (1 hour by default, up to 30 days). CONTROL_PLANE_URL / ENROLLMENT_TOKEN override its parts. |
Secrets
Section titled “Secrets”| Variable | Default | Purpose |
|---|---|---|
QUASAR_SECRET_KEY |
unset | Base64 of 32 bytes. Encrypts credentials stored in the admin UI. Back it up; it can’t be recovered. |
QUASAR_SECRET_KEY_PREVIOUS |
unset | Comma-separated decrypt-only predecessor keys (<version>:<base64>). Rotate with QUASAR_SECRET_KEY=2:<new-base64> and keep the old key here as 1:<old-base64>; rows written under it keep decrypting while new writes use the new one. |
TLS and access
Section titled “TLS and access”| Variable | Default | Purpose |
|---|---|---|
QUASAR_TLS |
auto |
auto or off. |
QUASAR_TLS_ADDR |
:8443 |
HTTPS listener. |
QUASAR_TLS_HOSTS |
unset | Names and IPs for the generated certificate. Required for LAN access. |
QUASAR_TLS_CERT |
unset | Your own certificate. Set with the key or not at all. |
QUASAR_TLS_KEY |
unset | Your own key. |
QUASAR_TLS_DIR |
/var/lib/quasar-control/tls |
Where the generated certificate is kept. |
QUASAR_HTTP_REDIRECT |
auto |
Redirect browser routes from HTTP to HTTPS. |
QUASAR_ALLOWED_ORIGINS |
unset | Overrides the allowed-origins list in Admin (even when empty). Unset: Admin manages it; with no list, same-origin only. * is rejected. |
QUASAR_TRUSTED_PROXIES |
unset | Proxy IPs or CIDRs whose forwarded client address and protocol are trusted. First-run setup and sign-in through a proxy on the HTTP port need it. |
LISTEN_ADDR |
:8080 |
HTTP listener. |
CONTROL_PORT |
8080 |
Compose. Host port for HTTP. |
QUASAR_TLS_PORT |
8443 |
Compose. Host port for HTTPS. |
QUASAR_COMPRESSION |
true |
gzip compression of text responses. Set false only behind a compressing reverse proxy. |
QUASAR_ACCESS_LOG |
errors |
off, errors or all: which requests get one log line. true/false map to all/off. |
CONTROL_PLANE_FINGERPRINT |
unset | Agent side. Manual certificate pin (SHA-256), overriding the one in QUASAR_ENROLLMENT. |
QUASAR_ALLOW_PLAINTEXT_AGENT |
off | Agent side. 1 allows a ws:// control-plane URL to a non-localhost address. |
Storage
Section titled “Storage”| Variable | Default | Purpose |
|---|---|---|
QUASAR_HOME_ROOT |
unset | Fallback managed-home root. Without any root, managed-home apps can’t launch. redeploy.sh sets /var/lib/quasar/homes. |
QUASAR_HOMES_GC |
1 (on) |
Agent. Sweep throwaway homes (agent- + 8 hex + - + 8 hex) past retention so the home root doesn’t fill the disk. 0 disables; inert with no home root. |
QUASAR_HOMES_GC_RETENTION_HOURS |
72 |
Hours a throwaway home must be idle before it’s collectable. |
QUASAR_HOMES_GC_DRY_RUN |
0 (off) |
1 logs what would be deleted, removes nothing. |
QUASAR_STORAGE_PROVIDER |
auto |
auto or local (mount-path storage). volume is rejected. |
QUASAR_ARTWORK_DIR |
/var/lib/quasar-control/artwork |
Artwork cache. Needs a persistent volume. |
QUASAR_ARTWORK_PROVIDER |
steamgriddb |
steamgriddb or none. |
QUASAR_STEAMGRIDDB_API_KEY |
unset | Or set it in the admin UI, which wins. |
Encoding
Section titled “Encoding”| Variable | Default | Purpose |
|---|---|---|
QUASAR_ENCODER |
auto | AMD and NVIDIA use vulkan, Intel va, no GPU openh264. Set va, nvenc, vulkan or openh264 to override. |
QUASAR_RENDER_NODE |
software |
Pin a DRM render node. Prefer a /dev/dri/by-path/ path; leave software for the SW path. |
QUASAR_NVIDIA_DRIVER_HOST_PATH |
automatic | Recovery override: the host directory already mounted at /opt/quasar/nvidia-driver in the agent. It doesn’t create the mount. Custom stacks without container identity also need QUASAR_PULSE_IMAGE. Recreate the agent after changing it. |
QUASAR_CUDA_DEVICE |
0 |
NVENC device index on a multi-GPU host. |
QUASAR_ZEROCOPY |
off | Full zero-copy on the VA path. |
QUASAR_GOP |
60 |
Frames between keyframes. |
QUASAR_SLICES |
8 |
H.264 slices per frame. |
QUASAR_TARGET_USAGE |
6 |
VA speed against quality, 1 to 7. |
QUASAR_QUEUE_BUFFERS |
3 |
Encode queue depth. |
QUASAR_VULKAN_H264 |
on | 0 moves H.264 off Vulkan when a vendor fallback exists. |
QUASAR_VULKAN_HEVC |
on | 0 moves HEVC off Vulkan when a vendor fallback exists. |
QUASAR_VULKAN_AV1 |
on | 0 moves AV1 off Vulkan when a vendor fallback exists. Doesn’t bypass a driver restriction. |
QUASAR_VULKAN_MAX_SESSIONS |
2 |
Concurrent Vulkan encode sessions per GPU. |
QUASAR_REQUIRE_HW_RENDER |
1 |
Fail a session that falls back to software rendering. |
Adaptive bitrate
Section titled “Adaptive bitrate”| Variable | Default | Purpose |
|---|---|---|
QUASAR_ABR_MODE |
smooth |
smooth, protective or off. |
QUASAR_ABR |
1 |
Legacy switch. 0 means off. |
QUASAR_ABR_FLOOR_KBPS |
unset | Explicit floor. |
QUASAR_ABR_FLOOR_RATIO |
0.3 |
Floor as a fraction of the tier bitrate. |
QUASAR_ABR_LADDER |
on in smooth |
Encoder speed escalation under saturation. |
QUASAR_ABR_LADDER_RESOLUTION |
off | Opt-in resolution step-down. Needs smooth; applies to the next session. |
QUASAR_ABR_LADDER_FPS |
off | Opt-in 120-to-60 fps step-down. Needs smooth; applies to the next session. |
About fifteen more tuning settings exist; leave them unless you’ve measured a problem.
Capacity and placement
Section titled “Capacity and placement”| Variable | Default | Purpose |
|---|---|---|
QUASAR_VRAM_MIN_FREE_MB |
1024 |
Free GPU memory needed to admit a launch. 0 disables the check. |
QUASAR_VRAM_INFLIGHT_ESTIMATE_MB |
the floor | Memory reserved for very recent launches. |
QUASAR_VRAM_STALENESS_SECS |
20 |
Maximum age of a memory sample. |
QUASAR_PLACEMENT_POLICY |
spread |
spread, least-loaded or locality. |
Apps and containers
Section titled “Apps and containers”| Variable | Default | Purpose |
|---|---|---|
QUASAR_APP_DISPLAY_ENV |
on | Pass session resolution and frame rate to app containers. |
QUASAR_APP_GAMESCOPE_ENV |
on | Also pass the gamescope variables. |
QUASAR_APP_SHM_SIZE |
1g |
Shared memory for app containers. |
QUASAR_APP_STOP_TIMEOUT_SECS |
10 |
Graceful stop window. |
QUASAR_APP_PUID |
unset | Run apps as this user ID. |
QUASAR_APP_PGID |
unset | Run apps as this group ID. |
QUASAR_APP_PIDS_LIMIT |
8192 |
Process limit. |
QUASAR_IDLE_TIMEOUT_SECS |
120 |
End idle sessions after this long. |
QUASAR_CONSOLE_DISCONNECT_GRACE |
unset (never; 10 min for a monitor read as off) | Control plane. Stop an auto-started console session once its display connector has been absent this long (a Go duration; 0 stops at once). Unset, an absent connector never stops it, but a monitor still connected that the agent reads as off over DDC/CI stops it after 10 minutes. |
Audio and microphone
Section titled “Audio and microphone”| Variable | Default | Purpose |
|---|---|---|
QUASAR_AUDIO_REQUIRED |
off | Fail the session instead of running silently. Recommended. |
QUASAR_MIC_DISABLED |
off | Turn the microphone off for this host. |
Libraries and images
Section titled “Libraries and images”| Variable | Default | Purpose |
|---|---|---|
QUASAR_LIBRARY_SCAN_INTERVAL |
unset | Library discovery interval when set, as a Go duration (360m, 6h); the admin setting wins when unset. 0 disables discovery entirely; a bare number fails startup. |
QUASAR_LIBRARY_PROVIDERS |
steam |
Allowed providers. |
QUASAR_IMAGE_REGISTRY_HOSTS |
ghcr.io |
Registries Quasar resolves images and artwork from. |
QUASAR_IMAGE_CATALOG_REPO |
accreleus/quasar-images |
owner/name of the GitHub repo app-image sync fetches the manifest from; point it at a fork or mirror. |
QUASAR_IMAGE_CATALOG_PATH |
quasar-manifest.json |
The manifest’s path within that repo. |
QUASAR_ARTWORK_MAX_BYTES |
8388608 |
Maximum artwork size (8 MiB). |
Updates and releases
Section titled “Updates and releases”On an owned install, see the trust settings above; it detects releases from the project’s repository with no token. A legacy Compose install’s updater is described in Legacy Compose installs.
Release detection on a legacy Compose or source control plane:
| Variable | Default | Purpose |
|---|---|---|
QUASAR_PLATFORM_RELEASE_REPO |
accreleus/quasar |
GitHub repository (owner/name) to read releases from; a fork works. off disables detection (empty means the default). |
QUASAR_PLATFORM_RELEASE_TOKEN |
unset | Optional GitHub token, for a private fork or higher rate limits. Never logged. |
QUASAR_PLATFORM_RELEASE_ASSET_HOSTS |
github.com,objects.githubusercontent.com,release-assets.githubusercontent.com |
Hosts release assets may download from. If you see “redirect host is not allowed”, add the host the job names. |
QUASAR_PLATFORM_REGISTRY |
ghcr.io |
Registry for platform images on the edge channel. Added to QUASAR_IMAGE_REGISTRY_HOSTS automatically. Anonymous pull only. |
QUASAR_PLATFORM_RELEASE_DETECT_INTERVAL |
168h |
Overrides the detection schedule (weekly, Monday 02:00 UTC) as a Go duration. 0 stops scheduling. “Check now” always works. |
The release channel is set on the Releases tab, not here. See Updating Quasar.
Experimental
Section titled “Experimental”See Experimental options before enabling these.
| Variable | Default | Purpose |
|---|---|---|
QUASAR_FEC_MODE |
derived | off, fixed or auto. Not recommended for browsers. |
QUASAR_FEC_PERCENTAGE |
0 |
Redundancy percentage. |
QUASAR_INTRA_REFRESH |
0 |
Vulkan only, patched image only. |
QUASAR_INTRA_REFRESH_PERIOD |
0 |
60 is the validated value. |
The host sysctl
Section titled “The host sysctl”Recommended on every host that serves media: the UDP send buffer.