Sysop daily ops

Your two main panels:

/admin — admin home

Shows total/active users, post counts, online users, 24-hour activity
totals, recent callers, file queue depth, and quick-action buttons.

Use this for: a quick "is everything OK" check.

/admin/control — control panel

Shows:

  • Every anetbbs-* systemd service with green/red badges plus
    Start / Stop / Restart buttons and a one-click journal viewer.
  • NodeSpy — every active telnet/SSH/rlogin session, with live
    page + last action + idle time. Click the eye icon for a per-node
    detail screen with the last screen snapshot.
  • Live who's-online for both web and terminal users, refreshed
    every 5 seconds.

For service start/stop/restart from the web to actually work, the
account the anetbbs-web service runs as (its systemd unit's
User=, anetbbs by default) needs sudoers permission for the units.

update.sh sets this up for you automatically on every run — it
substitutes the real service-account name into the template and
installs it, so a sysop who's run at least one update already has this
working. On a brand-new install that hasn't been updated yet, install
it yourself:

sudo sed "s/^__SERVICE_USER__ /anetbbs /" /opt/anetbbs/deploy/sudoers.anetbbs \
    | sudo tee /etc/sudoers.d/anetbbs > /dev/null
sudo chmod 0440 /etc/sudoers.d/anetbbs
sudo visudo -cf /etc/sudoers.d/anetbbs    # syntax check

Replace anetbbs in the sed command with your actual service
account if you didn't use the installer's default. Don't just cp the
template directly — it ships with a literal __SERVICE_USER__
placeholder, not a real username, so a plain copy installs a rule that
matches nobody.

/admin/checklist — first-launch checklist

Walks through what you've configured vs not (admin password changed,
custom board added, BBS_NAME customized, MOTD pool, default theme,
file area, bulletin posted). Re-runnable, read-only.

/admin/users + /admin/users/:id/manage

The richer user editor — set access level (Mystic-style 0–255), time
budget, lock/verify toggles, sysop notes, password reset, file ratio
view. The basic edit page is fine for renames; use Manage for
fine-grained control.

/admin/inactive-users

Bulk-cleanup interface for stale accounts. Pick a day cutoff, check
the boxes, mass-PM "we miss you" / soft-deactivate / hard-delete.

/admin/pending-users (NUV)

When NUV_ENABLED=true, new users land here for approval.
One-click Approve sends a welcome PM automatically.

Admin notifications

The bell-icon notification system (/notifications/) also fires for
five sysop admin-review events, so you don't have to manually check
each page for new work:

  • MSP federation registry join requests — fires once a registrant
    verifies their contact email, not at the earlier unverified
    registration step. Links to /admin/registry/.
  • QWK node applications — fires when a sysop applies for a QWK
    node number, via API or the terminal wizard. Links to
    /admin/echomail/hub/qwk/requests.
  • New users pending NUV approval — fires on registration when NUV
    is enabled. Plain email-verification-only signups don't trigger
    this — those are fully self-service. Links to /admin/pending-users.
  • Unknown/bad echomail areas — fires once per newly-discovered
    unknown area tag (not once per message) when inbound echomail
    arrives for an area this BBS doesn't carry. Links to
    /admin/echomail/bad_areas.
  • Network join applications — fires when someone submits the
    public "apply to join this network" form (/join/; see
    echomail/federation docs for the feature itself). Links to
    /admin/echomail/hub/join/requests.

Every is_admin=True user gets these independently, and each can
toggle any of the five off in Notification Settings
(/notifications/settings) — an admin-only section that's invisible
to non-admin accounts. Default is ON for all five.

/admin/newsletter

Compose a one-time newsletter. Fans out as a PM to every active
verified user. History kept.

/admin/broadcast

Push a real-time toast to every connected web tab AND every
telnet/SSH/rlogin user's terminal. Optional TTL.

/admin/events — scheduled events

Cron-style task scheduler. List view shows every configured event with
its handler, schedule (daily/hourly/weekly/interval, all in UTC),
enabled/disabled state, and computed next-run time.

  • Handlers come from a fixed registry (anetbbs/events/handlers.py)
    — things like TW2 daily maintenance, SQLite VACUUM, log rotation,
    the security-update checker, and the InterBBS Wall/Last
    Callers/Game Scores inbound-sync jobs (auto-created when those
    features are enabled). You pick a handler and a schedule; you can't
    register arbitrary new handler code from the UI.
  • New / Edit forms let you change the schedule (daily HH:MM,
    hourly at :MM, weekly day+time, or every-N-minutes interval) and
    per-handler params (e.g. max_mb for log rotation, command for
    the raw shell handler).
  • Enable/disable toggle — flip an event off without deleting it.
  • Run now — fires the handler immediately, in-request, so you see
    the result inline instead of waiting for the next scheduled tick or
    tailing the journal. Fine for quick jobs (noop, db_vacuum); the
    TW2 maintenance handler spawns a node process and can take a moment.
  • Delete removes the row entirely.

A handful of default events are seeded on fresh installs; add your own
for anything else you want run on a schedule without cron/systemd
timers.

Journals

Every anetbbs-* service writes to systemd journal. From the
control panel each service has a "list" icon showing the last 200
lines. Faster than journalctl alt-tab.