fix(deploy): add health/db-schema guard + curl gate; ship migration assets; document prod bootstrap (executed per systematic-debugging plan)
Deploy to route.crispygoat.com / deploy (push) Has been cancelled
Deploy to route.crispygoat.com / deploy (push) Has been cancelled
This commit is contained in:
@@ -24,7 +24,25 @@ jobs:
|
||||
env:
|
||||
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
||||
run: |
|
||||
npm run migrate:one || echo "No migration script or migrations already applied"
|
||||
set -e
|
||||
echo "=== Running migrations against DATABASE_URL (masked value for logs) ==="
|
||||
npm run migrate:one
|
||||
echo "=== Post-migration verification: critical table admin_users must exist ==="
|
||||
node -e '
|
||||
const { Client } = require("pg");
|
||||
const url = process.env.DATABASE_URL;
|
||||
if (!url) { console.error("No DATABASE_URL"); process.exit(1); }
|
||||
const c = new Client({ connectionString: url });
|
||||
c.connect()
|
||||
.then(() => c.query("SELECT 1 FROM admin_users LIMIT 1"))
|
||||
.then(() => { console.log("✓ admin_users table exists and is queryable"); return c.end(); })
|
||||
.then(() => process.exit(0))
|
||||
.catch(e => {
|
||||
console.error("✗ FATAL: admin_users relation missing after migrate:", e.message);
|
||||
console.error("The deploy cannot continue. The secret DATABASE_URL must have had db/migrations/0001_init.sql applied successfully.");
|
||||
process.exit(1);
|
||||
});
|
||||
'
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
@@ -183,8 +201,16 @@ jobs:
|
||||
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no package.json tyler@route.crispygoat.com:$APP_DIR/
|
||||
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no next.config.ts tyler@route.crispygoat.com:$APP_DIR/ 2>/dev/null || true
|
||||
|
||||
# Ship the migration runner + SQL so the server has a recovery path (scripts/ and db/migrations/ were previously omitted from the artifact).
|
||||
# This allows `node scripts/migrate.js` (after sourcing .env.production) to work directly on the target if needed for bootstrap or emergencies.
|
||||
# See docs/superpowers/plans/2026-06-prod-db-schema-migration-reliability.md
|
||||
echo "Ensuring migration directories on server and copying runner + SQL..."
|
||||
ssh -o ConnectTimeout=15 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "mkdir -p $APP_DIR/scripts $APP_DIR/db"
|
||||
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no scripts/migrate.js tyler@route.crispygoat.com:$APP_DIR/scripts/migrate.js 2>/dev/null || true
|
||||
scp -o ConnectTimeout=15 -o StrictHostKeyChecking=no -r db/migrations tyler@route.crispygoat.com:$APP_DIR/db/ 2>/dev/null || true
|
||||
|
||||
# Install deps and restart on server
|
||||
echo "Installing deps and restarting PM2..."
|
||||
ssh -o ConnectTimeout=60 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "cd $APP_DIR && npm install --omit=dev 2>&1 | tail -5 && pm2 restart route-commerce || pm2 start npm --name route-commerce -- start -- -p 3100 && pm2 save"
|
||||
ssh -o ConnectTimeout=60 -o StrictHostKeyChecking=no tyler@route.crispygoat.com "cd $APP_DIR && npm install --omit=dev 2>&1 | tail -5 && pm2 restart route-commerce || pm2 start npm --name route-commerce -- start -- -p 3100 && pm2 save && sleep 4 && curl -f -s http://localhost:3100/api/health/db-schema || { echo 'Health check failed after start - schema not applied (see plan)'; exit 1; }"
|
||||
|
||||
echo "Deployed successfully"
|
||||
Reference in New Issue
Block a user