Go-Live Runbook
Go-Live Runbook
Project: Bilko Version: 0.1 — Initial Production Launch 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 |
1. Go-Live Overview
What: Bilko v1.0 — first production launch of the cloud accounting SaaS Target date: TBD (set when MVP backend complete) Deployment window: 2-hour window (prefer low-traffic: Tuesday–Thursday 10:00–12:00 CET) Go-Live Type: New product launch — no existing users to migrate
Incident Commander: Alem Bašić (+47 40 47 42 51) — primary Technical Lead: Alem Bašić (also, at MVP) War Room: Slack #bilko-deploys (create dedicated #bilko-launch channel for day-of) Status Page: status.bilko.io (PLANNED — configure BetterStack before launch)
2. Pre-Launch Checklist
T-7 Days: Infrastructure Verification
- Railway project created with
apiservice and PostgreSQL 15 database - Railway EU West region confirmed (GDPR compliance)
- Vercel project created and linked to GitHub repo (
alai-holding/bilko) - Cloudflare R2 bucket
bilko-receiptscreated with correct CORS policy - All production environment variables set in Railway and Vercel dashboards
- Railway health check endpoint (
GET /health) responding{"status":"ok","db":"ok"} - Vercel build successful (
pnpm run buildon main branch) - Database migrations applied:
railway run npx prisma migrate deploy - Cost estimate confirmed within budget (< €25/mo at MVP)
Owner: Alem Bašić | Due: T-7 days
T-5 Days: DNS Configuration
- Cloudflare DNS records created for bilko.io:
@CNAME →cname.vercel-dns.com(Proxied: Yes)wwwCNAME →cname.vercel-dns.com(Proxied: Yes)apiCNAME →<railway-domain>.railway.app(Proxied: No)
- bilko.io domain verified in Vercel project (Vercel → Settings → Domains)
- api.bilko.io custom domain set in Railway (Railway → Settings → Domains)
- DNS propagation verified:
dig bilko.ioanddig api.bilko.io - Cloudflare "Always Use HTTPS" enabled for bilko.io
- bilko.rs redirect rule configured (if domain registered): bilko.rs → bilko.io
Owner: Alem Bašić | Due: T-5 days
T-5 Days: SSL Certificates
- bilko.io TLS certificate provisioned (Vercel auto-provisions via Let's Encrypt)
- api.bilko.io TLS certificate provisioned (Railway auto-provisions)
- HTTPS verified:
curl -I https://bilko.io→ HTTP/2 200 - HTTPS verified:
curl https://api.bilko.io/health→{"status":"ok"} - HTTP → HTTPS redirect working:
curl -I http://bilko.io→ 301
Owner: Alem Bašić | Due: T-5 days
T-3 Days: Third-Party Integrations
- SendGrid live API key in Railway production secrets
- SendGrid domain authentication for bilko.io completed (SPF, DKIM, DMARC)
- Test email sent from
[email protected]and received successfully - Cloudflare R2 live API credentials in Railway production secrets
- Test file upload to R2
bilko-receiptsbucket via API
Owner: Alem Bašić | Due: T-3 days
T-2 Days: Monitoring Setup
- Sentry project created for Bilko backend + frontend (if ready)
- SENTRY_DSN environment variable set in Railway and Vercel
- BetterStack uptime monitors created:
https://bilko.io— check every 1 minhttps://api.bilko.io/health— check every 1 min
- BetterStack alert routing: Slack #bilko-alerts + email to [email protected]
- Alert test fired and received by Alem Bašić
Owner: Alem Bašić | Due: T-2 days
T-1 Day: Legal / Compliance
- Privacy policy published at bilko.io/privacy
- Terms of service published at bilko.io/terms
- Cookie consent banner implemented (not required for SaaS with no tracking cookies, but review)
- GDPR data processing documentation completed
- Data retention policy documented (financial records: 10 years per Serbian law)
- Legal sign-off from Alem Bašić on compliance readiness
Owner: Alem Bašić | Due: T-1 day
T-1 Day: Backup Verification
- Railway automated backup confirmed running (PostgreSQL → Backups tab)
- Manual backup taken and restore tested on staging:
railway run pg_dump $DATABASE_URL -f test_backup.dump # Restore to staging DB railway run psql $STAGING_DATABASE_URL < test_backup.dump - Backup verified: record counts match original
Owner: Alem Bašić | Due: T-1 day
T-0: Final Checks (1 hour before launch)
- Staging smoke tests all green (last run: within 24h)
- Main branch is up to date with all intended changes
- Railway and Vercel dashboards open in browser
- BetterStack monitoring dashboard open
- Rollback procedure reviewed (< 2 min for frontend, < 5 min for backend)
- Slack #bilko-launch channel open with Alem
3. Launch Day Procedure
H+0:00 — Deployment Start
| Time | Action | Owner | Status |
|---|---|---|---|
| H+0:00 | Post in #bilko-launch: "Bilko launch starting" | Alem | |
| H+0:00 | Confirm Railway deployment pipeline ready | Alem | |
| H+0:05 | Trigger production deployment from main branch | Alem | |
| H+0:10 | Monitor Railway build logs | Alem |
H+0:10 → H+0:20 — Deploy Verification
| Time | Action | Owner | Status |
|---|---|---|---|
| H+0:15 | Confirm Railway deployment successful | Alem | |
| H+0:15 | Verify health check: curl https://api.bilko.io/health |
Alem | |
| H+0:20 | Confirm Vercel frontend deployment successful | Alem | |
| H+0:20 | Verify frontend: open https://bilko.io in browser | Alem |
H+0:20 → H+0:45 — Smoke Tests
| Time | Action | Owner | Status |
|---|---|---|---|
| H+0:20 | Register new test account on bilko.io | Alem | |
| H+0:25 | Create test invoice (RSD, 20% VAT) | Alem | |
| H+0:30 | Verify invoice totals (subtotal + VAT = total) | Alem | |
| H+0:35 | Create test expense with receipt upload | Alem | |
| H+0:40 | Generate VAT report for current month | Alem | |
| H+0:45 | All smoke tests PASS → proceed | Alem |
H+0:45 — Go-Live Declaration
| Time | Action | Owner | Status |
|---|---|---|---|
| H+0:45 | Post in #bilko-launch: "Bilko is LIVE! bilko.io" | Alem | |
| H+0:50 | Update status page: "All systems operational" | Alem | |
| H+1:00 | Send launch announcement (if planned) | Alem |
4. Post-Launch Monitoring (First 48 Hours)
| Period | Check Frequency | What to Watch |
|---|---|---|
| H+0 to H+4 | Every 30 min | BetterStack dashboard, Railway metrics, Sentry errors |
| H+4 to H+24 | Every 60 min | Same as above |
| Day 2 | Every 4 hours | Same as above |
| Day 3+ | Standard monitoring | BetterStack alerts only |
Healthy indicators:
- BetterStack: all monitors green
- Railway CPU: < 50%, Memory: < 1GB
- Sentry: 0 new issues in first hour
- API health endpoint:
{"status":"ok","db":"ok"}
5. Rollback Triggers & Procedure
Rollback if:
- Health check fails for > 3 consecutive minutes
- Error rate > 5% in any 5-minute window (Sentry)
- Financial calculation bug discovered (any VAT/total error)
- Authentication completely broken
Rollback procedure:
- Post in #bilko-launch: "Rolling back — [reason]"
- Frontend: Vercel Dashboard → Deployments → Promote previous → instant
- Backend: Railway Dashboard → Deployments → Redeploy previous → ~2 min
- Verify health:
curl https://api.bilko.io/health - Post update when rollback complete
6. Communication Plan
Launch Day Communications
| Audience | Channel | When | Message |
|---|---|---|---|
| Internal | Slack #bilko-launch | H+0 | "Deployment started" |
| Internal | Slack #bilko-launch | H+0:45 | "Bilko is live! bilko.io" |
| Beta users (if any) | H+1:00 | Launch announcement | |
| Status page | status.bilko.io | H+0:45 | "All systems operational" |
Related Documents
- Deployment Checklist
- Rollback Plan
- Operational Runbook
- Monitoring & Observability
- Disaster Recovery Plan
Approval
| Role | Name | Date | Signature |
|---|---|---|---|
| Author | Ops Architect | 2026-02-23 | |
| Reviewer | Tech Lead | ||
| Approver | Alem Bašić |