Repository navigation
Installation and Configuration
This page is the operator reference: every installer option, where Helix puts its files, how to check, repair, upgrade, and remove an install, and every setting in its configuration files. For a quick first install, start with Getting Started.
Caution
Helix is a private-LAN release. The dashboard listens on one private address and serves plain HTTP. Do not bind it to a public address, forward its port, or put it behind a public tunnel.
| Piece | Runs as | What it does |
|---|---|---|
dashboard container (server-dashboard) |
UID 10001, no capabilities |
helixd: the web UI, the API, and Helix's own state |
gateway container (server-dashboard-gateway) |
nginx as UID 101, no capabilities |
The only listener on the LAN port. Checks Host, Origin, client address, method, and body size |
helix-privd.service |
root, on the host, in a systemd sandbox | The host broker: game servers, files, network, packages, power, and updates, through a closed set of typed requests |
helix-terminald@USER.service |
One ordinary Linux user | Optional browser terminal for that user |
helix-finalize-update.service |
root, one-shot | Finishes an in-app Helix update |
Game server containers (helix-game-*) |
Their own numeric users | The games. Independent of the dashboard containers |
- 64-bit Linux (x86_64 or aarch64) with systemd as PID 1. The installer checks only these. Continuous testing covers fresh Ubuntu 22.04 and 24.04.
- Root access (
sudo). - Docker Engine with the Compose v2 plugin, or let the installer add Docker.
- These commands:
ip,getent,groupadd,install,sed,awk,tar,sha256sum,timeout,systemctl, andcurl. The updater needscurltoo. - A private IPv4 address on the server (
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16, or100.64.0.0/10). - About 10 GB of disk and 4 GB of RAM for the first build.
APT-based features (Linux updates, one-click Hook installs) need Debian or Ubuntu. UFW features need UFW.
Run the installer with options after bash -s --:
curl -fsSL https://raw.githubusercontent.com/Riqqqque/Helix/main/scripts/install.sh \
| sudo bash -s -- --storage /mnt/media --open-firewall| Option | Default | What it does |
|---|---|---|
--yes, -y
|
off | Accept every default and answer yes. Required when no terminal is attached, for example in cloud-init |
--version vX.Y.Z |
latest release | Install a specific release. The v is optional |
--source DIR |
none | Install from an existing Helix source tree instead of downloading. For development |
--lan-ip ADDRESS |
detected | The private IPv4 address browsers use. Must be private and assigned to this server |
--cidr NETWORK/BITS |
detected subnet | The client network allowed to open Helix. Must be /8 or narrower |
--port PORT |
3100 |
Dashboard port on the LAN address, from 1024 to 65535 |
--storage DIR |
none | An extra existing folder Helix may browse and manage. Repeat for more folders. /, /etc, /usr, /boot, /proc, /sys, /dev, and /run are refused |
--terminal-user USER |
none | Turn on the browser terminal for an existing non-root login that is not in helix-broker
|
--install-docker |
ask | Install Docker with Docker's official script if it is missing, without asking |
--open-firewall |
ask | Add the UFW rule for the dashboard port without asking, when UFW is active |
--reconfigure |
off | Rewrite /opt/helix/helix.env and /etc/helix/privd.json instead of keeping them |
--new-token |
off | Issue a fresh owner setup token. Only useful before the owner account exists |
--token-file FILE |
Write the owner setup token to FILE (mode 0600) instead of printing it |
| Option | What it does |
|---|---|
--check |
Diagnose an existing install and exit. Makes no changes |
--uninstall |
Remove the Helix services, binaries, and dashboard containers. Keeps game servers, data, and settings |
--purge |
With --uninstall, also delete Helix data, settings, game servers, worlds, and backups after you type DELETE
|
--allow-downgrade |
Build this release even if a newer Helix is already installed |
-h, --help
|
Show the built-in help |
| Variable | Default | What it does |
|---|---|---|
HELIX_REPO |
Riqqqque/Helix |
The GitHub owner/repo the installer downloads releases from |
curl -fsSL https://raw.githubusercontent.com/Riqqqque/Helix/main/scripts/install.sh \
| sudo bash -s -- --yes --install-docker --open-firewall --token-file /root/helix-tokenWith --yes, the installer takes the detected address and subnet. If you know
them, pass --lan-ip and --cidr too.
- Checks the server. Root, Linux, systemd, CPU architecture, required commands.
-
Fetches the release. It reads the latest tag from the GitHub API (or uses
--version), downloadshelix-source-<version>.tar.gzandSHA256SUMS, checks the archive against its checksum, rejects archives with unexpected paths, and unpacks it to/opt/helix/releases/<version>. Then it runs the installer from inside that release, so the installer always matches the files it installs. - Checks Docker and starts the Docker service if it is installed but stopped.
-
Finds the address. It picks the address used for the default route. A
public address is replaced with a private one if the server has one;
otherwise the install stops. The subnet comes from the interface prefix; a
prefix broader than
/16is narrowed to/16. - Checks the port. If another program already listens on it, the install stops.
-
Creates groups and folders:
helix-broker,helix-terminal, and the tree under/srv/helix. - Writes settings (see Configuration reference).
-
Builds the dashboard and gateway images with Docker Compose, and builds
helix-privdandhelix-terminaldin Docker, then copies them to/usr/local/libexec. A changedhelix-privdis kept ashelix-privd.previous. -
Installs units and starts
helix-privd. It waits up to 30 seconds for the broker socket and prints the broker log if it does not appear. -
Issues the owner token with
helixctl setup-tokenif this is the first start, or if you passed--new-token. - Starts the dashboard and gateway and waits until both are healthy.
- Offers a UFW rule allowing your client network to the dashboard port.
-
Checks that
http://<address>:<port>/healthzanswers, then prints the summary.
| Path | Mode | Contents |
|---|---|---|
/opt/helix/helix.env |
0600 root |
Deployment settings for Compose |
/opt/helix/releases/<version>/ |
0755 |
Verified release source the installer downloaded and built |
/etc/helix/privd.json |
0600 root |
Broker configuration |
/etc/helix/amp.json |
0600 root |
Optional AMP credentials |
/usr/local/libexec/helix-privd |
0755 |
Broker binary (helix-privd.previous is the one before it) |
/usr/local/libexec/helix-terminald |
0755 |
Terminal bridge binary |
/etc/systemd/system/helix-privd.service |
0644 |
Broker unit |
/etc/systemd/system/helix-privd.service.d/storage.conf |
0644 |
Extra ReadWritePaths for --storage folders |
/etc/systemd/system/helix-finalize-update.service |
0644 |
In-app update finalizer |
/etc/systemd/system/helix-terminald@.service |
0644 |
Terminal template unit |
/etc/tmpfiles.d/helix.conf |
0644 |
Creates /run/helix, /run/helix/terminal, /run/helix/hook-installs, /var/lib/helix/updates, /var/lib/helix/docker-cleanup
|
/run/helix/privd.sock |
0660 root:helix-broker |
Broker socket |
/run/helix/terminal/terminal.sock |
0660 user:helix-terminal |
Terminal socket, when enabled |
/srv/helix/instances/ |
0750 |
Game server folders |
/srv/helix/backups/ |
0750 |
Game server backups and the backup trash |
/srv/helix/state/instances/ |
0700 |
Server definitions, job records, console history, staged file changes, removed servers, imports |
/srv/helix/state/network/ |
0700 |
Helix-owned firewall rule records |
/srv/helix/dashboard/data/ |
0700 UID 10001 |
Dashboard state: accounts, sessions, preferences, tokens, audit, metrics |
/srv/helix/dashboard/backups/ |
0700 UID 10001 |
helixctl backup-state snapshots |
/var/lib/helix/ |
0700 root |
Broker state: updates, Docker cleanup schedule, recurring reboot records |
/var/lib/helix-hub/ |
root | Machine hub SSH keys |
Inside the dashboard container, /srv/helix/dashboard/data is mounted at
/var/lib/helix, /srv/helix/dashboard/backups at /var/lib/helix-backups,
and /run/helix read-only at /run/helix-host. The host's /var/lib/helix
and the container's /var/lib/helix are different folders.
| Unit | Type | Notes |
|---|---|---|
helix-privd.service |
simple, enabled |
User=root, Group=helix-broker, Restart=on-failure. Sandboxed with ProtectSystem=strict, ProtectHome=read-only, NoNewPrivileges, and explicit ReadWritePaths
|
helix-finalize-update.service |
oneshot | Started by the updater. Runs helix-privd --finalize-pending-update, up to 15 minutes |
helix-terminald@USER.service |
simple | One instance per terminal user. Only accepts the dashboard's UID 10001
|
helix-docker-cleanup.service and .timer
|
created on demand | Written when you save a Docker cleanup schedule |
helix-recurring-reboot.service and .timer
|
created on demand | Written when you save a recurring reboot |
The broker sandbox allows writes to /run/helix, the Docker socket,
/var/lib/helix, /srv/helix, /srv/storage, /srv/amp/instances, /boot,
/etc, /usr, and /var. A leading - makes the optional paths skip cleanly
when they do not exist. The OS paths are there for APT updates, UFW, and
schedules. Removing them makes those features fail instead of half-working.
| Setting | dashboard |
gateway |
|---|---|---|
| Image | helix-dashboard:<version> |
helix-dashboard-gateway:<version> |
| Root filesystem | read-only | read-only |
| Memory / CPU / processes | 128 MiB / 1.0 / 128 | 64 MiB / 0.5 / 64 |
| Network |
helix-private bridge, inter-container traffic off |
Shares the dashboard's network namespace |
| Health check |
helixctl ready every 15 seconds |
GET /gateway-healthz every 15 seconds |
| Restart policy | unless-stopped |
unless-stopped |
| Logs |
json-file, 3 files of 10 MB |
same |
Both drop every Linux capability, set no-new-privileges, and carry a label
that tells Watchtower to leave them alone. The Compose project name is
server-dashboard.
| Listener | Address | Notes |
|---|---|---|
| Dashboard |
HELIX_LAN_BIND_ADDRESS:HELIX_LAN_PORT (default port 3100) |
The only published Helix port. Served by the gateway on port 3000 inside the container |
helixd |
127.0.0.1:8080 inside the dashboard namespace |
Never published. helixd refuses any non-loopback listen address |
| Broker | /run/helix/privd.sock |
Unix socket only, no TCP |
| Game servers | Per server | Published by each game container. See Servers and Marketplace |
The dashboard answers only on the exact LAN address with the matching Host. On
the server itself, http://127.0.0.1:3100 does not answer; use the LAN
address.
sudo bash /opt/helix/releases/<version>/scripts/install.sh --check--check reports, one line each:
- Docker is running;
-
/opt/helix/helix.envand/etc/helix/privd.jsonexist; -
helix-privdis running (with its state, restart count, and last 5 log lines if not); - the broker socket
/run/helix/privd.sockexists; -
server-dashboardandserver-dashboard-gatewayare healthy; - the saved address is still on this server; and
- the dashboard answers
/healthzat the saved address and port.
It exits non-zero when it finds a problem. Any copy of the installer can run
--check, including the one-line command, which skips the download for
--check and --uninstall:
curl -fsSL https://raw.githubusercontent.com/Riqqqque/Helix/main/scripts/install.sh | sudo bash -s -- --checkRe-run the one-line command. It downloads the latest release, rebuilds, reinstalls the units, and starts everything again. It keeps:
-
/opt/helix/helix.envand/etc/helix/privd.json, unless you pass--reconfigure. The group IDs inhelix.envare always refreshed; - the saved address, client network, and port. If the saved address is no
longer on the server, the installer stops and asks for
--reconfigure; - every game server, world, backup, and dashboard account.
--reconfigure writes both files from scratch: pass every --storage folder
again, and any hand edits to privd.json are lost. The AMP credentials line is
added back automatically when /etc/helix/amp.json exists.
Note
After an in-app update, the folder under /opt/helix/releases/ still holds
the version you first installed. Since 1.10.2 the installer refuses to build a
release older than the running dashboard unless you pass --allow-downgrade,
so running an old copy cannot roll Helix back by accident. Use the one-line
command to repair with the latest release.
Use Host → Update Helix in the dashboard. It is covered in Network, Host, and Updates. Re-running the one-line installer also upgrades to the latest release.
sudo bash /opt/helix/releases/<version>/scripts/install.sh --uninstallIt asks for confirmation (default No; --yes skips it), then:
- stops and removes the dashboard and gateway containers;
- disables every
helix-terminald@instance andhelix-privd; - removes the Helix units, the
storage.confdrop-in, the tmpfiles entry, and the binaries in/usr/local/libexec.
It keeps /srv/helix (game servers, worlds, backups, server state, dashboard
data), /opt/helix, /etc/helix, the game server containers, and the two
system groups. Re-installing picks them up again.
--uninstall --purge also removes every helix-game-* container and deletes
/srv/helix, /opt/helix, /etc/helix, and /var/lib/helix. It needs a
terminal and the typed word DELETE; it refuses to run with --yes. This
cannot be undone.
Uninstall also disables and removes the schedules you created in the dashboard
(helix-docker-cleanup.timer and helix-recurring-reboot.timer, with their
services), so they do not keep calling the removed broker. Installers before
1.10.2 left them behind; disable them with systemctl disable --now if you
uninstalled an older version.
The installer automates the private-LAN container deployment. To review or customise each piece, follow the container deployment guide. In short:
-
Build from one exact source revision.
-
Create the
helix-brokerandhelix-terminalgroups (different GIDs). -
Write
/etc/helix/privd.json(root,0600) fromdeploy/privd.example.json, using folders that exist on this host. -
Install the units from
deploy/and the broker binary, then starthelix-privd. -
Copy
.env.exampleto.env(0600) and set every value. -
Create the data and backup folders, owned by
10001:10001, mode0700. Compose will not create them. -
Issue the owner token with the dashboard stopped:
docker compose stop gateway dashboard docker compose run --rm --no-deps --entrypoint /app/bin/helixctl dashboard \ --config /app/config/helix.toml setup-token docker compose up -d --wait
Do not use --remove-orphans, restart Docker globally, or prune shared Docker
objects as part of a Helix deployment.
A dashboard-only package also exists: ./scripts/install-from-source.sh
compiles a checkout and installs helixd on loopback, with no broker, game
servers, or host controls. Its layout is described in
docs/INSTALLATION.md.
Every Helix configuration file rejects unknown keys. A typo stops the service with a parse error instead of being ignored.
The installer writes /opt/helix/helix.env and passes it to Compose with
--env-file. In a manual deployment the same keys live in .env.
| Key | Installer value | Meaning |
|---|---|---|
COMPOSE_PROJECT_NAME |
server-dashboard |
Compose project name |
HELIX_LAN_BIND_ADDRESS |
detected or --lan-ip
|
The one host address the dashboard port is published on |
HELIX_LAN_PORT |
3100 or --port
|
Published dashboard port |
HELIX_BROKER_GID |
GID of helix-broker
|
Added to the dashboard so it can reach the broker socket |
HELIX_TERMINAL_GID |
GID of helix-terminal
|
Added to the dashboard so it can reach the terminal socket |
HELIX_GATEWAY_HOST |
same as the address | The only Host header the gateway accepts |
HELIX_BROWSER_ORIGIN |
http://<address>:<port> |
The only Origin allowed to send POST, PUT, and DELETE |
HELIX_ALLOWED_CLIENT_CIDR |
detected or --cidr
|
Client addresses allowed through the gateway |
HELIX_SECONDARY_GATEWAY_HOST |
unused.invalid |
Second accepted Host. Inert by default |
HELIX_SECONDARY_BROWSER_ORIGIN |
http://unused.invalid |
Second accepted Origin. Inert by default |
HELIX_SECONDARY_ALLOWED_CLIENT_CIDR |
192.0.2.254/32 |
Second client range. Inert by default |
HELIX_DATA_DIR |
/srv/helix/dashboard/data |
Host folder mounted as the dashboard's data folder |
HELIX_BACKUP_DIR |
/srv/helix/dashboard/backups |
Host folder mounted for state snapshots |
Two more keys are read by Compose and set by the installer and updater at build
time, not stored in the file: HELIX_IMAGE_TAG (image tag, the version) and
HELIX_SOURCE_REVISION (recorded build revision).
Never use wildcard Host, Origin, or client range values.
The three HELIX_SECONDARY_* keys let the gateway accept a second exact Host,
Origin, and client range, for an already configured private route such as
Tailscale Serve. The dashboard still listens only on HELIX_LAN_BIND_ADDRESS.
Edit /opt/helix/helix.env, then re-run the installer without
--reconfigure so the gateway is recreated with the new values. Do not trust the whole 100.64.0.0/10 range because one device uses
Tailscale. This route becomes part of your security boundary, so review it
yourself.
The dashboard image ships
deploy/helix-container.toml
at /app/config/helix.toml. The file is limited to 64 KiB.
| Key | Default | Container value | Meaning |
|---|---|---|---|
server.listen |
127.0.0.1:8080 |
127.0.0.1:8080 |
helixd listen address. Must be loopback; remote binds are refused |
paths.data_dir |
/var/lib/helix |
/var/lib/helix |
State folder: state/helix-state.db, metrics/helix-metrics.db, secrets/
|
paths.web_root |
/usr/share/helix/web |
/app/web |
Compiled UI. Must not overlap data_dir
|
helixd and helixctl read settings in this order: built-in defaults, the TOML
file (--config, else HELIX_CONFIG, else /etc/helix/helix.toml if present),
environment variables, then command-line options. These variables are unrelated
to the Compose keys of the same name in helix.env.
| Variable | Meaning |
|---|---|
HELIX_CONFIG |
Path to the TOML file |
HELIX_LISTEN |
Overrides server.listen
|
HELIX_DATA_DIR |
Overrides paths.data_dir
|
HELIX_WEB_ROOT |
Overrides paths.web_root
|
HELIX_PRIVD_SOCKET |
Broker socket. Compose sets /run/helix-host/privd.sock. Without it, host actions, files, and servers are unavailable |
HELIX_TERMINAL_SOCKET |
Terminal socket. Compose sets /run/helix-host/terminal/terminal.sock
|
RUST_LOG |
Log filter. Compose sets helixd=info,tower_http=warn
|
HELIX_LOG_FORMAT |
Set to json for JSON logs |
Compose also sets MALLOC_ARENA_MAX, MALLOC_MMAP_THRESHOLD_, and
MALLOC_TRIM_THRESHOLD_ to keep memory use low after password checks.
helix-privd reads /etc/helix/privd.json (or --config PATH). The file must
be owned by root, have no group or other permissions, be at most 64 KiB, and use
absolute paths. The installer writes:
{
"socket": "/run/helix/privd.sock",
"managed_roots": ["/srv/helix/instances"],
"analysis_roots": ["/"],
"host_control": { "docker_cleanup_state_root": "/var/lib/helix/docker-cleanup" },
"native": {
"state_root": "/srv/helix/state/instances",
"instance_root": "/srv/helix/instances",
"backup_root": "/srv/helix/backups",
"docker_binary": "/usr/bin/docker"
},
"network": { "state_root": "/srv/helix/state/network" }
}Each --storage folder is appended to managed_roots, and
"amp_credentials": "/etc/helix/amp.json" is added when that file exists.
Restart the broker after an edit:
sudo systemctl restart helix-privdRestarting the broker does not stop game servers.
| Key | Required | Default | Meaning |
|---|---|---|---|
socket |
yes | none | Broker socket path. Must match the Compose mount: /run/helix/privd.sock
|
managed_roots |
yes | none | 1 to 32 folders that Files and Storage may browse and change. A root that no longer exists is skipped with a warning; if none exist, the broker stops. A root that is a symlink or otherwise unsafe stops the broker |
analysis_roots |
no | same as managed_roots
|
Up to 32 folders for read-only largest-file analysis. Never writable |
amp_credentials |
no | none | Path to the AMP credentials file. Omit it if you do not use AMP |
native |
no | none | Helix game servers. Without it, server pages report "the Helix server manager is not configured" |
host_control |
no | defaults below | Host, Docker, power, and schedule settings |
network |
no | defaults below | Network and UFW |
packages |
no | defaults below | APT updates |
hook_installer |
no | defaults below | One-click Hook installs |
helix_update |
no | defaults below | In-app Helix updater |
hub |
no | defaults below | Machine hub (SSH probes and power for other machines) |
| Key | Default | Meaning |
|---|---|---|
state_root |
required | Server definitions, jobs.json, console history, staged file changes (pending/), removed servers (server-trash/), imported JARs |
instance_root |
required | Game server folders |
backup_root |
required | Game server backups and the backup trash |
docker_binary |
/usr/bin/docker |
Docker CLI. The installer writes the path it finds |
console_history_max_bytes |
536870912 (512 MiB) |
Console history kept per server. 16 MiB to 32 GiB |
console_history_files |
32 |
Number of rotating console files per server. 2 to 256 |
backup_trash_retention_days |
7 |
Host default for how long deleted backups stay in the trash before Helix empties it. 0 keeps them until you delete them. At most 365. Each server can override it |
custom_artifact_roots |
every managed root that is a real folder below /
|
Folders a custom server JAR may be picked from. Must be absolute, not /, and not a symlink |
| Key | Default | Meaning |
|---|---|---|
dashboard_container |
server-dashboard |
Dashboard container name. Protected from Docker actions |
gateway_container |
server-dashboard-gateway |
Gateway container name |
docker_binary |
/usr/bin/docker |
Docker CLI |
systemctl_binary |
/usr/bin/systemctl |
|
systemd_run_binary |
/usr/bin/systemd-run |
Used for one-shot reboots |
systemd_analyze_binary |
/usr/bin/systemd-analyze |
Used to check schedule times |
timeout_binary |
/usr/bin/timeout |
Bounds every command |
docker_unit |
docker.service |
|
broker_unit |
helix-privd.service |
|
power_state_root |
/run/helix/power |
One-shot reboot records |
recurring_state_root |
/var/lib/helix/power |
Recurring reboot schedule |
docker_cleanup_state_root |
/var/lib/helix/docker-cleanup |
Docker cleanup schedule and last result |
systemd_unit_root |
/etc/systemd/system |
Where schedule units are written |
broker_binary |
/usr/local/libexec/helix-privd |
Used by schedule units |
broker_config_path |
/etc/helix/privd.json |
Used by schedule units |
hook_services |
Plex plexmediaserver.service, Tailscale tailscaled.service, Pterodactyl wings.service, Jellyfin jellyfin.service
|
Hook cards and the systemd units they control, as { "id": "...", "unit": "..." }
|
| Key | Default | Meaning |
|---|---|---|
docker_binary |
/usr/bin/docker |
|
ufw_binary |
/usr/sbin/ufw |
|
timeout_binary |
/usr/bin/timeout |
|
proc_root |
/proc |
Source of listening sockets |
state_root |
/var/lib/helix/network (installer: /srv/helix/state/network) |
Records of Helix-owned firewall rules |
mutation_cooldown_seconds |
2 |
Minimum gap between firewall changes. 1 to 30 |
| Key | Default |
|---|---|
dpkg_query_binary |
/usr/bin/dpkg-query |
apt_cache_binary |
/usr/bin/apt-cache |
apt_get_binary |
/usr/bin/apt-get |
apt_mark_binary |
/usr/bin/apt-mark |
timeout_binary |
/usr/bin/timeout |
apt_lists_root |
/var/lib/apt/lists |
apt_archives_root |
/var/cache/apt/archives |
reboot_required_path |
/var/run/reboot-required |
reboot_packages_path |
/var/run/reboot-required.pkgs |
| Key | Default |
|---|---|
os_release_path |
/etc/os-release |
curl_binary |
/usr/bin/curl |
gpg_binary |
/usr/bin/gpg |
apt_get_binary |
/usr/bin/apt-get |
dpkg_binary |
/usr/bin/dpkg |
systemctl_binary |
/usr/bin/systemctl |
docker_binary |
/usr/bin/docker |
timeout_binary |
/usr/bin/timeout |
apt_sources_root |
/etc/apt/sources.list.d |
apt_keyrings_root |
/etc/apt/keyrings |
share_keyrings_root |
/usr/share/keyrings |
staging_root |
/run/helix/hook-installs |
| Key | Default | Meaning |
|---|---|---|
github_owner |
Riqqqque |
GitHub owner to check for releases |
github_repo |
Helix |
GitHub repository |
compose_project_directory |
detected | Leave unset: the updater reads the Compose project and env file from the dashboard container's labels. If set, the folder must contain a .env file |
state_root |
/var/lib/helix/updates |
Download, staging, rollback copies, and results |
curl_binary |
/usr/bin/curl |
|
tar_binary |
/usr/bin/tar |
|
timeout_binary |
/usr/bin/timeout |
|
privd_install_path |
/usr/local/libexec/helix-privd |
|
terminald_install_path |
/usr/local/libexec/helix-terminald |
|
finalize_unit |
helix-finalize-update.service |
Must be exactly this name |
| Key | Default |
|---|---|
key_root |
/var/lib/helix-hub |
terminal_socket |
/run/helix/terminal/terminal.sock |
ssh_binary |
/usr/bin/ssh |
ssh_keygen_binary |
/usr/bin/ssh-keygen |
timeout_binary |
/usr/bin/timeout |
If the hub cannot start, the broker logs machine hub disabled and keeps
running without it.
Only needed to show AMP-managed servers. Owned by root, mode 0600, at most
16 KiB.
| Key | Default | Meaning |
|---|---|---|
endpoint |
127.0.0.1:8080 |
AMP API address. Must be loopback |
public_panel_port |
the endpoint port | Port Open AMP links to |
username |
required | AMP login |
password |
required | AMP password |
instance_root |
/home/amp/.ampdata/instances |
AMP instance folder, used to read ports |
Create the file before running the installer, or add amp_credentials to
privd.json yourself and restart the broker.
The gateway renders
deploy/nginx/default.conf.template
from the HELIX_* gateway keys at start. Change the keys, not the template.
| Rule | Value | Result when it fails |
|---|---|---|
| Host header |
HELIX_GATEWAY_HOST or HELIX_SECONDARY_GATEWAY_HOST
|
421 Misdirected Request |
| Client address |
127.0.0.1, HELIX_ALLOWED_CLIENT_CIDR, HELIX_SECONDARY_ALLOWED_CLIENT_CIDR
|
403 Forbidden |
| Origin on POST, PUT, DELETE |
HELIX_BROWSER_ORIGIN or HELIX_SECONDARY_BROWSER_ORIGIN
|
403 Forbidden |
| Methods | GET, HEAD, POST, PUT, DELETE (terminal: GET only) | 403 Forbidden |
| Request body | at most 6 MB (client_max_body_size 6m) |
413 |
| Client body and header timeouts | 10 seconds each | |
| Keep-alive | 30 seconds | |
| Upstream read and send | 15 seconds (terminal WebSocket: 8 hours read) | 504 |
POST /api/v1/automation/server with no Origin and no cookie is allowed through,
so server API token clients work from scripts. Forwarded-address headers from
clients are dropped. Responses carry no-referrer, nosniff, DENY framing,
and noindex headers.
Helix is a private-LAN release licensed under AGPL-3.0-or-later. Found a mistake on this page? Open an issue or edit docs/wiki in the repository; the wiki is published from there.
Helix · 1.12.0
Get started
Using Helix
Game servers
- Servers and Marketplace
- Backups
- Deploying File Changes
- Hytale
- Pumpkin
- Valheim
- Copy a server into Helix
- Copying Between Servers
- Game Hosting and Capacity
API and automation
Operations and internals
- Security and Recovery
- How Helix Works
- Architecture
- Development and Testing
- Glossary
- Roadmap and Status