个人 VPS 入门
这组笔记记录的是一条稳妥的个人服务器建设路线:先确认机器身份,建立不会把自己锁在门外的远程访问,再安装容器运行环境和共享入口,最后用 RSSHub 验证第一个真实应用部署路径。Phase 3 仍是影子部署:新 RSSHub 已经可用,但既有 feed consumer 继续使用本地 RSSHub,尚未切换生产消费者。
如果还在选择应用运行在哪里,可以把这里的自管服务器方案与 Cloudflare Workers、Google Cloud 的 Cloud Run 教程对照阅读。后两篇介绍托管运行、权限、存储和计费;这组笔记着重说明怎样维护 Linux 主机本身。
先看整体:这台服务器有两扇门
可以先把 VPS 想成一间放在互联网上的机房。现在有两条完全不同的进入路线:
- 管理入口只给自己使用:WSL2 先走 Tailscale 私网,再由 OpenSSH 验证密钥并打开远程终端。
- 网站入口给互联网访客使用:所有公开 HTTP/HTTPS 请求先到 Caddy,再由 Caddy 决定交给哪个网站或 API。
Uptime Kuma 是管理工具,不是公共网站。它没有公网入口;自己查看时,要临时建立一条 SSH 隧道。
[自己:WSL2]
`-- Tailscale 私人道路
`-- OpenSSH 上锁的管理门
`-- [Ubuntu VPS]
[互联网访客]
`-- TCP 80/443
`-- Caddy 公共前台
|-- 基础设施健康检查
`-- infra-edge 内部走廊 -> RSSHub:1200
[VPS 内部]
|-- Docker:分别运行 Caddy、Uptime Kuma 与 RSSHub
|-- UFW:控制哪些主机端口允许进入
|-- Uptime Kuma:只在 127.0.0.1:3001 等待 SSH 隧道
`-- RSSHub:1200 只在 Docker 网络中可达,不发布到主机
[现有本地环境]
`-- feed consumer -> 本地 RSSHub(继续作为生产路径和回退)
这里有三层经常被混为一谈:
- 网络可达性决定数据包能否到达 VPS。
- OpenSSH提供加密会话并验证服务器身份。
- SSH 公钥认证证明登录者拥有对应私钥。
Tailscale 在这套结构中只提供私有网络路径。真正监听 22 端口和验证用户公钥的仍是 Ubuntu 的 OpenSSH;没有启用另一个名为 Tailscale SSH 的产品功能。
先认识这些词
当前安装或启用的工具
以下组件在 Phase 1 至 Phase 3 中实际安装、启用或明确配置。先用生活类比理解职责,再记技术名字就容易得多。
负责“让我安全登录”的工具
Tailscale 和 OpenSSH 不是同一个东西:Tailscale 负责把路铺到服务器,OpenSSH 负责到门口后验钥匙。
负责“运行服务”的工具
当前三套说明书分别放在 /srv/caddy/compose.yaml、/srv/uptime-kuma/compose.yaml 与 /srv/rsshub/compose.yaml。它们互相独立,所以重启 RSSHub 不会顺手重启公网入口或监控。
负责“公网入口与监控”的工具
Caddy 和 RSSHub 都加入了名为 infra-edge 的 Docker 网络。它可以被理解成“前台通往网站服务的内部走廊”:Caddy 通过别名 rsshub-prod 找到 RSSHub,但 RSSHub 不需要把 1200 端口开放给主机或互联网。Kuma 不加入这条公网代理路径;它继续只通过 SSH 隧道管理。
我平时什么时候会碰到它们?
- 登录 VPS:确认 Tailscale 已连接,然后使用
ssh;背后由 Tailscale、UFW 和 OpenSSH 一起完成。 - 启动、停止或查看服务:使用
docker compose;通常不直接操作 Docker 的底层文件。 - 访问 Kuma:先建立 SSH 本地转发,再打开
http://127.0.0.1:3001;不要把 3001 改成公网端口。 - 查看公开健康状态:访问 Caddy 提供的 HTTPS
/healthz地址。 - 使用 RSSHub:消费者访问 HTTPS 域名并携带 ACCESS_KEY;密钥只从受保护的 VPS
.env交给受信任消费者,不写入公开笔记或监控 URL。 - Buildx:只有需要自己构建镜像时才使用,日常运维通常不用碰。
记住这三条边界就够了
- 公网能进入的只有 TCP 80/443,并且先到 Caddy。
- SSH 只走 Tailscale 私网;公网 SSH 保持阻断。
- Kuma 只监听 VPS 自己的
127.0.0.1:3001,通过 SSH 隧道查看。 - RSSHub 的 1200 不绑定主机地址,只能由
infra-edge内的 Caddy 访问。
UFW 显示 active 也不能单独证明 Docker 端口安全,因为 Docker 有自己的端口转发规则。每次新增服务都要同时检查 Compose 端口、Docker 实际绑定和外部连接结果。具体命令见在现有服务旁增加新服务,部署时间线见构建日志。
推荐阅读顺序
- 架构、安全边界与基础命令
- SSH 密钥登录与安全加固
- Tailscale 私网与 OpenSSH
- UFW 防火墙与防锁死流程
- Docker Engine 与 Compose
- 目录布局、验证与日常运维
- Tmux 实用指南
- 在现有服务旁增加新服务
- RSSHub 生产影子部署
四条最高优先级规则
- 每条命令先确认是在 本地 WSL2 还是 远程 VPS 执行。
- 永远不要删除最后一条已验证的 SSH 访问路径。
- 修改 SSH 或防火墙后,用一个全新的连接验证;旧会话存活不等于新连接可用。
- 私钥、密码、认证令牌和恢复码不进入命令输出、笔记、Git 或聊天记录。
示例变量
本系列用占位符代替真实机器信息:
VPS_USER=ubuntu
VPS_PUBLIC_IPV4=<public-ip>
TAILSCALE_IPV4=<100.x.x.x>
LOCAL_SSH_PUBLIC_KEY="$HOME/.ssh/id_ed25519.pub"
不要把密码、私钥或 Tailscale auth key 保存成这些变量。
当前完成边界
Phase 1 至 Phase 3 完成后,当前得到一台:
- 系统已更新、主机名和时区正确的 Ubuntu VPS;
- 只能用公钥认证、禁止 root 直接登录的 OpenSSH 服务器;
- 可以通过 Tailscale 私网建立 OpenSSH 会话的机器;
- 公网仅开放未来 Web 入口 80/443,不再普遍开放 22;
- Docker、Buildx 与 Compose 可用,Caddy、Uptime Kuma 和 RSSHub 分属独立 Compose 项目;
- Caddy 是唯一公网容器入口,Kuma 管理界面保持 loopback-only;
- RSSHub 使用官方固定摘要镜像、内存缓存和 ACCESS_KEY,并且没有主机端口;
- 公网 HTTPS 健康检查、未认证拒绝、认证真实路由、监控和应用重启都已验证;
/srv已保存服务配置与持久数据,但“有数据目录”不等于“有备份”;- 能用 Tmux 保持运维会话,并按独立 Compose 项目逐步增加服务。
feed consumer 的生产配置、持久数据、调度器和本地 RSSHub 均未改变。消费者切换、数据备份与恢复证明、调度迁移和本地回退退役决定属于 Phase 4。