Docker Compose configs for a fleet of VPS nodes: mail, matrix, CI, rss and etc.
  • HTML 87.4%
  • JavaScript 12.2%
  • Nix 0.3%
  • Jinja 0.1%
Find a file
2026-10-18 21:32:07 +06:00
ansible chore: initial commit 2026-10-13 22:30:57 +06:00
common/xray chore: initial commit 2026-10-13 22:30:57 +06:00
fierce-lion chore: initial commit 2026-10-13 22:30:57 +06:00
lucky-sun chore: remove technitium 2026-10-13 22:30:57 +06:00
noble-angel refactor: delete unused UID and GID, and add /etc/passwd mount to repo 2026-10-18 21:22:35 +06:00
restless-desert chore: initial commit 2026-10-13 22:30:57 +06:00
toxic-union/web-camouflage feat(toxic-union): add nginx compose with six static sites 2026-10-17 04:38:09 +06:00
.gitignore feat: add flake.nix for develop environment 2026-10-18 20:47:13 +06:00
flake.lock feat: add flake.nix for develop environment 2026-10-18 20:47:13 +06:00
flake.nix feat: add work packages in flake 2026-10-18 21:32:07 +06:00
LICENSE chore: add MIT license 2026-10-13 22:30:57 +06:00
README.md docs: add project README 2026-10-13 22:30:57 +06:00

homelab

Docker Compose definitions for a handful of VPS nodes that keep my internet life running: mail, matrix calls, forgejo CI, and a bunch of little games pretending to be harmless websites.

Each top-level directory is one server. Inside it, one subdirectory per service. Every service lists the variables it needs in .env.example.

Nodes

  • restless-desert: matrix, livekit, traefik, web-camouflage
  • noble-angel: mail, forgejo, woodpecker, navidrome, vaultwarden, traefik, web-camouflage
  • fierce-lion: headscale, rss, search, traefik, web-camouflage
  • lucky-sun: traefik, web-camouflage
  • toxic-union: not provisioned yet

Every node also runs xray; its shared configuration lives in common/xray/.

The web-camouflage service on each node is what unauthorised visitors see. Traefik routes point at small browser games (tetris, wordle, rubiks cube...), so the node answers with a game instead of a 404.

Layout

  • <node>/<service>/docker-compose.yml: what runs on that node
  • <node>/<service>/.env.example: variables to fill at deploy
  • common/xray/: shared xray configuration, assembled per node at deploy; see its README.md
  • ansible/: server provisioning. Bootstrap a fresh Debian box, install docker, create a docker manager user. Inventory lives in inventory.ini (template: inventory.ini.example)

Conventions

  • Placeholders use example.com, PLACEHOLDER, 0.0.0.0.
  • Domain names enter compose only through env variables.