#!/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=$(curl -sf --max-time 3 http://127.0.0.1:3000/api/build-info 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" 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