Two processes, one NNTP connection each (the coordinator 40 -> 38): - spots:read (service spotter): free.pt's overviews after the last article seen, each spot's full header verified (lib/spotnet from voyager 1, as Spotweb), its description, website and NZB articles; the password its title or text names; delete/dispose messages applied. - spots:inspect (service spot-inspector): each spot's compressed NZB read, its files listed (spot_files), each matched to the header pass's release by the same release identity in one of its groups within 48 h (release_spots); unmatched spots matched again hourly, after 24 h a release of their own (source spot) with the spot's NZB. - release_passwords: per release and password, its source (nzb, spot-title, spot-text) and spot; the catalog keeps only passworded. XoverClient.head(); PROBE_CONNECTIONS default 10. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55 lines
2.2 KiB
Bash
Executable File
55 lines
2.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# Deploys voyager 2 (branch rebuild) on homelab at one commit. Installed as
|
|
# ~/bin/deploy-usenet-rebuild (by hand: it doesn't update itself). Gitea CI
|
|
# runs it through the forced SSH command of the deploy key, as
|
|
# "deploy-rebuild <sha>" (~/bin/deploy-usenet-indexer passes that on); by
|
|
# hand: deploy-usenet-rebuild <sha>. The code comes from the Gitea repo, not
|
|
# from the CI job.
|
|
set -eu
|
|
|
|
REPO=https://gitea.exp.sforum.nl/daan/usenet-indexer.git
|
|
BRANCH=rebuild
|
|
ROOT=/mnt/bulk/usenet-rebuild
|
|
CACHE="$ROOT/.cache"
|
|
GIT="$CACHE/repo.git"
|
|
|
|
SHA="${1:-}"
|
|
case "$SHA" in
|
|
*[!0-9a-f]* | "") echo "usage: deploy-usenet-rebuild <40-character commit sha>" >&2; exit 2 ;;
|
|
esac
|
|
[ "${#SHA}" -eq 40 ] || { echo "usage: deploy-usenet-rebuild <40-character commit sha>" >&2; exit 2; }
|
|
|
|
mkdir -p "$CACHE"
|
|
# One deploy at a time; a second one waits.
|
|
exec 9>"$CACHE/deploy.lock"
|
|
flock 9
|
|
|
|
echo "== fetching $SHA"
|
|
[ -d "$GIT" ] || git clone --quiet --bare "$REPO" "$GIT"
|
|
git -C "$GIT" fetch --quiet --prune "$REPO" '+refs/heads/*:refs/heads/*'
|
|
git -C "$GIT" cat-file -e "$SHA^{commit}"
|
|
git -C "$GIT" merge-base --is-ancestor "$SHA" "refs/heads/$BRANCH" || { echo "$SHA is not on $BRANCH" >&2; exit 2; }
|
|
|
|
STAGE=$(mktemp -d)
|
|
trap 'rm -rf "$STAGE"' EXIT
|
|
git -C "$GIT" archive "$SHA" | tar -x -C "$STAGE"
|
|
rsync -a --delete "$STAGE"/ "$ROOT/src/"
|
|
install -m 644 "$ROOT/src/deploy/compose.yaml" "$ROOT/compose.yaml"
|
|
|
|
cd "$ROOT"
|
|
echo "== building images"
|
|
docker compose build migrate edge
|
|
echo "== running migrations"
|
|
docker compose run --rm --no-deps migrate
|
|
# Only the app services, never postgres. The worker first: one holding a
|
|
# stream keeps the node API from exiting.
|
|
echo "== recreating app services"
|
|
docker compose stop edge
|
|
docker compose up -d --no-deps node-api web coordinator prober merger spotter spot-inspector
|
|
docker compose up -d --no-deps edge
|
|
echo "$SHA $(date -Is)" >> "$ROOT/deployed.log"
|
|
# The images this replaced (321 MB each; the root filesystem is the NVMe, with a 10 GB floor).
|
|
docker image prune -f --filter label=com.docker.compose.project=usenet-rebuild >/dev/null
|
|
docker compose ps --format '{{.Service}} {{.Status}}' node-api web coordinator prober merger spotter spot-inspector edge
|
|
echo "== deployed $SHA"
|