摘要: 基于真实踩坑案例,实现 1Panle 平台 + Gitea 私有仓库快速部署。
前情提要
前面文章中提到了 MCP server 快速部署案例。
其中有一种场景:用户自己开发了一个 mcp server 代码,希望运行在 1Panel 的MCP 组件中,而不是只能够在本地运行。
并且文章中提到,1Panel 中新增的 mcp server配置如下——
|
|
上面用到代码仓库 http://lab.nxlan.cn:3008/pdream/jobsearch-mcp-server.git 就是本文主角——gitea 个人仓库。
一、Gitea 基础配置
延续1Panel 中特色功能:图形化部署+应用内部关联。
可以 2分钟快速实现 gitea 应用的部署,5分钟完成初始化,10分钟完成反向代理配置。
之后,就可以同步自己的代码到gitea 仓库中了。
感兴趣的话,不妨参考本文一步一步操作完成。
1.1 Gitea 应用创建
首先在 “应用商店” -> “全部” -> “搜索” 栏中输入 gitea 关键字,找到可以安装的应用。
注意点击 第一个 Gitea “安装”。

如果 1Panel 中没有安装过数据库服务,会有需要安装数据库的提醒(如下图)——
如果是这种情况,就需要先安装数据库。
点击"去安装"后,直接跳转到数据库安装界面——
点击**“确认”** 按键,等待数据库安装完成。

如果点击"安装" 后,提示:“未开启外部映射,将无法从外外网访问数据库服务”。
可以根据自己需求,再勾选 “高级设置"中的 “端口外部访问"选项。
一般不建议 直接开放数据库服务到外部,所以我这里默认不启用此功能。
再次回到Gitea 安装界面,数据库服务可以选择刚创建好的postgres 了。
因为,稍后使用 ssh 协议同步代码,需要访问 gitea 的ssh 服务,这里需要勾选 “端口外部访问” 的选项。
点击"确认"后,就开始自动安装 gitea 应用了。
安装成功后,可以在应用商店中看到刚新增的两个应用——

1.2 追加反代配置
默认安装完成时,gitea 应用的web 服务绑定在宿主机的 3000端口。对应我的主机就是 http://lab.nxlan.cn:3000。
如果1Panel 在你的内部局域网,就可以直接访问上述页面,进行后续初始化工作。(可以跳过本段)
但是,如果gitea 宿主机在云上,又怎么能直接访问这个管理页面呢?
一种方式就是:追加反向代理配置,通过已经上线的https 服务,代理/gitea 流量到 http://127.0.0.1:3000 的真实服务。
还有一种方法是:登录到云主机 管理页面,在安全策略下,追加一条——放行公网访问主机 3000 端口的策略。
考虑到:这样临时放行后,还是要取消并开通反代,我就没有这么操作。
操作步骤上,还是先进入**“网站” -> “反向代理” -> “创建”**, 创建一条新代理规则,请求路径假设就是 /gitea。

并在原始代理配置文件内容基础上追加——
|
|
保存反代配置后,进入gitea 配置文件目录——/opt/1panel/apps/gitea/gitea/data/gitea/conf
修改配置文件app.ini中的一条配置:
|
|
修改好后,重启gitea 应用新配置。再次访问反代地址—— https://lab.nxlan.cn/gitea,就可以看到初始化配置页面了。

1.3 完成应用初始化
在上述初始化页面中,1Panel 已经帮我们补充好了数据库地址、名称、用户、密码等信息。
这里保持默认,点击 “立即安装” 完成最后的初始化工作。
最后,完成管理员账户的设置——
管理账户创建后,重新登录。

1.4 同步代码至仓库
同步本地写好的代码前,需要先在 Gitea 上创建仓库。
我们的第一个代码仓库,名字就叫 “jobsearch-mcp-server”。
为了方便mcp server 拉取项目代码,项目可见性不勾选 “将仓库设为私有”——也就是公开的意思。
其他保持默认,这样我们第一个代码仓库就创建完成了。
仓库创建完后,需要追加个人应用 访问令牌——方便开发主机同步代码。
在 “个人信息” -> “应用” -> “生成新的令牌” 中 输入令牌名称,并追加repository 等读写的权限。

添加成功后,会出现一行令牌字符串,类似于——a385cac305f80ff43dfe202d727b5a33176d18b3

在开发主机上,按照以下命令顺序执行,同步代码到gitea 仓库:
|
|
提示同步成功。此时访问仓库页面,就可以看到刚上传的代码了。

二、1Panel MCP Server 部署(从 Gitea 拉取)
2.1 场景
在 1Panel 上通过 MCP 管理界面部署 MCP Server时,因为源代码在个人 Gitea上,所以在MCP server 启动要指定git项目地址。
2.2 正确启动命令
经过反代服务器(推荐):
|
|
直连 Gitea(不经反代,数据未加密):
|
|
参数说明:
--transport stdio— 1Panel MCP 托管必须使用 stdio 传输模式(解决 SSE 嵌套冲突)
2.3 注意事项
-
路径格式:
git+https://而非本地路径,容器内无法访问宿主机文件系统 -
传输模式:必须加
--transport stdio,否则与 1Panel MCP 托管机制冲突 -
反代 vs 直连:经反代走 443 端口(SSL 由反代终止),直连走 3000 数据不经加密传输(服务直接暴露在公网)。
-
环境变量:在jobserch 这个 MCP Server 项目中需要声明环境变量 “DEEPSEEK_API_KEY”,否则提示
OPENAI_API_KEY未配置。
三、补充 :使用ssh方式同步代码
前提:
Gitea 应用创建时,勾选了 “端口外部访问” 的选项。
3.1 SSH Key 生成
开发主机密钥生成:
|
|
添加主机的ssh key到 Gitea:
|
|
仓库 ssh 密钥截图:

3.2 修改git remote 配置
|
|
3.3 HTTP 与 SSH 的分工
| 通道 | 用途 | 使用场景 |
|---|---|---|
| HTTP(S) | 拉取源代码 | MCP Server 容器内 uvx --from git+https://... 从 Gitea 拉代码 |
| HTTP(S) | 上传源代码 | 本地编辑完成后 git push 将代码同步回 Gitea。此时origin为: https://pdream:[TOKEN]@lab.nxlan.cn/gitea/pdream/jobsearch-mcp-server.git |
| SSH | 上传源代码 | 本地编辑完成后 git push 将代码同步回 Gitea 。此时origin为: ssh://git@lab.nxlan.cn:222/pdream/jobsearch-mcp-server.git |
本例实战:
- MCP Server 部署:容器通过 HTTPS 拉取
jobsearch-mcp-server源码 - 代码编辑后推送:本地也通过 HTTPS 方式 (
https://pdream:[TOKEN]@lab.nxlan.cn/...) 提交到 Gitea
两者各司其职,不冲突。
四、mcp server 排错速查
| 症状 | 原因 | 解法 |
|---|---|---|
uvx --from /path/to/repo 报错 |
容器内无法访问宿主机路径 | 改用 git+https:// |
git clone 卡住/超时 |
容器网络不通或缺 git | apk add git,检查网络 |
SSL certificate problem |
自签证书 | git config --global http.sslVerify false |
| 容器启动后立刻退出 | 缺环境变量 | 检查 OPENAI_API_KEY 等必填变量 |
| SSH 克隆认证失败 | 端口非 22 | 确认 Gitea SSH 端口为 222 |
五、Principle(经验规则)
- supergateway 容器内操作默认缺 git,先用
apk add git兜底 - MCP server 启动命令只支持单字段,用
/bin/sh -c串联多条指令 - 使用 HTTPS 服务推送源代码时,注意令牌权限要给够,否则会报告 403 的错误
- Gitea SSH 端口映射为 222,配置 remote 时需注意指定端口