写博客不仅仅是文字的输出,对于一名工程师来说,博客本身就是一个不断迭代、优化的工程项目。本站自搭建以来,经历了从简单的静态页面生成到如今高度自动化的转变。今天分享一下这个博客背后的技术栈与工程实践。

🏗 全栈架构设计

本站基于 Hugo 构建,采用了全容器化(Docker)的部署方案。为了保证数据自控和极简运维,我并没有选择像 Algolia 或各种第三方评论插件,而是全部采用自建服务。

核心技术栈

  • SSG: Hugo (PaperMod 主题)
  • Web Server: Nginx (Alpine)
  • 评论系统: Remark42 (Golang 编写,自托管)
  • 监控系统: Grafana + Loki (日志观测)
  • 部署方式: Docker Compose
  • 自动化工具: Python + uv (用于图像处理与资源管理)

系统架构图

graph TD User((访问者)) --> FRP[FRP 公网隧道] FRP --> Nginx{Nginx 反向代理} Nginx --> Static[静态 HTML 资源] Nginx --> Remark42[Remark42 评论 API] Nginx --> ImageHost[自建 Nginx 图床] Nginx -- JSON 日志 --> Loki[(Loki 日志池)] Loki --> Grafana[Grafana 面板] subgraph "Docker 内部网络" Static Remark42 ImageHost end

🚀 关键工程实践

1. 评论系统的“自强不息”

在对比了 Giscus (基于 GitHub) 和传统的 Disqus 后,我选择了 Remark42

  • 原因:它是用 Go 写的,非常轻量且高效,支持 Docker 一键部署,数据完全存储在本地,不依赖第三方账号,对隐私极度友好。
  • 工程细节:通过 Nginx 转发 /comments 路径,实现了跨域友好和 SSL 证书共用。

2. 可视化监控:Grafana 与日志分析

为了实时掌握博客的运行状态,我通过读取 ../nginxlog 下的日志实现了可视化监控。

  • 结构化日志:我在 Nginx 配置中定义了 json_main 格式。相比传统的文本日志,JSON 格式能让监控系统无痛解析各种字段(如:真实 IP、响应时长、User-Agent 等)。
  • 监控链路:利用 Promtail 实时抓取日志目录并推送到 Loki,最后在 Grafana 中呈现。通过配置 Dashboard,我可以直观地看到:
    • 全球访问流量的热力分布图。
    • 4xx/5xx 错误码的实时曲线(及时发现恶意扫描)。
    • 热门文章的 PV/UV 排名。

3. 自动化图像处理流水线

为了解决每篇博客封面图“选择困难症”和 SEO 预览问题,我编写了一套 Python 工具链:

  • 封面自动生成 (gen_cover.py):利用 Pillow 库,根据文章的标题和标签,自动从高清图库抓取精美背景,并合成纯净的封面图。
  • 极简图床管理 (manage_images.py)
    • 既然已经有了 Nginx,何必再用付费图床?
    • 我在 Nginx 中映射了一个 /images 路径,管理脚本只需一行命令即可将本地图片同步至存储目录,并自动生成 Markdown 链接。

4. 生产环境的“内网穿透”

由于博客部署在本地高性能机器上,我使用了 FRP 建立公网隧道。

  • 优化点:在 Nginx 层通过 real_ip 模块解析 FRP 传递的 proxy_protocol,从而精准获取访问者的真实 IP,这对于监控准确性和评论系统的反垃圾至关重要。

📈 SEO 与性能调优

静态博客的优势在于快,但如果不注意细节,SEO 会很糟糕。本站做了如下优化:

  • JSON-LD 结构化数据:方便搜索引擎理解文章内容。
  • 静态资源缓存:在 Nginx 层面为图片和静态资源开启了 30d 的长期缓存。
  • 429 限流保护:针对扫描器频繁请求,配置了 limit_req 模块,并合理设置 burst 缓冲区,确保真实用户的流畅加载。

💡 总结

一个好的个人博客应该是好读、好写、且好维护的。 通过这套工程实践,我实现了一次构建、全自动化处理资源、数据完全自控且可观测的目标。代码和文字都在我自己的服务器里,这种安全感和掌控感是任何第三方平台给不了的。

以后,我会继续探索 AI 辅助内容分析 以及 更深度的自动化工具链,让写作回归纯粹。


Making progress every day.