~ knotless Search/
↑↓ move↵ open⇧↵ all results

johnandersen777.bsky.social/knotless-fork-infra

0
0
main
51 lines · 2.8 KB Raw History
#!/bin/sh
# Ships knotless-fork:<commit> from the build host to the gateway, installs host/ there and restarts.
#   scripts/deploy.sh            deploy versions.env's commit (build it first: scripts/build.sh)
#   scripts/deploy.sh rollback   back to the image the last deploy replaced
set -eu
cd "$(dirname "$0")/.."
. ./versions.env
tag=$(printf %.12s "$KNOTLESS_COMMIT")
gw="ssh -p ${SSH_PORT:-1997} -o BatchMode=yes ${SSH_TARGET:-root@socialweb.computer}"
units="knotless-fork-pages knotless-fork-serve knotless-fork-runner"
if [ "${1:-}" = rollback ]; then
	exec $gw "docker tag knotless-fork:previous knotless-fork:current && systemctl restart $units"
fi
id=$(ssh "${BUILD_HOST:-hat-8}" docker image inspect -f '{{.Id}}' knotless-fork:$tag)
[ "$($gw docker image inspect -f '{{.Id}}' knotless-fork:$tag 2>/dev/null)" = "$id" ] ||
	ssh "${BUILD_HOST:-hat-8}" "docker save knotless-fork:$tag | gzip -1" | $gw "gunzip | docker load"
tar -C host -cf - . | $gw "rm -rf /tmp/knotless-fork-host && mkdir /tmp/knotless-fork-host && tar -C /tmp/knotless-fork-host -xf -"
$gw "TAG=$tag UNITS='$units' sh -s" <<'REMOTE'
set -eu
h=/tmp/knotless-fork-host d=/var/lib/knotless-fork
install -d -m 700 /etc/knotless-fork
install -m 600 $h/knotless-fork.env /etc/knotless-fork/knotless-fork.env
install -d -o 1000 -g 1000 $d $d/serve $d/serve/bots $d/runner
[ -f $d/runner/iroh ] || ssh-keygen -q -t ed25519 -N '' -C knotless-fork-runner -f $d/runner/iroh
chown 1000:1000 $d/runner/iroh $d/runner/iroh.pub
install -m 644 $h/systemd/*.service /etc/systemd/system/
systemctl daemon-reload
changed=
for f in $h/caddy/*.caddy; do cmp -s $f /etc/caddy/sites/${f##*/} || changed=1; done
if [ -n "$changed" ]; then
	tar -C /etc -czf /root/etc-caddy-$(date -u +%Y%m%dT%H%M%SZ).tgz caddy
	for f in $h/caddy/*.caddy; do t=/etc/caddy/sites/${f##*/}; [ ! -f $t ] || cp $t $t.prev; cp $f $t; done
	if ! caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile >/dev/null 2>&1; then
		for f in $h/caddy/*.caddy; do t=/etc/caddy/sites/${f##*/}; if [ -f $t.prev ]; then mv $t.prev $t; else rm -f $t; fi; done
		echo "caddy validate failed: site files put back" >&2; exit 1
	fi
	for f in $h/caddy/*.caddy; do rm -f /etc/caddy/sites/${f##*/}.prev; done
	systemctl reload caddy
fi
cur=$(docker image inspect -f '{{.Id}}' knotless-fork:current 2>/dev/null || true)
if [ "$cur" != "$(docker image inspect -f '{{.Id}}' knotless-fork:$TAG)" ]; then
	[ -z "$cur" ] || docker tag knotless-fork:current knotless-fork:previous
	docker tag knotless-fork:$TAG knotless-fork:current
fi
systemctl enable -q $UNITS
systemctl restart $UNITS
REMOTE
for u in https://knotless.socialweb.computer/healthz https://knotless-runner.socialweb.computer/; do
	i=0; until curl -sf -o /dev/null "$u"; do i=$((i + 1)); [ $i -lt 40 ] || { echo "$u does not answer" >&2; exit 1; }; sleep 3; done
	echo "$u ok"
done