Deployment Checklist Deployment Checklist Project: Bilko Version: 0.1 Date: 2026-02-23 Author: Ops Architect Status: Draft Reviewers: Tech Lead, Alem Bašić Document History Version Date Author Changes 0.1 2026-02-23 Ops Architect Initial draft INSTRUCTIONS Use this checklist for every production deployment. Create a copy for each release: DEPLOY-CHECKLIST-YYYY-MM-DD-vX.X.X.md in docs/releases/ Never skip items. If an item doesn't apply, mark N/A with reason. Deployment Checklist: Bilko v[VERSION] Deploy date: YYYY-MM-DD Deploy time: HH:MM CET Release notes: [Link to release notes] Deployer: [Name] Reviewer: [Name] Pre-Deployment (Run 24 Hours Before) Code & Tests All CI checks green on main branch (lint, type-check, unit tests, integration tests, build, E2E) Coverage ≥ 80% overall, ≥ 95% financial logic All PRs in this release merged to main No TODO or FIXME comments referencing this release No skipped tests ( it.skip , test.skip ) in financial logic files Release notes prepared and reviewed Database New migrations reviewed by Tech Lead Migrations tested on staging environment: Applied successfully: Yes / No Rollback (down migration) tested: Yes / No Migration time on staging (record): ___ seconds Migration is backward-compatible (old API version can still read data): Yes / N/A If schema changes: Prisma Client regenerated and tested Security No new secrets committed to git ( git log --all --grep='password\|secret\|key' — should be clean) All new API endpoints require authentication (no accidental public endpoints) RBAC verified for new endpoints (correct roles enforced) Zod validation applied to all new request bodies No cross-org data leakage in new queries Financial Logic (Skip if release has no financial changes) VAT calculations tested for all 3 countries (RS 20%, BA 17%, HR 25%) Double-entry validation enforced for all new transaction creation paths NUMERIC(19,4) used throughout — no JavaScript number for monetary values Exchange rate locking verified for multi-currency transactions Invoice total calculation verified: subtotal + VAT - discount = total (exact, no float) Staging Verification (Run 2 Hours Before) Staging deployment successful (same build that will go to production) Staging health check passing: curl https://staging-api.bilko.io/health Manual smoke test on staging: Login with test account Create invoice (RSD, 20% VAT) — verify totals correct Create expense with receipt upload Generate VAT report Verify report numbers are consistent with data E2E tests pass on staging No new Sentry errors after staging deploy (check Sentry for 30 min) Database migrations applied to staging: bilko_staging DB Backup (Run 30 Minutes Before) Pre-deploy backup taken: railway run pg_dump $DATABASE_URL -f pre_deploy_$(date +%Y%m%d_%H%M).dump Backup file accessible and non-empty Backup stored in secure location (note location here): _______ Deployment Execution Step 1: Apply Database Migrations Migrations applied to production: railway run npx prisma migrate deploy Migration successful: Yes / No Post-migration record count check: railway run psql $DATABASE_URL -c "SELECT COUNT(*) FROM invoices, COUNT(*) FROM organizations;" Invoice count: ___ Organization count: ___ Step 2: Deploy Backend (Railway) Push to main triggers Railway production deploy (automatic via CI) OR manual: railway up --service api --environment production Railway deployment successful Railway health check green: curl https://api.bilko.io/health No restart loops in Railway logs Step 3: Deploy Frontend (Vercel) Vercel production deployment successful (automatic via CI) OR manual: cd apps/web && vercel --prod bilko.io loads correctly in browser No browser console errors on first load Post-Deployment Verification (Run Immediately After Deploy) API health: curl https://api.bilko.io/health → {"status":"ok","db":"ok"} Frontend: curl -I https://bilko.io → HTTP/2 200 Login flow: can log in with test account Invoice creation: create test invoice, verify totals BetterStack: all monitors green Sentry: no new error types in first 15 minutes Railway: CPU < 50%, Memory < 1GB 15-Minute Monitoring Window Monitor for 15 minutes after deploy. Record observations: Time API Health Error Rate CPU Memory Notes +0 min +5 min +10 min +15 min Deploy declared successful: [ ] Yes — at HH:MM by [Name] Rollback Criteria Rollback immediately if: Health check fails for > 3 consecutive minutes Error rate > 5% (Sentry) Any financial calculation producing incorrect results Authentication completely broken See rollback procedure: rollback-plan.md Post-Deploy Cleanup Rollback plan document created for this release (if major release) Release notes published Team notified in Slack #bilko-deploys: "v[VERSION] deployed successfully" Deploy notes added to GitHub release tag Approval Role Name Date Signature Deployer Reviewer Alem Bašić