RackMon
Security

Built so your data never leaves your hands.

RackMon is self-hosted by design. It runs entirely on your infrastructure, and its security model assumes you, not a vendor, are in control.

Self-hosted, no phone-home

Secrets encrypted at rest

Device and SMTP credentials are encrypted with AES-256-GCM using a master key you provide (RACKMON_MASTER_KEY), which is kept out of the database. Session tokens are signed with a separate secret (RACKMON_JWT_SECRET).

Safe by default in production. With RACKMON_ENVIRONMENT=production, RackMon refuses to start while RACKMON_JWT_SECRET, RACKMON_MASTER_KEY or RACKMON_ADMIN_PASSWORD is still on its development default — a misconfigured instance fails closed instead of running exposed. Placeholder secrets copied from an install template (CHANGE-ME…) are refused in every environment, because that string is published.
The read-only account is not created with a factory password. Earlier versions always seeded viewer@rackmon.io with a password that was printed on this very site. From 1.2.3 that account is only created when you set RACKMON_VIEWER_PASSWORD yourself; if an older install still has it and the password is still the published one, RackMon disables the account on the next start and says so in the log. An account whose password you changed is left alone.

Authentication & access control

No licence check, because there is no licence

RackMon is MIT-licensed and every feature is on by default, so there is no key to verify, no signing code in the image and no edition check anywhere in the request path. RACKMON_LICENSE_KEY is still read so that an upgrade from an older install does not fail, and its value is ignored.

Transport & deployment

Reporting a vulnerability

Found a security issue? Email rackmon.software@gmail.com with the details and the steps to reproduce, or open a private advisory on GitHub. I acknowledge reports and keep you posted; please leave a reasonable window before public disclosure. Credit where you want it.

Past advisories

Fixed issues are listed here rather than quietly patched, because an operator deciding whether to upgrade deserves to know what they are upgrading away from.

VersionIssue
1.3.0The factory administrator came back on every restart. seed_all() recreated the account whenever its configured email was missing, so renaming it to your own address — or deleting it after creating your own — handed the next restart a fresh admin with the default password. Now the account is only seeded when the installation has no administrator at all.
1.2.10Arbitrary file read without an account, in every version up to and including 1.2.9. The catch-all route that serves the web UI joined the request path onto the static directory without normalising it, so an encoded ../ escaped the directory and returned any file the process could read — including the .env with RACKMON_JWT_SECRET and RACKMON_MASTER_KEY. Upgrade, and rotate both secrets.
1.2.10The update check pointed at rackmon.io, a domain I do not own. No announcement ever reached an install that had not overridden it by hand — including an announcement about the entry above. The manifest now lives at rackmon.app.
1.2.9A Pro licence key signed with the real vendor key was committed in backend/tests/conftest.py, and that file shipped inside every published Docker image. The key is revoked; the test suite now signs an ephemeral pair per run.
1.2.3The read-only account was always created with a password published on this very site. It is now only created when you set RACKMON_VIEWER_PASSWORD yourself, and an older install still carrying the published one has it disabled on the next start.

← Back to RackMon