我们团队在内网部署了 Gitea 作为私有 Git 托管服务,跑在一台 Ubuntu 服务器上。代码不出内网,安全边界清晰,日常开发也没问题。
但随着远程办公和跨地域协作增多,痛点逐渐暴露出来:
试过几种方案,最后落地的是 MCP Server + 内网穿透 的组合,用了一段时间挺稳,分享出来供大家参考。二、方案选型与思路
之前的思路是 "让人进内网",所以要装 VPN、开权限。
后来
换了个方向:
不让人进内网,只把查询结果递出来。
具体来说,就是在内网服务器上跑一个 MCP 服务,它通过 Gitea API 去查仓库信息。然后通过内网穿透,给这个 MCP 服务开一个公网 HTTPS 入口。
外面的人只能通过这个入口做 API 级别的查询操作,碰不到 Gitea 服务本身,也直接 clone 不了仓库。
MCP(Model Context Protocol)是最近比较火的一种协议,主要是让 AI 工具(Cursor、Claude Code 这些)能够连接外部数据源。
Gitea 官方提供了
gitea-mcp Server,它的特点是:
和直接暴露 Git 服务比,MCP 方案的暴露面小很多。毕竟你开放的是一个 "查询接口",而不是整个代码仓库服务。
外网开发机(Cursor) ↓ HTTPS / SSE ZeroNews公网端点(带安全策略) ↓ 加密隧道 内网MCP Server(127.0.0.1:8004) ↓ 本地回环调用 内网Gitea API(127.0.0.1:3000)
几个关键设计点:
在 Gitea 所在的服务器上,安装 ZeroNews Linux 客户端:
curl
-SLk https://download.zeronews.cc/linux/zeronews-install.sh
|
sudo
sh
-s
install
<
你的AuthToken
>
再以系统服务方式后台启动:
sudo zeronews service start
装完去控制台看一眼,客户端状态显示在线就 OK 了。
登录 Gitea,进 设置 → 应用 → 生成新令牌。
权限这块要注意,遵循最小原则:
repository 的读权限issue、
pull_request 的读权限生成后把 Token 复制下来,后面要用。
在 Ubuntu 上依次安装 Node.js(mcp-proxy)和 gitea-mcp 二进制:
sudo
apt-get
update
sudo
apt-get
install
-y ca-certificates
curl
tar
# 1. Node.js 20.x
curl
-fsSL https://deb.nodesource.com/setup_20.x
|
sudo
-E
bash
-
sudo
apt-get
install
-y nodejs
node -v
&&
npx -v
npx -y mcp-proxy --help
# 2. 官方 gitea-mcp
curl
-fsSL -o /tmp/gitea-mcp.tgz
\
"https://gitea.com/gitea/gitea-mcp/releases/download/v1.8.0/gitea-mcp_Linux_x86_64.tar.gz"
sudo
tar
-xzf /tmp/gitea-mcp.tgz -C /usr/local/bin gitea-mcp
sudo
chmod
+x /usr/local/bin/gitea-mcp
gitea-mcp --help
安装完成后, 通过系统变量配置 Gitea Token 。
export
GITEA_ACCESS_TOKEN
=
'你的只读Token'
利用 npx 启动 gitea-mcp , gitea-mcp 通过 Gitea REST API 查询仓库、提交、分支、PR、Issue 等; mcp-proxy 在前端监听 8004 。
# 在 8004 端口暴露 gitea-mcp
npx -y mcp-proxy --host
127.0
.0.1 --port
8004
--
\
gitea-mcp -transport stdio -host http://127.0.0.1:3000
mcp-proxy 的 8004 都只监听本机:127.0.0.1。gitea-mcp 经回环地址调 Gitea API;Gitea 不必对公网或办公网其他网段开放 3000。
登录 ZeroNews 控制台:
第一步:加自定义域名
在「自定义域名」页面加一个,比如
giteamcp.你的域名.com。
第二步:新建 HTTPS 隧道
在「隧道管理」里加一条隧道,参数大概是:
表格
| 参数 | 值 |
|---|---|
| 协议 | HTTPS |
| 内网 IP | 127.0.0.1 |
| 内网端口 | 8004 |
| 绑定设备 | 刚才装 ZeroNews 客户端的那台 |
| 公网域名 | 选刚才加的那个giteamcp |
隧道添加完成后,可通过 https:// giteamcp .hn.takin.cc/sse 连接 Gitea MCP。不要为看代码再单独映 Gitea Web 或 SSH。
这步很重要,公网暴露一个入口,就得有防护。ZeroNews 自带了几层策略,建议都加上:
1. Basic 认证
开启隧道的 Basic Auth,设个用户名密码。所有连接都要先过这层验证。
2. IP 白名单
把公司出口 IP、员工常用的固定 IP 加进白名单。其他来源的 IP 直接拒掉。
这一步能挡掉绝大部分扫描器,因为大部分自动化扫描都是乱序 IP 来的。
3. 区域访问控制
如果员工 IP 经常变动,不好加白名单,可以开区域控制,只允许中国境内的 IP 访问。海外的直接挡掉,能过滤掉九成以上的无效流量。
打开 Cursor,进 Settings → MCPs → New MCP Server,填配置:
{
"mcpServers": {
"giteamcp": {
"url": "https://giteamcp.你的域名.com/sse",
"type": "sse"
}
}
}
保存之后,看 MCP 列表里 giteamcp 是不是绿的,绿了就说明连上了。
配好之后,日常查询就不用开 Gitea 网页了。直接在 Cursor 的 Agent 对话框里说就行:
"列一下所有仓库"
"order-service 的 main 分支最近 10 次提交,都是谁改的"
"现在有多少个 open 的 PR"
"基于 develop 分支建个 release-2.0.0 分支"
AI 会自动调 MCP 接口去查,然后把结果整理好给你。
对于只是看个提交、审个 PR 这种轻量场景,效率比开网页高多了。而且不用连 VPN,在家就能用。
分享几个部署过程中遇到的问题,给大家提个醒:
1. MCP 服务一定要绑 127.0.0.1
一开始图省事,绑了 0.0.0.0,结果安全扫描直接扫到了 8004 端口。后来改成只监听回环地址,只走隧道,就没这个问题了。
2. Token 权限别给太大
一开始图方便,给了全权限。后来想想没必要,只读场景给读权限就够了。最小权限原则,降低泄露后的影响面。
3. IP 白名单要定期更新
员工家里 IP 变了、公司出口 IP 换了,都要及时更新白名单。不然用户连不上,还要来问。
4. 这方案不适合重操作
MCP 走的是 API,适合查询、轻量操作。你要是想 clone 整个仓库、大批量 push 代码,那还是得走内网或者正经的 Git 通道。这个方案就是解决 "轻量查询" 场景的,别指望它干所有事。
最后总结一下,这套方案的优缺点:
优点:
缺点:
适合的场景:
整体用下来,对于我们这种小团队来说,这套方案在安全和效率之间平衡得还不错。至少解决了 "人在外网想看个代码状态" 的痛点,又没把 Gitea 直接扔公网上。
如果大家有类似的需求,可以参考这个思路。有问题欢迎评论区交流。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70046436/viewspace-3186901/ ,如需转载,请注明出处,否则将追究法律责任。