Auth changes step 2
This commit is contained in:
parent
d7042b4a2b
commit
1908b42499
|
|
@ -72,3 +72,8 @@ This repo also includes a **RoleMesh Node Agent** (`rolemesh-node-agent`) that c
|
||||||
- Sample config: `configs/node_agent.example.yaml`
|
- Sample config: `configs/node_agent.example.yaml`
|
||||||
- Docs: `docs/NODE_AGENT.md`
|
- Docs: `docs/NODE_AGENT.md`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Safe-by-default binding
|
||||||
|
|
||||||
|
Gateway and node-agent default to binding on `127.0.0.1` to avoid accidental exposure. Bind only to private/LAN or VPN interfaces and firewall ports if you need remote access.
|
||||||
|
|
|
||||||
|
|
@ -47,3 +47,7 @@ models:
|
||||||
strategy: round_robin
|
strategy: round_robin
|
||||||
defaults:
|
defaults:
|
||||||
temperature: 0.2
|
temperature: 0.2
|
||||||
|
|
||||||
|
|
||||||
|
security_notes:
|
||||||
|
- "Default binds are localhost. If exposing gateway or node agent beyond localhost, bind to a private/LAN IP and firewall it (never expose to the public Internet)."
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
node_id: "node-1"
|
node_id: "node-1"
|
||||||
listen_host: "0.0.0.0"
|
listen_host: "127.0.0.1" # Set to a LAN/private IP (or 0.0.0.0) if dispatcher is on another machine
|
||||||
listen_port: 8091
|
listen_port: 8091
|
||||||
|
|
||||||
# Set to the dispatcher gateway URL if you want auto-registration/heartbeat.
|
# Set to the dispatcher gateway URL if you want auto-registration/heartbeat.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,35 @@
|
||||||
# Deployment
|
# Deployment
|
||||||
|
|
||||||
|
|
||||||
|
## Network binding and exposure (Step 2 hardening)
|
||||||
|
|
||||||
|
**Defaults are safe-by-default:** the gateway and node-agent CLIs default to binding on `127.0.0.1` (localhost).
|
||||||
|
This prevents accidental public exposure during development.
|
||||||
|
|
||||||
|
If you need remote access:
|
||||||
|
|
||||||
|
- Bind **only** to a **LAN/private** interface (e.g. `192.168.x.y`, `10.x.y.z`) and restrict ingress with a firewall/VPN.
|
||||||
|
- Do **not** bind to `0.0.0.0` on an Internet-routable host.
|
||||||
|
|
||||||
|
### Recommended firewall policy (examples)
|
||||||
|
|
||||||
|
Linux (UFW), allow only a private subnet to reach the gateway (8080) and node agents (8091):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ufw allow from 192.168.0.0/16 to any port 8080 proto tcp
|
||||||
|
sudo ufw allow from 192.168.0.0/16 to any port 8091 proto tcp
|
||||||
|
sudo ufw deny 8080/tcp
|
||||||
|
sudo ufw deny 8091/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're using Tailscale/WireGuard, prefer binding to the VPN interface address and limiting rules to that interface/subnet.
|
||||||
|
|
||||||
|
### Llama.cpp servers
|
||||||
|
|
||||||
|
The node agent starts persistent `llama-server` processes bound to **localhost only** (`127.0.0.1`).
|
||||||
|
This is intentional: the llama servers should never be reachable directly from the network; only the node agent should proxy to them.
|
||||||
|
|
||||||
|
|
||||||
This scaffold supports two patterns.
|
This scaffold supports two patterns.
|
||||||
|
|
||||||
## Pattern A: Single host, proxy to localhost backends
|
## Pattern A: Single host, proxy to localhost backends
|
||||||
|
|
|
||||||
|
|
@ -38,3 +38,10 @@ If `dispatcher_base_url` is set in the node-agent config, the node agent will pe
|
||||||
- `POST <dispatcher>/v1/nodes/heartbeat` with latest device metrics.
|
- `POST <dispatcher>/v1/nodes/heartbeat` with latest device metrics.
|
||||||
|
|
||||||
Registration is currently manual from the node side (or can be added as a startup step).
|
Registration is currently manual from the node side (or can be added as a startup step).
|
||||||
|
|
||||||
|
### Binding
|
||||||
|
|
||||||
|
By default the node agent listens on `127.0.0.1`. If the dispatcher is on another machine, set:
|
||||||
|
|
||||||
|
- `listen_host` to a LAN/private IP (preferred), or `0.0.0.0` only when combined with strict firewalling.
|
||||||
|
- Keep llama.cpp servers local-only (this is enforced by the CUDA adapter).
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ from rolemesh_gateway.main import create_app
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
p = argparse.ArgumentParser(description="RoleMesh Gateway")
|
p = argparse.ArgumentParser(description="RoleMesh Gateway")
|
||||||
p.add_argument("--config", required=True, help="Path to gateway YAML config.")
|
p.add_argument("--config", required=True, help="Path to gateway YAML config.")
|
||||||
p.add_argument("--host", default="0.0.0.0")
|
p.add_argument("--host", default="127.0.0.1")
|
||||||
p.add_argument("--port", type=int, default=8080)
|
p.add_argument("--port", type=int, default=8080)
|
||||||
args = p.parse_args()
|
args = p.parse_args()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ class ModelEntry(BaseModel):
|
||||||
|
|
||||||
class NodeAgentConfig(BaseModel):
|
class NodeAgentConfig(BaseModel):
|
||||||
node_id: str = "node-1"
|
node_id: str = "node-1"
|
||||||
listen_host: str = "0.0.0.0"
|
listen_host: str = "127.0.0.1"
|
||||||
listen_port: int = 8091
|
listen_port: int = 8091
|
||||||
|
|
||||||
# Where GGUF models live (used for inventory endpoints; not required if models are explicit)
|
# Where GGUF models live (used for inventory endpoints; not required if models are explicit)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue