straylight: remove MCP (fleet teardown for V3)

Kyle 2026-09-22: tear down MCP across the fleet. Drops the mcp/mcpkg imports
(agent, mcp user, packages), the unikernel-host agent overrides and kvm group,
the mcp-br0 bridge + FORWARD drop, the low-port sysctl (only MCNS/mc-proxy
needed it; Mattermost binds 8065), MCP firewall ports (53, 8443, 9443, 9444,
9555; keeps 443 for tailscale serve and 8080 for open-webui) and the MCNS
nameservers/~mcp.metacircular.net domain. State under /srv/mcp is kept.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-22 19:40:56 -07:00
co-authored by Claude Opus 5.5
parent 39c9fc1a39
commit b387d86f28
+3 -58
View File
@@ -204,8 +204,6 @@ in
./hardware-configuration.nix ./hardware-configuration.nix
../../configs/desktop.nix ../../configs/desktop.nix
../../configs/qemu.nix ../../configs/qemu.nix
../../configs/mcpkg.nix
../../configs/mcp.nix # MCP agent + mcp user (straylight is becoming the core host)
]; ];
config = { config = {
@@ -307,49 +305,6 @@ in
}; };
}; };
# straylight is the unikernel host. The shared mcp.nix locks the agent
# down with PrivateDevices=true, which hides /dev/kvm and /dev/net/tun.
# Relax that here (only on straylight) so the agent can boot Nanos
# unikernel VMs under QEMU/KVM and (Phase 2) manage TAP devices.
systemd.services.mcp-agent.serviceConfig = {
PrivateDevices = lib.mkForce false;
DeviceAllow = [ "/dev/kvm rw" "/dev/net/tun rw" ];
SupplementaryGroups = [ "kvm" ];
AmbientCapabilities = [ "CAP_NET_ADMIN" ];
# The agent launches each unikernel as a daemonized QEMU process in its
# own cgroup. With the default KillMode=control-group, restarting the
# agent would SIGKILL every running VM. KillMode=process kills only the
# agent's main process on stop/restart, so VMs survive an agent upgrade.
# (If a VM does die, the agent's startup Recover restarts it.)
KillMode = lib.mkForce "process";
};
# Let the mcp user reach /dev/kvm directly as well.
users.users.mcp.extraGroups = [ "kvm" ];
# Isolated host-only bridge for unikernel VMs (Phase 2). Each unikernel
# gets a TAP on this bridge and a 10.99.0.0/24 static IP. The bridge has
# NO uplink and NO NAT, and the firewall drops any VM traffic leaving the
# bridge, so a VM can reach only the host gateway (10.99.0.1) -- mediation
# is enforced by network topology, not convention.
networking.bridges.mcp-br0.interfaces = [ ];
networking.interfaces.mcp-br0.ipv4.addresses = [
{ address = "10.99.0.1"; prefixLength = 24; }
];
# The host accepts traffic from VMs (so mc-proxy on the gateway can serve
# them); the FORWARD drop prevents VMs from routing anywhere off-bridge.
networking.firewall.trustedInterfaces = [ "mcp-br0" ];
networking.firewall.extraCommands = ''
iptables -D FORWARD -i mcp-br0 ! -o mcp-br0 -j DROP 2>/dev/null || true
iptables -A FORWARD -i mcp-br0 ! -o mcp-br0 -j DROP
'';
networking.firewall.extraStopCommands = ''
iptables -D FORWARD -i mcp-br0 ! -o mcp-br0 -j DROP 2>/dev/null || true
'';
# Allow rootless containers (podman) to bind low ports (53 for MCNS,
# 443/8443/9443 for mc-proxy) as straylight takes over the core role.
boot.kernel.sysctl."net.ipv4.ip_unprivileged_port_start" = 53;
hardware.bluetooth.enable = true; # enables BlueZ + bluetooth.service hardware.bluetooth.enable = true; # enables BlueZ + bluetooth.service
programs.steam.enable = true; programs.steam.enable = true;
@@ -486,21 +441,11 @@ in
}; };
}; };
# Open ports: DNS (53), mc-proxy (443/8443/9443), agent (9444), master (9555), open-webui (8080). # Open ports: tailscale serve for Mattermost (443), open-webui (8080). MCP's DNS,
networking.firewall.allowedTCPPorts = [ 53 443 8080 8443 9443 9444 9555 ]; # mc-proxy, agent and master ports went with MCP (torn down 2026-09-22 for V3).
networking.firewall.allowedUDPPorts = [ 53 ]; networking.firewall.allowedTCPPorts = [ 443 8080 ];
# llama.cpp OpenAI-compatible API: tailnet only (localhost is always allowed). # llama.cpp OpenAI-compatible API: tailnet only (localhost is always allowed).
networking.firewall.interfaces.tailscale0.allowedTCPPorts = [ 11434 11435 ]; networking.firewall.interfaces.tailscale0.allowedTCPPorts = [ 11434 11435 ];
# DNS: MCNS for internal zones, public resolvers as fallback.
networking.nameservers = [
"192.168.88.181"
"100.95.252.120"
"1.1.1.1"
"8.8.8.8"
];
services.resolved.settings.Resolve.Domains = [
"~mcp.metacircular.net"
];
}; };
} }