0x00为什么选择重构博客

因为我的WordPress博客已经部署了五六年,经历了无数次的搬迁已经菠萝菠萝哒!!

  • 图片资源大量丢失(硬编码URL失效)
  • 服务器配置混乱(多次迁移遗留问题)
  • 性能和安全问题日益突出

img

给我的老blog拍一张遗照(bushi)

为什么选择Bolo Solo

  • 原生Markdown支持:写作体验流畅
  • Server酱推送:微信接收博客动态
  • 轻量级架构:Docker部署简单高效
  • 腾讯云COS集成:完美解决图床问题

进入正题

本次预计用到的技术栈

  1. 用 Docker 一键拉起 Solo 博客(含 MySQL)。
  2. 用长亭「雷池」SafeLine WAF 给博客套上防护。
  3. 使用Cloudflare给博客套上一层免费的CDN
  4. 使用Cloudflare R2充当博客的图Cloudflare太慢了还是决定用腾讯云COS
  5. 最终形成「浏览器 → Cloudflare→雷池 → Solo」的安全链路。
sequenceDiagram participant Visitor as 访客 participant CF as Cloudflare CDN participant Safeline as 雷池 WAF participant Bolo as Bolo-solo participant DB as MySQL participant COS as 腾讯云COS Visitor->>CF: 1. HTTPS请求 CF->>Safeline: 2. 回源请求 Safeline->>Bolo: 3. 转发请求 alt 读取数据 Bolo->>DB: 4. 查询数据 DB-->>Bolo: 5. 返回数据 else 加载图片 Bolo->>COS: 4. 获取图片 COS-->>Bolo: 5. 返回图片 end Bolo-->>Safeline: 6. 生成响应 Safeline-->>CF: 7. 返回响应 CF-->>Visitor: 8. 最终内容

0x01 准备环境(任选一台 Linux 服务器)

最低要求 备注
系统 x86_64 Linux(CentOS 7/8、Ubuntu 20/22 均可但是不能是ARM架构的因为ARM架构的雷池收费)
软件 Docker ≥ 20.10.14、Docker-Compose ≥ 2.0.0
资源 1C2G+,磁盘 10 GB+
1# 一键检查系统类型
2uname -m            # 需返回 x86_64
3
4# 更新系统
5sudo apt update && sudo apt upgrade -y
6
7# 安装基本工具
8sudo apt install -y curl wget git

0x02安装雷池 WAF(官方一键脚本)

建议 把雷池装在同一台机器
这里演示装在同一台机器,默认监听 9443 管理口。

1bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
2# 脚本会拉取镜像、创建 /data/safeline 目录,约 2-3 分钟
3#之所以先安装雷池是因为雷池会自动给你安上docker

安装完成后提示:

1SafeLine installed successfully!
2Web Console: https://<IP>:9443
3Username/Password: admin / <随机初始密码>

0x03 部署启动 Solo + MySQL

新建文件并写入bolo-solo-interactive.sh:

  1#!/bin/bash
  2# Bolo Solo 自动部署脚本 (适配雷池环境)
  3# 执行前请替换以下变量:
  4#   DOMAIN="your-domain.com"        # 你的域名
  5#   EMAIL="your-email@example.com"  # 证书邮箱
  6#    ports:
  7#      - "127.0.0.1:8080:8080"      #仅本机能访问,如果需要任意访问请修改为0.0.0.0
  8
  9DOMAIN="your-domain.com"        # 你的域名
 10EMAIL="your-email@example.com"  # 证书邮箱
 11
 12# 配置Docker国内源
 13sudo mkdir -p /etc/docker
 14sudo tee /etc/docker/daemon.json <<-'EOF'
 15{
 16  "registry-mirrors": [
 17    "https://docker.1ms.run",
 18    "https://dockerproxy.net",
 19    "https://docker.1panel.live",
 20    "https://docker.m.daocloud.io",
 21    "https://docker.imgdb.de",
 22    "https://docker-0.unsee.tech",
 23    "https://docker.hlmirror.com",
 24    "https://docker.linxi.online",
 25    "https://uetfsxdr.mirror.aliyuncs.com",
 26    "https://docker.mirrors.ustc.edu.cn",
 27    "https://hub-mirror.c.163.com"
 28  ]
 29}
 30EOF
 31sudo systemctl daemon-reload
 32sudo systemctl restart docker
 33
 34# 创建部署目录
 35mkdir bolo-deploy && cd bolo-deploy
 36
 37# 生成环境变量文件
 38cat > bolo-env.env <<EOF
 39# mysql env
 40MYSQL_ROOT_PASSWORD=StrongPassword123!
 41MYSQL_USER=bolo
 42MYSQL_DATABASE=bolo
 43MYSQL_PASSWORD=BoloSecurePass456!
 44
 45# bolo env
 46RUNTIME_DB=MYSQL
 47JDBC_USERNAME=bolo
 48JDBC_PASSWORD=BoloSecurePass456!
 49JDBC_DRIVER=com.mysql.cj.jdbc.Driver
 50JDBC_URL=jdbc:mysql://db:3306/bolo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
 51EOF
 52
 53# 生成docker-compose.yml
 54cat > docker-compose.yml <<EOF
 55version: '3'
 56
 57services:
 58  db:
 59    image: mysql:5.7
 60    command: --max_allowed_packet=32505856 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --transaction-isolation=READ-COMMITTED --binlog-format=ROW
 61    restart: always
 62    volumes:
 63      - ./mysql/data:/var/lib/mysql
 64    env_file:
 65      - bolo-env.env
 66    networks: 
 67      - bolo-net
 68
 69  bolo:
 70    image: tangcuyu/bolo-solo:latest
 71    restart: always
 72    container_name: "bolo"
 73    expose:
 74      - "8080"
 75    ports:
 76      - "127.0.0.1:8080:8080"  
 77    volumes: 
 78      - /etc/localtime:/etc/localtime:ro
 79    env_file:
 80      - bolo-env.env
 81    command: --listen_port=8080 --server_scheme=https --server_host=${DOMAIN} --server_port= --lute_http=http://lute:8249
 82    networks:
 83      - bolo-net
 84    depends_on:
 85      - db
 86
 87  lute:
 88    image: b3log/lute-http
 89    restart: always 
 90    expose: 
 91      - "8249"
 92    networks: 
 93      - bolo-net
 94
 95networks:
 96  bolo-net:
 97    driver: bridge
 98EOF
 99
100# 启动服务
101docker compose up -d
102
103echo "------------------------------------------------"
104echo "Bolo Solo 部署完成!"
105echo "请执行以下操作:"
106echo "1. 登录雷池控制台 (https://服务器IP:9443)"
107echo "2. 添加防护站点:"
108echo "   - 域名: ${DOMAIN}"
109echo "   - 上游服务器: http://127.0.0.1:8080"
110echo "3. 在Cloudflare配置:"
111echo "   - DNS解析到雷池服务器IP"
112echo "   - SSL/TLS设置为「完全」模式"
113echo "4. 等待5分钟让服务初始化"
114echo "访问地址: https://${DOMAIN}"

使用方法:

1chmod +x bolo-solo-interactive.sh
2./bolo-solo-interactive.sh

0x04配置雷池反向代理

  1. 浏览器打开 https://<服务器IP>:9443
    第一次登录会要求绑定 TOTP(手机装 Google Authenticator、数盾等扫码即可)。
  2. 进入「防护站点」→「添加站点」:
字段 示例值 说明
域名 blog.example.com 先把域名解析到本机 IP(无域名可填* 做 IP 访问)
端口 80 用户访问的端口
上游服务器 127.0.0.1:8080 指向上一步的 Solo
HTTPS 可选 有证书就上传,没有先关
  1. 保存后,雷池会在 80 端口启动一个反向代理,流量走向:
1浏览器 → 80/443(雷池)→ 检测 → 8080(Solo)

此时访问 http://blog.example.com 即可看到博客,WAF 已在默默工作。


0x05验证防护(可选但强烈建议)

  1. 手动测试
    在地址栏尝试 ?id=1' and 1=1-- 之类 SQL 注入,或提交 <script>alert(1)</script>,雷池会立即阻断并记录日志。
  2. 自动化测试
    使用 sqlmap:sqlmap -u "http://blog.example.com/?id=1",观察全部被拦截。

0x06日常维护 & 常见问题

任务 命令
重启 Solo docker compose restart
升级 Solo docker compose pull && docker compose up -d
查看雷池日志 docker logs -f safeline-tengine
修改雷池端口 编辑/data/safeline/.envdocker compose -f /data/safeline/compose.yml up -d
忘记雷池密码 docker exec safeline-mgt reset-admin


标题:从零开始:基于Bolo Solo的博客重构计划
作者:林息
地址:https://blog.linxcube.cn/articles/2025/08/12/1754994554663.html