<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Luyus</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://blog.xinghenluyus.cn/</id>
  <link href="https://blog.xinghenluyus.cn/" rel="alternate"/>
  <link href="https://blog.xinghenluyus.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Luyus</rights>
  <subtitle>A website for recording technical learning</subtitle>
  <title>Luyus的个人站点</title>
  <updated>2025-12-15T03:49:51.338Z</updated>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="计算机网络" scheme="https://blog.xinghenluyus.cn/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    <category term="Wireguard" scheme="https://blog.xinghenluyus.cn/tags/Wireguard/"/>
    <content>
      <![CDATA[<h2 id="1-Windows-杂谈"><a href="#1-Windows-杂谈" class="headerlink" title="1 Windows 杂谈"></a>1 Windows 杂谈</h2><p>作为使用人数最多，覆盖最广的操作系统，是组网绕不开的。且不说60%的开发者使都使用Windows开发程序，很多的游戏，剪辑软件，显卡驱动都更加贴合Windows。</p><p>Linux以简洁的命令，清晰的架构，快捷的程序安装，成为了无数服务喜爱的温床。Wireguard在Linux中可以被方便的部署，配置。</p><p>多年使用Wireguard的我总结了多项Wireguard在Windows中的痛点，有了我的解决方案。</p><h2 id="2-命令行操作"><a href="#2-命令行操作" class="headerlink" title="2 命令行操作"></a>2 命令行操作</h2><p>正常来看，Windows只能通过UI界面对接口进行操作，UI关闭后网络接口将会被关闭。所有配置的导入，修改，都依赖UI (ssh噩梦)。</p><p>不同于Linux有<code>wg-quick</code>接口控制工具，Windows只保留了最原始wg工具。但少有人知道，<code>wireguard.exe</code>本身不止是一个UI，还是一个命令行工具。</p><p><img src="https://bu.dusays.com/2025/12/15/693f7b9240832.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/12/15/693f7b9240832.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="></p><p>将Wireguard目录添加系统环境变量(默认安装时已经添加)，然后彻底关闭UI页面(再见了UI)。</p><ul><li>安装新接口作为系统服务(后台安装，不会开启UI接口，类似与<code>wg-quick</code>，且重启不会丢失)</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wireguard.exe /installtunnelservice <span class="string">&quot;%CONF_PATH%&quot;</span></span><br></pre></td></tr></table></figure><ul><li>卸载同理</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wireguard.exe /uninstalltunnelservice <span class="string">&quot;%WG_INTERFACE%&quot;</span></span><br></pre></td></tr></table></figure><ul><li>wg 工具和 Linux 一样，包括 <code>wg show</code> 和 <code>wg sync</code> ，这里不再赘述。</li></ul><h2 id="3-IP转发"><a href="#3-IP转发" class="headerlink" title="3 IP转发"></a>3 IP转发</h2><p>两者类似，但是要注意Windows要在powershell运行命令。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Linux</span></span><br><span class="line">sysctl -w net.ipv4.ip_forward=1</span><br><span class="line"></span><br><span class="line"><span class="comment"># Windows</span></span><br><span class="line">Get-NetIPInterface</span><br><span class="line">Set-NetIPInterface -Forwarding Enabled</span><br></pre></td></tr></table></figure><h2 id="4-跨接口转发"><a href="#4-跨接口转发" class="headerlink" title="4 跨接口转发"></a>4 跨接口转发</h2><ul><li>将Windows下Wireguard网络接口级别设置为<code>Private</code></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Set-NetConnectionProfile -InterfaceAlias <span class="string">&quot;%WG_INTERFACE%&quot;</span> -NetworkCategory Private</span><br></pre></td></tr></table></figure><ul><li>启用NAT转发Wireguard流量到别的接口</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Linux</span></span><br><span class="line">New-NetNat -Name <span class="string">&quot;WG-NAT&quot;</span> -InternalIPInterfaceAddressPrefix %WG_ALL_IPS%</span><br></pre></td></tr></table></figure><ul><li>等价于以下Linux命令</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">iptables -t nat -A POSTROUTING -s %WG_ALL_IPS% -o eth0 -j MASQUERADE</span><br></pre></td></tr></table></figure><span class='p center h1 black'>欢迎查看我的项目 fast_fullmesh</span><p>WGDashboard 插件,用于自动生成 WireGuard 配置(Half Mesh),客户端主动订阅配置,集中管理。</p><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/xinghenLuyus/fast_fullmesh"><img src="https://github-readme-stats.vercel.app/api/pin/?username=xinghenLuyus&repo=fast_fullmesh&show_owner=true" class="lazyload" data-srcset="https://github-readme-stats.vercel.app/api/pin/?username=xinghenLuyus&repo=fast_fullmesh&show_owner=true" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></a>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/12/15/2025-12-15/</id>
    <link href="https://blog.xinghenluyus.cn/2025/12/15/2025-12-15/"/>
    <published>2025-12-14T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="1-Windows-杂谈"><a href="#1-Windows-杂谈" class="headerlink" title="1 Windows 杂谈"></a>1 Windows 杂谈</h2><p>作为使用人数最多，覆盖最广的操作系统，是组网绕不开的。且不说]]>
    </summary>
    <title>Wireguard 在 Windows 中的亿点点细节</title>
    <updated>2025-12-15T03:49:51.338Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="编程之外" scheme="https://blog.xinghenluyus.cn/categories/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%96/"/>
    <category term="教程" scheme="https://blog.xinghenluyus.cn/tags/%E6%95%99%E7%A8%8B/"/>
    <content>
      <![CDATA[<p>gitea真的是太轻量好用啦！</p><h2 id="1-安装gitea"><a href="#1-安装gitea" class="headerlink" title="1 安装gitea"></a>1 安装gitea</h2><h3 id="1-1-准备工作"><a href="#1-1-准备工作" class="headerlink" title="1.1 准备工作"></a>1.1 准备工作</h3><ul><li>拥有一台服务器，并且拥有公网ip</li></ul><p>我这里是采用了腾讯云的轻量应用云服务器，使用的Ubuntu并安装好了docker。这里采用docker部署。</p><h3 id="1-2-创建目录与权限"><a href="#1-2-创建目录与权限" class="headerlink" title="1.2 创建目录与权限"></a>1.2 创建目录与权限</h3><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /srv/gitea/&#123;data,config,logs&#125;</span><br><span class="line">chown -R 1000:1000 /srv/gitea</span><br></pre></td></tr></table></figure><h3 id="1-3-编写docker-compose-yml"><a href="#1-3-编写docker-compose-yml" class="headerlink" title="1.3 编写docker-compose.yml"></a>1.3 编写<code>docker-compose.yml</code></h3><p>在 <code>/srv/gitea/</code> 目录下创建 <code>docker-compose.yml</code>：</p><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vi docker-compose.yml</span><br></pre></td></tr></table></figure><p>然后根据自己的配置需求更改。这里已经使用了镜像源。</p><figure class="highlight plaintext"><figcaption><span>docker-compose.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">version: &quot;3&quot;</span><br><span class="line"></span><br><span class="line">networks:</span><br><span class="line">  gitea:</span><br><span class="line">    external: false</span><br><span class="line"></span><br><span class="line">services:</span><br><span class="line">  gitea:</span><br><span class="line">    image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitea/gitea:1.24.3</span><br><span class="line">    container_name: gitea</span><br><span class="line">    environment:</span><br><span class="line">      - USER_UID=1000</span><br><span class="line">      - USER_GID=1000</span><br><span class="line">      - GITEA__server__ROOT_URL=https://gitea.xinghenluyus.cn/  #修改成自己的</span><br><span class="line">      - GITEA__server__DOMAIN=gitea.xinghenluyus.cn             #修改成自己的</span><br><span class="line">      - GITEA__server__SSH_DOMAIN=gitea.xinghenluyus.cn         #修改成自己的</span><br><span class="line">    restart: always</span><br><span class="line">    networks:</span><br><span class="line">      - gitea</span><br><span class="line">    volumes:</span><br><span class="line">      - ./gitea:/data</span><br><span class="line">      - /etc/timezone:/etc/timezone:ro</span><br><span class="line">      - /etc/localtime:/etc/localtime:ro</span><br><span class="line">    ports:</span><br><span class="line">      - &quot;3000:3000&quot;  # Web 有冲突就修改</span><br><span class="line">      - &quot;222:22&quot;     # SSH 有冲突就修改</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="1-4-部署命令"><a href="#1-4-部署命令" class="headerlink" title="1.4 部署命令"></a>1.4 部署命令</h3><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /srv/gitea</span><br><span class="line">sudo docker compose up -d</span><br></pre></td></tr></table></figure><h3 id="1-5-解析域名到服务器"><a href="#1-5-解析域名到服务器" class="headerlink" title="1.5 解析域名到服务器"></a>1.5 解析域名到服务器</h3><p>这一步主要是为了开启<code>HTTPS</code>，配合反向代理无端口食用。</p><p>在域名控制台添加A解析到服务器，在本地电脑打开终端，运行：</p><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ping gitea.example.com</span><br></pre></td></tr></table></figure><p>如果返回的ip是解析的ip，说明解析成功。</p><h3 id="1-6-安装-Nginx"><a href="#1-6-安装-Nginx" class="headerlink" title="1.6 安装 Nginx"></a>1.6 安装 Nginx</h3><p>登录你的服务器，执行：</p><figure class="highlight plaintext"><figcaption><span>Bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">#更新包列表</span><br><span class="line">sudo apt update</span><br><span class="line"></span><br><span class="line">#安装 Nginx</span><br><span class="line">sudo apt install nginx -y</span><br><span class="line"></span><br><span class="line">#启动并设置开机自启</span><br><span class="line">sudo systemctl start nginx</span><br><span class="line">sudo systemctl enable nginx</span><br></pre></td></tr></table></figure><p><strong>测试 Nginx 是否正常：</strong></p><p>浏览器访问：<code>gitea.example.com</code>，看到Nginx欢迎页则说明安装成功。</p><h3 id="1-7-创建-Nginx-配置文件-不启用-HPPTS"><a href="#1-7-创建-Nginx-配置文件-不启用-HPPTS" class="headerlink" title="1.7 创建 Nginx 配置文件(不启用 HPPTS)"></a>1.7 创建 Nginx 配置文件(不启用 HPPTS)</h3><ol><li>创建文件</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/nginx/sites-available/gitea.xinghenluyus.cn.conf</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>nginx</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name gitea.xinghenluyus.cn;</span><br><span class="line"></span><br><span class="line">    # Certbot 验证路径</span><br><span class="line">    location /.well-known/acme-challenge/ &#123;</span><br><span class="line">        root /var/www/certbot;</span><br><span class="line">        try_files $uri =404;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    # 其他请求代理到 Gitea</span><br><span class="line">    location / &#123;</span><br><span class="line">        proxy_pass http://127.0.0.1:3000;</span><br><span class="line">        proxy_set_header Host $host;</span><br><span class="line">        proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">        proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line"></span><br><span class="line">        proxy_http_version 1.1;</span><br><span class="line">        proxy_set_header Upgrade $http_upgrade;</span><br><span class="line">        proxy_set_header Connection &quot;upgrade&quot;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="2"><li>测试配置</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">// 省略软链接到available</span><br><span class="line">sudo nginx -t</span><br></pre></td></tr></table></figure><ol start="3"><li>应该输出</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nginx: the configuration file /etc/nginx/nginx.conf syntax is ok</span><br><span class="line">nginx: configuration file /etc/nginx/nginx.conf test is successful</span><br></pre></td></tr></table></figure><ol start="4"><li>重载Nginx</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl reload nginx</span><br></pre></td></tr></table></figure><h3 id="1-8-申请-Let’s-Encrypt-证书（Certbot-会自动配置-HTTPS）"><a href="#1-8-申请-Let’s-Encrypt-证书（Certbot-会自动配置-HTTPS）" class="headerlink" title="1.8 申请 Let’s Encrypt 证书（Certbot 会自动配置 HTTPS）"></a>1.8 申请 Let’s Encrypt 证书（Certbot 会自动配置 HTTPS）</h3><ol><li>安装 Certbot</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install certbot python3-certbot-nginx -y</span><br></pre></td></tr></table></figure><ol start="2"><li>创建验证目录</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo mkdir -p /var/www/certbot</span><br></pre></td></tr></table></figure><ol start="3"><li>创建验证目录</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo certbot --nginx -d gitea.xinghenluyus.cn</span><br></pre></td></tr></table></figure><p>按提示操作：</p><ul><li><p>输入邮箱（用于安全通知）</p></li><li><p>同意服务条款（输入 Y）</p></li><li><p>是否接收推广邮件？输入 N</p></li><li><p>是否将 HTTP 重定向到 HTTPS？选择 2（强制重定向）</p></li><li><p><strong>浏览器打开 👉 <a href="https://gitea.xinghenluyus.cn/">https://gitea.xinghenluyus.cn</a> ，如果安装过程没问题，就能正常打开gitea了</strong></p></li></ul><h2 id="2-服务器安装-Gitea-Runner"><a href="#2-服务器安装-Gitea-Runner" class="headerlink" title="2 服务器安装 Gitea Runner"></a>2 服务器安装 Gitea Runner</h2><h3 id="2-1-生成配置文件"><a href="#2-1-生成配置文件" class="headerlink" title="2.1 生成配置文件"></a>2.1 生成配置文件</h3><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /srv/gitea-runner</span><br><span class="line">sudo touch config.yaml</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker run --entrypoint=&quot;&quot; --rm -it \</span><br><span class="line">  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitea/act_runner:0.2.11 \</span><br><span class="line">  act_runner generate-config &gt; config.yaml</span><br></pre></td></tr></table></figure><h3 id="2-2-在-Gitea-管理后台获取注册-token"><a href="#2-2-在-Gitea-管理后台获取注册-token" class="headerlink" title="2.2 在 Gitea 管理后台获取注册 token"></a>2.2 在 Gitea 管理后台获取注册 token</h3><p>偷个懒~</p><h3 id="2-3-用-Docker-运行并注册"><a href="#2-3-用-Docker-运行并注册" class="headerlink" title="2.3 用 Docker 运行并注册"></a>2.3 用 Docker 运行并注册</h3><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">docker run \</span><br><span class="line">  -v /srv/gitea-runner/config.yaml:/config.yaml \</span><br><span class="line">  -v /var/run/docker.sock:/var/run/docker.sock \</span><br><span class="line">  -e CONFIG_FILE=/config.yaml \</span><br><span class="line">  -e GITEA_INSTANCE_URL=&quot;https://gitea.xinghenluyus.cn&quot; \</span><br><span class="line">  -e GITEA_RUNNER_REGISTRATION_TOKEN=&quot;&lt;your_token&gt;&quot; \</span><br><span class="line">  -e GITEA_RUNNER_NAME=&quot;runner-01&quot; \</span><br><span class="line">  -e GITEA_RUNNER_LABELS=&quot;linux,docker&quot; \</span><br><span class="line">  --name gitea_runner \</span><br><span class="line">  -d swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitea/act_runner:0.2.11</span><br></pre></td></tr></table></figure><ul><li><strong>再次进入管理后台，runner应该已经在线啦！</strong></li></ul><span class='p center h1 black'>到这里你已经成功部署gitea啦！</span>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/10/15/2025-10-15/</id>
    <link href="https://blog.xinghenluyus.cn/2025/10/15/2025-10-15/"/>
    <published>2025-10-14T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>gitea真的是太轻量好用啦！</p>
<h2 id="1-安装gitea"><a href="#1-安装gitea" class="headerlink" title="1 安装gitea"></a>1 安装gitea</h2><h3 id="1-1-准备工作"><a h]]>
    </summary>
    <title>在腾讯轻量应用服务器部署gitea和runner</title>
    <updated>2025-12-15T02:18:10.403Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="运维" scheme="https://blog.xinghenluyus.cn/categories/%E8%BF%90%E7%BB%B4/"/>
    <category term="教程" scheme="https://blog.xinghenluyus.cn/tags/%E6%95%99%E7%A8%8B/"/>
    <content>
      <![CDATA[<p><strong>目标环境：Ubuntu 20.04 | 3 Master + 2 Worker | keepalived + haproxy VIP(推荐，此处未写) | 容器运行时 containerd</strong></p><h2 id="1-节点规划（企业级-IP-分配）"><a href="#1-节点规划（企业级-IP-分配）" class="headerlink" title="1 节点规划（企业级 IP 分配）"></a>1 节点规划（企业级 IP 分配）</h2><table><thead><tr><th>主机名</th><th>物理 IP</th><th>角色</th><th>组件</th></tr></thead><tbody><tr><td>k8s-m1</td><td><code>10.10.50.11/24</code></td><td>Master-1</td><td>kube-apiserver, etcd, controller-manager, scheduler</td></tr><tr><td>k8s-m2</td><td><code>10.10.50.12/24</code></td><td>Master-2</td><td>同上</td></tr><tr><td>k8s-m3</td><td><code>10.10.50.13/24</code></td><td>Master-3</td><td>同上</td></tr><tr><td>k8s-n1</td><td><code>10.10.50.21/24</code></td><td>Worker-1</td><td>kubelet, containerd</td></tr><tr><td>k8s-n2</td><td><code>10.10.50.22/24</code></td><td>Worker-2</td><td>同上</td></tr><tr><td><strong>VIP</strong></td><td><code>10.10.50.30/24</code></td><td>浮动 IP</td><td><code>keepalived</code> 漂移地址，供 HAProxy 监听</td></tr></tbody></table><p><strong>企业网络策略确认：</strong></p><ul><li>DHCP 已排除 <code>10.10.50.11-13</code>, <code>.21-22</code>, <code>.30</code></li><li>防火墙白名单放行所有节点间端口</li><li><strong>重点：VIP 的 MAC 地址将使用 VRRP 虚拟 MAC，需管理员绑定该 MAC 到交换机端口</strong></li></ul><h2 id="2️-所有节点基础配置"><a href="#2️-所有节点基础配置" class="headerlink" title="2️ 所有节点基础配置"></a>2️ 所有节点基础配置</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 2.1 更新系统 &amp; 安装必要工具</span></span><br><span class="line"><span class="built_in">sudo</span> apt update &amp;&amp; <span class="built_in">sudo</span> apt upgrade -y</span><br><span class="line"><span class="built_in">sudo</span> apt install -y \</span><br><span class="line">    apt-transport-https ca-certificates curl gnupg lsb-release chrony net-tools vim</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2.2 关闭 swap 和防火墙</span></span><br><span class="line"><span class="built_in">sudo</span> swapoff -a</span><br><span class="line"><span class="built_in">sudo</span> sed -i <span class="string">&#x27;/ swap / s/^/#/&#x27;</span> /etc/fstab</span><br><span class="line"><span class="built_in">sudo</span> ufw <span class="built_in">disable</span> || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2.3 时间同步（使用阿里云 NTP 服务器）</span></span><br><span class="line"><span class="built_in">sudo</span> sed -i <span class="string">&#x27;/^pool\|^server/c\server ntp.aliyun.com iburst&#x27;</span> /etc/chrony/chrony.conf</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> --now chronyd  <span class="comment"># 使用正确服务名 chronyd.service</span></span><br></pre></td></tr></table></figure><ul><li>使用<code>sealos</code>快速部署</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29.9 \</span><br><span class="line">  registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 \</span><br><span class="line">  registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \</span><br><span class="line">  --masters 172.18.51.112,172.18.51.137,172.18.51.173 \</span><br><span class="line">  --nodes 172.18.51.51,172.18.51.28</span><br><span class="line"></span><br><span class="line">kubectl taint nodes --all node-role.kubernetes.io/control-plane-</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/09/15/2025-9-15/</id>
    <link href="https://blog.xinghenluyus.cn/2025/09/15/2025-9-15/"/>
    <published>2025-09-14T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p><strong>目标环境：Ubuntu 20.04 | 3 Master + 2 Worker | keepalived + haproxy VIP(推荐，此处未写) | 容器运行时 containerd</strong></p>
<h2 id="1-节点规划（企业级-IP]]>
    </summary>
    <title>Kubernetes 多节点快速部署</title>
    <updated>2025-12-15T02:12:43.666Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="模型部署" scheme="https://blog.xinghenluyus.cn/categories/%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/"/>
    <category term="教程" scheme="https://blog.xinghenluyus.cn/tags/%E6%95%99%E7%A8%8B/"/>
    <content>
      <![CDATA[<p>耗时一礼拜阅读完文档摸索出一条PaddleOCR最简单快速部署，并能通过api调用的方法。总结如下：</p><h2 id="1-环境准备"><a href="#1-环境准备" class="headerlink" title="1 环境准备"></a>1 环境准备</h2><ul><li>Lunix系统</li><li>有显卡（我的是RTX4080），并且安装对应驱动</li><li>提前安装了Docker</li></ul><h2 id="2-通过镜像拉取环境"><a href="#2-通过镜像拉取环境" class="headerlink" title="2 通过镜像拉取环境"></a>2 通过镜像拉取环境</h2><ol><li>安装含有<strong>高性能推理</strong>依赖的 PaddleX <a href="http://www.paddleocr.ai/main/version3.x/deployment/high_performance_inference.html#11">官方 Docker 镜像</a></li></ol><p>这里推荐CUDA11.8的版本，全部依赖都是齐全的，而且不会有冲突。安装方法如下：<a href="https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/docker/linux-docker.html">命令参考网站</a></p><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"># 1.拉取官方GPU镜像(以网站最新版本为准)</span><br><span class="line">docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlex/paddlex:paddlex3.0.1-paddlepaddle3.0.0-gpu-cuda11.8-cudnn8.9-trt8.6</span><br><span class="line"></span><br><span class="line"># 2.创建容器运行目录</span><br><span class="line">mkdir puddlex</span><br><span class="line">cd puddlex</span><br><span class="line"></span><br><span class="line"># 3.运行容器</span><br><span class="line">docker run --gpus all --name paddle-hpi -v $PWD:/paddle --shm-size=16G --network=host -it ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlex/paddlex:paddlex3.0.1-paddlepaddle3.0.0-gpu-cuda11.8-cudnn8.9-trt8.6 /bin/bash</span><br><span class="line"></span><br><span class="line"># 默认直接进入容器内部了，后续退出想再次进入使用</span><br><span class="line">docker attach paddle-hpi</span><br></pre></td></tr></table></figure><ol start="2"><li>进入容器内部安装 <a href="http://www.paddleocr.ai/main/quick_start.html">PaddleOCR</a></li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 1.安装PaddlePaddle</span><br><span class="line">python -m pip install paddlepaddle-gpu==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/</span><br><span class="line"></span><br><span class="line"># 2.安装paddleocr</span><br><span class="line">pip install paddleocr</span><br></pre></td></tr></table></figure><ol start="3"><li>验证安装</li></ol><p>采用<a href="https://github.com/PaddlePaddle/PaddleOCR/blob/main/readme/README_cn.md">github</a>上的命令，简单直接：</p><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"># 运行 PP-OCRv5 推理</span><br><span class="line">paddleocr ocr -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_002.png --use_doc_orientation_classify False --use_doc_unwarping False --use_textline_orientation False </span><br><span class="line"></span><br><span class="line"># 运行 PP-StructureV3 推理</span><br><span class="line">paddleocr pp_structurev3 -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/pp_structure_v3_demo.png --use_doc_orientation_classify False --use_doc_unwarping False</span><br><span class="line"></span><br><span class="line"># 运行 PP-ChatOCRv4 推理前，需要先获得千帆API Key</span><br><span class="line">paddleocr pp_chatocrv4_doc -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/vehicle_certificate-1.png -k 驾驶室准乘人数 --qianfan_api_key your_api_key --use_doc_orientation_classify False --use_doc_unwarping False </span><br><span class="line"></span><br><span class="line"># 查看 &quot;paddleocr ocr&quot; 详细参数</span><br><span class="line">paddleocr ocr --help</span><br></pre></td></tr></table></figure><h2 id="3-开启服务"><a href="#3-开启服务" class="headerlink" title="3 开启服务"></a>3 开启服务</h2><h3 id="3-1-简单服务化部署"><a href="#3-1-简单服务化部署" class="headerlink" title="3.1 简单服务化部署"></a>3.1 简单服务化部署</h3><ol><li>安装<a href="http://www.paddleocr.ai/main/version3.x/deployment/serving.html">服务化部署插件</a></li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">paddlex --install serving</span><br></pre></td></tr></table></figure><ol start="2"><li>运行服务器</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># OCR产线</span><br><span class="line">paddlex --serve --pipeline OCR --port 8080</span><br><span class="line"></span><br><span class="line"># PP-StructureV3</span><br><span class="line">paddlex --serve --pipeline PP-StructureV3 --port 8080</span><br></pre></td></tr></table></figure><h3 id="3-2-启用高性能推理"><a href="#3-2-启用高性能推理" class="headerlink" title="3.2 启用高性能推理"></a>3.2 启用高性能推理</h3><ol><li>安装<a href="https://paddlepaddle.github.io/PaddleX/latest/pipeline_deploy/high_performance_inference.html#11">高性能推理插件</a></li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">paddlex --install hpi-gpu</span><br></pre></td></tr></table></figure><ol start="2"><li>运行服务器</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># OCR产线</span><br><span class="line">paddlex --serve --pipeline OCR --port 8080 --hpi_config</span><br><span class="line"></span><br><span class="line"># PP-StructureV3</span><br><span class="line">paddlex --serve --pipeline PP-StructureV3 --port 8080 --hpi_config</span><br></pre></td></tr></table></figure><h3 id="3-3-同时启动多个服务"><a href="#3-3-同时启动多个服务" class="headerlink" title="3.3 同时启动多个服务"></a>3.3 同时启动多个服务</h3><ol><li>安装screen</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apt-get update</span><br><span class="line">apt-get install -y screen</span><br></pre></td></tr></table></figure><ol start="2"><li>通过screen会话运行服务器</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># OCR产线</span><br><span class="line">screen -S ocr -d paddlex --serve --pipeline OCR --port 8080 --hpi_config</span><br><span class="line"></span><br><span class="line"># PP-StructureV3</span><br><span class="line">screen -S structure -d paddlex --serve --pipeline PP-StructureV3 --port 8080 --hpi_config</span><br></pre></td></tr></table></figure><ol start="3"><li>管理screen会话</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 查看正在运行的会话</span><br><span class="line">screen -ls</span><br><span class="line"></span><br><span class="line"># 进入某个容器(使用Ctrl+D，然后按A退出)</span><br><span class="line">screen -r ocr/structure</span><br></pre></td></tr></table></figure><h2 id="4-API文档"><a href="#4-API文档" class="headerlink" title="4 API文档"></a>4 API文档</h2><p>详见对应文档 -&gt; 开发集成&#x2F;部署 -&gt; API参考</p><ul><li><a href="http://www.paddleocr.ai/main/version3.x/pipeline_usage/OCR.html#3">ocr对应api</a> POST &#x2F;ocr</li><li><a href="http://www.paddleocr.ai/main/version3.x/pipeline_usage/PP-StructureV3.html#3">structure对应api</a> POST &#x2F;layout-parsing</li></ul><span class='p center h1 black'>欢迎评论！</span>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/08/20/2025-8-20/</id>
    <link href="https://blog.xinghenluyus.cn/2025/08/20/2025-8-20/"/>
    <published>2025-08-19T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>耗时一礼拜阅读完文档摸索出一条PaddleOCR最简单快速部署，并能通过api调用的方法。总结如下：</p>
<h2 id="1-环境准备"><a href="#1-环境准备" class="headerlink" title="1 环境准备"></a>1 环境准备</h2]]>
    </summary>
    <title>如何本地服务化部署PaddleOCR</title>
    <updated>2025-08-20T05:34:37.842Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="编程之外" scheme="https://blog.xinghenluyus.cn/categories/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%96/"/>
    <category term="教程" scheme="https://blog.xinghenluyus.cn/tags/%E6%95%99%E7%A8%8B/"/>
    <content>
      <![CDATA[<p>artalk以私有化部署实现数据自控与极速响应，社交登录、邮件通知、Markdown 等功能开箱即用。话不多说，下面直接上教程。</p><p>这里我犯了很多错一直走回头路，一个配置反复折腾，以下是最简步骤。</p><h2 id="1-在服务端配置-Nginx"><a href="#1-在服务端配置-Nginx" class="headerlink" title="1 在服务端配置 Nginx"></a>1 在服务端配置 Nginx</h2><h3 id="1-1-准备工作"><a href="#1-1-准备工作" class="headerlink" title="1.1 准备工作"></a>1.1 准备工作</h3><ul><li>拥有一台服务器，并且拥有公网ip</li></ul><p>我这里是采用了腾讯云的轻量应用云服务器，使用的Ubuntu并安装好了docker。这里采用docker部署。</p><h3 id="1-2-解析域名到服务器"><a href="#1-2-解析域名到服务器" class="headerlink" title="1.2 解析域名到服务器"></a>1.2 解析域名到服务器</h3><p>这一步主要是为了开启<code>HTTPS</code>，如果是动态ip，还可以配合<code>DDNS</code>动态解析域名。</p><p>推荐使用<code>artalk.example.com</code>这样的子域名格式，域名可以和博客网站保持一致，简化备案流程。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/18/68a2aba5148d8.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/18/68a2aba5148d8.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="域名解析"/></div><span class="image-caption">域名解析</span></div><p>在本地电脑打开终端，运行：</p><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ping artalk.example.com</span><br></pre></td></tr></table></figure><p>如果返回的ip是解析的ip，说明解析成功。</p><h3 id="1-3-安装-Nginx"><a href="#1-3-安装-Nginx" class="headerlink" title="1.3 安装 Nginx"></a>1.3 安装 Nginx</h3><p>登录你的服务器，执行：</p><figure class="highlight plaintext"><figcaption><span>Bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"># 更新包列表</span><br><span class="line">sudo apt update</span><br><span class="line"></span><br><span class="line"># 安装 Nginx</span><br><span class="line">sudo apt install nginx -y</span><br><span class="line"></span><br><span class="line"># 启动并设置开机自启</span><br><span class="line">sudo systemctl start nginx</span><br><span class="line">sudo systemctl enable nginx</span><br></pre></td></tr></table></figure><p><strong>测试 Nginx 是否正常：</strong></p><p>浏览器访问：<code>artalk.example.com</code>，看到Nginx欢迎页则说明安装成功。</p><h3 id="1-4-创建-Nginx-配置文件-不启用-HPPTS"><a href="#1-4-创建-Nginx-配置文件-不启用-HPPTS" class="headerlink" title="1.4 创建 Nginx 配置文件(不启用 HPPTS)"></a>1.4 创建 Nginx 配置文件(不启用 HPPTS)</h3><ol><li>创建文件</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo nano /etc/nginx/sites-available/artalk.xinghenluyus.cn.conf</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>nginx</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name artalk.xinghenluyus.cn;</span><br><span class="line"></span><br><span class="line">    # Certbot 验证路径</span><br><span class="line">    location /.well-known/acme-challenge/ &#123;</span><br><span class="line">        root /var/www/certbot;</span><br><span class="line">        try_files $uri =404;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    # 其他请求先不重定向（或可重定向，但不能 listen 443）</span><br><span class="line">    location / &#123;</span><br><span class="line">        # 可选：先不重定向，等证书申请完再开启</span><br><span class="line">        proxy_pass http://127.0.0.1:8080;</span><br><span class="line">        proxy_set_header Host $host;</span><br><span class="line">        proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">        proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">        proxy_set_header X-Forwarded-Port $server_port;</span><br><span class="line">        proxy_set_header X-Forwarded-Host $host;</span><br><span class="line"></span><br><span class="line">        proxy_http_version 1.1;</span><br><span class="line">        proxy_set_header Upgrade $http_upgrade;</span><br><span class="line">        proxy_set_header Connection &quot;upgrade&quot;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>测试配置</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">// 省略软链接到available</span><br><span class="line">sudo nginx -t</span><br></pre></td></tr></table></figure><ol start="3"><li>应该输出</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nginx: the configuration file /etc/nginx/nginx.conf syntax is ok</span><br><span class="line">nginx: configuration file /etc/nginx/nginx.conf test is successful</span><br></pre></td></tr></table></figure><ol start="4"><li>重载Nginx</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl reload nginx</span><br></pre></td></tr></table></figure><h3 id="1-5-申请-Let’s-Encrypt-证书（Certbot-会自动配置-HTTPS）"><a href="#1-5-申请-Let’s-Encrypt-证书（Certbot-会自动配置-HTTPS）" class="headerlink" title="1.5 申请 Let’s Encrypt 证书（Certbot 会自动配置 HTTPS）"></a>1.5 申请 Let’s Encrypt 证书（Certbot 会自动配置 HTTPS）</h3><ol><li>安装 Certbot</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install certbot python3-certbot-nginx -y</span><br></pre></td></tr></table></figure><ol start="2"><li>创建验证目录</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo mkdir -p /var/www/certbot</span><br></pre></td></tr></table></figure><ol start="3"><li>创建验证目录</li></ol><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo certbot --nginx -d artalk.xinghenluyus.cn</span><br></pre></td></tr></table></figure><p>按提示操作：</p><ul><li>输入邮箱（用于安全通知）</li><li>同意服务条款（输入 Y）</li><li>是否接收推广邮件？输入 N</li><li>是否将 HTTP 重定向到 HTTPS？选择 2（强制重定向）</li></ul><h2 id="2-服务器安装-Artalk"><a href="#2-服务器安装-Artalk" class="headerlink" title="2 服务器安装 Artalk"></a>2 服务器安装 Artalk</h2><h3 id="2-1-程序部署"><a href="#2-1-程序部署" class="headerlink" title="2.1 程序部署"></a>2.1 程序部署</h3><p>执行命令在后台启动容器：</p><p><em>请注意<code>ATK_SITE_DEFAULT</code>改成你的网站title(对应<code>_config.yml</code>文件中title)，<code>ATK_SITE_URL</code>改成服务器实际解析域名。</em></p><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line">    --name artalk \</span><br><span class="line">    -p 8080:23366 \</span><br><span class="line">    -v $(pwd)/data:/data \</span><br><span class="line">    -e &quot;TZ=Asia/Shanghai&quot; \</span><br><span class="line">    -e &quot;ATK_LOCALE=zh-CN&quot; \</span><br><span class="line">    -e &quot;ATK_SITE_DEFAULT=Artalk 的博客&quot; \</span><br><span class="line">    -e &quot;ATK_SITE_URL=https://artalk.example.com&quot; \</span><br><span class="line">    artalk/artalk-go</span><br></pre></td></tr></table></figure><p>执行命令创建管理员账户：</p><figure class="highlight plaintext"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it artalk artalk admin</span><br></pre></td></tr></table></figure><h3 id="2-2-进入后台"><a href="#2-2-进入后台" class="headerlink" title="2.2 进入后台"></a>2.2 进入后台</h3><p>主机浏览器输入 <code>https://artalk.example.com</code> 进入 Artalk 后台登录界面。</p><p><strong>如果这这一步不成功，自行在 1.4, 1.5, 2.1 之间排查原因。</strong></p><h3 id="2-3-配置可信域名"><a href="#2-3-配置可信域名" class="headerlink" title="2.3 配置可信域名"></a>2.3 配置可信域名</h3><p>登录后台 -&gt; 设置 -&gt; 可信域名</p><p>将你的博客域名 (<em>也就是要使用这个评论系统页面的所有域名</em>) 都添加到可信域名列表中，解决CORS报错。然后点击右下角<code>应用</code>。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/18/68a2b864ea899.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/18/68a2b864ea899.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="配置示例"/></div><span class="image-caption">配置示例</span></div><h2 id="3-Volantis-配置-Artalk"><a href="#3-Volantis-配置-Artalk" class="headerlink" title="3 Volantis 配置 Artalk"></a>3 Volantis 配置 Artalk</h2><p>打开<code>_config.volantis.yml</code>文件，添加artalk相关配置</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/18/68a2bc7003aa2.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/18/68a2bc7003aa2.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="_config.volantis.yml相关配置"/></div><span class="image-caption">_config.volantis.yml相关配置</span></div><p>如果你的<code>Volantis</code>版本是<code>5.8.0</code>，则对于新版Artalk也就是2.9.1,<strong>浏览器会弹出pjax错误</strong>。</p><p>这时有两个解决方案：</p><ol><li>如果你是通过npm安装的，可以打开<code>node_modules\hexo-theme-volantis\layout\_plugins\comments\artalk\script.ejs</code>，用下面代码替换源码。(记得做好备份工作)</li></ol><figure class="highlight plaintext"><figcaption><span>script.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br></pre></td><td class="code"><pre><span class="line">&lt;script&gt;</span><br><span class="line">  volantis.layoutHelper(&quot;comments&quot;, `&lt;div id=&quot;artalk_container&quot;&gt;&lt;i class=&quot;fa-solid fa-cog fa-spin fa-fw fa-2x&quot;&gt;&lt;/i&gt;&lt;/div&gt;`);</span><br><span class="line"></span><br><span class="line">  function load_artalk() &#123;</span><br><span class="line">    if (!document.querySelector(&quot;#artalk_container&quot;)) return;</span><br><span class="line"></span><br><span class="line">    volantis.css(&quot;&lt;%- theme.comments.artalk.css %&gt;&quot;);</span><br><span class="line"></span><br><span class="line">    volantis.js(&quot;&lt;%- theme.comments.artalk.js %&gt;&quot;)</span><br><span class="line">      .then(() =&gt; &#123;</span><br><span class="line">        if (typeof Artalk === &#x27;undefined&#x27;) &#123;</span><br><span class="line">          console.error(&#x27;Artalk.js loaded but Artalk is not defined&#x27;);</span><br><span class="line">          return;</span><br><span class="line">        &#125;</span><br><span class="line">        return pjax_artalk();</span><br><span class="line">      &#125;)</span><br><span class="line">      .catch(err =&gt; &#123;</span><br><span class="line">        console.error(&#x27;Failed to load Artalk.js:&#x27;, err);</span><br><span class="line">      &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  function pjax_artalk() &#123;</span><br><span class="line">    if (!document.querySelector(&quot;#artalk_container&quot;)) return;</span><br><span class="line"></span><br><span class="line">    let path = pdata.commentPath;</span><br><span class="line">    let placeholder = pdata.commentPlaceholder || &quot;&lt;%= theme.comments.artalk.placeholder %&gt;&quot; || &quot;&quot;;</span><br><span class="line">    if (!path) &#123;</span><br><span class="line">      path = &#x27;&lt;%= theme.comments.artalk.path %&gt;&#x27; || decodeURI(window.location.pathname);</span><br><span class="line">    &#125;</span><br><span class="line">    if (!&#x27;&lt;%= config.permalink %&gt;&#x27;.includes(&#x27;/index.html&#x27;)) &#123;</span><br><span class="line">      path = path.replace(/\/index\.html$/, &#x27;/&#x27;).replace(/\.html$/, &#x27;&#x27;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    volantis.artalk = Artalk.init(Object.assign(&lt;%- JSON.stringify(theme.comments.artalk) %&gt;, &#123;</span><br><span class="line">      el: &#x27;#artalk_container&#x27;,</span><br><span class="line">      pageKey: path,</span><br><span class="line">      pageTitle: document.title,</span><br><span class="line">      placeholder: placeholder,</span><br><span class="line">      useBackendConf: true,</span><br><span class="line">      site: &#x27;&lt;%= config.title %&gt;&#x27;,</span><br><span class="line">      darkMode: volantis.dark.mode === &quot;dark&quot;,</span><br><span class="line">      pvEl: &#x27;#artalk_visitors&#x27;,</span><br><span class="line"></span><br><span class="line">      &lt;% if(!!theme.comments.artalk.imageUploader?.api)&#123; %&gt;</span><br><span class="line">      imgUploader: function(file) &#123;</span><br><span class="line">        let headers = new Headers();</span><br><span class="line">        headers.set(&#x27;Accept&#x27;, &#x27;application/json&#x27;);</span><br><span class="line">        &lt;% if(!!theme.comments.artalk.imageUploader?.token) &#123; %&gt;</span><br><span class="line">          headers.set(&#x27;Authorization&#x27;, &#x27;&lt;%= theme.comments.artalk.imageUploader?.token %&gt;&#x27;);</span><br><span class="line">        &lt;% &#125; %&gt;</span><br><span class="line">        let formData = new FormData();</span><br><span class="line">        formData.append(&#x27;file&#x27;, file);</span><br><span class="line">        return fetch(&#x27;&lt;%= theme.comments.artalk.imageUploader?.api %&gt;&#x27;, &#123;</span><br><span class="line">          method: &#x27;POST&#x27;,</span><br><span class="line">          body: formData,</span><br><span class="line">          headers: headers</span><br><span class="line">        &#125;)</span><br><span class="line">        .then(resp =&gt; resp.json())</span><br><span class="line">        .then(resp =&gt; resp.&lt;%= theme.comments.artalk.imageUploader?.resp %&gt;);</span><br><span class="line">      &#125;,</span><br><span class="line">      &lt;% &#125; %&gt;</span><br><span class="line">    &#125;));</span><br><span class="line"></span><br><span class="line">    Artalk.use(ctx =&gt; &#123;</span><br><span class="line">      ctx.on(&#x27;list-loaded&#x27;, () =&gt; &#123;</span><br><span class="line">        if (typeof VolantisFancyBox === &quot;undefined&quot;) &#123;</span><br><span class="line">          const checkFancyBox = setInterval(() =&gt; &#123;</span><br><span class="line">            if (typeof VolantisFancyBox === &quot;undefined&quot;) return;</span><br><span class="line">            clearInterval(checkFancyBox);</span><br><span class="line">            VolantisFancyBox.groupBind(&#x27;.atk-content img:not([atk-emoticon])&#x27;, &#x27;Comments&#x27;);</span><br><span class="line">          &#125;, 100);</span><br><span class="line">        &#125; else &#123;</span><br><span class="line">          VolantisFancyBox.groupBind(&#x27;.atk-content img:not([atk-emoticon])&#x27;, &#x27;Comments&#x27;);</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  load_artalk();</span><br><span class="line"></span><br><span class="line">  volantis.pjax.push(() =&gt; &#123;</span><br><span class="line">    if (typeof Artalk === &quot;undefined&quot;) &#123;</span><br><span class="line">      load_artalk();</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">      pjax_artalk();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;, &#x27;artalk&#x27;);</span><br><span class="line"></span><br><span class="line">  function dark_artalk() &#123;</span><br><span class="line">    if (!document.querySelector(&quot;#artalk_container&quot;)) return;</span><br><span class="line">    if (volantis.artalk &amp;&amp; typeof volantis.artalk.setDarkMode === &#x27;function&#x27;) &#123;</span><br><span class="line">      volantis.artalk.setDarkMode(volantis.dark.mode === &quot;dark&quot;);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  volantis.dark.push(dark_artalk);</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><ol start="2"><li>如果你是通过拉取仓库源码方式安装，可以拉取仓库最新的<code>dev</code>分支，我的代码已经被合并到dev分支，暂时还没作为5.8.1版本发布。</li></ol><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/18/68a2c066e9085.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/18/68a2c066e9085.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="dev分支"/></div><span class="image-caption">dev分支</span></div><span class='p center h1 black'>到这里你的blog已经成功集成Artalk啦！</span>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/08/18/2025-8-18/</id>
    <link href="https://blog.xinghenluyus.cn/2025/08/18/2025-8-18/"/>
    <published>2025-08-17T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>artalk以私有化部署实现数据自控与极速响应，社交登录、邮件通知、Markdown 等功能开箱即用。话不多说，下面直接上教程。</p>
<p>这里我犯了很多错一直走回头路，一个配置反复折腾，以下是最简步骤。</p>
<h2 id="1-在服务端配置-Nginx"><a h]]>
    </summary>
    <title>如何在Volantis-5主题上使用artalk评论系统(同本站)</title>
    <updated>2025-12-15T02:18:26.794Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="计算机网络" scheme="https://blog.xinghenluyus.cn/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    <category term="Wireguard" scheme="https://blog.xinghenluyus.cn/tags/Wireguard/"/>
    <category term="异地组网" scheme="https://blog.xinghenluyus.cn/tags/%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91/"/>
    <content>
      <![CDATA[<p><em>此处为小白教程，更多细节请看我的另一篇博客 &gt; <a href="https://blog.xinghenluyus.cn/2025/12/15/2025-12-15/index.html">Wireguard 在 Windows 中的亿点点细节</a> &lt;</em></p><h2 id="1-前言"><a href="#1-前言" class="headerlink" title="1 前言"></a>1 前言</h2><h3 id="1-1-背景"><a href="#1-1-背景" class="headerlink" title="1.1 背景"></a>1.1 背景</h3><p>随着技术的不断革新，个人服务器算力和性能越来越强大，在家部署一台性能不错的主机，然后使用轻薄本远程办公逐渐成为一种解决方案。<br>奈何ip受限，稀少的ipv4地址，复杂的NAT网关，使得公网对局域网的访问难上加难。就算使用<code>Natter</code>加上<code>DDNS</code>临时动态拿到公网ip，难道你想你的电脑<code>远程端口</code>或者<code>ssh端口</code>直接暴露在公网上吗？对此<code>SakuraFRP</code>，<code>向日葵</code>，<code>ToDesk</code>各自给出了不同的解决方案。</p><div class="note "><p>这里重点推荐SakuraFrp，通过内网穿透和端口加密给出了不错的解决方案，对公网暴露设备端口并加密，而且不受NAT限制。另外两款远程软件适合临时控制或者备用检修通道，商用型强广告多，不适合长期使用</p></div><p>虽然<code>SakuraFrp</code>功能强大而且价格便宜(临时使用基本免费)，但是所有流量都要到Sakura服务器转发，带宽受限。而且随着设备的变多，错综复杂的穿透隧道让配置和部署变得极其麻烦，点对点的穿透解决方案是不可行的。</p><p>这时，完美的解决方案出现了 —&gt; <strong>Wireguard</strong></p><h3 id="1-2-Wireguard介绍"><a href="#1-2-Wireguard介绍" class="headerlink" title="1.2 Wireguard介绍"></a>1.2 Wireguard介绍</h3><p>WireGuard 是一种现代化的、简化的、安全的VPN（虚拟私人网络）协议。以下是对其特点及工作原理的详细介绍：</p><ul><li>简洁性：WireGuard 的设计目标之一是简化配置和部署，其代码库远小于其他如 OpenVPN 和 IPSec 等解决方案。</li><li>性能：由于其精简的设计和对最新加密技术的应用，WireGuard 速度更快、延迟更低。</li><li>WireGuard 使用最先进的加密算法，确保数据传输的安全性。</li><li>WireGuard 可以在多种平台上运行，包括 Linux、Windows、macOS、iOS、Android 等，支持跨平台使用，同时其简单的配置流程也降低了用户的使用门槛。</li><li>通过 UDP 协议进行通信，WireGuard 能够更好地适应网络条件的变化，并且具有自动重连功能，保证连接的稳定性和可靠性。</li><li>与传统VPN不同的是，WireGuard 支持客户端使用动态IP地址，<code>无需固定IP地址即可建立稳定的连接</code>，且兼容<code>ipv4</code>和<code>ipv6</code>。</li></ul><p>使用WireGuard，我们可以将所有想要直接关联的设备通过安全隧道连接起来，形成一个<strong>虚拟的专用网络</strong>，可以像局域网一样轻松访问和管理内网设备。</p><h3 id="1-3-为什么我选择Windows作为终端server？"><a href="#1-3-为什么我选择Windows作为终端server？" class="headerlink" title="1.3 为什么我选择Windows作为终端server？"></a>1.3 为什么我选择Windows作为终端server？</h3><p>最主要原因，是因为我的<code>NAS(网络附属存储)</code>不支持<code>docker(轻量级容器技术)</code>，它也就变相的不支持部署Wireguard。作为家里的第二大常驻设备，我把目光瞄准到了我的PC。虽然Windows的系统使它注定无法24小时开机，但是<code>Wake On LAN(局域网唤醒)</code>完美的弥补了这一点。想要组网时，我远程唤醒PC开机即可。<br>至于为什么不把设备刷成Linux，我只能说它不止是一台server，还有别的作用(剪辑、设计、游戏)。而且使用<code>wsl2+docker</code>，上面完全可以部署我的服务，充当服务器的作用。</p><h2 id="2-部署"><a href="#2-部署" class="headerlink" title="2 部署"></a>2 部署</h2><h3 id="2-1-网络环境"><a href="#2-1-网络环境" class="headerlink" title="2.1 网络环境"></a>2.1 网络环境</h3><ul><li>对于有公网ip地址的，配置路由器的端口转发即可。</li><li>对于ipv4，在NAT1的环境下，邪修使用<code>Natter</code>可以拿到临时公网ip。(UDP在ipv4环境跨区丢包很严重，这里不推荐没有公网ip的使用)</li><li>对于ipv6，尽量保证server环境处于NAT1，使用<code>DDNS-GO</code>可以将拿到的动态ipv6通过域名解析绑定到某个域名，从而实现稳定的使用。<a href="https://github.com/jeessy2/ddns-go">点我传送到DDNS-GO</a></li></ul><p>请注意：用路由器给server<code>分配固定ip</code>并开启<code>DMZ主机</code>，确保网络环境的稳定性。</p><h3 id="2-2-一键部署"><a href="#2-2-一键部署" class="headerlink" title="2.2 一键部署"></a>2.2 一键部署</h3><p>Windows下想要完全启用Wireguard的功能，需要更改众多配置。好在已经有前人帮我们早好了轮子<a href="https://github.com/micahmo/WgServerforWindows">Wg Server for Windows</a>，我们直接拿来用即可。</p><div class="timeline"><div class="timenode"><div class="meta"><p><p>1.工具下载</p></p></div><div class="body"><p>从<a href="https://github.com/micahmo/WgServerforWindows/releases">releases</a>下载WS4W最新版本。我的版本是2.1.4。<br>安装完成后得到如下界面：</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/05/6891a188e688c.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/05/6891a188e688c.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="WS4W界面图"/></div><span class="image-caption">WS4W界面图</span></div></div></div><div class="timenode"><div class="meta"><p><p>2.下载Wireguard</p></p></div><div class="body"><p>点击<code>Download and install Wireguard</code>，根据指引一键自动下载安装。</p></div></div><div class="timenode"><div class="meta"><p><p>3.配置Server</p></p></div><div class="body"><p>点击<code>Edit server configuration</code>，进入server配置页面。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/05/6891a31690077.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/05/6891a31690077.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="server配置页"/></div><span class="image-caption">server配置页</span></div><p>其中<code>Endpoint</code>填写<code>ip:端口(和Listen Port一致)</code>，ip全面支持ipv4，ipv6，域名。两个<code>Key</code>点击<code>Generate</code>自动生成。其余配置照抄即可，这里不过多赘述。</p></div></div><div class="timenode"><div class="meta"><p><p>3.配置clients(Server端)</p></p></div><div class="body"><p>点击<code>Configure client</code>，进入client配置页面。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/05/6891a55ac9a01.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/05/6891a55ac9a01.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="client配置页"/></div><span class="image-caption">client配置页</span></div><ol><li>点击<code>Add Client</code>，会弹出类似上图的界面。</li><li>配置客户端信息，大部分可以直接<code>Generate</code>自动生成。要注意的是<code>Allowed IPs</code>配置每个客户端通过Wireguard的流量。在这里配置的所有ip段的流量都会被导向<code>Wireguard server</code>。比如我的配置中，除了<code>Address</code>流量，还有<code>192.168.0网段</code>的所有流量都会导向<code>Wireguard Server</code>转发。我这样配置不仅可以让虚拟局域网内设备相互关联，还可以从Client访问Server所在局域网。</li><li>点击<code>Export configuration File</code>可以生成一个文件供客户端使用。手机端还可以直接生成二维码。</li><li>点击<code>Save</code>保存。</li></ol></div></div><div class="timenode"><div class="meta"><p><p>4.配置clients(客户端)</p></p></div><div class="body"><p>客户端下载<a href="https://www.wireguard.com/install/">Wireguard</a>，导入生成的那个文件直接应用配置即可。</p><p>以Windows为例，配置文件应该如下所示：</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/05/6891a87df2314.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/05/6891a87df2314.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Windows配置"/></div><span class="image-caption">Windows配置</span></div><p><strong>注意</strong>：将<code>AllowedIPs</code>中的<code>10.8.0.X/32</code>修改成整个网段，即<code>10.8.0.0/24</code>。</p></div></div><div class="timenode"><div class="meta"><p><p>5.Server剩余配置</p></p></div><div class="body"><p>依次点击<code>Install tunnel service</code>，<code>Make private</code>，<code>Enable NAT</code>，完成剩余配置。成功后界面如下：</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/05/6891aa2a43cc9.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/05/6891aa2a43cc9.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="成功配置"/></div><span class="image-caption">成功配置</span></div></div></div></div><p>不出意外的话到这里为止部署就成功了。WS4W只是一个配置工具，关闭即可，真正的配置已经落实到Windows的各个角落。</p><h2 id="3-一些细节收尾"><a href="#3-一些细节收尾" class="headerlink" title="3 一些细节收尾"></a>3 一些细节收尾</h2><h3 id="3-1-在-Windows-上启用路由功能"><a href="#3-1-在-Windows-上启用路由功能" class="headerlink" title="3.1 在 Windows 上启用路由功能"></a>3.1 在 Windows 上启用路由功能</h3><ul><li>启用路由功能模拟端口转发，实现节点间通信</li></ul><figure class="highlight plaintext"><figcaption><span>powershell</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Set-ItemProperty -Path &quot;HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&quot; -Name &quot;IPEnableRouter&quot; -Value 1</span><br></pre></td></tr></table></figure><ul><li>在<code>服务</code>中找到<code>Routing and Remote Access</code>，设置启动类型为自动，然后启动这个服务。</li></ul><h3 id="3-2-配置-Windows-防火墙"><a href="#3-2-配置-Windows-防火墙" class="headerlink" title="3.2 配置 Windows 防火墙"></a>3.2 配置 Windows 防火墙</h3><ul><li>允许 ICMP 回显请求（即 ping 请求）</li></ul><figure class="highlight plaintext"><figcaption><span>powershell</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">New-NetFirewallRule -DisplayName &quot;Allow ICMPv4-In&quot; -Protocol ICMPv4 -IcmpType 8 -Enabled True -Action Allow -Profile Any</span><br></pre></td></tr></table></figure><ul><li>视情况开放Server的51820端口(如果Client不能连接)</li></ul><span class='p center h1 black'>到这里你的Windows已经成为Wireguard Server啦！</span>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/08/05/2025-8-5/</id>
    <link href="https://blog.xinghenluyus.cn/2025/08/05/2025-8-5/"/>
    <published>2025-08-04T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p><em>此处为小白教程，更多细节请看我的另一篇博客 &gt; <a href="https://blog.xinghenluyus.cn/2025/12/15/2025-12-15/index.html">Wireguard 在 Windows 中的亿点点细节</a> &l]]>
    </summary>
    <title>Windows作为Wireguard server多端异地组网解决方案</title>
    <updated>2025-12-15T02:39:17.103Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="计算机网络" scheme="https://blog.xinghenluyus.cn/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    <category term="踩坑日记" scheme="https://blog.xinghenluyus.cn/tags/%E8%B8%A9%E5%9D%91%E6%97%A5%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>将huggingface.co换成镜像源hf-mirror.com即可解决问题。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">解决方法：export HF_ENDPOINT=https://hf-mirror.com （可以写入到~/.bashrc中，长久可用）</span><br></pre></td></tr></table></figure><p>windows可以创建名为<code>HF_ENDPOINT</code>的系统环境变量，值为<code>https://hf-mirror.com</code>。</p><p>参考内容如下，如果环境中有HF_ENDPOINT的设定就会采用该设定作为前缀，即上面镜像的<a href="https://hf-mirror.com而非默认的https//huggingface.co%E3%80%82">https://hf-mirror.com而非默认的https://huggingface.co。</a></p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/07/28/688746b6e3028.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/07/28/688746b6e3028.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="/path/to/env/site-packages/huggingface_hub/constants.py"/></div><span class="image-caption">/path/to/env/site-packages/huggingface_hub/constants.py</span></div>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/07/28/2025-7-28/</id>
    <link href="https://blog.xinghenluyus.cn/2025/07/28/2025-7-28/"/>
    <published>2025-07-27T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>将huggingface.co换成镜像源hf-mirror.com即可解决问题。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1<]]>
    </summary>
    <title>解决huggingface.co无法访问</title>
    <updated>2025-08-18T06:10:13.359Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="计算机网络" scheme="https://blog.xinghenluyus.cn/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    <category term="踩坑日记" scheme="https://blog.xinghenluyus.cn/tags/%E8%B8%A9%E5%9D%91%E6%97%A5%E8%AE%B0/"/>
    <content>
      <![CDATA[<div class="tag link"><a class="link-card" title="官方配置文档传送门" href="https://doc.natfrp.com/frpc/ssl.html"><div class="left"><img src="https://unpkg.com/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://unpkg.com/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">官方配置文档传送门</p><p class="url">https://doc.natfrp.com/frpc/ssl.html</p></div></a></div><p>我是在项目开发的过程中暂时暴露后端服务与前端通信时遇到的问题。浏览器限制要求必须使用https协议，然而Sakura自带的自签名证书会报错，甚至导致部分服务无法使用。一气之下决定彻底解决这个问题。</p><h2 id="1-准备工作"><a href="#1-准备工作" class="headerlink" title="1 准备工作"></a>1 准备工作</h2><p>首先，你要拥有一个自己的域名。我的域名都是<strong>腾讯云</strong>的。SSL证书的注册要求是你自己的域名。</p><p>学术研究可以考虑使用<code>纯数字（6位，8位都可）.xyz</code> ，十来块一年很便宜。作为常用域名还是推荐<code>.cn</code>后缀，国内域名，常见权威，关键是比<code>.com</code>便宜一大截。</p><p>然后，要有一个Sakura的账号和frpc。这里不过多赘述。</p><h2 id="2-注册证书"><a href="#2-注册证书" class="headerlink" title="2 注册证书"></a>2 注册证书</h2><ul><li><p><strong>这里使用 Zero SSL</strong></p></li><li><p>1 注册账号后，跟随图片指引填写信息。注意不要选任何付费项(pro)。</p></li></ul><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='one'><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/06/27/685eaac952c28.png' data-fancybox='one' data-caption='1'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/06/27/685eaac952c28.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eaac952c28.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="1"></a><span class='image-caption'>1</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/06/27/685eae217b61a.png' data-fancybox='one' data-caption='2'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/06/27/685eae217b61a.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eae217b61a.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="2"></a><span class='image-caption'>2</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/06/27/685eacd0167f0.png' data-fancybox='one' data-caption='3、一路next'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/06/27/685eacd0167f0.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eacd0167f0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="3、一路next"></a><span class='image-caption'>3、一路next</span></div></div><ul><li><p>2 选择<strong>DNS验证</strong>域名所属。记住下图信息，然后打开腾讯云控制台，创建一个CNAME解析。<strong>注意</strong>主机记录不要包括你的域名，只要前面的二级域名，也就是到<code>XXX.sakura</code>为止。记录值就是point to的内容照抄。</p></li><li><p>3 这个解析验证后可以删除。</p></li></ul><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='one'><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/06/27/685eaf032a366.png' data-fancybox='one' data-caption='1'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/06/27/685eaf032a366.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eaf032a366.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="1"></a><span class='image-caption'>1</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/06/27/685eb1345ae8d.png' data-fancybox='one' data-caption='2'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/06/27/685eb1345ae8d.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eb1345ae8d.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="2"></a><span class='image-caption'>2</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/06/27/685eb2486d268.png' data-fancybox='one' data-caption='3'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/06/27/685eb2486d268.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eb2486d268.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="3"></a><span class='image-caption'>3</span></div></div><ul><li>4 等待解析验证通过，证书马上就下来</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/06/27/685eb2c70477f.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eb2c70477f.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="这个页面就成功了，可以下载证书了"/></div><span class="image-caption">这个页面就成功了，可以下载证书了</span></div><ul><li>5 按照上图指引，选择<code>NGINX</code>，然后下载，证书下载成功。</li></ul><h2 id="3-配置证书"><a href="#3-配置证书" class="headerlink" title="3 配置证书"></a>3 配置证书</h2><h3 id="3-1-配置SSL"><a href="#3-1-配置SSL" class="headerlink" title="3.1 配置SSL"></a>3.1 配置SSL</h3><p>解压下载下来的文件后，会得到3个文件，<code>certificate.crt</code>,<code>ca_bundle.crt</code>,<code>private.key</code>。</p><ul><li>打开 <code>certificate.crt</code> 文件，复制所有内容。</li><li>打开 <code>ca_bundle.crt</code> 文件，复制所有内容。</li><li>创建一个新的文本文件，命名为 <code>sakura.xinghenluyus.cn.crt</code>。(<code>你的域名.crt</code>,下文以同理)</li><li>将 <code>certificate.crt</code> 的内容粘贴到新文件中。</li><li>在新文件末尾添加一个空行。</li><li>将 <code>ca_bundle.crt</code> 的内容粘贴到新文件中。</li><li>最终的 <code>sakura.xinghenluyus.cn.crt</code> 文件应该看起来像这样：</li></ul><figure class="highlight plaintext"><figcaption><span>frp.xinghenluyus.cn.crt</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">-----BEGIN CERTIFICATE-----</span><br><span class="line">... (your domain certificate content) ...</span><br><span class="line">-----END CERTIFICATE-----</span><br><span class="line"></span><br><span class="line">-----BEGIN CERTIFICATE-----</span><br><span class="line">... (intermediate certificate chain content) ...</span><br><span class="line">-----END CERTIFICATE-----</span><br></pre></td></tr></table></figure><ul><li>将 <code>private.key</code> 改名为 <code>sakura.xinghenluyus.cn.key</code> 。(<code>你的域名.key</code>)</li></ul><p>最终得到<code>sakura.xinghenluyus.cn.crt</code>和<code>sakura.xinghenluyus.cn.key</code>。</p><h3 id="3-2-配置SakuraFrp启动器"><a href="#3-2-配置SakuraFrp启动器" class="headerlink" title="3.2 配置SakuraFrp启动器"></a>3.2 配置SakuraFrp启动器</h3><ul><li>开启自动HTTPS，填入注册证书的域名。</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/06/27/685eb6ddc3f0f.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eb6ddc3f0f.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="开启https"/></div><span class="image-caption">开启https</span></div><ul><li>启动器进入 <code>设置</code> -&gt; <code>打开工作目录</code> ,进入 <code>FrpcWorkingDirectory</code> 文件夹。(frpc类似，也有这个文件夹)</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/06/27/685eb74e06dcf.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eb74e06dcf.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="打开工作目录"/></div><span class="image-caption">打开工作目录</span></div><ul><li>将 <code>sakura.xinghenluyus.cn.crt</code>和<code>sakura.xinghenluyus.cn.key</code> 都粘贴到当前文件夹，如果有就覆盖系统自带的。</li></ul><h3 id="3-3-配置域名解析"><a href="#3-3-配置域名解析" class="headerlink" title="3.3 配置域名解析"></a>3.3 配置域名解析</h3><ul><li>进入腾讯云的解析，新建<code>CNAME</code>解析，主机记录填<code>sakura</code>,记录值控制台日志里抄。</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/06/27/685eba941a7ad.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eba941a7ad.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="新建记录"/></div><span class="image-caption">新建记录</span></div><ul><li>记录值来源：</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/06/27/685ebb5e97a60.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685ebb5e97a60.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="记录值来自控制台日志"/></div><span class="image-caption">记录值来自控制台日志</span></div><h3 id="3-4-成功示例"><a href="#3-4-成功示例" class="headerlink" title="3.4 成功示例"></a>3.4 成功示例</h3><ul><li>开启隧道，查看控制台，证书是否加载成功。出现下图界面则成功</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/06/27/685eb937d7161.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/06/27/685eb937d7161.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="成功示例"/></div><span class="image-caption">成功示例</span></div><p>这时可以浏览器连接测试，发现弹出安全警告了。</p>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/06/27/2025-6-27/</id>
    <link href="https://blog.xinghenluyus.cn/2025/06/27/2025-6-27/"/>
    <published>2025-06-26T16:00:00.000Z</published>
    <summary>
      <![CDATA[<div class="tag link"><a class="link-card" title="官方配置文档传送门" href="https://doc.natfrp.com/frpc/ssl.html"><div class="left"><img src="https:/]]>
    </summary>
    <title>SakuraFrp隧道开启https，使用个人域名并配置SSL</title>
    <updated>2025-08-18T06:10:25.165Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="Java后端" scheme="https://blog.xinghenluyus.cn/categories/Java%E5%90%8E%E7%AB%AF/"/>
    <category term="踩坑日记" scheme="https://blog.xinghenluyus.cn/tags/%E8%B8%A9%E5%9D%91%E6%97%A5%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>在现代 Web 应用中，缓存是提升系统性能和减少数据库压力的重要手段。在最基本的SSM开发过程中，Springboot可以方便的将缓存和Redis集成，可以十分便捷的用注解开发。</p><p>个人情怀让我使用fastjson。升级到fastjson2后，原本的autotype被废除，不管是官方给出的代码示例还是论坛社区，都没有对泛型数据的支持，对于特定需求使用起来很不方便。</p><div class="note info"><p>泛型：如果你有一个普通 Java Bean (FileEntity) ，那么List<FileEntity>, Map&lt;String, Object&gt; 等就是泛型集合</p></div><h2 id="1-引入依赖"><a href="#1-引入依赖" class="headerlink" title="1 引入依赖"></a>1 引入依赖</h2><ul><li><strong>Springboot版本采用3.2.3</strong></li></ul><figure class="highlight plaintext"><figcaption><span>pom.xml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependencies&gt;</span><br><span class="line">    &lt;dependency&gt;</span><br><span class="line">        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span><br><span class="line">        &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt;</span><br><span class="line">    &lt;/dependency&gt;</span><br><span class="line">    &lt;dependency&gt;</span><br><span class="line">        &lt;groupId&gt;com.alibaba.fastjson2&lt;/groupId&gt;</span><br><span class="line">        &lt;artifactId&gt;fastjson2&lt;/artifactId&gt;</span><br><span class="line">        &lt;version&gt;2.0.57&lt;/version&gt;</span><br><span class="line">    &lt;/dependency&gt;</span><br><span class="line">    &lt;dependency&gt;</span><br><span class="line">        &lt;groupId&gt;com.alibaba.fastjson2&lt;/groupId&gt;</span><br><span class="line">        &lt;artifactId&gt;fastjson2-extension-spring6&lt;/artifactId&gt;</span><br><span class="line">        &lt;version&gt;2.0.57&lt;/version&gt;</span><br><span class="line">    &lt;/dependency&gt;</span><br><span class="line">&lt;/dependencies&gt;</span><br></pre></td></tr></table></figure><h2 id="2-创建自定义序列器"><a href="#2-创建自定义序列器" class="headerlink" title="2 创建自定义序列器"></a>2 创建自定义序列器</h2><ul><li>自定义 FastJSON2 序列化器（支持泛型）</li></ul><figure class="highlight plaintext"><figcaption><span>FastJsonRedisSerializer.java</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">package com.example.demo.config;</span><br><span class="line"></span><br><span class="line">import com.alibaba.fastjson2.JSON;</span><br><span class="line">import com.alibaba.fastjson2.JSONReader;</span><br><span class="line">import com.alibaba.fastjson2.TypeReference;</span><br><span class="line">import org.springframework.data.redis.serializer.RedisSerializer;</span><br><span class="line">import org.springframework.data.redis.serializer.SerializationException;</span><br><span class="line"></span><br><span class="line">import java.lang.reflect.Type;</span><br><span class="line"></span><br><span class="line">public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; &#123;</span><br><span class="line"></span><br><span class="line">    private static final JSONReader.Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(</span><br><span class="line">            &quot;com.example.demo.entity.&quot;, // 替换为你的实体包名</span><br><span class="line">            &quot;java.util.ArrayList&quot;,</span><br><span class="line">            &quot;java.util.HashMap&quot;</span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    private final Type type;</span><br><span class="line"></span><br><span class="line">    public FastJsonRedisSerializer(Type type) &#123;</span><br><span class="line">        this.type = type;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public FastJsonRedisSerializer(Class&lt;T&gt; clazz) &#123;</span><br><span class="line">        this.type = clazz;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    public byte[] serialize(T t) throws SerializationException &#123;</span><br><span class="line">        if (t == null) return new byte[0];</span><br><span class="line">        return JSON.toJSONBytes(t, JSON.Feature.WriteClassName);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    public T deserialize(byte[] bytes) throws SerializationException &#123;</span><br><span class="line">        if (bytes == null || bytes.length == 0) return null;</span><br><span class="line">        return JSON.parseObject(bytes, type, AUTO_TYPE_FILTER, JSON.Feature.SupportAutoType);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>String 类型专用序列化器</li></ul><figure class="highlight plaintext"><figcaption><span>FastJson2StringRedisSerializer.java</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">package com.example.demo.config;</span><br><span class="line"></span><br><span class="line">import org.springframework.data.redis.serializer.RedisSerializer;</span><br><span class="line">import org.springframework.data.redis.serializer.SerializationException;</span><br><span class="line"></span><br><span class="line">import java.nio.charset.StandardCharsets;</span><br><span class="line"></span><br><span class="line">public class FastJson2StringRedisSerializer implements RedisSerializer&lt;String&gt; &#123;</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    public byte[] serialize(String s) throws SerializationException &#123;</span><br><span class="line">        return s == null ? new byte[0] : s.getBytes(StandardCharsets.UTF_8);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    public String deserialize(byte[] bytes) throws SerializationException &#123;</span><br><span class="line">        return bytes == null || bytes.length == 0 ? null : new String(bytes, StandardCharsets.UTF_8);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="3-配置Config"><a href="#3-配置Config" class="headerlink" title="3 配置Config"></a>3 配置Config</h2><ul><li>配置 RedisTemplate</li></ul><figure class="highlight plaintext"><figcaption><span>RedisConfig.java</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">package com.example.demo.config;</span><br><span class="line"></span><br><span class="line">import org.springframework.context.annotation.Bean;</span><br><span class="line">import org.springframework.context.annotation.Configuration;</span><br><span class="line">import org.springframework.data.redis.connection.RedisConnectionFactory;</span><br><span class="line">import org.springframework.data.redis.core.RedisTemplate;</span><br><span class="line">import org.springframework.data.redis.serializer.StringRedisSerializer;</span><br><span class="line"></span><br><span class="line">@Configuration</span><br><span class="line">public class RedisConfig &#123;</span><br><span class="line"></span><br><span class="line">    @Bean</span><br><span class="line">    public RedisTemplate&lt;Object, Object&gt; redisTemplate(RedisConnectionFactory factory) &#123;</span><br><span class="line">        RedisTemplate&lt;Object, Object&gt; template = new RedisTemplate&lt;&gt;();</span><br><span class="line">        template.setConnectionFactory(factory);</span><br><span class="line"></span><br><span class="line">        FastJsonRedisSerializer&lt;Object&gt; valueSerializer = new FastJsonRedisSerializer&lt;&gt;(Object.class);</span><br><span class="line">        FastJson2StringRedisSerializer stringSerializer = new FastJson2StringRedisSerializer();</span><br><span class="line"></span><br><span class="line">        template.setKeySerializer(stringSerializer);             // key: String</span><br><span class="line">        template.setHashKeySerializer(stringSerializer);         // hashKey: String</span><br><span class="line">        template.setValueSerializer(valueSerializer);            // value: 泛型对象</span><br><span class="line">        template.setHashValueSerializer(valueSerializer);        // hashValue: 泛型对象</span><br><span class="line">        template.setDefaultSerializer(valueSerializer);</span><br><span class="line">        template.setStringSerializer(stringSerializer);</span><br><span class="line">        template.afterPropertiesSet();</span><br><span class="line"></span><br><span class="line">        return template;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>配置 RedisCacheManager（用于 @Cacheable 等注解）</li></ul><figure class="highlight plaintext"><figcaption><span>RedisCacheConfig.java</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">package com.example.demo.config;</span><br><span class="line"></span><br><span class="line">import org.springframework.cache.annotation.EnableCaching;</span><br><span class="line">import org.springframework.context.annotation.Bean;</span><br><span class="line">import org.springframework.context.annotation.Configuration;</span><br><span class="line">import org.springframework.data.redis.cache.RedisCacheConfiguration;</span><br><span class="line">import org.springframework.data.redis.cache.RedisCacheManager;</span><br><span class="line">import org.springframework.data.redis.connection.RedisConnectionFactory;</span><br><span class="line">import org.springframework.data.redis.serializer.RedisSerializationContext;</span><br><span class="line"></span><br><span class="line">import java.time.Duration;</span><br><span class="line"></span><br><span class="line">@Configuration</span><br><span class="line">@EnableCaching</span><br><span class="line">public class RedisCacheConfig &#123;</span><br><span class="line"></span><br><span class="line">    @Bean</span><br><span class="line">    public RedisCacheManager redisCacheManager(RedisConnectionFactory factory) &#123;</span><br><span class="line">        FastJsonRedisSerializer&lt;Object&gt; serializer = new FastJsonRedisSerializer&lt;&gt;(Object.class);</span><br><span class="line"></span><br><span class="line">        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()</span><br><span class="line">                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))</span><br><span class="line">                .entryTtl(Duration.ofMinutes(30)); // 设置缓存过期时间</span><br><span class="line"></span><br><span class="line">        return RedisCacheManager.builder(factory)</span><br><span class="line">                .cacheDefaults(config)</span><br><span class="line">                .build();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>到此配置全部完毕</strong></p><h2 id="4-Spring-Cache-注解详解与使用示例"><a href="#4-Spring-Cache-注解详解与使用示例" class="headerlink" title="4 Spring Cache 注解详解与使用示例"></a>4 Spring Cache 注解详解与使用示例</h2><h3 id="4-1-Cacheable"><a href="#4-1-Cacheable" class="headerlink" title="4.1 @Cacheable"></a>4.1 @Cacheable</h3><p><strong>用途</strong>：标记方法返回值需被缓存。若缓存存在，则直接返回；否则执行方法体并缓存结果。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Cacheable(value = &quot;fileCache&quot;, key = &quot;#id&quot;)</span></span><br><span class="line">FileEntity <span class="title function_">getFileById</span><span class="params">(UUID id)</span>;</span><br></pre></td></tr></table></figure><h3 id="4-2-CachePut"><a href="#4-2-CachePut" class="headerlink" title="4.2 @CachePut"></a>4.2 @CachePut</h3><p><strong>用途</strong>：更新缓存，总是执行方法并将结果写入缓存。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@CachePut(value = &quot;fileCache&quot;, key = &quot;#result.id&quot;)</span></span><br><span class="line">FileEntity <span class="title function_">saveFile</span><span class="params">(FileEntity file)</span>;</span><br></pre></td></tr></table></figure><h3 id="4-3-CacheEvict"><a href="#4-3-CacheEvict" class="headerlink" title="4.3 @CacheEvict"></a>4.3 @CacheEvict</h3><p><strong>用途</strong>：清除缓存中的条目。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@CacheEvict(value = &quot;fileCache&quot;, key = &quot;#id&quot;)</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">deleteFile</span><span class="params">(UUID id)</span>;</span><br></pre></td></tr></table></figure><p>清空整个缓存区域：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@CacheEvict(value = &quot;fileListCache&quot;, allEntries = true)</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">clearAllFiles</span><span class="params">()</span>;</span><br></pre></td></tr></table></figure><h3 id="4-4-CacheConfig"><a href="#4-4-CacheConfig" class="headerlink" title="4.4 @CacheConfig"></a>4.4 @CacheConfig</h3><p><strong>用途</strong>：类级别共享缓存配置</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@CacheConfig(cacheNames = &quot;fileCache&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileService</span> &#123;</span><br><span class="line">    <span class="meta">@Cacheable(key = &quot;#id&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> FileEntity <span class="title function_">getFileById</span><span class="params">(UUID id)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> fileMapper.selectById(id);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="4-5-业务层使用示例"><a href="#4-5-业务层使用示例" class="headerlink" title="4.5 业务层使用示例"></a>4.5 业务层使用示例</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileService</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">private</span> FileRepository fileRepository;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Cacheable(value = &quot;fileCache&quot;, key = &quot;#id&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> FileEntity <span class="title function_">getFileById</span><span class="params">(UUID id)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> fileRepository.selectById(id);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@CachePut(value = &quot;fileCache&quot;, key = &quot;#result.id&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> FileEntity <span class="title function_">saveFile</span><span class="params">(FileEntity file)</span> &#123;</span><br><span class="line">        fileRepository.insert(file);</span><br><span class="line">        <span class="keyword">return</span> file;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@CacheEvict(value = &quot;fileCache&quot;, key = &quot;#id&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">deleteFile</span><span class="params">(UUID id)</span> &#123;</span><br><span class="line">        fileRepository.deleteById(id);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Cacheable(value = &quot;fileListCache&quot;, key = &quot;&#x27;all&#x27;&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> List&lt;FileEntity&gt; <span class="title function_">getAllFiles</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> fileRepository.selectAll();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/06/12/2025-6-12/</id>
    <link href="https://blog.xinghenluyus.cn/2025/06/12/2025-6-12/"/>
    <published>2025-06-11T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>在现代 Web 应用中，缓存是提升系统性能和减少数据库压力的重要手段。在最基本的SSM开发过程中，Springboot可以方便的将缓存和Redis集成，可以十分便捷的用注解开发。</p>
<p>个人情怀让我使用fastjson。升级到fastjson2后，原本的autoty]]>
    </summary>
    <title>Spring Boot 集成 Redis 缓存并使用 FastJSON2 作为序列化器的完整配置指南</title>
    <updated>2025-08-18T06:10:33.107Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="运维" scheme="https://blog.xinghenluyus.cn/categories/%E8%BF%90%E7%BB%B4/"/>
    <category term="磁盘管理" scheme="https://blog.xinghenluyus.cn/tags/%E7%A3%81%E7%9B%98%E7%AE%A1%E7%90%86/"/>
    <content>
      <![CDATA[<p>相信小伙伴们在使用电脑时经常会出现电脑的硬盘不够用的情况。特别是C盘或者D盘的爆满，这时候单纯的加装硬盘只会让你凭空多一个盘，还是不能解决C盘或者D盘爆满的问题。</p><p>我的个人情况是C，D盘原本处于同一硬盘中，我利用磁盘迁移工具将整个D盘完美复制到了新的E盘，实现彻底的扩容。</p><h3 id="下载工具DiskCopy"><a href="#下载工具DiskCopy" class="headerlink" title="下载工具DiskCopy"></a>下载工具DiskCopy</h3><p>对比多个工具，DiskCopy最简单易用，功能也较为完善，还很轻量。</p><p>自行前往相应网站下载，我的版本是<code>DiskCopy_v1.4.2.0_Chs</code>，打开后对应界面如下：</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/30/67e935d9ae1bf.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/30/67e935d9ae1bf.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="工具界面"/></div><span class="image-caption">工具界面</span></div><h3 id="开始迁移数据"><a href="#开始迁移数据" class="headerlink" title="开始迁移数据"></a>开始迁移数据</h3><p>打开分区复制，选择对应的复制分区(原D盘)和目标分区(原E盘)，开始复制，接下来漫长等待即可。</p><p><strong>由于我的已经修改了卷标，不要被我的F盘和D盘误导！</strong></p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/30/67e9367e3c154.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/30/67e9367e3c154.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="分区复制"/></div><span class="image-caption">分区复制</span></div><h3 id="修改卷标"><a href="#修改卷标" class="headerlink" title="修改卷标"></a>修改卷标</h3><p>搜索进入<code>磁盘管理</code></p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/30/67e937cfb42f6.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/30/67e937cfb42f6.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="磁盘管理"/></div><span class="image-caption">磁盘管理</span></div><p>更改对应的卷标，把D先改成F，然后把E改成D。上图是修改好的样子</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/30/67e9385c8811a.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/30/67e9385c8811a.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="修改卷标"/></div><span class="image-caption">修改卷标</span></div><p>要是修改不成功应该是<strong>页面文件</strong>的问题，自行上网搜索解决。</p><p>重启电脑，验证文件特别是应用程序的完整性。没有发现问题的话F盘可以直接删除给C盘扩容啦！</p>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/03/30/2025-3-30/</id>
    <link href="https://blog.xinghenluyus.cn/2025/03/30/2025-3-30/"/>
    <published>2025-03-29T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>相信小伙伴们在使用电脑时经常会出现电脑的硬盘不够用的情况。特别是C盘或者D盘的爆满，这时候单纯的加装硬盘只会让你凭空多一个盘，还是不能解决C盘或者D盘爆满的问题。</p>
<p>我的个人情况是C，D盘原本处于同一硬盘中，我利用磁盘迁移工具将整个D盘完美复制到了新的E盘，实现]]>
    </summary>
    <title>笔记本电脑扩容并将整个D盘迁移到新硬盘</title>
    <updated>2025-08-18T06:10:48.737Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="计算机网络" scheme="https://blog.xinghenluyus.cn/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    <category term="光猫" scheme="https://blog.xinghenluyus.cn/tags/%E5%85%89%E7%8C%AB/"/>
    <content>
      <![CDATA[<p>我采用ztuOnu工具刷光猫进入telnet。话不多说，直接开始。</p><h3 id="1-将光猫恢复出厂设置"><a href="#1-将光猫恢复出厂设置" class="headerlink" title="1 将光猫恢复出厂设置"></a>1 将光猫恢复出厂设置</h3><p>拔掉光纤，捅光猫的恢复出厂设置(RESET)按键，重置光猫。</p><p>光猫重置后，原先业务下发会被取消，内置的超级管理员账户会恢复初始默认的密码<code>aDm8H%MdA</code>，之后千万不要插入光纤，不然业务会下发，超级管理员密码会被运营商<del>篡改</del>。</p><h3 id="2-下载工具ztuOnu"><a href="#2-下载工具ztuOnu" class="headerlink" title="2 下载工具ztuOnu"></a>2 下载工具ztuOnu</h3><p>到ztuOnu的<a href="https://github.com/Septrum101/zteOnu/releases">github发布页</a>，下载对应版本。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/18/67d95f3a8be0f.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/18/67d95f3a8be0f.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="我下载的版本"/></div><span class="image-caption">我下载的版本</span></div><p>将压缩包解压到一个特定文件夹里，接下来我们使用这个工具强行用telnet连接光猫。</p><h3 id="3-一些准备工作"><a href="#3-一些准备工作" class="headerlink" title="3 一些准备工作"></a>3 一些准备工作</h3><ul><li><p>将电脑mac地址设置为<code>000729553557</code></p></li><li><p>Windows需要启用telnet客户端</p></li><li><p>拔掉光猫上所有网线，用一根网线将光猫和电脑连接起来。</p></li></ul><h3 id="4-开始刷光猫"><a href="#4-开始刷光猫" class="headerlink" title="4 开始刷光猫"></a>4 开始刷光猫</h3><p>进入工具所在的文件夹，空白地方<code>右击</code> &gt; <code>显示更多选项</code> &gt; <code>在终端中打开</code> ,打开<code>Powershell</code>窗口。<span class='p green'>其它操作系统同理打开命令行即可。</span></p><figure class="highlight plaintext"><figcaption><span>使用new命令</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.\zteOnu.exe --ip &quot;192.168.1.1&quot; --new --user &quot;CMCCAdmin&quot; --pass &quot;aDm8H%MdA&quot; --port 80 --tp 23 --telnet</span><br></pre></td></tr></table></figure><p>接下来的步骤一定要迅速，要是出现登录失败的情况，请重复上一步new命令。要是出现被锁定的情况，请等待5分钟重试。</p><figure class="highlight plaintext"><figcaption><span>登陆telnet</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">telnet 192.168.1.1</span><br></pre></td></tr></table></figure><p>快速输入对应的账号和密码，账号Login为<code>root</code> ,密码password为<code>Zte521</code>。如果不成功，就重新刷到成功为止。</p><p>进入光猫telnet，<psw>这时不是想干什么干什么^~^,</psw>每个光猫都默认有一个拥有最高权限超级管理员和背面显示账号密码，供用户基础操作的普通用户。这里我选择把光猫背面的普通用户提升为超级管理员，经验证，插入光纤业务下发后不会还原这个设置，相当于绕过运营商拥有了光猫的最高权限。</p><figure class="highlight plaintext"><figcaption><span>把光猫背面的普通用户提升为超级管理员</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sendcmd 1 DB set DevAuthInfo 1 Level 1</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>保存配置</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sendcmd 1 DB save</span><br></pre></td></tr></table></figure><span class='p green'>更多配置可以自行上网查阅资料。本教程这里可以关闭命令行了。</span><h3 id="5-最后一些配置"><a href="#5-最后一些配置" class="headerlink" title="5 最后一些配置"></a>5 最后一些配置</h3><ul><li><p>插上光纤，等待业务下发。</p></li><li><p>等待光猫状态正常后，进入<code>192.168.1.1</code>,使用光猫背面提权过的用户，登录光猫配置页面。</p></li><li><p>删掉光猫拨号的连接，新建一条<code>bridge</code>的连接，记住VLAN ID保持一致，见下图红色框框。VLAN ID因人而异。</p></li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/21/67dd061da986a.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/21/67dd061da986a.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="光猫管理页"/></div><span class="image-caption">光猫管理页</span></div><ul><li>还原网线，路由器设置拨号上网即可。(不知道拨号账号密码的可以致电运营商询问)</li></ul><p>经测试，不删除TR069也可以正常改桥接。TR069是运营商下发配置的连接，一般用来动态化超级管理员密码。OTHER是机顶盒连接。</p>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/03/18/2025-3-18/</id>
    <link href="https://blog.xinghenluyus.cn/2025/03/18/2025-3-18/"/>
    <published>2025-03-17T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>我采用ztuOnu工具刷光猫进入telnet。话不多说，直接开始。</p>
<h3 id="1-将光猫恢复出厂设置"><a href="#1-将光猫恢复出厂设置" class="headerlink" title="1 将光猫恢复出厂设置"></a>1 将光猫恢复出厂设置<]]>
    </summary>
    <title>中兴光猫(ZXHN 7000M)改桥接</title>
    <updated>2025-08-18T06:10:56.311Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="软件下载" scheme="https://blog.xinghenluyus.cn/categories/%E8%BD%AF%E4%BB%B6%E4%B8%8B%E8%BD%BD/"/>
    <category term="踩坑日记" scheme="https://blog.xinghenluyus.cn/tags/%E8%B8%A9%E5%9D%91%E6%97%A5%E8%AE%B0/"/>
    <content>
      <![CDATA[<p>我在使用IDEA构建Springboot项目时，修改了项目的默认Maven，改成了我<strong>新下载</strong>的本地Maven仓库。</p><p>在使用<code>.xml</code>文件进行配置时，IDEA报错：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">未解析的依赖项: &#x27;org.mybatis:mybatis-spring:jar:2.0.6&#x27;</span><br></pre></td></tr></table></figure><p>我在网上搜索了各种教程和相关资料，都没有得到解决。最后当我打开Maven的自定义本地仓库文件夹，<span class='p red'>居然发现里面是空的！</span></p><p>检查了环境变量，又检查了配置文件，均未发现异常。经排查，<strong>原因如下</strong>:</p><ul><li>我将Maven根目录放在了<code>D:\Program Files\apache-maven-3.9.9</code>,而<code>Program Files</code>文件夹的权限是<strong>管理员权限</strong>(猜测是之前安装什么环境时用安装程序安装，导致文件夹权限变高)。</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/14/67d3c620c72be.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/14/67d3c620c72be.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="默认没有管理员权限只可读" style="width:30em;"/></div><span class="image-caption">默认没有管理员权限只可读</span></div><p>为了不破坏原有程序文件，我将Maven根目录移动到<code>D:\Program Files (x86)\apache-maven-3.9.9</code>,重新配置环境变量和配置文件，重启IDEA，问题解决。</p><p>PS：猜测只报错一个依赖的原因不是出在依赖本身，而是拉取第一个依赖就无法写入，后续依赖的拉取自动被停止，只报错了第一个依赖，导致误判出错原因。<strong>大家要养成良好的安装习惯！</strong></p>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/03/15/2025-3-15/</id>
    <link href="https://blog.xinghenluyus.cn/2025/03/15/2025-3-15/"/>
    <published>2025-03-14T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>我在使用IDEA构建Springboot项目时，修改了项目的默认Maven，改成了我<strong>新下载</strong>的本地Maven仓库。</p>
<p>在使用<code>.xml</code>文件进行配置时，IDEA报错：</p>
<figure class="h]]>
    </summary>
    <title>解决Windows下本地Maven仓库修改repository路径，文件夹始终为空</title>
    <updated>2025-08-18T06:11:04.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>Luyus</name>
    </author>
    <category term="编程之外" scheme="https://blog.xinghenluyus.cn/categories/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%96/"/>
    <category term="教程" scheme="https://blog.xinghenluyus.cn/tags/%E6%95%99%E7%A8%8B/"/>
    <content>
      <![CDATA[<p>这是我的第一篇博客，也是本站的部署记录。</p><h2 id="1-前言"><a href="#1-前言" class="headerlink" title="1 前言"></a>1 前言</h2><p>相信每一个想部署个人博客的小伙伴们都想快速上手个人博客。在众多框架中，hexo以庞大的使用群体胜出，成为了我的选择。而Volantis主题又以清新脱俗的小众化吸引了我的注意。</p><p>在网站的部署上，我选择部署在GitHub pages<psw>（毕竟谁不喜欢有稳定又白能嫖的渠道呢）</psw>。碍于国内访问速度过慢，我将网站上传CDN提升国内访问速度，并使用了自己的域名<a href="blog.xinghenluyus.cn">blog.xinghenluyus.cn</a>.</p><div class="note "><p>本站仅提供个人部署思路.</p></div><h2 id="2-Hexo安装"><a href="#2-Hexo安装" class="headerlink" title="2 Hexo安装"></a>2 Hexo安装</h2><h3 id="2-1-环境配置"><a href="#2-1-环境配置" class="headerlink" title="2.1 环境配置"></a>2.1 环境配置</h3><ul><li>安装<a href="https://nodejs.org/">Node.js</a></li><li>安装<a href="https://git-scm.com/download/win">Git</a></li></ul><div class="note info"><p>具体教材可以自行上网搜索</p></div><h3 id="2-2-安装Hexo"><a href="#2-2-安装Hexo" class="headerlink" title="2.2 安装Hexo"></a>2.2 安装Hexo</h3><p>点击<a href="https://hexo.io/zh-cn/docs/setup">这里</a>前往Hexo官方文档。</p><div class="timeline"><div class="timenode"><div class="meta"><p><p>全局安装npm</p></p></div><div class="body"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br><span class="line"></span><br><span class="line">//国内镜像源也可以使用</span><br><span class="line">cnpm install -g hexo-cli</span><br></pre></td></tr></table></figure></div></div><div class="timenode"><div class="meta"><p><p>初始化博客文件夹</p></p></div><div class="body"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//cd到要存放博客的本地文件夹</span><br><span class="line">hexo init myblog</span><br></pre></td></tr></table></figure></div></div><div class="timenode"><div class="meta"><p><p>安装相关依赖</p></p></div><div class="body"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> myblog</span><br><span class="line">npm install</span><br></pre></td></tr></table></figure></div></div><div class="timenode"><div class="meta"><p><p>启动服务</p></p></div><div class="body"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo g </span><br><span class="line">hexo server</span><br></pre></td></tr></table></figure></div></div><div class="timenode"><div class="meta"><p><p>按照提示打开浏览器</p></p></div><div class="body"><p>访问<a href="http://localhost:4000/">http://localhost:4000/</a>,出现下图界面则部署成功。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/11/67cfb4a7d32d0.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/11/67cfb4a7d32d0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="本地浏览器界面"/></div><span class="image-caption">本地浏览器界面</span></div></div></div></div><p>之后，就可以在<code>source/_posts</code>中创建md文件写自己的代码啦<psw>，也可以用new命令，个人感觉没必要，直接创建，省时省力</psw>。</p><div class="note info"><p>每次更改Hexo代码后，都要重新启动服务</p></div><h3 id="2-3-部署到GitHub-Pages"><a href="#2-3-部署到GitHub-Pages" class="headerlink" title="2.3 部署到GitHub Pages"></a>2.3 部署到GitHub Pages</h3><p>如果你跟我一样把网站托管到GitHub，最好是有一个<del>科学上网</del>工具。</p><div class="timeline"><div class="timenode"><div class="meta"><p><p>创建GitHub仓库</p></p></div><div class="body"><p>登录GitHub，new 一个 Repository，Repository name一定要是<code>你的用户名.github.io</code>。如下图所示，<span class='p red'>报错是因为仓库已经存在</span>。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/11/67d04253db4b1.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/11/67d04253db4b1.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="新建仓库页面"/></div><span class="image-caption">新建仓库页面</span></div><div class="note warning"><p>第一次使用时出现下图报错，推荐直接删除仓库重新创建！</p></div></div></div><div class="timenode"><div class="meta"><p><p>安装git插件</p></p></div><div class="body"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure></div></div><div class="timenode"><div class="meta"><p><p>修改<code>blog/_config.yml</code>配置文件</p></p></div><div class="body"><p>找到下文代码段，覆盖修改。其中<code>yourname</code>替换成自己的github用户名。</p><figure class="highlight plaintext"><figcaption><span>blog/_config.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># Deployment</span><br><span class="line">## Docs: https://hexo.io/docs/one-command-deployment</span><br><span class="line">deploy:</span><br><span class="line">  type: git</span><br><span class="line">  repository: https://github.com/yourname/yourname.github.io.git</span><br><span class="line">  branch: main</span><br><span class="line"></span><br></pre></td></tr></table></figure></div></div></div><p>全部完成后，执行如下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo c &amp;&amp; hexo g &amp;&amp; hexo d  </span><br><span class="line"><span class="comment"># hexo d 表示执行部署, hexo c 会清除hexo g 生成的文件，一般连用</span></span><br></pre></td></tr></table></figure><p>命令行最后一行输出如下信息则表示上传成功：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">INFO  Total precache size is about 1.98 MB for 26 resources.</span><br></pre></td></tr></table></figure><p>执行成功可以通过<code>yourname.github.io</code>来访问博客了。</p><h3 id="2-4-安装Volantis主题（可选）"><a href="#2-4-安装Volantis主题（可选）" class="headerlink" title="2.4 安装Volantis主题（可选）"></a>2.4 安装Volantis主题（可选）</h3><div class="note link green"><p>传送门 <a href="https://volantis.js.org/v5/getting-started/">Volantis官方文档</a></p></div><ul><li>这里我采用npm安装</li></ul><div class="timeline"><div class="timenode"><div class="meta"><p><p>在<code>blog/_config.yml</code>文件中找到并修改：</p></p></div><div class="body"><figure class="highlight plaintext"><figcaption><span>blog/_config.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"># Extensions</span><br><span class="line">## Plugins: https://hexo.io/plugins/</span><br><span class="line">## Themes: https://hexo.io/themes/</span><br><span class="line">theme: volantis</span><br></pre></td></tr></table></figure></div></div><div class="timenode"><div class="meta"><p><p>npm下载主题</p></p></div><div class="body"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//cd到个人博客本地根目录</span><br><span class="line">npm i hexo-theme-volantis</span><br></pre></td></tr></table></figure></div></div></div><h3 id="2-5-配置Volantis主题（可选）"><a href="#2-5-配置Volantis主题（可选）" class="headerlink" title="2.5 配置Volantis主题（可选）"></a>2.5 配置Volantis主题（可选）</h3><p>博客根目录下新建<code> _config.volantis.yml</code>文件,这是主题自带的配置文件，可以覆盖<code>blog\node_modules\hexo-theme-volantis</code>下<code>_config.yml</code>的配置，起到主题<strong>全局配置</strong>的作用。</p><ul><li>这里推荐一个我参考的博客，具体配置这里不再赘述：</li></ul><div class="tag link"><a class="link-card" title="给自己的hexo博客个性化Volantis主题" href="https://blog.csdn.net/qq_42887663/article/details/128209285"><div class="left"><img src="https://unpkg.com/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://unpkg.com/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">给自己的hexo博客个性化Volantis主题</p><p class="url">https://blog.csdn.net/qq_42887663/article/details/128209285</p></div></a></div><details yellow><summary> 我的_config.volantis.yml文件 (点击展开) </summary>              <div class='content'>              <figure class="highlight plaintext"><figcaption><span>blog/_config.volantis.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br></pre></td><td class="code"><pre><span class="line">############################### Navigation Bar ############################### &gt; start</span><br><span class="line"># 注意事项：建议规范全站路径 URL 最后带一个 &quot;/&quot; 例如 &quot;about/&quot;</span><br><span class="line">navbar:</span><br><span class="line">  visiable: auto # always, auto</span><br><span class="line">  logo: # choose [img] or [icon + title]</span><br><span class="line">    img: volantis-static/media/org.volantis/blog/Logo-NavBar@3x.png # https://gcore.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png</span><br><span class="line">    icon:</span><br><span class="line">    title:</span><br><span class="line">  menu:</span><br><span class="line">    - name: 博客</span><br><span class="line">      icon: fa-solid fa-rss</span><br><span class="line">      url: /</span><br><span class="line">    - name: 分类</span><br><span class="line">      icon: fa-solid fa-folder-open</span><br><span class="line">      url: categories/</span><br><span class="line">    - name: 标签</span><br><span class="line">      icon: fa-solid fa-tags</span><br><span class="line">      url: tags/</span><br><span class="line">    - name: 归档</span><br><span class="line">      icon: fa-solid fa-archive</span><br><span class="line">      url: archives/</span><br><span class="line">    - name: 友链</span><br><span class="line">      icon: fa-solid fa-link</span><br><span class="line">      url: friends/</span><br><span class="line">    - name: 关于</span><br><span class="line">      icon: fa-solid fa-info-circle</span><br><span class="line">      url: about/</span><br><span class="line">  search: Search...   # Search bar placeholder</span><br><span class="line">############################### Navigation Bar ############################### &gt; end</span><br><span class="line"></span><br><span class="line">############################### Cover ############################### &gt; start</span><br><span class="line">cover:</span><br><span class="line">  height_scheme: full # full, half</span><br><span class="line">  layout_scheme: dock # blank (留白), search (搜索), dock (坞), featured (精选), focus (焦点)</span><br><span class="line">  display:</span><br><span class="line">    home: true</span><br><span class="line">    archive: true</span><br><span class="line">    others: false # can be written in front-matter &#x27;cover: true&#x27;</span><br><span class="line">  background: #https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg</span><br><span class="line">  # background: https://bing.ioliu.cn/v1/rand?w=1920&amp;h=1200</span><br><span class="line">  logo: # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-Cover@3x.png</span><br><span class="line">  title: &#x27;&lt;font&gt;&lt;span&gt;Hello&lt;/span&gt; &lt;span&gt;Travelers&lt;/span&gt;&lt;/font&gt;&#x27;</span><br><span class="line">  subtitle:  &lt;div id=&quot;binft&quot;&gt;&lt;/div&gt;</span><br><span class="line">  search: 在这里搜索Luyus的博客 # search bar placeholder</span><br><span class="line">  features:</span><br><span class="line">    - name: 主页</span><br><span class="line">      icon: #</span><br><span class="line">      url: /</span><br><span class="line">    - name: 分类</span><br><span class="line">      icon: #</span><br><span class="line">      url: categories/</span><br><span class="line">    - name: 标签</span><br><span class="line">      icon: #</span><br><span class="line">      url: tags/</span><br><span class="line">    - name: 归档</span><br><span class="line">      icon: #</span><br><span class="line">      url: archives/</span><br><span class="line">    - name: 友链</span><br><span class="line">      icon: #</span><br><span class="line">      url: friends/</span><br><span class="line">    - name: 关于</span><br><span class="line">      icon: #</span><br><span class="line">      url: about/</span><br><span class="line">############################### Cover ############################### &gt; end</span><br><span class="line"></span><br><span class="line">pages:</span><br><span class="line">  # 友链页面配置</span><br><span class="line">  friends:</span><br><span class="line">    layout_scheme: simple # simple: 简单布局, traditional: 传统布局</span><br><span class="line"></span><br><span class="line">search:</span><br><span class="line">  enable: true</span><br><span class="line">  service: hexo</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">### 自定义右键 新</span><br><span class="line">rightmenus:</span><br><span class="line">  enable: true</span><br><span class="line">  # 右键菜单项及加载顺序</span><br><span class="line">  # 内容示例：plugins.[组名], menus.[组名], hr(分割线，推荐去线留白), music(音乐控制器)</span><br><span class="line">  order: </span><br><span class="line">    - plugins.navigation</span><br><span class="line">    - hr</span><br><span class="line">    - plugins.inputBox #文本输入框</span><br><span class="line">    - plugins.seletctText #选中文本</span><br><span class="line">    - plugins.elementCheck #链接判断</span><br><span class="line">    - plugins.elementImage #图片判断</span><br><span class="line">    - menus.link</span><br><span class="line">    - hr</span><br><span class="line">    - menus.darkMode</span><br><span class="line">    - plugins.articlePage</span><br><span class="line">    - hr</span><br><span class="line">    - music</span><br><span class="line">  ############################</span><br><span class="line">  # - &#123;id: &#x27;&#x27;, name: &#x27;&#x27;, icon: &#x27;&#x27;, link: &#x27;&#x27;, event: &#x27;&#x27;, group: &#x27;&#x27;&#125;</span><br><span class="line">  # id: 唯一值</span><br><span class="line">  # name: 用于菜单名称显示</span><br><span class="line">  # icon: 用于菜单图标显示</span><br><span class="line">  # link: 跳转链接</span><br><span class="line">  # event: 事件，当输入内容不为内置事件时，作 JavaScript 代码执行</span><br><span class="line">  # group: 菜单项所处分组名称</span><br><span class="line">  # 注： </span><br><span class="line">  # 1. link/event 二选一，同时出现时仅处理 link</span><br><span class="line">  # 2. 内置事件列表： copyText, copyLink, copyPaste, copyAll, copyCut, copyImg, printMode, readMode</span><br><span class="line">  # 3. 内置组列表：navigation, inputBox, seletctText, elementCheck, elementImage, articlePage</span><br><span class="line">  # 4. plugins 列允许自定义组内项目</span><br><span class="line">  # 5. menus   列允许自定义组及其内容</span><br><span class="line">  # 6. 除 navigation 外的内置组，在显示时会隐藏含 link 属性的菜单项</span><br><span class="line">  ###########################</span><br><span class="line">  # 基础项设置</span><br><span class="line">  options:</span><br><span class="line">    # 图标前缀 fa-solid, fa-regular, fa-light, fa-thin, fa-duotone, fa-brands</span><br><span class="line">    iconPrefix: fa-solid</span><br><span class="line">    # 例外，在 articlePage 组显示时（文章页）时依旧显示含 link 属性的菜单项</span><br><span class="line">    articleShowLink: true</span><br><span class="line">    # 当设定全局音乐播放器时，是否一直显示音乐控制菜单。false：仅当音乐播放时启用</span><br><span class="line">    musicAlwaysShow: true</span><br><span class="line">    # 适用于复制图片文件的场景，当图片源未设置 Access-Control-Allow-Origin 时，图片复制由于 CORS 问题失败</span><br><span class="line">    # 你可以自行部署相应项目解决该问题，详见：https://github.com/Rob--W/cors-anywhere 或者 https://github.com/Zibri/cloudflare-cors-anywhere</span><br><span class="line">    corsAnywhere: </span><br><span class="line">  # 右键内置组，预置实现</span><br><span class="line">  plugins:</span><br><span class="line">    # 导航组件</span><br><span class="line">    # 横向排列，共用一行，仅显示图标 (原则上支持的数量不限)</span><br><span class="line">    navigation: </span><br><span class="line">      - &#123;id: &#x27;left&#x27;, name: &#x27;转到上一页&#x27;, icon: &#x27;fa-solid fa-arrow-left&#x27;, event: &#x27;history.back()&#x27;, group: &#x27;navigation&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;right&#x27;, name: &#x27;转到下一页&#x27;, icon: &#x27;fa-solid fa-arrow-right&#x27;, event: &#x27;history.forward()&#x27;, group: &#x27;navigation&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;redo&#x27;, name: &#x27;刷新当前页面&#x27;, icon: &#x27;fa-solid fa-redo&#x27;, event: &#x27;window.location.reload()&#x27;, group: &#x27;navigation&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;up&#x27;, name: &#x27;回到顶部&#x27;, icon: &#x27;fa-solid fa-arrow-up&#x27;, event: &#x27;VolantisApp.scrolltoElement(volantis.dom.bodyAnchor)&#x27;, group: &#x27;navigation&#x27;&#125;</span><br><span class="line">      # - &#123;id: &#x27;home&#x27;, name: &#x27;回到首页&#x27;, icon: &#x27;fa-solid fa-home&#x27;, link: &#x27;/&#x27;, group: &#x27;navigation&#x27;&#125;</span><br><span class="line">    # 文本输入框相关组件</span><br><span class="line">    # 生效于 input/textarea，粘贴、剪切、全选</span><br><span class="line">    inputBox:</span><br><span class="line">      - &#123;id: &#x27;copyPaste&#x27;, name: &#x27;粘贴文本&#x27;, icon: &#x27;fa-solid fa-paste&#x27;, event: &#x27;copyPaste&#x27;, group: &#x27;inputBox&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;copyAll&#x27;, name: &#x27;全选文本&#x27;, icon: &#x27;fa-solid fa-object-ungroup&#x27;, event: &#x27;copyAll&#x27;, group: &#x27;inputBox&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;copyCut&#x27;, name: &#x27;剪切文本&#x27;, icon: &#x27;fa-solid fa-cut&#x27;, event: &#x27;copyCut&#x27;, group: &#x27;inputBox&#x27;&#125;</span><br><span class="line">    # 文本选中类组件</span><br><span class="line">    # 生效于右键选中文本，__text__ 为选中的文本。     </span><br><span class="line">    seletctText:</span><br><span class="line">      - &#123;id: &#x27;copyText&#x27;, name: &#x27;复制文本&#x27;, icon: &#x27;fa-solid fa-copy&#x27;, event: &#x27;copyText&#x27;, group: &#x27;seletctText&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;searchWord&#x27;, name: &#x27;站内搜索&#x27;, icon: &#x27;fa-solid fa-search&#x27;, event: &#x27;OpenSearch(__text__)&#x27;, group: &#x27;seletctText&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;bingSearch&#x27;, name: &#x27;必应搜索&#x27;, icon: &#x27;fa-solid fa-search&#x27;, event: &#x27;window.open(`https://cn.bing.com/search?q=$&#123;__text__&#125;`)&#x27;, group: &#x27;seletctText&#x27;&#125;</span><br><span class="line">      #- &#123;id: &#x27;googleSearch&#x27;, name: &#x27;谷歌搜索&#x27;, icon: &#x27;fa-solid fa-search&#x27;, event: &#x27;window.open(`https://www.google.com/search?q=$&#123;__text__&#125;`)&#x27;, group: &#x27;seletctText&#x27;&#125;</span><br><span class="line">    # 链接判断组件</span><br><span class="line">    # 生效于链接处的右键行为，__link__ 为链接地址</span><br><span class="line">    elementCheck:</span><br><span class="line">      - &#123;id: &#x27;openTab&#x27;, name: &#x27;新标签页打开&#x27;, icon: &#x27;fa-solid fa-external-link-square-alt&#x27;, event: &#x27;window.open(__link__)&#x27;, group: &#x27;elementCheck&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;copyLink&#x27;, name: &#x27;复制链接地址&#x27;, icon: &#x27;fa-solid fa-link&#x27;, event: &#x27;copyLink&#x27;, group: &#x27;elementCheck&#x27;&#125;</span><br><span class="line">    # 图片判断类组件</span><br><span class="line">    # 生效于图片类的右键行为，__link__ 为链接地址</span><br><span class="line">    elementImage:</span><br><span class="line">    - &#123;id: &#x27;openImg&#x27;, name: &#x27;打开图片&#x27;, icon: &#x27;fa-solid fa-image&#x27;, event: &#x27;window.open(`$&#123;__link__&#125;`)&#x27;, group: &#x27;elementImage&#x27;&#125;</span><br><span class="line">      # - &#123;id: &#x27;copyImg&#x27;, name: &#x27;复制图片&#x27;, icon: &#x27;fa-solid fa-image&#x27;, event: &#x27;copyImg&#x27;, group: &#x27;elementImage&#x27;&#125;</span><br><span class="line">      # - &#123;id: &#x27;googleImg&#x27;, name: &#x27;谷歌识图&#x27;, icon: &#x27;fa-solid fa-images&#x27;, event: &#x27;window.open(`https://www.google.com.hk/searchbyimage?image_url=$&#123;__link__&#125;`)&#x27;, group: &#x27;elementImage&#x27;&#125;</span><br><span class="line">    # 文章页面组件</span><br><span class="line">    # 生效于 post.article 页面</span><br><span class="line">    articlePage:</span><br><span class="line">      # - &#123;id: &#x27;printMode&#x27;, name: &#x27;打印页面&#x27;, icon: &#x27;fa-solid fa-print&#x27;, event: &#x27;printMode&#x27;, group: &#x27;articlePage&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;readMode&#x27;, name: &#x27;阅读模式&#x27;, icon: &#x27;fa-solid fa-book-open&#x27;, event: &#x27;readMode&#x27;, group: &#x27;articlePage&#x27;&#125;</span><br><span class="line">  # 右键自定义菜单区域</span><br><span class="line">  menus:</span><br><span class="line">    link:</span><br><span class="line">      - &#123;id: &#x27;home&#x27;, name: &#x27;回到首页&#x27;, icon: &#x27;fa-solid fa-home&#x27;, link: &#x27;/&#x27;, group: &#x27;link&#x27;&#125;</span><br><span class="line">      - &#123;id: &#x27;openBgImg&#x27;, name: &#x27;查看背景&#x27;, icon: &#x27;fa-solid fa-cloud&#x27;, event: &#x27;openCurrentBgImage()&#x27;, group: &#x27;link&#x27;&#125;</span><br><span class="line">      # - &#123;id: &#x27;help&#x27;, name: &#x27;常见问题&#x27;, icon: &#x27;fa-solid fa-question&#x27;, link: &#x27;https://volantis.js.org/faqs/&#x27;, group: &#x27;link&#x27;&#125;</span><br><span class="line">      # - &#123;id: &#x27;examples&#x27;, name: &#x27;示例博客&#x27;, icon: &#x27;fa-solid fa-rss&#x27;, link: &#x27;https://volantis.js.org/examples/&#x27;, group: &#x27;link&#x27;&#125;</span><br><span class="line">      # - &#123;id: &#x27;contributors&#x27;, name: &#x27;加入社区&#x27;, icon: &#x27;fa-solid fa-fan&#x27;, link: &#x27;https://volantis.js.org/contributors/&#x27;, group: &#x27;link&#x27;&#125;</span><br><span class="line">      # - hr</span><br><span class="line">      # - &#123;id: &#x27;source_docs&#x27;, name: &#x27;本站源码&#x27;, icon: &#x27;fa-solid fa-code-branch&#x27;, link: &#x27;https://github.com/volantis-x/volantis-docs/&#x27;, group: &#x27;link&#x27;&#125;</span><br><span class="line">      # - &#123;id: &#x27;source_theme&#x27;, name: &#x27;主题源码&#x27;, icon: &#x27;fa-solid fa-code-branch&#x27;, link: &#x27;https://github.com/volantis-x/hexo-theme-volantis/&#x27;, group: &#x27;link&#x27;&#125;</span><br><span class="line">    darkMode: </span><br><span class="line">      - &#123;id: &#x27;darkMode&#x27;, name: &#x27;暗黑模式&#x27;, icon: &#x27;fa-solid fa-moon&#x27;, event: &#x27;volantis.dark.toggle()&#x27;, group: &#x27;darkMode&#x27;&#125;</span><br><span class="line">###</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">############################### Sidebar ############################### &gt; start</span><br><span class="line">sidebar:</span><br><span class="line">  position: right # left right</span><br><span class="line">  # 主页、分类、归档等独立页面</span><br><span class="line">  for_page: [blogger, category, tagcloud, webinfo]</span><br><span class="line">  # layout: docs/post 这类文章页面</span><br><span class="line">  for_post: [blogger, toc]</span><br><span class="line">  # 侧边栏组件库</span><br><span class="line">  widget_library:</span><br><span class="line">    # ---------------------------------------</span><br><span class="line">    # blogger info widget</span><br><span class="line">    blogger:</span><br><span class="line">      class: blogger</span><br><span class="line">      display: [desktop, mobile] # [desktop, mobile]</span><br><span class="line">      avatar: volantis-static/media/org.volantis/blog/Logo-NavBar@3x.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png</span><br><span class="line">      shape: rectangle # circle, rectangle</span><br><span class="line">      url: /about/</span><br><span class="line">      title: #######</span><br><span class="line">      subtitle:</span><br><span class="line">      jinrishici: false # Poetry Today. You can set a string, and it will be displayed when loading fails.</span><br><span class="line">      customword: 一个专注于分享踩坑的小站.</span><br><span class="line">      social:</span><br><span class="line">        - icon: fas fa-rss</span><br><span class="line">          url: https://github.com/volantis-x/hexo-theme-volantis/</span><br><span class="line">        - icon: fa-solid fa-envelope</span><br><span class="line">          url: mailto:2593026969@qq.com</span><br><span class="line">        - icon: fab fa-github</span><br><span class="line">          url: https://github.com/xinghenLuyus/</span><br><span class="line">    # ---------------------------------------</span><br><span class="line">    # toc widget (valid only in articles)</span><br><span class="line">    toc:</span><br><span class="line">      class: toc</span><br><span class="line">      display: [desktop, mobile] # [desktop, mobile]</span><br><span class="line">      sticky: true</span><br><span class="line">      header:</span><br><span class="line">        icon: fa-solid fa-list</span><br><span class="line">        title: 本文目录</span><br><span class="line">      list_number: false</span><br><span class="line">      min_depth: 2</span><br><span class="line">      max_depth: 5</span><br><span class="line">    # ---------------------------------------</span><br><span class="line">    # music</span><br><span class="line">    music:</span><br><span class="line">      class: music</span><br><span class="line">      display: [desktop, mobile] # [desktop, mobile]</span><br><span class="line">      pjaxReload: false</span><br><span class="line">    # ---------------------------------------</span><br><span class="line">    # category widget</span><br><span class="line">    category:</span><br><span class="line">      class: category</span><br><span class="line">      display: [desktop] # [desktop, mobile]</span><br><span class="line">      header:</span><br><span class="line">        icon: fa-solid fa-folder-open</span><br><span class="line">        title: 文章分类</span><br><span class="line">        url: /blog/categories/</span><br><span class="line">    # ---------------------------------------</span><br><span class="line">    # tagcloud widget</span><br><span class="line">    tagcloud:</span><br><span class="line">      class: tagcloud</span><br><span class="line">      display: [desktop, mobile] # [desktop, mobile]</span><br><span class="line">      header:</span><br><span class="line">        icon: fa-solid fa-tags</span><br><span class="line">        title: 热门标签</span><br><span class="line">        url: /blog/tags/</span><br><span class="line">      min_font: 14</span><br><span class="line">      max_font: 24</span><br><span class="line">      color: true</span><br><span class="line">      start_color: &#x27;#999&#x27;</span><br><span class="line">      end_color: &#x27;#555&#x27;</span><br><span class="line">    # ---------------------------------------</span><br><span class="line">    # webinfo widget</span><br><span class="line">    webinfo:</span><br><span class="line">      class: webinfo</span><br><span class="line">      display: [desktop]</span><br><span class="line">      header:</span><br><span class="line">        icon: fa-solid fa-award</span><br><span class="line">        title: 站点信息</span><br><span class="line">      type:</span><br><span class="line">        article:</span><br><span class="line">          enable: true</span><br><span class="line">          text: &#x27;文章数目：&#x27;</span><br><span class="line">          unit: &#x27;篇&#x27;</span><br><span class="line">        runtime:</span><br><span class="line">          enable: false</span><br><span class="line">          data: &#x27;2025/02/28&#x27;    # 填写建站日期</span><br><span class="line">          text: &#x27;已运行时间：&#x27;</span><br><span class="line">          unit: &#x27;天&#x27;</span><br><span class="line">        wordcount:</span><br><span class="line">          enable: true</span><br><span class="line">          text: &#x27;本站总字数：&#x27;   # 需要启用 wordcount</span><br><span class="line">          unit: &#x27;字&#x27;</span><br><span class="line">        visitcounter:</span><br><span class="line">          siteuv:</span><br><span class="line">            enable: true</span><br><span class="line">            text: &#x27;本站访客数：&#x27;</span><br><span class="line">            unit: &#x27;人&#x27;</span><br><span class="line">          sitepv:</span><br><span class="line">            enable: true</span><br><span class="line">            text: &#x27;本站总访问量：&#x27;</span><br><span class="line">            unit: &#x27;次&#x27;</span><br><span class="line">        lastupd:</span><br><span class="line">          enable: true</span><br><span class="line">          friendlyShow: true    # 更友好的时间显示</span><br><span class="line">          text: &#x27;最后活动时间：&#x27;</span><br><span class="line">          unit: &#x27;日&#x27;</span><br><span class="line">    # ---------------------------------------</span><br><span class="line">    # lastupdate widget</span><br><span class="line">    lastupdate:</span><br><span class="line">      class: lastupdate</span><br><span class="line">      display: [desktop, mobile]</span><br><span class="line">      header:</span><br><span class="line">        icon: fa-solid fa-clock WISTERIA</span><br><span class="line">        title: 最近更新</span><br><span class="line">############################### Sidebar ############################### &gt; end</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#自定义网页底部</span><br><span class="line">site_footer:</span><br><span class="line">  # layout of footer: [aplayer, social, license, info, copyright]</span><br><span class="line">  layout: [aplayer, copyright]</span><br><span class="line">  copyright: &#x27;[欣赏一下我喜欢的歌呀~](/)&#x27;</span><br><span class="line">  # You can add your own property here. (Support markdown, for example: br: &#x27;&lt;br&gt;&#x27;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">plugins:</span><br><span class="line">  # 文章字数统计、阅读时长，开启需要安装插件: npm i --save hexo-wordcount</span><br><span class="line">  wordcount:</span><br><span class="line">    enable: true</span><br><span class="line"></span><br><span class="line">  # 暗黑模式 darkmode</span><br><span class="line">  # 开关按钮：在 navbar.menu 中添加：</span><br><span class="line">  # - name: 暗黑模式 # 可自定义</span><br><span class="line">  #   icon: fa-solid fa-moon # 可自定义</span><br><span class="line">  #   toggle: darkmode</span><br><span class="line">  darkmode:</span><br><span class="line">    enable: true</span><br><span class="line"></span><br><span class="line">  # APlayer is only available in mainland China.</span><br><span class="line">  # APlayer config: https://github.com/metowolf/MetingJS</span><br><span class="line">  aplayer:</span><br><span class="line">    enable: true</span><br><span class="line">    # Required</span><br><span class="line">    server: netease   # netease, tencent, kugou, xiami, baidu歌曲的网站</span><br><span class="line">    type: song    # song, playlist, album, search, artist 歌曲或者歌单、专辑等</span><br><span class="line">    id: #######   # song id / playlist id / album id / search keyword歌曲或者歌单的id</span><br><span class="line">    # Optional</span><br><span class="line">    fixed: false      # enable fixed mode</span><br><span class="line">    theme: &#x27;#1BCDFC&#x27;  # main color</span><br><span class="line">    autoplay: false   # audio autoplay是否自动播放</span><br><span class="line">    order: list       # player play order, values: &#x27;list&#x27;, &#x27;random&#x27;</span><br><span class="line">    loop: one         # player loop play, values: &#x27;all&#x27;, &#x27;one&#x27;, &#x27;none&#x27;</span><br><span class="line">    volume: 0.7       # default volume, notice that player will remember user setting, default volume will not work after user set volume themselves</span><br><span class="line">    list_max_height: 320px # list max height</span><br><span class="line">    list_folded: true</span><br><span class="line">    autoHide: false    # hide automaticaly是否要隐藏</span><br><span class="line"></span><br><span class="line">  parallax:</span><br><span class="line">  #背景设置</span><br><span class="line">    enable: true</span><br><span class="line">    position: fixed       # cover: sticky on the cover.   fixed: Fixed as background for the site.</span><br><span class="line">    shuffle: true         # shuffle playlist</span><br><span class="line">    duration: 10000       # Duration (ms)</span><br><span class="line">    fade: 1500            # fade duration (ms) (Not more than 1500)</span><br><span class="line">    images:               # For personal use only. At your own risk if used for commercial purposes !!!</span><br><span class="line">      - https://your.cdn.url</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">############################### Article Layout ############################### &gt; start</span><br><span class="line"># 文章布局</span><br><span class="line">article:</span><br><span class="line">  # 文章列表页面的文章卡片布局方案</span><br><span class="line">  preview:</span><br><span class="line">    scheme: lanscape # landscape</span><br><span class="line">    # pin icon for post</span><br><span class="line">    pin_icon: volantis-static/media/twemoji/assets/svg/1f4cc.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f4cc.svg</span><br><span class="line">    # auto generate title if not exist</span><br><span class="line">    auto_title: true # false, true</span><br><span class="line">    # auto generate excerpt if not exist</span><br><span class="line">    auto_excerpt: true # false, true</span><br><span class="line">    # hide excerpt</span><br><span class="line">    hide_excerpt: false</span><br><span class="line">    # show split line or not</span><br><span class="line">    line_style: solid # hidden, solid, dashed, dotted</span><br><span class="line">    # show author</span><br><span class="line">    author: false # true, false</span><br><span class="line">    # show readmore button</span><br><span class="line">    readmore: auto # auto, always</span><br><span class="line">  # 文章详情页面的文章卡片本体布局方案</span><br><span class="line">  body:</span><br><span class="line">    # 文章顶部信息</span><br><span class="line">    # 从 meta_library 中取</span><br><span class="line">    top_meta: [date, category, tags, counter] #启用评论数量需在此添加</span><br><span class="line">    # 文章底部信息</span><br><span class="line">    # 从 meta_library 中取</span><br><span class="line">    bottom_meta: [updated, wordcount, walinecount, share]</span><br><span class="line">    # ----------------</span><br><span class="line">    # 文章页脚组件</span><br><span class="line">    footer_widget:</span><br><span class="line">      # ----------------</span><br><span class="line">      # 参考资料、相关资料等 (for layout: post/docs)</span><br><span class="line">      references:</span><br><span class="line">        title: 参考资料</span><br><span class="line">        icon: fa-solid fa-quote-left</span><br><span class="line">        # 在 front-matter 中:</span><br><span class="line">        #   references:</span><br><span class="line">        #     - title: 某篇文章</span><br><span class="line">        #       url: https://</span><br><span class="line">        # 即可显示此组件。</span><br><span class="line">      # ----------------</span><br><span class="line">      # 相关文章，需要安装插件 (for layout: post)</span><br><span class="line">      # npm i hexo-related-popular-posts</span><br><span class="line">      related_posts:</span><br><span class="line">        enable: false</span><br><span class="line">        title: 相关文章</span><br><span class="line">        icon: fa-solid fa-bookmark</span><br><span class="line">        max_count: 5</span><br><span class="line">        # 设为空则不使用文章头图</span><br><span class="line">        placeholder_img: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg</span><br><span class="line">      # ----------------</span><br><span class="line">      # 版权声明组件 (for layout: post)</span><br><span class="line">      copyright:</span><br><span class="line">        enable: false</span><br><span class="line">        permalink: &#x27;本文永久链接是：&#x27;</span><br><span class="line">        content:</span><br><span class="line">          - &#x27;博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议&#x27;</span><br><span class="line">          - permalink</span><br><span class="line">         # 自定义版权组件：精细到文章的版权声明</span><br><span class="line">        custom: true # 开启后替代上方内容的版权显示</span><br><span class="line">        customData:</span><br><span class="line">          default: type1  # 默认授权声明</span><br><span class="line">          #############################</span><br><span class="line">          # 你可以在文章的 front-matter 覆盖默认版权声明</span><br><span class="line">          # 配置示例（均可选）： </span><br><span class="line">          # copyright:</span><br><span class="line">          #   type: type3           # 当前文章版权声明类型</span><br><span class="line">          #   author: 张三          # 本文作者</span><br><span class="line">          #   ref:                  # 原文出处</span><br><span class="line">          #     title:              # 原文出处 - 标题</span><br><span class="line">          #     url:                # 原文出处 - 链接</span><br><span class="line">          #############################</span><br><span class="line">          rules:</span><br><span class="line">            type1: </span><br><span class="line">              text: &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh#&quot; target=&quot;_blank&quot;&gt;CC BY-NC-SA 4.0&lt;/a&gt;</span><br><span class="line">              desc: 署名-非商业性使用-相同方式共享 4.0 国际。</span><br><span class="line">            type2: </span><br><span class="line">              text: 禁止转载引用</span><br><span class="line">              desc: 除非获得原作者的单独授权，任何第三方不得转载！</span><br><span class="line">            type3: </span><br><span class="line">              text: 原作许可协议</span><br><span class="line">              desc: 本文转载自他站，转载或引用本文时，请遵守原作许可协议！</span><br><span class="line">            type4: </span><br><span class="line">              text: 来自互联网</span><br><span class="line">              desc: 本文来自互联网，未知来源，侵权请联系删除。</span><br><span class="line">            type5:</span><br><span class="line">              text: 允许规范转载</span><br><span class="line">              desc: 转载请保留本文转载地址，著作权归作者所有！</span><br><span class="line">            type6:</span><br><span class="line">              text: 允许付费转载</span><br><span class="line">              desc: 您可以联系作者通过付费方式获得授权。</span><br><span class="line">            # 还能自行添加更多</span><br><span class="line">      # ----------------</span><br><span class="line">      # 打赏组件 (for layout: post)</span><br><span class="line">      donate:</span><br><span class="line">        enable: false</span><br><span class="line">        images:</span><br><span class="line">          - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png</span><br><span class="line">          - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png</span><br><span class="line">    # meta library</span><br><span class="line">    meta_library:</span><br><span class="line">      # 默认文章作者（可在 _data/author.yaml 中增加其他作者，并在 front-matter 中设置）</span><br><span class="line">      # https://volantis.js.org/advanced-settings/#多人协同</span><br><span class="line">      author:</span><br><span class="line">        avatar: #文章作者的头像 # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/apple-touch-icon.png</span><br><span class="line">        name: #作者名字</span><br><span class="line">        url: /</span><br><span class="line">      # 文章创建日期</span><br><span class="line">      date:</span><br><span class="line">        icon: fa-solid fa-calendar-alt</span><br><span class="line">        title: &#x27;发布于：&#x27;</span><br><span class="line">        format: &#x27;ll&#x27; # 日期格式 http://momentjs.com/docs/</span><br><span class="line">      # 文章更新日期</span><br><span class="line">      updated:</span><br><span class="line">        icon: fa-solid fa-edit</span><br><span class="line">        title: &#x27;更新于：&#x27;</span><br><span class="line">        format: &#x27;ll&#x27; # 日期格式 http://momentjs.com/docs/</span><br><span class="line">      # 文章分类</span><br><span class="line">      category:</span><br><span class="line">        icon: fa-solid fa-folder-open</span><br><span class="line">      # 文章浏览计数</span><br><span class="line">      counter:</span><br><span class="line">        icon: fa-solid fa-eye</span><br><span class="line">        unit: &#x27;次浏览&#x27;</span><br><span class="line">      # waline 文章评论数量</span><br><span class="line">      walinecount:</span><br><span class="line">        icon: fa-solid fa-comment-dots</span><br><span class="line">        desc: &#x27;条评论&#x27; # 条评论</span><br><span class="line">      # artalk 文章评论数量</span><br><span class="line">      artalkcount:</span><br><span class="line">        icon: fa-solid fa-comment-dots</span><br><span class="line">        desc: &#x27;条评论&#x27; # 条评论</span><br><span class="line">      # 文章字数和阅读时长</span><br><span class="line">      wordcount:</span><br><span class="line">        icon_wordcount: fa-solid fa-keyboard</span><br><span class="line">        icon_duration: fa-solid fa-hourglass-half</span><br><span class="line">      # 文章标签</span><br><span class="line">      tags:</span><br><span class="line">        icon: fa-solid fa-hashtag</span><br><span class="line">      # 分享</span><br><span class="line">      share:</span><br><span class="line">        - id: qq</span><br><span class="line">          img:  volantis-static/media/org.volantis/logo/128/qq.png #  https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qq.png</span><br><span class="line">        # - id: qzone</span><br><span class="line">        #   img: volantis-static/media/org.volantis/logo/128/qzone.png #  https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qzone.png</span><br><span class="line">        # - id: weibo</span><br><span class="line">        #   img: volantis-static/media/org.volantis/logo/128/weibo.png #  https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/weibo.png</span><br><span class="line">        - id: qrcode # 当id为qrcode时需要安装插件  npm i hexo-helper-qrcode</span><br><span class="line">          img: volantis-static/media/org.volantis/logo/128/wechat.png #  https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/wechat.png</span><br><span class="line">        - id: telegram</span><br><span class="line">          img: volantis-static/media/org.volantis/logo/128/telegram.png #  https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/telegram.png</span><br><span class="line">############################### Article Layout ############################### &gt; end</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">custom_css:</span><br><span class="line">  body:</span><br><span class="line">    effect: [shadow, blur] # [shadow, floatable, blur]</span><br><span class="line">    highlight:</span><br><span class="line">      language: true # show language of codeblock</span><br><span class="line">      grayscale: false # Enable grayscale effect</span><br><span class="line">    text_align: # left, right, justify, center</span><br><span class="line">      h1: left</span><br><span class="line">      h2: left</span><br><span class="line">      h3: left</span><br><span class="line">      h4: left</span><br><span class="line">      p: justify</span><br><span class="line">  fontfamily:</span><br><span class="line">    logofont:</span><br><span class="line">      fontfamily: &#x27;&quot;Varela Round&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, Helvetica, Arial&#x27;</span><br><span class="line">      name: &#x27;Varela Round&#x27;</span><br><span class="line">      url: volantis-static/media/fonts/VarelaRound/VarelaRound-Regular.ttf # https://gcore.jsdelivr.net/gh/volantis-x/cdn-fonts/VarelaRound/VarelaRound-Regular.ttf</span><br><span class="line">      weight: normal</span><br><span class="line">      style: normal</span><br><span class="line">    bodyfont:</span><br><span class="line">      fontfamily: &#x27;UbuntuMono, &quot;Varela Round&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, Helvetica, Arial&#x27;</span><br><span class="line">      name: &#x27;UbuntuMono&#x27;</span><br><span class="line">      url: volantis-static/media/fonts/UbuntuMono/UbuntuMono-Regular.ttf # https://gcore.jsdelivr.net/gh/volantis-x/cdn-fonts/UbuntuMono/UbuntuMono-Regular.ttf</span><br><span class="line">      weight: normal</span><br><span class="line">      style: normal</span><br><span class="line">    codefont:</span><br><span class="line">      fontfamily: &#x27;Menlo, UbuntuMono, Monaco&#x27;</span><br><span class="line">      name: &#x27;Monaco&#x27;</span><br><span class="line">      url: volantis-static/media/fonts/Monaco/Monaco.ttf # https://gcore.jsdelivr.net/gh/volantis-x/cdn-fonts/Monaco/Monaco.ttf</span><br><span class="line">      weight: normal</span><br><span class="line">      style: normal</span><br><span class="line">    scrollbar:</span><br><span class="line">      size: 4px</span><br><span class="line">      border: 2px</span><br><span class="line">      color: &#x27;#2196f3&#x27;</span><br><span class="line">      hover: &#x27;#ff5722&#x27;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">color_scheme:</span><br><span class="line">  # ------------</span><br><span class="line">  # 通用颜色</span><br><span class="line">  common:</span><br><span class="line">    # 主题色</span><br><span class="line">    theme: &#x27;#44D7B6&#x27;</span><br><span class="line">    # 链接色</span><br><span class="line">    link: &#x27;#2196f3&#x27;</span><br><span class="line">    # 按钮色</span><br><span class="line">    button: &#x27;#44D7B6&#x27;</span><br><span class="line">    # 鼠标放到交互元素上时的色</span><br><span class="line">    hover: &#x27;#ff5722&#x27;</span><br><span class="line">    # 主题色块内部的文字颜色</span><br><span class="line">    inner: &#x27;#fff&#x27;</span><br><span class="line">    # 选中区域文字的背景颜色</span><br><span class="line">    selection: &#x27;alpha(#2196f3, 0.2)&#x27;</span><br><span class="line">  # ------------</span><br><span class="line">  # 亮色主题（默认）</span><br><span class="line">  light:</span><br><span class="line">    # 网站背景色</span><br><span class="line">    site_bg: &#x27;#f4f4f4&#x27;</span><br><span class="line">    # 网站背景上的文字</span><br><span class="line">    site_inner: &#x27;#fff&#x27;</span><br><span class="line">    # 网站页脚文字</span><br><span class="line">    site_footer: &#x27;#fff&#x27;</span><br><span class="line"></span><br><span class="line">    # 卡片背景色</span><br><span class="line">    card: &#x27;#fff&#x27;</span><br><span class="line">    # 卡片上的普通文字</span><br><span class="line">    text: &#x27;#444&#x27;</span><br><span class="line"></span><br><span class="line">    # 区块和代码块背景色</span><br><span class="line">    block: &#x27;#f6f6f6&#x27;</span><br><span class="line">    # 代码块高亮时的背景色</span><br><span class="line">    codeblock: &#x27;#f6f6f6&#x27;</span><br><span class="line">    # 行内代码颜色</span><br><span class="line">    inlinecode: &#x27;#D56D28&#x27;</span><br><span class="line"></span><br><span class="line">    # 文章部分</span><br><span class="line">    h1: &#x27;#444&#x27;</span><br><span class="line">    h2: &#x27;#444&#x27;</span><br><span class="line">    h3: &#x27;#444&#x27;</span><br><span class="line">    h4: &#x27;#444&#x27;</span><br><span class="line">    h5: &#x27;#444&#x27;</span><br><span class="line">    h6: &#x27;#444&#x27;</span><br><span class="line">    p: &#x27;#444&#x27;</span><br><span class="line"></span><br><span class="line">    # 列表文字</span><br><span class="line">    list: &#x27;#666&#x27;</span><br><span class="line">    # 列表 hover 时的文字</span><br><span class="line">    list_hl: &#x27;mix($color-theme, #000, 80)&#x27;</span><br><span class="line">    # 辅助性文字</span><br><span class="line">    meta: &#x27;#888&#x27;</span><br><span class="line">  # ------------</span><br><span class="line">  # 暗色主题</span><br><span class="line">  dark:</span><br><span class="line">    # 网站背景色</span><br><span class="line">    site_bg: &#x27;#222&#x27;</span><br><span class="line">    # 网站背景上的文字</span><br><span class="line">    site_inner: &#x27;#eee&#x27;</span><br><span class="line">    # 网站页脚文字</span><br><span class="line">    site_footer: &#x27;#aaa&#x27;</span><br><span class="line">    # 卡片背景色</span><br><span class="line">    card: &#x27;#444&#x27;</span><br><span class="line">    # 卡片上的普通文字</span><br><span class="line">    text: &#x27;#eee&#x27;</span><br><span class="line"></span><br><span class="line">    # 区块和代码块背景色</span><br><span class="line">    block: &#x27;#3a3a3a&#x27;</span><br><span class="line">    # 代码块高亮时的背景色</span><br><span class="line">    codeblock: &#x27;#343a3c&#x27;</span><br><span class="line">    # 行内代码颜色</span><br><span class="line">    inlinecode: &#x27;#D56D28&#x27;</span><br><span class="line"></span><br><span class="line">    # 文章部分</span><br><span class="line">    h1: &#x27;#eee&#x27;</span><br><span class="line">    h2: &#x27;#eee&#x27;</span><br><span class="line">    h3: &#x27;#ddd&#x27;</span><br><span class="line">    h4: &#x27;#ddd&#x27;</span><br><span class="line">    h5: &#x27;#ddd&#x27;</span><br><span class="line">    h6: &#x27;#ddd&#x27;</span><br><span class="line">    p: &#x27;#bbb&#x27;</span><br><span class="line"></span><br><span class="line">    # 列表文字</span><br><span class="line">    list: &#x27;#aaa&#x27;</span><br><span class="line">    # 列表 hover 时的文字</span><br><span class="line">    list_hl: &#x27;mix($color-theme, #fff, 80)&#x27;</span><br><span class="line">    # 辅助性文字</span><br><span class="line">    meta: &#x27;#888&#x27;</span><br><span class="line">    # 夜间图片亮度</span><br><span class="line">    brightness: 70%</span><br><span class="line">  body:</span><br><span class="line">    effect: [blur] # [shadow, floatable, blur]</span><br><span class="line">    highlight:</span><br><span class="line">      language: true # show language of codeblock</span><br><span class="line">      copy_btn: true  </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">analytics:</span><br><span class="line">  # 不蒜子访问统计</span><br><span class="line">  busuanzi: https://gcore.jsdelivr.net/gh/volantis-x/cdn-busuanzi@2.3/js/busuanzi.pure.mini.js</span><br><span class="line">  leancloud: # 请使用自己的 id &amp; key 以防止数据丢失</span><br><span class="line">    app_id: # 应用 APP_ID</span><br><span class="line">    app_key: # 应用 APP_KEY</span><br><span class="line">    custom_api_server: # 国际版一般不需要写，除非自定义了 API Server</span><br><span class="line"></span><br><span class="line">############################### Comments ############################### &gt; start</span><br><span class="line">comments:</span><br><span class="line">  title: &lt;i class=&#x27;fa-solid fa-comments&#x27;&gt;&lt;/i&gt; 评论</span><br><span class="line">  subtitle:</span><br><span class="line">  service: giscus</span><br><span class="line">  # 可选评论系统 #</span><br><span class="line">    # giscus</span><br><span class="line">  # https://giscus.app</span><br><span class="line">  # https://github.com/laymonage/giscus</span><br><span class="line">  giscus:</span><br><span class="line">    # 以下配置按照 yml 格式增删填写即可</span><br><span class="line">    repo: yourrepo/comments</span><br><span class="line">    repo-id: #######</span><br><span class="line">    category: Announcements</span><br><span class="line">    category-id: #######</span><br><span class="line">    mapping: &quot;pathname&quot;</span><br><span class="line">    reactions-enabled: &quot;1&quot;</span><br><span class="line">    emit-metadata: &quot;0&quot;</span><br><span class="line">    lang: &quot;zh-CN&quot;</span><br><span class="line">    # 以上配置按照 yml 格式增删填写即可</span><br><span class="line">    theme:</span><br><span class="line">      light: &quot;light&quot; # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/light.css</span><br><span class="line">      dark: &quot;dark&quot; # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/dark.css</span><br><span class="line">############################### Comments ############################### &gt; end</span><br><span class="line"></span><br></pre></td></tr></table></figure>              </div>            </details><details yellow><summary> 我的_config.yml(点击展开) </summary>              <div class='content'>              <figure class="highlight plaintext"><figcaption><span>blog/_config.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br></pre></td><td class="code"><pre><span class="line"># Hexo Configuration</span><br><span class="line">## Docs: https://hexo.io/docs/configuration.html</span><br><span class="line">## Source: https://github.com/hexojs/hexo/</span><br><span class="line"></span><br><span class="line"># Site</span><br><span class="line">title: Luyus&#x27; Blog</span><br><span class="line">subtitle: &#x27;A website for recording technical learning&#x27;</span><br><span class="line">description: &#x27;星痕的个人博客——Luyus的技术之旅，专注于技术学习与分享。在这里，我将记录自己在编程、网络、运维等领域的探索历程，与你一同成长。Star Trace’s Personal Blog – Luyus’ Tech Journey, dedicated to the exploration and sharing of technology. Here, I document my adventures in programming, networking, and system operations, inviting you to grow alongside me.&#x27;</span><br><span class="line">keywords: blog, Luyus, tech, technology, programming, network, operation, system, development, learning, sharing, growth, exploration, adventure, journey, record, explore, discover, study, research, experience, knowledge, information, resource, guide, tutorial, solution, problem, challenge, solution, code, script, tool, software, hardware, service, platform, website, blog, post, article, content, writing, reading, thinking, idea, thought, opinion, view, perspective, insight, inspiration, motivation, encouragement, support, help, assistance, advice, suggestion, recommendation, reference, resource, link</span><br><span class="line">author: Luyus</span><br><span class="line">language: en</span><br><span class="line">timezone: &#x27;Asia/Shanghai&#x27;</span><br><span class="line"></span><br><span class="line"># URL</span><br><span class="line">## Set your site url here. For example, if you use GitHub Page, set url as &#x27;https://username.github.io/project&#x27;</span><br><span class="line">url: https://your.cdn.blog/</span><br><span class="line">permalink: :year/:month/:day/:title/</span><br><span class="line">permalink_defaults:</span><br><span class="line">pretty_urls:</span><br><span class="line">  trailing_index: true # Set to false to remove trailing &#x27;index.html&#x27; from permalinks</span><br><span class="line">  trailing_html: true # Set to false to remove trailing &#x27;.html&#x27; from permalinks</span><br><span class="line"></span><br><span class="line"># Directory</span><br><span class="line">source_dir: source</span><br><span class="line">public_dir: public</span><br><span class="line">tag_dir: tags</span><br><span class="line">archive_dir: archives</span><br><span class="line">category_dir: categories</span><br><span class="line">code_dir: downloads/code</span><br><span class="line">i18n_dir: :lang</span><br><span class="line">skip_render:</span><br><span class="line"></span><br><span class="line"># Writing</span><br><span class="line">new_post_name: :title.md # File name of new posts</span><br><span class="line">default_layout: post</span><br><span class="line">titlecase: false # Transform title into titlecase</span><br><span class="line">external_link:</span><br><span class="line">  enable: true # Open external links in new tab</span><br><span class="line">  field: site # Apply to the whole site</span><br><span class="line">  exclude: &#x27;&#x27;</span><br><span class="line">filename_case: 0</span><br><span class="line">render_drafts: false</span><br><span class="line">post_asset_folder: false</span><br><span class="line">relative_link: false</span><br><span class="line">future: true</span><br><span class="line">syntax_highlighter: highlight.js</span><br><span class="line">highlight:</span><br><span class="line">  line_number: true</span><br><span class="line">  auto_detect: false</span><br><span class="line">  tab_replace: &#x27;&#x27;</span><br><span class="line">  wrap: true</span><br><span class="line">  hljs: false</span><br><span class="line">prismjs:</span><br><span class="line">  preprocess: true</span><br><span class="line">  line_number: true</span><br><span class="line">  tab_replace: &#x27;&#x27;</span><br><span class="line"></span><br><span class="line"># Home page setting</span><br><span class="line"># path: Root path for your blogs index page. (default = &#x27;&#x27;)</span><br><span class="line"># per_page: Posts displayed per page. (0 = disable pagination)</span><br><span class="line"># order_by: Posts order. (Order by date descending by default)</span><br><span class="line">index_generator:</span><br><span class="line">  path: &#x27;&#x27;</span><br><span class="line">  per_page: 10</span><br><span class="line">  order_by: -date</span><br><span class="line"></span><br><span class="line"># Category &amp; Tag</span><br><span class="line">default_category: uncategorized</span><br><span class="line">category_map:</span><br><span class="line">tag_map:</span><br><span class="line"></span><br><span class="line"># Metadata elements</span><br><span class="line">## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta</span><br><span class="line">meta_generator: true</span><br><span class="line"></span><br><span class="line"># Date / Time format</span><br><span class="line">## Hexo uses Moment.js to parse and display date</span><br><span class="line">## You can customize the date format as defined in</span><br><span class="line">## http://momentjs.com/docs/#/displaying/format/</span><br><span class="line">date_format: YYYY-MM-DD</span><br><span class="line">time_format: HH:mm:ss</span><br><span class="line">## updated_option supports &#x27;mtime&#x27;, &#x27;date&#x27;, &#x27;empty&#x27;</span><br><span class="line">updated_option: &#x27;mtime&#x27;</span><br><span class="line"></span><br><span class="line"># Pagination</span><br><span class="line">## Set per_page to 0 to disable pagination</span><br><span class="line">per_page: 10</span><br><span class="line">pagination_dir: page</span><br><span class="line"></span><br><span class="line"># Include / Exclude file(s)</span><br><span class="line">## include:/exclude: options only apply to the &#x27;source/&#x27; folder</span><br><span class="line">include:</span><br><span class="line">exclude:</span><br><span class="line">ignore:</span><br><span class="line"></span><br><span class="line"># Extensions</span><br><span class="line">## Plugins: https://hexo.io/plugins/</span><br><span class="line">## Themes: https://hexo.io/themes/</span><br><span class="line">theme: volantis</span><br><span class="line"></span><br><span class="line"># Deployment</span><br><span class="line">## Docs: https://hexo.io/docs/one-command-deployment</span><br><span class="line">deploy:</span><br><span class="line">  type: git</span><br><span class="line">  repository: https://github.com/yourrepo.github.io.git</span><br><span class="line">  branch: main</span><br><span class="line"></span><br><span class="line"># offline config passed to sw-precache.</span><br><span class="line">service_worker:</span><br><span class="line">  maximumFileSizeToCacheInBytes: 5242880</span><br><span class="line">  staticFileGlobs:</span><br><span class="line">  - public/**/*.&#123;js,html,css,png,jpg,gif,svg,eot,ttf,woff,woff2&#125;</span><br><span class="line">  stripPrefix: public</span><br><span class="line">  verbose: true</span><br><span class="line"></span><br><span class="line"># # ...existing code...</span><br><span class="line"># #自定义生成静态文件脚本</span><br><span class="line"># scripts:</span><br><span class="line">#   - scripts/generate-extra-file.js</span><br><span class="line"># # ...existing code...</span><br></pre></td></tr></table></figure>              </div>            </details><details yellow><summary> 我的npm结构如下（点击展开） </summary>              <div class='content'>              <p>终端运行<code>npm list</code>，得到包结构图，有缺失的请自行下载。</p><figure class="highlight plaintext"><figcaption><span>npm list</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">hexo-site@0.0.0 D:\wenjian\stepsave\blog\myblog</span><br><span class="line">├── @jiangtj/hexo-extend-theme@0.2.4</span><br><span class="line">├── hexo-deployer-git@4.0.0</span><br><span class="line">├── hexo-generator-archive@2.0.0</span><br><span class="line">├── hexo-generator-category@2.0.0</span><br><span class="line">├── hexo-generator-index@4.0.0</span><br><span class="line">├── hexo-generator-json-content@4.2.3</span><br><span class="line">├── hexo-generator-tag@2.0.0</span><br><span class="line">├── hexo-helper-qrcode@1.0.2</span><br><span class="line">├── hexo-offline-popup@1.0.3</span><br><span class="line">├── hexo-renderer-ejs@2.0.0</span><br><span class="line">├── hexo-renderer-marked@7.0.0</span><br><span class="line">├── hexo-renderer-stylus@3.0.1</span><br><span class="line">├── hexo-server@3.0.0</span><br><span class="line">├── hexo-theme-landscape@1.1.0</span><br><span class="line">├── hexo-theme-volantis@5.8.0</span><br><span class="line">├── hexo-wordcount@6.0.1</span><br><span class="line">└── hexo@7.3.0</span><br></pre></td></tr></table></figure>              </div>            </details><h3 id="2-6-关于魔改"><a href="#2-6-关于魔改" class="headerlink" title="2.6 关于魔改"></a>2.6 关于魔改</h3><ul><li>强烈推荐<code>DearXuan</code>老师的魔改教程，讲的很仔细全面。</li></ul><div class="tag link"><a class="link-card" title="Volantis魔改教程" href="https://blog.dearxuan.com/2023/01/07/Volantis魔改教程/"><div class="left"><img src="https://unpkg.com/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://unpkg.com/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">Volantis魔改教程</p><p class="url">https://blog.dearxuan.com/2023/01/07/Volantis魔改教程/</p></div></a></div><details yellow><summary> 我的魔改 </summary>              <div class='content'>              <figure class="highlight plaintext"><figcaption><span>blog\source\_volantis\headBegin.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;script src=&quot;https://unpkg.com/jquery@3.6.0/dist/jquery.min.js&quot;&gt;&lt;/script&gt;</span><br><span class="line">&lt;script defer src=&quot;/custom.js&quot;&gt;&lt;/script&gt;</span><br><span class="line">&lt;!-- &lt;link rel=&quot;stylesheet&quot; href=&quot;https://example.com/custom.css&quot;&gt; --&gt;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>blog\source\_volantis\style.styl</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">// 添加透明度</span><br><span class="line">#l_main .post,</span><br><span class="line">#l_side .widget</span><br><span class="line">  opacity: 0.8</span><br><span class="line"></span><br><span class="line">// 文章不透明,否则会影响阅读</span><br><span class="line">#post.post,</span><br><span class="line">#docs.post</span><br><span class="line">  opacity: 1</span><br><span class="line"></span><br><span class="line">//背景亮度</span><br><span class="line">.parallax-mirror</span><br><span class="line">  filter: brightness(0.5)</span><br><span class="line"></span><br><span class="line">/* 此处调节字体大小</span><br><span class="line">.top .title font&#123;</span><br><span class="line">    font-size: 7em;</span><br><span class="line">&#125;</span><br><span class="line">*/</span><br><span class="line">.cover-wrapper .cover-body .title &#123;</span><br><span class="line">    font-size: 7em;</span><br><span class="line">&#125;</span><br><span class="line">.top .title span&#123;</span><br><span class="line">    transition: 0.5s;</span><br><span class="line">&#125;</span><br><span class="line">.top .title:hover span:nth-child(1)&#123;</span><br><span class="line">    margin-right: 10px;</span><br><span class="line">&#125;</span><br><span class="line">.top .title:hover span:nth-child(2)&#123;</span><br><span class="line">    margin-left: 10px;</span><br><span class="line">&#125;</span><br><span class="line">.top .title:hover span&#123;</span><br><span class="line">    color: #fff;</span><br><span class="line">    text-shadow: 0 0 10px #fff,</span><br><span class="line">                 0 0 20px #fff,</span><br><span class="line">                 0 0 40px #fff,</span><br><span class="line">                 0 0 80px #fff,</span><br><span class="line">                 0 0 120px #fff,</span><br><span class="line">                 0 0 160px #fff;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>blog\custom.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line">var binft = function (r) &#123;</span><br><span class="line">    var isTransparent = true;</span><br><span class="line">    function getRandomColor() &#123;</span><br><span class="line">        if(isTransparent)&#123;</span><br><span class="line">            isTransparent = false;</span><br><span class="line">            //此处修改字体颜色,最后的 0 和 1 不要改</span><br><span class="line">            return &quot;rgba(255,255,255,0)&quot;</span><br><span class="line">        &#125;else&#123;</span><br><span class="line">            isTransparent = true;</span><br><span class="line">            return &quot;rgba(255,255,255,1)&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;  </span><br><span class="line">    function n(r) &#123;</span><br><span class="line">        for (var n = document.createDocumentFragment(), i = 0; r &gt; i; i++) &#123;</span><br><span class="line">            var oneword = document.createElement(&quot;span&quot;);</span><br><span class="line">            oneword.textContent = &quot;_&quot;; // 此处是末尾字符,如果想用光标样式可以改为&quot;|&quot;</span><br><span class="line">            oneword.style.color = getRandomColor();</span><br><span class="line">            n.appendChild(oneword);</span><br><span class="line">        &#125;</span><br><span class="line">        return n</span><br><span class="line">    &#125;</span><br><span class="line">    function i() &#123;</span><br><span class="line">        var t = wordList[c.skillI];</span><br><span class="line">        c.step ? c.step-- : (c.step = refreshDelayTime, c.prefixP &lt; l.length ? (c.prefixP &gt;= 0 &amp;&amp; (c.text += l[c.prefixP]), c.prefixP++) : &quot;forward&quot; === c.direction ? c.skillP &lt; t.length ? (c.text += t[c.skillP], c.skillP++) : c.delay ? c.delay-- : (c.direction = &quot;backward&quot;, c.delay = showTotalWordDelayTime) : c.skillP &gt; 0 ? (c.text = c.text.slice(0, -1), c.skillP--) : (c.skillI = (c.skillI + 1) % wordList.length, c.direction = &quot;forward&quot;)), r.textContent = c.text, r.appendChild(n(c.prefixP &lt; l.length ? Math.min(maxLength, maxLength + c.prefixP) : Math.min(maxLength, t.length - c.skillP))), setTimeout(i, d)</span><br><span class="line">    &#125;</span><br><span class="line">    var l = &quot;&quot;,</span><br><span class="line">    //此处改成你自己的诗词</span><br><span class="line">    wordList = [ </span><br><span class="line">            //例：</span><br><span class="line">            &quot;最是人间留不住，朱颜辞镜花辞树.   ——王国维《蝶恋花》&quot;,</span><br><span class="line">            &quot;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&quot;</span><br><span class="line">        ].map(function (r) &#123;</span><br><span class="line">    return r + &quot;&quot;</span><br><span class="line">    &#125;),</span><br><span class="line">    showTotalWordDelayTime = 2,</span><br><span class="line">    refreshDelayTime = 1,</span><br><span class="line">    maxLength = 1,</span><br><span class="line">    d = 75,</span><br><span class="line">    c = &#123;</span><br><span class="line">        text: &quot;&quot;,</span><br><span class="line">        prefixP: -maxLength,</span><br><span class="line">        skillI: 0,</span><br><span class="line">        skillP: 0,</span><br><span class="line">        direction: &quot;forward&quot;,</span><br><span class="line">        delay: showTotalWordDelayTime,</span><br><span class="line">        step: refreshDelayTime</span><br><span class="line">    &#125;;</span><br><span class="line">    i()</span><br><span class="line">&#125;;</span><br><span class="line">binft(document.getElementById(&#x27;binft&#x27;));</span><br><span class="line"></span><br><span class="line">// 添加打开背景图片的函数</span><br><span class="line">function openCurrentBgImage() &#123;</span><br><span class="line">    const bgElement = document.querySelector(&#x27;.parallax-mirror img&#x27;);</span><br><span class="line">    if (bgElement &amp;&amp; bgElement.src) &#123;</span><br><span class="line">        window.open(bgElement.src, &#x27;_blank&#x27;);</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        console.log(&#x27;未找到背景图片&#x27;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="3-CDN配置"><a href="#3-CDN配置" class="headerlink" title="3 CDN配置"></a>3 CDN配置</h2><p>CDN的配置能让国内访问网站更加稳定快速，具体关于CDN请点击<a href="https://blog.csdn.net/m0_55724788/article/details/123898848">这里</a>。</p><h3 id="3-1-注册域名"><a href="#3-1-注册域名" class="headerlink" title="3.1 注册域名"></a>3.1 注册域名</h3><ul><li>我用的是<a href="https://cloud.tencent.com/product/domain">腾讯云</a>，如果使用其他的运营商也类似。</li></ul><p>首先注册一个自己的域名，推荐<code>.cn</code>作为后缀，价格不贵。或者选择<code>六位数字.xyz</code>,貌似是目前最便宜的域名。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='one'><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d0e0c10682d.png' data-fancybox='one' data-caption='.cn后缀'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d0e0c10682d.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d0e0c10682d.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt=".cn后缀"></a><span class='image-caption'>.cn后缀</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d0e10f1ce42.png' data-fancybox='one' data-caption='六位数字.xyz'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d0e10f1ce42.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d0e10f1ce42.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="六位数字.xyz"></a><span class='image-caption'>六位数字.xyz</span></div></div><div class="note "><p>按照指引完成域名注册，第一次注册要实名认证</p></div><h3 id="3-2-域名解析到github"><a href="#3-2-域名解析到github" class="headerlink" title="3.2 域名解析到github"></a>3.2 域名解析到github</h3><ul><li>进入 <code>腾讯云</code> &gt; <code>控制台</code> &gt; <code>我的域名</code> &gt; <code>解析</code></li></ul><p><img src="https://bu.dusays.com/2025/03/12/67d0e7e28e59c.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d0e7e28e59c.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="></p><ul><li>添加解析，将子域名解析到你的<code>github pages</code>上</li></ul><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/12/67d0e9420d725.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d0e9420d725.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="操作示例"/></div><span class="image-caption">操作示例</span></div><p>主机记录可以简单理解为子域名，比如你注册的域名是<code>example.com</code>,添加了主机记录为<code>zzz</code>后，可以用<code>zzz.example.com</code>访问你的网站。记录值就是你的域名指向的ip或其他域名，当记录值为其他域名，如<code>yourname.github.io</code>时，请使用<code>CNAME</code>记录类型。</p><ul><li>进入 <code>github</code> &gt; <code>你的仓库</code> &gt; <code>Setting</code> &gt; <code>Pages</code> &gt; <code>Custom domain</code> 改成自己的子域名</li></ul><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='one'><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d0ed16c8bca.png' data-fancybox='one' data-caption='Repository界面'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d0ed16c8bca.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d0ed16c8bca.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Repository界面"></a><span class='image-caption'>Repository界面</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d0ee03ba4b2.png' data-fancybox='one' data-caption='Setting界面'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d0ee03ba4b2.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d0ee03ba4b2.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Setting界面"></a><span class='image-caption'>Setting界面</span></div></div><p>出现 <span class='p green'>DNS check successful</span> 时说明更改成功，其本质就是在仓库根目录创建一个<code>CNAME</code>文件。</p><p>这时使用<code>子域名</code>就可以访问我们的网站了。</p><div class="note warning"><p>注意每次执行 hexo d 都会覆盖CNAME文件导致更改失效！</p></div><h3 id="3-3-CDN的配置"><a href="#3-3-CDN的配置" class="headerlink" title="3.3 CDN的配置"></a>3.3 CDN的配置</h3><p>这里我选择<a href="https://chuqiyun.com/">初七云</a>作为运营商。<psw>便宜，而且部分服务器在国外，不用备案。</psw></p><div class="tag link"><a class="link-card" title="初七云CDN购买传送门" href="https://volantis.js.org/contributors/"><div class="left"><img src="https://gcore.jsdelivr.net/gh/xaoxuu/cdn-assets@master/logo/256/safari.png" class="lazyload" data-srcset="https://gcore.jsdelivr.net/gh/xaoxuu/cdn-assets@master/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">初七云CDN购买传送门</p><p class="url">https://volantis.js.org/contributors/</p></div></a></div><p>推荐购买<del>不用备案</del>的<code>亚太加速</code>。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/12/67d11375e47af.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d11375e47af.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="购买页面"/></div><span class="image-caption">购买页面</span></div><p>购买成功后，进入<code>控制台</code> &gt; <code>产品与服务</code> &gt; <code>SCDN安全内容分发</code> &gt; <code>操作</code> &gt; <code>登录面板</code> ，进入初星盾。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='one'><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d118e19354f.png' data-fancybox='one' data-caption='控制台'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d118e19354f.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d118e19354f.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="控制台"></a><span class='image-caption'>控制台</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d1190c38365.png' data-fancybox='one' data-caption='登录面板'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d1190c38365.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d1190c38365.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="登录面板"></a><span class='image-caption'>登录面板</span></div></div><div class="note info"><p>要是显示待开通，请联系客服帮你开通。</p></div><p>进入初星盾后，点击<code>CDN加速</code> &gt; <code>我的网站</code> &gt; <code>添加网站</code>，按下图操作。加速域名可以选择<code>blog.你的域名</code>,即新的子域名;源站地址填写<code>zzz.你的域名</code>,即<code>3.2</code>中创建的子域名;回源主机名选择<code>跟随源站</code>。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/12/67d194001aaf8.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d194001aaf8.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="image"/></div></div><p>点击保存后，你会得到一串CDN提供的<code>CNAME</code>值，你可以理解为CDN的域名。随后打开腾讯云控制台，进入域名解析页，添加主机记录为<code>blog</code>的解析，记录类型<code>CNAME</code>,值为CDN提供的那串域名。随后返回初星盾，直到网站状态显示<span class='p green'>成功</span>。（这里我差不多等了15分钟）</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='one'><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d196eede46d.png' data-fancybox='one' data-caption='腾讯云'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d196eede46d.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d196eede46d.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="腾讯云"></a><span class='image-caption'>腾讯云</span></div><br><div class='fancybox'><a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://bu.dusays.com/2025/03/12/67d1974b6ad75.png' data-fancybox='one' data-caption='初星盾'><img fancybox itemprop="contentUrl" src="https://bu.dusays.com/2025/03/12/67d1974b6ad75.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d1974b6ad75.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="初星盾"></a><span class='image-caption'>初星盾</span></div></div><p>最后进入初星盾，点击网站列表右侧的<strong>管理</strong>，进入<code>HTTPS</code>界面，选择<code>免费申请证书</code>。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/03/12/67d1986308cba.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d1986308cba.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="证书申请入口"/></div><span class="image-caption">证书申请入口</span></div><p>根据提升完成证书申请，最后你的网站就可以在<code>blog.你的域名</code>上打开啦！</p><p>放一张<a href="https://www.itdog.cn/ping/">ITDOG</a>上的测试图：</p><p><img src="https://bu.dusays.com/2025/03/12/67d19a388a21b.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/03/12/67d19a388a21b.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="></p><span class='p center large'>至此所有基础配置完成</span><h2 id="4-杂项配置"><a href="#4-杂项配置" class="headerlink" title="4 杂项配置"></a>4 杂项配置</h2><h3 id="4-1-解决hexo-clean导致配置丢失"><a href="#4-1-解决hexo-clean导致配置丢失" class="headerlink" title="4.1 解决hexo clean导致配置丢失"></a>4.1 解决hexo clean导致配置丢失</h3><p><code>hexo</code>框架需要每次数据更新时执行<code>hexo g</code>重新覆盖<code>blog\public</code>文件夹。多次的执行会让生成的静态网页发生不知名的错误，这时候就要用<code>hexo clean</code>命令先删除public文件夹，再执行<code>hexo g</code>重新部署。</p><p><code>hexo clean</code>命令会彻底删除文件夹中的一切信息，而<code>hexo d</code>会把整个public文件夹中的东西覆盖推送到<code>github</code>。这时候，魔改配置文件<code>custom.js</code>和部署CDN的<code>CNAME</code>文件都会被覆盖导致丢失。</p><ul><li>解决方案：把这两个文件都放在<code>blog/source</code>文件夹下</li></ul><p><code>source</code>文件夹下的文件会被<code>hexo g</code>自动生成到<code>public</code>文件夹下。</p><h3 id="4-2-更好的CDN配置-初七云限定"><a href="#4-2-更好的CDN配置-初七云限定" class="headerlink" title="4.2 更好的CDN配置(初七云限定)"></a>4.2 更好的CDN配置(初七云限定)</h3><p>对境内和境外流量分开解析，取消工具域名<code>zzz.xinghenluyus.cn</code>,境外流量直达github page，境内流量导入加速CDN，CDN回源直接填写<code>blog.xinghenluyus.cn</code>即可。<br>因为初七云CDN服务器在海外，但是国内流量使用代理不能正常访问，会极大不方便。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://bu.dusays.com/2025/08/18/68a2cc216cc81.png" class="lazyload" data-srcset="https://bu.dusays.com/2025/08/18/68a2cc216cc81.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="分线路解析"/></div><span class="image-caption">分线路解析</span></div><span class='p center h1 blue'>更多问题欢迎在评论区探讨！</span>]]>
    </content>
    <id>https://blog.xinghenluyus.cn/2025/03/10/2025-3-10/</id>
    <link href="https://blog.xinghenluyus.cn/2025/03/10/2025-3-10/"/>
    <published>2025-03-09T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>这是我的第一篇博客，也是本站的部署记录。</p>
<h2 id="1-前言"><a href="#1-前言" class="headerlink" title="1 前言"></a>1 前言</h2><p>相信每一个想部署个人博客的小伙伴们都想快速上手个人博客。在众多框架中]]>
    </summary>
    <title>从零搭建个人博客（基于Hexo，使用Volantis主题，部署在github并上传cdn）</title>
    <updated>2025-08-18T06:49:38.171Z</updated>
  </entry>
</feed>
