Files
Cibello-app/infrastructure/deployment/deploy.sh
T
Claude d29c18e2bc
CI / Typecheck, test & build (push) Failing after 49s
feat(ops): saker deploy-process - tools-container for migrera/seed + omskriven deploy.sh + runbook
- Dockerfile.tools + app-tools compose-tjanst (profile: tools): on-demand migrera/seed via tsx, kor aldrig som tjanst.
- deploy.sh omskriven: ratt gren (master), ratt sokvag (/opt/cibello-platform), riktig migrering via tools-container (ersatter trasig --migrate-only), bygger api+worker, healthcheck med automatisk rollback.
- RUNBOOK.md: deploy, recept-/sprak-uppdatering, migreringar, rollback, admin.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-22 20:43:39 +00:00

68 lines
2.5 KiB
Bash

#!/usr/bin/env bash
# Cibello — säker, repeterbar produktions-deploy.
#
# Kör PÅ SERVERN som root (eller via sudo):
# sudo bash /opt/cibello-platform/infrastructure/deployment/deploy.sh
#
# Gör: hämta senaste från Gitea -> bygg api+worker -> migrera (idempotent) ->
# starta om -> healthcheck. Vid fel: automatisk rollback till föregående commit.
#
# Secrets (.env, secrets/*.env) är OTRACKADE i git och rörs aldrig av reset.
# Admin byggs INTE här (separat p.g.a. VITE_API_BASE_URL-build-arg) — se RUNBOOK.md.
#
# TIPS: ta en RDS-snapshot före deploys som innehåller schema-ändringar (migreringar).
set -euo pipefail
APP_DIR="/opt/cibello-platform"
COMPOSE="$APP_DIR/infrastructure/docker/docker-compose.production.yml"
HEALTH_URL="http://127.0.0.1:4100/healthz"
git_as_owner() { sudo -H -u ubuntu git -C "$APP_DIR" "$@"; }
echo "==> Cibello deploy $(date -Iseconds)"
# 1) Hämta senaste koden från Gitea (read-only deploy-koppling)
PREV_SHA="$(git_as_owner rev-parse HEAD)"
git_as_owner fetch origin
git_as_owner reset --hard origin/master
NEW_SHA="$(git_as_owner rev-parse HEAD)"
echo "==> Kod: ${PREV_SHA:0:7} -> ${NEW_SHA:0:7}"
if [ "$PREV_SHA" = "$NEW_SHA" ]; then
echo "==> Ingen ny kod. Bygger ändå om ifall images saknas."
fi
# 2) Bygg api + worker (admin hanteras separat)
echo "==> Bygger api + worker"
docker compose -f "$COMPOSE" build app-api app-worker
# 3) Migreringar — idempotent, via on-demand tools-container.
# (migrate.ts applicerar bara journal-poster nyare än max(created_at); klart no-op
# om inget nytt finns. Rör aldrig data, bara schema.)
echo "==> Bygger tools + kör migreringar"
docker compose -f "$COMPOSE" build app-tools
docker compose -f "$COMPOSE" --profile tools run --rm app-tools \
tsx packages/database/src/migrate.ts
# 4) Starta om tjänsterna med nya images
echo "==> Startar om api + worker"
docker compose -f "$COMPOSE" up -d app-api app-worker
# 5) Healthcheck med automatisk rollback
echo "==> Healthcheck (${HEALTH_URL})"
sleep 8
if curl -fsS "$HEALTH_URL" > /dev/null; then
echo "==> DEPLOY KLAR: ${NEW_SHA:0:7} (healthz OK)"
exit 0
fi
echo "!! API svarar inte — ROLLBACK till ${PREV_SHA:0:7}"
git_as_owner reset --hard "$PREV_SHA"
docker compose -f "$COMPOSE" build app-api app-worker
docker compose -f "$COMPOSE" up -d app-api app-worker
sleep 8
if curl -fsS "$HEALTH_URL" > /dev/null; then
echo "!! Rollback klar. Appen kör åter på ${PREV_SHA:0:7}. Deploy avbröts."
else
echo "!! KRITISKT: healthz svarar inte ens efter rollback. Undersök loggar: docker logs app-api"
fi
exit 1