<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hugo on 小葱的学术基站</title><link>https://xiaocong.site/tags/hugo/</link><description>Recent content in Hugo on 小葱的学术基站</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 09 Mar 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://xiaocong.site/tags/hugo/index.xml" rel="self" type="application/rss+xml"/><item><title>记一次硬核又优雅的个人学术主页建站之旅</title><link>https://xiaocong.site/tricks/build-website/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0800</pubDate><guid>https://xiaocong.site/tricks/build-website/</guid><description>&lt;h2 id="缘起为什么选择自己折腾"&gt;&lt;a href="#%e7%bc%98%e8%b5%b7%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%89%e6%8b%a9%e8%87%aa%e5%b7%b1%e6%8a%98%e8%85%be" class="header-anchor"&gt;&lt;/a&gt;缘起：为什么选择自己折腾？
&lt;/h2&gt;&lt;p&gt;为了更好地沉淀个人的项目经验与学习心得，我决定搭建一个纯粹、极简、完全属于自己的学术展示主页。没有选择臃肿的动态博客框架（如 WordPress），而是走向了“静态生成 + 容器化部署 + 自动化脚本”的硬核极客路线。&lt;/p&gt;
&lt;p&gt;这套方案不仅对服务器资源消耗极低，而且将内容的绝对控制权掌握在了自己本地的电脑里。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-我的建站工具流-toolchain"&gt;&lt;a href="#-%e6%88%91%e7%9a%84%e5%bb%ba%e7%ab%99%e5%b7%a5%e5%85%b7%e6%b5%81-toolchain" class="header-anchor"&gt;&lt;/a&gt;🛠️ 我的建站工具流 (Toolchain)
&lt;/h2&gt;&lt;p&gt;整个网站的运转就像一条精密的流水线，涉及的工具可以分为“云端基础设施”和“本地内容生产”两部分。&lt;/p&gt;
&lt;h3 id="1-云端基础设施-server-side"&gt;&lt;a href="#1-%e4%ba%91%e7%ab%af%e5%9f%ba%e7%a1%80%e8%ae%be%e6%96%bd-server-side" class="header-anchor"&gt;&lt;/a&gt;1. 云端基础设施 (Server-Side)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宿主机&lt;/strong&gt;：某云厂商的入门级轻量应用服务器（内存不足 2GB，所以对资源分配要求极高）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理面板&lt;/strong&gt;：&lt;strong&gt;CasaOS&lt;/strong&gt;。一个基于 Docker 的极简轻量级面板，作为整个服务器的“可视化物业管理”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反向代理网关&lt;/strong&gt;：&lt;strong&gt;Nginx Proxy Manager (NPM)&lt;/strong&gt;。负责霸占服务器的 80 和 443 端口，未来等域名备案通过后，统一负责域名的流量转发和 SSL 证书（HTTPS 小绿锁）的自动续签。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端展示&lt;/strong&gt;：&lt;strong&gt;基础版 Nginx 容器&lt;/strong&gt;。只分配了 128MB 的内存限制，占用内部的 &lt;code&gt;8080&lt;/code&gt; 端口，纯粹用来挂载和展示静态的 HTML 网页文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-本地内容生产-local-side"&gt;&lt;a href="#2-%e6%9c%ac%e5%9c%b0%e5%86%85%e5%ae%b9%e7%94%9f%e4%ba%a7-local-side" class="header-anchor"&gt;&lt;/a&gt;2. 本地内容生产 (Local-Side)
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态网站生成器&lt;/strong&gt;：&lt;strong&gt;Hugo&lt;/strong&gt;。极其强大的 Go 语言静态博客框架，配合极简的 &lt;strong&gt;PaperMod&lt;/strong&gt; 主题，瞬间将 Markdown 转化为漂亮的网页。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编辑器&lt;/strong&gt;：&lt;strong&gt;Typora&lt;/strong&gt;。配合 Hugo 的 Page Bundle（页面打包）机制，开启“复制图片到当前文件夹”功能，彻底告别图床失效和路径错乱的烦恼。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化部署&lt;/strong&gt;：&lt;strong&gt;自定义 PowerShell 双子星脚本&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;new_post.ps1&lt;/code&gt;：一键选择板块（项目/随笔）并生成标准化 Markdown 模板。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deploy.ps1&lt;/code&gt;：一键执行 Hugo 编译、打包 ZIP，并通过 SSH/SCP 自动推送到服务器并解压覆盖。实现了“本地敲完字，回车即上线”的极致体验。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="-踩坑实录与避坑指南"&gt;&lt;a href="#-%e8%b8%a9%e5%9d%91%e5%ae%9e%e5%bd%95%e4%b8%8e%e9%81%bf%e5%9d%91%e6%8c%87%e5%8d%97" class="header-anchor"&gt;&lt;/a&gt;🕳️ 踩坑实录与避坑指南
&lt;/h2&gt;&lt;p&gt;折腾的过程并非一帆风顺，期间遇到了几个非常经典的工程问题：&lt;/p&gt;
&lt;h3 id="坑-180-端口的假性占用"&gt;&lt;a href="#%e5%9d%91-180-%e7%ab%af%e5%8f%a3%e7%9a%84%e5%81%87%e6%80%a7%e5%8d%a0%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;坑 1：80 端口的“假性占用”
&lt;/h3&gt;&lt;p&gt;一开始准备部署 NPM 时，命令行提示 80 端口被占用。用 &lt;code&gt;lsof -i :80&lt;/code&gt; 查阅后，发现是云厂商自带的监控插件和元数据代理。
&lt;strong&gt;破案：&lt;/strong&gt; 仔细观察网络状态发现是 &lt;code&gt;ESTABLISHED&lt;/code&gt;（主动向外请求）而不是 &lt;code&gt;LISTEN&lt;/code&gt;（本地监听）。所以本地 80 端口其实是空闲的，直接绕过报错强行启动 Docker 即可。&lt;/p&gt;
&lt;h3 id="坑-2内存告急与-docker-的紧箍咒"&gt;&lt;a href="#%e5%9d%91-2%e5%86%85%e5%ad%98%e5%91%8a%e6%80%a5%e4%b8%8e-docker-%e7%9a%84%e7%b4%a7%e7%ae%8d%e5%92%92" class="header-anchor"&gt;&lt;/a&gt;坑 2：内存告急与 Docker 的“紧箍咒”
&lt;/h3&gt;&lt;p&gt;云服务器内存不到 2G，如果不对 Docker 容器设限，极端情况下可能会导致宿主机死机。
&lt;strong&gt;解决：&lt;/strong&gt; 放弃纯 UI 操作，改用 &lt;code&gt;docker-compose.yml&lt;/code&gt; 结合 &lt;code&gt;sudo tee&lt;/code&gt; 强力写入，在配置中加入 &lt;code&gt;deploy.resources.limits.memory&lt;/code&gt;。给 NPM 限制 512M，给静态 Nginx 限制 128M，把每一兆内存都用在刀刃上。&lt;/p&gt;
&lt;h3 id="坑-3lets-encrypt-证书申请报-internal-error"&gt;&lt;a href="#%e5%9d%91-3lets-encrypt-%e8%af%81%e4%b9%a6%e7%94%b3%e8%af%b7%e6%8a%a5-internal-error" class="header-anchor"&gt;&lt;/a&gt;坑 3：Let&amp;rsquo;s Encrypt 证书申请报 &amp;ldquo;Internal Error&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;在 NPM 里配置好域名后，死活申请不下来 SSL 证书，一直报内部错误。
&lt;strong&gt;破案：&lt;/strong&gt; 域名还在 ICP 备案审核期！云厂商的骨干网在流量到达服务器前就直接拦截了所有通过 80 端口查水表的 Let&amp;rsquo;s Encrypt 验证请求。目前只能用“IP+端口”的模式曲线救国，静候管局佳音。&lt;/p&gt;
&lt;h3 id="坑-4自动化脚本乱码与页面神秘失踪"&gt;&lt;a href="#%e5%9d%91-4%e8%87%aa%e5%8a%a8%e5%8c%96%e8%84%9a%e6%9c%ac%e4%b9%b1%e7%a0%81%e4%b8%8e%e9%a1%b5%e9%9d%a2%e7%a5%9e%e7%a7%98%e5%a4%b1%e8%b8%aa" class="header-anchor"&gt;&lt;/a&gt;坑 4：自动化脚本乱码与页面“神秘失踪”
&lt;/h3&gt;&lt;p&gt;在编写 PowerShell 脚本时遇到了字符吞噬的报错，在终于把文件传到服务器后，网页列表却空空如也。
&lt;strong&gt;解决：&lt;/strong&gt; 1. 脚本报错是因为 PowerShell 默认编码问题，将 &lt;code&gt;.ps1&lt;/code&gt; 文件另存为带 BOM 的 UTF-8 即可解决。
2. 页面不显示是因为 Hugo 默认过滤草稿。将 &lt;code&gt;.md&lt;/code&gt; 文件头的 &lt;code&gt;draft: true&lt;/code&gt; 改为 &lt;code&gt;false&lt;/code&gt;，并在 &lt;code&gt;hugo.toml&lt;/code&gt; 中明确配置 &lt;code&gt;mainSections = [&amp;quot;posts&amp;quot;, &amp;quot;projects&amp;quot;]&lt;/code&gt;，文章瞬间完美呈现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="结语"&gt;&lt;a href="#%e7%bb%93%e8%af%ad" class="header-anchor"&gt;&lt;/a&gt;结语
&lt;/h2&gt;&lt;p&gt;从底层的防火墙放行、Docker 容器编排，到前端的主题配置、本地的自动化脚本编写，这次建站犹如一次全栈工程的微缩演练。把重复的操作交给脚本，把精力的焦点还给内容，这大概就是折腾技术最大的乐趣所在。&lt;/p&gt;
&lt;p&gt;接下来，就是不断往这个“基站”里填充有价值的思想了。&lt;/p&gt;</description></item></channel></rss>