Modules
An app's build: its version and the commit it was built from, fixed at compile time.
An app's configuration, from the literal config.exs on its data volume.
The literal config.exs on a host's data volume: a map that is parsed,
never evaluated.
A setting type an app defines itself, {:custom, module}: a module
implementing this behavior owns how a value is checked, read from an env
var, shown and described (collpa#141, macaw_host#1).
The setting types Macaw.Host.Config understands, and how a value of each
is read from an environment variable (a string) or checked from
config.exs (a literal).
Generates an app's host control script, <app>-ctl, so the apps of the
family stop hand-maintaining thousands of lines of the same script.
The app description <app>-ctl is generated from: the :ctl key of the
app's mix.exs project config, checked once here so the templates can
trust every value.
A recording stand-in for a generated script's Ctl.World, so an app's
tests drive every <app>-ctl command without docker on the box and
assert each command's exact docker argv.
An app's health, in one shape every <app>-ctl status reads.
Serves an app's health report as JSON: 200 when healthy, 503 when not.
The JSON is the report's wire form (Macaw.Host.Health.to_wire/1): each
check's result worded as text here, at the edge.
The release side of an app's <app>-ctl: entry points the script runs as
bin/<app> eval (in a throwaway container, so they work with the app
stopped) or bin/<app> rpc (asking the running app).
Secrets the system generates itself (secret_key_base, signing and
sealing keys), kept in the data directory, readable by their owner only.
Mix Tasks
Generates the app's host control script from the :ctl description in
its mix.exs (Macaw.Host.Ctl.Description) and its own commands
(Ctl.AppCommands, in ctl/app_commands.ex by default).