首页 资讯 下载 教程 Skills 社群

使用 Nix 声明式部署 OpenClaw

为什么选择 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-nixagenix 进行加密管理:

# 使用 sops 加密密钥文件
sops secrets/openclaw.yaml

服务状态检查

# 查看服务状态
systemctl status openclaw

# 查看实时日志
journalctl -u openclaw -f

通过 Nix 的声明式配置,你可以将整个 OpenClaw 部署方案纳入版本控制,实现真正的基础设施即代码(Infrastructure as Code)。