ModelScope 创空间部署(国内站 + 国际站统一)
支持三种工作模式:
- 国内站单独部署(modelscope.cn)
- 国际站单独部署(modelscope.ai)
- 国内站 → 国际站搬运(clone cn 代码 → 翻译 UI 为英文 → push 到 ai)
0. 站点差异速查
| 项目 | 国内站 (.cn) | 国际站 (.ai) |
|------|-------------|-------------|
| 域名 | modelscope.cn | modelscope.ai |
| Git remote | https://oauth2:{token}@www.modelscope.cn/studios/{owner}/{repo}.git | https://oauth2:{token}@www.modelscope.ai/studios/{owner}/{repo}.git |
| API base | https://modelscope.cn/openapi/v1 | https://modelscope.ai/openapi/v1 |
| Token 获取 | https://modelscope.cn/my/myaccesstoken | 个人页 → Access Control(/my/myaccesstoken 可能重定向到首页,需从页面提取) |
| MCP 服务端点 | /mcp/servers/modelscope/modelscope-mcp-server | 同左(域名替换) |
| 认证独立 | ✅ .cn token 不能用于 .ai | ✅ .ai token 不能用于 .cn |
关键提醒:两站 token 完全独立,不可互通。操作哪个站就用哪个站的 token。
1. 前置条件
1.1 确认 Token
根据目标站点确认对应 token:
# 国内站
echo $MODELSCOPE_CN_TOKEN
# 或从 git remote 提取
git remote -v 2>/dev/null | grep modelscope.cn
# 国际站
echo $MODELSCOPE_AI_TOKEN
# 或从 git remote 提取
git remote -v 2>/dev/null | grep modelscope.ai
无 token 时引导用户:
- 国内站:访问 https://modelscope.cn/my/myaccesstoken
- 国际站:访问个人页 Access Control 面板获取(URL
/my/myaccesstoken可能重定向,需在 profile 页找 Access Control 入口)
后文用
${TOKEN}统一指代当前操作站点的 token,${DOMAIN}指modelscope.cn或modelscope.ai。
1.2 MCP 服务(可选,优先用 HTTP API)
MCP 配置流程两站相同,仅域名不同:
# 查询已有部署链接
curl -s -X GET \
"https://${DOMAIN}/openapi/v1/mcp/servers/modelscope/modelscope-mcp-server?get_operational_url=true" \
-H "Authorization: Bearer ${TOKEN}"
# 无可用链接时部署
curl -s -X POST \
"https://${DOMAIN}/openapi/v1/mcp/servers/modelscope/modelscope-mcp-server/deploy" \
-H "Authorization: Bearer ${TOKEN}" \
-d '{"transport_type": "sse"}'
如果 MCP 不可用或配置困难,全程用 HTTP API 即可完成所有操作。
1.3 Git 环境
确保 Git 已安装、用户信息已配置、git-lfs 可用。
2. 模式 A:单站部署(国内站或国际站)
流程完全相同,仅域名和 token 不同。
Step 1: 检查本地 Git 仓库
[ -d .git ] && git remote -v 2>/dev/null | grep ${DOMAIN}/studios
有远程 → 提取 owner/repo_name,跳到 Step 3。
Step 2: 分析项目
SDK 类型判断
| 类型 | 检测条件 | 入口文件 |
|-----|---------|---------|
| gradio | app.py 导入 gradio | app.py |
| streamlit | app.py 使用 streamlit | app.py |
| docker | 存在 Dockerfile | Dockerfile |
| static | 存在 index.html(已构建) | index.html |
Docker 类型需先完成阿里云账号绑定+实名认证。
获取用户信息
curl -s "https://${DOMAIN}/openapi/v1/users/me" \
-H "Authorization: Bearer ${TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['username'])"
Step 3: 创建或更新创空间
# 检查是否存在
curl -s "https://${DOMAIN}/openapi/v1/studios/${owner}/${repo_name}" \
-H "Authorization: Bearer ${TOKEN}"
不存在 → 创建(默认 private: true,问用户):
curl -s -X POST "https://${DOMAIN}/openapi/v1/studios" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"owner":"...","repo_name":"...","sdk_type":"gradio","display_name":"...","private":true}'
Step 4: 处理敏感信息
扫描硬编码 secret → 改为 os.environ.get("KEY") → 记录环境变量清单。
Step 5: 同步代码
# 配置远程
git remote remove modelscope 2>/dev/null || true
git remote add modelscope https://oauth2:${TOKEN}@www.${DOMAIN}/studios/${owner}/${repo_name}.git
# 大文件处理
git lfs install
# 拉取(必须先拉后推,禁止 force push)
git fetch modelscope master
git merge modelscope/master --allow-unrelated-histories -m "Merge remote"
# 冲突时保留本地
git checkout --ours . && git add . && git commit -m "Resolve conflicts, keep local"
# 推送
git add . && git commit -m "Deploy to ModelScope Studio" && git push -u modelscope master
Step 6: 配置环境变量
# 查看已有
curl -s "https://${DOMAIN}/openapi/v1/studios/${owner}/${repo_name}/secrets" \
-H "Authorization: Bearer ${TOKEN}"
# 添加缺失的
curl -s -X POST "https://${DOMAIN}/openapi/v1/studios/${owner}/${repo_name}/secrets" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"key":"API_KEY","value":"..."}'
Step 7: 触发部署
curl -s -X POST "https://${DOMAIN}/openapi/v1/studios/${owner}/${repo_name}/deploy" \
-H "Authorization: Bearer ${TOKEN}"
Step 8: 监控状态
# 轮询状态直到 Running 或 Failed
curl -s "https://${DOMAIN}/openapi/v1/studios/${owner}/${repo_name}" \
-H "Authorization: Bearer ${TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['status'])"
# 查看日志(docker 先查 build 再查 run)
curl -s "https://${DOMAIN}/openapi/v1/studios/${owner}/${repo_name}/logs/run" \
-H "Authorization: Bearer ${TOKEN}"
Step 9: 自动诊断
| 错误特征 | 修复 |
|---------|------|
| ModuleNotFoundError | 添加到 requirements.txt |
| SyntaxError | 修复代码 |
| 端口问题 | 监听 0.0.0.0:7860 |
| 环境变量为空 | 检查 Step 6 |
修复 → 推送 → 重新 deploy → 检查日志,循环直到 Running。
Step 10: 完成
URL: https://${DOMAIN}/studios/${owner}/${repo_name}
3. 模式 B:国内站 → 国际站搬运
将 .cn 创空间的代码搬运到 .ai 对应组织,并翻译 UI 为英文。
Step 1: Clone 国内站代码
WORKDIR=$(mktemp -d)
git clone https://oauth2:${CN_TOKEN}@www.modelscope.cn/studios/${owner}/${repo_name}.git ${WORKDIR}/${repo_name}
cd ${WORKDIR}/${repo_name}
Step 2: 翻译 UI 为英文
对所有面向用户的文本进行翻译:
必须翻译(用户可见):
- Gradio UI 组件的 label、placeholder、value、info、choices
- HTML 模板中的中文文案
- 状态提示、错误信息、按钮文字
- 页面标题、描述文本
保持中文(开发者侧):
- 代码注释
- logger 日志消息
- 变量名/函数名(除非原本就是拼音需改英文)
翻译原则:
- 技术术语保持标准英文(如"推理步数"→"Inference Steps")
- 按钮简洁("开始生成"→"Generate"、"取消"→"Cancel")
- 错误提示保持信息完整
Step 3: 确保国际站创空间存在
# 检查是否存在
curl -s "https://modelscope.ai/openapi/v1/studios/${owner}/${repo_name}" \
-H "Authorization: Bearer ${AI_TOKEN}"
不存在则创建(参数从 .cn 侧复制,display_name/description 翻译为英文)。
Step 4: 推送到国际站
cd ${WORKDIR}/${repo_name}
# 切换远程到国际站
git remote remove origin 2>/dev/null || true
git remote add modelscope https://oauth2:${AI_TOKEN}@www.modelscope.ai/studios/${owner}/${repo_name}.git
# 拉取合并
git fetch modelscope master 2>/dev/null || true
git merge modelscope/master --allow-unrelated-histories -m "Merge remote" 2>/dev/null || true
# 提交翻译后的代码
git add .
git commit -m "Sync from cn site with English UI translation"
git push -u modelscope master
Step 5: 同步环境变量
从 .cn 侧获取环境变量列表,在 .ai 侧逐一配置(值需向用户确认,不同站可能用不同的 key)。
Step 6: 部署并监控
curl -s -X POST "https://modelscope.ai/openapi/v1/studios/${owner}/${repo_name}/deploy" \
-H "Authorization: Bearer ${AI_TOKEN}"
轮询状态直到 Running。
Step 7: 完成
两站 URL:
- 国内站:
https://modelscope.cn/studios/${owner}/${repo_name} - 国际站:
https://modelscope.ai/studios/${owner}/${repo_name}
4. Docker 创空间参考
适用于 FastAPI、Golang、Node.js 等非 Gradio/Streamlit 应用。
前置:阿里云账号绑定+实名认证。
# Python 模板
FROM python:3.10
WORKDIR /home/user/app
COPY ./ /home/user/app
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "-u", "app.py"]
端口:必须 0.0.0.0:7860,禁用 8080。
Header 限制:禁止 Authorization、X-modelscope-*、X-studio-*。
5. 数据持久化
- 默认重启丢失,持久化用
/mnt/workspace - 转移/重命名仍会丢失
- 高可靠性需外部存储
6. 注意事项
- 默认分支
master,禁止 force push - 超 100MB 必须 Git LFS
- Docker 首次构建 3-5 分钟
- 免费配额有时长限制
- 禁止硬编码敏感信息
- 两站 token 独立不互通,操作前先确认对应站的 token
- 搬运模式下 UI 文本必须翻译为英文,注释/日志可保留中文
7. HTTP API 速查
基础地址:https://${DOMAIN}/openapi/v1,Header: Authorization: Bearer ${TOKEN}
| 操作 | 方法 | 端点 |
|-----|------|------|
| 获取当前用户 | GET | /users/me |
| 创建创空间 | POST | /studios |
| 获取创空间详情 | GET | /studios/{owner}/{repo_name} |
| 更新设置 | PATCH | /studios/{owner}/{repo_name}/settings |
| 部署 | POST | /studios/{owner}/{repo_name}/deploy |
| 停止 | POST | /studios/{owner}/{repo_name}/stop |
| 获取日志 | GET | /studios/{owner}/{repo_name}/logs/{log_type} |
| 环境变量列表 | GET | /studios/{owner}/{repo_name}/secrets |
| 添加环境变量 | POST | /studios/{owner}/{repo_name}/secrets |
| 更新环境变量 | PUT | /studios/{owner}/{repo_name}/secrets |
| 删除环境变量 | DELETE | /studios/{owner}/{repo_name}/secrets |
完整文档:
- 国内站:https://modelscope.cn/.well-known/openapi.json
- 国际站:https://modelscope.ai/.well-known/openapi.json
微信扫一扫