自托管部署(Self-hosted)
何时该走自托管
- 团队多人共用一份 Mira 后端 / 工作区。
- 需要从内网或外网稳定访问(不依赖某个人的笔电)。
- 想接入飞书/Slack/Telegram 等 channel,让 Agent 在群里直接响应。
- 需要 GPU 服务器跑本地 Ollama / vLLM。
推荐架构
用 docker-compose(最快)
仓库里 deploy/ 目录包含开箱即用的模板:
deploy/
├── docker-compose.yml
├── Dockerfile
├── entrypoint.sh
└── .env.example
1) 准备配置与版本
cd mira/deploy
cp .env.example .env
.env 模板控制 release profile 的标签、主机端口与 UI 地址:
MIRA_AGENT_TAG=<engine-image-tag>
MIRA_UI_TAG=<ui-image-tag>
MIRA_AGENT_PORT=18790
MIRA_UI_PORT=8080
MIRA_API_URL=http://server-ip:18790/api
MIRA_WS_URL=ws://server-ip:18790/ws
server-ip 应是浏览器可达的地址,不是浏览器所在电脑的 localhost。使用与 UI 匹配的引擎版本,镜像标签是否已发布需在部署时检查;源码 tag 不代表对应镜像一定存在。
UI 连接后,Provider 首选通过 模型供应商界面 设置,保存到服务器当前读取的配置;Channel 与高级部署字段仍在引擎实际读取的 config.json 中配置。环境变量只有被传入容器后才对引擎生效;不要假定 .env 中任意新增 MIRA_* 行都会自动进入容器。
2) 选择一种服务组合
源码本地构建路径:
docker compose up -d mira-gateway
# 可选 OpenAI 兼容 API
docker compose up -d mira-api
使用 release profile 时明确指定服务,避免同时启动默认 gateway 占用同一端口:
docker compose --profile self-hosted pull mira-engine mira-ui
docker compose --profile self-hosted up -d mira-engine mira-ui
当前模板的 mira-cli 在 cli profile 中;mira-api 默认只发布主机环回的 8900。UI release 服务默认主机端口 8080,容器内 80。
检查:
curl http://127.0.0.1:18790/health
curl http://127.0.0.1:18790/version
UI 是静态构建;能否通过运行时容器环境改变 VITE_* 取决于镜像入口实现。若地址未生效,在 UI 设置中填实际端点,或按目标地址重新构建,不能只改 .env 就假定生效。
3) 暴露给前端 / nginx 反代
最小 nginx 片段:
server {
listen 80;
server_name mira.example.com;
# 静态前端
root /var/www/mira-ui;
index index.html;
location / { try_files $uri /index.html; }
# REST
location /api/ {
proxy_pass http://127.0.0.1:18790;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
# WebSocket:此前缀同时覆盖 /ws 与 /ws/workflow/v1
location /ws {
proxy_pass http://127.0.0.1:18790;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 1h;
}
}
UI 侧通过 VITE_API_URL=https://mira.example.com/api + VITE_WS_URL=wss://mira.example.com/ws 接入。
4) 持久化与外部输入
当前源码 compose 挂载主机 ~/.mira 到 /home/mira/.mira;release profile 使用命名卷 mira_data 挂载 /root/.mira。按所选组合检查实际配置路径和 workspace,不要沿用旧文档假定的 /data/* 挂载。
备份配置、workspace,以及创建在 workspace 外的项目目录。配置包含凭据,备份时应保留访问控制。
若实验要读取额外数据,先以只读卷把数据挂进容器,再在启动窗口填写 容器内 绝对路径。仅填写宿主路径不会自动产生 Docker 挂载。
不用 Docker — 直接系统服务
适合小团队 / 单机:见 本地服务(mira-engine)。它会注册一个 launchd / systemd / Windows Service,开机自启 mira gateway。
安全 checklist
- 绝不把
mira gateway的0.0.0.0:18790直接对公网暴露;前面必须有 nginx + HTTPS + 鉴权。 -
~/.mira/config.json中的 API key 用文件权限 600 保护;或全部走环境变量。 - 按需要明确设置
tools.restrictToWorkspace = true;当前 schema 默认是 false,检查实际运行配置。 -
tools.exec.sandbox = "bwrap"(仅 Linux 容器内)可加一层进程隔离。 - 定期
mira-engine doctor --export留诊断 bundle。
验收检查
-
curl http://<host>:18790/api/health返回 200。 - 浏览器从外部访问 UI,能看到项目列表 + WebSocket 显示绿。
- 重启 docker / 重启服务器后,所有数据与项目状态保留。
- 任意用户的浏览器都看到一致的项目状态(说明真的在共享后端)。