Hacker News Best

What I self-host

6.9内容质量

TL;DR · AI 摘要

What I Self-Host Clever Blog Title What I Self-Host, What I Don’t, and Why I’ve always had a foot in the self-hosting wo...

核心要点

  • 主题聚焦:What I self-host
  • 来源:Hacker News Best,建议结合原文判断细节。
  • AI 分析暂不可用,本条为保底评分与摘要。
#AI#编程#前端#后端#云计算
打开原文

我自托管的内容 | 机智的博客标题

我自托管的服务、不托管的服务以及背后的原因

我始终与自托管领域保持着联系,早在它被称作"自托管"之前,我就已经涉足其中。大学一年级时,我曾用床底的Linux电脑运行过个人网站。当室友因风扇噪音关闭设备时,网站一度出现停机。随后几年,我先后运行过MythTV和XBMC(后来改名为Kodi)。

最近几年,我在印度生活过一段时间,那里的流媒体服务价格按西方标准极其低廉。我们使用过Netflix、Disney Plus(印度称Hotstar)和Spotify。离开印度后,我拒绝支付西方国家的高昂服务费用。但同时,我也对平台的用户粘性机制感到厌烦,尤其是对儿子的影响。我们希望限制他的观看选择,但平台持续推送的"为你推荐"和"接下来播放"功能引发了矛盾。虽然有办法通过限制内容标题或关闭自动播放来控制,但需要为每个服务单独设置并持续跟踪客户端应用的更新,这种工作量实在太大。

因此,我以另一种方式"断开连接",转而使用自托管的Jellyfin替代流媒体服务。在接下来的一年半时间里,Jellyfin为我打开了自托管其他服务的大门,大幅降低了对云服务提供商的依赖,并带来了令人欣慰的稳定性。我不再频繁遭遇不必要的网站改版、价值存疑的新功能,以及关于服务条款更新、强制仲裁、数据泄露等问题的邮件轰炸。现在,我会阅读所托管软件的新版本发布说明,并自主决定是否以及何时进行升级。

原则

我遵循一些基本原则。

除路由器上的VPN服务器外,我不会将任何服务直接暴露在公共互联网中。我不关心这样做有多方便,或应用本身有多安全。尤其是在AI辅助攻击的背景下,我认为这并不明智。我的ISP使用CGNAT技术处理IPv4地址,因此我的家庭网络无法通过IPv4从公共互联网直接访问。我的VPN服务器仅在IPv6网络中可被公网访问,虽然这带来了一些限制,但对我的使用场景而言是可行的,而且可能有助于减少恶意连接尝试。最大的缺点是,我的VPN几乎无法在提供IPv6的公共WiFi网络上运行。使用手机时,我可以关闭WiFi并切换至移动数据连接——前提是存在信号覆盖。

在可能的情况下,我倾向于原生运行服务,但对复杂服务或依赖项较多的服务会采用容器化方案。我特别青睐那些仅包含单一Go二进制文件的服务。如果某个服务只能通过Docker Compose文件部署,并需要运行MySQL、Redis和三个其他容器,我就会开始寻找替代方案。如果依赖项不复杂,原生运行方式更优,速度更快,效率更高。我可以跨多个服务使用相同的管理工具和命令。无需考虑进入容器执行命令的额外心智负担,比如发现某个容器缺少curl工具,另一个容器使用busybox导致参数差异,或者处理虚拟网络和主机端口映射等问题。

相关地,我现在不再使用Docker。这并非出于某种原则性立场,而是因为我厌倦了在服务器上管理完全独立的服务控制系统。我已在使用systemd,而目前Podman与systemd的集成效果非常出色。

硬件

去年我购买了一台 Beelink Mini PC,具体是搭载 Intel N100 处理器、16 GB 内存和 512 GB 固态硬盘的 S12 Pro 型号。这发生在“芯片荒”之前,当时花费了 180 欧元。目前亚马逊上同款产品已涨至 359 欧元。天哪!服务器上还连接了一块 6 TB 的硬盘用于媒体存储。

我在 Hacker News 上关于自托管的评论引发了一些关于如何在 16 GB 内存上运行所有服务的疑问。正如下面所述,我做出了一些降低服务器资源消耗的选择,但最终你会发现,其实不需要太多硬件就能运行很多服务。显然我不会在这台设备上运行本地 AI 推理,但除 AI 相关功能外,其他所有服务都开箱即用,或只需简单配置即可正常工作。

服务

按字母顺序排列。

Actual Budget

一款具备桌面客户端和网页应用的预算软件,支持自定义报表和基于规则的分类。我仅用它来管理预算以及支票账户/储蓄账户/信用卡账户。对于投资账户的跟踪,我使用的是云服务。某天我会尝试摆脱后者……

虽然 Actual Budget 支持从多家银行自动导入交易记录,但我并未使用该功能。而是每月结束后,我手动下载前一个月的交易记录(优先使用 OFX 格式,若无则使用 CSV 格式)并导入。这对我而言可行,因为我主要用 Actual Budget 进行支出跟踪,而非……真正的预算管理。

Podman.

Audiobookshelf

在服务器上添加、下载和存储有声书和播客,通过手机收听。我很少使用有声书功能,主要是为孩子设置的,但它的章节处理功能非常出色。过去我用过 PlayerFM 和 Pocket Casts 收听播客,但现在除非没有 VPN 连接,否则我都会使用 Audiobookshelf。

Native.

自动刻录机(ARM)

ARM 可自动刻录和转码 DVD(也支持蓝光光盘,但我不处理蓝光)。是的,2026 年我仍在刻录 DVD。请记住,我们已经取消了有线电视服务,这不仅是获取新内容的渠道,也是获取双语内容(英法双语)的方式。

Backrest

Restic 备份软件的网页管理界面。备份非常重要!尤其是对 Immich(照片)而言。Restic 能很好地去重并压缩备份数据,而 Backrest 让管理存储保留策略变得简单。如果备份失败,通知会发送到 Gotify。

Beszel

Beszel 是一个简单的监控仪表盘,通过传统意义上的后台服务代理收集基础统计信息,显示 CPU 负载、内存和磁盘使用情况、温度、电池等数据。帮助我监控家中其他设备(多个树莓派和一个 Proxmox 集群,可能在未来的文章中会详细介绍)的状态。

Caddy

Caddy 是一个 Web 服务器和反向代理。起初我不理解反向代理的价值,以为通过本地 DNS 名称甚至 IP 地址和端口号访问服务就足够了。但当我不断增加服务时,有些服务需要 HTTPS。于是我注册了一个域名(不是这个域名),并设置 Caddy 自动获取 Let's Encrypt SSL 证书,现在几乎所有服务都能通过 HTTPS 和友好的子域名在局域网(或通过 VPN)上访问。添加新服务只需快速编辑 Caddyfile 即可。

Cockpit

Cockpit 是一个基于 Web 的服务器管理控制台。它使用常规的系统认证方式。对我而言,它主要在没有设置通知时帮助我发现服务失败的情况。

Forgejo

Forgejo 是 Gitea 的一个分支项目,以单个二进制文件形式部署。如今 GitHub 的服务稳定性经常成为笑话的素材,但我也欣赏拥有自己的 Git 远程仓库带来的速度优势。最终我会设置 CI/CD 和运行器,即使只是为了部署这个博客。

FreshRSS

基于 Web 的 RSS 阅读器。不过如今我基本上只访问两个网站,因此使用频率不高。我确实订阅了部分自托管服务的 GitHub 发布版本,以便查看新版本的功能和修复内容。

Frigate

网络视频录像机(NVR)。我最初选择 Zoneminder 是因为年龄原因,但后来发现 Zoneminder 已经过了鼎盛时期。Frigate 的表现非常出色。我用 8 台 IP 摄像头运行它,它能检测到有人或车辆进入车道并发出警报,还能与 Home Assistant 集成以实现各种自动化(例如在后院检测到人时自动开启摄像头聚光灯)。未来我可能会写一篇关于我的 IP 摄像头使用经历的详细文章。

我将所有摄像头的分辨率都设置得低于其支持的水平,主要是为了避免 Wi-Fi 网络拥堵。大多数摄像头还支持更低分辨率的 RTSP 子流,这也是 Frigate 用于运动和物体检测的方案。保持低分辨率可以避免视频处理时的 CPU 和内存过度占用,以及录像产生的磁盘空间浪费。这些分辨率足以识别面部,而且我所在国家的隐私法律禁止拍摄公共道路,因此我的摄像头不会对远处的区域进行拍摄。

Gonic

用 Go 编写的 Subsonic 兼容服务器。我很久以前购买了 Subsonic 的永久授权,但原项目已经过时,现代替代方案更优秀。我运行了两个独立的 Gonic 实例,一个用于播放儿童音乐,另一个用于播放成人音乐。

Gotify

用 Go 编写的简单通知服务。许多自托管服务直接支持 Gotify 通知,或可通过自定义 HTTP POST 发送通知。结合 Uptime Kuma,我使用 Gotify 来接收服务或设备宕机通知、孩子在 Jellyfin 上观看的内容、Audiobookshelf 中新播客剧集等信息。

Home Assistant

Home Assistant 可能值得单独写一篇文章。它非常出色,我无法想象在 Google Home、Amazon Alexa 或 Apple Home 等封闭生态系统中完成相同的事情。如今设备制造商开始采用 Matter 等标准化协议后情况有所改善,但 Home Assistant 提供的控制能力和灵活性依然难以匹敌。不过它的学习曲线较陡,我需要思考如何在不牺牲家庭功能的前提下应对潜在的服务器故障问题。

Homepage

在某个时刻我意识到自己运行了太多服务,需要另一个服务来统一管理它们。Homepage 是一个很好的解决方案。它几乎支持我运行的所有服务的插件,因此我可以快速查看整体状态,或直接跳转到某个服务的子域名链接。

Immich

Google Photos 替代方案。我厌倦了 Google 在其应用中不断推广付费存储计划。虽然我能管理自己的存储空间,但妻子的存储空间总是即将用尽。我们去年在版本 2 发布后不久就迁移到了 Immich。当所有网络活动都在家庭内部进行时,加载满是照片的页面要快得多。我也想出了一个与家人分享相册的解决方案。不过 Immich 还有许多需要改进的地方——我有很多重复文件,现在存储不再是问题后,我在筛选照片和视频时变得不够严谨。

Jellyfin

如前所述,我长期以来一直自托管媒体,甚至可以追溯到二十多年前的 MythTV。Jellyfin 对媒体组织方式有明确的偏好,但总体运行良好。我只用它来播放电影、电视剧和家庭视频,因此无法评价其电子书、音乐、照片等其他功能。虽然我儿子还记得 Netflix,但他对 Jellyfin 表示满意。我喜欢它没有自动播放功能,不会看到推荐内容,也不需要滚动浏览大量无关信息才能找到想看的内容。

我管理资源需求的一种方式是优先选择 720p 媒体而非 1080p 或更高分辨率。显然,在转录 DVD 时,分辨率只能是 576p 或 480p。我确实有一台 4K 电视,但尺寸并不大,虽然我能分辨 SD 和 HD 的分辨率差异,但对绝大多数内容来说,720p 对我而言已经足够。

Music Player Daemon (MPD)

有时一些解决方案就是能直接工作,无需频繁更改。我认为 MPD 就是其中之一。它已经存在了 23 年。虽然 Gonic 适合我在手机上听音乐,甚至可以通过 VPN 在外出时从家中流式传输音乐到手机,但 MPD 是我通过 Snapcast 将音乐播放到全屋音响系统的首选方式。我运行了两个 MPD 实例,一个用于音乐,另一个用于播客。

PocketBase

我过去曾用 SQLite 文件配合 SQL Workbench/J 直接访问来跟踪特殊账户(HSA、529 等)的交易和收据。但随着我跨国旅行、使用不同货币和保险体系,以及希望让妻子也能输入交易信息,事情变得复杂起来。我迁移到了 PocketBase,它本质上仍然是一个 SQLite 文件,但提供了一个友好的基于 Web 的管理前端,我将其滥用于通用的 CRUD 操作。它对妻子来说也足够简单,我仍然可以对底层数据库文件执行任意查询。

Readeck

Readeck 让我能够标记并归档我阅读过的内容。研究生时期我曾是 Zotero 的重度用户,但多年来我再也没有写过参考文献。不过,我仍然会阅读一些希望确保日后能访问的内容。我首先尝试了 Wallabag,但它在归档付费墙内容时遇到困难,即使我在手机上登录了账户。相比之下,Readeck 会归档手机看到的内容,并将其存储在我的服务器上。

Samba

Samba 提供了共享网络存储,使文件在服务器之间复制或与妻子共享重要文档变得简单。有趣的是,一种最初在 1980 年代开发且与 Windows 密切相关的文件共享协议,至今仍是局域网跨平台文件共享的最佳选择。

slskd

IYKYK 。

Snapcast

Snapcast 提供全屋同步音频。可以将其视为 Sonos 的替代方案,但无需支付高昂的厂商锁定费用或担心计划性淘汰。这也值得单独写一篇介绍。它的设置过程较为复杂,但实际使用效果非常好。我最终计划购买一些额外设备,主要用于作为 Snapcast 接收器。

Syncthing

Syncthing 是我用于照片备份策略的一部分,与 Immich 配合使用。我在 MacBook 上设置了单向同步(仅接收),这样 Immich 中的所有照片最终都会备份到 MacBook 的外接硬盘中。

Transmission Daemon

这个工具的名称已经很好地说明了它的用途。

Uptime Kuma

在妻子多次抱怨“X 不工作”并需要手动重启服务后,我意识到需要一种方法来跟踪哪些服务正在运行或未运行。Uptime Kuma 简单易用,但功能非常实用。我可以 ping 设备以确认其在线状态,检查 Podman 容器的状态,从各种服务中查找 HTTP 2XX 响应码,甚至可以解析 JSON 负载并提取健康检查的详细信息。如果某个服务宕机,我可以发送 Gotify 通知(当然,会在几次重试后才发送)。

Vaultwarden

这是 Bitwarden 的自托管版本。多年来我一直使用 KeePass,但由于缺乏良好的同步方案,我从未在手机上登录过任何账户。与此同时,妻子使用 LastPass,但该服务存在多次数据泄露事件,且自动填充功能表现不佳。将她迁移到 KeePass 并不现实,于是我选择了 VaultWarden,这是一个开源的 Bitwarden API 兼容实现,可以与官方 Bitwarden 客户端配合使用。我不太喜欢 Bitwarden 的浏览器扩展,但总体还算可以。Android 应用程序表现良好,当连接到本地网络时可以无缝自动同步;否则,我可以通过 VPN 连接并手动触发同步。

我有点担心 Bitwarden 最终可能会对 VaultWarden 友好度降低,导致客户端兼容性破裂。目前,我所知道的其他主要 Bitwarden 兼容客户端只有 Keyguard,但它没有开源许可证,采用的是免费增值模式。

Vikunja

我使用 Trello 已经大约十年了。但今年早些时候 Trello 发生了持续数日的严重故障后,我决定寻找一个自托管的替代方案。我排除了任何需要为仅服务两个用户的系统启动 PostgreSQL 或 MySQL 数据库的方案。Vikunja 默认使用 SQLite,但也可以配置为使用其他数据库后端。它并不完美,Android 应用程序缺少一些功能,但对我来说已经足够好。单文件部署?请给我来一份。

Yubal

一个简单的网页应用,用于下载 YouTube Music 播放列表。我通常使用 yt-dlp 下载 YouTube 视频,或使用 NewPipe 在手机上观看,但 Yubal 能够正确命名、组织并标记从 YouTube Music 下载的音乐。

非托管服务

以下是一些我不进行自托管、尝试后放弃或不太可能尝试的内容。

The *arr Stack

Sonarr、Lidarr、Radarr 等。每当我看到关于设置这些工具的描述时,它们听起来都像是一个资源消耗大且容易频繁出错的系统。这与我选择自托管服务时追求的稳定性正好相反。

Collabora Online

虽然完全放弃 Google 听起来很理想,但就存储和共享信息的便捷性与可访问性而言,Google Docs 仍是难以被超越的方案。不过,除非有特殊需求必须使用云端文档,否则我会优先选择 LibreOffice Writer 和 Calc。由于我已有共享网络驱动器,运行像 Collabora Online(基于网页的办公套件)这类服务似乎没有必要,直接使用本地 LibreOffice 即可。

Firefly III

在尝试 Actual Budget 之前,我曾使用过 Firefly III,当时误以为需要内置多币种支持。但它的配置过程非常复杂,涉及多个容器,甚至还需要一个专门用于数据导入的容器。相比之下,Actual Budget 的设置和使用都简单得多。对于我的外币账户,我使用了一个简单的自定义脚本处理汇率转换,因此 Actual Budget 中的所有数据都以美元计价。

Owntracks

我喜欢 Google 地图时间线功能,但 Google 将位置数据限制在单个设备后,我希望能找到一个自托管的替代方案。然而,无论尝试多少种电池或定位设置,OwnTracks 的 Android 应用始终无法稳定地报告我的位置。另一个选项是 Dawarich,但它需要运行“至少”四个容器(PostgreSQL、Redis、Sidekiq 和 Web 应用)。对我来说,这种资源投入与可能获得的价值并不成正比。

Music Assistant

如果你尚未建立完善的音乐系统,Music Assistant 可能会更适合你。但在我已拥有 Gonic、Snapcast 和 MPD 的情况下,Music Assistant 的行为令人困扰。它似乎试图“接管”所有设备,例如不断重新排列我的 Snapcast 设备组。

邮件

自托管邮件服务似乎投入产出比极低,我无法承担无法收发邮件的风险。最终我希望逐步转向付费邮件服务商,彻底摆脱 Gmail。

结论

目前我正在运行 17 个原生服务和 11 个 Podman 容器,全部由 systemd 管理。htop 显示当前内存占用约 7.5 GB,CPU 使用率在 30% 至 40% 之间波动。令人惊讶的是,这台迷你电脑竟然能承载如此多的服务!在人工智能热潮推高硬件成本的当下,我希望看到更多注重简洁性与效率的自托管项目持续涌现。