我为什么要做 Shipherd
我做 Shipherd,是因为我受够了为小项目一遍又一遍地做同样的运维杂活。
当时,我有一个运行在 OrangePi 上的个人仪表盘,它确实帮我把日常生活安排得井井有条。但每次小改动都变成一场部署仪式:写代码、commit、push、SSH、cd、pull、重启,然后祈祷它别挂。如果有什么东西悄悄崩溃了,我往往要过好几天才会发现。
我托管的其他东西也在不断重复这个模式:机器人、脚本和小型服务。我不需要企业级的基础设施,但确实需要可靠性。我想要一种既有自托管的感觉,又带有助手的东西。
Shipherd 是什么
Shipherd 是一个免费、开源的平台,用于在你自己的服务器上运行和监控代码。
核心理念很简单:接入代码,运行它,把无聊的部分交给 Shipherd 处理。它能自动完成这些常见任务:
- 从 Git 提供商(包括自托管方案)拉取更新
- 以极低的配置成本运行项目
- 服务崩溃时自动重启
- 在同一个仪表盘中展示日志、CPU 和内存
- 在需要关注时发送通知
它运行在 Docker 中,因此在不同机器上的部署过程都是可预期的。
日常使用体验
对我来说,最棒的一点是 Shipherd 改变了我对业余项目的看法。
在有 Shipherd 之前,我常常因为部署很烦而拖延小的改进。现在,我可以把业余项目当作始终在线的系统,而不是脆弱的实验品。
代码来源
Shipherd 有三种主要的代码接入方式:
挂载的文件系统
如果你的服务器上有一个项目,可以让 Shipherd 指向它所在的目录。它会直接在那里运行代码,所以你可以继续沿用现有的工作流程。这非常适合没有放进 Git 的项目,或者快速实验。
Git 提供商
你可以连接 GitHub、GitLab、自托管的 Forgejo,或任何 Git 仓库。Shipherd 会拉取最新的更改并自动运行你的代码。这非常适合已经在 Git 中的项目和团队。
示例项目
如果你不知道从哪里开始,Shipherd 提供了 Node.js、Python、Go 和 Rust 的示例模板。你可以用其中一个模板创建新项目,几秒钟内就能得到一个可以运行的应用。
它有什么用
推送即忘
项目可以跟踪你的主分支并自动拉取新的更改,因此在许多场景下,部署可以完全自动化。
默认自愈
如果某个进程崩溃,Shipherd 可以重启它,并通过电子邮件、Discord 或 webhook 通知你。这弥补了我个人托管环境中最大的缺口:静默故障。
实时运行可见性
日志和资源使用情况都可以在仪表盘中查看,所以排查问题不用再从 SSH 开始。
运行时支持与 Shipherd Tools
Shipherd 的运行时目前已经支持 Node.js、Python、Go 和 Rust 项目。在应用端集成方面,shipherd-tools 目前提供官方的 Node.js SDK(tools-node)v1。它封装了健康检查、日志和控制 API,让应用可以向 Shipherd 回报更丰富的运行时数据。
Rust、Go 和 Python 的 SDK 包正在积极开发中,是路线图中的最高优先级。平台协议本身已经与语言无关,因此这些 SDK 是为了达到对等水平而构建的,而不是二等的附加品。
这个项目对我的意义
Shipherd 起初只是我个人的"止痛药",但它成为了最能改善我构建软件方式的项目之一。
它教会我如何把可靠性当作产品功能来设计,而不仅仅是后端层面的考量。它也促使我从真实的工作流程出发思考:人们在部署之前、之中和之后都在做什么。
如今,Shipherd 就是我从第一天起就希望拥有的平台:实用的自托管,更少的"保姆式"操作,以及快得多的反馈循环。