Security
The trust model, plainly
The control plane is effectively root on every server that joins it: agents carry out the commands it queues, some through a privileged helper. Protect the control plane, its database and its secret key accordingly.
The agent itself is not root. It reaches root only through setu helper <verb>: typed JSON on stdin, with no paths, modes or owners from the caller. The helper bounds what root can be asked to do, using typed verbs, fixed templates, paths derived from the site id and hostile archives refused, but not who asks.
- Sites are untrusted. Each runs as its own user and can write only its own data and run directories.
- Sites on one server share the kernel, the local PostgreSQL instance (one database and role each) and Caddy.
- Secrets are sealed at rest, never put on a command line or in logs, and revealed only with the operator's password.
The full model, the helper's verbs, the sudoers file and the firewall rules are in the trust model and security documentation.
Reporting a vulnerability
Please report security issues privately through GitHub's private vulnerability reporting. Do not open a public issue. You should get an acknowledgement within three days. Fixes for the current minor release are published as a patch release with a security note in the changelog.
The full policy, including supported versions and scope, is in SECURITY.md.