Sign inSign up

lukbinx/m365-copilot2api

By lukbinx

•Updated about 2 months ago

build from https://github.com/HEXUXIU/M365-Copilot2API

Image
API management
0

191

lukbinx/m365-copilot2api repository overview

⁠Docker 部署指南

本文档描述如何拉取并运行本项目的 Docker 镜像。完整的环境变量与功能说明见 README.md⁠。

⁠镜像信息

项目说明
仓库docker.io/lukbinx/m365-copilot2api
Tagv0.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
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

仓库自带 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 必须对该用户可写,否则保存账号/密钥/密码会失败。处理方式见下文「数据目录与属主」。

⁠首次配置

  1. 设置管理员密码(按优先级从高到低,命中即停):

    1. /data/admin-password 持久化文件 —— 一旦生成,后续只认这个文件,bootstrap 与环境变量不再生效;

    2. M365_ADMIN_PASSWORD_BOOTSTRAP_FILE 指向的文件(镜像默认 /run/secrets/m365_admin_password,compose 中把 ./secrets/m365_admin_password 只读挂载进去);

    3. M365_ADMIN_PASSWORD 环境变量;

    4. 以上都没有 → 全新部署使用默认密码 admin123 并强制首次登录修改(管理界面除改密码外全部锁定,直到改完)。设 M365_REQUIRE_STRONG_ADMIN_PASSWORD=1 可拒绝该回退、强制显式配置。

    • 默认密码 admin123 在前三条路径中一律被拒绝,必须使用强密码。
  2. 打开控制台 http://<主机IP>:4141/ 登录(若命中第 4 条,先改密码)。

  3. 在「账号」页点击开始授权,完成 M365 OAuth 流程:授权完成后从弹出窗口的地址栏复制完整 URL(含 code=...&state=...),粘贴回控制台的 Callback URL 输入框确认。

  4. 在「API Key」页创建第一个 Key。

  5. 验证调用:

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)。两种处理方式:

  1. 宿主目录属主改为容器用户:sudo chown 100:101 ./data;
  2. 让容器以宿主用户运行(无需 root,仓库 compose 即采用此方式):
    # 宿主机用户 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 直接暴露公网。
  • 登录有防暴力破解:同一来源 15 分钟内失败 5 次锁定 15 分钟(内存计数,重启容器即清除)。
  • /data 内含 M365 账号 token、API Key 与管理员密码,按敏感数据保护:限制目录权限、定期备份、不要提交进代码仓库。
  • 镜像内无 shell 依赖、无额外特权(non-root),攻击面仅为网关进程本身。

⁠自行构建镜像(可选)

仓库自带 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 合并推送。

Tag summary

Content type

Image

Digest

sha256:e5b8c171a…

Size

15.7 MB

Last updated

about 2 months ago

docker pull lukbinx/m365-copilot2api:v0.7.0