自托管入门:一台小主机,从零跑起 5 个常用服务
从硬件选型、系统安装、SSH 安全基线,到 Docker、反向代理、外网访问方案和备份,最后给出可以直接用的 5 个服务 compose 配置。
这篇写给还没开始的人。目标很具体:看完之后你能在自己的机器上跑起密码管理、备忘录、服务监控、文件管理、导航面板这 5 个服务,并且知道怎么安全地从外网访问、怎么备份、怎么避免最常见的几种翻车。
一、先想清楚:你真的需要自托管吗
自托管的成本不是钱,是时间。一个服务装好只要十分钟,但它以后需要更新、需要备份、出问题需要排查。所以先自查:
适合自托管的:数据敏感(密码、照片、文档)、用量大被厂商限速、想要长期可用不被涨价或关停、本身喜欢折腾。
不适合的:只是想省钱(时间成本远超订阅费)、没有第二块盘做备份(自托管没有备份等于把数据放在单点故障上)、不能接受偶尔宕机需要自己修。
如果你属于后者,这篇文章看完就当了解原理,别真上。这不是劝退,是省你以后的时间。
二、硬件怎么选
| 选择 | 适合 | 注意 |
|---|---|---|
| N100/N305 迷你主机 | 首选。静音、低功耗(10W 左右)、Intel 核显能硬解 | 买带双网口和 SATA 位的,方便以后扩展 |
| 现成 NAS(群晖/威联通) | 已经有、不想折腾硬件 | ARM 机型不能硬解;Docker 支持受限 |
| 旧笔记本 | 零成本试水 | 硬盘是瓶颈,建议换 SSD;电池老化注意 |
| 树莓派 4/5 | 轻量服务、学习 | 内存小、SD 卡易损,务必用 SSD 启动 |
| 云服务器 | 需要公网 IP、不想管硬件 | 国内 80/443 需备案;带宽小、存储贵 |
内存比 CPU 重要。 上面 5 个服务加起来,2GB 能跑但会很紧,8GB 是舒服的起点。存储单独算:如果你以后要放照片和影视,机械硬盘 + SSD 分开放(系统和服务在 SSD,数据在 HDD)。
三、系统装什么
推荐 Debian 12 最小化安装 或 Ubuntu Server LTS。理由:包管理稳定、Docker 官方支持、社区资料多。
两个替代方案:DietPi 适合树莓派这类单板机,预装了很多优化;OpenMediaVault (OMV) 自带 Web 管理界面,适合完全不想碰命令行的人——但它本质是 Debian 套了一层界面,出问题最后还是要回到命令行。
装完系统先做三件事:
# 1. 系统更新
sudo apt update && sudo apt full-upgrade -y
# 2. 设时区(这步不做,所有服务的日志时间都会错)
sudo timedatectl set-timezone Asia/Shanghai
# 3. 装基础工具
sudo apt install -y curl wget git htop vim rsync
四、安全基线:这 10 分钟不能省
直接暴露在公网的 Linux,平均几小时内就会有扫描器来敲门。四件事按顺序做:
1. 用密钥登录,禁用密码。 在本地机器上:
ssh-keygen -t ed25519 -C "me@laptop"
ssh-copy-id 用户名@服务器IP
确认能免密登录之后,再改 /etc/ssh/sshd_config:
PasswordAuthentication no
PermitRootLogin no
然后 sudo systemctl restart ssh。顺序不能反——先禁密码再传密钥,你会把自己锁在门外。
2. 开防火墙。 只放必要的口:
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable
3. 装 fail2ban,自动封掉暴力破解的 IP:
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
4. 自动安全更新:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
五、Docker 与目录规范
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
重新登录一次让用户组生效。然后建立统一的目录规范——这一步决定了你以后好不好维护:
/srv/
app/ 每个服务的配置和 compose 文件
vaultwarden/
memos/
uptime-kuma/
data/ 持久化数据
backup/ 备份落地点
media/ 影视、照片(以后扩展用)
约定:每个服务一个目录,里面放 docker-compose.yml。这样升级某个服务就是 cd /srv/app/memos && docker compose pull && docker compose up -d,不会波及别的服务。
六、五个起步服务
把下面这段保存成 /srv/app/starter/docker-compose.yml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
environment:
- TZ=Asia/Shanghai
- SIGNUPS_ALLOWED=true # 注册完自己账号后改成 false
- DOMAIN=https://pw.你的域名.com
volumes:
- /srv/data/vaultwarden:/data
ports:
- "8080:80"
restart: unless-stopped
memos:
image: neosmemo/memos:stable
container_name: memos
environment:
- TZ=Asia/Shanghai
volumes:
- /srv/data/memos:/var/opt/memos
ports:
- "5230:5230"
restart: unless-stopped
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
volumes:
- /srv/data/uptime-kuma:/app/data
ports:
- "3001:3001"
restart: unless-stopped
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
environment:
- TZ=Asia/Shanghai
volumes:
- /srv/data:/srv
- /srv/app/filebrowser/database.db:/database.db
ports:
- "8081:80"
restart: unless-stopped
homarr:
image: ghcr.io/homarr-labs/homarr:latest
container_name: homarr
environment:
- TZ=Asia/Shanghai
volumes:
- /srv/app/homarr:/appdata
ports:
- "7575:7575"
restart: unless-stopped
cd /srv/app/starter
docker compose up -d
docker compose ps
五个服务的作用:
- Vaultwarden —— 自建密码库,兼容 Bitwarden 官方客户端,手机浏览器插件都能用。装完立刻注册账号,然后把
SIGNUPS_ALLOWED改回false,否则任何人都能注册。 - Memos —— 极简备忘录,像自建的 flomo,适合记零散想法。
- Uptime Kuma —— 监控网站和服务是否在线,挂了给你发通知(支持 Bark、企业微信、邮件)。
- Filebrowser —— 网页版文件管理器,出门在外能直接拖文件进服务器。
- Homarr —— 把所有服务的入口聚在一个首页,不用记端口号。
七、外网访问:四种方案的取舍
| 方案 | 安全性 | 体验 | 前提 |
|---|---|---|---|
| VPN 回家(Tailscale / WireGuard) | 最高 | 需要开客户端 | 无 |
| Cloudflare Tunnel | 高 | 不用开端口,但绕行海外 | 一个域名 |
| 反向代理 + 域名 + HTTPS | 中(暴露端口) | 最好 | 域名 + 备案(国内服务器) |
| 公网 IP + 非标端口 | 中 | 一般 | 家庭宽带有公网 IP |
我的建议:先上 Tailscale。 装完就有加密的内网,手机、笔记本在任何网络下都能像在同一个局域网里访问所有服务,不需要域名、不需要备案、不暴露任何端口。缺点是每台设备都要装客户端——但这对个人和小团队完全够用。
需要给不装客户端的人访问(比如共享相册给家人),再考虑反向代理 + 域名。
关于国内备案,说清楚: 国内云服务器的 80 和 443 端口必须备案才能用,这是硬性规定。家庭宽带通常也封了 80/443 的入站。所以「域名直连 + HTTPS」这条路,国内要么走备案,要么用非标端口(比如 8443),要么用隧道。别试图绕过,被拦了就是打不开。
八、反向代理:用 Caddy,不要手写 Nginx
如果走到需要域名的阶段,用 Caddy,它能自动申请和续期 Let's Encrypt 证书,配置只要三行。
caddy:
image: caddy:latest
container_name: caddy
network_mode: host
volumes:
- /srv/app/caddy/Caddyfile:/etc/caddy/Caddyfile
- /srv/data/caddy:/data
restart: unless-stopped
/srv/app/caddy/Caddyfile:
pw.你的域名.com {
reverse_proxy 127.0.0.1:8080
}
note.你的域名.com {
reverse_proxy 127.0.0.1:5230
}
DNS 那边把这些子域名解析到你的服务器 IP,Caddy 启动后自动搞定证书。比 Nginx + certbot 的手工流程省事得多,而且不会因为忘记续期而在三个月后突然全站报证书错误。
九、备份:别等到丢数据才想起来
没有备份的自托管,等于把数据放在一个随时会坏的硬盘上。 最简单的可行方案:
# 每天凌晨 3 点,把配置和数据同步到外接盘
0 3 * * * rsync -a --delete /srv/data/ /mnt/usb/backup/data/ && \
rsync -a --delete /srv/app/ /mnt/usb/backup/app/
但这只解决硬盘坏掉的情况。要防误删和勒索软件,还需要离线或异地的一份——把移动硬盘每周接一次做同步然后拔掉,或者用另一台机器通过 Syncthing 单向同步过去。
如果有数据库类的服务(PostgreSQL/MySQL),一定要先做逻辑转储再同步,直接拷数据目录在运行时是不一致的,恢复会失败。
十、更新策略
不要用 Watchtower 全自动升级所有容器。 大多数服务升级是安全的,但数据库类(PostgreSQL、Immich、Nextcloud)的版本跨度一大就可能带不可逆的数据迁移。
推荐做法:
# 升级单个服务,先看有没有新版本
cd /srv/app/starter
docker compose pull
docker compose up -d
升级前跑一次备份。半年升级一次也行,只要安全更新是自动的(系统的 unattended-upgrades 已经负责了这部分)。
十一、常见翻车点清单
| 症状 | 原因 | 处理 | |
|---|---|---|---|
| 磁盘突然满了 | Docker 日志、镜像缓存堆积 | docker system df 看占用,docker system prune 清理 | |
| 服务被 OOM 杀掉 | 内存不足 | `dmesg \ | grep -i oom` 确认,加 swap 或换机器 |
| 重启后服务没起来 | 没写 restart: unless-stopped | 补上 | |
| 时区不对、日志时间差 8 小时 | 容器没设 TZ | 加 TZ=Asia/Shanghai | |
| 权限错误、文件写不进去 | 容器内 uid 和宿主机不匹配 | 看镜像文档的 PUID/PGID,或 chown 数据目录 | |
| 端口冲突起不来 | 两个服务抢同一个端口 | ss -lntp 查谁占用了 | |
| 外网访问证书报错 | 证书过期或域名没解析对 | Caddy 看日志,确认 80 端口可达 |
十二、建议的学习顺序
不要一次装十个服务。按这个顺序来,每一步都跑通再往下:
- SSH 密钥 + 防火墙 —— 安全基线,不做这步后面都是裸奔
- Docker + 一个最简单的服务(Memos)—— 理解容器、卷、端口
- 反向代理 + 域名 —— 理解 DNS、HTTPS、子域名
- Tailscale —— 理解内网和外网的区别
- 备份 —— 在数据变重要之前把备份做起来
- 再按需求加服务 —— 需要什么装什么,不要为了折腾而折腾
这套走完大概需要两三个周末。之后你会发现自托管真正的价值不是省钱,而是你对数据有了控制权——这在你已经习惯把一切交给云服务之后,是一种很难得的踏实感。