如果你刚接触这个领域,下面先说说它的意义,以及它真实的成本。
Self-hosting 指的是在你控制的硬件上运行软件,而不是付费让别人替你运行。通常的动机包括:成本(一套每月 10 美元、永久付费的照片库,与一次性购买的硬盘相比)、隐私(你的文件和观看记录留在家里)、控制权(没人可以更改条款、提高价格或停止产品服务),以及学习(这是练习基础设施技能的最佳环境,而且最终产出的东西确实会被你的家庭使用)。
代价是:你现在就是运维团队。备份由你负责。安全更新由你负责。晚上 9 点系统出问题,而有人想看电影时,这也由你负责。要让这件事长期可持续,有两条规则——所有真正这样做过的人,都是经过惨痛教训才学会的:
从一个服务开始。 不要一上来就九个。先让一个服务运行起来,使用一个月,了解维护它需要做什么,然后再添加下一个。最常见的失败方式,就是一个周末部署十几个服务,到三月份时全部弃之不顾。
没有备份,就等于不存在。 自托管照片的吸引力在于你可以控制它们。自托管照片的风险也在于你可以控制它们,而单个硬盘故障就可能造成永久损失。文章末尾会详细讲这个问题,因为这是人们最容易跳过的部分。
下面几乎所有内容都以 Docker 容器的形式运行,这是目前执行这类操作的标准方式。示例使用 Docker Compose,因为你提交的 compose.yaml 文件既能自我说明,又具备可复现性。
1. Docker 和 Docker Compose
它不是一个服务,而是其他一切所依赖的基础。
在自托管软件以容器形式打包之前,安装两个分别需要不同 PHP 版本的应用,足以让你度过一个真正糟糕的下午。容器让每个服务都成为拥有自身依赖的独立单元,而 Compose 则用一个文件管理由这些单元组成的栈。
从一开始就值得采用的目录结构是:每个服务使用一个目录,配置和数据放在对应目录中:
/srv/
├── compose.yaml
├── .env
├── jellyfin/
│ ├── config/
│ └── cache/
├── immich/
│ ├── library/
│ └── postgres/
└── backups/
以及一个用于设定后续可复用模式的 compose.yaml:
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
volumes:
- ./uptime-kuma/data:/app/data
ports:
- "3001:3001"
environment:
- TZ=America/New_York
其中有四点比看起来更加重要:
restart: unless-stopped表示服务会在断电或重启后恢复运行。没有它,你可能六周后才发现自从那场暴风雨以来什么都没有运行。使用绑定挂载(
./uptime-kuma/data),而不是命名卷,意味着你的数据位于一个可以直接看到的目录中,可以使用任何普通工具进行备份,也可以复制到新机器上。命名卷会将数据隐藏在 Docker 的内部存储中,使备份更加麻烦。固定主版本(使用
:1,而不是:latest)。某天你睡觉时,latest可能会拉取一个包含破坏性变更的主版本。设置
TZ。 否则所有时间戳和定时任务都会以 UTC 运行,让“备份为什么凌晨 3 点运行”变得令人困惑。
为什么这很重要: 这是可以迁移的技能。Compose 文件、卷、网络、环境变量和健康检查都是你在专业工作中会使用的相同概念,而家庭服务器是一个低风险、可以熟练掌握这些概念的地方。通常的下一步是使用 Portainer 为容器提供 Web UI;如果你希望使用专门管理 Compose 文件、同时又将其作为磁盘上普通可读文件保存的工具,则可以使用 Dockge。
2. Tailscale
无需开放任何端口即可远程访问,也是第一个应该安装的工具。
之所以把它放在前面,是因为它会改变其他所有服务的安全态势。传统上,从外部访问家庭服务需要在路由器上进行端口转发——这会将服务放到公共互联网中,几分钟内就会遭到扫描,之后还会持续受到攻击。
Tailscale 基于 WireGuard 构建了一个私有网状网络。在服务器、手机和笔记本电脑上安装它之后,无论设备身在何处,它们都可以彼此直接访问,并且通信经过加密,同时不会有任何内容暴露在公共网络上。
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
你的服务器会在私有网络中获得一个稳定地址,可以被你的设备访问,而其他设备无法访问。下面有两个值得立即配置的功能:
MagicDNS 为设备提供真实名称,因此你可以在使用移动数据的手机上访问 http://homeserver:8096。
子网路由 通过一台设备暴露整个家庭网络,这样你就可以访问无法运行 Tailscale 的设备——例如打印机、NAS 和智能插座:
sudo tailscale up --advertise-routes=192.168.1.0/24 --accept-routes
为什么它有效: 它消除了自托管中最大的风险。这里的大多数软件由小团队或单个志愿者维护,其中一些最终会出现严重漏洞。在 Tailscale 后面运行时,媒体服务器中的漏洞只会对已经位于你私有网络中的人构成问题——也就是你自己。在公共互联网上,它会成为所有扫描器用户的问题。
截至本文撰写时,免费层足以轻松覆盖个人设置(100 台设备、3 名用户)。如果你不希望依赖某家公司的协调服务器,Headscale 是一个可以自行运行的控制平面开源实现,而 Netbird 则是整个方案的完全开源替代品。
你仍然需要公共端点的唯一情况,是你希望与不愿安装任何东西的人共享某项服务——这正是第 9 节中的反向代理发挥作用的地方。
3. Immich
用于替代 Google Photos 的工具,也是人们开始自托管最常见的原因。
Immich 是一个照片和视频库,提供 iOS 和 Android 移动应用,可以在后台自动备份相机胶卷中的内容——正是这个功能让它成为真正的替代品,而不只是一个存储盒子。
services:
immich-server:
image: ghcr.io/immich-app/immich-server:release
restart: unless-stopped
volumes:
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
env_file: [.env]
ports: ["2283:2283"]
depends_on: [redis, database]
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:release
restart: unless-stopped
volumes:
- model-cache:/cache
env_file: [.env]
redis:
image: docker.io/valkey/valkey:8-bookworm
restart: unless-stopped
healthcheck:
test: redis-cli ping || exit 1
database:
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
volumes:
model-cache:
机器学习容器正是让它具备商业产品体验的原因:人脸识别和分组、物体与场景检测,以及使用自然语言进行语义搜索——输入“雪中的红色汽车”,就能找到照片,无需任何人事先添加标签。所有处理都在你的硬件上运行,没有任何图像离开你的家。
它在实际使用中还提供其他重要功能:支持共享相册的多用户功能、基于 EXIF 位置信息的地图视图、“记忆”(例如“今天是三年前的这一天”)、RAW 支持,以及通过链接分享相册。
为什么它有效: 这是自托管中最清晰的价值主张。使用付费云计划保存家庭照片库,意味着永久性的周期性账单,以及对某家公司产品决策的依赖。而将同一个照片库保存到自己拥有的硬盘上,只需要一次性的硬件成本。而且与大多数自托管替代品不同,它的移动应用足够优秀,你的家人也会使用,而不会抱怨。
有两点需要注意。它目前仍处于 1.0 之前的阶段,并且会发布破坏性变更——更新前请阅读发行说明,并固定版本,而不是盲目跟踪 release。此外,这是整个设置中最重要、最需要备份的内容,因为照片无法替代。在将唯一副本交给它保管之前,请先阅读第 10 节。
4. Jellyfin
无需账户、无需订阅、无需遥测的媒体流式传输。
Jellyfin 是一个用于电影、电视节目、音乐和书籍的媒体服务器。它会索引你的文件、获取封面和元数据,并将内容流式传输到手机、平板电脑、浏览器、智能电视、Roku、Kodi 等设备上的应用。
services:
jellyfin:
image: jellyfin/jellyfin:10
container_name: jellyfin
restart: unless-stopped
user: "1000:1000"
volumes:
- ./jellyfin/config:/config
- ./jellyfin/cache:/cache
- /srv/media/films:/media/films:ro
- /srv/media/tv:/media/tv:ro
ports:
- "8096:8096"
devices:
- /dev/dri:/dev/dri # Intel/AMD GPU for hardware transcoding
environment:
- TZ=America/New_York
其中有两行值得特别注意。
媒体挂载上的 :ro。 对容器而言,你的媒体库是只读的。漏洞或入侵无法删除你的文件。媒体_服务器_没有任何理由需要对媒体拥有写入权限。
用于硬件转码的 /dev/dri。 这决定了服务是使用愉快还是令人沮丧。当客户端无法原生播放某个文件时——例如编解码器不匹配、带宽受限或需要烧录字幕——服务器必须实时进行转码。使用软件转码会占满 CPU,单个 4K 流就可能让系统不堪重负。而使用配备 QuickSync 的 Intel iGPU,同样的转码几乎不消耗额外资源,机器可以同时处理多个流。如果你要为此购买硬件,配备集成显卡的新款 Intel 芯片是你能做出的最佳性价比选择。
为什么它有效: 它完全免费且开源,没有付费层、没有账户要求,也不会向外部服务器回传信息。Plex 是主要替代品,产品打磨得更完善,客户端应用更好,远程分享也更简单,但它需要账户,会将部分内容通过自己的服务器进行路由,并且随着时间推移将一些功能置于订阅之后。Emby 处于两者之间。Jellyfin 的优势在于,没有任何功能会在未来被收回。
5. Pi-hole 或 AdGuard Home
全网络广告拦截,也是这份列表中最快见效的工具。
两者做的是同一件事:作为网络的 DNS 服务器运行,并拒绝解析属于广告网络和跟踪器的域名。效果立竿见影,并且适用于每一台设备——手机、平板电脑、智能电视、游戏主机、IoT 设备——包括那些无法安装浏览器扩展的设备。
AdGuard Home 更适合初学者,因为它内置了加密 DNS:
services:
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
restart: unless-stopped
volumes:
- ./adguard/work:/opt/adguardhome/work
- ./adguard/conf:/opt/adguardhome/conf
ports:
- "53:53/tcp"
- "53:53/udp"
- "3000:3000/tcp"
然后将路由器的 DHCP 设置为分发服务器的 IP 作为 DNS 服务器,这样网络中的每台设备都会受到保护,无需逐台配置。
Pi-hole 是历史更悠久、知名度更高的项目,拥有更大的社区和更多第三方拦截列表。AdGuard Home 原生支持上游 DNS-over-HTTPS 和 DNS-over-TLS,以及无需插件的按客户端规则。两者任选其一即可;不要同时运行。
为什么它有效: 浏览速度明显更快,移动数据用量更少,而且智能电视也不会再不断向外报告家庭网络活动。整个设置大约需要十五分钟。
有两件事需要提前规划,因为它们会让所有人都遇到问题:
它现在成为单点故障。 如果容器停止运行,DNS 就会停止,而对家里的每个人来说,这就意味着“互联网坏了”。在路由器中配置一个不是你的 Pi-hole 的备用 DNS 服务器,或者接受重启时需要格外小心这一事实。
有些东西会出问题。 某些应用和流媒体服务使用的域名可能出现在拦截列表中。解决方法是将特定域名加入白名单;第一次遇到购物应用无法加载时,知道这是原因所在,可以省下一个小时的困惑排查时间。
6. Vaultwarden
只需大约 40 MB 内存,就能拥有自己的密码管理器服务器。
Vaultwarden 是使用 Rust 对 Bitwarden 服务器进行的非官方重新实现。它使用相同的协议,因此官方 Bitwarden 应用和浏览器扩展无需任何修改即可连接使用——你可以获得经过良好打磨、经过充分审计的客户端,同时服务器由你自己运行。
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- DOMAIN=https://vault.example.com
- SIGNUPS_ALLOWED=false # set true, make your account, set back
- ADMIN_TOKEN=${ADMIN_TOKEN}
volumes:
- ./vaultwarden/data:/data
ports:
- "8080:80"
它还解锁了 Bitwarden 托管计划中需要付费的功能——组织、文件附件和 TOTP 代码存储——因为没有人会向你收费。
为什么它有效: 它体积小、稳定,而客户端则是由其他人维护良好的部分。官方 Bitwarden 应用经过审计且质量优秀,对于一个保存你所有凭据的软件来说,这一点极其重要。
这项服务有三条特别需要遵守的规则,因为它的重要性高于这里的其他任何服务:
绝不要将它直接暴露到互联网。 使用 Tailscale,或使用带 TLS 的反向代理,并且最好在前面再增加一层身份验证。
创建账户后设置
SIGNUPS_ALLOWED=false,否则任何找到它的人都可以注册。单独备份,并测试恢复。 密码数据库损坏且没有可用备份,是一种很难挽回的糟糕情况。客户端会在本地缓存你的保险库,这能为你争取一些时间,但不要依赖这一点。
7. Home Assistant
本地智能家居控制,也是这里最容易深陷其中的领域。
Home Assistant 可以连接几乎所有制造商生产的智能家居设备,并在所有设备之上提供一个统一界面和自动化引擎——一切都在本地运行,因此即使互联网断开,你的灯也能正常工作。
它的集成目录规模正是其价值所在:超过一千种集成,涵盖 Zigbee、Z-Wave、Matter、Thread、WiFi 设备,以及大量可以本地控制的硬件。自动化可以使用 YAML 或可视化编辑器:
automation:
- alias: "Away mode"
trigger:
- platform: state
entity_id: group.family
to: "not_home"
for: "00:10:00"
condition:
- condition: time
after: "08:00:00"
before: "22:00:00"
action:
- service: light.turn_off
target:
entity_id: all
- service: climate.set_temperature
target:
entity_id: climate.main
data:
temperature: 16
- service: notify.mobile_app
data:
message: "House set to away mode"
为什么它有效: 跨厂商协作是你无法直接购买的能力。一个厂商的运动传感器触发另一个厂商的灯,再由第三个厂商的设备发送通知,在这里十分正常,而在任何单一厂商的应用中都不可能实现。本地控制是另一半——依赖云端的智能家居设备会在厂商服务器宕机或厂商停止运营时变得毫无用处,而本地控制的设置不会。
将它与 Zigbee2MQTT 和一个 USB coordinator 配合使用,你的 Zigbee 设备就完全不再需要厂商提供的网关。
坦诚地说:这是列表中耗时最多的项目,而且远远超过其他项目。它真正算得上是一种爱好,而不是一个下午就能完成的事情。请据此安排时间,并从三个设备开始,而不是一上来就重新布线整栋房子。
8. Uptime Kuma
只需十行配置即可完成监控,让你在家人发现问题之前就知道服务出了故障。
Uptime Kuma 会监视你的服务,并在某个服务停止响应时通知你。
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
volumes:
- ./uptime-kuma/data:/app/data
ports:
- "3001:3001"
它可以检查 HTTP 端点(包括状态码和关键字匹配)、TCP 端口、DNS 记录、ping,以及通过 socket 直接检查 Docker 容器,还能检查 TLS 证书过期时间,并支持九十多种通知集成。
为什么它有效: 家庭服务器的故障模式是无声的。某个容器退出,没有任何东西告诉你,而你可能两周后才发现某张照片从未备份,因为服务当时已经停止。监控可以将这种情况转化为当天就能收到的通知。
除了显而易见的检查之外,还有两项值得添加:
证书过期时间,如果你使用带 TLS 的反向代理。证书续期会一直自动进行,直到某一天不再自动进行。
为备份任务设置 push monitor。 Uptime Kuma 可以提供一个 URL,让你的备份脚本在成功时使用 curl 访问它。如果它没有按计划被调用,你就会收到告警——这可以发现已经默默失败一个月的备份任务,而这正是家庭服务器最常见、也最令人痛苦的故障。
9. Caddy
只需几乎为零的配置,就能为你的服务启用 HTTPS。
当你运行多个服务后,通过端口号访问它们会变得令人厌烦,而且它们都没有证书。反向代理可以在所有服务前面提供易记的名称和 TLS。
Caddy 是值得选择的工具,因为它会自动获取和续期证书。完整配置如下:
jellyfin.example.com {
reverse_proxy jellyfin:8096
}
photos.example.com {
reverse_proxy immich-server:2283
}
vault.example.com {
reverse_proxy vaultwarden:80
# only reachable from the local network and Tailscale
@external not remote_ip 192.168.1.0/24 100.64.0.0/10
respond @external "Not found" 404
}
这是一个完整且可运行的配置,三个名称都会获得有效的 Let's Encrypt 证书,并自动续期,同时 HTTP 会重定向到 HTTPS。不需要 certbot,不需要 cron 任务,也不需要续期钩子。
如果你拥有域名,DNS-01 challenge 允许你为完全无法从公共网络访问的名称获取证书——因此仅限内部使用的服务也可以获得真正的 TLS:
*.home.example.com {
tls {
dns cloudflare {env.CF_API_TOKEN}
}
reverse_proxy /jellyfin/* jellyfin:8096
}
为什么它有效: 自动 HTTPS 将一项杂务变成无需操心的事情,而配置文件短到可以一眼看懂。Traefik 是主要替代品,功能更强大——它可以通过 Docker labels 自动发现容器,在大规模环境中非常优秀——代价是需要理解明显更多的配置概念。Nginx Proxy Manager 是第三种选择,提供 Web UI,适合更愿意点击而不是编辑文件的人。
需要说明其使用范围:反向代理用于提供便利和 TLS。对于任何敏感服务,它不能替代 Tailscale。上面的 @external 块是更加严密的版本——使用公共名称和真实证书,但只响应你自己的网络。
10. Restic
它让上面的一切都可以安全依赖,也是人们最容易跳过的工具。
这里的每项服务都保存着你不愿丢失的数据,而家庭服务器只要经历一次硬盘故障、在错误目录执行一次 rm -rf,或遭遇一次勒索软件感染,就可能一次性失去所有数据。Restic 是一款快速、加密、支持去重的备份工具,而且足够简单,让你今天就能配置好,而不是一直打算配置却迟迟不动手。
export RESTIC_REPOSITORY="b2:my-home-backup:/srv"
export RESTIC_PASSWORD_FILE="/root/.restic-password"
restic init # once
restic backup /srv \
--exclude='/srv/*/cache' \
--exclude='**/node_modules' \
--tag home
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
备份会在客户端进行加密,因此廉价的对象存储提供商永远无法看到你的明文数据。它在块级别进行去重,因此一个几乎没有变化的照片库,即使保存一百个每日快照,所占空间也不会比单个快照多多少。恢复过程也很直接:
restic snapshots
restic restore latest --target /tmp/restore --include /srv/immich
restic mount /mnt/backup # browse snapshots as a filesystem
restic mount 是让这项工具在实际中真正可用的功能——你可以将每个历史快照作为普通目录树浏览,并复制出所需的单个文件。
可以通过 cron 或 systemd timer 执行以下完整流程:
#!/usr/bin/env bash
set -euo pipefail
docker compose -f /srv/compose.yaml exec -T database \
pg_dump -U immich immich | gzip > /srv/backups/immich-$(date +%F).sql.gz
restic backup /srv --exclude='/srv/*/cache' --tag home
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
restic check --read-data-subset=5%
curl -fsS -m 10 "https://uptime.example.com/api/push/abc123" # tell the monitor
其中有三个细节真正发挥着作用。单独导出数据库——服务器运行时直接复制 Postgres 文件,生成的备份可能无法恢复。restic check --read-data-subset 会验证部分已存储数据是否可读,从而发现静默损坏。末尾的 push 通知意味着备份停止运行时会变成告警,而不是等到最后才让你感到意外。
为什么这很重要: 目标是遵循 3–2–1 规则——三份副本、两种介质、其中一份位于异地。你的服务器是第一份副本。外部硬盘是第二份副本。廉价的对象存储(Backblaze B2、Cloudflare R2、Wasabi——以家庭规模计算,每月只需几美元)是能够在火灾或盗窃中幸存的异地副本。
还有一件不可省略的事情:今天就恢复一些内容。 从未恢复过的备份只是一种假设。选择一个文件,将它恢复到 /tmp,确认它可以打开。在日历中设置提醒,每六个月重复一次。这个爱好中的每个资深玩家,都有一个关于备份从三月份开始默默失败、却无人察觉的故事。
A Starting Point
如果你从零开始,下面的顺序会优先建立安全保障,并避开常见错误:
在一台持续运行的机器上安装 Docker 和 Compose。 一台旧台式机或配备新款 Intel 芯片的迷你 PC 是理想选择;Raspberry Pi 可以运行轻量服务,但处理照片机器学习和视频转码时会比较吃力。
先安装 Tailscale,再让任何东西可访问。现在就决定不进行端口转发。
安装 Uptime Kuma,这样某个服务停止时你能及时发现。
使用异地仓库配置 Restic,然后再将任何不可替代的数据放到这台机器上。执行一次测试恢复。
选择一个真正需要的服务——通常第一个会选择 Immich 或 Jellyfin。
使用它一个月。然后再添加下一个。
第 2 到第 4 步只需要一个晚上,却是一个能够持续的爱好与一个以丢失照片库告终的爱好之间的区别。
Conclusion
引言中的两条规则就是整篇文章的核心,值得再次强调,因为几乎每个人都是以昂贵的方式学会它们的。从一个服务开始,而不是九个——这个爱好的失败模式是一个充满热情的周末,接着是一打无人维护的容器。并且,没有备份,就等于不存在——让自托管具有吸引力的原因是你可以控制自己的数据,而让它变得危险的原因恰恰也是这一点。
在安装任何值得保护的东西之前,先安装 Tailscale。 端口转发会将由志愿者维护的软件直接放到公共互联网上,几分钟内就会被扫描器发现。在 WireGuard 网状网络中,媒体服务器中的漏洞只会对已经位于你私有网络中的人构成问题,也就是你和你的家人。这个决定可以消除其他所有部分的大部分风险。
使用 Restic 将数据备份到异地,并在今天恢复一些内容。 它支持客户端加密和去重,而 restic mount 允许你像浏览普通目录一样浏览任意历史快照。单独导出数据库,而不是复制正在使用的数据库文件;运行 restic check --read-data-subset 来发现静默损坏;让脚本在成功时 ping Uptime Kuma 的 push monitor——因为最常见的备份故障并不轰轰烈烈,而是一个任务在三月份悄悄停止运行,却没有任何人注意到。从未恢复过的备份只是一种假设,而不是备份。
Immich 是大多数人开始自托管的原因,而且它确实值得。 自动手机备份、人脸分组,以及无需任何人添加标签就能找到“雪中的红色汽车”的自然语言语义搜索——全部运行在你的硬件上。它目前也处于 1.0 之前的阶段,并且会发布破坏性变更,因此请固定版本,在更新前阅读发行说明,并将它的数据视为备份计划中最重要的内容。
有两个配置细节值得在所有地方复用。 对于只需要读取媒体的服务,将媒体以只读方式挂载(:ro),这样漏洞或入侵就无法删除你的媒体库。并且将 /dev/dri 传入 Jellyfin,以支持硬件转码——配合新款 Intel iGPU,这决定了一个 4K 流会占满 CPU,还是可以免费同时运行多个 4K 流。如果你正在选择硬件,这是可用的最佳性价比决策。
安装 Pi-hole 或 AdGuard Home 后,要预期它会立即成为关键基础设施。 全网络拦截是这里见效最快的功能,只需十五分钟即可完成,但你的 DNS 服务器现在已经成为单点故障,整个家庭都会将其体验为“互联网坏了”。在路由器中配置备用 DNS,并知道偶尔出现的应用故障通常是拦截列表误判,而不是神秘问题。
Vaultwarden 是你将运行的风险最高的服务,因此要区别对待:绝不公开暴露,创建账户后禁用注册,并单独备份且测试恢复。它带来的回报是可以使用 Bitwarden 自己经过审计的应用,对于一个保存你所有凭据的软件来说,这是合理的职责划分。
并且应该尽早运行 Uptime Kuma,而不是拖到最后。 家庭服务器会默默发生故障,这是它们最典型的特征。某个容器退出,没有任何东西发出通知,直到几周后你需要的东西没有被保存,你才发现问题。十行 Compose 配置就能将这种情况变成一条通知,而证书过期和备份 push 检查还能发现另外两种问题——否则它们通常会在最糟糕的时刻暴露出来。
最后,再谈谈除了节省成本之外,为什么这件事值得做。本文中的一切——容器、反向代理、TLS、DNS、私有网络、监控、备份和恢复——都是专业基础设施工作所要求的同一组技能。区别在于,在这里,代价是错过一部电影,而不是一次服务中断;同时这是一个你真正会使用的系统,比教程更适合作为学习工具。家庭服务器是你能搭建的最有用的实验室,而且它还可以存储你的照片。
我的自托管家庭服务器工具文章到此结束。希望这篇文章能对你有所帮助。如果你有任何问题或意见,请告诉我。感谢阅读!

