Features
after_changesplugin hook: runs once after acf up/update,cf down(including--orphaned), orcf applythat started, moved, or stopped stacks, and receives the list of changed stacks. It is meant for plugins that act on the whole deployment, such as DNS records or uptime monitors, instead of once per stack. Failures are warnings.commandsplugin: newafter_changessteps that run locally, with{stacks}and{compose_dir}placeholders. For example, sync Uptime Kuma once per command:after_changes: [{local: "cd {compose_dir} && ./scripts/kuma-sync.py sync --apply"}].- New example plugins in
examples/plugins/:pinkeeps stacks on the host they must run on (static IPs, USB devices, GPUs). Starting one elsewhere fails with the reason, andcf checkflags a pin that no longer matchesstacks:.traefik-dnskeeps DNS records in sync with TraefikHost()names. It writes Headscaleextra_recordsor hosts lines into a managed block and restarts the reading stack only when the records changed.traefik-policyenforces Traefik label conventions before a stack starts, for example that a router on a public entrypoint is also onwebsecure.
- agenix example plugin: new
mode: symlinklinks the decrypted env file as the stack's.envon the target host, so compose files that useenv_file: .envget the secrets without changes. The README now explains which setups keep secrets off disk.
Documentation
- Recipes for the
commandsplugin: remounting NFS after a NAS reboot, creating the shared Docker network, and syncing Uptime Kuma once per command. - Added Komodo to the comparison with alternatives.
Testing
- The VM end-to-end tests now also cover
after_changes,pin,traefik-policy,traefik-dns, and agenix symlink mode (8 scenarios).
Full changelog: v1.23.0...v1.24.0