在迷你主机上用 Docker + Cloudflare Tunnel 做自托管
只靠家里一台迷你主机,安全地对外发布多个 Web 服务的方法。不开放任何端口,用 Cloudflare Tunnel 挂上 HTTPS,再用 Docker Compose 跑起来。
核心摘要
在迷你主机上用 Docker Compose 启动服务,用 Cloudflare Tunnel(cloudflared)在不开放端口的情况下绑定域名和 HTTPS。不需要改路由器设置,不需要固定 IP,也不需要续签证书。
目录
云服务的账单,对小项目来说其实是笔不小的负担。包括这个博客在内,我把好几个服务都跑在家里的一台迷你主机上。方法分享给你。
为什么是迷你主机
- 一直开着,电费每月也就几块钱
- 只要有 Docker,部署环境和云端一模一样
- 流量真的涨起来了,到时候再搬也不迟
问题只有一个:“怎么把家里的网络安全地暴露到外面”。
别开放端口
传统做法是路由器端口转发 + DDNS + 证书续签。既麻烦,又等于把家庭网络直接敞开给互联网,很危险。
取而代之,用 Cloudflare Tunnel。迷你主机上的 cloudflared 主动向外连接 Cloudflare,流量从这条隧道进来。对外开放的入站端口是 0。
사용자 → Cloudflare(HTTPS) → 터널 → 미니 PC 의 컨테이너
- 不需要公网 IP 和端口转发
- HTTPS 证书由 Cloudflare 自动处理
- 动态 IP 也完全没关系
用 Docker Compose 组织服务
每个服务都以容器方式启动。如果是 Next.js 应用,就用 output: "standalone" 构建出轻量镜像。
services:
blog:
build:
context: .
dockerfile: apps/blog/Dockerfile
container_name: why-next-blog
restart: unless-stopped
networks: [api]
networks:
api:
external: true # cloudflared 와 같은 네트워크
关键是让它和 cloudflared 处在同一个 Docker 网络里。这样隧道才能凭容器名找到服务。
绑定域名
在 Cloudflare 控制台(或隧道配置)里添加一个 Public Hostname。
blog.example.com → http://why-next-blog:3001
就这么简单。跑一句 docker compose up -d --build,几分钟后就能通过域名打开网站了。
小结
- 迷你主机 + Docker = 便宜,且和云端一致的部署体验
- 用 Cloudflare Tunnel 实现不开端口的 HTTPS 和域名
- 把容器和 cloudflared 放进同一个网络
- 用 Public Hostname 完成“域名 → 容器:端口”的映射
对小服务来说,这套组合足够撑很久。我也是这样跑着多个应用,一点点扩充 我做的东西。
常见问题
家里是动态 IP,没问题吗?
没问题。Cloudflare Tunnel 是由迷你主机主动向 Cloudflare 发起对外连接的方式,完全不需要公网 IP、端口转发或 DDNS。
要花钱吗?
Cloudflare Tunnel 本身免费。只要有域名的费用就能开始。
相关文章
- 💻 开发
用 Next.js 从零搭一个 MDX 博客 - 这个博客就是这么做的
不用 CMS,只靠 Markdown 文件就能运转的博客,用 Next.js 16 App Router 搭建的全过程。目录结构、MDX 配置、SEO,全部按实际代码流程整理。
- 💻 开发
5 个应用装进一个仓库 - 独立开发者的 Turborepo Monorepo
在一个仓库里管理多个应用和网站的 Turborepo Monorepo 搭建方法。共享公共配置、靠缓存省下构建时间、按应用分别部署,全部从实战视角整理。
- 📚 学习
背英语单词没用?你需要把它变成“自己的句子”
为什么单词书背得再多,开口还是说不出来?本文聊聊真正的原因,以及把今天看到的东西变成自己的句子、让记忆真正留下来的方法。