Add mcp-master systemd service

Runs the MCP v2 master as a systemd service on rift. Uses
ConditionPathExists so the unit is a no-op on worker nodes
(like orion) that import mcp.nix but don't have the binary.

Starts after mcp-agent.service. Security hardened like the agent
but with ProtectHome=true (master doesn't need /run/user).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-02 20:39:20 -07:00
parent dba2fb00eb
commit b26478d47b

View File

@@ -22,6 +22,41 @@ in
users.groups.mcp = {}; users.groups.mcp = {};
# MCP Master — multi-node orchestrator (v2).
# Runs on the master node only (rift). Coordinates deployments across
# agents, manages edge routing, and maintains cluster state.
# Uses ExecStartPre to skip startup if the binary is absent (safe on
# worker nodes that import this module but don't run the master).
systemd.services.mcp-master = {
description = "MCP Master";
after = [ "network-online.target" "mcp-agent.service" ];
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
unitConfig = {
ConditionPathExists = "/srv/mcp-master/mcp-master";
};
serviceConfig = {
Type = "simple";
ExecStart = "/srv/mcp-master/mcp-master server --config /srv/mcp-master/mcp-master.toml";
Restart = "on-failure";
RestartSec = 5;
NoNewPrivileges = true;
ProtectSystem = "full";
ProtectHome = true;
PrivateTmp = true;
PrivateDevices = true;
ProtectKernelTunables = true;
ProtectKernelModules = true;
RestrictSUIDSGID = true;
LockPersonality = true;
RestrictRealtime = true;
ReadWritePaths = [ "/srv/mcp-master" ];
};
};
systemd.services.mcp-agent = { systemd.services.mcp-agent = {
description = "MCP Agent"; description = "MCP Agent";
after = [ "network-online.target" ]; after = [ "network-online.target" ];