From ce7fefd99f3a1cf02c4d194ba552156a7d798c13 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Thu, 5 Mar 2026 11:15:04 +0100 Subject: [PATCH] fix(cms): automate migrations on startup and clean up deploy pipeline --- .gitea/workflows/deploy.yml | 48 ++++--------------------------------- payload.config.ts | 1 + 2 files changed, 6 insertions(+), 43 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 70a96445..1fc2c71f 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -389,6 +389,10 @@ jobs: - name: 🚀 SSH Deploy shell: bash env: + TARGET: ${{ needs.prepare.outputs.target }} + SLUG: ${{ needs.prepare.outputs.slug }} + IMAGE_TAG: ${{ needs.prepare.outputs.image_tag }} + PROJECT_NAME: ${{ needs.prepare.outputs.project_name }} ENV_FILE: ${{ needs.prepare.outputs.env_file }} run: | mkdir -p ~/.ssh @@ -417,48 +421,6 @@ jobs: # Execute remote commands — alpha is pre-logged into registry.infra.mintel.me ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file $ENV_FILE pull && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file $ENV_FILE up -d --remove-orphans" - # Sanitize Payload Migrations: Replace 'dev' push entries with proper migration names. - # Without this, Payload prompts interactively for confirmation and blocks forever in Docker. - DB_CONTAINER="${{ needs.prepare.outputs.project_name }}-klz-db-1" - echo "⏳ Waiting for database container to be ready..." - for i in $(seq 1 15); do - if ssh root@alpha.mintel.me "docker exec $DB_CONTAINER pg_isready -U payload -q 2>/dev/null"; then - echo "✅ Database is ready." - break - fi - echo " Attempt $i/15..." - sleep 2 - done - - echo "🔧 Sanitizing payload_migrations table (if exists)..." - REMOTE_DB_USER=$(ssh root@alpha.mintel.me "grep -h '^PAYLOAD_DB_USER=' $SITE_DIR/.env* 2>/dev/null | tail -1 | cut -d= -f2" || echo "payload") - REMOTE_DB_NAME=$(ssh root@alpha.mintel.me "grep -h '^PAYLOAD_DB_NAME=' $SITE_DIR/.env* 2>/dev/null | tail -1 | cut -d= -f2" || echo "payload") - REMOTE_DB_USER="${REMOTE_DB_USER:-payload}" - REMOTE_DB_NAME="${REMOTE_DB_NAME:-payload}" - - # Auto-detect migrations from src/migrations/*.ts - BATCH=1 - VALUES="" - for f in $(ls src/migrations/*.ts 2>/dev/null | sort); do - NAME=$(basename "$f" .ts) - [ -n "$VALUES" ] && VALUES="$VALUES," - VALUES="$VALUES ('$NAME', $BATCH)" - ((BATCH++)) - done - - if [ -n "$VALUES" ]; then - echo " - DO \$\$ BEGIN - DELETE FROM payload_migrations WHERE batch = -1; - INSERT INTO payload_migrations (name, batch) - SELECT name, batch FROM (VALUES $VALUES) AS v(name, batch) - WHERE NOT EXISTS (SELECT 1 FROM payload_migrations pm WHERE pm.name = v.name); - EXCEPTION WHEN undefined_table THEN - RAISE NOTICE 'payload_migrations table does not exist yet — skipping sanitization'; - END \$\$; - " | ssh root@alpha.mintel.me "docker exec -i $DB_CONTAINER psql -U $REMOTE_DB_USER -d $REMOTE_DB_NAME" - fi - # Restart app to pick up clean migration state APP_CONTAINER="${{ needs.prepare.outputs.project_name }}-klz-app-1" ssh root@alpha.mintel.me "docker restart $APP_CONTAINER" @@ -620,7 +582,7 @@ jobs: STATUS_LINE="All checks passed" fi - TITLE="$EMOJI klz-cables.com $VERSION → $TARGET" + TITLE="$EMOJI klz-cables.com $VERSION -> $TARGET" MESSAGE="$STATUS_LINE Deploy: $DEPLOY | Smoke: $SMOKE | Perf: $PERF $URL" diff --git a/payload.config.ts b/payload.config.ts index 289ba29c..cfd6866b 100644 --- a/payload.config.ts +++ b/payload.config.ts @@ -29,6 +29,7 @@ const dirname = path.dirname(filename); export default buildConfig({ onInit: async (payload) => { if (process.env.NODE_ENV === 'production') { + await payload.db.migrateUp(); await seedDatabase(payload); } },