94 lines
2.5 KiB
Bash
Executable File
94 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
KUBECONFIG="${KUBECONFIG:-${KUBECONFIG_PATH:-${HOME}/.kube/config}}"
|
|
|
|
check() {
|
|
local label="$1"
|
|
shift
|
|
|
|
printf '%-36s ' "${label}"
|
|
if "$@" >/tmp/homelab-recover-check.$$ 2>&1; then
|
|
printf 'ok\n'
|
|
else
|
|
printf 'check\n'
|
|
sed -n '1,3p' /tmp/homelab-recover-check.$$ | sed 's/^/ /'
|
|
fi
|
|
rm -f /tmp/homelab-recover-check.$$
|
|
}
|
|
|
|
has_gitea_backup() {
|
|
find "${LAB_GITEA_BACKUP_DIR:-/home/jv/backups/gitea}" -maxdepth 1 -type f -name 'gitea-*.zip' -print -quit | grep -q .
|
|
}
|
|
|
|
has_state_backup() {
|
|
find "${HOMELAB_TOFU_STATE_BACKUP_DIR:-${XDG_DATA_HOME:-${HOME}/.local/share}/homelab/tofu-state-backups}" -maxdepth 1 -type f -name 'tofu-state-*.tgz' -print -quit | grep -q .
|
|
}
|
|
|
|
main() {
|
|
cat <<'EOF'
|
|
== Homelab Recovery Order ==
|
|
|
|
1. Restore Debian control host baseline.
|
|
Command: ./jeannie validate
|
|
Check: Docker, containerd, Tailscale, kubeconfig path, repo checkout.
|
|
|
|
2. Restore or verify Gitea.
|
|
Commands:
|
|
./jeannie deploy-gitea
|
|
./jeannie drill-gitea-restore
|
|
./jeannie bootstrap-gitea-repo
|
|
|
|
3. Restore RPi DNS services.
|
|
Commands:
|
|
./jeannie rpi-services
|
|
./jeannie doctor-rpi
|
|
./jeannie drill-pihole-restore
|
|
|
|
4. Verify Pimox template and worker storage.
|
|
Commands:
|
|
./jeannie preflight
|
|
./jeannie doctor-preapply
|
|
|
|
5. Rebuild or start Kubernetes.
|
|
If state exists and nodes are stopped: ./jeannie start-cluster
|
|
If cluster must be rebuilt: ./jeannie rebuild-cluster
|
|
|
|
6. Restore platform and apps from GitOps.
|
|
Commands:
|
|
./jeannie apps
|
|
./jeannie gitops-status
|
|
|
|
7. Verify public edge.
|
|
Commands:
|
|
./jeannie doctor-edge
|
|
./jeannie cert-check
|
|
./jeannie status
|
|
|
|
8. Capture final recovery evidence.
|
|
Commands:
|
|
./jeannie release-snapshot
|
|
./jeannie backup-gitea
|
|
./jeannie state-backup
|
|
|
|
EOF
|
|
|
|
echo "== Current Recovery Inputs =="
|
|
check "repo validation" "${REPO_ROOT}/scripts/validate-homelab"
|
|
check "Gitea backup archive" has_gitea_backup
|
|
check "OpenTofu state backup" has_state_backup
|
|
check "Pi-hole restore inputs" "${REPO_ROOT}/scripts/restore-drill" pihole
|
|
check "Kubernetes API" kubectl --kubeconfig "${KUBECONFIG}" get --raw=/readyz
|
|
|
|
cat <<'EOF'
|
|
|
|
== Recovery Rule ==
|
|
Prefer restoring source-of-truth first: repo, Gitea, DNS, state backups, then
|
|
rebuild compute. Treat Pimox worker disks as rebuildable unless a service has an
|
|
explicit backup and restore path.
|
|
EOF
|
|
}
|
|
|
|
main "$@"
|