Q叔开源平替QS PINGTI

自托管入门:一台小主机,从零跑起 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 端口可达

十二、建议的学习顺序

不要一次装十个服务。按这个顺序来,每一步都跑通再往下:

  1. SSH 密钥 + 防火墙 —— 安全基线,不做这步后面都是裸奔
  2. Docker + 一个最简单的服务(Memos)—— 理解容器、卷、端口
  3. 反向代理 + 域名 —— 理解 DNS、HTTPS、子域名
  4. Tailscale —— 理解内网和外网的区别
  5. 备份 —— 在数据变重要之前把备份做起来
  6. 再按需求加服务 —— 需要什么装什么,不要为了折腾而折腾

这套走完大概需要两三个周末。之后你会发现自托管真正的价值不是省钱,而是你对数据有了控制权——这在你已经习惯把一切交给云服务之后,是一种很难得的踏实感。

文中提到的项目

可以直接部署的成品