为什么选择 Nix 部署
Nix 提供了一种声明式、可复现的方式来管理软件部署。对于 OpenClaw 而言,这意味着:
- 环境一致性:开发、测试、生产环境完全一致
- 回滚能力:任意时间点可以回退到之前的配置
- 不可变基础设施:杜绝「在我机器上能跑」的问题
- 依赖隔离:不会与系统其他软件产生冲突
前置准备
安装 Nix 包管理器
如果你还没有安装 Nix,可以通过官方脚本安装:
# Linux / macOS 单用户安装
sh <(curl -L https://nixos.org/nix/install) --no-daemon
# 多用户安装(推荐用于生产环境)
sh <(curl -L https://nixos.org/nix/install) --daemon
启用 Flake 支持
在 ~/.config/nix/nix.conf 中添加:
experimental-features = nix-command flakes
使用 Nix Flake 部署 OpenClaw
创建项目 Flake 文件
在你的部署目录中创建 flake.nix:
{
description = "OpenClaw 声明式部署";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
openclaw.url = "github:openclaw/openclaw";
};
outputs = { self, nixpkgs, openclaw }: {
nixosConfigurations.openclaw-server = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./hardware-configuration.nix
openclaw.nixosModules.default
./openclaw-config.nix
];
};
};
}
编写 OpenClaw 配置模块
创建 openclaw-config.nix:
{ config, pkgs, ... }:
{
services.openclaw = {
enable = true;
# 模型配置
settings = {
model = {
provider = "anthropic";
model = "claude-sonnet-4-20250514";
};
# 频道配置
channels = {
whatsapp = {
enabled = true;
};
discord = {
enabled = true;
};
};
# 系统提示词
systemPrompt = "你是一个有用的助手。";
};
};
# 环境变量通过 sops-nix 或 agenix 管理密钥
sops.secrets."openclaw/api-key" = {
owner = "openclaw";
};
}
Systemd 服务集成
Nix 模块会自动生成 systemd 服务单元,你也可以自定义:
{
systemd.services.openclaw = {
description = "OpenClaw AI 助手服务";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
serviceConfig = {
Type = "simple";
User = "openclaw";
Group = "openclaw";
Restart = "on-failure";
RestartSec = "5s";
# 安全加固
NoNewPrivileges = true;
ProtectSystem = "strict";
ProtectHome = true;
PrivateTmp = true;
ReadWritePaths = [ "/var/lib/openclaw" ];
EnvironmentFile = config.sops.secrets."openclaw/env".path;
};
script = ''
${pkgs.openclaw}/bin/openclaw serve
'';
};
}
使用 Nix Shell 进行开发调试
无需全局安装,快速进入 OpenClaw 开发环境:
# 临时使用 OpenClaw
nix run github:openclaw/openclaw -- --version
# 进入包含 OpenClaw 的开发 Shell
nix develop github:openclaw/openclaw
也可以在项目中定义 devShell:
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
openclaw
jq # 用于处理 JSON 配置
curl # 用于测试 API 连接
];
shellHook = ''
echo "OpenClaw 开发环境已就绪"
openclaw --version
'';
};
部署与更新
首次部署
# 构建并部署到目标服务器
nixos-rebuild switch --flake .#openclaw-server --target-host root@your-server
# 或者本地部署
sudo nixos-rebuild switch --flake .#openclaw-server
滚动更新
# 更新 Flake 锁文件中的 OpenClaw 版本
nix flake update openclaw
# 重新部署
nixos-rebuild switch --flake .#openclaw-server
版本回滚
# 查看历史版本
nixos-rebuild list-generations
# 回滚到上一个版本
nixos-rebuild switch --rollback
常见问题
Flake 构建失败
确保 flake.lock 文件已正确生成:
nix flake lock
nix flake check
密钥管理
生产环境中绝对不要将 API 密钥硬编码在 Nix 配置中,推荐使用 sops-nix 或 agenix 进行加密管理:
# 使用 sops 加密密钥文件
sops secrets/openclaw.yaml
服务状态检查
# 查看服务状态
systemctl status openclaw
# 查看实时日志
journalctl -u openclaw -f
通过 Nix 的声明式配置,你可以将整个 OpenClaw 部署方案纳入版本控制,实现真正的基础设施即代码(Infrastructure as Code)。