Skip to main content

Application Deployer

Ansible playbooks that deploy and configure the home-lab's self-hosted services across a cluster of Linux servers: media servers, file sync, VPN, encrypted storage, NFS, and Restic backups. Every secret comes from the Vault KV store over mTLS.

The playbooks run Ansible (pinned in pyproject.toml) under Python managed by uv, with this repo's own plugins and modules in filter_plugins/, lookup_plugins/, action_plugins/, and library/. Most services run as Docker containers, managed over each host's Docker TLS socket; Nextcloud's web stack, Samba, WireGuard, and NordVPN run directly on the host. Storage is LUKS-encrypted disks, NFS, and MinIO S3.

Quick start​

# Set required environment variables
export CS_PROJECT_CODE="<project-code>"
export DEVOPS_SERVER_INVENTORY_HOSTNAME="<devops-server-inventory-hostname>"
export VAULT_API_ENDPOINT="https://<host>:8083"
export VAULT_API_KEY="<api-key>"
export VAULT_CA_CERT_BASE64="<base64-encoded-ca-cert>"
export VAULT_CLIENT_CERT_BASE64="<base64-encoded-client-cert>"
export VAULT_CLIENT_KEY_BASE64="<base64-encoded-client-key>"

# Install dependencies
uv sync --all-extras --all-packages --no-progress
uv --offline run --no-sync --no-progress ansible-galaxy install -r requirements.yml

# Run a deployment (example: deploy Nextcloud).
uv --offline run --no-sync --no-progress ansible-playbook playbook.yml --tags nextcloud

Ordered services​

Suggested deployment order; later rows may depend on earlier ones (e.g. nextcloud on postgres).

ServiceGroupDescription
Prerequisites-Set up the servers
PatchingpatchserversSystem updates, Docker, NFS, LUKS, SSH hardening (incl. Vault data source)
NordVPNall:!localhost:!wireguardVPN client with Meshnet networking (excluded from wireguard hosts)
MinIO S3minio_communitySingle-node object storage
ResticresticBackup repository, SFTP backend
Reverse Proxyreverse_proxyCaddy or Nginx Proxy Manager, selected by cs_rp_which_one
WireguardwireguardVPN server
SambasambaSMB/CIFS file sharing
PostgreSQLpostgresDatabase server (v18)
NextcloudnextcloudFile sync, office suite, media, collaboration
EmbyembyMedia server
JellyfinjellyfinMedia server
NavidromenavidromeMusic server
qBittorrent Noxqbittorrent_noxHeadless torrent client
Code Servercode_serverBrowser-based VS Code
VikunjavikunjaTask management

Project structure​

application-deployer/
├── playbook.yml # Main Ansible playbook
├── inventory.yml # Host inventory and variables
├── ansible.cfg # Ansible configuration
├── requirements.yml # Ansible collection dependencies
├── group_vars/ # Per-group variable definitions
├── host_vars/ # Per-host variable overrides
├── tasks/ # Ansible task files per service
├── files/ # Static files for deployment
├── templates/ # Jinja2 templates
├── library/ # Custom Ansible modules
├── filter_plugins/ # Custom Ansible filter plugins
├── lookup_plugins/ # Custom Ansible lookup plugins
├── action_plugins/ # Custom Ansible action plugins
├── doc_fragments/ # Shared Ansible documentation fragments
├── scripts/ # Utility scripts
├── src/ # Python package imported by the lookup and action plugins
├── .gitea/workflows/ # CI workflows
└── docs/ # Per-service documentation

Development​

See DEVELOPMENT.md for installing dependencies, the git hook, and linting.