#!/usr/bin/env bash # Runs on the deploy VPS as the `deploy` user (member of the docker group). # Shipped here by CI alongside docker-compose.yaml. # # IMAGE_TAG= /home/deploy/websites/ksan.dev/deploy.sh # # On success the tag is recorded in .tag.good, which rollback.sh reads. set -euo pipefail SITE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SITE_DIR" : "${IMAGE_TAG:?IMAGE_TAG must be set}" if [[ ! "$IMAGE_TAG" =~ ^[0-9a-f]{7,40}$ ]]; then echo "deploy: refusing to deploy non-sha tag '$IMAGE_TAG'" >&2 exit 1 fi export IMAGE_TAG echo "deploy: pulling $IMAGE_TAG" docker compose pull --quiet echo "deploy: starting" # --wait blocks on the healthcheck, so a container that boots and immediately # dies fails here rather than being reported as a successful deploy. if ! docker compose up -d --remove-orphans --wait --wait-timeout 120; then echo "deploy: container did not become healthy" >&2 docker compose logs --tail 50 >&2 || true exit 1 fi echo "$IMAGE_TAG" > .tag.good echo "deploy: $IMAGE_TAG is live" # Old images accumulate fast on a multi-site box; keep a week for rollbacks. docker image prune -f --filter until=168h >/dev/null 2>&1 || true