Why NextWhy Next
返回列表
💻 开发阅读约 1 分钟

在迷你主机上用 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 本身免费。只要有域名的费用就能开始。

相关文章