chahinebrini d1b71e76b2 chore(cutover): prepare backend/-Layout for Hetzner-Pipeline-Cutover
Phase-1-Vorbereitung für den Rebreak-Cutover (apps/rebreak Nuxt → backend
standalone Nitro). Alle Änderungen sind lokal verifiziert (build = 9.66 MB
gzipped 3.08 MB, node .output/server/index.mjs startet ohne ERR_MODULE_NOT_FOUND
auf :3000). Kein Push, kein Server-Eingriff in dieser Session.

Inhalt:

- backend/nitro.config.ts: 8 zusätzliche runtimeConfig-Keys (cartesia*, eleven*,
  supabaseUrl/AnonKey/ServiceKey, public.supabase.{url,key}). Schließt den
  Auth-500-Cascade vom 2026-05-06 (server/utils/auth.ts:32 liest
  config.public.supabase ?? config.supabase — beide Pfade jetzt deklariert).

- .npmrc (NEU, root-level): node-linker=hoisted für Prisma 7 transitive
  @prisma/client-runtime-utils (siehe feedback_backend_runtime_config.md).

- backend/start-staging.sh: Pfad korrigiert von /srv/rebreak-monorepo/...
  → /srv/rebreak/backend/.output-staging/server/index.mjs. infisical run
  wrapper (kein NUXT_*-Mapping mehr — runtimeConfig liest process.env.X
  direkt). IMAP-Services entfernt (sind Mo's Scope, separat in ecosystem).

- scripts/deploy.sh (NEU): adaptiert von /srv/rebreak/scripts/deploy.sh
  für backend/-Layout. APP_DIR=backend, pnpm --filter rebreak-backend build,
  .output → .output-staging atomic-move bleibt erhalten, pm2 restart
  --update-env zieht neue Infisical-Secrets.

- scripts/deploy-webhook/server.mjs (NEU): 1:1-Kopie vom Server, damit
  ecosystem.config.js auf die Repo-Version zeigen kann.

- ecosystem.config.js (NEU, root-level): rebreak-staging zeigt auf
  backend/start-staging.sh, rebreak-webhook zeigt auf scripts/deploy-webhook.
  rebreak-prod + dns-* sind kommentiert (folgen in späterer Phase).

- ops/CUTOVER_PLAN.md: Plan-Doku vom 2026-05-06 (yesterday's work).

- .gitignore: .claude/ und xgit ergänzt (lokale Agent-State, nicht versioniert).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 00:35:50 +02:00

94 lines
3.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# deploy.sh Rebreak Deploy Script (backend/-Layout, post-cutover)
#
# Wird vom Webhook-Listener (scripts/deploy-webhook/server.mjs) aufgerufen.
# Repo-Root: /srv/rebreak
# Clone: git@github.com:RaynisDev/rebreak.git
# Backend: /srv/rebreak/backend (standalone Nitro, package: rebreak-backend)
#
# Ablauf:
# 1. Git pull (via Deploy-Key)
# 2. pnpm install --frozen-lockfile (mit hoisted node-linker via .npmrc)
# 3. cd backend && pnpm --filter rebreak-backend build (Prisma generate + Nitro build)
# 4. .output → .output-staging (atomisch via tmp)
# 5. pm2 restart rebreak-staging --update-env
# 6. pm2 restart rebreak-imap-staging / rebreak-idle-staging (best-effort, falls vorhanden)
# 7. pm2 restart dns-rebreak-staging / dns-rebreak (best-effort, falls vorhanden)
#
# Secrets: via Infisical (INFISICAL_CLIENT_ID/SECRET in /etc/environment) — NICHT hier,
# sondern in start-staging.sh / ecosystem.config.js zur Laufzeit.
set -euo pipefail
REPO_ROOT="/srv/rebreak"
APP_DIR="${REPO_ROOT}/backend"
NODE_BIN="/root/.nvm/versions/node/v24.11.1/bin/node"
PNPM_BIN="/root/.nvm/versions/node/v24.11.1/bin/pnpm"
PM2_BIN="/root/.nvm/versions/node/v24.11.1/bin/pm2"
log() { echo "[deploy] $(date '+%H:%M:%S') $*"; }
log_err() { echo "[deploy:err] $(date '+%H:%M:%S') $*" >&2; }
log "=== Rebreak Deploy gestartet (backend/-Layout) ==="
# 0. Sicherstellen dass PATH stimmt
export PATH="/root/.nvm/versions/node/v24.11.1/bin:$PATH"
# 1. Git pull via Deploy-Key (SSH ist konfiguriert in /root/.ssh/config)
log "Step 1: git pull..."
cd "${REPO_ROOT}"
git fetch origin main 2>&1
git reset --hard origin/main 2>&1
git clean -fd 2>&1
log "Git updated to $(git rev-parse --short HEAD)"
# 2. pnpm install (workspace-root, .npmrc mit node-linker=hoisted ist im Repo)
log "Step 2: pnpm install --frozen-lockfile..."
cd "${REPO_ROOT}"
CI=true "${PNPM_BIN}" install --frozen-lockfile 2>&1 || {
log_err "frozen-lockfile fehlgeschlagen, fallback ohne frozen..."
CI=true "${PNPM_BIN}" install --no-frozen-lockfile 2>&1
}
log "pnpm install done"
# 3. Build backend (Nitro standalone) — Prisma generate ist Teil des build-scripts
log "Step 3: pnpm --filter rebreak-backend build..."
cd "${APP_DIR}"
# NODE_OPTIONS: max 1.5 GB für den Build-Prozess (4 GB RAM Server)
NODE_OPTIONS="--max-old-space-size=1536" CI=true "${PNPM_BIN}" --filter rebreak-backend build 2>&1
log "Build done"
# 4. Atomisches Deploy: .output → .output-staging (relativ zu backend/)
log "Step 4: Atomisches Deploy .output → .output-staging..."
cd "${APP_DIR}"
if [ -d ".output" ]; then
rm -rf .output-staging-new
cp -r .output .output-staging-new
rm -rf .output-staging
mv .output-staging-new .output-staging
log ".output-staging aktualisiert"
else
log_err "FEHLER: .output Verzeichnis nicht gefunden nach Build!"
exit 1
fi
# 5. pm2 restart rebreak-staging (--update-env zieht neue Infisical-secrets)
log "Step 5: pm2 restart rebreak-staging..."
"${PM2_BIN}" restart rebreak-staging --update-env 2>/dev/null || \
"${PM2_BIN}" start "${REPO_ROOT}/ecosystem.config.js" --only rebreak-staging
log "rebreak-staging restarted"
# 6. IMAP + DNS Services (optional kein Fehler wenn nicht vorhanden, Mo's Scope)
log "Step 6: Optional services restart..."
"${PM2_BIN}" restart rebreak-imap-staging 2>/dev/null || true
"${PM2_BIN}" restart rebreak-idle-staging 2>/dev/null || true
"${PM2_BIN}" restart dns-rebreak-staging 2>/dev/null || \
"${PM2_BIN}" start "${REPO_ROOT}/ecosystem.config.js" --only dns-rebreak-staging 2>/dev/null || true
"${PM2_BIN}" restart dns-rebreak 2>/dev/null || \
"${PM2_BIN}" start "${REPO_ROOT}/ecosystem.config.js" --only dns-rebreak 2>/dev/null || true
# 7. pm2 save
"${PM2_BIN}" save 2>/dev/null || true
log "=== Deploy erfolgreich: $(git -C ${REPO_ROOT} rev-parse --short HEAD) ==="