Cryptograss:Hunter and Maybelle: Access and Authority

From PickiPedia: A knowledge base of bluegrass, old time psychedelic jams, and other public domain music
Revision as of 05:11, 1 November 2026 by Re (talk | contribs) (Automated edit (via create-page on MediaWiki MCP Server))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Access and authority between hunter and maybelle. Who can reach whom, over what, and why. Written by Re on 1 Nov 2026, checked against maybelle-config production @ 0582963d (#251, #253). A companion to Cryptograss:Hunter and the cold-start drill on Cryptograss:Drill:Cold Start Rebuild.[unverified]

The direction of travel

maybelle reaches into hunter; hunter never reaches into maybelle. hunter sends maybelle only HTTPS (the poller's turns, the record's ingest, GitHub webhooks), and nothing in the repos gives hunter an SSH way in. Everything that flows the other way — deploys, backups, wiki dumps — is maybelle pulling, using keys it holds.[unverified]

maybelle → hunter

  • Keys maybelle holds: root's ~/.ssh/id_ed25519_hunter, from the vault as hunter_root_ssh_key. Its /root/.ssh/config sends Host hunter.cryptograss.live to root@hunter with that key. One key, one purpose per job, all pull-only.[unverified]
  • What it does with it:[unverified]
    • The PickiPedia dump mirror (rsyncs hunter's wiki dumps in, every 2 minutes per the deploy-pickipedia cron).[unverified]
    • The VCS backup pull (see below).[unverified]
    • Ansible deploys (from a laptop via maybelle, per maybelle/scripts/deploy-hunter.sh).[unverified]
  • What maybelle can do once connected: whatever root on hunter can do — the key is root's, and there is no restricted-command wrapper. Authority here is total; the limit is only that maybelle initiates and hunter never does.[unverified]

hunter → maybelle

Nothing. Checked on 1 Nov 2026 by magent through docker:[unverified]

  • hunter's host /root/.ssh holds only authorized_keys; no private key for maybelle exists anywhere on hunter (host, recovery/sshrouter users, any agent home).[unverified]
  • maybelle refused SSH from hunter's containers as root and as magent (Permission denied (publickey,password)).[unverified]
  • The one exception to watch: if a person ever uses ssh -A (agent forwarding) into hunter, their agent rides along for that session. Worth not doing.[unverified]

The machinery of the backups

Two halves, each deployed separately. Until both are live, nothing runs — the merge alone does nothing.[unverified]

hunter side (hourly, timer)

hunter-vcs-unpushed, from hunter/ansible/roles/housekeeping/ (vcs-unpushed.py, 144 lines). Every hour it rewrites /opt/magenta/vcs-backup/: for every git checkout in every home under /opt/magenta (people's, Moods', agents'), a bundle of any branch that exists on no remote, plus a patch of uncommitted edits to tracked files. It only reads repos, starts fresh each run, so a branch pushed since drops out. Gap, known: untracked files are not backed up — only edits to files git already tracks.[unverified]

maybelle side (hourly at :20, root cron)

/usr/local/bin/pull-hunter-vcs.sh, installed by maybelle/ansible/maybelle.yml at 0582963d: rsync -a --delete root@hunter.cryptograss.live:/opt/magenta/vcs-backup/ /mnt/persist/hunter-vcs/latest/ cp -al latest → daily/$(date -u +%F) # one copy per day find daily -mtime +30 -exec rm -rf # 30 days kept Log: /var/log/pull-hunter-vcs.log. Uses root's existing hunter key — no new secret.[unverified]

What this means for the drill

This job is why the "every branch that mattered was already pushed" line in Cryptograss:Drill:Cold Start Rebuild has teeth: branches that exist only on hunter are saved hourly whether or not anyone pushed them. Untracked files and homes are still declared disposable.[unverified]

Open items

  • maybelle's /root/.ssh/authorized_keys is not in the repo. Two keys there; one is Justin's (jmyles@lukowala), one unrecognized but present in hunter's root authorized_keys too (since Dec 2025 — provisioning key or another machine). Should be named and owned.[unverified]
  • Both boxes' root authorized_keys should come from the deploy logic with a comment per key, so "whose is this?" is answered in the repo, not from memory. Same gap flagged for the drill page.[unverified]