能用一条脚本解决的事,绝不打开 Web 界面点三次鼠标。
很多人的自托管(Self-hosted)最后都沦为运维噩梦:机器越买越多,服务越搭越乱,挂了不知道,更谈不上备份。真正的自托管核心不是“搜集开源项目”,而是标准化、自动化、可复现。
盘点一下我个人跑在几台裸金属和 VPS 上的核心生产力工具栈,附落地配置。
1. 入口与交付:拒绝人肉配反代
别再手动 vim /etc/nginx/nginx.conf 了,容器重启一次改一次 upstream 迟早翻车。
核心推荐:Coolify / Traefik
- 轻量 PaaS:首选 Coolify。支持 Git 推送自动构建,自带数据库、备份管理和 SSL 证书申请。
- 纯网络反代:首选 Traefik。原生监听 Docker Socket,靠容器 labels 动态生成路由。
Traefik 最小可用自动化配置片选(docker-compose.yml):
yaml
services:
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.yourdomain.com`)"
- "traefik.http.routers.whoami.entrypoints=websecure"
- "traefik.http.routers.whoami.tls.certresolver=myresolver"
只要新服务带上 labels,Traefik 自动申请证书、自动绑路由,零人工介入。
2. 组网与暴露:内网打通是自动化的前提
没有公网 IP,或者不想暴露 SSH 端口到公网挨爆破?
核心推荐:Tailscale + Cloudflare Tunnels
- 节点互通:Tailscale。基于 WireGuard,配置 Subnet Router 后可以直接打通云上 VPS 和家里的 NAS。
- 对外暴露:Cloudflare Tunnels (
cloudflared)。不监听公网端口,无公网 IP 也能实现出站穿透。
单命令接入 Tailscale 并开启路由转发:
bash
# 1. 一键安装
curl -fsSL https://tailscale.com/install.sh | sh
# 2. 开启内核转发
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
# 3. 接入网络并作为子网网关广播
sudo tailscale up --advertise-routes=192.168.1.0/24 --accept-routes
从此所有 VPS 与私有集群在同一子网内,Ansible 批量下发脚本无需再配堡垒机跳转。
3. 可观测与自愈:服务挂了别等用户提 Issue
自托管服务不是写完就完事,监控和日志必须全自动化采集。
核心推荐:Uptime Kuma + Dozzle
- 存活探测:Uptime Kuma。资源占用极低,支持 HTTP、TCP、Ping 探测,出问题直接通过 Telegram / Webhook 告警。
- 日志排查:Dozzle。免配 ELK 这种重型组件,单二进程抓取宿主机所有 Docker 容器日志,支持实时正则过滤。
服务异常排查标准步骤:
- 收到 Uptime Kuma 的 HTTP 502 Webhook 通知。
- 打开 Dozzle 查看对应容器
stderr。 - SSH 上去执行检查链:
bash
docker ps -a --filter "status=exited" docker inspect <container_id> --format='{{.State.ExitCode}} {{.State.Error}}'
4. 容灾与备份:只备份数据,不备份系统
系统坏了随时可以用 IaC 脚本重装,但数据丢了就彻底死透。数据备份必须做到“冷热分离、增量去重、异地同步”。
核心推荐:Restic + Rclone
- Restic:快照式增量备份、端到端加密、原生支持数据去重。
- Rclone:负责将本地 Snapshot 目录单向同步至 Cloudflare R2 / AWS S3。
自动化备份脚本范例(放进 Crontab):
bash
#!/usr/bin/env bash
set -euo pipefail
export RESTIC_REPOSITORY="s3:https://<account_id>.r2.cloudflarestorage.com/backup-bucket"
export RESTIC_PASSWORD_FILE="/root/.restic_password"
export AWS_ACCESS_KEY_ID="xxx"
export AWS_SECRET_ACCESS_KEY="xxx"
# 1. 备份指定数据目录(排除临时缓存)
restic backup /opt/stacks \
--exclude="*.log" \
--exclude="cache/"
# 2. 清理过期策略:保留最近 7 天,4 个周备份,6 个月备份
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
总结
搞自托管的最终目标不是为了维护机器,而是让基础设施像水电一样无感运行。
- 配置必须代码化,统一收敛在 Git 仓库内。
- 任何需要手动
ssh进去执行两次以上的命令,直接写进 shell 脚本或 playbook。 - 牢记:没有经过恢复验证的备份等于不存在。
#项目
#工具
#Linux
License: CC BY-NC 4.0
Updated 13 hours ago
Was this article helpful? Give it a like.
0 comments


