Admin Panel
Admin panel
A live view of the queue, served from your server's own HTTP port. No extra
port, no reverse proxy, no dependency.
http://your-server-ip:30120/rivo_queue/
Setup
Generate a long random token (not a password you can remember):
openssl rand -hex 32Put it in
cfg/local.cfg:set rivo_queue:panelToken "the-value-you-just-generated"Restart. The console prints the URL.
Until that convar is set the panel is closed, and every request to it gets a
404. There is no default token.
Tabs
Queue: everyone waiting, with position, points, tier, time waited, and an
estimate. Move players up, down, or to the front, or kick them with a reason.
Below it are players who are past the queue and still loading.
Users: everyone who has ever connected, searchable by name, license,
Discord or Steam. Open a row to see their history and priority, grant points
with a tier and an expiry, remove individual rows, ban them, or forget them.
Use this tab to grant priority to players who are not currently in the queue.
Controlled by Config.playerHistory. With it off, nothing is recorded and the
tab shows a notice instead of an empty table.
Priority: grant points to an identifier with an optional label, tier, and
expiry. Browse and delete stored rows.
Bans: ban an identifier permanently or for a number of days, lift bans, and
see the temporary blocks created by kicks.
Metrics: this session's counters, wait average and p95 per tier, and
refusals broken down by gate.
Maintenance: restrict connections to chosen tiers, with an optional expiry
and a reason players will see.
The header shows storage, Discord, and webhook status.
Moving people
Moving a player pins them. The pin survives re-sorting and outranks
everything, including the head lock, until they are admitted, leave, or you
release it with the ⤫ button. Pinned rows are marked.
Use it for one-off situations. If somebody should always be higher, grant them
priority instead.
Security
The panel is reachable by anyone who can reach your server's port, which on
most hosts means the whole internet. It shows player identifiers and it can ban
players.
What the resource does
- Closed by default. No token, no panel. Requests get a 404 rather than a
401, so the endpoint does not reveal that it exists. - Token in a convar, so it never ends up in a committed config file.
- Constant-time comparison, so the token cannot be recovered byte by byte
by measuring response times. - Escalating lockout on wrong tokens. Each wrong guess locks that address
out for longer, up to five minutes. A request with no token never triggers
it, and a correct token is always accepted even while the address is locked
out. Lockouts are per address, and admins behind NAT or a reverse proxy share
one, so this stops a bot from locking out your staff. A correct token bypasses
the lockout but does not clear it, so an attacker sharing an address with an
admin does not get their attempts reset every time the panel polls. - Rate limiting per address, 240 requests a minute by default.
- No path traversal. Static paths are resolved under
web/distand anything
containing..is refused. - Security headers on every response:
X-Frame-Options: DENY,nosniff,no-referrer, and a restrictive CSP.
What it does not do
- No TLS. FXServer's HTTP endpoint is plain HTTP, so the token is sent
unencrypted in a header. Anyone on the network path can read it. - No accounts. One token, shared by everyone who has it. The audit trail
records "panel", not which person. - No revocation other than changing the token. Changing it logs everyone out.
What you should do
Best: do not expose the port publicly. Reach it over a VPN, Tailscale, or an
SSH tunnel:
ssh -L 30120:localhost:30120 you@your-server
# then open http://localhost:30120/rivo_queue/
Good: put it behind a reverse proxy with TLS and restrict it by IP.
location /rivo_queue/ {
allow 203.0.113.0/24;
deny all;
proxy_pass http://127.0.0.1:30120/rivo_queue/;
}
Minimum: a long random token, rotated when someone leaves your staff team.
If you are not going to do any of these, set Config.panel.enabled = false and
use the queue console commands instead. They can do everything the panel does.
Troubleshooting
404 on everything. The token convar is not set, or the resource restarted
without reading it. Check the console for the panel line on boot.
"The panel is enabled but web/dist is missing." The build was not shipped.
Download the resource again and replace the folder.
Locked out after mistyping the token. The correct token is accepted
regardless of any lockout, so just paste the right one. The lockout only blocks
further wrong guesses. Restarting the resource clears it.
Signed out unexpectedly. The token changed server-side, or the resource
restarted with a different one. The panel returns you to the token prompt
instead of retrying failed requests.