这份文档整理了基于 本地服务器 + Docker (Halo) + Cloudflare Tunnel (内网穿透) + Google AdSense (代码注入 & Workers 方案) 的完整搭建与配置流程。

这份指南可以作为你的运维备忘录,涵盖了从建站到广告变现配置的全过程。全流程部署手册:Halo 博客 + Cloudflare 穿透 + AdSense 完美适配

架构说明

  • 应用层:Halo 2.x (Docker 部署)

  • 网络层:Cloudflare Zero Trust (Tunnel 隧道),无需公网 IP,无需端口映射。

  • 域名策略:根域名 (020915.xyz) 直接访问博客,以满足 AdSense 审核要求。

  • 广告验证:利用 Halo 全局注入 Head 代码,利用 Cloudflare Workers 托管 ads.txt


第一阶段:本地环境搭建 (Docker)

确保你的本地服务器(NAS、树莓派或旧电脑)已安装 Docker 和 Docker Compose。

1. 创建 Halo 配置文件

在服务器创建目录(如 /root/halo),并创建 docker-compose.yaml

YAML

version: "3"

services:
  halo:
    image: halohub/halo:2.20  # 建议锁定一个稳定版本或使用 latest
    restart: always
    container_name: halo
    environment:
      - JVM_OPTS=-Xmx256m -Xms256m
      # 强烈建议显式声明外部访问地址,避免重定向错误
      - HALO_EXTERNAL_URL=https://020915.xyz
    volumes:
      - ./halo2:/root/.halo2
    ports:
      - "8090:8090"  # 容器8090映射到主机8090

2. 启动服务

Bash

cd /root/halo
docker-compose up -d

此时,在局域网内访问 http://你的内网IP:8090 应能看到 Halo 安装界面。初始化完成后进入后台。


第二阶段:Cloudflare Tunnel 内网穿透

这一步将本地服务暴露给公网,同时隐藏服务器真实 IP。

1. 创建隧道

  1. 登录 Cloudflare Zero Trust 面板

  2. 进入 Networks -> Tunnels

  3. 点击 Create a tunnel -> 选择 Cloudflared

  4. 命名隧道(例如 halo-home),保存。

  5. 安装连接器:根据你的服务器系统(Linux/Windows/Docker),复制页面提供的安装命令并在本地服务器执行。看到 "Connected" 即表示隧道打通。

2. 配置公网访问 (Public Hostname)

为了通过 AdSense 审核,必须配置根域名

  1. 在 Tunnel 详情页,点击 Configure -> Public Hostname

  2. 点击 Add a public hostname

  3. 配置根域名

    • Subdomain: 留空 (代表 020915.xyz)

    • Domain: 选择 020915.xyz

    • Service: HTTP -> localhost:8090

  4. (可选) 配置子域名 blog

    • 如果你希望 blog.020915.xyz 也能访问,重复上述步骤,Subdomain 填 blog,Service 一样填 localhost:8090


第三阶段:Google AdSense 代码注入 (Head)

这一步是为了让 Google 能够展示广告并在你的网站上“干活”。

  1. 获取代码:在 AdSense 后台获取你的验证脚本。

  2. 注入 Halo

    • 登录 Halo 后台 (https://020915.xyz/console)。

    • 点击左侧 设置 -> 代码注入 (Code Injection)

    • 全局 Head 标签 (Global Head) 输入框中粘贴代码:

    HTML

    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-xxxxxxxxx"
         crossorigin="anonymous"></script>
    
    • 点击 保存

  3. 验证:访问博客首页,右键查看源代码,搜索 ca-pub-xxxxx 确认代码存在。


第四阶段:解决 ads.txt 问题 (Cloudflare Workers)

这一步是为了解决“收益受损”警告,相当于给网站挂上“官方授权证书”。因为 Docker 修改文件麻烦,我们用 Cloudflare 边缘计算拦截请求并返回证书。

1. 准备内容

准备好你的 AdSense 授权行(在 AdSense 后台获取),格式如下:

google.com, pub-xxxxxxxxxx, DIRECT, fxxxxxxxx

2. 创建 Worker

  1. 回到 Cloudflare 面板 -> Workers & Pages

  2. Create Application -> Create Worker -> Deploy

  3. 点击 Edit code,删除所有原有代码,粘贴以下内容:

JavaScript

export default {
  async fetch(request) {
    const url = new URL(request.url);

    // 监听 /ads.txt 路径
    if (url.pathname === "/ads.txt") {
      // 返回你的授权信息,确保替换成你自己的完整代码
      return new Response("google.com, pub-xxxxxxxx, DIRECT, fxxxxxxxx", {
        headers: { 
          "content-type": "text/plain; charset=utf-8",
          // 允许跨域(可选,增加兼容性)
          "Access-Control-Allow-Origin": "*"
        },
      });
    }

    // 其他所有请求直接放行,回源到你的 Tunnel
    return fetch(request);
  },
};
  1. 点击右上角 Deploy 保存。

3. 绑定路由 (Triggers)

让这个 Worker 只在访问你的域名时生效。

  1. 在 Worker 的 Settings -> Triggers 页面。

  2. 点击 Add route

  3. Route: 输入 020915.xyz/ads.txt

  4. Zone: 选择 020915.xyz

  5. 点击 Add Route


第五阶段:最终检查清单

完成以上所有步骤后,请依次检查:

  1. 网站访问:访问 https://020915.xyz,能流畅打开 Halo 博客。

  2. 源码检查:首页源代码里包含 <script...adsbygoogle...>

  3. 证书检查:访问 https://020915.xyz/ads.txt,浏览器显示一行纯文本(你的 ID 信息),没有 404 或跳转。

  4. AdSense 后台

    • 在“网站”选项卡点击“验证”。

    • 在“Ads.txt”状态栏,静待几天,直到状态变为“已授权”。

恭喜!你已经完成了一套既安全(内网穿透)、又高效(CDN 加速)、且完全符合 Google 变现规范的博客系统。