Files
Momento/scripts/deploy-prod.sh
Antigravity b02f19b1a0
All checks were successful
CI / Lint, Test & Build (push) Successful in 1m50s
CI / Deploy production (on server) (push) Successful in 20s
fix(deploy): preserve Prometheus TSDB history — only recreate if config changed
2026-05-21 20:40:56 +00:00

111 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Déploiement prod sur 192.168.1.190 — exécuter SUR LE SERVEUR (runner docker-host).
set -euo pipefail
ROOT="${DEPLOY_ROOT:-/opt/memento}"
ARTIFACT_TGZ="${ARTIFACT_TGZ:-}"
EXPECTED_COMMIT="${EXPECTED_COMMIT:-}"
cd "$ROOT"
git config --global --add safe.directory "$ROOT" 2>/dev/null || true
git fetch origin main
git reset --hard origin/main
export GIT_COMMIT="$(git rev-parse HEAD)"
echo "=== Deploy $GIT_COMMIT ==="
if [ -n "$EXPECTED_COMMIT" ] && [ "$GIT_COMMIT" != "$EXPECTED_COMMIT" ]; then
echo "ERROR: git HEAD $GIT_COMMIT != expected $EXPECTED_COMMIT"
exit 1
fi
docker compose up -d postgres
for i in $(seq 1 30); do
docker compose exec -T postgres pg_isready -U "${POSTGRES_USER:-memento}" >/dev/null 2>&1 && break
[ "$i" -eq 30 ] && { echo "Postgres not ready"; exit 1; }
sleep 2
done
docker compose exec -T postgres psql -U "${POSTGRES_USER:-memento}" -d "${POSTGRES_DB:-memento}" -c "CREATE EXTENSION IF NOT EXISTS vector;" >/dev/null
if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -q '^memento-note/prisma/migrations/'; then
DUMP_FILE="/opt/memento/backups/pre-migrate-$(date +%Y%m%d-%H%M%S).sql.gz"
mkdir -p /opt/memento/backups
docker compose exec -T postgres pg_dump -U "${POSTGRES_USER:-memento}" -d "${POSTGRES_DB:-memento}" --clean --if-exists | gzip > "$DUMP_FILE"
DUMP_SIZE=$(stat -c%s "$DUMP_FILE")
if [ "$DUMP_SIZE" -lt 1048576 ]; then
echo "ERROR: Dump too small ($DUMP_SIZE bytes)"
exit 1
fi
echo "Backup: $DUMP_FILE ($(( DUMP_SIZE / 1024 ))KB)"
else
echo "No migration change — skip pre-migrate dump"
fi
export COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1
export GIT_COMMIT
if [ -n "$ARTIFACT_TGZ" ] && [ -f "$ARTIFACT_TGZ" ]; then
echo "=== Fast image (CI artifact) ==="
tar xzf "$ARTIFACT_TGZ" -C memento-note/
export MEMENTO_DOCKERFILE=Dockerfile.prebuilt
export MEMENTO_SOCKET_DOCKERFILE=Dockerfile.socket.prebuilt
else
echo "=== Full docker build (no artifact) ==="
export MEMENTO_DOCKERFILE=Dockerfile
export MEMENTO_SOCKET_DOCKERFILE=Dockerfile.socket
fi
docker compose build memento-note
docker compose build memento-socket
if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -q '^mcp-server/'; then
docker compose build mcp-server
fi
docker compose up -d --remove-orphans --force-recreate memento-note
docker compose up -d memento-socket
docker compose up -d mcp-server 2>/dev/null || true
echo "=== Migrations (Prisma CLI via node, pas npx) ==="
if docker compose exec -T memento-note test -f ./node_modules/prisma/build/index.js 2>/dev/null; then
docker compose exec -T memento-note node ./node_modules/prisma/build/index.js migrate deploy
else
echo "WARN: prisma CLI absent de l'image — les migrations tournent au démarrage (entrypoint) ou via psql manuel"
fi
nginx -t 2>/dev/null && systemctl reload nginx 2>/dev/null || true
for i in $(seq 1 24); do
BODY=$(docker compose exec -T memento-note node -e "require('http').get('http://localhost:3000/api/build-info',r=>{let d='';r.on('data',c=>d+=c);r.on('end',()=>{console.log(d);process.exit(0)})}).on('error',()=>process.exit(1))" 2>/dev/null || true)
ACTUAL=$(echo "$BODY" | jq -r '.commit // empty' 2>/dev/null || true)
if [ "$ACTUAL" = "$GIT_COMMIT" ]; then
echo "OK build-info commit=$ACTUAL"
if docker ps --format '{{.Names}}' | grep -q "^memento-grafana$"; then
# Ne recréer Prometheus que si sa config a changé (préserve l'historique TSDB)
PROM_CHANGED=$(git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -E '^monitoring/(prometheus\.yml|alerts\.yml)' || true)
GRAFANA_CHANGED=$(git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -E '^monitoring/' || true)
if [ -n "$PROM_CHANGED" ]; then
echo "=== Prometheus config changed — recreating ==="
docker compose -f monitoring/docker-compose.monitoring.yml up -d --force-recreate prometheus
else
echo "=== Prometheus config unchanged — keeping TSDB history ==="
docker compose -f monitoring/docker-compose.monitoring.yml up -d prometheus
fi
if [ -n "$GRAFANA_CHANGED" ]; then
echo "=== Grafana config changed — recreating ==="
docker compose -f monitoring/docker-compose.monitoring.yml up -d --force-recreate grafana
else
echo "=== Grafana config unchanged — keeping state ==="
docker compose -f monitoring/docker-compose.monitoring.yml up -d grafana
fi
fi
docker compose ps
exit 0
fi
sleep 5
done
echo "ERROR: build-info=$ACTUAL expected=$GIT_COMMIT"
docker logs memento-web --tail=40
exit 1