<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://your-docusaurus-test-site.com/timeline/blog</id>
    <title>biulight Site Blog</title>
    <updated>2025-04-14T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://your-docusaurus-test-site.com/timeline/blog"/>
    <subtitle>biulight Site Blog</subtitle>
    <icon>https://your-docusaurus-test-site.com/timeline/img/favicon.ico</icon>
    <rights>Copyright © 2025 Biulight</rights>
    <entry>
        <title type="html"><![CDATA[快速配置你的 ubuntu 服务器]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2025/04/14/ubuntu-initialize</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2025/04/14/ubuntu-initialize"/>
        <updated>2025-04-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[常见的软件]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见的软件">常见的软件<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/04/14/ubuntu-initialize#%E5%B8%B8%E8%A7%81%E7%9A%84%E8%BD%AF%E4%BB%B6" class="hash-link" aria-label="Direct link to 常见的软件" title="Direct link to 常见的软件" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="atuin">Atuin<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/04/14/ubuntu-initialize#atuin" class="hash-link" aria-label="Direct link to Atuin" title="Direct link to Atuin" translate="no">​</a></h4>
<p>安装</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="Linux" term="Linux"/>
        <category label="Ubuntu" term="Ubuntu"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[拯救你的Docker]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker"/>
        <updated>2025-02-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[威联通 Docker 国内无法拉取镜像？]]></summary>
        <content type="html"><![CDATA[<p>威联通 Docker 国内无法拉取镜像？</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="背景">背景<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to 背景" title="Direct link to 背景" translate="no">​</a></h2>
<p>由于众所周知的原因，国内拉取 docker 镜像愈发可困难，网上现有的教程涉及 NAS 的极少，为了能愉快的使用 NAS，我进行了大量尝试，终于找到了可用的方法，顺手记录下，分享给各位苦苦挣扎的道友。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见的方案">常见的方案<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker#%E5%B8%B8%E8%A7%81%E7%9A%84%E6%96%B9%E6%A1%88" class="hash-link" aria-label="Direct link to 常见的方案" title="Direct link to 常见的方案" translate="no">​</a></h2>
<p>现有环境下，想成功拉取镜像，无非使用魔法或者换国内镜像。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用代理">使用代理<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker#%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86" class="hash-link" aria-label="Direct link to 使用代理" title="Direct link to 使用代理" translate="no">​</a></h3>
<ol>
<li class="">开启威联通 ssh 服务,并通过 ssh 连接到 QNAP</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 远程登录</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ssh -p 22 username@192.168.0.155</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>SSH 服务的默认端口是 22，上述命令是 用户通过 SSH 工具用账号（username）连接到服务器（192.168.0.155）的 22 端口</p></div></div>
<ol start="2">
<li class="">增加 docker 的代理配置</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 编辑配置文件</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo vim /share/CACHEDEV1_DATA/.qpkg/container-station/etc/docker.json</span><br></span></code></pre></div></div>
<p>增加代理配置</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/share/CACHEDEV1_DATA/.qpkg/container-station/etc/docker.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 新增配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"proxies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"http-proxy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://代理地址:端口"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"https-proxy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://代理地址:端口"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"no-proxy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*.test.example.com,.example.org,127.0.0.0/8"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>ssh 登录后，可以通过 <code>which docker</code>、<code>whereis docker</code> 查看 docker 所在位置</p></div></div>
<ol start="3">
<li class="">重启 docker 服务</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo /etc/init.d/container-station.sh restart</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">查看配置是否成功</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker info</span><br></span></code></pre></div></div>
<p>如下图：
<img decoding="async" loading="lazy" alt="代理设置成功" src="https://your-docusaurus-test-site.com/timeline/assets/images/docker-info-dd1c7cccfc8c2e18e2e04eb3ccf43644.jpg" width="1334" height="620" class="img_ev3q"></p>
<p>完成上述设置后，你就可以愉快的拉取镜像了</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="更换国内镜像源">更换国内镜像源<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker#%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90" class="hash-link" aria-label="Direct link to 更换国内镜像源" title="Direct link to 更换国内镜像源" translate="no">​</a></h3>
<blockquote>
<p>参考<strong>使用代理</strong>，增加镜像源配置</p>
</blockquote>
<p>步骤 1、2 参考<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker#%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86" class="">使用代理</a></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 编辑配置文件</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo vim /share/CACHEDEV1_DATA/.qpkg/container-station/etc/docker.json</span><br></span></code></pre></div></div>
<p>增加镜像源配置</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/share/CACHEDEV1_DATA/.qpkg/container-station/etc/docker.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 新增配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"registry-mirrors"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"https://mirror.ccs.tencentyun.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"https://docker.mirrors.ustc.edu.cn"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>腾讯云镜像加速器地址：<a href="https://mirror.ccs.tencentyun.com/" target="_blank" rel="noopener noreferrer" class="">https://mirror.ccs.tencentyun.com</a></p><p>中国科学技术大学：<a href="https://docker.mirrors.ustc.edu.cn/" target="_blank" rel="noopener noreferrer" class="">https://docker.mirrors.ustc.edu.cn</a></p><p>Docker 官方镜像（中国区）镜像加速：<a href="https://registry.docker-cn.com/" target="_blank" rel="noopener noreferrer" class="">https://registry.docker-cn.com</a></p><p>网易云镜像加速器地址：<a href="http://hub-mirror.c.163.com/" target="_blank" rel="noopener noreferrer" class="">http://hub-mirror.c.163.com</a></p><p>南京大学镜像加速器地址：<a href="https://docker.nju.edu.cn/" target="_blank" rel="noopener noreferrer" class="">https://docker.nju.edu.cn</a></p></div></div>
<p>剩余步骤参考<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker#%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86" class="">使用代理</a></p>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="Linux" term="Linux"/>
        <category label="Docker" term="Docker"/>
        <category label="QNAP" term="QNAP"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[使用Github自动交付前端制品]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github"/>
        <updated>2025-02-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[怎样通过 Github 自动交付前端编译产物？]]></summary>
        <content type="html"><![CDATA[<p>怎样通过 Github 自动交付前端编译产物？</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="准备">准备<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E5%87%86%E5%A4%87" class="hash-link" aria-label="Direct link to 准备" title="Direct link to 准备" translate="no">​</a></h2>
<p>一台阿里云 <code>ubuntu</code> 服务器</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实施">实施<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E5%AE%9E%E6%96%BD" class="hash-link" aria-label="Direct link to 实施" title="Direct link to 实施" translate="no">​</a></h2>
<p><strong>以 <code>deploy</code> 用户组下的 <code>deploy001-timeline</code> 用户,部署目录 <code>/path/to/folder</code>，部署工具 <code>easingthemes/ssh-deploy@v2.2.11</code> 为例</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="新建部署用户修改部署目录权限">新建部署用户，修改部署目录权限<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E6%96%B0%E5%BB%BA%E9%83%A8%E7%BD%B2%E7%94%A8%E6%88%B7%E4%BF%AE%E6%94%B9%E9%83%A8%E7%BD%B2%E7%9B%AE%E5%BD%95%E6%9D%83%E9%99%90" class="hash-link" aria-label="Direct link to 新建部署用户，修改部署目录权限" title="Direct link to 新建部署用户，修改部署目录权限" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>遵循权限最小化原则，创建 <code>deploy001-timeline</code> 用户，用于部署
若已存在 <code>deploy</code> 用户组，跳过<strong>步骤 1</strong>，直接新建指定项目部署用户</p></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 检查指定xxx用户组是否存在</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cat /etc/group | grep xxx</span><br></span></code></pre></div></div>
<ol>
<li class="">创建用户组</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo addgroup deploy</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">创建用户</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo adduser --ingroup deploy deploy001-timeline</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">指定部署目录的归属</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo chown deploy001-timeline:deploy /path/to/folder</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">更新目录权限</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo chmod 755 /path/to/folder</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="配置部署工具">配置部署工具<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E9%85%8D%E7%BD%AE%E9%83%A8%E7%BD%B2%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="Direct link to 配置部署工具" title="Direct link to 配置部署工具" translate="no">​</a></h3>
<p><strong>以 <code>easingthemes/ssh-deploy@v2.2.11</code> 为例</strong></p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p><a href="https://github.com/easingthemes/ssh-deploy" target="_blank" rel="noopener noreferrer" class="">easingthemes/ssh-deploy</a>使用手册</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="服务器侧">服务器侧<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BE%A7" class="hash-link" aria-label="Direct link to 服务器侧" title="Direct link to 服务器侧" translate="no">​</a></h4>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>使用 <code>ssh</code> 登录服务器，需要使用一组秘钥对，其中公钥设置到服务器 <code>~/.ssh/authorized_keys</code> 文件中，私钥设置在客户端</p></div></div>
<ol>
<li class="">登录新创建的用户</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">su deploy001-timeline</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">生成非对称密钥</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ssh-keygen -m PEM -t rsa -b 4096 -f deploy001-timeline -C "deploy001-timeline"</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">把公钥粘贴到 <code>authorized_keys</code> 文件中</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 查看公钥，复制输出到终端的结果</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cat deploy001-timeline.pub</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 编辑 authorized_keys 文件，并把复制的结果粘贴到此文件</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vim ~/.ssh/authorized_keys</span><br></span></code></pre></div></div>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/.ssh/authorized_keys</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDcGxPtreCc5bBbaN7jIRuVuTQkC0Mp6VxnyC5sQKG1IZwSL5agL3Zdbu3YVzx0rSU33XZZj5lWp0AAz4ABQGhAU6iIgDNjRmhyuLG4VOS3Gas21Si1lK4Dm/D0lBA//zFmDBTwa9sAEl39rJQCQYL3n2prMrlC2k8m93RGLFmgxWDcb2D+LGgi43bgR4TXvJD6dZa7xfIldsQL5SQpCzEMX8uDDlnnsus99AqmmMzUenW6I25G2ApwgUY/Toj/scCGeHRb7PmGK0AwjqBr9siiIRNi0DpX4JbYPqLPn0IciC70RNLs2tOEFV1BwP50gmF5eDD4tI7NOLaI4HvkesYy9xF6qBtNJOfALgu7Dt+s5g5izXg2pfb/RKJw2WEj56hLI2NIOr1CgZRJH6Yq2xlP1SKlo3GwkzT/NhnhiO1NFy/FKFj/sYmn4/SM92QM2OmruPDAU6JUHUT9P7m/bhlAxo5xrzMqH8v9c4acxUGz5s87j8eNcNfaIuzMQOG+jzEOqqdWI4uLeTPHrm4pSuZUuse7IenTN3Wx1MD4CfjyZZZIWR6Xv+f7MJ0CpbvpZ7E4MjenLfb8g/upl2L1kv3Lz/UUbL4n38DCY113wkJY5x6T54ckqHUmhirsL2SCHb71VAtxUhEByCTBdPEN18Hh+QOKKTp4rmJYjNrvm4E5yw== deploy001-timeline</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>vim 是 linux 常用的终端编辑器，常见命令如下</p><ol>
<li class=""><code>:wq</code> 保存并退出</li>
<li class=""><code>i</code> 进入输入视图</li>
</ol></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-配置">Github 配置<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#github-%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to Github 配置" title="Direct link to Github 配置" translate="no">​</a></h4>
<p>配置 <code>secrets</code> ，在 workflow 中使用</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>配置位置如下图所示
<img decoding="async" loading="lazy" alt="配置位置参考图" src="https://your-docusaurus-test-site.com/timeline/assets/images/deploy-051e4ae18f9c956904b921a85089bfc1.jpg" width="2774" height="1630" class="img_ev3q"></p></div></div>
<ol>
<li class="">新增 <code>ALY_USER</code>，如下</li>
</ol>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">deploy001-timeline</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">新增 <code>ALY_HOST</code>，如下</li>
</ol>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">192.168.0.155</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">新增 <code>ALY_SSH_TOKEN</code>，如下</li>
</ol>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">-----BEGIN RSA PRIVATE KEY-----</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MIIJKQIBAAKCAgEA3BsT7a3gnOWwW2je4yEblbk0JAtDKelcZ8gubEChtSGcEi+W</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">oC92XW7t2Fc8dK0lN912WY+ZVqdAAM+AAUBoQFOoiIAzY0ZocrixuFTktxmrNtUo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tZSuA5vw9JQQP/8xZgwU8GvbABJd/ayUAkGC959qazK5QtpPJvd0RixZoMVg3G9g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/ixoIuN24EeE17yQ+nWWu8XyJXbEC+UkKQsxDF/Lgw5Z57LrPfQKppjM1Hp1uiNu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RtgKcIFGP06I/7HAhnh0W+z5hitAMI6ga/bIoiETYtA6V+CW2D6iz59CHIgu9ETS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">7NrThBVdQcD+dIJheXgw+LSOzTi2iOB75HrGMvcReqgbTSTnwC4Luw7frOYOYs14</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NqX2/0SicNlhI+eoSyNjSDq9QoGUSR+mKtsZT9UipaNxsJM0/zYZ4YjtTRcvxShY</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/7GJp+P0jPdkDNjpq7jwwFOiVB1E/T+5v24ZQMaOca8zKh/L/XOGnMVBs+bPO4/H</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">jXDX2iLszEDhvo8xDqqnViOLi3kzx65uKUrmVLrHuyHp0zd1sdTA+An48mWWSFke</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">l7/n+zCdAqW76WexODI3py32/IP7qZdi9ZL9y8/1FGy+J9/AwmNdd8JCWOcek+eH</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">JKh1JoYq7C9kgh2+9VQLcVIRAcgkwXTxDdfB4fkDiik6eK5iWIza75uBOcsCAwEA</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AQKCAgA3hxdEd4C6ZFHVBcRxLXmNkK8gRr0XdjlrLzvS8I07KnL6vYm0+LRWRvV3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Bi8IymOgz9ybJJiNHV2Otsp2xl5mmBRk916/dVRFWOXw+G3I6Y9hom4GPS+XVoB3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">22CsHH/EXFjt/G+/+WI/7IlcdlWJjeylhaLqRDQCwxvQ1kB4SEMy6WBhTyeoYZUs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">aK6RVI+IuCCiV4JKxEcaLyErv5iMpCAt/HFe/CrPsuD6/YJzOj+4CVc5RSiBEIP9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1ZzHUPsekYXdaQ/cMs4bUegTxKsCB/EhlSGa6Nx1Snv9gBKIKy0ZT8GcomoJIPCp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dXxcPUZFBDbqj3aVPHEEYAmxbu3QFuJDN216BMD5rHgMXfWrGZ/UvTx0+5HmVTiN</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qhPWUNdkMWUVNqVPNCbHpSpK0ip0vknxqs/xf17GHLKhHh4RJ/gbEnhQOU0E6qIG</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Wke0aM6mHnhuYFbHc6Ux1Ow2S0RZ1pC6kTJC4vpnGGZekdv033MTLNly/8uK6j7x</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">eTQRxEi3cl8aMLRKFYkn2F8sE4ZIq6x7Q2knCaHgELObJmfRDoPD2kDZ+kd2AT9I</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">wUXokHtfEOmVQ3N8MA8rneC3DFWfs4eG6w2SzsAYYjEc06g/lzF6jjrLc2RVQNZi</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EI3e591Kjsu56yvGoGj6PQNpv612oeQdbZQem99BAz128xzijQKCAQEA9SuAAyTA</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2JVCieUYybtjpJ9BNxHchXfqkB9CHOwYCbocjgkfSFzUX5NNkpIqUpaahQYE6+B4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">zFopyPkzUObdUWGTKmMbnlvkE3d/mgeliDCHMGN/BgmtvnIPfHM72zQHeXwJIEp/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p+u7EEr0JdiKHORyAQ3CP2TWA7aKstPSj0lNF9ov68TlWeYmzHZ35W1eAHmuhkA4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FyhjggUaqf9RD4dO5mJJgbkEn4qIdZjG1KHunOMuFUuotG0BxN1W9ozOFrYqkIYo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kh8E5zLUFP2sLA9K2imVDyOBlbMRjCaTx/QWOJpmPdRuhUQPeuQuaD5yZ/DoC4Nj</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">i/00WdwT09OJFwKCAQEA5dQj6cz5oAUA761STeesmjIQx2UeIobPCsIsDjIaqqUn</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CdT3pKHxstS9tcE77e6vctTGu70IMMJcqVcP7M1p4WyhuqWW4QvmDeXWpfSZCoTm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3CPMQe1JgBCxk2Ysv8vCXTxh+pPYRevLJo2LdpxdQhBXVdgq2QdkroAcKNI5kUwy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">B8HAl/AaIwAInYt0cRJtdxxm1VU6bwfAAtvDdHnf6ozSAsj/qzSKZufR0zGXdHj+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">d6kuhL3h6XDC8vaDMkhIq4/2vc8Q+Q+uIt89ulXZnm/ecZAaz2I3pRdiYGpK3rJI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2hSWMa8CwbAO/s0rMi3cOdVtzyB4NQA6YzBfXAHdbQKCAQEAiqd3Vk/K4LJJV0NB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qZVY3RlUAJkRZkpTVf7XnRPI5Hdk/s8Z6grV8NeV33baiKqz6NdmoR/qMWgsiYSm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CPMH56aPXEGAtSay7m9+stXwP/1x92PNytRedn57U564E1hxgbssTh7T41vmB2jc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">eyrjsUNhVkc5vDCC+Mab2lcBlheWig7TWzuXmigXeTrmw9H+f7ZRhYt8LVyiKj5I</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">viuu5GFZteGQQNUqUDBAzIECse6CzCePQGvxlViwz21+aSFozF9p4yJ8f2cblsWg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">O97bKG/dnVQ3AMDL4KXNHr4Shdr9VjW77OvfNW8wcgfqVvo6KZ6NHTXJbrpciRV2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AS55MQKCAQAgn8+FRcJ9k5hBbZIMWwGmVcsJ8vGnJwnG1i9YyIX+iTkUbTXGGfLs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">VsSjQ03VhZdELq4TQk8iVMTAiQpKrBIGnNwMWaskQQMkH+crYaBD3P/EahR5m0xe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sH/0k4FwrGTnxUWHQ2tk6YbJ7zfH24Rld1peZjQW4LTLDIZyyPzBAlbrwPYs2zlq</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lHukmYIq9tmxGcgDKnkD/86i2T1SkGZXriu1l4CrdebbmravSw/byb0dkVd4Ilgq</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">QgZ6ZMHU5mviZqo44WbgY/htHNFvXPZqRikGZ9VWcPPDLKGbXBtKp3Yt9tQnM1ep</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1OscAlXKZrYnQ4O17j8CDwk6wUgYEG+1AoIBAQCqCU6FMEahhDBJgTGds4zS5DLp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MFrfHtmo4YwPwk/Q/rt0/Ipdp0WRwcHNtYBHluYB22PaCwQd+k+3KqBDwqSPtLhz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2qsOgdDiRVsBL/UoCOERMc+YittrgOISYMqKvgi4FL5taK0+Lsy3i9JsMU6wPxy0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mMorxklqVarCYYr/ydCpp8Ty48NzYQHyUPIS/b2jdIqBIUMf2OCmw5vvDn4QYmiA</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Kt5ed/7+WQ+2GT9/0FuHrFMkHFRSKTG9ac1B3NyfLBKJ7ZbedMx0MTlmwmwgW79f</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Kj6Wklu6G8M0umKPTs1wPOy/xCtafMeMRf8tVoyfUyhxofkEpkbp1eUFAEhI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-----END RSA PRIVATE KEY-----</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><ul>
<li class=""><strong>ALY_USER:</strong> 服务器配置的部署用户名</li>
<li class=""><strong>ALY_HOST:</strong> 服务器域名</li>
<li class=""><strong>ALY_SSH_TOKEN:</strong> 通过<code>ssh-keygen</code> 生成的私钥</li>
</ul></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="项目-workflow-配置">项目 workflow 配置<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E9%A1%B9%E7%9B%AE-workflow-%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to 项目 workflow 配置" title="Direct link to 项目 workflow 配置" translate="no">​</a></h4>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>配置文件配置在项目中，通常写在 <code>.github/workflows</code> 目录下</p></div></div>
<p><strong>example:</strong></p>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">.github/workflows/deploy.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 触发脚本的条件，develop分支push代码的时候</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 要执行的任务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 任务名称</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># runs-on 指定job任务运行所需要的虚拟机环境（必填）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># runs-on: self-hosted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 任务步骤</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 获取源码</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pull code</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 使用action库  actions/checkout获取源码</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 安装node</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> create build environments</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 使用action库 actions/setup-node 安装node</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">node@v3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">node-version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 18.20.4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 安装依赖</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> install</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> npm install</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 打包</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> npm run build</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Upload static files as artifact</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deployment</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/upload</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pages</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">artifact@v3 </span><span class="token comment" style="color:#999988;font-style:italic"># or specific "vX.X.X" version tag for this action</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> build/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 上传打包文件到远程服务器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ssh deploy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> easingthemes/ssh</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deploy@v2.2.11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">REMOTE_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">secrets.ALY_USER</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">REMOTE_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">secrets.ALY_HOST</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">REMOTE_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"22"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ARGS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-rltgoDzvO --delete"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">SSH_PRIVATE_KEY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">secrets.ALY_SSH_TOKEN</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># 要上传文件所在目录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">SOURCE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"build/*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># 远程服务器目标路径</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">TARGET</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/var/www/timeline"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="补充">补充<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E8%A1%A5%E5%85%85" class="hash-link" aria-label="Direct link to 补充" title="Direct link to 补充" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nginx-配置">NGINX 配置<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#nginx-%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to NGINX 配置" title="Direct link to NGINX 配置" translate="no">​</a></h3>
<p>以访问 <code>http://blog.biulight.cn/timeline</code> 能显示 <code>/var/www/timeline</code> 目录内容为例</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><ol>
<li class="">通常，Nginx 的虚拟主机配置位于<code>/etc/nginx/sites-available/</code>目录下。如果已经有针对<code>timeline</code>的配置文件，可以直接编辑它；否则，创建一个新的配置文件。</li>
<li class="">启用配置文件，需要在 <code>/etc/nginx/sites-enabled/</code>目录下有对应配置文件的映射。</li>
</ol></div></div>
<ol start="3">
<li class="">新增配置文件</li>
</ol>
<div class="language-nginx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">/etc/nginx/sites-available/timeline</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-nginx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">server {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    listen 80;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    server_name blog.biulight.cn;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    # 映射/timeline到指定目录</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    location /timeline {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        alias /var/www/timeline;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        index index.html index.htm;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">启用配置文件</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 建立软连接，启用新增的配置文件</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ln -s /etc/nginx/sites-available/timeline /etc/nginx/sites-enabled/timeline</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">测试配置文件</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 修改完配置后，运行以下命令检查语法是否正确</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo nginx -t</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">重新加载 Nginx 服务</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 如果测试通过，重新加载Nginx以应用更改：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl reload nginx</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用-lets-encrypt-证书">使用 <code>Let's Encrypt</code> 证书<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github#%E4%BD%BF%E7%94%A8-lets-encrypt-%E8%AF%81%E4%B9%A6" class="hash-link" aria-label="Direct link to 使用-lets-encrypt-证书" title="Direct link to 使用-lets-encrypt-证书" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>ubuntu 安装查看<a href="https://certbot.eff.org/instructions?ws=nginx&amp;os=snap" target="_blank" rel="noopener noreferrer" class="">certbot</a>官方文档</p></div></div>
<p>使用<strong>certbot</strong>自动生成证书</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo certbot --nginx</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="Linux" term="Linux"/>
        <category label="Ubuntu" term="Ubuntu"/>
        <category label="Deploy" term="Deploy"/>
        <category label="GitHub" term="GitHub"/>
        <category label="CI/CD" term="CI/CD"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Install Neovim]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2025/02/04/ubuntu-install-neovim</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/04/ubuntu-install-neovim"/>
        <updated>2025-02-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Ubuntu 怎样安装指定版本的 Neovim?]]></summary>
        <content type="html"><![CDATA[<p>Ubuntu 怎样安装指定版本的 Neovim?</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="背景">背景<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/04/ubuntu-install-neovim#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to 背景" title="Direct link to 背景" translate="no">​</a></h2>
<p>由于 apt 中只有 Neovim(v0.72)的安装包。想使用新版需要自己安装</p>
<blockquote>
<p>以 <code>v0.9.5</code> 版本为例</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="方案一">方案一<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/04/ubuntu-install-neovim#%E6%96%B9%E6%A1%88%E4%B8%80" class="hash-link" aria-label="Direct link to 方案一" title="Direct link to 方案一" translate="no">​</a></h2>
<ol>
<li class="">去 <a href="https://github.com/neovim/neovim/releases" target="_blank" rel="noopener noreferrer" class="">Github</a> 上查看指定版本的压缩包,并下载</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo wget https://github.com/neovim/neovim/releases/download/v0.9.5/nvim-linux64.tar.gz</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">解压缩 <code>nvim-linux64</code> 至 <code>/opt</code> 目录</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo tar -C /opt -xzf nvim-linux64.tar.gz</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">add this to your shell config (~/.bashrc, ~/.zshrc, ...):</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export PATH="$PATH:/opt/nvim-linux64/bin"</span><br></span></code></pre></div></div>
<ol start="4">
<li class="">reload shell config</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">source ~/.bashrc</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="方案二">方案二<a href="https://your-docusaurus-test-site.com/timeline/blog/2025/02/04/ubuntu-install-neovim#%E6%96%B9%E6%A1%88%E4%BA%8C" class="hash-link" aria-label="Direct link to 方案二" title="Direct link to 方案二" translate="no">​</a></h2>
<p>使用 <code>snap</code> 包管理工具安装</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo snap install nvim --classisc</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="Linux" term="Linux"/>
        <category label="Ubuntu" term="Ubuntu"/>
        <category label="Neovim" term="Neovim"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Watch document.title]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title"/>
        <updated>2024-08-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[埋点监控 SDK ENTER 事件怎样获取到页面标题？]]></summary>
        <content type="html"><![CDATA[<p>埋点监控 SDK <code>ENTER</code> 事件怎样获取到页面标题？</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="背景">背景<a href="https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to 背景" title="Direct link to 背景" translate="no">​</a></h2>
<p>使用 <code>window.onload</code>、<code>hashchange</code> 事件获取 <code>document.title</code> 时，某些场景出现异常，值为空</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="分析">分析<a href="https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title#%E5%88%86%E6%9E%90" class="hash-link" aria-label="Direct link to 分析" title="Direct link to 分析" translate="no">​</a></h2>
<p>单页面应用，<code>document.title</code> 存在异步设置的场景（如页面是后管配置的，需要等接口返回页面标题）</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="方案">方案<a href="https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title#%E6%96%B9%E6%A1%88" class="hash-link" aria-label="Direct link to 方案" title="Direct link to 方案" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="场景一多页面应用title-写在-html-文件里">场景一：多页面应用，<code>title</code> 写在 html 文件里；<a href="https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title#%E5%9C%BA%E6%99%AF%E4%B8%80%E5%A4%9A%E9%A1%B5%E9%9D%A2%E5%BA%94%E7%94%A8title-%E5%86%99%E5%9C%A8-html-%E6%96%87%E4%BB%B6%E9%87%8C" class="hash-link" aria-label="Direct link to 场景一多页面应用title-写在-html-文件里" title="Direct link to 场景一多页面应用title-写在-html-文件里" translate="no">​</a></h3>
<p><code>window.onload</code> 事件可以正常获取到页面标题</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="场景二单页面应用title-在页面初始化后设置">场景二：单页面应用，<code>title</code> 在页面初始化后设置；<a href="https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title#%E5%9C%BA%E6%99%AF%E4%BA%8C%E5%8D%95%E9%A1%B5%E9%9D%A2%E5%BA%94%E7%94%A8title-%E5%9C%A8%E9%A1%B5%E9%9D%A2%E5%88%9D%E5%A7%8B%E5%8C%96%E5%90%8E%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="Direct link to 场景二单页面应用title-在页面初始化后设置" title="Direct link to 场景二单页面应用title-在页面初始化后设置" translate="no">​</a></h3>
<blockquote>
<p>借助 <code>MutationObserver</code> 观察 <code>title</code> 元素更新</p>
</blockquote>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">watchForTitleChanges</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">callback</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> type</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> ele </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getElementsByTagName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"title"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">ele</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ele </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createElement</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"title"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">head</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">appendChild</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ele</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> previousTitle </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">title</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> observer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">MutationObserver</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">mutationList</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> observer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">title</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">previousTitle </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> title</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      previousTitle </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> title</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      callback</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">type </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"once"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> observer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">disconnect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  observer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">observe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ele</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">childList</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 非仅监听一次更新时，返回取消监听函数</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">type </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"once"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> observer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">disconnect</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>完美实现如下：</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 页面初次加载时，在 load 事件中注册 watch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"load"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">watchForTitleChanges</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">title</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"title发生了变化"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> title</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"once"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 路由切换时，在 hashchange 事件中注册 watch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hashchange"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">watchForTitleChanges</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">title</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"title发生了变化"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> title</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"once"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="Web" term="Web"/>
        <category label="Supervisory control" term="Supervisory control"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Install Docker]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2022/10/29/docker</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2022/10/29/docker"/>
        <updated>2022-10-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[如何安装docker？]]></summary>
        <content type="html"><![CDATA[<p>如何安装docker？</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ubuntu">Ubuntu<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/10/29/docker#ubuntu" class="hash-link" aria-label="Direct link to Ubuntu" title="Direct link to Ubuntu" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="snap-安装">Snap 安装<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/10/29/docker#snap-%E5%AE%89%E8%A3%85" class="hash-link" aria-label="Direct link to Snap 安装" title="Direct link to Snap 安装" translate="no">​</a></h3>
<blockquote>
<p>Snap 是一种全新的软件包管理方式，它类似一个容器拥有一个应用程序所有的文件和库，各个应用程序之间完全独立。</p>
</blockquote>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">snap install docker</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">snap start docker --enable # 启动 docker，并添加随机启动</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">snap services docker # 确认服务状态</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">service snap.docker.dockerd status # 确认服务详情</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">snap refresh docker # 更新 Snap 安装的 docker 服务</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见的问题">常见的问题<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/10/29/docker#%E5%B8%B8%E8%A7%81%E7%9A%84%E9%97%AE%E9%A2%98" class="hash-link" aria-label="Direct link to 常见的问题" title="Direct link to 常见的问题" translate="no">​</a></h2>
<ol>
<li class="">Got permission denied while trying to connect to the Docker daemon socket</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo chmod 666 /var/run/dokcer.sock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<ol start="2">
<li class="">Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/dokcer.sock<!-- -->:Get<!-- --> http://%2Fvar%2Fdocker.sock/v1.40/containers/json<!-- -->:dial<!-- --> unix /var/run/docker.sock:connect<!-- -->:permission<!-- --> denied</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo usermod -aG docker ${USER}</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo chmod 666 /var/run/docker.sock</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="docker" term="docker"/>
        <category label="ubuntu" term="ubuntu"/>
        <category label="linux" term="linux"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SSH登录多个github账户]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github"/>
        <updated>2022-08-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在同一台电脑上，如何配置多个SSH Key？]]></summary>
        <content type="html"><![CDATA[<p>在同一台电脑上，如何配置多个SSH Key？</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="背景">背景<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to 背景" title="Direct link to 背景" translate="no">​</a></h2>
<p>通常，我们只会生成一个SSH Key（id_rsa）,然后提交到多个不同的网站(如：github, gitee, 服务器);
但是也存在另外一种需要，我们在同一个网站上，注册了多个用户。<strong>通常网站不允许为多个用户名配置同一个SSH Key</strong>，此时就给用户造成些许麻烦。</p>
<p>如下图，就是github网站，往多个账号添加同一个SSH Key报错提示。
<img decoding="async" loading="lazy" alt="github alt already use" src="data:image/jpeg;base64,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" width="510" height="116" class="img_ev3q"></p>
<p>重点来了，怎样配置多个SSH Key呢？下面就以我自身为例，给出解决方案。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="解决方案">解决方案<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" class="hash-link" aria-label="Direct link to 解决方案" title="Direct link to 解决方案" translate="no">​</a></h2>
<p>我当前已配置了一个SSH Key，已关联了多个网站，怕麻烦的我，并不想修改它，我继续把它当做默认的SSH Key。
此时我只需要增加一个新的SSH Key,关联到新的github账户</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>多个github账户的配置方案跟下述的方案没有太大的差异，所以只要学会加法，就很容易了。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="准备工作">准备工作<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="Direct link to 准备工作" title="Direct link to 准备工作" translate="no">​</a></h3>
<ul>
<li class="">
<p>准备一个新的github账号(biulight)</p>
</li>
<li class="">
<p>bash/zsh环境</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="配置">配置<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github#%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to 配置" title="Direct link to 配置" translate="no">​</a></h3>
<p><strong>以Mac/Linux为例</strong></p>
<ol>
<li class="">打开终端，生成新的SSH Key</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cd ~/.ssh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ssh-keygen -m PEM -t rsa -b 4096 -f biulight -C "biulight007@gmail.com"</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><ol>
<li class="">上述命令会在当前目录下生成两个文件biulight, biulight.pub , 因此一般会选择在 <code>~/.ssh</code> 目录下</li>
<li class="">后缀<code>.pub</code>的文件为公钥文件，没有后缀的为私钥文件。</li>
<li class="">可以通过 <code>ssh-keygen --help</code> 查看对应命令信息。</li>
</ol></div></div>
<ol start="2">
<li class="">
<p>把biulight.pub里面的内容复制到新准备的github账户（biulight）中对应的位置</p>
</li>
<li class="">
<p>再次打开终端，编辑 <code>~/.ssh/config</code> 文件</p>
</li>
</ol>
<p>在该文件中新增以下内容</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># biulight登录信息</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Host biulight # 别名（可以随便起）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HostName github.com # 访问的真实地址</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PreferredAuthentications publickey # 配置登录用什么权限验证</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">IdentityFile ~/.ssh/biulight  # 私钥文件(证书所在的位置)</span><br></span></code></pre></div></div>
<p>关键在于Host与HostName的区别：</p>
<ul>
<li class="">HostName: 填写真实的服务地址（如：访问github，填写github.com）</li>
<li class="">Host: 填写别名，后续会用上（如：通过ssh拉取github代码）</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p><code>~/.ssh/config</code>文件其他配置信息:</p><ul>
<li class="">UserName 登录的用户名(如：git, root)</li>
<li class="">Port 服务器open-ssh端口（默认：22，默认时，一般不写此行）</li>
</ul></div></div>
<ol start="4">
<li class="">拉取代码</li>
</ol>
<p>通常我们在Web页面上复制的SSH URL，可以直接使用，例如：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git clone git@github.com:biulight/blog.git</span><br></span></code></pre></div></div>
<p><strong>但是</strong>，由于现在使用的biulight的秘钥，因此需要修改原有的URL</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 用上面配置的HostName替换链接中的 `github.com`</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git clone git@biulight:biulight/blog.git</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Direct link to 总结" title="Direct link to 总结" translate="no">​</a></h3>
<p>此时，就可以通过git ssh玩转多个github账户了</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="其他">其他<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github#%E5%85%B6%E4%BB%96" class="hash-link" aria-label="Direct link to 其他" title="Direct link to 其他" translate="no">​</a></h2>
<p>如果想要进一步区分每个账户提交，可以为仓库设置局部的用户名和邮箱</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 取消全局 用户名/邮箱 配置</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git config --global --unset user.name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git config --global --unset user.email</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 单独为每个repo设置 用户名/邮箱</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git config user.name "xxx01"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git config user.email "xxx01@gmail.com"</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="git" term="git"/>
        <category label="ssh" term="ssh"/>
        <category label="github" term="github"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[小程序与h5通信实现方案]]></title>
        <id>https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu</id>
        <link href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu"/>
        <updated>2022-08-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在微信小程序中，如何实现原生页面与webview内嵌的h5页面双向通信？]]></summary>
        <content type="html"><![CDATA[<p>在微信小程序中，如何实现原生页面与webview内嵌的h5页面双向通信？</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="背景">背景<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to 背景" title="Direct link to 背景" translate="no">​</a></h2>
<p>微信小程序提供的 <code>message</code>只能在特定的场景触发</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="内嵌h5在小程序中的交互跳转场景">内嵌h5在小程序中的交互（跳转）场景<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E5%86%85%E5%B5%8Ch5%E5%9C%A8%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%B8%AD%E7%9A%84%E4%BA%A4%E4%BA%92%E8%B7%B3%E8%BD%AC%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="Direct link to 内嵌h5在小程序中的交互（跳转）场景" title="Direct link to 内嵌h5在小程序中的交互（跳转）场景" translate="no">​</a></h2>
<ul>
<li class="">h5 跳转小程序 native 页面</li>
<li class="">小程序 native 页面返回 webview 页面</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="内嵌h5跳转h5的方式">内嵌h5跳转h5的方式<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E5%86%85%E5%B5%8Ch5%E8%B7%B3%E8%BD%ACh5%E7%9A%84%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="Direct link to 内嵌h5跳转h5的方式" title="Direct link to 内嵌h5跳转h5的方式" translate="no">​</a></h2>
<p>常见的h5跳转h5方式</p>
<ol>
<li class="">直接用 <code>location.href</code> 跳转</li>
<li class="">通过路由hash跳转，触发 <code>hashchange</code> ,页面不刷新， js 层面重新渲染</li>
<li class="">跳转页面打开一个新的 <code>webview</code> ，相当于每个页面都是一个独立的 <code>webview</code></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="跨页面通信的实现">跨页面通信的实现<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E8%B7%A8%E9%A1%B5%E9%9D%A2%E9%80%9A%E4%BF%A1%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="Direct link to 跨页面通信的实现" title="Direct link to 跨页面通信的实现" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="实现的条件">实现的条件<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E5%AE%9E%E7%8E%B0%E7%9A%84%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="Direct link to 实现的条件" title="Direct link to 实现的条件" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>url链接 <code>hash</code> 变化，不会重新加载页面</p></div></div>
<ul>
<li class="">小程序通过 <code>hash</code>传参给 <code>webview</code> 页面</li>
<li class="">h5通过 <code>hashchange</code> 捕获最新的参数，进行自定义逻辑处理</li>
<li class="">h5通过 <code>window.history.go(-1)</code> 去掉传参的路由栈</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方案缺点">方案缺点<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E6%96%B9%E6%A1%88%E7%BC%BA%E7%82%B9" class="hash-link" aria-label="Direct link to 方案缺点" title="Direct link to 方案缺点" translate="no">​</a></h3>
<p><strong>需要h5和小程序同步改造</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="基础版实现">基础版实现<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E5%9F%BA%E7%A1%80%E7%89%88%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="Direct link to 基础版实现" title="Direct link to 基础版实现" translate="no">​</a></h3>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="中级版实现">中级版实现<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E4%B8%AD%E7%BA%A7%E7%89%88%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="Direct link to 中级版实现" title="Direct link to 中级版实现" translate="no">​</a></h3>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="终极版本实现">终极版本实现<a href="https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu#%E7%BB%88%E6%9E%81%E7%89%88%E6%9C%AC%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="Direct link to 终极版本实现" title="Direct link to 终极版本实现" translate="no">​</a></h3>]]></content>
        <author>
            <name>feilx</name>
            <email>biulight007@gmail.com</email>
            <uri>https://github.com/biulight</uri>
        </author>
        <category label="Weixin Mini Program" term="Weixin Mini Program"/>
    </entry>
</feed>