导语:
本文是一份专为技术爱好者准备的保姆级实操手册。记录了在已有宝塔面板(Baota)和甲骨文云(Oracle Cloud)服务器的环境下,如何通过 Docker 部署开源 AI 智能体 Hermes Agent,并亲手解决端口绑定、防火墙放行以及多账号 Gemini API 轮换的完整全过程。

—

一、 服务器“大扫除”与容器健康检查

在部署和维护云服务器时,第一步要学会用命令检查底层的数字房间是否干净、安全。

1. 检查当前运行中的集装箱(容器)
在宝塔终端或 SSH 中运行:

docker ps

* 核心看点:观察 PORTS(端口映射)那一列。
* 如果显示 0.0.0.0:端口->容器端口/tcp,说明大门开向全世界,外部可以访问。
* 如果显示 127.0.0.1:端口->容器端口/tcp,说明大门被锁死在本地,外部打不开。

2. 清理不明容器(防范木马)
如果发现来历不明的挂机流量软件(如 tm / TraffMonetizer 等),立刻三步清理:

docker stop 容器名
docker rm 容器名

—

二、 容器网络排错:“进得来、出不去”与端口放行

在部署网页、导航页或 AI 网关时,经常会遇到网页打不开(ERR_EMPTY_RESPONSE)的情况,排查需要走“三板斧”:

1. 检查系统内部防火墙 (UFW)

sudo ufw status

* 如果是 active(启用状态),通过以下命令放行指定端口(例如 8080):

  sudo ufw allow 8080
  

2. 云厂商后台防火墙(以甲骨文云为例)
仅在系统里开端口还不够,必须去云端开门:
* 登录甲骨文云后台 $\rightarrow$ 点击您的实例 $\rightarrow$ 找到 子网 (Subnet) $\rightarrow$ 点击 安全列表 (Security Lists) $\rightarrow$ 添加入站规则 (Add Ingress Rules):
* Source CIDR:0.0.0.0/0
* IP Protocol:TCP
* Destination Port Range: 填入您需要的端口(如 8080)

3. 彻底推倒重来的标准重建命令(以导航页 Heimdall 为例)
如果端口绑定错误或配置卡死,直接“三步重开”:

# 1. 停止旧容器
docker stop heimdall
# 2. 删除旧容器
docker rm heimdall
# 3. 重新带正确参数启动(确保绑定到 0.0.0.0)
docker run -d --name=heimdall -e PUID=1000 -e PGID=1000 -e TZ=Asia/Shanghai -p 8080:80 --restart unless-stopped lscr.io/linuxserver/heimdall:latest

—

三、 核心秘籍:构建多账号 Gemini API 轮换舰队

为了彻底解决晚上高峰期单个 Gemini 免费额度耗尽、速度变慢的痛点,我们可以为 Hermes 注入多枚 API 密钥,实现后台自动轮换。

1. 写入多枚 Key 到容器内部的 .env 配置文件
通过安全且不出错的嵌入式文档(Here-Doc)方式,直接向容器内部追加多账号密钥:

docker exec -it hermes-agent sh -c 'cat << "EOF" >> /opt/data/.env
GOOGLE_API_KEY_1=***
GOOGLE_API_KEY_2=***
GOOGLE_API_KEY_3=***
GOOGLE_API_KEY_4=***
EOF'

2. 使用 Python 脚本清洗与体检 .env 配置文件
复制粘贴以下 Python 脚本在终端运行,它会自动清理粘贴带来的控制字符(如 [2001~),并打印出所有 Key 的体检报告:

docker exec hermes-agent python3 -c "
from pathlib import Path
import re

p = Path('/opt/data/.env')
text = p.read_text() if p.exists() else ''

# 清理转义控制字符和多余空格
clean_text = re.sub(r'\[?20[01]~', '', text)
p.write_text(clean_text)

print('===== 容器内 API Key 体检报告 =====')
for line in clean_text.splitlines():
    if 'API_KEY' in line:
        parts = line.split('=', 1)
        if len(parts) == 2:
            k = parts[1].strip().strip('\"').strip(\"'\")
            print('变量名:', parts[0], '| 长度:', len(k), '| 前缀:', k[:6], '| 后缀:', k[-4:])
"

3. 重启容器让新配置生效
配置修改完成后,必须重启容器使环境变量彻底加载:

docker restart hermes-agent

—

四、 结语

通过这套标准化的操作流程,我们不仅理顺了宝塔面板与底层 Docker 的网络关系,还成功打造了一支全天候、多 Key 自动轮换的高可用 AI 智能体舰队。将这些命令整理在案,下次排错与部署便能得心应手、稳操胜券!


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注