How this site hosts itself
This site runs on my own hardware, not a cloud platform. A short tour of the Proxmox cluster, the push-to-deploy flow, and the Cloudflare tunnel that puts it online.
The page you are reading is not on a cloud platform. It is served from a small Proxmox cluster in my home office, behind a Cloudflare tunnel, and it deploys itself when I push a git branch. The site is its own portfolio piece: built, hosted, and operated by the same person it is pitching.
Here is the shape of it.
The cluster
Four nodes run Proxmox VE, with a Raspberry Pi acting as a QDevice so the cluster keeps quorum even when most of the nodes are down. Each project lives in its own lightweight container, isolated from the others, with ZFS replication between nodes so a single failure is a recoverable event rather than an outage.
This site is one such container. It holds a Node server and nothing else it does not need.
The app
It is a Next.js build in standalone mode, which produces a self-contained Node server with its own copy of the dependencies it uses. A systemd unit keeps it running and restarts it if it ever falls over.
Deploying is one command
There is a bare git repository on the host with a post-receive hook. Pushing to it checks out the code, installs dependencies, builds, syncs the artefacts into place, and restarts the service. If the build fails, the previous build keeps serving, so a broken push never takes the site down.
git push prod mainThat is the whole deploy. It takes roughly a minute end to end.
Getting online without opening ports
Nothing is port-forwarded from my router. A Cloudflare tunnel makes an outbound connection from inside the network and routes the public hostname to the container over it. TLS terminates at the Cloudflare edge, and the only thing exposed to the internet is the tunnel itself.
The live numbers
The cluster status further down the home page is real. A read-only account queries an InfluxDB instance on the cluster for node health, CPU, memory, and network throughput, and the page reports whatever it finds. When the backend is unreachable it degrades to an honest "unavailable" rather than inventing data.
Why do it this way
Owning the stack end to end means no per-request billing, no vendor lock-in, and a setup I understand completely because I built every layer of it. The same approach scales down to a single mini PC and up to a rack, and it is the kind of infrastructure I would set up for a business that wants to run its own software without renting someone else's platform to do it.