Vilice is a proof of concept. Run it on a box you can afford to lose.

vilice route

Front other boxes: replace the routing table.

operate recorded before it runs

vilice route --help
vilice route — Front other boxes: replace the routing table

Replaces this box's routing table with the one you send on stdin: the
hostnames this box fronts for *other* boxes, and where each one goes.

This is what a balancer is for. It works on a host too — the routing
table is a separate Caddy fragment from the one deploy writes, so the
two never touch — but a box that fronts others and runs nothing itself
is the case this exists to serve.

Declarative and whole, like deploy. You send the table the box should
serve, not an edit to the table it has — so what is in the file is
what is routed, and there is no accumulated state to reason about.

  {"routes": [{"hostnames": ["app.example.com"],
               "upstreams": ["10.0.0.5:8080"]}]}

Usage:
  vilice route < table.json

Examples:
  Serve exactly the routes in edge.json, and no others.
    vilice route < edge.json

Scope:  operate — reachable by an operate or grant key
Record: written before the command runs