<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>教程 on Cloudside</title><link>https://cloudside.icyyan.com/tags/%E6%95%99%E7%A8%8B/</link><description>Recent content in 教程 on Cloudside</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 13 May 2025 15:30:00 +0800</lastBuildDate><atom:link href="https://cloudside.icyyan.com/tags/%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>Hugo + GitHub Actions：从本地 Markdown 到线上站点的全自动流水线</title><link>https://cloudside.icyyan.com/posts/hugo-github-actions-cicd/</link><pubDate>Tue, 13 May 2025 15:30:00 +0800</pubDate><guid>https://cloudside.icyyan.com/posts/hugo-github-actions-cicd/</guid><description>&lt;h2 id="0-背景与架构演进为什么我们需要流水线"&gt;0. 背景与架构演进：为什么我们需要流水线？&lt;/h2&gt;
&lt;h3 id="hugo-的运行机制"&gt;Hugo 的运行机制&lt;/h3&gt;
&lt;p&gt;Hugo 是一个基于 Go 语言的静态网站生成器（Static Site Generator）。它的核心工作流是将我们编写的 Markdown 源文件，结合站点配置和主题模板，在编译阶段直接渲染成纯静态的 HTML、CSS 和 JS 文件（输出到 &lt;code&gt;public/&lt;/code&gt; 目录）。
由于是纯静态站点，线上的服务器不需要运行任何数据库或动态后端（如 PHP/Node.js），只需要一个 Web 服务器来托管这些文件即可对外提供访问。这种架构带来了极高的访问速度和安全性。&lt;/p&gt;
&lt;h3 id="自动化构建的必然性"&gt;自动化构建的必然性&lt;/h3&gt;
&lt;p&gt;正因为 Hugo 所有的页面都是预先生成的，如果采用手动发布，我们每次更新文章就会陷入一个繁琐的循环：&lt;strong&gt;本地写 Markdown -&amp;gt; 本地运行 &lt;code&gt;hugo&lt;/code&gt; 构建出 &lt;code&gt;public&lt;/code&gt; 目录 -&amp;gt; 手动打包或通过 &lt;code&gt;scp&lt;/code&gt;/&lt;code&gt;rsync&lt;/code&gt; 把文件传到服务器&lt;/strong&gt;。
这三步里有两步是枯燥的机械劳动，不仅容易出错（比如忘了构建就上传），而且如果更换电脑写作，还得重新配置 Hugo 环境。因此，搭建一条自动化的 CI/CD 流水线，把编译和部署工作交给云端，是大幅提升博客写作体验的必选项。我们最终期望的体验是：&lt;strong&gt;只管写 Markdown，推代码即自动部署。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="为什么这样设计部署架构"&gt;为什么这样设计部署架构？&lt;/h3&gt;
&lt;p&gt;基于上述诉求，我们设计了当前的流水线架构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建层（GitHub Actions）&lt;/strong&gt;：文章源码天然需要使用 Git 进行版本控制并托管在 GitHub 上。GitHub Actions 提供了与代码仓库深度绑定的免费 CI/CD 环境。它可以监听 &lt;code&gt;git push&lt;/code&gt; 事件，自动在云端运行容器，拉取子模块（主题）并执行 &lt;code&gt;hugo build&lt;/code&gt;。这样无论我们在哪里写代码，只要能 push，云端就能帮我们完成构建。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传输层（rsync）&lt;/strong&gt;：在云端构建完成后，我们使用 &lt;code&gt;rsync&lt;/code&gt; 经由 SSH 将生成的静态文件增量同步到阿里云 ECS。&lt;code&gt;rsync&lt;/code&gt; 非常轻量高效，配合 &lt;code&gt;--delete&lt;/code&gt; 参数能够确保服务器上的文件状态与最新编译结果完全一致（自动删除已移除的文件），不需要在服务器端部署任何复杂的 Agent。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网关与服务层（从 Nginx 到 Pingap）&lt;/strong&gt;：静态文件传到服务器的指定目录后，需要对外暴露。本站点早期用 Nginx 直接托管静态文件，后来迁移到 Pingap 统一入口。为了让 Hugo 生成的目录页、文章页和标签页都保持稳定的 &lt;code&gt;index.html&lt;/code&gt; 行为，当前采用 &lt;code&gt;darkhttpd&lt;/code&gt; 在本机监听静态目录，Pingap 负责 HTTPS、SNI、HTTP 跳转和反代。无论入口网关怎么演进，&lt;strong&gt;“云端编译静态文件并推送到服务器目录”&lt;/strong&gt; 始终是整套发布流程的核心。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1-最终部署架构图"&gt;1. 最终部署架构图&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;本地写 Markdown ──git push──→ GitHub ──Actions──→ Hugo build ──rsync──→ ECS /var/www/hugo-site/
↑
SSH deploy key
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;：源码仓库 + CI 触发器 + 版本历史&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;：Ubuntu runner 上跑 hugo build，然后 rsync&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阿里云 ECS&lt;/strong&gt;：实际跑服务的地方，&lt;code&gt;darkhttpd&lt;/code&gt; 承载静态文件，Pingap 对外反代&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-准备仓库初始化"&gt;2. 准备：仓库初始化&lt;/h2&gt;
&lt;p&gt;假设你已经有一个空仓库克隆到本地：&lt;/p&gt;</description></item><item><title>从 Nginx 迁移到 Pingap：一次接近零停机的实战记录</title><link>https://cloudside.icyyan.com/posts/nginx-to-pingap-migration/</link><pubDate>Tue, 13 May 2025 15:00:00 +0800</pubDate><guid>https://cloudside.icyyan.com/posts/nginx-to-pingap-migration/</guid><description>&lt;h2 id="0-背景与动机为什么要替换掉-nginx"&gt;0. 背景与动机：为什么要替换掉 Nginx？&lt;/h2&gt;
&lt;p&gt;在过去很长一段时间里，本站点的静态文件托管（Hugo）以及动态服务反代（SillyTavern）一直由 Nginx 承担。Nginx 久经考验、极其稳定，堪称业界标杆。但随着系统架构的演进和统一网关管理的考量，我们开始寻求更现代化的反向代理方案，并最终将目光投向了 &lt;a href="https://github.com/vicanso/pingap"&gt;Pingap&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么选择 Pingap？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;现代化的底层基石&lt;/strong&gt;：Pingap 基于 Cloudflare 开源的 &lt;strong&gt;Pingora&lt;/strong&gt; 框架构建，采用 Rust 编写。Pingora 在 Cloudflare 内部已经受了万亿级请求的考验。得益于 Rust 的内存安全特性，它从根本上规避了传统 C/C++ 网关常见的内存越界和崩溃风险。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更直观的配置模型&lt;/strong&gt;：Nginx 的配置语法虽然强大，但指令的上下文和隐式执行顺序往往让人头疼。Pingap 采用了基于 TOML 的声明式配置，将 &lt;code&gt;Server&lt;/code&gt;、&lt;code&gt;Location&lt;/code&gt;、&lt;code&gt;Upstream&lt;/code&gt; 和 &lt;code&gt;Plugin&lt;/code&gt; 彻底解耦，配置的心智模型更加清晰，更利于后期的维护与扩展。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原生的高级特性支持&lt;/strong&gt;：Pingap 对 HTTP/1.x、HTTP/2、WebSocket、gRPC-web、证书动态加载和插件化网关能力支持更直接。需要注意的是，HTTP/3/QUIC 这类能力应以当前官方 release 和文档为准，迁移生产入口时不要默认假设已经完整可用。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;本次实战的核心目标&lt;/strong&gt;：&lt;strong&gt;先在隔离端口上把新代理跑起来并完整验证，再用一次原子切换无缝替换 Nginx，全程保留 Nginx 配置以便出现问题时能够秒级回滚。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过这种“先验证后切换”的安全策略，我们最终实测的切换中断窗口仅为 &lt;strong&gt;174 ms&lt;/strong&gt;，线上流量几乎无感。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2026-05-17 复核：我重新 SSH 到服务器核对了一遍真实状态。当前服务器仍运行 &lt;code&gt;pingap 0.13.2&lt;/code&gt;，&lt;code&gt;pingap.service&lt;/code&gt; 使用 daemon 模式，Hugo 静态文件由 &lt;code&gt;darkhttpd&lt;/code&gt; 承载。本文以下配置以服务器现状为准；新装环境可以再按最新 release 调整。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-起点现状盘点"&gt;1. 起点：现状盘点&lt;/h2&gt;
&lt;p&gt;服务器：阿里云 ECS（Alibaba Cloud Linux 3 / RHEL 兼容），跑 Nginx 1.20.1，承载两个站点：&lt;/p&gt;</description></item></channel></rss>