Welcome to my personal homelab notebook. In this first post, I want to share the exact architectural blueprint of how I set up my personal hub, resume portfolio, and this very blog on my bare-metal hardware.

Hosting your own stack is an incredibly rewarding process, offering ultimate data sovereignty and zero server bills.


🛠 The Hardware Stack

For this setup, I selected the following specs:

  • Single Board Computer: Raspberry Pi 5 (16GB RAM edition)
  • Storage: 500GB NVMe SSD (via PCIe M.2 Hat) for rapid read/write performance
  • Network: Dedicated wired Ethernet connection to home router

16GB of RAM is massive for typical web applications, leaving ample headroom to host multiple dynamic backend platforms, database replicas, and telemetry dashboards in separate isolated environments.


🐋 Docker Orchestration

To keep the host OS clean and prevent version collision, every application runs inside a lightweight, standalone container.

Here is the central network and orchestration setup:

version: '3.8'

services:
  profile-app:
    image: node:20-alpine
    container_name: profile-site
    command: npm run start
    ports:
      - "3000:3000"
    networks:
      - web-network

  blog-app:
    image: node:20-alpine
    container_name: blog-site
    command: npm run start
    ports:
      - "3001:3000"
    networks:
      - web-network

networks:
  web-network:
    external: true

Before bringing the containers up, we create the shared virtual network:

docker network create web-network

🔒 Cloudflare Tunnel Egress

Instead of forwarding ports on my home router (which exposes my home IP address to public scans), I use Cloudflare Tunnels (cloudflared).

The tunnel client runs as a local background daemon on the Pi, creating a secure outbound connection to the nearest Cloudflare Edge server. When a user requests my domain, Cloudflare forwards the request over this tunnel directly to the respective container name on the Pi.

Here is my tunnel ingress routing rules:

ingress:
  - hostname: dheepstack.com
    service: http://profile-site:3000
  - hostname: blog.dheepstack.com
    service: http://blog-site:3001
  - hostname: "*.dheepstack.com"
    service: http://profile-site:3000

📹 Embedded Media Showcase

To demonstrate self-hosted video loops or live-recordings, we can embed native HTML5 elements directly into the markdown:

Demo: Custom video loop embedded directly inside a self-hosted post card.

Self-hosting gives you complete creative liberty. In the next post, I will cover setting up automatic backup syncs to an encrypted S3 bucket. Stay tuned!