File size: 6,189 Bytes
8ede856
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# 使用 Kubernetes 部署 AstrBot

> [!WARNING]
> 通过 Kubernetes (K8s) 可以将 AstrBot 以高可用的方式部署在集群环境中,当出现故障时可以自动拉起恢复。
>
> 由于 AstrBot 当前使用 SQLite 数据库,此部署方案不支持多副本水平扩展。同时,若采用 Sidecar 模式,NapCat 的登录状态持久化需要您特别关注。
>
> 以下教程默认您的环境已安装并配置好 `kubectl`,且能够连接到您的 K8s 集群。

## 准备工作

在开始之前,请确保您的 Kubernetes 集群满足以下条件:

1.  **拥有默认的 StorageClass**:用于动态创建 `PersistentVolumeClaim` (PVC)。您可以通过 `kubectl get sc` 查看。如果没有,您需要手动创建 `PersistentVolume` (PV) 或安装相应的存储插件 (如 `nfs-client-provisioner`)。
2.  **网络访问**:确保您的集群节点可以从 `docker.io` 或您指定的镜像仓库拉取镜像。

## 部署方式

我们提供两种部署方案:

*   **集成部署 (Sidecar 模式)**:将 AstrBot 和 NapCat 部署在同一个 Pod 中,推荐用于 QQ 个人号。
*   **独立部署**:只部署 AstrBot,适用于其他平台或您希望独立管理 NapCat 的场景。

---

### 方式一:和 NapCatQQ 一起部署 (Sidecar)

此方式位于 `k8s/astrbot_with_napcat` 目录。

#### 1. 部署

```bash
# 1. 创建命名空间
kubectl apply -f k8s/astrbot_with_napcat/00-namespace.yaml

# 2. 创建持久化存储卷
# 注意:astrbot-data-shared-pvc 需要 ReadWriteMany (RWX) 访问模式。
# 如果您的集群不支持 RWX,您需要配置 NFS 等共享存储,并修改 01-pvc.yaml 中的 storageClassName。
kubectl apply -f k8s/astrbot_with_napcat/01-pvc.yaml

# 3. 部署应用
kubectl apply -f k8s/astrbot_with_napcat/02-deployment.yaml
```

#### 2. 暴露服务 (二选一)

*   **方式 A: NodePort**

    ```bash
    kubectl apply -f k8s/astrbot_with_napcat/03-service-nodeport.yaml
    ```

    服务将通过节点 IP 和一个由 Kubernetes 自动分配的端口暴露。您可以通过以下命令查看端口:

    ```bash
    kubectl get svc -n astrbot-ns
    ```

    在输出中找到 `astrbot-webui-svc` 和 `napcat-web-svc` 的 `PORT(S)` 列,格式为 `<内部端口>:<NodePort端口>/TCP`。例如 `8080:30185/TCP`,则访问地址为 `http://<NodeIP>:30185`。

*   **方式 B: LoadBalancer**

    如果您的集群支持 `LoadBalancer` 类型的服务 (通常在云厂商的 K8s 服务中提供),可以使用此方式。

    ```bash
    kubectl apply -f k8s/astrbot_with_napcat/04-service-loadbalancer.yaml
    ```

    执行后,通过 `kubectl get svc -n astrbot-ns` 查看分配到的外部 IP (EXTERNAL-IP)。

#### 3. 配置连接

由于 AstrBot 和 NapCat 在同一个 Pod 中,它们可以通过 `localhost` 直接通信。

1.  **在 AstrBot 中添加消息平台:**
    *   进入 AstrBot WebUI,选择 `设置` -> `消息平台` -> `添加`    *   **选择消息平台类别**: `aiocqhttp`
    *   **机器人名称**: `napcat` (或自定义)
    *   **反向 Websocket 主机**: `0.0.0.0`
    *   **反向 Websocket 端口**: `6199`
    *   保存配置。


2.  **在 NapCat 中配置 Websocket Client:**
    *   进入 NapCat WebUI,选择 `设置` -> `反向WS` -> `添加`    *   **启用**: 开启
    *   **URL**: `ws://localhost:6199/ws`
    *   **消息格式**: `Array`
    *   保存配置。


---

### 方式二:只部署 AstrBot (通用方式)

此方式位于 `k8s/astrbot` 目录。

#### 1. 部署

```bash
# 1. 创建命名空间
kubectl apply -f k8s/astrbot/00-namespace.yaml

# 2. 创建持久化存储卷
kubectl apply -f k8s/astrbot/01-pvc.yaml

# 3. 部署应用
kubectl apply -f k8s/astrbot/02-deployment.yaml
```

#### 2. 暴露服务 (二选一)

*   **方式 A: NodePort**

    ```bash
    kubectl apply -f k8s/astrbot/03-service-nodeport.yaml
    ```

    服务将通过节点 IP 和一个由 Kubernetes 自动分配的端口暴露。您可以通过以下命令查看端口:

    ```bash
    kubectl get svc -n astrbot-standalone-ns
    ```

    在输出中找到 `astrbot-webui-svc` 的 `PORT(S)` 列,格式为 `<内部端口>:<NodePort端口>/TCP`。例如 `8080:30185/TCP`,则访问地址为 `http://<NodeIP>:30185`。

*   **方式 B: LoadBalancer**

    ```bash
    kubectl apply -f k8s/astrbot/04-service-loadbalancer.yaml
    ```

    执行后,通过 `kubectl get svc -n astrbot-standalone-ns` 查看分配到的外部 IP (EXTERNAL-IP)。

---

## 高级配置

### 镜像加速 (中国大陆用户)

如果拉取 `soulter/astrbot:latest``mlikiowa/napcat-docker:latest` 镜像困难,可以手动修改对应的 `02-deployment.yaml` 文件,将 `image` 字段替换为国内的镜像加速地址,例如:

```yaml
# 示例:
# image: soulter/astrbot:latest
# 替换为
image: m.daocloud.io/docker.io/soulter/astrbot:latest
```

### 启用 Docker 沙箱代码执行器

如果您需要使用沙箱代码执行器,需要将 Docker 的 socket 文件挂载到 Pod 中。

编辑 `02-deployment.yaml` 文件,在 `spec.template.spec` 下添加 `volumes``volumeMounts`1.  **在 `astrbot` 容器的 `volumeMounts` 列表下添加以下内容:**

    ```yaml
    - name: docker-sock
      mountPath: /var/run/docker.sock
    ```

2.  **在 `spec.template.spec.volumes` 列表下添加以下内容:**

    ```yaml
    - name: docker-sock
      hostPath:
        path: /var/run/docker.sock
        type: Socket
    ```

> [!WARNING]
> 将 Docker socket 挂载到 Pod 中存在安全风险,请确保您了解其影响。

## 查看日志

*   **Sidecar 部署模式:**

    ```bash
    # 查看 AstrBot 日志
    kubectl logs -f -n astrbot-ns deployment/astrbot-stack -c astrbot

    # 查看 NapCat 日志
    kubectl logs -f -n astrbot-ns deployment/astrbot-stack -c napcat
    ```

*   **独立部署模式:**

    ```bash
    kubectl logs -f -n astrbot-standalone-ns deployment/astrbot-standalone
    ```

## 🎉 大功告成

部署并暴露服务后,您就可以通过相应的 IP 和端口访问 AstrBot 管理面板了。

> 默认用户名和密码是 `astrbot` 和 `astrbot`。