openclaw系列(五)docker部署及配置向量模型

本次按openclaw 2026.9.1为例子

https://github.com/openclaw/openclaw

一、docker部署

1.1 拉取项目源码

1.2 docker 镜像拉取

因为国内拉镜像可能会封,所以可以用docker pull + docker tag的方式绕开

1.3 修改配置文件.env

OPENCLAW_GATEWAY_TOKEN=****配置token****
# 自定义挂载路径
OPENCLAW_CONFIG_DIR=/opt/app/openclaw8_2/state
OPENCLAW_WORKSPACE_DIR=/opt/app/openclaw8_2/workspace
OPENCLAW_AUTH_PROFILE_SECRET_DIR=/opt/app/openclaw8_2/auth-secrets
## 设置时区
OPENCLAW_TIMEZONE=Asia/Shanghai
###开启沙箱用
DOCKER_GID=20

1.4 修改Dockerfile

openclaw系列(五)docker部署及配置向量模型插图

1.5 修改docker-compose.yml

openclaw系列(五)docker部署及配置向量模型插图1
openclaw系列(五)docker部署及配置向量模型插图2

执行命令

shell>>>docker compose up -d
编写openclaw.json

二、部署emb模型

2.1、下载模型(略)

2.2 运行模型

(bge-emb) admin-xy@xy-ai-server:/DATA/app/embedding$ cat emb_server_bge-m3.py 
from fastapi import FastAPI, HTTPException, Header
from pydantic import BaseModel
from FlagEmbedding import BGEM3FlagModel
import uvicorn


app = FastAPI()

AUTH_TOKEN = "sk-xxxxxxxxx"

# 纯 CPU 优化:关闭 FP16,开启内存高效模式
# 模型约 2.5GB,FP32 模式下 16G 内存可稳定运行
model = BGEM3FlagModel(
    '/DATA/app/Models/Embedding/bge-m3', 
    use_fp16=False, 
    device="cpu",
    use_memory_efficient=True
)

class EmbRequest(BaseModel):
    model: str
    input: str | list[str]

@app.post("/v1/embeddings")
async def emb(
    req: EmbRequest,
    authorization: str | None = Header(default=None)
):
    # Token校验逻辑
    if not authorization or not authorization.startswith("Bearer "):
        raise HTTPException(status_code=401, detail="Missing token")
    token = authorization.removeprefix("Bearer ")
    if token != AUTH_TOKEN:
        raise HTTPException(status_code=401, detail="Invalid token")

    try:
        texts = [req.input] if isinstance(req.input, str) else req.input
        res = model.encode(
            texts,
            return_sparse=True,
            return_dense=True,
            batch_size=8,
            max_length=4096
        )
        dense_vecs = res["dense_vecs"].tolist()

        return {
            "object": "list",
            "data": [
                {"object": "embedding", "embedding": v, "index": i}
                for i, v in enumerate(dense_vecs)
            ],
            "model": req.model,
            "usage": {
                "prompt_tokens": 0,
                "total_tokens": 0
            }
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Embedding failed: {str(e)}")



if __name__ == "__main__":
    uvicorn.run("emb_server_bge-m3:app", host="0.0.0.0", port=8110)

2.3 创建服务

创建服务文件

sudo nano /etc/systemd/system/emb-bge.service

内容如下:

[Unit]
Description=BGE-M3 Embedding Service (Conda env, CPU only, no multi-process)
After=network.target

[Service]
User=admin-xy
Environment="CUDA_VISIBLE_DEVICES="
WorkingDirectory=/DATA/app/embedding
ExecStart=/DATA/app/conda/envs/bge-emb/bin/python emb_server_bge-m3.py
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
# 让systemd识别新增的service文件
sudo systemctl daemon-reload

# 设置开机自启
sudo systemctl enable emb-bge

# 启动服务
sudo systemctl start emb-bge

测试:

shell>>curl http://127.0.0.1:8110/v1/embeddings  -H "Authorization: Bearer sk-1234567890xinyezjb2026"  -H "Content-Type: application/json" -d '{
"model": "BAAI/bge-m3",
"input": ["星伴同行-进行AI"]
}'