My precious quadlets. This is most of my self-hosted services.
  • Shell 78%
  • Go Template 22%
Find a file
2026-06-05 10:04:22 +05:30
.githooks Move immich 2026-01-31 19:06:54 +05:30
.zed vaultwarden: Remove env file 2026-01-11 03:48:49 +05:30
actual chore(deps): update ghcr.io/actualbudget/actual docker tag to v26.6.0 2026-06-01 16:47:43 +00:00
beaver Define format and update dep struct 2026-01-18 15:48:48 +05:30
bento chore(deps): update ghcr.io/alam00000/bentopdf-simple docker tag to v2.8.5 2026-05-23 10:11:42 +00:00
beszel-agent chore(deps): update ghcr.io/henrygd/beszel/beszel-agent docker tag to v0.18.7 2026-04-06 08:37:47 +05:30
code-server Define format and update dep struct 2026-01-18 15:48:48 +05:30
collabora Define format and update dep struct 2026-01-18 15:48:48 +05:30
dir2opds Define format and update dep struct 2026-01-18 15:48:48 +05:30
forgejo chore(deps): update codeberg.org/forgejo/forgejo docker tag to v15.0.2 2026-05-12 10:41:44 +00:00
gitops chore(deps): update ghcr.io/renovatebot/renovate docker tag to v43.212 2026-06-05 10:04:22 +05:30
glance chore(deps): update docker.io/glanceapp/glance docker tag to v0.8.5 2026-06-01 09:15:06 +05:30
immich chore(deps): update ghcr.io/valkey-io/valkey docker tag to v9.1.0 2026-05-20 10:18:19 +05:30
livesync chore(deps): update docker.io/apache/couchdb docker tag to v3.5.2 2026-05-27 09:08:41 +05:30
memos chore(deps): update ghcr.io/usememos/memos docker tag to v0.29.1 2026-06-05 01:00:09 +00:00
papra chore(deps): update ghcr.io/papra-hq/papra docker tag to v26.4.2 2026-05-21 12:29:15 +05:30
photon chore(deps): update ghcr.io/xyphyn/photon docker tag to v2.3.1 2026-04-03 22:16:38 +00:00
pocket-id chore(deps): update ghcr.io/pocket-id/pocket-id docker tag to v2.8.0 2026-05-31 19:09:53 +00:00
silverbullet chore(deps): update ghcr.io/silverbulletmd/silverbullet docker tag to v2.8.1 2026-05-20 18:52:53 +00:00
tandoor chore(deps): update docker.io/library/postgres docker tag to v18.4 2026-05-20 10:17:57 +05:30
tinyauth Update tinyauth url 2026-06-02 23:24:21 +05:30
traefik chore(deps): update docker.io/library/traefik docker tag to v3.7.3 2026-06-05 10:04:13 +05:30
vaultwarden chore(deps): update ghcr.io/dani-garcia/vaultwarden docker tag to v1.36.0 2026-05-03 13:00:27 +00:00
.env.example Move vaultwarden into quadlet and improve gitops 2025-12-31 21:59:49 +05:30
.gitignore Move vaultwarden into quadlet and improve gitops 2025-12-31 21:59:49 +05:30
README.md Add todo 2026-03-11 21:52:13 +05:30
renovate.json Move immich 2026-01-31 19:06:54 +05:30

Quad-Bucket

Collection of quadlets.

I also make use of some compose stacks: compose-bucket.

Structure

  • Service-based dirs: actual/, beaver/, etc.
    • <container-name>.container: Quadlet unit
    • container-data/: Data
    • container-config/: Config
    • .env: Private vars
    • .env.example: Template

Container File Format

All .container files follow this structure:

[Unit]
[Service]
[Install]
[Container]
  # Container properties
    ContainerName -> Image -> AutoUpdate -> Pull
  # Environment options
    Environment vars -> EnvironmentFile
  # User options
    User -> Group -> UserNS
  # Network options
    Network -> NetworkAlias -> PublishPort
  # Volume binds
    Data -> Config -> System files
  # Traefik Labels
    enable -> rule -> entrypoints -> middlewares -> services
  # Glance Labels
    name -> icon -> url -> description -> id

See beaver.container for reference.

Setup

  1. Clone repo
  2. Symlink: ln -s (pwd) ~/.config/containers/systemd
  3. systemctl --user daemon-reload
  4. Copy/edit .env from .env.example

Management

  • Start: systemctl --user start <service>.container
  • Stop: systemctl --user stop <service>.container
  • Status: systemctl --user status <service>.container
  • Enable: systemctl --user enable <service>.container

GitOps

I auto-update container images via Renovate + auto-deploy on push. Well, not truly "auto" since I merge manually to make sure there's some level of stability via pinning.

Renovate (hourly + on-push) -> PR with update -> Manual Merge via Web UI or Mobile app
-> Update .container images -> Forgejo Push Trigger -> Webhook
-> touch trigger -> systemd .path -> Pull changes -> Restart relevant containers

To install or check the status of the systemd automation units (paths, timers, services) responsible for GitOps, use:

./gitops/scripts/manage-systemd.sh status
./gitops/scripts/manage-systemd.sh install

Dev

  • Update .env.example files with qh generate env (quadlet-helper). There's also a pre-commit hook in the .githooks directory.

Traefik

  • Update Cloudflare IPs in traefik.yaml with qh cloudflare run. Automate using qh cloudflare install.
  • Update traefik.yaml.example file with qh generate traefik.

ToDo

  • Systemd service for Immich's rclone mount