Homelab
My home server, entirely described in Ansible.
- Type
- Infrastructure
- Context
- Personal project
- Year
- 2026
- Technologies
- Ansible, Proxmox, LXC, Docker, Podman, Nginx, fail2ban, GitLab CI, Python, Bash
The homelab architecture: a single entry point, isolated services
I host my own services on a Proxmox server: Git forge and continuous integration, photos, password manager, email, home automation, monitoring, databases and game servers. Each one lives in its own container, and everything is created with a single command, for example “make deploy immich”.
In practice it runs a GitLab forge with its image registry and a CI runner, static sites each published on their own subdomain, MariaDB with phpMyAdmin, Vaultwarden for passwords, Immich for photos and videos, and Stalwart, a full mail server. On top of that come Radiance, my AI inference server (text, image, audio) on an AMD graphics card, Hermes, an agent connected to Telegram and Discord, an AMP panel for game servers and Home Assistant for home automation.
A versioned catalogue describes what each service needs: CPU, memory, disks, ports, secrets. The fleet itself is written nowhere. Every container created is tagged in Proxmox, then rediscovered on each run. Re-running a deployment breaks nothing: an existing container is found, never duplicated, and a missing secret stops everything before anything is created.
On the network side, Nginx is the only entry point. Services live on an internal network and are isolated from each other by the firewall, whose rules are generated automatically. Publishing a service takes one option: the subdomain, the TLS certificate, the port forwards and the firewall follow.
Data is kept apart from the system. What cannot be replaced goes on a backed-up volume, what can be downloaded again goes on one that is not, and the system disk can be thrown away and rebuilt. An unused container goes to sleep on its own and wakes up on the first request.
The repository is tested too: the host-side logic runs against a fake Proxmox, and every change goes through yamllint and ansible-lint.
- About twenty services in the catalogue, 27 Ansible roles, 17 playbooks
- Nginx as the single entry point: automatic TLS, fail2ban, country filtering
- Isolated internal network, firewall generated from the catalogue
- Scheduled backups, restores tested on an isolated copy, snapshot rollback
- Idle containers are put to sleep automatically
- AI inference server on GPU, models loaded on demand
What runs on it
Entry and monitoring
- Nginx
- Single entry point: automatic TLS, fail2ban, country filtering, mail relay
- Proxmox firewall
- Rules generated from the catalogue, each service isolated from the others
- Gatus
- Probes across the whole fleet, alerts, backup status
Development
- GitLab CE
- Repositories, image registry, Docker-in-Docker CI runner
- Static sites
- One site per subdomain, published with one command
- MariaDB
- Shared databases, with phpMyAdmin
Everyday
- Vaultwarden
- Passwords, works with the Bitwarden apps
- Immich
- Photos and videos, on a dedicated backed-up volume
- Stalwart
- Full mail server: SMTP, IMAP, Sieve filters
- Home Assistant
- Home automation, as a virtual machine on the local network
AI and games
- Radiance
- Model inference (text, image, audio) on an AMD GPU with ROCm, loaded on demand
- Hermes
- Agent connected to Telegram and Discord
- AMP
- Game server management panel
Base
- Debian, Docker, Podman
- Ready-made container templates to test or host anything else