Configuration
Rconsole is configured only through environment variables. They are read by config.py (and a few by serve.py,
gunicorn.conf.py, the Docker entrypoint and the Compose files). This page is generated from one list
(scripts/envvars.py), and a test fails if the code reads a variable that is not on it, so the names and defaults
here are the real ones.
How to set them
| Where you run |
How |
| Render |
Dashboard → your service → Environment, or the envVars of the blueprint (render.yaml) |
| Docker Compose |
deploy/.env next to docker-compose.yml (start from deploy/.env.example) |
| systemd |
/etc/rconsole.env loaded by the unit (start from deploy/rconsole.env.example) |
docker run |
-e NAME=value |
| Locally |
export NAME=value before uv run python serve.py |
Changed a variable on a running instance? Restart it: sudo reboot --yes restarts in place, so the new value is read.
Release asset name. On GitHub Releases the Compose example is attached as env.example (GitHub renames
dot-files on upload). In the repository it is deploy/.env.example. Copy either to .env.
Rconsole recognises these hosts from their variables and then turns on proxy trust and secure cookies, accepts the
platform hostname, and (where noted) finds the volume and public URL.
| Platform |
Detected by |
| Render |
RENDER (hostname from RENDER_EXTERNAL_HOSTNAME, URL from RENDER_EXTERNAL_URL) |
| Railway |
RAILWAY_PROJECT_ID or RAILWAY_ENVIRONMENT (hostname RAILWAY_PUBLIC_DOMAIN; volume RAILWAY_VOLUME_MOUNT_PATH) |
| Fly.io |
FLY_APP_NAME (hostname <app>.fly.dev) |
| Koyeb |
KOYEB_APP_NAME (hostname KOYEB_PUBLIC_DOMAIN) |
| Heroku |
DYNO (hostname HEROKU_APP_DEFAULT_DOMAIN_NAME) |
| Google Cloud Run |
K_SERVICE |
| Azure |
WEBSITE_SITE_NAME or CONTAINER_APP_NAME |
Only Render turns the keep-alive on by default.
Secrets that never reach your commands
These variables are removed from the environment of every command, terminal, job, service and hosted app that runs on
the host shell. Linux systems (VMs) never inherit the server's environment at all.
RCONSOLE_SECRET, RCONSOLE_PEPPER, RCONSOLE_ADMIN_PASSWORD, RCONSOLE_UPDATE_TOKEN, RCONSOLE_BACKUP_TOKEN,
RCONSOLE_BACKUP_PASSPHRASE.
Other secrets are different: values you save with sudo env or service add --env are stored in the data directory
(0600, plain JSON), and are encrypted only inside backups. See the security model.
Reference
Server
| Variable |
Default |
What it does |
PORT |
5000 |
Port to listen on. Most platforms set it for you. |
RCONSOLE_DATA_DIR |
./data (/data in the Docker image; the attached volume on Railway) |
Where users, state, secrets, VMs, logs, the workspace and update files live. Point it at a persistent disk, or configure backups. |
RCONSOLE_THREADS |
64 |
gunicorn threads. Each open terminal holds one for as long as the tab is connected, so this is roughly the number of terminals. |
RCONSOLE_LOG_LEVEL |
info |
gunicorn log level. |
RCONSOLE_SERVER (serve.py) |
auto |
serve.py only: force gunicorn or builtin. Default: gunicorn where it works, otherwise the built-in threaded server (Windows). |
RCONSOLE_HOST (serve.py) |
0.0.0.0 |
serve.py built-in server only: bind address. gunicorn always binds 0.0.0.0. |
RCONSOLE_TRUST_PROXY |
on when a managed platform is detected, else off |
Trust X-Forwarded-* headers (one proxy hop). Detected platforms: Render, Railway, Fly.io, Koyeb, Heroku, Google Cloud Run, Azure. |
RCONSOLE_COOKIE_SECURE |
on when a managed platform is detected, else off |
Mark the session cookie Secure (HTTPS only). Turn it on yourself behind your own HTTPS proxy. |
RCONSOLE_ALLOWED_ORIGINS |
- |
Extra hostnames the console is served from, comma separated. Normally auto-detected from Host, X-Forwarded-Host and the platform hostname; set it only if you see cross-origin request blocked. |
RCONSOLE_PUBLIC_URL |
auto-detected on Render, Railway, Fly.io, Koyeb, Heroku |
The site's public URL. The keep-alive pings it. |
RCONSOLE_RUN_AS_ROOT (Docker image) |
0 |
Docker image only: keep root inside the container so an admin's host shell is real root (single-owner setups). Default: drop to an unprivileged user. |
Accounts and login
| Variable |
Default |
What it does |
RCONSOLE_SECRET |
random, persisted in the data dir |
Session signing key. Never passed to user commands or hosted apps. |
RCONSOLE_PEPPER |
random, persisted in the data dir |
Password-hash pepper. Never passed to user commands or hosted apps. |
RCONSOLE_ADMIN_PASSWORD |
ark (a password change is forced) |
Initial password of the ark admin. Set it before the first start. Never passed to user commands. |
RCONSOLE_MIN_PASSWORD |
8 |
Minimum password length (never below 4). |
RCONSOLE_MAX_USERS |
10 |
Account cap. Rconsole is for one person or a small team. |
RCONSOLE_METRICS_INTERVAL |
5 |
Seconds between the admin dashboard's CPU, memory, disk and network samples (2-300). One hour of history is kept. |
RCONSOLE_LOGIN_ATTEMPTS |
5 |
Failed logins before a lockout starts. |
RCONSOLE_LOGIN_LOCKOUT |
30 |
Base lockout in seconds; it doubles on each repeat, up to 15 minutes. |
Linux systems (VMs)
| Variable |
Default |
What it does |
RCONSOLE_VM |
1 |
Enable the Linux systems feature (vm). Linux hosts only. (Inside a Linux system Rconsole sets RCONSOLE_VM to that system's name, e.g. debian: that is output for your scripts, not a setting.) |
RCONSOLE_DEFAULT_MODE |
host |
Where an admin's plain commands run: host or vm. Non-admins always use vm. |
RCONSOLE_DEFAULT_SYSTEM |
debian |
System that vm install uses when you name none (alpine suits 512 MB instances). |
RCONSOLE_ALLOW_USER_HOST |
0 |
Let non-admins run commands on the real host. This is remote code execution: leave it off. |
RCONSOLE_USER_VM_PROC |
0 |
Bind the host's full /proc into VMs that have no PID namespace of their own (ps/top then show host processes: see the security model). VMs with their own PID namespace always see only their own processes. |
RCONSOLE_VM_PIDNS |
auto |
One PID namespace per VM. auto/on: use it when the host allows user namespaces and say so in vm doctor when it does not; off: never (VMs share the server's PID space). |
RCONSOLE_HOST_HOME |
/home/rconsole |
Where the host shell starts. The Docker image links it to the persistent workspace; if it is missing or not writable, <data>/workspace is used. |
RCONSOLE_VM_ROOTFS_URL |
- |
Use your own root filesystem tarball for every system you install (mirrors, air-gapped hosts, tests). Default: the catalog's checksum-verified image for the system you pick. |
RCONSOLE_VM_ROOTFS_SHA256 |
- |
Expected SHA-256 of the override tarball. |
RCONSOLE_VM_PROOT |
auto-detect / download |
Path to a proot binary (5.5.0 or newer). |
Services and hosted apps
| Variable |
Default |
What it does |
RCONSOLE_SUPERVISOR |
1 |
Run the service supervisor. |
Files
| Variable |
Default |
What it does |
RCONSOLE_MAX_UPLOAD_MB |
64 |
Largest single file the file browser accepts. |
RCONSOLE_MAX_EXTRACT_MB |
2048 |
Most an archive may expand to when extracted in the file browser (zip-bomb guard; minimum 16). |
Staying awake
| Variable |
Default |
What it does |
RCONSOLE_KEEPALIVE |
on on Render, off elsewhere |
Ping our own public URL so a free instance is not suspended for inactivity. It cannot prevent provider restarts, quota limits or maintenance. |
RCONSOLE_KEEPALIVE_INTERVAL |
600 |
Seconds between pings (minimum 60). |
RCONSOLE_KEEPALIVE_EXTRA |
- |
Comma-separated extra URLs to ping as well. |
Backups and restore
| Variable |
Default |
What it does |
RCONSOLE_BACKUP_URL |
- |
A private git repository that receives the snapshots. |
RCONSOLE_BACKUP_TOKEN |
- |
Token with write access to that repository only. Not passed to user commands. |
RCONSOLE_BACKUP_USER |
x-access-token |
Git user name paired with the token. |
RCONSOLE_BACKUP_BRANCH |
rconsole-backup |
Branch that holds the single snapshot. |
RCONSOLE_BACKUP_DIR |
- |
Back up to this folder or mount instead of a git repository. |
RCONSOLE_BACKUP_PASSPHRASE |
- |
Required for encrypted backups. Keep a copy somewhere else: without it a backup cannot be read. Not passed to user commands. |
RCONSOLE_BACKUP_ENCRYPT |
1 |
Encrypt snapshots. Turning it off stores them in plain text. |
RCONSOLE_BACKUP_INTERVAL |
900 |
Seconds between backups when something changed (minimum 60). |
RCONSOLE_BACKUP_MAX_MB |
40 |
Largest snapshot accepted. Files over 20 MB are always left out. |
RCONSOLE_RESTORE_SETUP |
1 |
Re-run each VM's vm setup profiles after a restore. |
RCONSOLE_RESTORE_DEPS |
1 |
Reinstall each VM's recorded packages, virtualenvs and Node projects after a restore. |
Updating
| Variable |
Default |
What it does |
RCONSOLE_UPDATE_REPO |
Salehin-07/rconsole-ark |
GitHub owner/repo that rconsole update reads releases from. Point it at your fork. |
RCONSOLE_UPDATE_TOKEN |
- |
Optional GitHub token for rconsole update (private forks, rate limits). Not passed to user commands. |
RCONSOLE_UPDATE_API |
https://api.github.com |
GitHub API base. Only for tests and GitHub Enterprise mirrors. |
Docker Compose files
| Variable |
Default |
What it does |
RCONSOLE_DOMAIN (compose files) |
- (required) |
deploy/.env only: the public hostname Caddy serves and obtains a certificate for. Also becomes RCONSOLE_ALLOWED_ORIGINS. The server itself never reads it. |
RCONSOLE_VERSION (compose files) |
latest |
deploy/docker-compose.image.yml only: the image tag to pull from ghcr.io/salehin-07/rconsole-ark. |
Docker compatibility layer (inside VMs)
| Variable |
Default |
What it does |
DRUN_MODE (inside VMs) |
P1 on the host shell, F1 inside a VM |
drun / docker run wrapper: udocker execution mode (P1 = proot, F1 = fakechroot). |
DRUN_PULL_OPTS (inside VMs) |
- |
Extra options for the image pull. |
DOCKER_SHIM_LOCAL (inside VMs) |
0 (drun sets 1) |
Force the local udocker path even if DOCKER_HOST is set. |
DOCKER_HOST (inside VMs) |
- |
With a real Docker client installed (vm setup docker), forwards everything to that daemon. |
Edit this page on GitHub