server-tools
What this server can do and which command does each job - GitHub with gh, Cloudflare with cf, putting an app or site online at <name>.__DOMAIN__ with expose, the agent's own health with hermes-setup.
SKILL.mdskills/setup-vps/server-skills/server-tools/SKILL.md
GitHubTools on this server
This is the owner's server, running 24/7. Every tool below is already signed in: never print a token, a key or a password, and never sign a tool out.
| job | command | check |
|---|---|---|
| GitHub: repos, clone, push, PRs, issues | gh, see the github-cli skill |
gh auth status |
| Cloudflare: DNS, Workers, R2, KV, D1, cache | cf, see the cloudflare skill |
cf auth whoami |
| Put an app online with HTTPS and the sign-in page | expose |
expose status |
| Who can sign in (email + code, admin or member) | expose user |
expose user list |
| The agent itself: model, chat, dashboard | hermes-setup |
hermes-setup check |
Who may talk to the agent on Discord (the Hermes access role; they join the server first) |
hermes-discord access add|remove <username> |
hermes-discord access list |
| More skills from the ai-maxxing package | hermes-setup add <skill>, see the ai-maxxing-skills skill |
hermes-setup catalog |
Cloudflare on this server
cf is signed in with CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID from ~/.config/cloudflare/env (loaded by login shells and by the agent). That access only works from this server's address. If cf says it is not signed in, run the command through bash -lc '<command>'; never run cf auth login here.
Put something online
- Run the app as a service listening on
127.0.0.1:<port>only. expose add <name>.__DOMAIN__ <port>: it creates the address, HTTPS and the sign-in page in front. Add--adminswhen the page can change the server or shows private data only the owner should see (like the Hermes dashboard): members then get "restricted access".expose statuslists what is online;expose remove <name>.__DOMAIN__takes it down.
Never open a port in the firewall, never bind 0.0.0.0, never publish a page another way. Every page sits behind the sign-in page: never use expose allow or --public unless the owner asks for that exact page or address. expose unlock clears a lock after too many wrong codes.
Who can sign in
People sign in with their email and a 6-digit code sent by Lumail (expose status shows sign_in=code). An admin opens every page; a member opens every page not added with --admins.
- "Add <email> to the dashboard" or "give <email> access":
expose user add <email> member --invite(it emails them the links they can open). Make someoneadminonly when the owner says so, in those words. - "Remove <email>":
expose user remove <email>; it signs them out at once. The last admin cannot be removed. expose user listshows everyone with their role.- An app behind the gate receives
X-Gate-User(the email, empty for a saved IP) andX-Gate-Role(adminormember): use them to show who is there and to keep admin actions for admins, never a second password.
Rules
- Ask the owner before anything that can cut access or break what runs: SSH or firewall settings, a reboot, deleting files, containers or databases, an OS upgrade, anything public or paid.
- Delete with
trash <path>when it is installed, neverrm -rfon anything of value.