.env reference
Copy .env.example to .env and edit. Compose maps every variable
explicitly, so the same values work as Portainer stack variables — no .env
file needed there.
Required
| Variable |
Meaning |
DOMAIN |
The public hostname clients reach this server at — the name on the TLS certificate, never an IP or localhost. The server refuses to boot without it, because it anchors the trust chain: identities are signed for this domain, and peers verify them against the _revoked.<DOMAIN> TXT record. A value that does not match reality produces identities every remote verifier rejects. |
Ports & topology (compose only)
| Variable |
Default |
Meaning |
API_PORT |
3000 |
Port the API listens on inside the container. Only has to be free in there — nothing is published to the host. |
CONTAINER_NAME |
revoked-api |
The container's name, which is also the hostname your reverse proxy forwards to. |
PROXY_NETWORK |
proxy-network |
External Docker network shared with your reverse proxy. Create it once: docker network create proxy-network. |
HTTP_PORT / HTTPS_PORT |
80 / 443 |
Only used by the bundled nginx (--profile proxy) — the one thing that publishes host ports. |
Registration
| Variable |
Default |
Meaning |
ALLOW_SIGNUPS |
false |
Whether anyone may create their own account over HTTP. Off by default: a fresh server should be one only its operator can add people to. See Accounts for how to create users while it is off. |
Seed accounts
Created on first boot when both halves of a pair are set. Convenient on a
test box; on anything reachable, create the superuser interactively and leave
these blank.
| Variable |
Meaning |
ADMIN_EMAIL / ADMIN_PASSWORD |
Seed superuser for the /_/ dashboard. |
USER_EMAIL / USER_PASSWORD |
Seed regular account. |
Outbound requests
| Variable |
Default |
Meaning |
ALLOW_PRIVATE_CALLBACKS |
false |
Lets user-supplied callback URLs resolve to loopback and private ranges. On a public host that is a server-side request forgery primitive — enable it only on a LAN-only or development install. Link-local (cloud metadata), multicast and 0.0.0.0 stay blocked regardless. |
Rate limits
Public-surface budgets, read once at startup — a change needs a restart.
0 disables a limiter entirely.
| Variable |
Default |
Budget |
RATELIMIT_GATE_ATTEMPTS |
10 |
Password/identifier attempts on a share gate, per IP + slug, per 5 minutes. |
RATELIMIT_PROBE_REQUESTS |
120 |
Metadata probes and short-link reads, per IP, per minute — the enumeration budget across every slug. |
RATELIMIT_CHALLENGE_REQUESTS |
60 |
Handshake nonce issuance, per IP, per minute. |
These budgets are per-IP, which is why the
trusted-proxy header matters:
without it every request appears to come from your proxy and everyone shares
one bucket.
Storage
| Variable |
Default |
Meaning |
SERVER_KEY_PATH |
pb_data/server_root.pem |
Where the server's root key lives. Compose pins it inside the pb_data volume — leave it alone. Everything under pb_data is state that cannot be regenerated. |