#!/bin/sh # Ships knotless-fork: 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