Observed since 20 Oct, 22:03 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
轻量级局域网 Git 仓库与 CI/CD 管理平台
本地 Git 仓库与 CI 流水线管理平台,提供类 GitHub 的 Web 界面。
它不是 Demo,而是已在生产环境长期运行的完整平台:本机(龙芯 loongarch64 / AOSC OS)上托管着 9 个真实仓库,年复一年地承担推送、构建、部署与外部同步。文中列出的每一项能力都在真实仓库上验证过,包括那些"只在出问题时才用得到"的部分(快照回滚、孤儿构建校正、失效地址清理)。
零认证、零数据库、纯文件系统存储:插上硬盘、跑一条命令就能用。
更多界面见下方界面预览。
git:// daemon,局域网内免认证开放cloc,自动排除文档/配置/脚本fsck 校验、旧数据不丢)post-receive 钩子从 stdin 解析真实分支并自动校正悬空 HEADGET /build-summary 供轮询最新状态;/api/help 自描述全部 99 个端点curl 一键提交(/api/ssh-keys/raw)webhook-api.test.ts 会真起服务进程 + 真发 HTTP(隔离临时目录),因为有些缺陷只有跑起来才暴露/api/help,并有测试守护防止漏登KillMode=process 保证重启面板不会连带杀掉正在跑的构建| ✅ 适合 | ❌ 不适合 |
|---|---|
| 3-5 人小团队,不想买 GitHub Pro / GitLab 企业版 | 你需要多租户、RBAC 权限管理(请用 GitLab) |
| 你在局域网/内网开发,没有公网 IP 和域名 | 你需要 GitHub Actions 的云端并行构建矩阵 |
| 你的构建产物很大,想存到外部硬盘/USB | 你需要 Kubernetes + Docker 的容器化 CI |
| 你想推送代码后自动构建、自动发版,但不想写 YAML | 你需要复杂的流水线编排(如 Jenkins Pipeline) |
| 你的服务器是龙芯/ARM 等特殊架构,主流 CI 不支持 | 你需要 SaaS 托管(如 GitHub Actions、Travis CI) |
| 你想秒级备份仓库(btrfs 原生快照 / reflink),硬盘坏了不怕 | 你已经有完善的 DevOps 基础设施 |
| 你想让外部智能体/设备通过 Webhook 与构建状态接口接入 | 你的仓库必须放到公网(本项目为可信局域网设计,无鉴权) |
一句话:当你想在自己的局域网里搭一个"够用"的 GitHub,零认证、零数据库、插上硬盘就能跑的时候。
⚠️ 安全边界:面板默认无鉴权,仅供可信局域网使用,不要直接暴露到公网。若需公网访问,请自行在反向代理层加认证与 TLS。
以下截图取自真实运行环境(龙芯 loongarch64,浏览器全屏访问 http://192.168.1.64),其中托管着 9 个真实仓库。
落地页 —— 打开面板先看到连接方式与上手说明:三种协议怎么用、怎么建仓库、CI/CD 怎么接
仪表盘 —— 存储路径、磁盘余量、仓库列表与最近活动一屏可见
仓库详情 —— 文件树、README 渲染、分支切换、提交历史;右侧是当前提交的说明
CI/CD 构建历史 —— 按日期分组折叠、今天默认展开;上方是当前构建的步骤与实时状态
Webhook 统一管理 —— 按地址而不是按仓库汇总:谁在用、成功率、最后投递时间,失效地址可从所有引用处一次移除
通知中心 —— 全局聚合投递记录,支持按事件类型静音、桌面系统通知与按条件清理(先预览条数再执行)
git-panel/
├── client/ # Vue 3 + TypeScript 前端
│ └── src/
│ ├── components/ # 页面与通用组件(仓库、快照、令牌、Webhook 管理…)
│ ├── extensions/ # 扩展页(构建统计、磁盘监控、代码搜索、通知中心)
│ ├── App.vue
│ └── main.ts
├── server/ # Express + TypeScript 后端
│ ├── server.ts # 主入口(99 个 API 端点)
│ ├── ci-runner.py # CI 编排器(构建、部署、Webhook 投递)
│ ├── hooks-template.ts # post-receive 钩子的唯一权威实现
│ ├── storage-fs.ts # 快照三级降级链与子卷转换
│ ├── diff-engine.ts # 分支/提交 diff
│ ├── webhook-cleanup.ts # 投递记录清理的判定逻辑
│ ├── git-process-reaper.ts # 收割重启遗留的孤儿 git-http-backend
│ ├── deploy-config.ts # 仓库根解析(后端/部署脚本/CI 共用)
│ ├── version.ts # 版本号解析
│ ├── tests/ # 17 个套件、236 个用例
│ └── extensions/ # 扩展路由(构建统计、磁盘、代码搜索)
├── scripts/ # 特权助手(btrfs)与安装脚本
├── web-dist/ # 前端构建产物
├── nginx-full.conf # Nginx 配置模板(含占位符)
├── deploy.sh # 一键部署脚本
└── 版本记录.html # 完整变更历史(含每项的动机与验证方式)
npm install -g @076lik/git-panel
# 启动服务(普通用户)
git-panel
# 自定义端口或仓库路径
git-panel --port=8080 --repo-root=/data/git
系统部署(一次性,需要 sudo):
sudo git-panel-deploy
git-panel-deploy 会自动完成:环境预检 → 安装依赖 → 编译前后端 → 生成 nginx 配置 → 创建 systemd 服务 → 配置防火墙 → 启动服务。
cd /home/lik/git-panel
sudo bash deploy.sh
deploy.sh 会自动完成:环境预检 → 安装依赖 → 编译前后端 → 生成 nginx 配置 → 创建 systemd 服务 → 配置防火墙 → 启动服务。
环境变量覆盖(可选):
sudo USER=lik REPO_DIR=/home/lik/git PORT=3456 bash deploy.sh
如需本地开发调试:
# 后端(ts-node 热重载)
cd server && npm install && npm run dev
# 前端(Vite 热重载)
cd client && npm install && npm run dev
默认存储在 ~/git,支持通过前端「系统配置」面板修改,保存后点击「重启服务」即可生效(无需手动操作命令行)。
deploy.sh 已自动配置。如需手动:
# Nginx
sudo nginx -c /home/lik/git-panel/nginx-full.conf
# 防火墙(firewalld 示例)
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=9418/tcp --permanent
sudo firewall-cmd --reload
某些发行版(如 AOSC OS)默认会拒绝 1-1024 端口的入站连接。
图形化方式(AOSC OS):
打开 系统设置 → WiFi 和互联网 → 网络设置 → 防火墙设置 → 在列表中 勾选 http → 点击 确定 → 点击 应用。
命令行方式(firewalld):
# 仅允许局域网(推荐)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.3.0/24" service name="http" accept'
sudo firewall-cmd --reload
# 全局开放(不推荐暴露在公网)
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
| 协议 | 地址 | 说明 |
|---|---|---|
| Web 面板 | http://192.168.3.130/ | Nginx 反向代理,标准 80 端口 |
| Git (只读) | git://192.168.3.130/repo.git | git daemon,端口 9418 |
| HTTP (推送) | http://192.168.3.130/api/git/repo.git | Nginx → Node.js 3456 |
| SSH | lik@192.168.3.130:/run/media/lik/git/repo.git | 标准 22 端口 |
git-http-backend CGI 代理cloc(语言统计)语言统计基于 cloc 计算代码行数,自动排除以下非代码类别:
| 类型 | 被排除的语言 |
|---|---|
| 文档 | Markdown、reStructuredText、TeX、Text |
| 配置/数据 | JSON、YAML、XML、TOML、INI、CSV |
| 样式 | HTML、CSS、SCSS、Less、Sass |
| 构建/脚本 | Dockerfile、Containerfile、Makefile、make、CMake、Gradle、Shell、Bash、PowerShell、Batch |
| 其他 | Log、Source Map、SVG |
如果排除后没有剩余语言,则自动回退显示全部结果(避免空列表)。
git config --global pack.windowMemory 512m
git config --global pack.threads 4
git config --global http.postBuffer 2097152000
以上为可选的性能调优。需要说明一个曾经的真实缺陷及其修复,避免你再踩:
曾经:pack 体积超过
http.postBuffer(默认仅 1 MiB)时推送必然失败。 超过该阈值后 git 会改用 chunked 传输(无Content-Length),而服务端代理把 环境变量写成了CONTENT_LENGTH: req.headers['content-length'] || '0'—— git 的 receive-pack 在缺Content-Length时是直接报错退出的,'0'等于告诉它「没有请求体」, 于是客户端看到:send-pack: unexpected disconnect while reading sideband packet 致命错误:远端意外挂断了已修复:仅在客户端真的给了
Content-Length时才设置该变量,未给则交由git http-backend按「读到 stdin EOF」处理(这正是 chunked 所需)。 修复后 2.38 MB 的载荷在默认配置下推送成功,包体完整(fsck干净、对象可读)。 回归测试server/tests/git-http-push.test.ts用-c http.postBuffer=1强制走 chunked 路径,已实测可复现该缺陷(还原缺陷代码即变红)。这与仓库大小无关,只与单次推送的 pack 体积有关 —— 纯文本小提交在很大的仓库上 一直都能正常推送,这也解释了为什么它长期难以定位。
后端核心逻辑已抽成无副作用模块,并有回归测试覆盖:
cd server && npm test # 17 个套件,236 个用例
| 套件 | 覆盖内容 |
|---|---|
post-receive-hook.test.ts | 钩子从 stdin 解析分支、HEAD 自动校正、删除/标签推送不触发构建 |
version.test.ts | 版本号解析(源码布局 / npm 安装布局 / 兜底) |
deploy-config.test.ts | 仓库根解析优先级、尾斜杠归一化、配置损坏降级、CLI 输出洁净度 |
storage-backend.test.ts | 快照三级降级链的判定与命令分派、路径穿越防护、转换失败回滚 |
ci-liveness.test.ts | CI 孤儿状态判定(三重存活校验、pid 复用防护) |
diff-engine.test.ts | ref 注入防护、numstat/name-status 解析、改名与二进制边界 |
notif-read.test.ts | 通知未读水位线语义与边界 |
notif-prefs.test.ts | 按事件类型静音、桌面通知三重过滤、通知文案 |
info-page-icons.test.ts | 落地页内联图标与 client/src/icons/index.ts 一致性 |
api-help-coverage.test.ts | 所有 Express 路由都已登记进 /api/help |
ci-runner-paths.test.ts | 后端 / deploy.sh / ci-runner.py 三方的路径优先级一致(且后两者复用同一实现) |
webhook-cleanup.test.ts | 投递历史清理的判定边界(时间缺失一律保留、失败判定、按地址过滤与排除) |
git-process-reaper.test.ts | 孤儿 git-http-backend 收割的保守判定(后代链、命令行、仓库根三重校验) |
git-backend-env.test.ts | CONTENT_LENGTH 构造规则(chunked 缺该头时绝不能设成 '0')+ 其余 CGI 变量 |
git-http-push.test.ts | 真起服务 + 真跑 git push:chunked(大 pack)推送、pack 完整性与 fsck |
webhook-api.test.ts | 真起服务进程 + 真发 HTTP:统一管理聚合、残留地址识别、清理模式与确认守卫、scope="all" 覆盖全部仓库 |
测试由
npm test自动发现dist/tests/*.test.js—— 新增套件无需改脚本, 避免手工清单漏跑而静默失去保护(api-help-coverage就曾被漏掉)。测试不能继承调用方的 git 上下文(CI 的构建目录本身是裸仓库,会导出
GIT_DIR), 统一通过server/tests/helpers.ts的gitEnv()隔离。验证时可用GIT_DIR=<裸仓库> npm test复现 CI 条件。
作者: H076lik
本项目由 H076lik 独立构思、设计并主导开发。所有功能均根据实际局域网 DevOps 需求设计,技术栈(Vue 3 + Express + btrfs/XFS 快照后端 + Python CI Runner)由作者自主决定。
开发过程中使用了 AI 智能体(如 Crush、Claude Code 等)作为代码生成与调试的辅助工具。AI 智能体仅作为开发工具使用,类似于 IDE、编译器等辅助软件,不构成共同创作。所有代码的架构决策、功能设计、逻辑审查、测试验证以及最终知识产权均归属于 H076lik。
如果您觉得本项目对您有帮助,欢迎赞助支持开发。 联系方式与赞助方式待补充...
| 赞助者 | 金额 / 方式 | 日期 | 留言 |
|---|---|---|---|
| 待填写 | — | — | — |
本项目采用 GNU Lesser General Public License v3.0 (LGPL-3.0) 开源许可。
client/src/、server/、配置文件及部署脚本)均已在文件头部添加 LGPL-3.0 标准声明LICENSE 文件法律说明:本项目为独立实现的 Git 仓库与 CI/CD 管理平台。功能接口与 DevOps 流程参考了开源社区(包括 GitHub、GitLab)的成熟实践,但全部代码由 H076lik 独立编写。
Copyright (C) 2025-2026 H076lik
Git Panel 内置完整的持续集成/持续部署流水线,支持自动构建、部署和外部通知。
推送代码后自动触发:
deploy/{repo}npm run build、cargo build、go test).github/workflows/*.yml 和 .gitlab-ci.yml.github/workflows/git-panel-ci.yml 并自动 git commit,配置与代码一起版本控制2.0.0),自动递增 v2.0.1 → v2.0.2构建成功后自动执行部署步骤:
cp target/release/app /opt/bin/)POST /api/repos/{name}/deploy构建/部署完成后向局域网内其他设备/智能体发送 HTTP POST 通知:
# 配置 Webhook(前端 CI/CD → 配置 Webhook)
# 或使用 API
POST /api/repos/{name}/webhook
{
"enabled": true,
"url": "http://192.168.3.xxx:8080/webhook",
"events": ["build.failed", "build.success", "deploy.failed", "deploy.success"]
}
推送内容示例:
{
"event": "build.failed",
"repo": "YouLiLong",
"branch": "master",
"commit": "c993fe94...",
"commitMsg": "refactor(dap): ...",
"runId": "1778663640",
"status": "failed",
"steps": [{"name": "Build release", "status": "failed"}],
"timestamp": "2026-05-13T17:34:00",
"server": "git-panel"
}
GET /api/repos/{name}/build-summary
返回示例:
{
"repo": "YouLiLong",
"ci": {
"status": "success",
"runId": "1778665915",
"branch": "master",
"commit": "13aa0970...",
"duration": 8,
"steps": [{"name": "Build Client", "status": "success"}],
"deployStatus": "success"
},
"deploy": {
"status": "success",
"runId": "1778665915"
},
"lastUpdated": "2026-05-13T17:52:03Z"
}
检测到 uv.lock 或 pyproject.toml 中包含 tool.uv 时自动使用 uv sync:
{"steps": [
{"name": "UV Sync", "command": "uv sync || uv pip install -e . || true"},
{"name": "Test", "command": "uv run pytest || true"}
]}
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 3.2.1Registry latest | 21 Sept 2026 | 3 | |
| 3.2.0 | 21 Sept 2026 | 3 | |
| 3.0.1 | 16 Sept 2026 | 3 | |
| 3.0.0 | 16 Sept 2026 | 3 | |
| 2.2.9 | 8 Jun 2026 | 3 | |
| 2.2.8 | 8 Jun 2026 | 3 | |
| 2.2.7 | 8 Jun 2026 | 3 | |
| 2.2.6 | 18 May 2026 | 3 | |
| 2.2.5 | 18 May 2026 | 3 | |
| 2.2.4 | 18 May 2026 | 0 | |
| 2.2.3 | 18 May 2026 | 0 | |
| 2.2.2 | 18 May 2026 | 0 | |
| 2.2.1 | 18 May 2026 | 0 | |
| 2.2.0 | 18 May 2026 | 0 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 22:03 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:f12319cb36ba94a16a0af389c474fc9ebcb5d80fb33b9eec727468b5408d2df2