$ Cluster Proxmox VE
Two x86_64 nodes + Raspberry PiObjective — Achieve a stable three-vote quorum without buying a third full server: two x86_64 nodes (pve1, pve2) are complemented by a Raspberry Pi acting as a Corosync quorum witness. Without that third vote, shutting down a single node would be enough for the cluster to lose quorum.
Testing carried out
- ›Deliberate node shutdown: verified that quorum holds and services fail over.
- ›Loss of the QDevice alone: the cluster keeps two votes out of three and stays operational.
- ›Combined scenario (node + QDevice): validated the expected behaviour when quorum is lost.
Good practices
- ›Static IP addresses on all three machines.
- ›Raspberry Pi wired over Ethernet rather than Wi-Fi: a quorum witness must not depend on wireless.
- ›UPS protecting the cluster.
- ›Monitoring through Zabbix.
- ›Backup of /etc/pve/, which holds the entire cluster configuration.
Known limitations
- ›The Raspberry Pi hosts no virtual machine: it is an arbiter, not a third node.
- ›Planned evolution towards a genuine three-node cluster.
Technical stack
- Proxmox VE
- Corosync
- corosync-qnetd
- corosync-qdevice
- Raspberry Pi
$ Pi-hole
LXC container on ProxmoxObjective — Filter advertising and tracking at the network level rather than device by device. Pi-hole acts as a DNS sinkhole: every device on the network is protected without any local install, including those where nothing can be installed (TVs, IoT devices).
Hardening
- ›Static IP address is mandatory: a DNS server that changes address takes the whole network down.
- ›Firewall (UFW) restricted to the DNS and web administration ports only.
- ›Administrator password changed at install time.
- ›Log privacy level adjusted to the context (personal use versus GDPR compliance).
Good practices
- ›LXC chosen over a full VM: near-instant boot and a 300–400 MB memory footprint.
- ›Sizing from 512 MB (small network) up to 4 GB of RAM depending on DNS query volume.
$ Caddy
Dedicated LXC container on ProxmoxObjective — Reach internal services through readable domain names (fossflow.memel.lab) rather than IP-and-port pairs. Convenience is not the only benefit: a stable name survives a change of address or port on the underlying service.
Hardening
- ›Local HTTPS through `tls internal`, or certificates via the Cloudflare DNS challenge.
- ›No port exposed to the Internet: remote access goes through Tailscale, never through port forwarding.
Good practices
- ›Strict separation of roles: one LXC for DNS (Pi-hole), one LXC for the proxy (Caddy).
- ›Subdomains preferred over sub-paths: more readable, and avoids fragile URL rewriting.
- ›Regular Caddyfile backups, logs followed through journalctl.
Technical stack
- Caddy
- LXC
- HTTPS
- Cloudflare DNS
- Let’s Encrypt
$ Tailscale
Agent on hosts and containersObjective — Reach the whole home lab remotely even though the setup sits behind double NAT — the ISP router, then a personal router. In that configuration port forwarding is either impossible or must be requested from the ISP; a WireGuard-based mesh VPN sidesteps the issue by establishing connections from inside the network.
Hardening
- ›Two-factor authentication enabled on the Tailscale account: that account is the key to the entire infrastructure.
- ›Access control lists (ACLs) restricting which devices can reach which.
Good practices
- ›MagicDNS: machines reachable by name rather than by address.
- ›Subnet Router: the whole 192.168.1.0/24 network is reachable through a single entry point, without installing the agent everywhere.
Technical stack
- Tailscale
- WireGuard
- MagicDNS
- Subnet Router
$ Gitea
Docker containerObjective — Retain control over the home lab code, scripts and technical documentation without depending on a third-party service. Written in Go, Gitea runs comfortably where GitLab would demand several gigabytes of memory.
Hardening
- ›Public sign-up disabled: without it, an exposed instance fills up with automated accounts.
- ›Two-factor authentication on the administrator account.
- ›Regular backups of the data directory.
Good practices
- ›Single container with an embedded SQLite database and persistent volumes.
- ›Repositories organised by domain: homelab-configs, scripts-sysadmin, ad-setup, zabbix-templates, cours-bts.
$ FossFLOW
Docker containerObjective — Produce isometric diagrams of the network topology, the Proxmox cluster and the Active Directory architecture. An up-to-date diagram makes an infrastructure explainable to someone else — the precondition for genuine knowledge transfer.
Good practices
- ›Diagrams stored as JSON on the server, backed up automatically.
- ›Deliberate complementarity: FossFLOW for 3D isometric views, Excalidraw for quick 2D sketches.
$ Bot Discord
Docker (compared against LXC, VM and bare metal)Objective — Automate notifications while serving as a testbed to concretely compare lightweight deployment environments: Docker, LXC, virtual machine and bare metal, each with its CPU, memory and storage sizing.
Hardening
- ›Secrets (the bot token) isolated in a .env file, never committed.
Good practices
- ›Modular Cog-based architecture: each feature is a module that can be reloaded independently.
- ›Automatic restart through `--restart always` or a systemd unit.
Technical stack
- Python
- discord.py
- Docker
- systemd