build from https://github.com/HEXUXIU/M365-Copilot2API
191
本文档描述如何拉取并运行本项目的 Docker 镜像。完整的环境变量与功能说明见 README.md。
| 项目 | 说明 |
|---|---|
| 仓库 | docker.io/lukbinx/m365-copilot2api |
| Tag | v0.7.0(多架构清单)、v0.7.0-amd64、v0.7.0-armv7 |
| 架构 | linux/amd64、linux/arm/v7(树莓派 3/4 等 ARM 单板,无需 QEMU) |
| 基础镜像 | alpine:3.20 |
| 运行时依赖 | 无(静态编译 Go 二进制,CGO 关闭) |
| 运行用户 | m365(uid 100,非 root) |
| 端口 | 4141(控制台 + API) |
多架构 tag 会按拉取端架构自动选择;指定架构可用 docker pull --platform linux/arm/v7 lukbinx/m365-copilot2api:v0.7.0。
docker run -d --name m365-copilot2api \
-p 127.0.0.1:4141:4141 \
-v m365-data:/data \
-e M365_ADMIN_PASSWORD='换成你的强密码' \
lukbinx/m365-copilot2api:v0.7.0
M365_LISTEN=0.0.0.0:4141,容器内始终监听所有接口;能否被外部访问取决于 -p 的宿主绑定(127.0.0.1:4141:4141 仅本机,4141:4141 局域网可达)。-v m365-data:/data 用命名卷持久化账号、密钥、用量等数据;也可换成绑定目录 -v ./data:/data(注意属主问题,见下文)。仓库自带 docker-compose.yml,克隆仓库后直接 docker compose up -d 即可。独立部署时的最小示例:
services:
m365-copilot2api:
image: lukbinx/m365-copilot2api:v0.7.0
container_name: m365-copilot2api
restart: unless-stopped
ports:
- "127.0.0.1:4141:4141" # 需要局域网访问时改为 "4141:4141"
environment:
M365_ADMIN_PASSWORD: '换成你的强密码'
M365_CHAT_TIMEOUT_SECONDS: "120"
M365_IMAGE_TIMEOUT_SECONDS: "150"
volumes:
- ./data:/data
绑定目录方式注意:容器内用户是
m365(uid 100),./data必须对该用户可写,否则保存账号/密钥/密码会失败。处理方式见下文「数据目录与属主」。
设置管理员密码(按优先级从高到低,命中即停):
/data/admin-password 持久化文件 —— 一旦生成,后续只认这个文件,bootstrap 与环境变量不再生效;
M365_ADMIN_PASSWORD_BOOTSTRAP_FILE 指向的文件(镜像默认 /run/secrets/m365_admin_password,compose 中把 ./secrets/m365_admin_password 只读挂载进去);
M365_ADMIN_PASSWORD 环境变量;
以上都没有 → 全新部署使用默认密码 admin123 并强制首次登录修改(管理界面除改密码外全部锁定,直到改完)。设 M365_REQUIRE_STRONG_ADMIN_PASSWORD=1 可拒绝该回退、强制显式配置。
admin123 在前三条路径中一律被拒绝,必须使用强密码。打开控制台 http://<主机IP>:4141/ 登录(若命中第 4 条,先改密码)。
在「账号」页点击开始授权,完成 M365 OAuth 流程:授权完成后从弹出窗口的地址栏复制完整 URL(含 code=...&state=...),粘贴回控制台的 Callback URL 输入框确认。
在「API Key」页创建第一个 Key。
验证调用:
curl http://127.0.0.1:4141/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"你好"}]}'
/data 卷内保存全部持久化状态:账号配置(accounts.json)、token 缓存、会话(sessions.json)、API Key(api-keys.json)、用量(usage.jsonl)、管理员密码及历史(admin-password)。
容器以 m365(uid 100 / gid 101)运行。使用绑定目录时,宿主目录属主与 uid 100 不一致会导致写入失败(典型报错:administrator password could not be saved; check the persistent data directory permissions)。两种处理方式:
sudo chown 100:101 ./data; # 宿主机用户 uid:gid,需与 ./data 属主一致
user: "1001:1001"
备份:docker stop m365-copilot2api && cp -r ./data data-backup-$(date +%F)。
| 操作 | 命令 |
|---|---|
| 查看日志 | docker logs -f m365-copilot2api |
| 健康检查 | curl -I http://127.0.0.1:4141/(HTTP 200 即服务在运行) |
| 停止 | docker stop m365-copilot2api(或 docker compose down,不删数据) |
| 升级镜像 | docker compose pull && docker compose up -d(数据卷保留,重启后密码从 /data/admin-password 恢复) |
| 删除重来 | docker compose down -v(会删除数据,谨慎) |
127.0.0.1;需要局域网/公网访问时,优先用反向代理(nginx/caddy)加 TLS 与认证,不要把 4141 直接暴露公网。/data 内含 M365 账号 token、API Key 与管理员密码,按敏感数据保护:限制目录权限、定期备份、不要提交进代码仓库。仓库自带 Dockerfile(多阶段:golang 构建 + alpine 运行):
# 国内网络可指定基础镜像镜像源
docker build --build-arg REGISTRY=docker.m.daocloud.io -t lukbinx/m365-copilot2api:local .
多架构构建(amd64 + arm/v7)可参照发布流程:amd64 原生构建,arm/v7 交叉编译静态二进制后打包,docker manifest 合并推送。
Content type
Image
Digest
sha256:e5b8c171a…
Size
15.7 MB
Last updated
about 2 months ago
docker pull lukbinx/m365-copilot2api:v0.7.0