{
    "version": "https://jsonfeed.org/version/1",
    "title": "biulight Site Blog",
    "home_page_url": "https://your-docusaurus-test-site.com/timeline/blog",
    "description": "biulight Site Blog",
    "items": [
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2025/04/14/ubuntu-initialize",
            "content_html": "<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>\n<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>\n<p>安装</p>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2025/04/14/ubuntu-initialize",
            "title": "快速配置你的 ubuntu 服务器",
            "summary": "常见的软件",
            "date_modified": "2025-04-14T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "Linux",
                "Ubuntu"
            ]
        },
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker",
            "content_html": "<p>威联通 Docker 国内无法拉取镜像？</p>\n<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>\n<p>由于众所周知的原因，国内拉取 docker 镜像愈发可困难，网上现有的教程涉及 NAS 的极少，为了能愉快的使用 NAS，我进行了大量尝试，终于找到了可用的方法，顺手记录下，分享给各位苦苦挣扎的道友。</p>\n<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>\n<p>现有环境下，想成功拉取镜像，无非使用魔法或者换国内镜像。</p>\n<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>\n<ol>\n<li class=\"\">开启威联通 ssh 服务,并通过 ssh 连接到 QNAP</li>\n</ol>\n<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>\n<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>\n<ol start=\"2\">\n<li class=\"\">增加 docker 的代理配置</li>\n</ol>\n<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>\n<p>增加代理配置</p>\n<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>\n<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>\n<ol start=\"3\">\n<li class=\"\">重启 docker 服务</li>\n</ol>\n<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>\n<ol start=\"4\">\n<li class=\"\">查看配置是否成功</li>\n</ol>\n<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>\n<p>如下图：\n<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>\n<p>完成上述设置后，你就可以愉快的拉取镜像了</p>\n<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>\n<blockquote>\n<p>参考<strong>使用代理</strong>，增加镜像源配置</p>\n</blockquote>\n<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>\n<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>\n<p>增加镜像源配置</p>\n<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>\n<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>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2025/02/07/qnap-docker",
            "title": "拯救你的Docker",
            "summary": "威联通 Docker 国内无法拉取镜像？",
            "date_modified": "2025-02-07T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "Linux",
                "Docker",
                "QNAP"
            ]
        },
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github",
            "content_html": "<p>怎样通过 Github 自动交付前端编译产物？</p>\n<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>\n<p>一台阿里云 <code>ubuntu</code> 服务器</p>\n<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>\n<p><strong>以 <code>deploy</code> 用户组下的 <code>deploy001-timeline</code> 用户,部署目录 <code>/path/to/folder</code>，部署工具 <code>easingthemes/ssh-deploy@v2.2.11</code> 为例</strong></p>\n<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>\n<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> 用户，用于部署\n若已存在 <code>deploy</code> 用户组，跳过<strong>步骤 1</strong>，直接新建指定项目部署用户</p></div></div>\n<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>\n<ol>\n<li class=\"\">创建用户组</li>\n</ol>\n<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>\n<ol start=\"2\">\n<li class=\"\">创建用户</li>\n</ol>\n<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>\n<ol start=\"3\">\n<li class=\"\">指定部署目录的归属</li>\n</ol>\n<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>\n<ol start=\"4\">\n<li class=\"\">更新目录权限</li>\n</ol>\n<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>\n<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>\n<p><strong>以 <code>easingthemes/ssh-deploy@v2.2.11</code> 为例</strong></p>\n<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>\n<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>\n<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>\n<ol>\n<li class=\"\">登录新创建的用户</li>\n</ol>\n<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>\n<ol start=\"2\">\n<li class=\"\">生成非对称密钥</li>\n</ol>\n<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>\n<ol start=\"3\">\n<li class=\"\">把公钥粘贴到 <code>authorized_keys</code> 文件中</li>\n</ol>\n<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>\n<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>\n<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>\n<li class=\"\"><code>:wq</code> 保存并退出</li>\n<li class=\"\"><code>i</code> 进入输入视图</li>\n</ol></div></div>\n<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>\n<p>配置 <code>secrets</code> ，在 workflow 中使用</p>\n<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>配置位置如下图所示\n<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>\n<ol>\n<li class=\"\">新增 <code>ALY_USER</code>，如下</li>\n</ol>\n<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>\n<ol start=\"2\">\n<li class=\"\">新增 <code>ALY_HOST</code>，如下</li>\n</ol>\n<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>\n<ol start=\"3\">\n<li class=\"\">新增 <code>ALY_SSH_TOKEN</code>，如下</li>\n</ol>\n<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>\n<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>\n<li class=\"\"><strong>ALY_USER:</strong> 服务器配置的部署用户名</li>\n<li class=\"\"><strong>ALY_HOST:</strong> 服务器域名</li>\n<li class=\"\"><strong>ALY_SSH_TOKEN:</strong> 通过<code>ssh-keygen</code> 生成的私钥</li>\n</ul></div></div>\n<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>\n<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>\n<p><strong>example:</strong></p>\n<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>\n<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>\n<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>\n<p>以访问 <code>http://blog.biulight.cn/timeline</code> 能显示 <code>/var/www/timeline</code> 目录内容为例</p>\n<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>\n<li class=\"\">通常，Nginx 的虚拟主机配置位于<code>/etc/nginx/sites-available/</code>目录下。如果已经有针对<code>timeline</code>的配置文件，可以直接编辑它；否则，创建一个新的配置文件。</li>\n<li class=\"\">启用配置文件，需要在 <code>/etc/nginx/sites-enabled/</code>目录下有对应配置文件的映射。</li>\n</ol></div></div>\n<ol start=\"3\">\n<li class=\"\">新增配置文件</li>\n</ol>\n<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>\n<ol start=\"2\">\n<li class=\"\">启用配置文件</li>\n</ol>\n<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>\n<ol start=\"3\">\n<li class=\"\">测试配置文件</li>\n</ol>\n<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>\n<ol start=\"4\">\n<li class=\"\">重新加载 Nginx 服务</li>\n</ol>\n<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>\n<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>\n<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>\n<p>使用<strong>certbot</strong>自动生成证书</p>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2025/02/05/deploy-by-github",
            "title": "使用Github自动交付前端制品",
            "summary": "怎样通过 Github 自动交付前端编译产物？",
            "date_modified": "2025-02-05T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "Linux",
                "Ubuntu",
                "Deploy",
                "GitHub",
                "CI/CD"
            ]
        },
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2025/02/04/ubuntu-install-neovim",
            "content_html": "<p>Ubuntu 怎样安装指定版本的 Neovim?</p>\n<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>\n<p>由于 apt 中只有 Neovim(v0.72)的安装包。想使用新版需要自己安装</p>\n<blockquote>\n<p>以 <code>v0.9.5</code> 版本为例</p>\n</blockquote>\n<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>\n<ol>\n<li class=\"\">去 <a href=\"https://github.com/neovim/neovim/releases\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Github</a> 上查看指定版本的压缩包,并下载</li>\n</ol>\n<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>\n<ol start=\"2\">\n<li class=\"\">解压缩 <code>nvim-linux64</code> 至 <code>/opt</code> 目录</li>\n</ol>\n<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>\n<ol start=\"3\">\n<li class=\"\">add this to your shell config (~/.bashrc, ~/.zshrc, ...):</li>\n</ol>\n<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>\n<ol start=\"4\">\n<li class=\"\">reload shell config</li>\n</ol>\n<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>\n<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>\n<p>使用 <code>snap</code> 包管理工具安装</p>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2025/02/04/ubuntu-install-neovim",
            "title": "Install Neovim",
            "summary": "Ubuntu 怎样安装指定版本的 Neovim?",
            "date_modified": "2025-02-04T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "Linux",
                "Ubuntu",
                "Neovim"
            ]
        },
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title",
            "content_html": "<p>埋点监控 SDK <code>ENTER</code> 事件怎样获取到页面标题？</p>\n<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>\n<p>使用 <code>window.onload</code>、<code>hashchange</code> 事件获取 <code>document.title</code> 时，某些场景出现异常，值为空</p>\n<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>\n<p>单页面应用，<code>document.title</code> 存在异步设置的场景（如页面是后管配置的，需要等接口返回页面标题）</p>\n<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>\n<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>\n<p><code>window.onload</code> 事件可以正常获取到页面标题</p>\n<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>\n<blockquote>\n<p>借助 <code>MutationObserver</code> 观察 <code>title</code> 元素更新</p>\n</blockquote>\n<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>\n<p>完美实现如下：</p>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2024/08/10/document.title",
            "title": "Watch document.title",
            "summary": "埋点监控 SDK ENTER 事件怎样获取到页面标题？",
            "date_modified": "2024-08-10T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "Web",
                "Supervisory control"
            ]
        },
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2022/10/29/docker",
            "content_html": "<p>如何安装docker？</p>\n<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>\n<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>\n<blockquote>\n<p>Snap 是一种全新的软件包管理方式，它类似一个容器拥有一个应用程序所有的文件和库，各个应用程序之间完全独立。</p>\n</blockquote>\n<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>\n<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>\n<ol>\n<li class=\"\">Got permission denied while trying to connect to the Docker daemon socket</li>\n</ol>\n<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>\n<ol start=\"2\">\n<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>\n</ol>\n<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>\n<ol start=\"3\">\n<li class=\"\">Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock</li>\n</ol>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2022/10/29/docker",
            "title": "Install Docker",
            "summary": "如何安装docker？",
            "date_modified": "2022-10-29T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "docker",
                "ubuntu",
                "linux"
            ]
        },
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github",
            "content_html": "<p>在同一台电脑上，如何配置多个SSH Key？</p>\n<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>\n<p>通常，我们只会生成一个SSH Key（id_rsa）,然后提交到多个不同的网站(如：github, gitee, 服务器);\n但是也存在另外一种需要，我们在同一个网站上，注册了多个用户。<strong>通常网站不允许为多个用户名配置同一个SSH Key</strong>，此时就给用户造成些许麻烦。</p>\n<p>如下图，就是github网站，往多个账号添加同一个SSH Key报错提示。\n<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>\n<p>重点来了，怎样配置多个SSH Key呢？下面就以我自身为例，给出解决方案。</p>\n<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>\n<p>我当前已配置了一个SSH Key，已关联了多个网站，怕麻烦的我，并不想修改它，我继续把它当做默认的SSH Key。\n此时我只需要增加一个新的SSH Key,关联到新的github账户</p>\n<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>\n<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>\n<ul>\n<li class=\"\">\n<p>准备一个新的github账号(biulight)</p>\n</li>\n<li class=\"\">\n<p>bash/zsh环境</p>\n</li>\n</ul>\n<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>\n<p><strong>以Mac/Linux为例</strong></p>\n<ol>\n<li class=\"\">打开终端，生成新的SSH Key</li>\n</ol>\n<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>\n<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>\n<li class=\"\">上述命令会在当前目录下生成两个文件biulight, biulight.pub , 因此一般会选择在 <code>~/.ssh</code> 目录下</li>\n<li class=\"\">后缀<code>.pub</code>的文件为公钥文件，没有后缀的为私钥文件。</li>\n<li class=\"\">可以通过 <code>ssh-keygen --help</code> 查看对应命令信息。</li>\n</ol></div></div>\n<ol start=\"2\">\n<li class=\"\">\n<p>把biulight.pub里面的内容复制到新准备的github账户（biulight）中对应的位置</p>\n</li>\n<li class=\"\">\n<p>再次打开终端，编辑 <code>~/.ssh/config</code> 文件</p>\n</li>\n</ol>\n<p>在该文件中新增以下内容</p>\n<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>\n<p>关键在于Host与HostName的区别：</p>\n<ul>\n<li class=\"\">HostName: 填写真实的服务地址（如：访问github，填写github.com）</li>\n<li class=\"\">Host: 填写别名，后续会用上（如：通过ssh拉取github代码）</li>\n</ul>\n<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>\n<li class=\"\">UserName 登录的用户名(如：git, root)</li>\n<li class=\"\">Port 服务器open-ssh端口（默认：22，默认时，一般不写此行）</li>\n</ul></div></div>\n<ol start=\"4\">\n<li class=\"\">拉取代码</li>\n</ol>\n<p>通常我们在Web页面上复制的SSH URL，可以直接使用，例如：</p>\n<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>\n<p><strong>但是</strong>，由于现在使用的biulight的秘钥，因此需要修改原有的URL</p>\n<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>\n<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>\n<p>此时，就可以通过git ssh玩转多个github账户了</p>\n<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>\n<p>如果想要进一步区分每个账户提交，可以为仓库设置局部的用户名和邮箱</p>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2022/08/20/ssh-two-github",
            "title": "SSH登录多个github账户",
            "summary": "在同一台电脑上，如何配置多个SSH Key？",
            "date_modified": "2022-08-20T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "git",
                "ssh",
                "github"
            ]
        },
        {
            "id": "https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu",
            "content_html": "<p>在微信小程序中，如何实现原生页面与webview内嵌的h5页面双向通信？</p>\n<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>\n<p>微信小程序提供的 <code>message</code>只能在特定的场景触发</p>\n<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>\n<ul>\n<li class=\"\">h5 跳转小程序 native 页面</li>\n<li class=\"\">小程序 native 页面返回 webview 页面</li>\n</ul>\n<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>\n<p>常见的h5跳转h5方式</p>\n<ol>\n<li class=\"\">直接用 <code>location.href</code> 跳转</li>\n<li class=\"\">通过路由hash跳转，触发 <code>hashchange</code> ,页面不刷新， js 层面重新渲染</li>\n<li class=\"\">跳转页面打开一个新的 <code>webview</code> ，相当于每个页面都是一个独立的 <code>webview</code></li>\n</ol>\n<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>\n<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>\n<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>\n<ul>\n<li class=\"\">小程序通过 <code>hash</code>传参给 <code>webview</code> 页面</li>\n<li class=\"\">h5通过 <code>hashchange</code> 捕获最新的参数，进行自定义逻辑处理</li>\n<li class=\"\">h5通过 <code>window.history.go(-1)</code> 去掉传参的路由栈</li>\n</ul>\n<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>\n<p><strong>需要h5和小程序同步改造</strong></p>\n<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>\n<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>\n<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>",
            "url": "https://your-docusaurus-test-site.com/timeline/blog/2022/08/16/commu",
            "title": "小程序与h5通信实现方案",
            "summary": "在微信小程序中，如何实现原生页面与webview内嵌的h5页面双向通信？",
            "date_modified": "2022-08-16T00:00:00.000Z",
            "author": {
                "name": "feilx",
                "url": "https://github.com/biulight"
            },
            "tags": [
                "Weixin Mini Program"
            ]
        }
    ]
}