
0x00为什么选择重构博客
因为我的WordPress博客已经部署了五六年,经历了无数次的搬迁已经菠萝菠萝哒!!
- 图片资源大量丢失(硬编码URL失效)
- 服务器配置混乱(多次迁移遗留问题)
- 性能和安全问题日益突出

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

为什么选择Bolo Solo
- 原生Markdown支持:写作体验流畅
- Server酱推送:微信接收博客动态
- 轻量级架构:Docker部署简单高效
- 腾讯云COS集成:完美解决图床问题
进入正题
本次预计用到的技术栈
- 用 Docker 一键拉起 Solo 博客(含 MySQL)。
- 用长亭「雷池」SafeLine WAF 给博客套上防护。
- 使用Cloudflare给博客套上一层免费的CDN
使用Cloudflare R2充当博客的图Cloudflare太慢了还是决定用腾讯云COS- 最终形成「浏览器 → 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配置雷池反向代理
- 浏览器打开
https://<服务器IP>:9443
第一次登录会要求绑定 TOTP(手机装 Google Authenticator、数盾等扫码即可)。 - 进入「防护站点」→「添加站点」:
| 字段 | 示例值 | 说明 |
|---|---|---|
| 域名 | blog.example.com |
先把域名解析到本机 IP(无域名可填* 做 IP 访问) |
| 端口 | 80 | 用户访问的端口 |
| 上游服务器 | 127.0.0.1:8080 |
指向上一步的 Solo |
| HTTPS | 可选 | 有证书就上传,没有先关 |
- 保存后,雷池会在
80端口启动一个反向代理,流量走向:
1浏览器 → 80/443(雷池)→ 检测 → 8080(Solo)
此时访问 http://blog.example.com 即可看到博客,WAF 已在默默工作。
0x05验证防护(可选但强烈建议)
- 手动测试
在地址栏尝试?id=1' and 1=1--之类 SQL 注入,或提交<script>alert(1)</script>,雷池会立即阻断并记录日志。 - 自动化测试
使用 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/.env 后 docker compose -f /data/safeline/compose.yml up -d |
| 忘记雷池密码 | docker exec safeline-mgt reset-admin |

Comments | 0 条评论