使用 Docker 自托管 Git 时间戳:一份指南
你要消除的重复性手动任务是:每次你想要加密学上可辩护的证明,证明某个 Git 提交存在于某个日期,你要么手动运行时间戳命令,要么将元数据推送到一个你无法完全控制的服务。对于初创公司、开发团队和注重合规的团队来说,这会造成一个缺口。手动步骤会被跳过。外部依赖会引发数据主权问题。受监管或气隙环境通常根本无法使用托管 SaaS。
困难的方式是自己运行 OpenTimestamps 并照看每一份回执。实用的方式是部署 Timestamp GIT 作为自托管的 Docker 应用程序:同样的基于 GitHub App 的自动化、每夜比特币锚定和验证徽章,运行在你自己的基础设施上。
如果你在继续之前需要复习为什么存在性证明在软件中很重要,请参阅 软件中的存在性证明:初学者指南。
为什么要自托管 Git 时间戳?
自托管 Timestamp GIT 并不是要避开托管服务。它是关于在你自己的防火墙后面、使用你自己的数据卷、你自己的许可证和你自己的网络规则运行完全相同的自动化。这在以下情况下很重要:
- 你需要数据主权,并且不希望提交元数据在比特币锚定步骤之外离开你的环境。
- 你在受监管或气隙环境中运营,第三方 SaaS 连接受到限制。
- 你想要对 GitHub App 凭据、存储位置和日志访问的完全控制。
- 你需要一个审计友好的部署,保持在团队的操作控制之下。
Docker 自托管选项为你提供相同的自动化流水线:安装一次 GitHub App,连接仓库,让实例每晚将提交哈希分组,构建 Merkle 证明,并将它们锚定到比特币中。一次性设置之后,就没有手动时间戳步骤了。
一次性设置:使用 Docker 部署 Timestamp GIT
部署是一个单一的 Docker Compose 栈,包含两个服务:Timestamp GIT 应用程序和一个用作哈希队列的 Valkey 实例。
根据产品文档中的确切配置创建一个 docker-compose.yml 文件:
services:
timestampgit:
image: rue1401/timestampgit:prod
ports:
- "8080:8080"
volumes:
- ./data:/app/data
- ./license.lic:/app/license.lic:ro
restart: unless-stopped
valkey:
image: valkey/valkey:8
restart: unless-stopped
然后运行:
docker compose pull
docker compose up -d
docker compose logs -f timestampgit
应用程序在启动后可在 http://localhost:8080 访问。首次启动时,设置向导会引导你连接 GitHub App 并配置你的实例。这就是你完成一次性集成的地方。你不需要在开发者机器上安装任何东西,之后也不需要重复手动时间戳步骤。
你需要一个许可证文件挂载在 ./license.lic。通过在 Docker 许可证页面 上填写请求表单,提供你的姓名、公司、电子邮件和可选电话号码,可以获得有时间限制的演示许可证。对于生产用途,请使用商业许可证。
向导完成后,持续的时间戳过程就完全自动化了。
自动化流水线:从提交到比特币锚定
部署后,自托管实例运行与托管 Timestamp GIT 服务相同的零设置工作流。
提交检测
有两种检测模式:
- 标准模式(GitHub App): GitHub App 通过 webhook 检测新提交。它只读取每个受监控仓库的 HEAD 提交哈希,并将该哈希发送到你的自托管实例。
- 企业 ZK 模式: 一个 12 行的 GitHub Action 在你的基础设施上运行,只将提交哈希推送到 Timestamp GIT API。在此模式下,源代码永远不会离开你的环境,并且 Timestamp GIT 实例不需要对源仓库的读取访问权限。
哈希队列和每夜批处理
传入的提交哈希存储在 Valkey 支持的队列中。每晚,Timestamp GIT 容器内的一个 cron 工作进程:
- 将每个仓库的所有待处理哈希分组。
- 为每个仓库创建一个每日清单文件(
.txt)。 - 原生构建 Merkle 树。
- 使用公共 OTS 日历创建 OpenTimestamps 证明。
- 将 Merkle 根锚定到比特币区块链中。
证明交付
清单和 .ots 回执文件被推送回一个专用的时间戳分支或影子仓库,具体取决于你配置 GitHub App 的方式。这在比特币锚定确认后自动发生。
比特币确认通常需要几个小时,所以证明不会在午夜后立即出现。如果你在 15:00 提交,该哈希会在下一次夜间运行时被拾取,通常会在几个小时后被锚定并交付。
监控和故障处理
你可以通过自托管实例暴露的 API 端点直接监控锚定状态。
状态端点
对于任何公共仓库,你可以查询:
curl https://timestampgit.example.com/api/statusLast/acme/checkout-service
这会返回包含最后锚定的比特币区块信息的 JSON。
curl https://timestampgit.example.com/api/statusCount/acme/checkout-service
这会返回已提交和已盖戳的提交总数。
curl https://timestampgit.example.com/api/statusSummary/acme/checkout-service
这会返回一个适合 Shields.io 徽章使用的组合摘要。
私有仓库会在 URL 后附加一个加密的 HMAC,因此只有授权用户才能查看其状态。该 HMAC 特定于你的自托管服务器实例。
公共仪表板
每个仓库还有一个公共状态仪表板,位于:
https://timestampgit.example.com/status/{user}/{repo}
此页面显示证明寿命、最早锚定日期、每日规律性、比特币区块和交易数据、日历热力图、可下载的审计 CSV 和 PDF 证书。
故障场景
- 如果 cron 工作进程失败,请检查容器日志:
docker compose logs -f timestampgit
- 如果比特币网络延迟确认,状态端点将不会显示新的锚定。这通常是暂时的。
- 自托管实例将其数据存储在
./data卷中。重启或重新创建容器不会丢失排队的哈希或配置。 - 基于状态 API 或日志输出设置警报。对大多数团队来说,每天检查一次
/api/statusLast就足够了。如果最后锚定日期停止推进,请调查容器和出站网络访问。
自托管 Git 时间戳的最佳实践
- 限制对 Docker 主机的网络访问。 使用防火墙规则和反向代理。只暴露 GitHub webhook 或你的内部网络需要访问的端口。
- 备份
./data卷和license.lic文件。 该卷保存排队的哈希和实例配置。许可证文件必须保持对容器可读。 - 使用权限最小的专用 GitHub App。 在标准模式下,应用需要对源仓库的只读访问权限,以及对存储证明的目标仓库的读写访问权限。企业 ZK 模式只需要对目标仓库的读写访问权限。
- 优先使用影子仓库存储证明。 这可以保持你的主仓库干净,并将源历史与时间戳回执分开。
- 定期验证时间戳。 使用公共验证页面或 API 确认
.ots回执仍然能够针对比特币区块数据进行验证。这在法律或合规事件之前尤其重要。 - 有意识地更新容器镜像。 在维护窗口内使用
docker compose pull,并在推广到生产环境之前针对暂存实例验证新版本。
常见问题
问:我可以在完全气隙的环境中运行 Timestamp GIT 吗?
答:可以,Docker 自托管版本专为最大安全性而设计,可以在气隙环境中运行。但是,它仍然需要锚定到比特币区块链,因此实例必须具有出站互联网访问权限,以访问比特币节点或 OpenTimestamps 日历。如果需要完全气隙,你可能需要为锚定步骤配置代理或中继。
问:如何获取 Docker 自托管版本的许可证?
答:你可以通过在 Docker 许可证页面上填写表单,提供你的姓名、公司、电子邮件和可选电话号码,来请求有时间限制的演示许可证。将提供一个许可证文件用于评估。对于生产用途,请联系供应商获取商业许可证。
问:自托管版本需要 GitHub App 吗?
答:需要,自托管的 Timestamp GIT 实例仍然使用 GitHub App 来检测提交并将证明推送回你的仓库。在设置向导期间,你将连接你的 GitHub App 凭据。该应用需要对源仓库的只读访问权限,以及对存储证明的目标仓库的读写访问权限。
问:使用 Docker 运行 Timestamp GIT 的资源要求是什么?
答:产品信息没有指定确切的资源要求,但 Docker Compose 包含两个服务:Timestamp GIT 应用程序和一个用于哈希队列的 Valkey(Redis 兼容)实例。对于中小型团队来说,一台具有 1-2 GB RAM 的适中 VPS 应该足够。监控资源使用情况并根据需要进行扩展。
结论
使用 Docker 自托管 Git 时间戳消除了在先有技术保护中的手动繁琐工作。你部署一次栈,连接 GitHub App,每个对受监控仓库的提交都会流经自动化流水线:哈希检测、每夜批处理、Merkle 证明创建、比特币锚定,以及证明交付回你的仓库。
这就是一个你实际使用的法律保障和一个变成苦差事的保障之间的区别。如果你准备好部署,请从上面的 Docker Compose 栈开始,并从 Docker 许可证页面 请求演示许可证。对于不想运营自己实例的团队,托管 Timestamp GIT 服务提供相同的自动化,无需自托管。