50 lines
1.7 KiB
Bash
50 lines
1.7 KiB
Bash
#!/usr/bin/env bash
|
||
# Deploy till befintlig server (spec §51, steg 1).
|
||
# Körs som den dedikerade app-användaren på servern.
|
||
set -euo pipefail
|
||
|
||
APP_DIR="/opt/${APP_SLUG:-app}-platform"
|
||
REPO_DIR="$APP_DIR/repo"
|
||
COMPOSE="$REPO_DIR/infrastructure/docker/docker-compose.production.yml"
|
||
|
||
echo "==> Deploy $(date -Iseconds)"
|
||
|
||
cd "$REPO_DIR"
|
||
git fetch --tags origin main
|
||
PREV_SHA=$(git rev-parse HEAD)
|
||
git reset --hard origin/main
|
||
NEW_SHA=$(git rev-parse HEAD)
|
||
echo "==> $PREV_SHA -> $NEW_SHA"
|
||
|
||
echo "==> Bygger images"
|
||
docker compose -f "$COMPOSE" build
|
||
|
||
echo "==> Kör databas-migrationer (med backup-punkt först)"
|
||
# RDS: automatiska snapshots finns; ta även logisk dump för snabb rollback.
|
||
mkdir -p "$APP_DIR/backups"
|
||
pg_dump "$DATABASE_URL" --format=custom \
|
||
--file="$APP_DIR/backups/pre-deploy-$(date +%Y%m%d-%H%M%S).dump" || {
|
||
echo "VARNING: pg_dump misslyckades – avbryter deploy (spec §63: ingen migration utan backup)"; exit 1;
|
||
}
|
||
docker run --rm --env-file "$APP_DIR/secrets/api.env" app-api:latest \
|
||
node dist/index.js --migrate-only 2>/dev/null || true
|
||
# Migrationer körs normalt från CI/lokalt: pnpm db:migrate mot produktion via bastion.
|
||
|
||
echo "==> Startar om tjänster (rullande)"
|
||
docker compose -f "$COMPOSE" up -d app-redis
|
||
docker compose -f "$COMPOSE" up -d app-worker
|
||
docker compose -f "$COMPOSE" up -d app-api
|
||
docker compose -f "$COMPOSE" up -d app-admin
|
||
|
||
echo "==> Healthcheck"
|
||
sleep 5
|
||
if ! curl -fsS http://127.0.0.1:4100/healthz > /dev/null; then
|
||
echo "FEL: API svarar inte – rollback till $PREV_SHA"
|
||
git reset --hard "$PREV_SHA"
|
||
docker compose -f "$COMPOSE" build app-api
|
||
docker compose -f "$COMPOSE" up -d app-api
|
||
exit 1
|
||
fi
|
||
|
||
echo "==> Deploy klar: $NEW_SHA"
|