AkurAI Build
Menu

AkurAI-Build

public

Latest change 32946d79ecd7d436b3978f5757db6b3a392b3ca8 - AKURAI-BUILD-11 consolidate self-hosted deployment by Ólafur Búi Ólafsson

#!/bin/sh
set -eu

current=akurai-build-service
next=akurai-build-service-next
previous=akurai-build-service-previous
commit=$(git rev-parse --verify HEAD)
version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | sed -n '1p')
image="akurai-build-service:${commit}"

[ -n "$version" ]
test -x target/release/akurai
curl -fsS http://127.0.0.1:3211/api/health >/dev/null

docker build --target service-prebuilt \
  --tag "$image" \
  --tag "akurai-build-service:${version}" \
  --file deploy/Dockerfile .

docker rm -f "$next" "$previous" >/dev/null 2>&1 || true
docker create \
  --name "$next" \
  --network host \
  --restart unless-stopped \
  --user 1000:1000 \
  --memory 1g \
  --memory-swap 1g \
  --cpus 2 \
  --env-file /home/olafurbui/.config/akurai-build/env \
  --env HOME=/home/olafurbui \
  --env RUST_LOG=akurai_build=info,tower_http=info \
  --env AKURAI_WORKERS=0 \
  --volume /home/olafurbui/.local/share/akurai-build:/home/olafurbui/.local/share/akurai-build \
  --volume /home/olafurbui/.config/akurai-build:/home/olafurbui/.config/akurai-build:ro \
  --health-cmd 'curl -fsS http://127.0.0.1:3210/api/health' \
  --health-interval 10s \
  --health-timeout 3s \
  --health-retries 12 \
  --health-start-period 10s \
  "$image" \
  --data /home/olafurbui/.local/share/akurai-build \
  --key-file /home/olafurbui/.config/akurai-build/database.key \
  serve \
  --address 0.0.0.0:3210 \
  --token-file /home/olafurbui/.config/akurai-build/api.token \
  --webhook-secret-file /home/olafurbui/.config/akurai-build/webhook.token >/dev/null

old_renamed=0
new_renamed=0
rollback() {
  status=$?
  trap - EXIT HUP INT TERM
  if [ "$new_renamed" -eq 1 ]; then
    docker stop "$current" >/dev/null 2>&1 || true
    docker rename "$current" "$next" >/dev/null 2>&1 || true
  fi
  if [ "$old_renamed" -eq 1 ]; then
    docker rename "$previous" "$current" >/dev/null 2>&1 || true
    docker start "$current" >/dev/null 2>&1 || true
  fi
  docker rm -f "$next" >/dev/null 2>&1 || true
  exit "$status"
}
trap rollback EXIT HUP INT TERM

docker stop "$current" >/dev/null
docker rename "$current" "$previous"
old_renamed=1
docker rename "$next" "$current"
new_renamed=1
docker start "$current" >/dev/null

attempt=0
while [ "$attempt" -lt 30 ]; do
  health=$(docker inspect --format '{{.State.Health.Status}}' "$current")
  if [ "$health" = healthy ]; then
    curl -fsS http://127.0.0.1:3211/api/health >/dev/null
    docker rm "$previous" >/dev/null
    old_renamed=0
    new_renamed=0
    trap - EXIT HUP INT TERM
    exit 0
  fi
  if [ "$health" = unhealthy ]; then
    break
  fi
  attempt=$((attempt + 1))
  sleep 2
done

printf '%s\n' "replacement service did not become healthy" >&2
exit 1