本教程采用 Docker Compose 方案,通过 Caddy 自动管理 SSL 证书并实现域名分流,确保博客与节点完美兼容。

基于Debian 12,准备工作
更新系统并安装必备工具:
刷新软件源列表,升级系统中所有已安装的软件包到最新版本

apt update && apt upgrade -y

安装指定的软件包

apt install -y curl wget sudo git vim

要安装的软件包列表:
curl:命令行下载工具,支持 HTTP、HTTPS、FTP 等多种协议,常用于下载文件或调用 API。
wget:另一个强大的命令行下载工具,功能类似 curl,但更擅长递归下载和断点续传。
sudo:允许普通用户以超级用户(root)权限执行命令(系统管理必备)。
git:版本控制工具,用于下载、管理代码仓库(比如从 GitHub 下载项目)。
vim:强大的文本编辑器(vi 的增强版),用于编辑配置文件、写脚本等。

  1. 基础环境配置

首先开启 BBR 加速并安装 Docker:

# 开启 BBR
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 安装 Docker
curl -fsSL https://get.docker.com | bash
  1. 部署服务

创建 reborn 目录并编写 docker-compose.yml:
写入 Docker Compose 编排文件

# 写入 Docker Compose 编排文件
cat <<EOF > docker-compose.yml
services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: always
    network_mode: host
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

  blog:
    image: 80x86/typecho:latest
    container_name: typecho_blog
    restart: always
    ports:
      - "8081:80"
    volumes:
      - ./blog_data:/www/wwwroot

  hysteria:
    image: tobyxdd/hysteria:latest
    container_name: hysteria
    restart: always
    network_mode: host
    volumes:
      - ./hysteria_config.yaml:/etc/hysteria/config.yaml
      - caddy_data:/caddy_certs:ro
    command: ["server", "--config", "/etc/hysteria/config.yaml"]

volumes:
  caddy_data:
EOF
  1. 核心配置文件

在同目录下创建 Caddyfile(分流)和 hysteria_config.yaml(节点)。
写入 Caddy 规则(申请证书 + 分流)

# 写入 Caddy 规则(申请证书 + 分流)
cat <<EOF > Caddyfile
blog.yourdomain.com {
    reverse_proxy localhost:8081
}
 
hy.yourdomain.com {
    reverse_proxy https://www.bing.com {
        header_up Host {upstream_hostport}
    }
}
EOF

写入 Hysteria 2 配置

cat <<EOF > hysteria_config.yaml
# 服务监听端口
listen: :1080

# 证书配置(确保路径正确)
tls:
  cert: /caddy_certs/caddy/certificates/acme-v02.api.letsencrypt.org-directory/hy.yourdomain.com
  key: /caddy_certs/caddy/certificates/acme-v02.api.letsencrypt.org-directory/hy.yourdomain.com

# 认证配置
auth:
  type: password
  password: "你的密码"

# ----------------------------
# 服务端带宽限制 (新添加)
# ----------------------------
bandwidth:
  up: 100 mbps    # 限制服务端最大上行(发送)速度为 100 Mbps
  down: 100 mbps  # 限制服务端最大下行(接收)速度为 100 Mbps
# ----------------------------

# 端口混淆配置
obfs:
  type: salamander
  salamander:
    password: "你的混淆密码"

# 流量整形/接收窗口配置(优化高延迟环境下的吞吐量)
quic:
  initStreamReceiveWindow: 8388608
  maxStreamReceiveWindow: 8388608
  initConnReceiveWindow: 20971520
  maxConnReceiveWindow: 20971520

# 伪装配置(当探测端口时,将其转发至指定网页)
masquerade:
  type: proxy
  proxy:
    url: https://www.bing.com
    rewriteHost: true
EOF

  1. 启动与优化

    # 启动容器
    docker compose up -d
    
    # 开启端口跳跃 (UDP 20000-30000)
    iptables -t nat -A PREROUTING -p udp --dport 20000:30000 -j REDIRECT --to-ports 4433
    apt install -y iptables-persistent && netfilter-persistent save

💡 写给读者的建议
博客安装:访问域名后数据库选 SQLite 最省内存。
兼容性:Caddy 负责 80/443 端口,Hysteria 2 隐藏在 1080 端口并共用证书。

备份

# 回到家目录
cd /root
# 重新打包,排除掉备份文件本身
tar -czvf hysteria_blog_backup.tar.gz reborn/

备份文件里都有什么?
docker-compose.yml: 你的三剑客(Caddy, Typecho, Hysteria)的编排蓝图。
Caddyfile: 证书申请和域名分流规则。
hysteria_config.yaml: 节点的性能和安全配置。
blog_data/: 这是最重要的,里面存着你 Typecho 博客的所有文章、上传的图片和 SQLite 数据库。

💡 接下来如何把备份下载到本地?
你可以使用以下几种方法将 blog_backup.tar.gz 从服务器取回到你的电脑上:
使用 SCP 命令(推荐,适合 Mac/Linux/CMD): 在你的本地电脑终端运行(替换 IP):

scp root@你的服务器IP:/root/hysteria_blog_backup.tar.gz ./

使用 SFTP 工具: 用 FinalShell、WinSCP 或 Termius 等工具,连接后直接在右侧文件面板下载这个 .tar.gz 文件。
临时网页下载(最快,但下载完记得删): 你可以利用 Caddy 强大的功能,把文件移动到 blog_data 下通过浏览器下载,但为了安全不建议长期这么做。

定期清理日志:Docker 的日志久了会占空间。如果你发现硬盘快满了,可以用

docker compose logs --tail=10

查看,或重启容器,进入 /root/reborn 目录下

cd /root/reborn

重启所有服务(Caddy, Typecho, Hysteria):

docker compose restart

如果你不在 reborn 目录下,或者只想针对某个容器 ID 操作:
查看正在运行的容器 ID/名称

docker ps

重启指定容器:

docker restart hysteria
# 或者
docker restart caddy

重启后,你可以立即运行以下命令查看容器的运行状态和重启时间:

docker ps

注意:restart 命令只是简单的重启进程,不会重新加载你对 docker-compose.yml 文件所做的修改。
编辑命令:

nano /root/reborn/hysteria_config.yaml

如果你修改了 Caddyfile、hysteria_config.yaml 或者 docker-compose.yml 里的设置,单纯的 restart 是不生效的。你应该使用:

docker compose up -d

原理:Docker 会自动检查配置文件是否有变动。如果有变动,它会关掉旧容器并启动新容器;如果没有变动,它什么都不会做。

💡 小贴士:如何判断重启成功?
重启后,你可以立即运行以下命令查看容器的运行状态和重启时间:

docker ps

检查 STATUS 栏,如果显示 Up Less than a minute,说明刚刚重启成功。