docs: add automation examples

This commit is contained in:
Eric Wendland 2026-07-05 22:40:27 +02:00
commit f7f12480d0
3 changed files with 136 additions and 5 deletions

128
docs/automation-examples.md Normal file
View file

@ -0,0 +1,128 @@
# Automation Examples
These examples are intended as starting points for local scripts and
infrastructure automation. They assume the single `geth` executable is on
`PATH`.
## Shell
Initialize a home, start the daemon in a user-owned process, wait for control,
and read stable JSON status:
```sh
#!/usr/bin/env sh
set -eu
export GETH_HOME="${GETH_HOME:-$HOME/.local/share/geth/geth}"
geth init
geth daemon run >"$GETH_HOME/daemon.log" 2>&1 &
daemon_pid=$!
geth wait daemon --timeout-ms 30000
geth doctor --json
geth status --json
trap 'kill "$daemon_pid" 2>/dev/null || true' EXIT
```
Create a backup into a separate directory and validate that it can restore to a
new home:
```sh
#!/usr/bin/env sh
set -eu
backup_dir="${1:?backup dir required}"
restore_home="$(mktemp -d)"
geth backup create --out "$backup_dir"
geth backup restore "$backup_dir" --target-home "$restore_home"
GETH_HOME="$restore_home" geth doctor --json || true
```
## Python JSON
Use CLI JSON output without parsing human text:
```python
#!/usr/bin/env python3
import json
import os
import subprocess
import sys
def geth(*args, check=True):
proc = subprocess.run(
["geth", "--json", *args],
check=False,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=os.environ.copy(),
)
if check and proc.returncode != 0:
raise RuntimeError(proc.stderr or proc.stdout)
return json.loads(proc.stdout)
doctor = geth("doctor", check=False)
for check in doctor["checks"]:
print(check["status"], check["code"], check["message"])
status = geth("status")
print(status["node_id"], status.get("endpoint_id"))
```
Wait for a known peer before pulling sync status:
```python
#!/usr/bin/env python3
import json
import subprocess
import sys
node = sys.argv[1]
wait = subprocess.run(
["geth", "--json", "wait", "peer", node, "--timeout-ms", "30000"],
text=True,
stdout=subprocess.PIPE,
)
report = json.loads(wait.stdout)
if not report["ready"]:
raise SystemExit(report["reason"])
sync = subprocess.check_output(["geth", "--json", "sync", "status"], text=True)
print(sync)
```
## User Service
Install and operate the daemon through the current user's service manager. These
commands do not install a system service and do not require privileged service
manager mutation:
```sh
geth daemon service print
geth daemon service install --start
geth wait daemon --timeout-ms 30000
geth daemon service status
geth daemon service stop
geth daemon service uninstall
```
Admin SSH keys remain outside geth state. Automation should pass public admin
keys with `--admin-key` and use the matching private key only as an argument to
the explicit signing command when an admin operation is intended:
```sh
geth init \
--admin-key "$HOME/.ssh/id_ed25519.pub" \
--signing-key "$HOME/.ssh/id_ed25519" \
--node-name "$(hostname)"
```
Do not copy private SSH admin keys into `GETH_HOME`, backups, service
definitions, or shared project repositories.