feat(nixos): integrate agent VM into host configurations

This commit is contained in:
2026-10-22 10:20:30 +08:00
parent d71fab81d5
commit 5c2e25b989
14 changed files with 826 additions and 28 deletions
+6
View File
@@ -14,6 +14,7 @@ nixos/
│ ├── README.md │ ├── README.md
│ ├── desktop.nix # 桌面机 │ ├── desktop.nix # 桌面机
│ ├── server.nix # 服务器 │ ├── server.nix # 服务器
│ ├── agent.nix # AI agent VM(不引入 Docker/免密 sudo)
│ ├── wsl.nix # WSL (Debian/Windows) │ ├── wsl.nix # WSL (Debian/Windows)
│ ├── virtualbox.nix # VirtualBox 虚拟机 │ ├── virtualbox.nix # VirtualBox 虚拟机
│ └── lxc.nix # Proxmox LXC 容器 │ └── lxc.nix # Proxmox LXC 容器
@@ -53,6 +54,7 @@ nixos/
│ └── nvchad.nix # Neovim (NvChad) │ └── nvchad.nix # Neovim (NvChad)
├── hosts/ # 主机专属配置 ├── hosts/ # 主机专属配置
│ ├── README.md │ ├── README.md
│ ├── agent/ # AI agent VM + Home Manager + hardware
│ ├── desktop/ # 桌面机(AMD + NVIDIA) │ ├── desktop/ # 桌面机(AMD + NVIDIA)
│ ├── server/ # 服务器 │ ├── server/ # 服务器
│ ├── wsl/ # WSL (NixOS-WSL) │ ├── wsl/ # WSL (NixOS-WSL)
@@ -66,6 +68,7 @@ nixos/
| 主机 | 角色 | 架构 | 说明 | | 主机 | 角色 | 架构 | 说明 |
|------|------|------|------| |------|------|------|------|
| `agent` | agent | x86_64-linux | AI Agent VM,CERNET 镜像与 Mihomo TUN |
| `desktop` | desktop | x86_64-linux | 桌面机,NVIDIA + AMD 双显卡 | | `desktop` | desktop | x86_64-linux | 桌面机,NVIDIA + AMD 双显卡 |
| `server` | server | x86_64-linux | 服务器 | | `server` | server | x86_64-linux | 服务器 |
| `nixos-wsl` | wsl | x86_64-linux | WSL | | `nixos-wsl` | wsl | x86_64-linux | WSL |
@@ -81,6 +84,9 @@ sudo nixos-rebuild switch --flake .#desktop
# 仅构建不切换 # 仅构建不切换
sudo nixos-rebuild build --flake .#server sudo nixos-rebuild build --flake .#server
# AI Agent VM:保留独立的 SSH、sudo 和 Mihomo 设置
sudo nixos-rebuild switch --flake .#agent
# 更新 flake lock # 更新 flake lock
nix flake update nix flake update
Generated
+574 -8
View File
@@ -1,5 +1,87 @@
{ {
"nodes": { "nodes": {
"agent-nix4nvchad": {
"inputs": {
"nixpkgs": [
"agent-nixpkgs"
],
"nvchad-starter": "nvchad-starter"
},
"locked": {
"lastModified": 1792593944,
"narHash": "sha256-CiqzeKQdtkkW56w/KZq6orzsPC6vHZqYYbJ3kqhEIy0=",
"owner": "nix-community",
"repo": "nix4nvchad",
"rev": "042bbb1be519d01c76d8c65b2e004212b5b706ad",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nix4nvchad",
"rev": "042bbb1be519d01c76d8c65b2e004212b5b706ad",
"type": "github"
}
},
"agent-nixpkgs": {
"locked": {
"lastModified": 315532800,
"narHash": "sha256-OtQ9jaQ9aXZDm61TqykPLZdXJa2NMykYG3d0tbT683U=",
"type": "tarball",
"url": "https://mirrors.cernet.edu.cn/nix-channels/nixos-26.05/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
"url": "https://mirrors.cernet.edu.cn/nix-channels/nixos-26.05/nixexprs.tar.xz"
}
},
"bun2nix": {
"inputs": {
"flake-parts": "flake-parts_2",
"nixpkgs": [
"omp",
"nixpkgs"
],
"systems": "systems_2",
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1784665499,
"narHash": "sha256-9BMxlTxCCDAeoNLtb1a/st7udtTIJep+wpUzquA29VU=",
"owner": "nix-community",
"repo": "bun2nix",
"rev": "0f2a1f0b6f42cebe3b149bf62d38754c5e0e9729",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "bun2nix",
"type": "github"
}
},
"bun2nix-darwin-x64": {
"inputs": {
"flake-parts": "flake-parts_3",
"nixpkgs": [
"omp",
"nixpkgs-darwin-x64"
],
"systems": "systems_3",
"treefmt-nix": "treefmt-nix_2"
},
"locked": {
"lastModified": 1784665499,
"narHash": "sha256-9BMxlTxCCDAeoNLtb1a/st7udtTIJep+wpUzquA29VU=",
"owner": "nix-community",
"repo": "bun2nix",
"rev": "0f2a1f0b6f42cebe3b149bf62d38754c5e0e9729",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "bun2nix",
"type": "github"
}
},
"flake-compat": { "flake-compat": {
"flake": false, "flake": false,
"locked": { "locked": {
@@ -17,6 +99,71 @@
} }
}, },
"flake-parts": { "flake-parts": {
"inputs": {
"nixpkgs-lib": [
"hermes-agent",
"nixpkgs"
]
},
"locked": {
"lastModified": 1782949081,
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_2": {
"inputs": {
"nixpkgs-lib": [
"omp",
"bun2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1782949081,
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_3": {
"inputs": {
"nixpkgs-lib": [
"omp",
"bun2nix-darwin-x64",
"nixpkgs"
]
},
"locked": {
"lastModified": 1782949081,
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_4": {
"inputs": { "inputs": {
"nixpkgs-lib": "nixpkgs-lib" "nixpkgs-lib": "nixpkgs-lib"
}, },
@@ -34,7 +181,92 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"herdr-nix": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1791994266,
"narHash": "sha256-o4QvYScvUHcOtYw3kFX5Tc+BG51kmyvHahIKZDERNG0=",
"owner": "herdrdev",
"repo": "herdr-nix",
"rev": "602c88543e53f33273ea913b774dfea0a812ac12",
"type": "github"
},
"original": {
"owner": "herdrdev",
"repo": "herdr-nix",
"type": "github"
}
},
"hermes-agent": {
"inputs": {
"flake-parts": "flake-parts",
"home-manager": "home-manager",
"nixpkgs": "nixpkgs",
"npm-lockfile-fix": "npm-lockfile-fix",
"pyproject-build-systems": "pyproject-build-systems",
"pyproject-nix": "pyproject-nix",
"uv2nix": "uv2nix"
},
"locked": {
"lastModified": 1792592505,
"narHash": "sha256-qEYju2lK48R+aT+ry0aiT3JNAwOaXx49h/VMjZR7djE=",
"owner": "NousResearch",
"repo": "hermes-agent",
"rev": "3f2afed3eb813cb00bd381d29b084d0e01de048f",
"type": "github"
},
"original": {
"owner": "NousResearch",
"repo": "hermes-agent",
"rev": "3f2afed3eb813cb00bd381d29b084d0e01de048f",
"type": "github"
}
},
"home-manager": { "home-manager": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
]
},
"locked": {
"lastModified": 1786487128,
"narHash": "sha256-ad60hrRVhH/bo3Jl1YLzO+QcS3mUNZr9LNJdzhMO2P4=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "f404edbfa4117810c96b97048299242fc50e5362",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
},
"home-manager_2": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
@@ -55,12 +287,33 @@
"type": "github" "type": "github"
} }
}, },
"nix-bun": {
"inputs": {
"nixpkgs": [
"omp",
"nixpkgs"
]
},
"locked": {
"lastModified": 1789370898,
"narHash": "sha256-QBlvSGth1NfAWw7iePOzFlrz0/pX6CfkFCcPALdySNI=",
"owner": "ryoppippi",
"repo": "nix-bun",
"rev": "48e887d7955c1c05b8d4627ed39bafe4bf2455a7",
"type": "github"
},
"original": {
"owner": "ryoppippi",
"repo": "nix-bun",
"type": "github"
}
},
"nix4nvchad": { "nix4nvchad": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
"nvchad-starter": "nvchad-starter" "nvchad-starter": "nvchad-starter_2"
}, },
"locked": { "locked": {
"lastModified": 1786241713, "lastModified": 1786241713,
@@ -100,16 +353,32 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1786430034, "lastModified": 1785318670,
"narHash": "sha256-Vux08kA5PICwS2sViCMfwVLAHNoH8TkKAeBo25LjpMI=", "narHash": "sha256-dN6Ou5x/+23FZLEpYP3IffO+NyJFzUlGumt1uu3MMaY=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "70cc4559b10a6062b05ff1af17e0add065ccaed9", "rev": "0954f7ee2f6bb3dc7d4e3d0d8bcb8fd4bde4cfc5",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "NixOS", "owner": "NixOS",
"ref": "nixos-26.05", "ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-darwin-x64": {
"locked": {
"lastModified": 1786527240,
"narHash": "sha256-OLtJPnSXcRy79Rf7BhYaMeXAVF625FpLcd3+Svq641Y=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e0c84f9d0ad137f076dc957494f5b39885597d4f",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-26.05-darwin",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
@@ -129,6 +398,71 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs-unstable": {
"locked": {
"lastModified": 315532800,
"narHash": "sha256-ij8QUxzTOHovLrNOxVRx+RAhGQFOMsJbji0veiatH5k=",
"type": "tarball",
"url": "https://mirrors.cernet.edu.cn/nix-channels/nixos-unstable/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
"url": "https://mirrors.cernet.edu.cn/nix-channels/nixos-unstable/nixexprs.tar.xz"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1786430034,
"narHash": "sha256-Vux08kA5PICwS2sViCMfwVLAHNoH8TkKAeBo25LjpMI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "70cc4559b10a6062b05ff1af17e0add065ccaed9",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1786384358,
"narHash": "sha256-RzPPiWeUtuvymnpuEWsdtzli5w4kjZs49FqEs3/1u+I=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "2fcb964de67fcf60b43471c55d5d99e61a9ccb5a",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"npm-lockfile-fix": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
]
},
"locked": {
"lastModified": 1775903712,
"narHash": "sha256-2GV79U6iVH4gKAPWYrxUReB0S41ty/Y3dBLquU8AlaA=",
"owner": "jeslie0",
"repo": "npm-lockfile-fix",
"rev": "c6093acb0c0548e0f9b8b3d82918823721930fe8",
"type": "github"
},
"original": {
"owner": "jeslie0",
"repo": "npm-lockfile-fix",
"type": "github"
}
},
"nvchad-starter": { "nvchad-starter": {
"flake": false, "flake": false,
"locked": { "locked": {
@@ -146,16 +480,134 @@
"type": "github" "type": "github"
} }
}, },
"nvchad-starter_2": {
"flake": false,
"locked": {
"lastModified": 1753939018,
"narHash": "sha256-xdLr6tlU9uA+wu0pqha2br0fdVm+1MjgjbB5awz9ICU=",
"owner": "NvChad",
"repo": "starter",
"rev": "e3572e1f5e1c297212c3deeb17b7863139ce663e",
"type": "github"
},
"original": {
"owner": "NvChad",
"ref": "main",
"repo": "starter",
"type": "github"
}
},
"omp": {
"inputs": {
"bun2nix": "bun2nix",
"bun2nix-darwin-x64": "bun2nix-darwin-x64",
"nix-bun": "nix-bun",
"nixpkgs": "nixpkgs_3",
"nixpkgs-darwin-x64": "nixpkgs-darwin-x64",
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1792592597,
"narHash": "sha256-ZLfGaB6BKOeOgKs3EbMMcJWJGvu58woVqs8K6QE6Erw=",
"owner": "can1357",
"repo": "oh-my-pi",
"rev": "08542ed0df02ecaa78aaab28388aa6a563045f16",
"type": "github"
},
"original": {
"owner": "can1357",
"repo": "oh-my-pi",
"rev": "08542ed0df02ecaa78aaab28388aa6a563045f16",
"type": "github"
}
},
"pyproject-build-systems": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
],
"pyproject-nix": [
"hermes-agent",
"pyproject-nix"
],
"uv2nix": [
"hermes-agent",
"uv2nix"
]
},
"locked": {
"lastModified": 1785115949,
"narHash": "sha256-8AM37BfyGaL2v/SZyg4PupRxJ01Y4htvM+WrTjWrPpo=",
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"rev": "62c0d86027edb1c4f39a5facc09876348144f7c9",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"type": "github"
}
},
"pyproject-nix": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
]
},
"locked": {
"lastModified": 1784591072,
"narHash": "sha256-zP/WaDxrRu8GANZM61+V2LT/7ycEEdoyLWn7M6WzU7M=",
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"rev": "e3b599ca2e7fcf93d4edf65d7f19bbf6491724f3",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"type": "github"
}
},
"root": { "root": {
"inputs": { "inputs": {
"home-manager": "home-manager", "agent-nix4nvchad": "agent-nix4nvchad",
"agent-nixpkgs": "agent-nixpkgs",
"herdr-nix": "herdr-nix",
"hermes-agent": "hermes-agent",
"home-manager": "home-manager_2",
"nix4nvchad": "nix4nvchad", "nix4nvchad": "nix4nvchad",
"nixos-wsl": "nixos-wsl", "nixos-wsl": "nixos-wsl",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs_2",
"nixpkgs-unstable": "nixpkgs-unstable",
"omp": "omp",
"sops-nix": "sops-nix", "sops-nix": "sops-nix",
"vscode-server": "vscode-server" "vscode-server": "vscode-server"
} }
}, },
"rust-overlay": {
"inputs": {
"nixpkgs": [
"omp",
"nixpkgs"
]
},
"locked": {
"lastModified": 1791276535,
"narHash": "sha256-iwqAmHTX1IgzTumJR3JayNAQAo5xEmmOuGzB6b2pT/Q=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "b962e5d0c8cd97196c6a882d659fe451b52ad989",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"sops-nix": { "sops-nix": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -176,9 +628,123 @@
"type": "github" "type": "github"
} }
}, },
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1776166891,
"narHash": "sha256-bI8yrEGjrohR5hkQox7UrxDH7XqrYMwI8SL/LrJ1+S8=",
"owner": "nix-systems",
"repo": "triplet",
"rev": "6de7bc09397911ce03636afbcf6118745ab2cda0",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "triplet",
"type": "github"
}
},
"systems_3": {
"locked": {
"lastModified": 1680978224,
"narHash": "sha256-+xT9B1ZbhMg/zpJqd00S06UCZb/A2URW9bqqrZ/JTOg=",
"owner": "nix-systems",
"repo": "x86_64-darwin",
"rev": "db0463cce4cd60fb791f33a83d29a1ed53edab9b",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "x86_64-darwin",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"omp",
"bun2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1784369104,
"narHash": "sha256-47cxbcZODibHv3rELFQ9vZly0vUNkND/atn/U7HLeb0=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "df3c0640565d04a0261253cdd89fce78ec50168a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"treefmt-nix_2": {
"inputs": {
"nixpkgs": [
"omp",
"bun2nix-darwin-x64",
"nixpkgs"
]
},
"locked": {
"lastModified": 1784369104,
"narHash": "sha256-47cxbcZODibHv3rELFQ9vZly0vUNkND/atn/U7HLeb0=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "df3c0640565d04a0261253cdd89fce78ec50168a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"uv2nix": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
],
"pyproject-nix": [
"hermes-agent",
"pyproject-nix"
]
},
"locked": {
"lastModified": 1785277507,
"narHash": "sha256-9Tq3UDX2hD/aveW/HvkBlAmEwJTOlY5HQXJM+L5BGmE=",
"owner": "pyproject-nix",
"repo": "uv2nix",
"rev": "5a836d395cbf5fc22670eb98dd4aa4fc4d406977",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "uv2nix",
"type": "github"
}
},
"vscode-server": { "vscode-server": {
"inputs": { "inputs": {
"flake-parts": "flake-parts" "flake-parts": "flake-parts_4"
}, },
"locked": { "locked": {
"lastModified": 1784312229, "lastModified": 1784312229,
+29 -7
View File
@@ -3,6 +3,15 @@
inputs = { inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
agent-nixpkgs.url = "tarball+https://mirrors.cernet.edu.cn/nix-channels/nixos-26.05/nixexprs.tar.xz";
nixpkgs-unstable.url = "tarball+https://mirrors.cernet.edu.cn/nix-channels/nixos-unstable/nixexprs.tar.xz";
# Exact revisions of the source archives previously used on agent.
hermes-agent.url = "github:NousResearch/hermes-agent/3f2afed3eb813cb00bd381d29b084d0e01de048f";
omp.url = "github:can1357/oh-my-pi/08542ed0df02ecaa78aaab28388aa6a563045f16";
herdr-nix = {
url = "github:herdrdev/herdr-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = { home-manager = {
url = "github:nix-community/home-manager/release-26.05"; url = "github:nix-community/home-manager/release-26.05";
@@ -14,6 +23,11 @@
url = "github:nix-community/nix4nvchad"; url = "github:nix-community/nix4nvchad";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
# Keep the agent VM on its currently installed NvChad module revision.
agent-nix4nvchad = {
url = "github:nix-community/nix4nvchad/042bbb1be519d01c76d8c65b2e004212b5b706ad";
inputs.nixpkgs.follows = "agent-nixpkgs";
};
# NixOS WSL # NixOS WSL
nixos-wsl = { nixos-wsl = {
@@ -31,17 +45,25 @@
}; };
}; };
outputs = inputs@{ nixpkgs, home-manager, ... }: outputs =
inputs@{ nixpkgs, home-manager, ... }:
let let
username = "luochen570"; username = "luochen570";
hosts = import ./lib/hosts.nix; hosts = import ./lib/hosts.nix;
mkHost = import ./lib/mkHost.nix { mkConfiguredHost =
inherit nixpkgs home-manager inputs; hostname: cfg:
}; (import ./lib/mkHost.nix {
mkConfiguredHost = hostname: cfg: mkHost ({ nixpkgs = if hostname == "agent" then inputs.agent-nixpkgs else nixpkgs;
inherit home-manager inputs;
})
(
{
inherit hostname username; inherit hostname username;
} // cfg); }
in { // cfg
);
in
{
nixosConfigurations = nixpkgs.lib.mapAttrs mkConfiguredHost hosts; nixosConfigurations = nixpkgs.lib.mapAttrs mkConfiguredHost hosts;
}; };
} }
+15
View File
@@ -0,0 +1,15 @@
# agent
NixOS 26.05 VM at `s0.sermc.net` (SSH externally on port 6522), managed by `.#agent`.
This host intentionally does not import the shared `server` profile: that profile enables Docker and disables wheel sudo prompts, whereas the existing agent VM does neither. SSH replies bypass Mihomo TUN via `ssh-direct-route`.
Apply on the VM from a checkout with its locked inputs:
```sh
sudo nixos-rebuild build --flake .#agent
sudo nixos-rebuild switch --flake .#agent
```
`/etc/mihomo-config.yaml` is a root-owned mode-0600 subscription with credentials. It stays outside Git and must be provisioned separately before enabling Mihomo. Never place the subscription, API keys, or SSH secrets in the Nix store or this public repository.
Hermes Agent and OMP are pinned to the exact upstream commits from which the previous local archives were extracted. Their `flake.nix` hashes matched the old local trees before cutover; the full packages must still build and pass the CLI smoke check after re-locking. The server needs the pinned sources and binary caches available at build time.
+33
View File
@@ -0,0 +1,33 @@
{
boot.loader.grub = {
enable = true;
device = "/dev/sda";
useOSProber = true;
};
networking.networkmanager.enable = true;
time.timeZone = "Asia/Shanghai";
i18n.defaultLocale = "zh_CN.UTF-8";
i18n.extraLocaleSettings = {
LC_ADDRESS = "zh_CN.UTF-8";
LC_IDENTIFICATION = "zh_CN.UTF-8";
LC_MEASUREMENT = "zh_CN.UTF-8";
LC_MONETARY = "zh_CN.UTF-8";
LC_NAME = "zh_CN.UTF-8";
LC_NUMERIC = "zh_CN.UTF-8";
LC_PAPER = "zh_CN.UTF-8";
LC_TELEPHONE = "zh_CN.UTF-8";
LC_TIME = "zh_CN.UTF-8";
};
services.xserver.xkb.layout = "cn";
users.users.luochen570 = {
isNormalUser = true;
description = "luochen570";
extraGroups = [
"networkmanager"
"wheel"
];
};
}
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
./hardware-configuration.nix
./configuration.nix
];
}
+27
View File
@@ -0,0 +1,27 @@
# Generated by nixos-generate-config for this VM; keep device UUID intact.
{
lib,
modulesPath,
...
}:
{
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
boot.initrd.availableKernelModules = [
"ata_piix"
"uhci_hcd"
"virtio_pci"
"virtio_scsi"
"sd_mod"
"sr_mod"
];
boot.kernelModules = [ "kvm-amd" ];
fileSystems."/" = {
device = "/dev/disk/by-uuid/182efe7c-8bb0-4229-8815-1c58bf67dde4";
fsType = "ext4";
};
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}
+54
View File
@@ -0,0 +1,54 @@
{
pkgs,
inputs,
system,
...
}:
{
imports = [ inputs.agent-nix4nvchad.homeManagerModules.default ];
home.username = "luochen570";
home.homeDirectory = "/home/luochen570";
programs.nvchad.enable = true;
home.packages = with pkgs; [
inputs.hermes-agent.packages.${system}.default
inputs.omp.packages.${system}.default
inputs.nixpkgs-unstable.legacyPackages.${system}.cc-switch-cli
inputs.herdr-nix.packages.${system}.default
codex
opencode
pi-coding-agent
zeroclaw
htop
fastfetch
hyfetch # Provides the maintained neofetch command.
zsh
eza
uv
bat
yazi
ncdu
duf
git
gh
podman
vim
tailscale
docker-client
curl
wget
fzf
unzip
zip
p7zip
unrar
gzip
bzip2
xz
zstd
libarchive
gnutar
];
}
+9
View File
@@ -1,4 +1,13 @@
{ {
agent = {
system = "x86_64-linux";
profile = "agent";
systemStateVersion = "26.05";
homeStateVersion = "26.05";
homeModules = [ ../hosts/agent/home.nix ];
useSops = false;
};
desktop = { desktop = {
system = "x86_64-linux"; system = "x86_64-linux";
profile = "desktop"; profile = "desktop";
+15 -8
View File
@@ -1,4 +1,8 @@
{ nixpkgs, home-manager, inputs }: {
nixpkgs,
home-manager,
inputs,
}:
{ {
hostname, hostname,
hostName ? hostname, hostName ? hostname,
@@ -8,15 +12,18 @@
username, username,
extraModules ? [ ], extraModules ? [ ],
extraSpecialArgs ? { }, extraSpecialArgs ? { },
homeModules ? [ ../home ],
homeStateVersion ? "25.05",
useSops ? true,
}: }:
nixpkgs.lib.nixosSystem { nixpkgs.lib.nixosSystem {
inherit system; inherit system;
specialArgs = { specialArgs = {
inherit inputs system username; inherit inputs system username;
} // extraSpecialArgs; }
// extraSpecialArgs;
modules = [ modules = [
inputs.sops-nix.nixosModules.sops
../hosts/${hostname} ../hosts/${hostname}
../profiles/${profile}.nix ../profiles/${profile}.nix
{ {
@@ -31,11 +38,11 @@ nixpkgs.lib.nixosSystem {
inherit inputs system; inherit inputs system;
}; };
home-manager.users.${username} = { home-manager.users.${username} = {
home.stateVersion = "25.05"; home.stateVersion = homeStateVersion;
imports = [ imports = homeModules;
../home
];
}; };
} }
] ++ extraModules; ]
++ nixpkgs.lib.optionals useSops [ inputs.sops-nix.nixosModules.sops ]
++ extraModules;
} }
+6
View File
@@ -0,0 +1,6 @@
{
imports = [
./nix.nix
./network.nix
];
}
+29
View File
@@ -0,0 +1,29 @@
{ pkgs, ... }:
{
services.openssh.enable = true;
services.mihomo = {
enable = true;
tunMode = true;
configFile = "/etc/mihomo-config.yaml";
};
systemd.services.mihomo = {
after = [ "ssh-direct-route.service" ];
requires = [ "ssh-direct-route.service" ];
};
# Keep SSH replies outside the transparent proxy before Mihomo starts.
systemd.services.ssh-direct-route = {
description = "Keep SSH replies on the unmodified main routing table";
wantedBy = [ "multi-user.target" ];
before = [ "mihomo.service" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
ExecStart = "${pkgs.iproute2}/bin/ip rule add pref 8000 ipproto tcp sport 22 lookup main";
ExecStop = "${pkgs.iproute2}/bin/ip rule del pref 8000 ipproto tcp sport 22 lookup main";
};
};
}
+13
View File
@@ -0,0 +1,13 @@
{
nix.settings = {
experimental-features = [
"nix-command"
"flakes"
];
substituters = [
"https://mirrors.cernet.edu.cn/nix-channels/store?priority=10"
];
};
nixpkgs.config.allowUnfree = true;
}
+5
View File
@@ -0,0 +1,5 @@
{
# This VM keeps password-based SSH and password-protected sudo. The shared
# server profile enables Docker and the core profile disables sudo prompts.
imports = [ ../modules/agent ];
}