d29c18e2bc
CI / Typecheck, test & build (push) Failing after 49s
- 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>
68 lines
2.5 KiB
Bash
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
|