docs: a running list of servers, and the fleet updater it feeds
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,49 @@ the owner's OS user and can never be granted. Indirection there really is accide
|
|||||||
generating" was once treated as permission and started a second agent in a repository another was
|
generating" was once treated as permission and started a second agent in a repository another was
|
||||||
building in. Whatever shape this takes, it inherits those three refusals.
|
building in. Whatever shape this takes, it inherits those three refusals.
|
||||||
|
|
||||||
|
## Fleet — one command across every server
|
||||||
|
|
||||||
|
**The list exists: `docs/servers.md`**, written 2026-08-21 and verified from this host. Five machines
|
||||||
|
hold a platform checkout, three run it, and it records how to reach each one.
|
||||||
|
|
||||||
|
- [ ] **An orchestrator that acts on every server at once** — pull and update every platform, restart a
|
||||||
|
process everywhere, report which host is behind. The list is the input; this is the thing that
|
||||||
|
reads it.
|
||||||
|
|
||||||
|
Three facts from writing the list decide the design, and all three are verified: the checkout
|
||||||
|
**path differs per host** (take it from PM2's `pm_cwd` for the `officer` process, never a
|
||||||
|
hard-coded path); `alpha` carries a **second, stale checkout** so pulling the wrong one succeeds
|
||||||
|
while changing nothing; and the **git remotes differ** — one host pulls over HTTPS and one points
|
||||||
|
at a different Gitea altogether. An orchestrator built on "ssh, cd to the same path, git pull"
|
||||||
|
is wrong on three counts before it starts.
|
||||||
|
|
||||||
|
Open: whether this is a script over SSH, an Officer screen, or a chat capability; and whether
|
||||||
|
`headscale` and `omega` — checkout present, nothing running — are targets at all. Note the
|
||||||
|
platform already has an **Update button** for a single server (`03abdeb2`); this is that, fanned
|
||||||
|
out, and it should probably share the code rather than reimplement the pull.
|
||||||
|
|
||||||
|
- [ ] **A way to mark a commit "this one ships", so a release is not just `master`'s tip.** Wanted
|
||||||
|
2026-08-21. **No version numbers** — not now — and **not a tag**: the owner does not want a second
|
||||||
|
ref to mint and push for something the commit itself could carry. So a **codeword in the commit
|
||||||
|
message**, and the fleet updater pulls to the newest commit carrying it rather than to whatever
|
||||||
|
`master` points at.
|
||||||
|
|
||||||
|
That distinction is the whole value: today a server updates to the tip, so an in-progress commit
|
||||||
|
ships the moment it is pushed. A marker makes shipping a deliberate act while leaving the push
|
||||||
|
unchanged.
|
||||||
|
|
||||||
|
Shape to settle when it is built:
|
||||||
|
|
||||||
|
- **A trailer, not a word in prose** — `Release: yes` on its own line, in the same family as
|
||||||
|
`Co-Authored-By`. `git log --grep='^Release:' --format=%H -1` then gives the target SHA in one
|
||||||
|
command, and no commit message that merely *talks* about a release matches by accident.
|
||||||
|
- **The trade against a tag, stated honestly:** a tag can be moved or deleted when a release turns
|
||||||
|
out to be bad; a commit message cannot be edited once pushed. Un-marking means marking a newer
|
||||||
|
commit — which is a forward-only, revert-shaped workflow. That is a fine answer, but it should
|
||||||
|
be a chosen one.
|
||||||
|
- The updater then does a checkout at that SHA, not a `pull` — same discipline the plugin-pinning
|
||||||
|
item asks for: **verify `rev-parse HEAD` matches, or refuse.**
|
||||||
|
|
||||||
## File watchers
|
## File watchers
|
||||||
|
|
||||||
- [ ] **Watch a directory, and attach actions to what lands in it.** Wanted 2026-08-21. The owner sets a
|
- [ ] **Watch a directory, and attach actions to what lands in it.** Wanted 2026-08-21. The owner sets a
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# Servers — the running list
|
||||||
|
|
||||||
|
Every machine the owner runs, how to reach it, and what of Officer is on it. Kept here so an
|
||||||
|
orchestrator ("pull and update every platform", "restart officer everywhere", "which host is behind")
|
||||||
|
has one place to read rather than a fact re-derived per session.
|
||||||
|
|
||||||
|
**Started 2026-08-21.** Everything below was verified from `officer-dev` on that date by SSH and
|
||||||
|
`pm2 jlist`, except where marked assumed. Commit SHAs are a snapshot and go stale immediately — they
|
||||||
|
are here to show which checkout is live, not as a status board.
|
||||||
|
|
||||||
|
## How access works
|
||||||
|
|
||||||
|
All of it is over the tailnet. There is **no `~/.ssh/config`** — names resolve by MagicDNS and the
|
||||||
|
login is key-based, so `ssh <name>` as `pastilhas` is the whole story:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh alpha
|
||||||
|
ssh fofos
|
||||||
|
```
|
||||||
|
|
||||||
|
Nothing here needs a password, a jump host or a port. A host that refuses port 22 is not
|
||||||
|
misconfigured — see "Not SSH-reachable" below.
|
||||||
|
|
||||||
|
## Officer platforms
|
||||||
|
|
||||||
|
| Host | Tailnet IP | Live checkout | Runs `officer` | Git remote |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `officer-dev` | 100.64.0.13 | `~/officer-dev/platform` | yes (this host) | `git@gitea.officer.dev:officerdev/platform.git` |
|
||||||
|
| `alpha` | 100.64.0.1 | `~/officerdev/platform` | yes | `git@gitea.officer.dev:officerdev/platform.git` |
|
||||||
|
| `fofos` | 100.64.0.17 | `~/officerdev/platform` | yes | `https://gitea.officer.dev/officerdev/platform.git` |
|
||||||
|
| `headscale` | 100.64.0.2 | `~/dockers/officerdev/platform` | no | `ssh://git@gitea.pastilhas.dev:2222/officerdev/platform.git` |
|
||||||
|
| `omega` | 100.64.0.3 | `~/projects/officerdev/platform` | no | none set |
|
||||||
|
|
||||||
|
Three things an orchestrator has to handle, all verified and none of them cosmetic:
|
||||||
|
|
||||||
|
- **The checkout path differs per host.** There is no single path to hard-code. Take it from PM2 —
|
||||||
|
`pm2 jlist` gives the `officer` process's `pm_cwd`, which is the checkout that is actually serving.
|
||||||
|
- **`alpha` has a SECOND, stale checkout** at `~/dockers/officer.dev/platform` (same remote, different
|
||||||
|
HEAD). Pulling the wrong one updates nothing and looks like success. PM2's `pm_cwd` is the tiebreak.
|
||||||
|
- **The remotes are not the same URL.** `fofos` pulls over HTTPS and `headscale` points at a different
|
||||||
|
Gitea entirely (`gitea.pastilhas.dev:2222`). An orchestrator that assumes SSH to `gitea.officer.dev`
|
||||||
|
breaks on two of five.
|
||||||
|
|
||||||
|
`headscale` and `omega` hold a checkout but run no `officer` process (no PM2 on either). Whether those
|
||||||
|
are retired, staging or half-installed is **not established** — ask before treating them as targets.
|
||||||
|
|
||||||
|
## Other machines on the tailnet
|
||||||
|
|
||||||
|
- `gateway` (100.64.0.4) — reachable over SSH as `pastilhas`, no platform checkout, no PM2.
|
||||||
|
- **Not SSH-reachable** (port 22 refused): `edge-dns` (100.64.0.8), `edge-bridge` (100.64.0.15),
|
||||||
|
`gitea-bridge` (100.64.0.12), `officer-bridge` (100.64.0.5). Assumed to be service-only
|
||||||
|
containers rather than hosts to log into — not confirmed.
|
||||||
|
- **Client devices, not servers:** `macbookpro`, `iphone16`, `andres-ipad`, `pixel9a`, plus other
|
||||||
|
people's devices in the tailnet (`diogos-ipad`, `iphone-diogo`, `iphone-bruno`,
|
||||||
|
`guilhermes-macbook-pro`, `macbook-pro-de-joo`).
|
||||||
|
|
||||||
|
## Keeping this list true
|
||||||
|
|
||||||
|
It is a running list, so it is worth saying what makes it rot: a new server, a moved checkout, a
|
||||||
|
platform retired, or a remote changed. Re-verify with the same three commands the list was built from
|
||||||
|
— `tailscale status`, `pm2 jlist` for the `officer` entry's `pm_cwd`, and `git -C <cwd> remote get-url
|
||||||
|
origin`.
|
||||||
Reference in New Issue
Block a user