Terminology¶
The templates share a small vocabulary for their parameters, so that a name read in one block of metaconfig.yaml means the same thing in every other block. The rules below are the ones the existing templates follow; a new template picks its names here before inventing one, and a name that fits none of the rules is a sign that the parameter needs a second look.
Names are snake_case. A parameter says what the value is (hostname, photos_dir), not what the template does with it (enable_..., use_...).
Images¶
imageis the image of the service itself, as a full reference (registry/namespace/name:tag). Every service template has one, whether it deploys a single container or a pod. Prefer a major or major.minor tag tolatest, sinceAutoUpdate=registryfollows the tag.<component>_imageis the image of a companion container of a pod, named after the component and not after the service:postgres_image,mongo_image,redis_image,valkey_image,ml_image.
Ports¶
http_portis the port on which the HTTP interface of the service is published on the host. It is unique across the file: Caddy, Homepage and Prometheus reach the service ashost.containers.internal:<http_port>, and nothing is reachable from the internet without a Caddy site pointing at it. The examples use the30xxrange, one port per template, a new template taking the next free one.<protocol>_portis any other published port, named after its protocol:https_port,ssh_port,smtp_port,wireguard_port.<component>_portis the HTTP port of a companion container that has a web interface of its own, published next to the service'shttp_portand given its own Caddy site:matrix.element_port. Its host name is<component>_hostname.port, inside an entry that points at another service of the file (thecaddy.*_sites[]entries,caddy.authelia,homepage.services.*), is thehttp_portof that service.
Addresses¶
hostnameis the fully qualified domain name under which a service is reached from outside, that is thehostnameof its Caddy site:jellyfin.mydomain.com. It carries no scheme and no port; where the application expects a URL, the template prependshttps://.hostis a machine to connect to, given as a host name or an IP address: the endpoint of the VPN inwg_easy.host, the SMTP server of the provider instalwart.relay.host.ipand<role>_ipare IP addresses:adguardhome.ipfor the container,adguardhome.host_proxy_ipfor the proxy interface that puts the host on the same network.subnetand<role>_subnetsare address ranges in CIDR notation:adguardhome.macvlan.subnet,caddy.lan_subnets.domainis a DNS domain rather than a host, such as the part of a mail address after the@instalwart.domain.
Credentials¶
admin_usernameandadmin_passwordare the credentials of the first administrator account, created at first start. When the application identifies accounts by email, the username isadmin_email; when it fixes the administrator's name (Stalwart'sadmin), onlyadmin_passwordexists.password_hashreplacespasswordwhere the application stores only a hash, which the user generates:authelia.users[].password_hash.- Accounts for a specific purpose are a nested block named after their role, with
usernameandpasswordinside, plushostandportwhen the account is used on another machine:stalwart.relay(the provider's mailbox),stalwart.sender(the account the applications send with). - Credentials between the containers of one pod are not parameters at all: they are hard-coded in the template and never reachable from outside the pod.
Storage¶
<content>_diris the absolute path of a directory on the host, bind mounted into the container:immich.photos_dir. On Fedora CoreOS it lives under/var, typically on an ext4 drive.<content>_volumesis a list of bind mounts written in Podman'shost:container:optionssyntax, for services whose libraries are several directories:jellyfin.media_volumes.mount_pointis where a drive is mounted, andplaceholder_dirsthe names of directories created under it.
Schedules¶
auto_updateis the systemd calendar expression on which the service checks for a new image, replacing the daily default of Podman's timer. Every rootless template takes it; the automatic updates page documents it once for all of them.
Optional parameters¶
An optional feature is enabled by giving its parameter and disabled by leaving it out, never by a boolean next to the value: the machine learning service of Immich exists when immich.ml_image is set, the host-side macvlan interface of AdGuard Home when adguardhome.host_proxy_ip is set. The template guards the corresponding units with {% if key.x is defined %}, and the documentation marks the parameter Optional.
Pass-through blocks¶
Where a template wraps a configuration format of the application itself, the keys are those of the application and are not renamed: the widget keys of homepage.services.* and homepage.custom_services[], the scrape_config keys of prometheus.jobs[], the HOMEPAGE_* variables of homepage.environment, the Caddyfile lines of the directives of Caddy sites. Their documentation links the upstream reference instead of repeating it.