v0.4.1
The tierN bind mounts are absolute symlinks into /srv (compositions/<p>/tierN -> /srv/com-*-tierN/<p>). Under /:/hostfs those targets are dangling inside the container (restic reported "does not exist, skipping" for every path). Mount /srv:/srv:ro at the same path with RESTIC_HOSTFS=/ so restic follows the symlinks and records the real host paths.
apex.ermnvldmr.com
The commons of the apex fleet: a stock-python engine (apex <group>/<action>) and
the shared core docker-compose, consumed by every node as the commons/ git submodule.
Full documentation: docs.ermnvldmr.com/en/apex.
Layout
apex— launcher (python3, stdlib only); nodeinit.shsymlinks it ontoPATH.engine/— the runner: CLI, identity, overlay, context, and thectx.*helper library.actions/— grouped actions; the path IS the name (configure/ufw,tiers/link, …).compositions/apex/docker-compose.yml— the shared,${env}-parameterized core compose.vendor/— pinned pure-python third-party (empty; seevendor/VENDORED.md).tests/— stdlibunittestsuite (tests/run.sh).
Node-specific tooling lives in each node repo's proprietaries/ — commons holds only
what every node shares.
Usage (on a node)
apex acts on the local checkout — no <node> argument. Identity comes from the
host FQDN (<node>.a<x>.apex.ermnvldmr.com) and node.env.
apex/apex --help— list actionsapex configure/ufw— render + apply this node's ufw configapex configure— run everyconfigure/*in orderapex compose up— bring up the node's compositions
Constraints
git + python3 stdlib only. No pip/Node/Go/CUE. Composes are hand-authored (no codegen).
License
MIT (see LICENSE).
Languages
Python
99.6%
Shell
0.2%
Makefile
0.2%