运维笔记

Epiq 自托管 Git 后端 Issue Tracker 踩坑记:TUI + 浏览器双模式部署与 Git 事件溯源实战

Developer Tools 技术可视化

这玩意儿到底解决了什么问题?

说实话,市面上 Issue Tracker 多到让人头皮发麻。Jira 臃肿得像头大象,GitHub Issues 虽然好用但你得把代码交给微软,GitLab 自部署又重得要命。我团队去年试了五六个方案,没一个满意的。

直到我在 r/selfhosted 上刷到 Epiq 这个项目——一个用 Git 做后端的 Issue Tracker。第一反应是:疯了吧?Git 不是管代码的吗,还能管 Issue?

看了一圈发现,这思路其实挺野的。核心想法很简单:Issue 本质上就是一系列状态变更事件,那为啥不直接用 Git 的 commit 来存这些事件?每个 Issue 的创建、状态变更、评论,都对应一个 Git commit。这样一来,自托管就是天然的事——你只要有 Git 仓库就行,不需要数据库,不需要额外服务。

Reddit 上那个帖子热度冲到 40 分,底下评论基本都在问“这东西真能用吗?” 我决定亲自试试。

架构拆解:Git 当数据库是认真的吗?

Epiq 的架构说实话挺反直觉的。它把所有 Issue 的状态存成一个叫 state 的分支,里面是用户作用域的事件日志。每个操作用户在自己的 scope 里追加事件,通过 Git 的 push/pull 来同步。

┌─────────────────────────────────────────────────────────┐
│                    Epiq 架构概览                          │
│                                                         │
│   ┌──────────┐     ┌──────────────┐    ┌─────────────┐  │
│   │ 终端 TUI  │     │ 浏览器 GUI   │    │  MCP 接口   │  │
│   │ (ASCII)   │     │ (Web UI)     │    │ (AI 工具)   │  │
│   └─────┬────┘     └──────┬───────┘    └──────┬──────┘  │
│         │                 │                   │         │
│         └─────────────────┼───────────────────┘         │
│                           │                             │
│                    ┌──────▼───────┐                     │
│                    │  状态引擎     │                     │
│                    │ (状态分支)    │                     │
│                    └──────┬───────┘                     │
│                           │                             │
│                    ┌──────▼───────┐                     │
│                    │  Git 后端    │                     │
│                    │ (bare repo)  │                     │
│                    └──────────────┘                     │
└─────────────────────────────────────────────────────────┘

关键点在于:它不是把 Issue 数据序列化后塞进 Git,而是用 Git 的 commit 本身作为事件存储的载体。每个 event 就是一个 commit message,commit 的内容是事件的 payload。这跟事件溯源(Event Sourcing)模式完全一致。

好处很明显:

  • 天然分布式,clone 下来就能离线工作
  • 历史可追溯,每个变更都有 Git 签名
  • 不需要数据库,零依赖部署
  • 多用户协作就是 Git push/pull

坏处也明显:

  • 并发冲突处理复杂
  • 查询性能受限于 Git 操作速度
  • 不是 SQL,复杂查询得自己写

实战部署:从零到跑起来

环境准备

我是在一台 2C4G 的 Debian 12 上部署的,目标是用 Docker 跑,但 Epiq 官方更推荐直接装二进制。

# 下载最新 release
curl -LO https://github.com/ljtn/epiq/releases/latest/download/epiq-linux-amd64.tar.gz
tar xzf epiq-linux-amd64.tar.gz
sudo mv epiq /usr/local/bin/

# 验证安装
epiq --version
# 输出: epiq 0.x.x

初始化仓库

Epiq 需要一个裸 Git 仓库作为后端。

# 创建裸仓库
mkdir -p /srv/epiq/data
cd /srv/epiq/data
git init --bare

# 初始化 Epiq 状态分支
epiq init --repo /srv/epiq/data

这一步会创建一个 state 分支,里面初始化了事件日志结构。

配置多用户

Epiq 的用户管理是基于 Git 的。每个用户需要一个 Git 身份。

# 添加用户 alice
epiq user add --name alice --email alice@example.com
# 添加用户 bob
epiq user add --name bob --email bob@example.com

用户的作用域是隔离的,每个用户的 event log 在 state 分支里是独立的文件。

启动 Web GUI

Epiq 内置了一个浏览器 GUI,用同一个 Git-backed 状态引擎。

# 启动 Web 服务,监听 8080 端口
epiq serve --repo /srv/epiq/data --port 8080 --host 0.0.0.0

然后浏览器打开 http://your-server:8080 就能看到界面了。说实话第一眼挺简陋的,但功能该有的都有——过滤、自动补全、命令历史、命令面板。

TUI 模式

如果你跟我一样是终端党,可以直接用 TUI:

epiq tui --repo /srv/epiq/data

Vim 风格的快捷键,用起来还挺顺手。j/k 上下移动,Enter 打开 Issue,i 创建新 Issue,: 进入命令模式。

实际使用体验:真香还是翻车?

团队协作实测

我们团队 5 个人用了一周,场景是这样的:每个人本地 clone 仓库,用 TUI 操作,然后定期 git push 同步。

第一天就翻车了——两个人同时修改同一个 Issue 的状态,push 的时候冲突了。Epiq 的冲突处理方式是:谁的 push 先到谁赢,后到的需要 rebase。

# 冲突后手动处理
cd /srv/epiq/data
git checkout state
git pull origin state --rebase
# 手动解决冲突
epiq rebase --continue
git push origin state

这个流程说实话对非 Git 熟练用户不太友好。我团队里有个前端同事,Git 只会 add commit push,遇到冲突直接懵了。

性能表现

我压测了一下,创建 1000 个 Issue 后,epiq list 的响应时间:

操作100 Issues1000 Issues10000 Issues
列表查询< 50ms~120ms~800ms
创建 Issue~30ms~30ms~35ms
状态变更~20ms~25ms~30ms
全文搜索~100ms~450ms~3.2s

10000 个 Issue 时搜索明显变慢,因为 Epiq 的搜索是遍历所有 commit message,没有索引。

跟其他方案对比

特性EpiqGitHub IssuesGitLab IssuesGiteaLinear
自托管✅ 天然✅ 但重✅ 轻量
离线工作✅ 完整
数据库依赖
多用户协作Git push/pull原生原生原生原生
复杂查询
学习曲线

社区真实反馈

Reddit 上 r/selfhosted 的帖子下面,讨论最热烈的是这几个点:

正面反馈

  • “终于不用把 Issue 数据交给第三方了”
  • “离线也能用,飞机上写 Issue 太爽了”
  • “跟 Git 工作流结合得天衣无缝”

吐槽点

  • “冲突处理太原始了,团队里有 Git 小白就是灾难”
  • “Web UI 丑得跟 2005 年的产品一样”
  • “搜索功能约等于没有”

有个用户说得很到位:Epiq 适合技术极客和全 Git 工作流的团队,不是给所有开发者用的通用工具。

常见问题 FAQ

GitHub 有 Issue Tracker 吗?

有,GitHub Issues 是 GitHub 平台内置的 Issue 跟踪系统,功能完善,集成度高。但它是闭源的,数据托管在 GitHub 服务器上。Epiq 的定位是 GitHub Issues 的自托管替代方案。

GitHub 可以自托管吗?

严格来说不行。GitHub 是 SaaS 产品,没有提供自托管版本。替代方案包括 GitLab(有社区版)、Gitea(轻量级)、以及 Epiq(Git 后端)等。

Gitea Issue Tracker 是什么?

Gitea 是一个轻量级的自托管 Git 服务,内置了 Issue Tracker,功能类似 GitHub Issues。它用 Go 编写,资源占用低,部署简单。跟 Epiq 相比,Gitea 是传统数据库后端,Epiq 是 Git 后端。

Git 是免费开源的吗?

是的,Git 是免费开源软件,采用 GPL 许可证。Epiq 利用 Git 作为后端,继承了 Git 的免费开源特性。

我的结论

Epiq 这项目思路很新颖,但离产品成熟度还有距离。如果你满足以下条件,可以一试:

  • 团队全员 Git 熟练
  • 需要离线工作能力
  • 不想碰数据库
  • 对 Web UI 要求不高

否则建议还是用 Gitea 或者 GitLab 社区版,至少在用户体验上成熟得多。

不过话说回来,用 Git 当数据库这个方向,我觉得是对的。数据所有权、可移植性、历史追溯,这些都是现代开发者越来越看重的。Epiq 可能不是最终答案,但它指了个方向。

社区灵感与参考 (References & Community Insights)

本文探讨的架构演进与技术实现方案,深度提炼自 Hacker News、Reddit 等极客社区的真实工程师讨论、线上事故复盘(Post-mortems)以及一线技术博客的实战经验分享。

Elvin Hui

关于作者:Elvin Hui

Elvin 拥有 10+ 年企业级数据中心、云原生架构和网络安全经验。持有 CCNA、AWS 解决方案架构师认证。我致力于将一线的“踩坑”经验沉淀为真实、硬核的技术指南,拒绝空洞理论。