<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>实用技巧 on 式鉴的博客</title><link>https://ignvex.github.io/categories/%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7/</link><description>Recent content in 实用技巧 on 式鉴的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 26 Aug 2026 16:09:10 +0800</lastBuildDate><atom:link href="https://ignvex.github.io/categories/%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7/index.xml" rel="self" type="application/rss+xml"/><item><title>Git 使用规范：分支、提交信息与版本管理</title><link>https://ignvex.github.io/p/git-%E4%BD%BF%E7%94%A8%E8%A7%84%E8%8C%83%E5%88%86%E6%94%AF%E6%8F%90%E4%BA%A4%E4%BF%A1%E6%81%AF%E4%B8%8E%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/</link><pubDate>Wed, 26 Aug 2026 16:09:10 +0800</pubDate><guid>https://ignvex.github.io/p/git-%E4%BD%BF%E7%94%A8%E8%A7%84%E8%8C%83%E5%88%86%E6%94%AF%E6%8F%90%E4%BA%A4%E4%BF%A1%E6%81%AF%E4%B8%8E%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/</guid><description>&lt;h2 id="引言"&gt;&lt;a href="#%e5%bc%95%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;引言
&lt;/h2&gt;&lt;p&gt;git是非常舒适的版本管理器。广受使用且评价极高。规范的使用方法也尤为重要，提高协作效率，这就是写本篇文章的目的，整理git的常见规范。&lt;/p&gt;
&lt;h2 id="git规范的核心部分"&gt;&lt;a href="#git%e8%a7%84%e8%8c%83%e7%9a%84%e6%a0%b8%e5%bf%83%e9%83%a8%e5%88%86" class="header-anchor"&gt;&lt;/a&gt;Git规范的核心部分
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;分支命名规范&lt;/li&gt;
&lt;li&gt;Commit提交信息规范&lt;/li&gt;
&lt;li&gt;分支合并规范&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分支命名规范"&gt;&lt;a href="#%e5%88%86%e6%94%af%e5%91%bd%e5%90%8d%e8%a7%84%e8%8c%83" class="header-anchor"&gt;&lt;/a&gt;分支命名规范
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;master/main 主分支,生产环境代码&lt;/li&gt;
&lt;li&gt;develop 开发分支,最新的代码&lt;/li&gt;
&lt;li&gt;feature/* 新功能分支&lt;/li&gt;
&lt;li&gt;bugfix/* 或 fix/* 修补bug分支&lt;/li&gt;
&lt;li&gt;release/* 预发布分支&lt;/li&gt;
&lt;li&gt;hotfix/* 热修复分支&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="提交信息规范"&gt;&lt;a href="#%e6%8f%90%e4%ba%a4%e4%bf%a1%e6%81%af%e8%a7%84%e8%8c%83" class="header-anchor"&gt;&lt;/a&gt;提交信息规范
&lt;/h3&gt;&lt;p&gt;这里推荐conventionalcommits规范&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;type&amp;gt;[optional scope]: &amp;lt;description&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[optional body]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[optional footer(s)]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="type"&gt;&lt;a href="#type" class="header-anchor"&gt;&lt;/a&gt;type
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;build: 用于修改项目构建系统，例如修改依赖库、外部接口或者升级 Node 版本等；&lt;/li&gt;
&lt;li&gt;chore: 用于对非业务性代码进行修改，例如修改构建流程或者工具配置等；&lt;/li&gt;
&lt;li&gt;ci: 用于修改持续集成流程，例如修改 Travis、Jenkins 等工作流配置；&lt;/li&gt;
&lt;li&gt;docs: 用于修改文档，例如修改 README 文件、API 文档等；&lt;/li&gt;
&lt;li&gt;style: 用于修改代码的样式，例如调整缩进、空格、空行等；&lt;/li&gt;
&lt;li&gt;refactor: 用于重构代码，例如修改代码结构、变量名、函数名等但不修改功能逻辑；&lt;/li&gt;
&lt;li&gt;perf: 用于优化性能，例如提升代码的性能、减少内存占用等；&lt;/li&gt;
&lt;li&gt;test: 用于修改测试用例，例如添加、删除、修改代码的测试用例等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="scope"&gt;&lt;a href="#scope" class="header-anchor"&gt;&lt;/a&gt;scope
&lt;/h4&gt;&lt;p&gt;表示修改的范围 e.g.feat(auth):&lt;/p&gt;
&lt;h4 id="description"&gt;&lt;a href="#description" class="header-anchor"&gt;&lt;/a&gt;description
&lt;/h4&gt;&lt;p&gt;总结代码变动了什么，并且使用祈使句&lt;/p&gt;
&lt;h4 id="body"&gt;&lt;a href="#body" class="header-anchor"&gt;&lt;/a&gt;body
&lt;/h4&gt;&lt;p&gt;记录具体的变动，修改原因，对比&lt;/p&gt;
&lt;h4 id="footer"&gt;&lt;a href="#footer" class="header-anchor"&gt;&lt;/a&gt;footer
&lt;/h4&gt;&lt;p&gt;关联关联的需求或声明破坏性变更
破坏性变更主要是以&lt;code&gt;!&lt;/code&gt;和&lt;code&gt;BREAKING CHANGE&lt;/code&gt;
示例请去参考资料中的原文中查看&lt;/p&gt;
&lt;h3 id="语义化版本"&gt;&lt;a href="#%e8%af%ad%e4%b9%89%e5%8c%96%e7%89%88%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;语义化版本
&lt;/h3&gt;&lt;p&gt;X.Y.Z&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;X为主版本号,当你做了不兼容的 API 修改，&lt;/li&gt;
&lt;li&gt;Y为次版本号,当你做了向下兼容的功能性新增，&lt;/li&gt;
&lt;li&gt;Z为修订号,当你做了向下兼容的问题修正。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="流程规范"&gt;&lt;a href="#%e6%b5%81%e7%a8%8b%e8%a7%84%e8%8c%83" class="header-anchor"&gt;&lt;/a&gt;流程规范
&lt;/h3&gt;&lt;h4 id="提交操作规范"&gt;&lt;a href="#%e6%8f%90%e4%ba%a4%e6%93%8d%e4%bd%9c%e8%a7%84%e8%8c%83" class="header-anchor"&gt;&lt;/a&gt;提交操作规范
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;原子化提交,一个commit只做一件事&lt;/li&gt;
&lt;li&gt;避免合并污染,使用rebase而不是merge&lt;/li&gt;
&lt;li&gt;合理Squash&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="代码评估规范"&gt;&lt;a href="#%e4%bb%a3%e7%a0%81%e8%af%84%e4%bc%b0%e8%a7%84%e8%8c%83" class="header-anchor"&gt;&lt;/a&gt;代码评估规范
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;背景/原因，为什么做这个改动&lt;/li&gt;
&lt;li&gt;改动点，具体动了哪些核心模块。&lt;/li&gt;
&lt;li&gt;复现，附上单元测试结果或前端截图/录屏。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="权限设计规范"&gt;&lt;a href="#%e6%9d%83%e9%99%90%e8%ae%be%e8%ae%a1%e8%a7%84%e8%8c%83" class="header-anchor"&gt;&lt;/a&gt;权限设计规范
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;保护核心分支,锁定main/master/develop分支&lt;/li&gt;
&lt;li&gt;除去敏感信息与密钥&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="仓库存储规范"&gt;&lt;a href="#%e4%bb%93%e5%ba%93%e5%ad%98%e5%82%a8%e8%a7%84%e8%8c%83" class="header-anchor"&gt;&lt;/a&gt;仓库存储规范
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;10M+静态文件不得推送到git仓库,需将其托管到仓库外的静态资源服务器&lt;/li&gt;
&lt;li&gt;分支需要在合并后及时清理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.conventionalcommits.org/zh-hans/v1.0.0/" target="_blank" rel="noopener"
 &gt;conventionalcommits规范原文&lt;/a&gt;
&lt;a class="link" href="https://semver.org/lang/zh-CN/#%E6%91%98%E8%A6%81" target="_blank" rel="noopener"
 &gt;语义化版本原文&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Caddy反代github</title><link>https://ignvex.github.io/p/caddy%E5%8F%8D%E4%BB%A3github/</link><pubDate>Sat, 15 Aug 2026 13:07:30 +0800</pubDate><guid>https://ignvex.github.io/p/caddy%E5%8F%8D%E4%BB%A3github/</guid><description>&lt;p&gt;github 直连不稳定，clone 大仓库动不动断流，release 下载经常超时。用一台海外服务器反代 github，网页、clone、raw、release 一把梭，一劳永逸。&lt;/p&gt;
&lt;p&gt;caddy 的安装与守护进程写法在上一篇已经详细介绍过，这里不再赘述，&lt;a class="link" href="https://ignvex.github.io/p/%E8%87%AA%E7%94%A8docker%E9%95%9C%E5%83%8F%E6%BA%90%E6%90%AD%E5%BB%BA/" &gt;跳转链接&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="快速搭建"&gt;&lt;a href="#%e5%bf%ab%e9%80%9f%e6%90%ad%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;快速搭建
&lt;/h2&gt;&lt;h3 id="配置caddyfile"&gt;&lt;a href="#%e9%85%8d%e7%bd%aecaddyfile" class="header-anchor"&gt;&lt;/a&gt;配置caddyfile
&lt;/h3&gt;&lt;p&gt;根据笔者踩坑经验。netcraft等公司有专门扫描仿冒站点的业务，会批量抓取网页，反代域名的登录等页面会被视为欺诈。申请回复的流程极为繁琐，所以这里加了些取巧的配置方法供读者放心的复制粘贴。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 换成你自己的域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt; /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; email you@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://github.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host github.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up origin https://github.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Location &amp;#34;https://github.com&amp;#34; &amp;#34;https://gh.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	handle /robots.txt {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		respond &amp;#34;User-agent: *\nDisallow: /&amp;#34; 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	# 白名单：只放行 git 协议与下载路径，网页一律 307 回原站
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	# 用 path_regexp，语义明确，不依赖 glob 通配符是否跨斜杠
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	@allow {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		# 合并为单条正则（每个命名 matcher 中 path_regexp 只能出现一次）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		# 覆盖：.git 协议形态（含 LFS/objects）、不带 .git 的首发请求、下载类路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		path_regexp ^/[^/]+/[^/]+(\\.git(/.*)?$|/(info/refs|git-upload-pack|git-receive-pack|HEAD)$|/archive/.*$|/releases/download/.*$|/raw/.*$|/(commit|commits|pull|pulls)/[^/]+\\.patch$)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	@rest {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		not {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;			path_regexp ^/[^/]+/[^/]+(\\.git(/.*)?$|/(info/refs|git-upload-pack|git-receive-pack|HEAD)$|/archive/.*$|/releases/download/.*$|/raw/.*$|/(commit|commits|pull|pulls)/[^/]+\\.patch$)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	redir @rest https://github.com{uri} 307
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	reverse_proxy https://github.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up Host {upstream_hostport}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up X-Forwarded-Host {host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up origin https://github.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		# 下载链 302 闭环：全部改写到自己镜像域名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_down Location &amp;#34;https://raw.githubusercontent.com&amp;#34; &amp;#34;https://raw.gh.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_down Location &amp;#34;https://codeload.github.com&amp;#34; &amp;#34;https://codeload.gh.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_down Location &amp;#34;https://objects.githubusercontent.com&amp;#34; &amp;#34;https://objects.gh.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;raw.gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	handle /robots.txt {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		respond &amp;#34;User-agent: *\nDisallow: /&amp;#34; 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	reverse_proxy https://raw.githubusercontent.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up Host raw.githubusercontent.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;objects.gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	handle /robots.txt {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		respond &amp;#34;User-agent: *\nDisallow: /&amp;#34; 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	reverse_proxy https://objects.githubusercontent.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up Host objects.githubusercontent.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_down Location &amp;#34;https://objects.githubusercontent.com&amp;#34; &amp;#34;https://objects.gh.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;codeload.gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	handle /robots.txt {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		respond &amp;#34;User-agent: *\nDisallow: /&amp;#34; 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	reverse_proxy https://codeload.github.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up Host codeload.github.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;api.gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	handle /robots.txt {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		respond &amp;#34;User-agent: *\nDisallow: /&amp;#34; 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	reverse_proxy https://api.github.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up Host api.github.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;gist.gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	handle /robots.txt {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		respond &amp;#34;User-agent: *\nDisallow: /&amp;#34; 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	# gist 的 clone 有两种深度：/id.git 与 /user/id.git，其余网页 307 回原站
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	@allow {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		# 单条正则：/id.git 与 /user/id.git 两种深度 + 不带 .git 的协议首发请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		path_regexp ^/(([^/]+/)?[^/]+\\.git(/.*)?$|([^/]+/)?[^/]+/(info/refs|git-upload-pack|git-receive-pack|HEAD)$)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	@rest {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		not {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;			path_regexp ^/(([^/]+/)?[^/]+\\.git(/.*)?$|([^/]+/)?[^/]+/(info/refs|git-upload-pack|git-receive-pack|HEAD)$)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	redir @rest https://gist.github.com{uri} 307
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	reverse_proxy https://gist.github.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up Host gist.github.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;avatars.gh.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	handle /robots.txt {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		respond &amp;#34;User-agent: *\nDisallow: /&amp;#34; 200
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	reverse_proxy https://avatars.githubusercontent.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;		header_up Host avatars.githubusercontent.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意事项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;email&lt;/code&gt; 换成自己的邮箱&lt;/li&gt;
&lt;li&gt;证书不用管，Caddy 自动申请续期，配置里不用写任何 &lt;code&gt;tls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;header_down&lt;/code&gt; 两个参数是删除、三个参数才是替换，且查找串要写上游实际域名（&lt;code&gt;https://github.com&lt;/code&gt; 这种），写成&amp;quot;期望结果&amp;quot;不会生效&lt;/li&gt;
&lt;li&gt;release 下载会 302 跳到 &lt;code&gt;objects.githubusercontent.com&lt;/code&gt;，所以必须反代它并重写 &lt;code&gt;Location&lt;/code&gt;，否则下载还是走原站&lt;/li&gt;
&lt;li&gt;页面里的 css/js 在 &lt;code&gt;github.githubassets.com&lt;/code&gt;、头像在 &lt;code&gt;avatars.githubusercontent.com&lt;/code&gt;，这些静态资源仍然直连；如果它们也慢，把对应域名也加进反代&lt;/li&gt;
&lt;li&gt;登录受 cookie 域名限制，反代域名登录不上就直连原站登录，浏览不受影响&lt;/li&gt;
&lt;li&gt;配置里出现的域名必须都能解析，否则 Caddy 会一直重试签证书&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="配置dns"&gt;&lt;a href="#%e9%85%8d%e7%bd%aedns" class="header-anchor"&gt;&lt;/a&gt;配置dns
&lt;/h3&gt;&lt;p&gt;嫌麻烦就加一条泛解析 &lt;code&gt;*.gh.example.com&lt;/code&gt;，前提是dns服务商支持泛解析。目前已知cloudflare支持
7 条 A 记录指向服务器公网 IP：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;codeload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;avatars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="验证部署"&gt;&lt;a href="#%e9%aa%8c%e8%af%81%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;验证部署
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo caddy validate --config /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl reload caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sI https://gh.example.com/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;返回 &lt;code&gt;200 OK&lt;/code&gt; 说明反代正常。再试一次 clone：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://gh.example.com/octocat/Hello-World.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;release 下载验证（换成真实的 release 链接）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sIL https://gh.example.com/user/repo/releases/download/v1.0/file.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;响应里的 &lt;code&gt;Location&lt;/code&gt; 应该是 &lt;code&gt;https://objects.gh.example.com/...&lt;/code&gt;，说明重写生效。&lt;/p&gt;
&lt;h2 id="快速使用"&gt;&lt;a href="#%e5%bf%ab%e9%80%9f%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;快速使用
&lt;/h2&gt;&lt;h3 id="git"&gt;&lt;a href="#git" class="header-anchor"&gt;&lt;/a&gt;git
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global url.&lt;span class="s2"&gt;&amp;#34;https://gh.example.com/&amp;#34;&lt;/span&gt;.insteadOf &lt;span class="s2"&gt;&amp;#34;https://github.com/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一劳永逸，记得换掉 example.com。之后 clone、pull 自动走反代，remote 地址不用改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/user/repo.git &lt;span class="c1"&gt;# 实际请求自动改写为 https://gh.example.com/user/repo.git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看改写规则是否生效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --get-regexp &lt;span class="s1"&gt;&amp;#39;^url\.&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="网页"&gt;&lt;a href="#%e7%bd%91%e9%a1%b5" class="header-anchor"&gt;&lt;/a&gt;网页
&lt;/h3&gt;&lt;p&gt;直接访问 &lt;code&gt;https://gh.example.com/&lt;/code&gt;，浏览仓库、代码、issue 都没问题。需要登录的操作（发 issue、提 PR）建议直连原站。&lt;/p&gt;
&lt;h3 id="raw与release"&gt;&lt;a href="#raw%e4%b8%8erelease" class="header-anchor"&gt;&lt;/a&gt;raw与release
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sSL https://raw.gh.example.com/user/repo/main/install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://gh.example.com/user/repo/releases/download/v1.0/app.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;脚本安装场景很实用，把 &lt;code&gt;curl ... | bash&lt;/code&gt; 里的地址换成反代域名即可。&lt;/p&gt;
&lt;h3 id="稍作补充"&gt;&lt;a href="#%e7%a8%8d%e4%bd%9c%e8%a1%a5%e5%85%85" class="header-anchor"&gt;&lt;/a&gt;稍作补充
&lt;/h3&gt;&lt;p&gt;用户目录下的 &lt;code&gt;.gitconfig&lt;/code&gt; 通过 &lt;code&gt;insteadOf&lt;/code&gt; 将 &lt;code&gt;git@github.com:&lt;/code&gt; 开头的地址换为反代地址（见下方示例），防止 VSCode 将你识别为企业版 github 用户。&lt;/p&gt;
&lt;p&gt;示例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;url &lt;span class="s2"&gt;&amp;#34;https://example.com/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nv"&gt;insteadOf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; git@github.com:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="补充之外的进阶玩法"&gt;&lt;a href="#%e8%a1%a5%e5%85%85%e4%b9%8b%e5%a4%96%e7%9a%84%e8%bf%9b%e9%98%b6%e7%8e%a9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;补充之外的进阶玩法
&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;.gitconfig&lt;/code&gt;中添加。
并在&lt;a class="link" href="https://github.com/settings/personal-access-tokens" target="_blank" rel="noopener"
 &gt;github&lt;/a&gt;配置token并赋予仓库相关的权限&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[credential &amp;#34;https://gh.example.com&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	provider = generic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>鹰角网络三方网站收集</title><link>https://ignvex.github.io/p/%E9%B9%B0%E8%A7%92%E7%BD%91%E7%BB%9C%E4%B8%89%E6%96%B9%E7%BD%91%E7%AB%99%E6%94%B6%E9%9B%86/</link><pubDate>Sat, 15 Aug 2026 11:45:32 +0800</pubDate><guid>https://ignvex.github.io/p/%E9%B9%B0%E8%A7%92%E7%BD%91%E7%BB%9C%E4%B8%89%E6%96%B9%E7%BD%91%E7%AB%99%E6%94%B6%E9%9B%86/</guid><description>&lt;p&gt;这一阵发现明日方舟有特别多的三方网站，便于自己查找便写了这篇文章。也希望对读者有些帮助。&lt;/p&gt;
&lt;h2 id="网站类"&gt;&lt;a href="#%e7%bd%91%e7%ab%99%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;网站类
&lt;/h2&gt;&lt;h3 id="明日方舟-ip-资料站"&gt;&lt;a href="#%e6%98%8e%e6%97%a5%e6%96%b9%e8%88%9f-ip-%e8%b5%84%e6%96%99%e7%ab%99" class="header-anchor"&gt;&lt;/a&gt;明日方舟 IP 资料站
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟, 终末地&lt;/code&gt; &lt;a class="link" href="https://www.arknights.wiki/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一站式收录明日方舟 IP 宇宙：从泰拉大陆的《明日方舟》，到塔卫二的《明日方舟：终末地》， 以及围绕它们展开的音乐、动画、漫画与周边文化。&lt;/p&gt;
&lt;h3 id="prts"&gt;&lt;a href="#prts" class="header-anchor"&gt;&lt;/a&gt;PRTS
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://prts.wiki/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;明日方舟的最全面、权威的民间数据与剧情考据平台&lt;/p&gt;
&lt;h3 id="终末地-wiki"&gt;&lt;a href="#%e7%bb%88%e6%9c%ab%e5%9c%b0-wiki" class="header-anchor"&gt;&lt;/a&gt;终末地 wiki
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 终末地&lt;/code&gt; &lt;a class="link" href="https://fz.wiki/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;玩家社区维护的《明日方舟：终末地》百科&lt;/p&gt;
&lt;h3 id="终末地资源地图"&gt;&lt;a href="#%e7%bb%88%e6%9c%ab%e5%9c%b0%e8%b5%84%e6%ba%90%e5%9c%b0%e5%9b%be" class="header-anchor"&gt;&lt;/a&gt;终末地资源地图
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 终末地&lt;/code&gt; &lt;a class="link" href="https://zmdmap.com/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;标记了塔卫二所有地图上的协议采录桩、宝箱、醚质点位、隐藏纸条以及故障机器人的解密攻略，跑图开荒必备。&lt;/p&gt;
&lt;h3 id="企鹅物流数据统计"&gt;&lt;a href="#%e4%bc%81%e9%b9%85%e7%89%a9%e6%b5%81%e6%95%b0%e6%8d%ae%e7%bb%9f%e8%ae%a1" class="header-anchor"&gt;&lt;/a&gt;企鹅物流数据统计
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://penguin-stats.cn/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;根据大量玩家提交的游戏数据进行统计的站点。&lt;/p&gt;
&lt;p&gt;官方介绍&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;企鹅物流数据统计（Penguin Statistics）是企鹅物流旗下数据处理部门（误），致力于明日方舟各素材的掉率统计。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;企鹅物流的现有数据集由玩家手动上报、截图识别与通过公共 API 上报合力维护。为了尽力保证数据集的准确性，企鹅物流数据团队会对掉落数据集进行多种方式的自动、定时及手动维护。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="终末地一图流"&gt;&lt;a href="#%e7%bb%88%e6%9c%ab%e5%9c%b0%e4%b8%80%e5%9b%be%e6%b5%81" class="header-anchor"&gt;&lt;/a&gt;终末地一图流
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 终末地&lt;/code&gt; &lt;a class="link" href="https://ef.yituliu.cn/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;计算终末地里“工业产线配电”的单页工具，为你的基地耗电做预估。&lt;/p&gt;
&lt;h3 id="明日方舟一图流"&gt;&lt;a href="#%e6%98%8e%e6%97%a5%e6%96%b9%e8%88%9f%e4%b8%80%e5%9b%be%e6%b5%81" class="header-anchor"&gt;&lt;/a&gt;明日方舟一图流
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://ark.yituliu.cn/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;基于企鹅物流的数据，直观显示当前活动哪一关刷材料最赚、绿票/高级凭证怎么兑换最划算，并带有攒抽计算器和礼包性价比评分。&lt;/p&gt;
&lt;h3 id="明日方舟工具箱"&gt;&lt;a href="#%e6%98%8e%e6%97%a5%e6%96%b9%e8%88%9f%e5%b7%a5%e5%85%b7%e7%ae%b1" class="header-anchor"&gt;&lt;/a&gt;明日方舟工具箱
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://arkntools.app/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;网页版公开招募计算器与干员培养规划工具。&lt;/p&gt;
&lt;h3 id="明日方舟干员培养表"&gt;&lt;a href="#%e6%98%8e%e6%97%a5%e6%96%b9%e8%88%9f%e5%b9%b2%e5%91%98%e5%9f%b9%e5%85%bb%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;明日方舟干员培养表
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://ark-nights.com/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;老牌著名的干员培养规划与地图模拟工具网站。主站是干员培养的材料及计算器，子站是地图查看器（见下一条 PRTS.MAP）。&lt;/p&gt;
&lt;h3 id="prtsmap"&gt;&lt;a href="#prtsmap" class="header-anchor"&gt;&lt;/a&gt;PRTS.MAP
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://map.ark-nights.com/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PRTS 衍生出的专门用于查阅地图与怪物路线的工具&lt;/p&gt;
&lt;h3 id="prtschat"&gt;&lt;a href="#prtschat" class="header-anchor"&gt;&lt;/a&gt;PRTS.chat
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://prts.chat/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;明日方舟剧情 AI 检索系统。&lt;/p&gt;
&lt;h3 id="寻访模拟器"&gt;&lt;a href="#%e5%af%bb%e8%ae%bf%e6%a8%a1%e6%8b%9f%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;寻访模拟器
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://hycdes.com/pages/AKT_HireSimulate.html" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;全网最古老、最长青的寻访模拟器&lt;/p&gt;
&lt;h3 id="明日方舟寻访记录分析"&gt;&lt;a href="#%e6%98%8e%e6%97%a5%e6%96%b9%e8%88%9f%e5%af%bb%e8%ae%bf%e8%ae%b0%e5%bd%95%e5%88%86%e6%9e%90" class="header-anchor"&gt;&lt;/a&gt;明日方舟寻访记录分析
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://arkgacha.kwer.top/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;分析你近 90 天的寻访记录。&lt;/p&gt;
&lt;h2 id="工具类"&gt;&lt;a href="#%e5%b7%a5%e5%85%b7%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;工具类
&lt;/h2&gt;&lt;h3 id="maa-assistant-arknights"&gt;&lt;a href="#maa-assistant-arknights" class="header-anchor"&gt;&lt;/a&gt;MAA Assistant Arknights
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://maa.plus/" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一款明日方舟游戏小助手。极为强大，维护频率极高，具体功能建议直接看&lt;a class="link" href="https://docs.maa.plus/zh-cn/" target="_blank" rel="noopener"
 &gt;文档&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="oc-template"&gt;&lt;a href="#oc-template" class="header-anchor"&gt;&lt;/a&gt;OC Template
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Include: 明日方舟&lt;/code&gt; &lt;a class="link" href="https://octemplate.top/akrecruit" target="_blank" rel="noopener"
 &gt;跳转链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;干员招募界面生成器&lt;/p&gt;</description></item><item><title>自用docker镜像源搭建</title><link>https://ignvex.github.io/p/%E8%87%AA%E7%94%A8docker%E9%95%9C%E5%83%8F%E6%BA%90%E6%90%AD%E5%BB%BA/</link><pubDate>Fri, 14 Aug 2026 23:09:30 +0800</pubDate><guid>https://ignvex.github.io/p/%E8%87%AA%E7%94%A8docker%E9%95%9C%E5%83%8F%E6%BA%90%E6%90%AD%E5%BB%BA/</guid><description>&lt;p&gt;公共 docker 加速器关了一大批，自己用一台海外服务器反代镜像仓库，一劳永逸。&lt;/p&gt;
&lt;h2 id="快速搭建"&gt;&lt;a href="#%e5%bf%ab%e9%80%9f%e6%90%ad%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;快速搭建
&lt;/h2&gt;&lt;h3 id="安装caddy"&gt;&lt;a href="#%e5%ae%89%e8%a3%85caddy" class="header-anchor"&gt;&lt;/a&gt;安装caddy
&lt;/h3&gt;&lt;p&gt;二进制放 &lt;code&gt;/usr/bin/caddy&lt;/code&gt;，服务文件 &lt;code&gt;/etc/systemd/system/caddy.service&lt;/code&gt;，配置 &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv caddy /usr/bin/caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;755&lt;/span&gt; /usr/bin/caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo setcap &lt;span class="nv"&gt;cap_net_bind_service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;+ep /usr/bin/caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo groupadd --system caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo useradd --system &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --gid caddy &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --create-home &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --home-dir /var/lib/caddy &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --shell /usr/sbin/nologin &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --comment &lt;span class="s2"&gt;&amp;#34;Caddy web server&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; caddy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="配置caddy守护进程"&gt;&lt;a href="#%e9%85%8d%e7%bd%aecaddy%e5%ae%88%e6%8a%a4%e8%bf%9b%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;配置caddy守护进程
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/systemd/system/caddy.service&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Caddy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://caddyserver.com/docs/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target network-online.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Requires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;notify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;caddy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;caddy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecReload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;TimeoutStopSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;5s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;LimitNOFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1048576&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;LimitNPROC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;PrivateTmp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ProtectSystem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;full&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;AmbientCapabilities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cap_net_bind_service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now caddy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="配置caddyfile"&gt;&lt;a href="#%e9%85%8d%e7%bd%aecaddyfile" class="header-anchor"&gt;&lt;/a&gt;配置caddyfile
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 换成你自己的域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt; /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; email you@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.docker.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://registry-1.docker.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host registry-1.docker.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;https://auth.docker.io&amp;#34; &amp;#34;https://auth.docker.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Location &amp;#34;https://production.cloudflare.docker.com&amp;#34; &amp;#34;https://production.cloudflare.docker.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;auth.docker.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://auth.docker.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host auth.docker.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;production.cloudflare.docker.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://production.cloudflare.docker.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host production.cloudflare.docker.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.quay.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://quay.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host quay.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;https://quay.io/v2/auth&amp;#34; &amp;#34;https://hub.quay.\${DOMAIN}/v2/auth&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.gcr.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://gcr.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host gcr.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;https://gcr.io/v2/token&amp;#34; &amp;#34;https://hub.gcr.\${DOMAIN}/v2/token&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.k8s.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://registry.k8s.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host registry.k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;https://registry.k8s.io/v2/token&amp;#34; &amp;#34;https://hub.k8s.\${DOMAIN}/v2/token&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Location &amp;#34;https://storage.googleapis.com&amp;#34; &amp;#34;https://storage.googleapis.\${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;storage.googleapis.\${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy https://storage.googleapis.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host storage.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意事项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;email&lt;/code&gt; 换成自己的邮箱&lt;/li&gt;
&lt;li&gt;证书不用管，Caddy 自动申请续期，配置里不用写任何 &lt;code&gt;tls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;k8s.gcr.io&lt;/code&gt; 已退役，k8s 站点反代的是新的 &lt;code&gt;registry.k8s.io&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;header_down&lt;/code&gt; 两个参数是删除、三个参数才是替换，且查找串要写上游实际域名（&lt;code&gt;https://auth.docker.io&lt;/code&gt; 这种），写成&amp;quot;期望结果&amp;quot;不会生效&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="配置dns"&gt;&lt;a href="#%e9%85%8d%e7%bd%aedns" class="header-anchor"&gt;&lt;/a&gt;配置dns
&lt;/h3&gt;&lt;p&gt;7 条 A 记录指向服务器公网 IP：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hub.docker.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;auth.docker.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;production.cloudflare.docker.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hub.quay.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hub.gcr.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hub.k8s.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;storage.googleapis.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;嫌麻烦就加一条泛解析 &lt;code&gt;*.docker.example.com&lt;/code&gt;。配置里出现的域名必须都能解析，否则 Caddy 会一直重试签证书。&lt;/p&gt;
&lt;h3 id="验证部署"&gt;&lt;a href="#%e9%aa%8c%e8%af%81%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;验证部署
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo caddy validate --config /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl reload caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sI https://hub.docker.example.com/v2/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;返回 &lt;code&gt;401 Unauthorized&lt;/code&gt; 是正常的，同时响应头里 &lt;code&gt;Www-Authenticate&lt;/code&gt; 的 realm 应该是 &lt;code&gt;https://auth.docker.example.com/token&lt;/code&gt;，说明重写生效。最终测试：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull hub.docker.example.com/library/hello-world:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="快速使用"&gt;&lt;a href="#%e5%bf%ab%e9%80%9f%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;快速使用
&lt;/h2&gt;&lt;h3 id="unraid"&gt;&lt;a href="#unraid" class="header-anchor"&gt;&lt;/a&gt;unraid
&lt;/h3&gt;&lt;p&gt;Settings → Docker → Advanced View → Docker Hub URL 改成 &lt;code&gt;https://hub.docker.example.com&lt;/code&gt;，或者拉镜像时直接写完整地址 &lt;code&gt;hub.docker.example.com/linuxserver/plex&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="其他主流linux"&gt;&lt;a href="#%e5%85%b6%e4%bb%96%e4%b8%bb%e6%b5%81linux" class="header-anchor"&gt;&lt;/a&gt;其他主流linux
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;registry-mirrors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://hub.docker.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;之后 &lt;code&gt;docker pull nginx&lt;/code&gt; 自动走代理。registry-mirrors 只接管 Docker Hub，gcr/quay 镜像换前缀拉：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull hub.quay.example.com/prometheus/prometheus:latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull hub.gcr.example.com/istio/proxyv2:1.20.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以加公共源兜底：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;registry-mirrors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://hub.docker.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://mirrors.tuna.tsinghua.edu.cn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Hugo 实用技巧</title><link>https://ignvex.github.io/p/hugo-%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7/</link><pubDate>Fri, 14 Aug 2026 22:44:27 +0800</pubDate><guid>https://ignvex.github.io/p/hugo-%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7/</guid><description>&lt;h2 id="引言"&gt;&lt;a href="#%e5%bc%95%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;引言
&lt;/h2&gt;&lt;p&gt;用Hugo这个框架已经有了两个月，积累了一些常用的技巧，对于刚开始用的新人来说算是比较实用的。我认为官方文档写的不错的地方我会照搬，尊重文档 :)&lt;/p&gt;
&lt;h2 id="步入正题"&gt;&lt;a href="#%e6%ad%a5%e5%85%a5%e6%ad%a3%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;步入正题
&lt;/h2&gt;&lt;h3 id="hugo的预览"&gt;&lt;a href="#hugo%e7%9a%84%e9%a2%84%e8%a7%88" class="header-anchor"&gt;&lt;/a&gt;hugo的预览
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server &lt;span class="c1"&gt;# 本地预览博客&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D &lt;span class="c1"&gt;# 预览本地博客，draft=true的文章会有显示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="hugo创建文章"&gt;&lt;a href="#hugo%e5%88%9b%e5%bb%ba%e6%96%87%e7%ab%a0" class="header-anchor"&gt;&lt;/a&gt;hugo创建文章
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new post/***.md &lt;span class="c1"&gt;#纯文本博客&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new post/***/index.md &lt;span class="c1"&gt;#可以附上写静态资源的博客&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="hugo文章内使用相对链接"&gt;&lt;a href="#hugo%e6%96%87%e7%ab%a0%e5%86%85%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9%e9%93%be%e6%8e%a5" class="header-anchor"&gt;&lt;/a&gt;hugo文章内使用相对链接
&lt;/h2&gt;&lt;p&gt;这个直接照搬文档&lt;a class="link" href="https://gohugo.io/shortcodes/relref/" target="_blank" rel="noopener"
 &gt;官方文档&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Docker 使用指南：镜像、容器与 Dockerfile</title><link>https://ignvex.github.io/p/docker-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%E9%95%9C%E5%83%8F%E5%AE%B9%E5%99%A8%E4%B8%8E-dockerfile/</link><pubDate>Fri, 14 Aug 2026 21:06:32 +0800</pubDate><guid>https://ignvex.github.io/p/docker-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%E9%95%9C%E5%83%8F%E5%AE%B9%E5%99%A8%E4%B8%8E-dockerfile/</guid><description>&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;docker是一个轻量化且开源的容器引擎。借由Go驱动有着极低性能开销。不过仅支持linux发行版的系统&lt;/p&gt;
&lt;h2 id="安装"&gt;&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;安装
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/" target="_blank" rel="noopener"
 &gt;金枪鱼镜像站&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;DOCKER的安装教程非常的多，再加上国外主机的访问速度奇差，这里建议直接用知名金枪鱼镜像站的文档去安装,节约更多的时间在搜索教程和镜像站上。&lt;/p&gt;
&lt;h2 id="使用方法"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;使用方法
&lt;/h2&gt;&lt;h3 id="镜像管理"&gt;&lt;a href="#%e9%95%9c%e5%83%8f%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;镜像管理
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image ls &lt;span class="c1"&gt;# 列出本地所有镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image rm &lt;span class="o"&gt;{&lt;/span&gt;IMAGE_NAME&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# 删除本地的某个镜像 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build &lt;span class="c1"&gt;# 编译docker镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="docker-build"&gt;&lt;a href="#docker-build" class="header-anchor"&gt;&lt;/a&gt;docker build
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;-t为编译的镜像&lt;/li&gt;
&lt;li&gt;-f为指定dockerfile路径&lt;/li&gt;
&lt;li&gt;-no-cache 为不使用缓存构建镜像&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;当前目录及其子目录被当作上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="进阶操作"&gt;&lt;a href="#%e8%bf%9b%e9%98%b6%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;进阶操作
&lt;/h4&gt;&lt;p&gt;使用&lt;code&gt;.dockerignore&lt;/code&gt;排除不必要的文件，减少镜像体积&lt;/p&gt;
&lt;h3 id="容器操作"&gt;&lt;a href="#%e5%ae%b9%e5%99%a8%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;容器操作
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run &lt;span class="c1"&gt;# 创建并启动某个容器 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker start &lt;span class="o"&gt;{&lt;/span&gt;IMAGE_NAME&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# 启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop &lt;span class="o"&gt;{&lt;/span&gt;IMAGE_NAME&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# 停止&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker restart &lt;span class="o"&gt;{&lt;/span&gt;IMAGE_NAME&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker attach &lt;span class="o"&gt;{&lt;/span&gt;IMAGE_NAME&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# 在终端中直接进入容器内 (不推荐)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="c1"&gt;# 在终端中直接进入容器内 (推荐)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps &lt;span class="c1"&gt;#查看所有容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="容器操作补充"&gt;&lt;a href="#%e5%ae%b9%e5%99%a8%e6%93%8d%e4%bd%9c%e8%a1%a5%e5%85%85" class="header-anchor"&gt;&lt;/a&gt;容器操作补充
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;docker restart 可以在docker容器没有运行的情况下直接启动，如果在运行就是重启&lt;/li&gt;
&lt;li&gt;attach 会随着你输入&lt;code&gt;ctrl c&lt;/code&gt;或&lt;code&gt;exit&lt;/code&gt;的同时关闭容器&lt;/li&gt;
&lt;li&gt;exec是你要访问的同一容器的新进程，需要查看你跑服务的进程请使用docker logs&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="docker-run"&gt;&lt;a href="#docker-run" class="header-anchor"&gt;&lt;/a&gt;docker run
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;-d 在后台运行&lt;/li&gt;
&lt;li&gt;&amp;ndash;name指定容器名称&lt;/li&gt;
&lt;li&gt;-p 容器内端口映射到容器外&lt;/li&gt;
&lt;li&gt;-v 主机路径映射到容器内&lt;/li&gt;
&lt;li&gt;-it 打开交互式终端&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="docker-exec"&gt;&lt;a href="#docker-exec" class="header-anchor"&gt;&lt;/a&gt;docker exec
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;-i 允许向容器发送内容(交互)&lt;/li&gt;
&lt;li&gt;-t 分配一个伪终端&lt;/li&gt;
&lt;li&gt;-it &lt;code&gt;-i&lt;/code&gt;和&lt;code&gt;it&lt;/code&gt;的组合(常用)&lt;/li&gt;
&lt;li&gt;-d 在后台运行&lt;/li&gt;
&lt;li&gt;-u 指定用户&lt;/li&gt;
&lt;li&gt;-e 设置环境变量&lt;/li&gt;
&lt;li&gt;-w 指定容器内工作目录&lt;/li&gt;
&lt;li&gt;&amp;ndash;privileged 最高权限模式。等同于直接操作物理机(用之前先确定自己为什么要这么做)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="docker-ps"&gt;&lt;a href="#docker-ps" class="header-anchor"&gt;&lt;/a&gt;docker ps
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;ps -a 查看所有容器&lt;/li&gt;
&lt;li&gt;ps -q 只查看容器id&lt;/li&gt;
&lt;li&gt;ps -s 显示容器大小&lt;/li&gt;
&lt;li&gt;ps -n 显示最后创建的&lt;/li&gt;
&lt;li&gt;ps -f 根据条件过滤容器(ps -f status=exited)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dockerfile-的写法"&gt;&lt;a href="#dockerfile-%e7%9a%84%e5%86%99%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;Dockerfile 的写法
&lt;/h2&gt;&lt;h3 id="基础内容"&gt;&lt;a href="#%e5%9f%ba%e7%a1%80%e5%86%85%e5%ae%b9" class="header-anchor"&gt;&lt;/a&gt;基础内容
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;{IMAGE_NAME&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;CUSTOM&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.runoob.com/docker/docker-container-usage.html" target="_blank" rel="noopener"
 &gt;菜鸟教程&lt;/a&gt;
&lt;a class="link" href="https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html" target="_blank" rel="noopener"
 &gt;廖雪峰的教程&lt;/a&gt;&lt;/p&gt;</description></item><item><title>SDKMAN!：Java 版本管理器</title><link>https://ignvex.github.io/p/sdkmanjava-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E5%99%A8/</link><pubDate>Sun, 05 Jul 2026 23:44:18 +0800</pubDate><guid>https://ignvex.github.io/p/sdkmanjava-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E5%99%A8/</guid><description>&lt;img src="https://ignvex.github.io/p/sdkmanjava-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E5%99%A8/background.svg" alt="Featured image of post SDKMAN!：Java 版本管理器" /&gt;&lt;p&gt;SDKMAN! 是一款轻量级的软件开发工具包管理器，专为 Java、Kotlin、Gradle、Maven 等 JVM 生态工具设计。基于 Shell 脚本实现，安装零依赖，响应飞快，不侵入系统环境。无论是频繁切换 JDK 版本，还是尝鲜最新构建工具，一行命令即可搞定。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://sdkman.io/" target="_blank" rel="noopener"
 &gt;项目地址&lt;/a&gt; | &lt;a class="link" href="https://sdkman.io/usage" target="_blank" rel="noopener"
 &gt;使用文档&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="快速安装"&gt;&lt;a href="#%e5%bf%ab%e9%80%9f%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;快速安装
&lt;/h2&gt;&lt;h3 id="windows"&gt;&lt;a href="#windows" class="header-anchor"&gt;&lt;/a&gt;Windows
&lt;/h3&gt;&lt;p&gt;Scoop&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scoop install sdkman
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.sdkman/bin/sdkman-init.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="debian--ubuntu--deepin--macos--manjaro--arch"&gt;&lt;a href="#debian--ubuntu--deepin--macos--manjaro--arch" class="header-anchor"&gt;&lt;/a&gt;Debian / Ubuntu / Deepin / macOS / Manjaro / Arch
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install curl -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s &lt;span class="s2"&gt;&amp;#34;https://get.sdkman.io&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.sdkman/bin/sdkman-init.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="manjaro--arch"&gt;&lt;a href="#manjaro--arch" class="header-anchor"&gt;&lt;/a&gt;Manjaro / Arch
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yay -S sdkman
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="使用"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;使用
&lt;/h2&gt;&lt;p&gt;打开终端，输入 &lt;code&gt;sdk&lt;/code&gt; 唤起。以下是常用指令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;查看可用的 SDK 版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk list java # 所有可安装的 Java 发行版及版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk list gradle # 查看 Gradle 可用版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;安装指定版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk install java 17.0.10-tem # 安装 Eclipse Temurin 的 JDK 17
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk install maven 3.9.6 # 安装 Maven 3.9.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk install kotlin # 不指定版本则安装最新稳定版
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;版本切换
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk use java 11.0.22-tem # 当前终端临时切换为 JDK 11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk default java 21.0.2-tem # 设置 JDK 21 为新终端默认版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;查看当前版本与已安装列表
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk current java # 当前使用的 Java 版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk current # 查看所有被管理的 SDK 当前版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;卸载不需要的版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sdk uninstall gradle 7.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="支持的部分-sdk-列表"&gt;&lt;a href="#%e6%94%af%e6%8c%81%e7%9a%84%e9%83%a8%e5%88%86-sdk-%e5%88%97%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;支持的部分 SDK 列表
&lt;/h2&gt;&lt;p&gt;Java (Adoptium, Corretto, GraalVM, Zulu…) · Kotlin · Groovy · Scala&lt;br&gt;
Gradle · Maven · sbt · Ant · Spring Boot CLI · Micronaut · Quarkus · VisualVM&lt;br&gt;
MongoDB Shell · Hadoop · Spark · 更多可通过 &lt;code&gt;sdk list&lt;/code&gt; 查找&lt;/p&gt;</description></item><item><title>java发行版选择指南</title><link>https://ignvex.github.io/p/java%E5%8F%91%E8%A1%8C%E7%89%88%E9%80%89%E6%8B%A9%E6%8C%87%E5%8D%97/</link><pubDate>Sun, 05 Jul 2026 23:02:10 +0800</pubDate><guid>https://ignvex.github.io/p/java%E5%8F%91%E8%A1%8C%E7%89%88%E9%80%89%E6%8B%A9%E6%8C%87%E5%8D%97/</guid><description>&lt;img src="https://ignvex.github.io/p/java%E5%8F%91%E8%A1%8C%E7%89%88%E9%80%89%E6%8B%A9%E6%8C%87%E5%8D%97/background.png" alt="Featured image of post java发行版选择指南" /&gt;&lt;p&gt;java是非常优秀的编程语言，是21世纪极为优秀的语言。但java在2006年将本体与hotspot开源并形成openjdk后，java发行版的选择也不只官方独有，可选择的内容多了，但如何选择适合自己需求的发行版，便成为了一个重要的议题，即本文主题。&lt;/p&gt;
&lt;h2 id="java的概念明晰"&gt;&lt;a href="#java%e7%9a%84%e6%a6%82%e5%bf%b5%e6%98%8e%e6%99%b0" class="header-anchor"&gt;&lt;/a&gt;java的概念明晰
&lt;/h2&gt;&lt;p&gt;jvm, jre, jdk, java fx 之间是包含关系。jvm 是执行程序的虚拟机，是核心；jre 是基于 jvm 的标准库，相当于运行环境；jdk 在 jre 基础上提供面向开发者的工具，算是开发工具。但 jvm 并不是最小的分发单位，jre 才是。&lt;/p&gt;
&lt;p&gt;java fx 的地位比较特殊，它是一套独立的图形界面方案，定位跟前面三个完全不同。简单说，它就是专门用来画桌面窗口、按钮、动画这些东西的库，靠显卡来做渲染，界面效果比传统 swing 强一截。很多 java 桌面的项目依赖它，像是 hmcl 这类启动器。问题是它从来不属于标准库的一部分，现在常见的 jdk 发行里也不会预装。开源社区维护的版本叫 openjfx，关系和 openjdk 差不多。如果用到的程序需要它，要么自己下载 openjfx 配上去，要么换一个已经把 java fx 打包好的 jdk 发行版。&lt;/p&gt;
&lt;h2 id="java版本选择"&gt;&lt;a href="#java%e7%89%88%e6%9c%ac%e9%80%89%e6%8b%a9" class="header-anchor"&gt;&lt;/a&gt;java版本选择
&lt;/h2&gt;&lt;p&gt;在使用场景中,java版本求稳不求新。原理很好解释,举个例子即可，java8(lts)官方扩展支持将持续到2030年12月，但同为lts的java17仅支持到2029年9月，从安全性等角度出发，这会是最有说服力的示例。&lt;/p&gt;
&lt;p&gt;以minecraft举例&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;minecraft版本&lt;/th&gt;
					&lt;th&gt;java要求&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;lt;= 1.12.2&lt;/td&gt;
					&lt;td&gt;仅java 8&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;gt;= 1.16&lt;/td&gt;
					&lt;td&gt;java 17+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;gt;= 1.21&lt;/td&gt;
					&lt;td&gt;java 21+&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="java-版本号选择"&gt;&lt;a href="#java-%e7%89%88%e6%9c%ac%e5%8f%b7%e9%80%89%e6%8b%a9" class="header-anchor"&gt;&lt;/a&gt;java 版本号选择
&lt;/h2&gt;&lt;p&gt;同版本下字数越大越好，越新越好。&lt;/p&gt;
&lt;p&gt;java更新的主要内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关键安全更新（CPU） - 经过测试的安全性更新&lt;/li&gt;
&lt;li&gt;补丁集更新（PSU） - 功能性更新/调整&lt;/li&gt;
&lt;li&gt;紧急更新 - 通常为修补前两类更新缺陷的紧急更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="java主要发行版"&gt;&lt;a href="#java%e4%b8%bb%e8%a6%81%e5%8f%91%e8%a1%8c%e7%89%88" class="header-anchor"&gt;&lt;/a&gt;java主要发行版
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;发行版名称&lt;/th&gt;
					&lt;th&gt;发行商&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Azul Zing (Azul Platform Prime)&lt;/td&gt;
					&lt;td&gt;Azul Systems&lt;/td&gt;
					&lt;td&gt;优势: 自研 Falcon JIT 编译器, 无停顿 C4 垃圾收集器, 基于 JIT 缓存与 profile 引导的 ReadyNow 冷启动加速, 综合性能和停顿表现优异, 适合大型整合包服务器; 劣势: 仅支持 Linux; 商业产品, 仅 &amp;ldquo;评估和开发用途&amp;rdquo; 免费, 商业化服务器使用有法律风险; 需额外 JVM 参数才能发挥全部功能.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Azul Zulu (Azul Platform Core)&lt;/td&gt;
					&lt;td&gt;Azul Systems&lt;/td&gt;
					&lt;td&gt;优势: 免费生产就绪级 OpenJDK, 更新稳定, 提供 JavaFX 选项和可视化 .msi 安装包, 安装/更新体验友好, 是官方 Java 的极佳替代; 劣势: 源代码不直接公开, 本质仍是标准 OpenJDK 构建, 性能与非定制版差异不大.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Oracle GraalVM (旧有 Java 发行版)&lt;/td&gt;
					&lt;td&gt;Oracle&lt;/td&gt;
					&lt;td&gt;优势: 曾支持 AOT 原生编译, 多语言运行时, 冷启动快, 内存占用低; 劣势: Oracle 宣布停止发布新的 GraalVM for JDK 版本, 已 &amp;ldquo;坠机&amp;rdquo;, 核心 Java 优化已或即将回归上游 OpenJDK, 不再适合作为主流 JDK 发行版持续选用.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Adoptium Temurin&lt;/td&gt;
					&lt;td&gt;Eclipse Adoptium (原 AdoptOpenJDK)&lt;/td&gt;
					&lt;td&gt;优势: Eclipse 顶级项目, 最标准的 OpenJDK 构建, 社区驱动的生产就绪级, 多项认证, 曾是首选, 跨平台且完全开源免费; 劣势: 与上游几乎一致, 所谓性能提升通常不显著, 无特殊定制优化.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Amazon Corretto&lt;/td&gt;
					&lt;td&gt;Amazon&lt;/td&gt;
					&lt;td&gt;优势: 声称综合性能与安全性提升, 使用自研密码学库强化加密, 免费, 长期更新; 劣势: 除密码学相关外, 性能与上游 OpenJDK 无显著差异, 亮点不多.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Alibaba Dragonwell&lt;/td&gt;
					&lt;td&gt;阿里巴巴&lt;/td&gt;
					&lt;td&gt;优势: 基于 AJDK 的优化移植, 开源, 对大规模 Java 应用可能有一定增益; 劣势: 社区国际化程度有限, 更新节奏依赖阿里内部, 非定制场景下提升不明显.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IBM Semeru Runtime&lt;/td&gt;
					&lt;td&gt;IBM&lt;/td&gt;
					&lt;td&gt;优势: 即 Eclipse OpenJ9, 内存占用相比 HotSpot 更优, 适合内存受限场景; 劣势: 性能往往不如 HotSpot, 且属于高度自定义的 JDK, 一般游戏服务器可能收益不大.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Microsoft Build of OpenJDK&lt;/td&gt;
					&lt;td&gt;Microsoft&lt;/td&gt;
					&lt;td&gt;优势: 我的世界启动器默认下载的高版本 Java, 猜测为避免版权纠纷; 劣势: 无突出亮点, 本质上为标准 OpenJDK 构建, 只是提供方不同.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="言归正传"&gt;&lt;a href="#%e8%a8%80%e5%bd%92%e6%ad%a3%e4%bc%a0" class="header-anchor"&gt;&lt;/a&gt;言归正传
&lt;/h2&gt;&lt;p&gt;推荐 Azul Zing的发行版。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.geeksforgeeks.org/java/differences-jdk-jre-jvm/" target="_blank" rel="noopener"
 &gt;geeksforgeeks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ssh欢迎信息修改</title><link>https://ignvex.github.io/p/ssh%E6%AC%A2%E8%BF%8E%E4%BF%A1%E6%81%AF%E4%BF%AE%E6%94%B9/</link><pubDate>Sat, 04 Jul 2026 20:47:43 +0800</pubDate><guid>https://ignvex.github.io/p/ssh%E6%AC%A2%E8%BF%8E%E4%BF%A1%E6%81%AF%E4%BF%AE%E6%94%B9/</guid><description>&lt;p&gt;众所周知，每次通过SSH连接到服务器都会看到一段欢迎信息，这个欢迎信息是可以完全自定义的。常见的方式有两种：直接修改静态的 &lt;code&gt;/etc/motd&lt;/code&gt; 文件，或者利用 Ubuntu/Debian 的 &lt;code&gt;update-motd&lt;/code&gt; 动态脚本。&lt;/p&gt;
&lt;h2 id="1-修改静态欢迎信息-etcmotd"&gt;&lt;a href="#1-%e4%bf%ae%e6%94%b9%e9%9d%99%e6%80%81%e6%ac%a2%e8%bf%8e%e4%bf%a1%e6%81%af-etcmotd" class="header-anchor"&gt;&lt;/a&gt;1. 修改静态欢迎信息 /etc/motd
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/motd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;写入你想显示的内容，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Welcome to my server!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;保存后重新登录，就能看到新内容了。&lt;/p&gt;
&lt;h2 id="2-ubuntudebian动态motd"&gt;&lt;a href="#2-ubuntudebian%e5%8a%a8%e6%80%81motd" class="header-anchor"&gt;&lt;/a&gt;2. Ubuntu/Debian：动态MOTD
&lt;/h2&gt;&lt;p&gt;如果你用的是 Ubuntu/Debian，登录时会看到一堆系统提示（版本信息、可更新包数量、livepatch 等），这些不是来自 &lt;code&gt;/etc/motd&lt;/code&gt;，而是来自 &lt;code&gt;/etc/update-motd.d/&lt;/code&gt; 目录下的脚本，由 PAM 在登录时动态执行生成。&lt;/p&gt;
&lt;p&gt;查看目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /etc/update-motd.d/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;常见的脚本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;00-header&lt;/code&gt;：显示系统版本信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;10-help-text&lt;/code&gt;：显示帮助提示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;90-updates-available&lt;/code&gt;：显示可更新软件包数量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;想让登录界面只剩你自己的内容，把脚本的可执行权限去掉即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod -x /etc/update-motd.d/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后再按第1步修改 &lt;code&gt;/etc/motd&lt;/code&gt;，重新登录就只会显示你写的内容了。&lt;/p&gt;
&lt;h2 id="3-用figlet生成ascii艺术字"&gt;&lt;a href="#3-%e7%94%a8figlet%e7%94%9f%e6%88%90ascii%e8%89%ba%e6%9c%af%e5%ad%97" class="header-anchor"&gt;&lt;/a&gt;3. 用figlet生成ASCII艺术字
&lt;/h2&gt;&lt;p&gt;觉得纯文本太素？可以用 &lt;code&gt;figlet&lt;/code&gt; 生成 ASCII 艺术字：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install figlet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;生成并写入 &lt;code&gt;/etc/motd&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;figlet -f slant &lt;span class="s2"&gt;&amp;#34;Welcome to my server&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/motd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;-f&lt;/code&gt; 指定字体，可以换成 &lt;code&gt;big&lt;/code&gt;、&lt;code&gt;standard&lt;/code&gt; 等，重新登录看看效果。&lt;/p&gt;
&lt;h2 id="4-修改后没生效怎么办"&gt;&lt;a href="#4-%e4%bf%ae%e6%94%b9%e5%90%8e%e6%b2%a1%e7%94%9f%e6%95%88%e6%80%8e%e4%b9%88%e5%8a%9e" class="header-anchor"&gt;&lt;/a&gt;4. 修改后没生效怎么办
&lt;/h2&gt;&lt;p&gt;如果改了 &lt;code&gt;/etc/motd&lt;/code&gt; 登录却不显示，检查 sshd 配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo grep -i printmotd /etc/ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;默认是 &lt;code&gt;PrintMotd yes&lt;/code&gt;，如果是 &lt;code&gt;no&lt;/code&gt;，改成 &lt;code&gt;yes&lt;/code&gt; 后重启 sshd：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart sshd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="5-恢复默认"&gt;&lt;a href="#5-%e6%81%a2%e5%a4%8d%e9%bb%98%e8%ae%a4" class="header-anchor"&gt;&lt;/a&gt;5. 恢复默认
&lt;/h2&gt;&lt;p&gt;不想要自定义内容了，清空 &lt;code&gt;/etc/motd&lt;/code&gt; 并恢复动态脚本权限即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo truncate -s &lt;span class="m"&gt;0&lt;/span&gt; /etc/motd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod +x /etc/update-motd.d/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>在linux上使用onedrive</title><link>https://ignvex.github.io/p/%E5%9C%A8linux%E4%B8%8A%E4%BD%BF%E7%94%A8onedrive/</link><pubDate>Sat, 04 Jul 2026 20:39:34 +0800</pubDate><guid>https://ignvex.github.io/p/%E5%9C%A8linux%E4%B8%8A%E4%BD%BF%E7%94%A8onedrive/</guid><description>&lt;p&gt;onedrive官方并没有提供linux平台的支持。但在github上有一个可以使用onedrive的&lt;a class="link" href="https://github.com/abraunegg/onedrive" target="_blank" rel="noopener"
 &gt;仓库&lt;/a&gt;。配置起来相对简单，还能让我的Microsoft 365发挥他的价值。&lt;/p&gt;
&lt;h2 id="1-安装"&gt;&lt;a href="#1-%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;1. 安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install onedrive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-登录"&gt;&lt;a href="#2-%e7%99%bb%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;2. 登录
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;onedrive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;根据提示进行操作&lt;/p&gt;
&lt;h2 id="3-配置onedrive"&gt;&lt;a href="#3-%e9%85%8d%e7%bd%aeonedrive" class="header-anchor"&gt;&lt;/a&gt;3. 配置onedrive
&lt;/h2&gt;&lt;p&gt;根据&lt;a class="link" href="https://github.com/abraunegg/onedrive/blob/master/docs/usage.md" target="_blank" rel="noopener"
 &gt;文档&lt;/a&gt;进一步的配置&lt;/p&gt;
&lt;p&gt;文档中的部分内容
获取配置文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://raw.githubusercontent.com/abraunegg/onedrive/master/config -O ~/.config/onedrive/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;非文档内容
systemd&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Description=OneDrive Client for Linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;After=network.target NetworkManager.service systemd-networkd.service iwd.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LimitNPROC=500
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LimitNOFILE=1000000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ExecStartPre=/usr/bin/sleep 1s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ExecStart=/usr/local/bin/onedrive --sync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;需要代理可以增加以下内容&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment=&amp;#34;HTTP_PROXY=http://your.proxy.server:port&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment=&amp;#34;HTTPS_PROXY=http://your.proxy.server:port&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Linux 基础工具代理配置（wget / curl / git）</title><link>https://ignvex.github.io/p/linux-%E5%9F%BA%E7%A1%80%E5%B7%A5%E5%85%B7%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AEwget-/-curl-/-git/</link><pubDate>Fri, 04 Jul 2025 20:43:30 +0800</pubDate><guid>https://ignvex.github.io/p/linux-%E5%9F%BA%E7%A1%80%E5%B7%A5%E5%85%B7%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AEwget-/-curl-/-git/</guid><description>&lt;h2 id="wget"&gt;&lt;a href="#wget" class="header-anchor"&gt;&lt;/a&gt;Wget
&lt;/h2&gt;&lt;p&gt;目标路径 &lt;code&gt;/etc/wgetrc&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https_proxy = http://127.0.0.1:7890/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http_proxy = http://127.0.0.1:7890/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftp_proxy = http://127.0.0.1:7890/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;use_proxy = on
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="git"&gt;&lt;a href="#git" class="header-anchor"&gt;&lt;/a&gt;Git
&lt;/h2&gt;&lt;p&gt;命令行执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global http.proxy http://127.0.0.1:1080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global https.proxy http://127.0.0.1:1080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;取消代理&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global --unset http.proxy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global --unset https.proxy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="curl"&gt;&lt;a href="#curl" class="header-anchor"&gt;&lt;/a&gt;Curl
&lt;/h2&gt;&lt;p&gt;目标路径 &lt;code&gt;~/.curlrc&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;proxy=&amp;#34;http://127.0.0.1:7890&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>