Tech Q&A
Quick answers to common questions. Searchable threads covering debugging tips, best practices, and solutions we've found useful.
PostgreSQL Connection Issues
Why am I getting 'connection refused' errors in production?
This usually means your connection pool is exhausted. Check your max_connections setting and ensure you're properly releasing connections after use. Also verify that your database server is actually running and accepting connections on the expected port.
How do I increase the connection pool limit?
In your pg_hba.conf, increase max_connections. Also consider using PgBouncer for connection pooling in high-traffic scenarios. PgBouncer sits between your app and PostgreSQL, managing connections more efficiently than your application can.
Docker Container Memory Limits
My container keeps getting OOM killed. How do I debug this?
Run `docker stats` to monitor real-time memory usage. Also check `docker inspect <container_id>` for the memory limit configuration. Look at `/sys/fs/cgroup/memory/memory.max_usage_in_bytes` inside the container for peak usage.
Should I set memory limits on all containers?
Yes, always. Without limits, one runaway container can starve others. Set both memory and memory-swap limits explicitly. A good starting point is 2-4x what the container typically uses.
Next.js API Route Timeouts
My API routes timeout after 10 seconds on Vercel. How to fix?
Vercel's Hobby plan has a 10s limit. Upgrade to Pro for 60s, or move long-running tasks to background jobs using Vercel's cron or edge functions. You can also use streaming responses to keep the connection alive.
Can I increase the timeout on self-hosted Next.js?
Yes, set the `maxDuration` export in your route file. For self-hosted, you can also configure your reverse proxy (nginx/Apache) timeout settings. Example: `export const maxDuration = 60;`
TypeScript Strict Mode Migration
How do I migrate a large codebase to strict mode without breaking everything?
Start with `strictNullChecks: false` and enable strict options one at a time. Fix errors file by file using // @ts-expect-error comments temporarily. Consider using the `typescript-strict-plugin` for gradual adoption.
Which strict option should I enable first?
Start with `noImplicitAny`. It catches the most bugs with the least migration effort. Then move to `strictNullChecks`, which is harder but finds more real bugs.
Redis Caching Strategies
When should I use Redis vs in-memory caching?
Use Redis when you have multiple app instances that need shared cache, or when cache needs to survive restarts. In-memory is fine for single instances with volatile data. Consider latency: in-memory is ~100ns, Redis is ~1ms.
How do I handle cache invalidation?
Use TTL-based expiration for simple cases. For complex invalidation, use cache tags or pub/sub patterns to notify all instances when data changes. The hardest part is knowing WHEN to invalidate—document your invalidation rules clearly.
Git Branch Cleanup
How do I delete all merged branches at once?
Run: `git branch --merged | grep -v '\*\|main\|master' | xargs -n 1 git branch -d`. This deletes all local branches that have been merged. The grep excludes your current branch and protected branches.
What about remote branches?
First prune: `git fetch --prune`. Then delete specific remote branches: `git push origin --delete branch-name`. For bulk deletion, you'll need a script that lists remote merged branches and deletes them.