No description
Find a file
2026-06-24 12:59:09 +02:00
attributes feat: add sync-oidc-secrets script + n8n/paperless OIDC config 2026-06-20 22:48:28 +02:00
components chore(rss-bridge): sync to last version 2026-06-24 12:59:09 +02:00
deploy feat(git): deploy forgejo + rootless runner via materia 2026-06-20 16:30:55 +02:00
scripts feat: add sync-oidc-secrets script + n8n/paperless OIDC config 2026-06-20 22:48:28 +02:00
.gitignore feat(git): deploy forgejo + rootless runner via materia 2026-06-20 16:30:55 +02:00
.gitmodules feat(rss-bridge): source config/ from rss-bridges.git submodule 2026-06-19 12:34:29 +02:00
.sops.yaml Materia GitOps repository 2026-06-19 01:00:25 +02:00
MANIFEST.toml feat(git): deploy forgejo + rootless runner via materia 2026-06-20 16:30:55 +02:00
mise.toml feat: add sync-oidc-secrets script + n8n/paperless OIDC config 2026-06-20 22:48:28 +02:00
prek.toml chore: migrate to prek.toml format 2026-06-19 16:12:13 +02:00
README.md feat: migrate to codeberg 2026-06-19 15:11:24 +02:00

gitops — Materia repository

Declarative deployment of ~20 self-hosted services as Podman Quadlets to the Fedora CoreOS host core, managed by Materia.

Layout

MANIFEST.toml          # host -> components assignment (host: core)
components/<name>/      # one component per service
  MANIFEST.toml         #   services + secret declarations
  *.container[.gotmpl]  #   quadlets (.gotmpl = Go-templated)
  *.volume *.network *.image *.build
  <data files>          #   configs bind-mounted from the component data dir
attributes/
  vault.enc.yml         # sops+age encrypted secrets (committed)
  vault.yml             # plaintext source (gitignored)
deploy/                 # host units + Butane for Fedora CoreOS
key.txt                 # age private key (gitignored, host-provisioned)

common ships the shared postgres.image / redis.image.

How it works

  • Quadlets install to /etc/containers/systemd; data files to /var/lib/materia/components/<name>/ and are referenced from .gotmpl quadlets via {{ m_dataDir "<name>" }}/....
  • Repo-stored secrets live in attributes/vault.enc.yml (sops/age). Quadlets pull them via {{ secretEnv "key" "ENV_TARGET" }} (podman secret) or direct {{ .key }} interpolation (env files / JSON blobs).

See deploy/README.md for host bootstrap and mise run validate for checks.