DevOps for Solo Founders: The Exact Stack That Scales to $10K MRR (2026)
The complete infrastructure playbook for solo founders and indie hackers in 2026. Exact tools, configs, and cost breakdowns for CI/CD, monitoring, deployments, backups, and securit...
The Solo Founder DevOps Philosophy
Most DevOps content is written for teams. It assumes you have a dedicated platform engineer, a staging environment that mirrors production, and time to configure Kubernetes clusters. You don't. You have a product to build, customers to talk to, and revenue to chase.
The philosophy for solo founder DevOps is radically different: managed services over self-managed infrastructure, automation over manual processes, and simplicity over capability. Every minute you spend configuring infrastructure is a minute you didn't spend shipping features or talking to customers. Optimise for getting back to product work as fast as possible.
The good news: in 2026, the managed services available to solo founders are extraordinary. You can have CI/CD, monitoring, error tracking, database backups, CDN, and security — all configured in an afternoon — for under $50/month total. This guide shows you exactly how.
Before the guide begins — the anti-patterns: Don't self-manage a VPS for your primary production app (use Railway or Render instead). Don't set up Kubernetes before $50K MRR. Don't build a custom auth system (use Supabase Auth or Clerk). Don't manage your own SSL certificates (Cloudflare handles this). Don't set up your own email server (use Resend or Postmark). These are productivity traps that consume weeks and provide zero competitive advantage.
The Stack That Evolves With Your Revenue
Infrastructure decisions should match your stage. Over-engineering at zero revenue wastes time. Under-engineering at $5K MRR creates incidents. Here's the exact stack for each stage — and when to upgrade.
Never upgrade infrastructure preemptively. Upgrade when you hit a specific pain point — not when you think you might. The right time to add PgBouncer is when you're seeing "too many connections" errors. The right time to add read replicas is when queries are slow. The right time to hire a DevOps contractor is when infrastructure incidents take more than 2 hours of your week. Pain first, solution second.
CI/CD: Automate Every Deploy from Day One
Manual deploys are the enemy of solo founders. One forgotten environment variable, one unrun migration, one skipped test — and you're debugging a production incident at 11pm instead of sleeping. Automate your entire deploy pipeline on day one, even if it takes 3 extra hours to set up.
The Complete GitHub Actions Pipeline
This workflow covers lint, type checking, tests, and deployment to Vercel — the complete pipeline for a Next.js + Supabase SaaS. It takes about 45 minutes to set up and saves you from manual mistakes indefinitely.
name : CI/CD Pipeline
on :
push :
branches : [main]
pull_request :
branches : [main]
env :
SUPABASE_URL : ${{ secrets.SUPABASE_URL }}
SUPABASE_ANON_KEY : ${{ secrets.SUPABASE_ANON_KEY }}
jobs :
quality :
runs-on : ubuntu-latest
steps :
- uses : actions/checkout@v4
- uses : actions/setup-node@v4
with :
node-version : '20'
cache : 'npm'
- name : Install dependencies
run : npm ci
- name : Type check
run : npx tsc --noEmit
- name : Lint
run : npm run lint
- name : Unit tests
run : npm run test:ci
env :
CI : true
- name : Build check
run : npm run build
deploy :
needs : quality
runs-on : ubuntu-latest
if : github.ref == 'refs/heads/main'
steps :
- uses : actions/checkout@v4
- name : Run DB migrations
run : npx supabase db push
env :
SUPABASE_ACCESS_TOKEN : ${{ secrets.SUPABASE_ACCESS_TOKEN }}
- name : Deploy to Vercel
uses : amondnet/vercel-action@v25
with :
vercel-token : ${{ secrets.VERCEL_TOKEN }}
vercel-org-id : ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id : ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args : '--prod'Notice the DB migration step runs before the Vercel deploy. This is critical. Your new code may depend on new columns or tables — if the deploy happens before the migration, users get errors. Always: migrate → deploy , never the reverse. For zero-downtime migrations, only add columns and new tables in one deploy; remove deprecated columns in a follow-up deploy after the code change has been live for a full deployment cycle.
Branch Preview Environments
Vercel automatically creates preview deployments for every pull request. This is one of the highest-leverage features available to solo founders . Every PR gets a live URL you can share with early users or beta testers to get feedback before it hits production. Enable this on your Vercel project settings and it costs nothing on the Pro plan.
For database changes in preview environments, use Supabase's branch feature (in beta) or a separate preview Supabase project. Never let preview deployments point to production data.
Monitoring: Know Before Your Users Know
The worst way to learn about a production bug is from a support email. The goal of monitoring is to know about every problem before any user reports it — or at worst, within 2 minutes of it occurring. This requires three complementary tools covering different failure modes.
Sentry Setup: The One Configuration That Changes Everything
Most developers install Sentry but leave it at defaults — which means errors appear in Sentry but nobody sees them until they check the dashboard. The critical step is setting up alert rules that page you immediately.
import * as Sentry from '@sentry/nextjs'
Sentry. init ({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
environment: process.env.NODE_ENV,
// Only track errors in production (not dev noise)
enabled: process.env.NODE_ENV === 'production' ,
// Sample rate: 100% of errors, 10% of transactions
// Adjust tracesSampleRate for cost control
tracesSampleRate: 0.1 ,
// Release tracking for source maps
release: process.env.VERCEL_GIT_COMMIT_SHA,
// Attach user context to errors
beforeSend (event) {
// Strip PII from error events
if (event.user) {
delete event.user.ip_address
delete event.user.email
}
return event
},
// Ignore known non-actionable errors
ignoreErrors: [
'ResizeObserver loop limit exceeded' ,
'Non-Error exception captured' ,
/^Network Error$/ ,
],
})The Monitoring Alert Matrix
Every alert should have a clear owner, a defined severity, and a specific response action. Without this, you'll either get too many alerts (alert fatigue) or miss critical ones.
Security: The Non-Negotiable Checklist
Security for solo founders isn't about enterprise compliance. It's about not getting breached, not exposing user data, and not having your AWS account drained by a cryptominer. Here's the essential checklist — all achievable in a single afternoon.
Security Headers: The Next.js Config
const securityHeaders = [
{
key : 'X-DNS-Prefetch-Control' ,
value : 'on'
},
{
key : 'Strict-Transport-Security' ,
value : 'max-age=63072000; includeSubDomains; preload'
},
{
key : 'X-Frame-Options' ,
value : 'SAMEORIGIN'
},
{
key : 'X-Content-Type-Options' ,
value : 'nosniff'
},
{
key : 'Referrer-Policy' ,
value : 'origin-when-cross-origin'
},
{
key : 'Permissions-Policy' ,
value : 'camera=(), microphone=(), geolocation=()'
},
{
// Content Security Policy — adjust for your CDN/fonts
key : 'Content-Security-Policy' ,
value : [
"default-src 'self'" ,
"script-src 'self' 'unsafe-eval' 'unsafe-inline'" ,
"style-src 'self' 'unsafe-inline' fonts.googleapis.com" ,
"font-src 'self' fonts.gstatic.com" ,
"img-src 'self' data: https:" ,
"connect-src 'self' *.supabase.co wss://*.supabase.co" ,
]. join ( ' ; ' )
}
]
const nextConfig = {
async headers () {
return [{
source : '/(.*)' ,
headers : securityHeaders
}]
}
}
export default nextConfigBackups: The Thing Everyone Skips Until It's Too Late
Supabase Pro includes daily backups with 7-day retention. This is not sufficient for a SaaS product with paying customers. A user can delete data that's not recoverable from last night's backup. A bad migration can corrupt data hours before the nightly backup runs. You need point-in-time recovery — and you need to test your backups.
The Three-Layer Backup Strategy
- Supabase Point-in-Time Recovery (PITR) — Available on Supabase Pro. Enables recovery to any second in the last 7 days. Enable this immediately on your production project.
- Weekly off-platform export — A GitHub Action that runs pg_dump weekly and stores a compressed dump in Cloudflare R2 (free for <10GB). This protects against Supabase outages or account issues.
- Soft deletes in your application — Never hard-delete user data. Mark records as deleted_at and exclude them from queries. This is a 30-minute code change that saves you from the "I deleted the wrong thing" support nightmare.
name : Weekly Database Backup
on :
schedule :
- cron : '0 2 * * 0' # Every Sunday at 2am UTC
workflow_dispatch : # Manual trigger option
jobs :
backup :
runs-on : ubuntu-latest
steps :
- name : Install pg_dump
run : sudo apt-get install -y postgresql-client
- name : Create database dump
env :
DATABASE_URL : ${{ secrets.DATABASE_URL }}
run : |
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
pg_dump $DATABASE_URL \
--no-password \
--format=custom \
--compress=9 \
--file="backup_${TIMESTAMP}.dump"
echo "BACKUP_FILE=backup_${TIMESTAMP}.dump" >> $GITHUB_ENV
- name : Upload to Cloudflare R2
uses : ryand2d/r2-upload-action@v1
with :
r2-account-id : ${{ secrets.CF_ACCOUNT_ID }}
r2-access-key-id : ${{ secrets.R2_ACCESS_KEY_ID }}
r2-secret-access-key : ${{ secrets.R2_SECRET_ACCESS_KEY }}
r2-bucket : db-backups
source-dir : .
destination-dir : weekly/
- name : Notify on success
uses : 8398a7/action-slack@v3
with :
status : ${{ job.status }}
text : '✅ Weekly DB backup completed: ${{ env.BACKUP_FILE }}'
env :
SLACK_WEBHOOK_URL : ${{ secrets.SLACK_WEBHOOK_URL }}A backup you've never restored is not a backup — it's a file you hope works. Schedule a quarterly "restore drill": take your latest backup dump, spin up a temporary Supabase project, restore from the dump, and verify your data is intact. This also confirms your backup process is working correctly and gives you confidence when you actually need it.
Incident Response: What to Do When Your Site is Down
Your site will go down. Something will break at 2am on a Friday. The question is not if — it's whether you have a clear response process or you're improvising in a panic. Here's the solo founder incident response playbook.
The three minutes after an incident alert are the most chaotic. Having a written runbook means you execute steps, not freeze in panic. Write it before you need it.
Acknowledge and Communicate (0–2 min)
Post your status page to "investigating" immediately. Tweet or post a brief "we're aware of issues" message if you have an audience. Users forgive incidents — they don't forgive silence.
Identify the Failure Layer (2–5 min)
Check in order: (1) Vercel status page — is this a platform incident? (2) Supabase status page. (3) Your Sentry errors — what's the first error? (4) BetterStack — what endpoint failed first?
Rollback or Fix (5–15 min)
If the last deploy caused it: vercel rollback immediately (takes 30 seconds). If it's a database issue: check Supabase logs for the failing query. If it's a third-party API: check their status page and add a fallback.
Communicate Resolution (15–20 min)
Update your status page to "resolved". Send a brief email to affected users explaining what happened and what you've done. Honesty and speed build more trust than perfection.
Post-Mortem (Within 24h)
Write a brief incident document: what happened, root cause, how it was fixed, and what changes prevent recurrence. This doesn't need to be public — it's for your own learning and future reference.
The One-Minute Rollback
Vercel's rollback is your best friend. Every production deployment is immutable and can be re-promoted instantly. Set up this alias:
{
"scripts" : {
// List last 5 deployments with their URLs and status
"deployments" : "vercel ls --limit 5" ,
// Rollback to the previous production deployment
"rollback" : "vercel rollback" ,
// Check if DB migrations can be reverted
"db:status" : "npx supabase migration list" ,
// Manually trigger a backup before any risky operation
"backup:now" : "gh workflow run backup.yml" ,
// Check current error rate in Sentry
"errors:check" : "open https://sentry.io/organizations/your-org/issues/"
}
}Total Infrastructure Cost: Zero to $10K MRR
Here's the complete cost breakdown at each revenue stage. These are real numbers from real production deployments — not estimates.
The Rule of Thumb: Keep Infrastructure Under 5% of MRR
At $2K MRR, $104/month is 5.2% — the upper limit of acceptable. At $10K MRR, $250/month is 2.5% — excellent. If your infrastructure costs exceed 10% of MRR, you're either over-provisioned or on the wrong pricing tier for a service. Review and right-size quarterly. Infrastructure costs should shrink as a percentage of revenue as you grow — not grow with it.
What to Absolutely Avoid Before $50K MRR
The greatest DevOps trap for solo founders is over-engineering. These are the tools and patterns that look professional but will consume weeks of your time at the wrong stage.
Your Week One Infrastructure Checklist
Don't read this guide and do nothing. Here's the exact order of operations to go from zero to a fully monitored, automatically deployed, backed-up production application in your first week.
- Day 1: Set up Vercel + Supabase + Cloudflare DNS. Deploy your app to production with a custom domain.
- Day 2: Configure GitHub Actions CI/CD with the pipeline from this guide. Test it by pushing a PR and watching it run.
- Day 3: Install Sentry. Set up BetterStack uptime monitoring. Configure a Slack webhook for alerts.
- Day 4: Apply security headers in next.config.ts . Enable Cloudflare WAF. Audit environment variables.
- Day 5: Enable Supabase PITR. Set up the weekly backup GitHub Action. Test restore from a backup dump.
- Day 6: Write your incident response runbook. Test a rollback with vercel rollback . Set up your status page (BetterStack includes this).
- Day 7: Ship a feature. Infrastructure is done. Get back to building the product.
What to Read Next
- Cloudflare Workers, Pages, and D1: Building Edge-First Applications in 2026 →
- Supabase vs Firebase vs Pocketbase: The Backend Comparison →
- Building Micro-SaaS with AI: 10 Products You Can Ship in a Weekend →
- Zero-Downtime Deployments: Blue-Green, Canary, and Rolling Strategies →
