从流媒体到全栈自托管:一台迷你主机的 28 项服务实践
在自主托管(Self-hosting)领域深耕多年后,一位开发者分享了其家庭实验室的最新架构。该案例展示了如何利用一台配置有限的硬件设备,替代 Netflix、Disney+、Spotify 等主流订阅服务,并运行包括媒体中心、智能家居控制、备份管理及开发工具在内的完整生态。

作者早期曾在大学宿舍通过 Linux 主机运行网站,并长期维护 MythTV 和 XBMC(现 Kodi)。近期结束在印度的旅居生活后,尽管当地流媒体服务价格低廉,但为了规避“自动播放”带来的儿童观看限制冲突以及频繁的服务条款变更,作者决定彻底切断对云端订阅的依赖,转而部署基于 Jellyfin 的本地媒体解决方案。这一转变不仅消除了对特定平台算法推荐的困扰,还让作者重新获得了对软件升级节奏的控制权。
核心部署原则
该系统的构建遵循三项基本原则:
- 网络隔离与安全:除路由器上的 VPN 服务器外,不向公共互联网直接暴露任何服务。鉴于 ISP 使用 CGNAT 导致 IPv4 不可达,VPN 仅通过 IPv6 公开路由。这种设计虽然限制了部分移动网络的连接便利性,但有效抵御了潜在的黑客攻击风险。
- 轻量化与原生优先:倾向于运行单一二进制文件的服务,避免复杂的多容器依赖链。对于非关键业务,优先选择原生语言实现以提升效率;若必须使用容器,则追求极简依赖。
- 弃用 Docker,转向 Podman + systemd:不再使用 Docker,而是采用 Podman 配合 systemd 进行服务管理。Podman 与 systemd 的良好集成简化了运维流程,避免了进入容器执行调试命令的繁琐步骤。
硬件配置
整套系统运行在一台 Beelink S12 Pro Mini PC 上。该设备于去年购入,当时价格为 180 欧元(约合人民币 1400 元),而目前同款产品在亚马逊的售价已涨至 359 欧元。存储方面,连接了一块 6TB 硬盘用于媒体库。针对社区关于 16GB 内存是否足够的疑问,作者指出,通过合理的资源优化,该硬件足以支撑大量服务运行,且未涉及本地 AI 推理负载。
已部署服务清单
目前系统共运行 28 项服务,其中 17 项为原生安装,11 项通过 Podman 容器化部署。以下是具体列表及功能说明:
财务与数据管理
- Actual Budget (Podman):用于日常开支预算及支票/储蓄账户管理。作者每月手动导入 OFX 或 CSV 格式的交易记录,而非使用自动银行接口。投资账户仍由云服务跟踪。
- PocketBase (Native):用于追踪 HSA、529 等特殊账户的交易和收据。相比之前的 SQLite 文件直接访问方式,PocketBase 提供了 Web 管理前端,同时底层仍保留 SQLite 以支持任意查询。
- Vikunja (Podman):替代 Trello 的任务管理工具。默认使用 SQLite,支持单一二进制部署,避免了引入 PostgreSQL 或 MySQL 的复杂性。
媒体与娱乐
- Jellyfin (Podman):核心媒体服务器,用于电影、电视及家庭视频播放。作者偏好 720p 分辨率以平衡画质与资源消耗,DVD 转录内容通常为 480p/576p。
- Audiobookshelf (Native):有声书与播客管理。主要用于为孩子设置内容,取代了 PlayerFM 和 Pocket Casts。
- Automatic Ripping Machine (ARM) (Podman):自动化 DVD 转码工具。尽管蓝光支持存在,但主要用途仍是处理双语内容的 DVD 资源。
- Gonic (Native):基于 Go 语言的 Subsonic 兼容音乐服务器。作为旧版 Subsonic 许可证持有者,Gonic 被用于移动端音乐流式传输。
- MPD (Music Player Daemon) (Native):运行两个实例,分别服务于音乐和播客。作者认为这一存在 23 年的方案依然高效稳定。
- Snapcast (Native):全屋同步音频系统,类似 Sonos 但无供应商锁定。配置复杂但运行良好,计划后续增加专用接收器。
- Yubal (Podman):Web 应用,用于下载 YouTube 音乐播放列表。视频下载通常使用 yt-dlp,手机端则使用 NewPipe。
- slskd (Native):Soulseek 协议客户端,用于点对点音乐分享。
基础设施与监控
- Caddy (Native):反向代理与 Web 服务器。通过本地 DNS 和 HTTPS 子域名统一访问内部服务,简化了新服务的接入流程。
- Backrest (Native):Restic 备份工具的 Web 界面。负责照片(Immich)等关键数据的去重压缩备份,并通过 Gotify 发送故障通知。
- Beszel (Native):轻量级监控仪表板,收集 CPU、内存、磁盘及温度数据,用于监控家庭内其他主机(如 Raspberry Pi 和 Proxmox 集群)。
- Cockpit (Native):基于 Web 的服务器管理控制台,主要用于快速发现服务失败情况。
- Gotify (Native):简单的通知服务。接收来自各应用的 HTTP POST 消息,涵盖服务停机、新播客发布、儿童观看记录等信息。
- Homepage (Podman):仪表盘服务,提供所有自托管应用的快速链接和状态概览。
- Kuma (Podman):Uptime Kuma 类监控工具。检查 Podman 容器状态、HTTP 响应码及 JSON 健康检查细节,异常时触发 Gotify 通知。
- Samba (Native):文件共享协议,用于家庭内部文件复制与共享。
- SyncThing (Native):单向同步工具,将 Immich 中的照片实时备份至 MacBook 的外部驱动器。
智能家居与安全
- Frigate (Podman):网络视频录像机(NVR),集成 Home Assistant。管理 8 个 IP 摄像头,利用低分辨率 RTSP 子流进行运动检测,避免高负载。具备车道入侵警报及联动照明功能。
- Home Assistant (Podman):智能家居中枢。相比 Google Home 或 Alexa 等封闭生态,Home Assistant 提供了更高的灵活性和控制权,尽管需考虑服务器单点故障风险。
- VaultWarden (Podman):Bitwarden 的开源 API 兼容实现。替代 LastPass,提供密码管理服务。LAN 内自动同步,外部通过 VPN 手动触发同步。作者担忧 Bitwarden 未来可能破坏兼容性。
开发与阅读
- Forgejo (Native):Gitea 分支,作为私有 Git 远程仓库。计划后续部署 CI/CD 流水线。
- Fresh RSS (Native):Web RSS 阅读器。主要用于订阅自托管项目的 GitHub Release 页面,以便及时获取版本更新信息。
- Readeck (Native):网页存档工具。相比 Wallabag,它能更好地保存付费墙后的内容,确保离线可读性。
评估后放弃的方案
作者在尝试多种流行自托管方案后,因资源消耗、复杂度或体验不佳而放弃了以下服务:
- The *arr Stack (Sonarr/Radarr/Lidarr):被认为资源密集且易碎,违背了简单高效的初衷。
- Collabora Online:虽然能替代 Google Docs,但在已有局域网共享驱动器的情况下,本地 LibreOffice 更为便捷。
- Firefly III:多币种支持虽好,但容器结构复杂。作者最终选择 Actual Budget 配合自定义脚本处理汇率转换。
- OwnTracks / Dawarich:位置追踪方案。OwnTracks Android 端报告不稳定;Dawarich 需要至少四个容器(PostgreSQL, Redis, Sidekiq, Web),投入产出比不高。
- Music Assistant:试图接管 Snapcast 设备组,与现有的 Gonic/Snapcast/MPD 组合冲突。
- 自托管电子邮件:维护成本高且风险大,计划未来迁移至付费提供商而非自建 SMTP 服务器。
结语
当前系统状态下,htop 显示内存占用约 7.5 GB,CPU 负载在 30% 至 40% 之间波动。这一实践表明,即便在 AI 算力需求推高硬件价格的背景下,通过精心选型和架构优化,普通的迷你主机仍能承载丰富的数字生活需求。作者呼吁社区关注那些优先考虑简洁性与效率的自托管项目。





