~/infra

How it's actually hosted

One VPS, one Traefik instance, reachable only from the home network or Tailscale, with real certs from OVH's DNS API — no PaaS, no managed Kubernetes. This very site is the exception: it ships straight to Vercel.

01infra/layers

The stack

Every self-hosted project and home lab app on this page shares the same five pieces.

  1. L5 Internet

    Public DNS resolves every *.maelbelliard.fr host, but none of it is forwarded to the public internet — the router only accepts these connections from the home network or the tailnet.

  2. L4 Tailscale

    A private mesh VPN — together with the home LAN, the only two ways in. My laptop and phone reach the VPS over the tailnet when I'm out, or straight over Wi-Fi when I'm home — never through the public router.

  3. L3 Traefik

    One reverse proxy instance for the whole host. Routing is decided purely from each container's Docker labels — nothing to hand-edit per service.

  4. L2 OVH

    Every host gets a real Let's Encrypt certificate issued through OVH's DNS API (DNS-01). No port-80 challenge needed, so names that are never reachable from the internet still get valid, trusted HTTPS.

  5. L1 Docker

    Single host, one compose stack per project or app, every container attached to a shared external network so Traefik can reach it.

anatomy of a request

02infra/services

My own projects

Everything in /services, routed through that same stack — restricted to me, not a public demo. Status pulled live from GitHub where a repo exists.

restricted access · 01/03source ↗

Croesus

Open-source net worth tracker — self-hosted or as a desktop app for Windows/macOS/Linux — with real support for French tax-advantaged accounts (PEA, assurance-vie), real estate, and debts.

Vue · Nuxt UI · FastAPI · PostgreSQL · Docker · Tauri

ci
checking…
license
AGPL-3.0
stars
2
issues
3 open
pushed
3 weeks ago
private · 02/03no public repo

Portail

A personal dashboard listing everything self-hosted here — search and filter by tag, backed by Postgres. No public repo, so no CI badge or stars to show.

Nuxt · Prisma · PostgreSQL

dev copy · 03/03whoami.maelbelliard.fr

Whoami

This site's own dev container lives here too — a hot-reloading preview behind the same Traefik + Tailscale gate. Not the page you're reading right now.

↓ how this site ships
03infra/homelab

Home lab

The rest of what runs on that same host, for personal use — everything in /docker, on the same Traefik + Tailscale + OVH setup.

  • SVC-01 AdGuard HomeNetwork-wide DNS ad- and tracker-blocking.
  • SVC-02 AuthentikSelf-hosted SSO / identity provider — its Traefik forward-auth middleware exists, just not wired to any app yet.
  • SVC-03 Home AssistantHome automation hub.
  • SVC-04 Zigbee2MQTT + MosquittoZigbee-to-MQTT bridge for smart home devices.
  • SVC-05 Paperless-ngxOCR document archive.
  • SVC-06 BeszelLightweight server monitoring.
  • SVC-07 AffineNotes and knowledge base.
  • SVC-08 ObsidianThe Obsidian app itself, containerized and accessed through the browser.
  • SVC-09 Uptime KumaStatus page and uptime monitoring for everything on the host.
  • SVC-10 GhostfolioOpen-source investment portfolio tracker.
04infra/deploy

How this site ships

This is the one exception to everything above — it doesn't stay on the VPS.

local / dev

A docker-compose service, source mounted as a volume for hot reload, routed by the same home Traefik instance as everything else — reachable only over Tailscale, at whoami.maelbelliard.fr. It's a live preview of work in progress, not the public site.

production

release checking…

Pushing a tag like v1.0.0 triggers GitHub Actions: lint, typecheck, vercel build --prod, deploy, then a GitHub Release with a changelog generated from Conventional Commits. That's what's actually live at www.maelbelliard.fr.

★ 0◌ 0↑ 2 weeks ago /changelog →