| 1 |
# Deploying the developer edition on Earth |
| 2 |
|
| 3 |
Companion to `spec.md` §17.5. Status: planned, nothing installed yet (2026-09-27). |
| 4 |
|
| 5 |
## The host |
| 6 |
|
| 7 |
|
| 8 |
|
| 9 |
| Name | `earth` (`earth.andymccall.xyz`, IPv6 ULA; `192.168.1.6` on the LAN) | |
| 10 |
| OS | Ubuntu 26.04.1 LTS, x86_64, 4 cores, 31 GiB RAM | |
| 11 |
| Disk | `/` 251 GB (95 GB free), `/home` 1 TB (944 GB free) | |
| 12 |
| Already running | sshd :22, a Python service :6400, `wren-nest` :7842, retroplay-manager in Docker (:8080, :6670) with Postgres and a tetriblox server, two GitHub Actions runners (`doomsdayonecom`), Docker, containerd | |
| 13 |
| Not installed | Rust toolchain, sqlite3 CLI, nginx or caddy, certbot | |
| 14 |
| Access | `ssh -i ~/.ssh/earth_claude claude@earth`; `claude` has passwordless sudo | |
| 15 |
|
| 16 |
Ports 7300 (HTTP) and 7343 (HTTPS) are free and are the hub's. |
| 17 |
|
| 18 |
## Steps |
| 19 |
|
| 20 |
1. **Toolchain** (as `claude`): `curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal`, then `sudo apt-get install -y build-essential pkg-config git`. |
| 21 |
2. **Source**: from the development machine, `rsync -a --delete --exclude target --exclude node_modules ~/development/oxygen ~/development/oxygenhub claude@earth:~/src/`. Oxygen is never pushed to Git; rsync is the bootstrap, and after the hub runs, `oxy push` to the hub itself is the ongoing path. |
| 22 |
3. **Build**: `cd ~/src/oxygenhub && cargo build --release`. |
| 23 |
4. **System user and data**: `sudo useradd --system --home /home/oxygenhub --create-home oxygenhub`, `sudo install -o oxygenhub -g oxygenhub -m 0755 target/release/oxygenhub /usr/local/bin/`, `sudo -u oxygenhub oxygenhub init --data /home/oxygenhub/data --admin andymccall` (prints the first admin's one-time password). |
| 24 |
5. **Service**: `/etc/systemd/system/oxygenhub.service` running `oxygenhub serve --data /home/oxygenhub/data` as `oxygenhub`, `Restart=on-failure`, `ProtectSystem=strict`, `ReadWritePaths=/home/oxygenhub/data`, `NoNewPrivileges=yes`; `sudo systemctl enable --now oxygenhub`. |
| 25 |
6. **TLS**: the developer edition generates a self-signed certificate at `init`. Download the CA from `https://earth.andymccall.xyz:7343/trust/ca.pem` and point clients at it with `oxy config remote.<name>.ca <file>` or `OXY_CA`. |
| 26 |
7. **First repositories**: on the development machine, `oxy remote add earth https://earth.andymccall.xyz:7343/andymccall/oxygen` in each of `oxygen`, `oxygen-vscode`, `oxygenhub`, then `oxy push earth`. |
| 27 |
8. **Updates**: rsync, build, `sudo install`, `sudo systemctl restart oxygenhub`. A `make deploy` target in the hub wraps steps 2, 3 and 8. |