羞羞的铁狼羞羞的铁狼

基于 Docker Compose 与 Traefik 的云原生技术博客架构实践

一、 引言与架构选型

在个人独立站与技术笔记的建设中,运维的复杂度往往决定了站点的长期存续。传统的 LNMP 脚本部署虽然成熟,但存在依赖耦合、升级困难以及缺乏隔离性的问题。

为了在腾讯云小规格 CVM 上获得极致的稳定性和安全防护能力,我们采用了当前业界成熟的云原生容器化组合方案:

  • 边缘反向代理网关:Traefik v3。原生支持 Docker 服务发现、Let's Encrypt 证书自动化 ACME 申请与静默续签;
  • 博客 CMS 引擎:Typecho。相比于重量级的 WordPress,Typecho 拥有极其优秀的内存控制力(冷启动仅需数十 MB 内存);
  • 前端主题:DUX 主题优化版。具备响应式布局、高信息密度排版与原生 SEO 友好结构。
graph TD
    Client["🌐 终端访客 (HTTPS:443)"] --> Traefik["🛡️ Traefik 边缘代理网关 (Docker)"]
    Traefik -->|Let's Encrypt ACME| TLS["🔐 泛域名 SSL 自动化管理"]
    Traefik -->|内网零拷贝转发 172.22.0.x| Typecho["💻 Typecho 业务容器 (PHP 8.2-FPM)"]
    Typecho --> DB[("🗄️ 数据库引擎 (MySQL / SQLite)")]

二、 关键组件配置实战

1. Traefik 主网关配置 (traefik.yml)

在 Docker 环境下,Traefik 监听 :80 与 :443 入口点,并强制开启全站 HTTP 到 HTTPS 的 301 重定向:

entrypoints:
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

  websecure:
    address: :443
    http:
      middlewares:
        - secureHeaders@file
        - global-compressor@file
      tls:
        options: default
        certResolver: le-dns
        domains:
          - main: xiongjinghang.com
            sans:
              - "*.xiongjinghang.com"

2. 安全防护头与 Gzip/Brotli 压缩优化 (middlewares.yml)

为了防止恶意扫描、点击劫持以及 XSS 攻击,我们在 Traefik 层统一注入安全响应头,并开启全局压缩以节约带宽:

http:
  middlewares:
    global-compressor:
      compress:
        excludedContentTypes:
          - "image/png"
          - "image/jpeg"
          - "image/gif"
        minResponseBodyBytes: 1024

    secureHeaders:
      headers:
        sslRedirect: true
        forceSTSHeader: true
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        contentTypeNosniff: true
        browserXssFilter: true
        frameDeny: true
        customResponseHeaders:
          Server: "nginx"
          X-Powered-By: "Typecho"

三、 Docker Compose 编排文件

完整的 docker-compose.yml 示例结构如下,通过独立的桥接网络 traefik_proxy 实现各微服务间的网络隔离与受控互联:

version: "3.8"

services:
  traefik:
    image: traefik:v3.1
    container_name: traefik
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik_data/traefik.yml:/traefik.yml:ro
      - ./traefik_data/configurations:/configurations:ro
      - ./traefik_data/acme.json:/acme.json
    networks:
      traefik_proxy:
        ipv4_address: 172.22.0.253

  typecho:
    image: 80x86/typecho:latest
    container_name: typecho
    restart: always
    environment:
      - TIMEZONE=Asia/Shanghai
    volumes:
      - ./typecho_data:/data
    networks:
      traefik_proxy:
        ipv4_address: 172.22.0.6
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.typecho.entrypoints=websecure"
      - "traefik.http.routers.typecho.rule=Host(`www.xiongjinghang.com`) || Host(`xiongjinghang.com`)"
      - "traefik.http.routers.typecho.tls=true"

networks:
  traefik_proxy:
    driver: bridge
    ipam:
      config:
        - subnet: 172.22.0.0/24

四、 性能测试与日常维护

  1. 证书全自动续签验证:
    Traefik 会在 SSL 证书到期前 30 天自动通过 DNS-01 或 HTTP-01 挑战完成续期,无需人工介入或配置复杂的 Certbot Crontab。
  2. 轻量与稳定性:
    在 1G 内存服务器上平稳运行 3 个月以上,平均系统负载低于 0.15,内存占用维持在 380MB 左右,非常适合作为个人技术笔记与长期归档平台。

本原创文章未经允许不得转载 | 当前页面:羞羞的铁狼 » 基于 Docker Compose 与 Traefik 的云原生技术博客架构实践

评论