|
Ritik Kumar · CS undergrad Backend Developer • DevOps Enthusiast • Homelab Builder
I build backends and the infrastructure they run on — not just the code that serves an API, but the queues, caches, proxies, DNS and CI/CD pipelines that keep it alive at 3am.
|
day to day: NestJS · PostgreSQL · Redis + BullMQ · Docker Compose · GitHub Actions
operating: Linux servers · reverse proxies · DNS / HTTPS · Cloudflare Tunnel · self-hosted runners · container networking
|
Async media processing platform · ↗ repo Work doesn't happen inside the request. Every upload lands as a job in a queue, and a fleet of workers picks it up. TypeScript · NestJS · PostgreSQL + TypeORM · Redis + BullMQ · Turborepo monorepo · multi-stage Docker · GitHub Actions → GHCR → self-hosted runner · Caddy + Cloudflare Tunnel Runs on my own Linux server — where I learn backend architecture and distributed systems. |
The home datacenter · ↗ dotfiles An old PC that teaches me what happens underneath services — the parts tutorials skip. Ubuntu Server · Docker + Compose · Caddy reverse proxy · Cloudflare Tunnel · Tailscale mesh · GitHub Actions self-hosted runner · storage + networking experiments |
|
System design practice, not CRUD · ↗ repo Used it to explore what happens at scale — where a 300-line tutorial project starts to hurt. NestJS · PostgreSQL + Prisma · Redis · rate limiting · DB indexing · background processing |
Stateful services on a budget 146 mods, one CPU, 8 GB RAM — a masterclass in resource constraints. Docker · JVM memory tuning · Lithium + FerriteCore · automated bash + cron backups · RCON · SSH + tmux Lessons that transfer to real infra: stateful services, resource limits, backups, reliability. |
how a request reaches my homelab — with no open inbound ports on my router
┌───────────────┐
│ INTERNET │
│ public DNS │
│ client → :443 │
└───────────────┘
╎
▼
┌────────────────────┐
│ CLOUDFLARE │
│ outbound tunnel │
│ zero inbound ports │
└────────────────────┘
╎
▼
┌──────────────────┐
│ CADDY │
│ reverse proxy │
│ auto TLS + HTTPS │
└──────────────────┘
╎
▼
┌────────────────────────────────────────────────────────┐
│ UBUNTU SERVER · DOCKER · HOMELAB │
│ │
│ ┌─────────────┐ ┌────────────────┐ ┌────────────┐ │
│ │ NestJS APIs │ │ Redis + BullMQ │ │ PostgreSQL │ │
│ └─────────────┘ └────────────────┘ └────────────┘ │
│ │
└────────────────────────────────────────────────────────┘
The path, in one line: a request resolves to Cloudflare → rides an outbound tunnel (so my router opens zero inbound ports) → Caddy terminates TLS and proxies by hostname → lands in a container on the Ubuntu box.
Where the interesting parts live:
- Cloudflare Tunnel — no port forwarding, no exposed IP; the tunnel is an outbound persistent connection.
- Caddy — automatic TLS + reverse proxy by hostname, so adding a service means one block in a
Caddyfile, not a port map. - Docker + Compose — each service in its own network namespace; cross-service traffic only where a port is published.
- Tailscale — a second path in for admin (SSH) that doesn't touch the public route at all.
|
hardware |


