通过 caddy + cloudflared 在家庭服务器中搭建公开网站

哪个小男孩没有属于自己的家庭服务器呢?有了服务器之后,再搭建个人博客也是很合情合理的吧。搭建了博客之后,当然还需要给世界上其他人一个膜拜自己的机会

那怎么样低成本的给其他人这个机会呢?恰好互联网大善人 Cloudflare 有个 Tunnel 功能,提供了一种安全的方式来连接你的服务器和 Cloudflare。这个方式不仅免去了需要公网IP的困扰,还因为不需要开放端口而提升了安全系数。着实是我和 Cloudflare 的双赢啊。

本文就简单介绍一下基于 docker compose 部署 Caddy 和 cloudflared 的配置,并假定你已经有 Caddy 和docker compose 的使用经验。

配置 Caddy

首先我们配置好 Caddy,参考配置如下:

# Caddyfile
{
    servers {
        # 通过 X-Forwarded-For 获取客户端真实 IP
        trusted_proxies static private_ranges
        trusted_proxies_strict
    }
}

# 仅监听 HTTP 端口
http:// {
    root /www/blog/
    file_server
}
services:
  caddy:
    image: caddy
    volumes:
      - ./www/:/www/
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    restart: always
    ports:
      - 80:80

volumes:
  caddy_data:
  caddy_config:

这里需要说明的是,之后 cloudflared 会通过本地访问 Caddy 端口。我觉得在这种情况下 HTTPS 是多余的,因此这里只监听了 HTTP 端口。注意这并不影响在公网通过HTTPS访问我们的服务。
确认 caddy 正常工作了,我们再来配置 cloudflared。

配置 cloudflared

添加 Tunnel

参考官方教程创建一个 Tunnel,在 connector 安装步骤中页面上会提供一段安装命令,我们将其中的 token 复制出来,更新到下面的 compose 配置中:

services:
  caddy:
    ...
  cloudflared:
    image: cloudflare/cloudflared
    restart: always
    network_mode: service:caddy
    environment:
      - TUNNEL_TOKEN={token}
    command: tunnel run

其中的 network_mode: service:caddy 是为了让 Caddy 和 cloudflared 在同一个网络 namespace,这样后面 cloudflared 可以通过 127.0.0.1 来访问 Caddy。

确认能在网页上看到新出现的 connector 之后,我们点击下一步。

添加域名

这一步要做的很简单,在页面上的 Public Hostnames 标签中,填入你想要使用的域名,例如 blog.example.com
然后 type 选 HTTP,url 填 127.0.0.1,保存即可。
注意如果你填的域名之前已经存在于 DNS 记录里了,需要手动删除一下,不然保存的时候会报错有冲突。

结语

一切正常的话,你应该已经能通过刚才配置的域名从公网访问到博客了。恭喜你!你现在已经拥有了一个安全、高速、并且可以被全世界访问的网站。需要注意的是,受限于环大陆模式的网络条件,tunnel 可能偶尔会出现无法连接的问题。如有需求,建议加钱买国内的云服务器,并在申请非经营性互联网信息服务备案后,将服务转移到云服务器。最后将你曾经的小心肝随同小男孩的梦想一并便宜二手处理了。

当然,除了 Caddy 和 cloudflared 之外,还有一些其他的工具也可以帮助我们实现类似的功能,比如 traefik 和 Tailscale 等。我自己实际上就是在用 traefik 作为主要的反向代理服务,通过它的 docker 集成自动的管理各种容器服务的访问,而不需要我手动配置端口映射等。而 Caddy 主要用来负责静态文件和PHP的支持。

不过无论我们选择哪种工具,最重要的是找到适合我们需求的解决方案。希望本文能在你找寻解决方案的路上提供一点点帮助。

标签:cloudflare

仅有 1 条评论

  1. Avery Avery

    学习了

添加新评论