| Concern |
Design |
Status |
| Control plane address |
Solo binds to 127.0.0.1 by default. A Lab binds to the LAN or a WireGuard interface, chosen at setup. |
Planned |
| Agents joining |
Each agent dials out to the control plane: one long-polled call, POST /agent/v1/sync over HTTPS with mutual TLS (ADR-0016), so it works behind home routers, NAT, and CGNAT. No inbound ports are opened on machines. In Solo, the agent runs inside the control plane’s process, with no network at all. |
In-process agent built; network transport Phase 2 |
| Enrolment |
A one-time token from the dashboard, after which the agent gets its own certificate, revocable per machine |
Planned |
| Reaching your workloads |
On the same machine or LAN: direct. From elsewhere: a relay through the control plane’s agent connection (notebook UI, endpoint API, VM SSH), authenticated per user. |
Planned (Phase 2) |
| Guest egress (non-owners) |
No access to the host, the LAN, or private and link-local ranges. Community workloads have no internet by default (ADR-0014). |
Planned |
| Owner workloads |
Normal network access, like any app on the machine |
— |
| Labs across sites |
Optional WireGuard between sites. Agents still dial out, so sites don’t need public IPs. |
Planned |
| Range |
Use |
Set in |
| 10.0.10.0/24 |
Node network |
inventory node_ip |
| 10.0.10.200–220 |
MetalLB pool (Gateway and LoadBalancer IPs) |
deploy/environments/*.yaml |
| 10.42.0.0/16 |
Pod CIDR |
infra/ansible/group_vars/all/main.yml |
| 10.43.0.0/16 |
Service CIDR |
same |
| 10.99.0.0/24 |
WireGuard admin VPN |
inventory wireguard_address |
| Public IPs |
Gateway, and VM SSH later |
ISP or colocation |
Give each region its own non-overlapping ranges, so regions can be linked later without
renumbering (ADR-0009).
- Cilium provides the CNI, kube-proxy replacement, NetworkPolicy enforcement, Hubble, and Gateway API (ADR-0007).
- MetalLB in L2 mode hands out LoadBalancer IPs on bare metal.
- Gateway API: one
Gateway named einsora with HTTPS listeners for api., app., and auth.. cert-manager issues certificates through ACME HTTP-01.
- WireGuard is the intended admin path. The firewall that enforces it is a Phase 3 task.
- Control plane versus regional entry points:
api., app., and auth. are served by the control plane. Workload traffic (*.<region>.ep. and *.<region>.nb. hosts, plus VM SSH) enters its region’s own Gateway directly.
- Inference gateway (planned, ADR-0010): API keys, token counts, rate limits, and failover. It routes by API key → tenant → endpoint, never by hostname alone.
These are generated by manifests.Tenant for every tenant namespace.
| Direction |
Allowed |
| Ingress |
From the same namespace, and from the Gateway proxy (the Cilium ingress entity) |
| Egress |
To the same namespace, DNS, and the model store (einsora.dev/role: model-store). Also the public internet (0.0.0.0/0 minus private and link-local ranges). |
Gaps to close:
- IPv6: the policies are IPv4-only, so keep clusters single-stack IPv4 until that changes.
- Node public IPs: add a Cilium cluster-wide policy that stops tenant pods reaching nodes on their public addresses.
- Abuse: block port 25, rate-limit new connections, and alert on scan-like flows.
| Workload |
Proposal |
| Endpoint |
<id>.<region>.ep.<domain>, with a wildcard certificate per region (DNS-01), through the inference gateway |
| Notebook |
<id>.<region>.nb.<domain>, behind an authenticating proxy (oauth2-proxy with the IdP) |
| VM SSH |
A shared IP with a port per VM, or a MetalLB IP per VM, or a bastion |
- At least 2× 25 GbE per node, plus a 1 GbE BMC port on a separate management switch.
- Ceph wants its own VLAN or NICs at 25 GbE or more.
- Dual ISP uplinks and static public IPs per site, and check the provider’s DDoS protection.
- Multi-node training (InfiniBand or RoCE) is out of scope until there’s demand.