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.
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 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).