hexo/public/2023/9597b72.html

820 lines
32 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=auto>
<head>
<meta charset="UTF-8">
<link rel="apple-touch-icon" sizes="76x76" href="/img/fluid.png">
<link rel="icon" href="/img/fluid.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<meta name="theme-color" content="#2f4154">
<meta name="author" content="浪子">
<meta name="keywords" content="DIY,黑苹果,分享,自由">
<meta name="description" content="关于GotosocialGoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。 准备 注册 Fly.io 账号,并绑卡(避免滥用); 注册 Cloudflare 并启用 R2启用 R2 需要绑卡。">
<meta property="og:type" content="article">
<meta property="og:title" content="在fly.io部署Gotosocial">
<meta property="og:url" content="https://jkjoy.cn/2023/9597b72.html">
<meta property="og:site_name" content="提剑追梦">
<meta property="og:description" content="关于GotosocialGoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。 准备 注册 Fly.io 账号,并绑卡(避免滥用); 注册 Cloudflare 并启用 R2启用 R2 需要绑卡。">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2023-08-17T10:55:46.000Z">
<meta property="article:modified_time" content="2023-09-26T01:00:10.269Z">
<meta property="article:author" content="浪子">
<meta property="article:tag" content="Gotosocial">
<meta property="article:tag" content="fly.io">
<meta property="article:tag" content="部署">
<meta name="twitter:card" content="summary_large_image">
<title>在fly.io部署Gotosocial - 提剑追梦</title>
<link rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css" />
<link rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css" />
<link rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css" />
<!-- 主题依赖的图标库,不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->
<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_hj8rtnfg7um.css">
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4267870_i7km8ozxnbr.css">
<link rel="stylesheet" href="/css/main.css" />
<link id="highlight-css" rel="stylesheet" href="/css/highlight.css" />
<link id="highlight-css-dark" rel="stylesheet" href="/css/highlight-dark.css" />
<script id="fluid-configs">
var Fluid = window.Fluid || {};
Fluid.ctx = Object.assign({}, Fluid.ctx)
var CONFIG = {"hostname":"jkjoy.cn","root":"/","version":"1.9.5-a","typing":{"enable":true,"typeSpeed":70,"cursorChar":"_","loop":false,"scope":[]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":true,"follow_dnt":true,"baidu":"9a59c9b2baa8e43c367f559cd7d9b86c","google":{"measurement_id":null},"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":"qkYaRmrTvy9Og9bRIt4YTIiC-MdYXbMMI","app_key":"BnyRqKMFP7xp6xF0OTU7rC40","server_url":null,"path":"window.location.pathname","ignore_local":false}},"search_path":"/local-search.xml","include_content_in_search":true};
if (CONFIG.web_analytics.follow_dnt) {
var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
}
</script>
<script src="/js/utils.js" ></script>
<script src="/js/color-schema.js" ></script>
<!-- Baidu Analytics -->
<script async>
if (!Fluid.ctx.dnt) {
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?9a59c9b2baa8e43c367f559cd7d9b86c";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
}
</script>
<!-- Google tag (gtag.js) -->
<script async>
if (!Fluid.ctx.dnt) {
Fluid.utils.createScript("https://www.googletagmanager.com/gtag/js?id=", function() {
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', '');
});
}
</script>
<meta name="generator" content="Hexo 6.3.0"><link rel="alternate" href="/atom.xml" title="提剑追梦" type="application/atom+xml">
</head>
<body>
<header>
<div class="header-inner" style="height: 70vh;">
<nav id="navbar" class="navbar fixed-top navbar-expand-lg navbar-dark scrolling-navbar">
<div class="container">
<a class="navbar-brand" href="/">
<strong>提剑追梦</strong>
</a>
<button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<div class="animated-icon"><span></span><span></span><span></span></div>
</button>
<!-- Collapsible content -->
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto text-center">
<li class="nav-item">
<a class="nav-link" href="/">
<i class="iconfont icon-home"></i>
<span>首页</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/archives/">
<i class="iconfont icon-archive"></i>
<span>归档</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/categories/">
<i class="iconfont icon-categories"></i>
<span>分类</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/tags/">
<i class="iconfont icon-tags"></i>
<span>标签</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/links/">
<i class="iconfont icon-link1"></i>
<span>友链</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/fcircle/">
<i class="iconfont icon-friend"></i>
<span>圈子</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/memos/">
<i class="iconfont icon-Chat"></i>
<span>说说</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/about/">
<i class="iconfont icon-aboutme"></i>
<span>关于</span>
</a>
</li>
<li class="nav-item" id="search-btn">
<a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
<i class="iconfont icon-search"></i>
</a>
</li>
<li class="nav-item" id="color-toggle-btn">
<a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">
<i class="iconfont icon-dark" id="color-toggle-icon"></i>
</a>
</li>
</ul>
</div>
</div>
</nav>
<div id="banner" class="banner" parallax=true
style="background: url('/img/default.png') no-repeat center center; background-size: cover;">
<div class="full-bg-img">
<div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
<div class="banner-text text-center fade-in-up">
<div class="h2">
<span id="subtitle" data-typed-text="在fly.io部署Gotosocial"></span>
</div>
<div class="mt-3">
<span class="post-meta">
<i class="iconfont icon-date-fill" aria-hidden="true"></i>
<time datetime="2023-08-17 18:55" pubdate>
2023年8月17日 晚上
</time>
</span>
</div>
<div class="mt-1">
<span class="post-meta mr-2">
<i class="iconfont icon-chart"></i>
2.2k 字
</span>
<span class="post-meta mr-2">
<i class="iconfont icon-clock-fill"></i>
18 分钟
</span>
<span id="leancloud-page-views-container" class="post-meta" style="display: none">
<i class="iconfont icon-eye" aria-hidden="true"></i>
<span id="leancloud-page-views"></span>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</header>
<main>
<div class="container-fluid nopadding-x">
<div class="row nomargin-x">
<div class="side-col d-none d-lg-block col-lg-2">
</div>
<div class="col-lg-8 nopadding-x-md">
<div class="container nopadding-x-md" id="board-ctn">
<div id="board">
<article class="post-content mx-auto">
<h1 id="seo-header">在fly.io部署Gotosocial</h1>
<p class="note note-info">
本文最后更新于2023年9月26日 上午
</p>
<div class="markdown-body">
<h2 id="关于Gotosocial"><a href="#关于Gotosocial" class="headerlink" title="关于Gotosocial"></a>关于Gotosocial</h2><p>GoToSocial 是一个十分轻量(轻量到甚至没有用户界面,需要使用第三方程序登录、兼容 Mastodon 应用进行使用)的 ActivityPub 联邦社交网络程序,自建 GoToSocial 可以避免您的信息因为所在实例倒闭、不可抗力等原因化为乌有。</p>
<h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><ul>
<li>注册 Fly.io 账号,并绑卡(避免滥用);</li>
<li>注册 Cloudflare 并启用 R2启用 R2 需要绑卡。新建一个储存桶并创建一个 API 令牌。</li>
</ul>
<h2 id="安装-flyctl"><a href="#安装-flyctl" class="headerlink" title="安装 flyctl"></a>安装 flyctl</h2><ul>
<li>Linux</li>
</ul>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">curl -L https:<span class="hljs-regexp">//</span>fly.io/install.sh | sh<br></code></pre></td></tr></table></figure>
<ul>
<li>macOS</li>
</ul>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">curl -L https:<span class="hljs-regexp">//</span>fly.io/install.sh | sh<br></code></pre></td></tr></table></figure>
<ul>
<li>Windows需要开启 RemoteSigned: 管理员运行</li>
</ul>
<figure class="highlight gams"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gams"><span class="hljs-keyword">Set</span>-ExecutionPolicy <span class="hljs-comment">-ExecutionPolicy RemoteSigned</span><br></code></pre></td></tr></table></figure>
<figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cmake">powershell -<span class="hljs-keyword">Command</span> <span class="hljs-string">&quot;iwr https://fly.io/install.ps1 -useb | iex&quot;</span><br></code></pre></td></tr></table></figure>
<h2 id="登录"><a href="#登录" class="headerlink" title="登录"></a>登录</h2><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">flyctl</span> auth login<br><br><span class="hljs-comment"># 若登录失败使用</span><br><span class="hljs-comment"># flyctl auth login -i </span><br><span class="hljs-comment"># 输入账号密码进行登录</span><br></code></pre></td></tr></table></figure>
<h2 id="创建APP"><a href="#创建APP" class="headerlink" title="创建APP"></a>创建APP</h2><p><code>YOURAPPNAME</code>更改为自己希望设置的名称</p>
<figure class="highlight brainfuck"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs brainfuck"><span class="hljs-comment">flyctl launch</span> <span class="hljs-literal">--</span><span class="hljs-comment">name YOURAPPNAME</span> <span class="hljs-literal">--</span><span class="hljs-comment">image=superseriousbusiness/gotosocial:latest</span> <span class="hljs-literal">--</span><span class="hljs-comment">region hkg</span> <span class="hljs-literal">--</span><span class="hljs-comment">no</span><span class="hljs-literal">-</span><span class="hljs-comment">deploy</span><br></code></pre></td></tr></table></figure>
<h2 id="创建储存卷"><a href="#创建储存卷" class="headerlink" title="创建储存卷"></a>创建储存卷</h2><figure class="highlight brainfuck"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs brainfuck"><span class="hljs-comment">flyctl volumes create social_data</span> <span class="hljs-literal">--</span><span class="hljs-comment">region hkg</span> <span class="hljs-literal">--</span><span class="hljs-comment">size 1</span><br></code></pre></td></tr></table></figure>
<h2 id="编辑配置"><a href="#编辑配置" class="headerlink" title="编辑配置"></a>编辑配置</h2><p>编辑根目录下的 <code>fly.toml</code> 配置文件,参考下方</p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">app</span> = <span class="hljs-string">&quot;gotos&quot;</span> <span class="hljs-comment">## 自定义名称</span><br><span class="hljs-attr">primary_region</span> = <span class="hljs-string">&quot;hkg&quot;</span> <span class="hljs-comment">##服务器节点,当前为香港</span><br><br><span class="hljs-section">[experimental]</span><br> <span class="hljs-attr">vm</span> = <span class="hljs-literal">true</span><br><br><span class="hljs-section">[build]</span><br> <span class="hljs-attr">image</span> = <span class="hljs-string">&quot;superseriousbusiness/gotosocial:latest&quot;</span><br><br><span class="hljs-section">[env]</span><br> <span class="hljs-attr">GTS_DB_ADDRESS</span> = <span class="hljs-string">&quot;/gotosocial/storage/sqlite.db&quot;</span><br> <span class="hljs-attr">GTS_DB_TLS_MODE</span> = <span class="hljs-string">&quot;enable&quot;</span><br> <span class="hljs-attr">GTS_DB_TYPE</span> = <span class="hljs-string">&quot;sqlite&quot;</span><br> <span class="hljs-attr">GTS_HOST</span> = <span class="hljs-string">&quot;GTS的域名&quot;</span><br> <span class="hljs-attr">GTS_LETSENCRYPT_ENABLED</span> = <span class="hljs-string">&quot;false&quot;</span><br> <span class="hljs-attr">GTS_STORAGE_BACKEND</span> = <span class="hljs-string">&quot;s3&quot;</span><br> <span class="hljs-attr">GTS_STORAGE_S3_BUCKET</span> = <span class="hljs-string">&quot;BUCKET名称&quot;</span><br> <span class="hljs-attr">GTS_STORAGE_S3_ENDPOINT</span> = <span class="hljs-string">&quot;#S3 API&quot;</span><br> <span class="hljs-attr">GTS_STORAGE_S3_ACCESS_KEY</span> = <span class="hljs-string">&quot;#api-tokens&quot;</span><br> <span class="hljs-attr">GTS_STORAGE_S3_SECRET_KEY</span> = <span class="hljs-string">&quot;#api-tokens&quot;</span><br> <span class="hljs-attr">GTS_STORAGE_S3_PROXY</span> = <span class="hljs-string">&quot;true&quot;</span><br> <span class="hljs-comment"># 添加时区为UTC+8</span><br> <span class="hljs-attr">TZ</span> = <span class="hljs-string">&quot;Asia/Chongqing&quot;</span><br><br><span class="hljs-section">[[mounts]]</span><br> <span class="hljs-attr">source</span> = <span class="hljs-string">&quot;social_data&quot;</span><br> <span class="hljs-attr">destination</span> = <span class="hljs-string">&quot;/gotosocial/storage&quot;</span><br><br><span class="hljs-section">[http_service]</span><br> <span class="hljs-attr">internal_port</span> = <span class="hljs-number">8080</span><br> <span class="hljs-attr">force_https</span> = <span class="hljs-literal">true</span><br> <span class="hljs-attr">auto_stop_machines</span> = <span class="hljs-literal">false</span><br> <span class="hljs-attr">auto_start_machines</span> = <span class="hljs-literal">true</span><br> <span class="hljs-attr">min_machines_running</span> = <span class="hljs-number">1</span><br> <span class="hljs-attr">processes</span> = [<span class="hljs-string">&quot;app&quot;</span>]<br></code></pre></td></tr></table></figure>
<p>以上配置中<code>GTS_STORAGE_S3_ENDPOINT</code>不需要带<code>https:</code>和最后的<code>/BUCKET名称</code></p>
<h2 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h2><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">flyctl deploy</span><br></code></pre></td></tr></table></figure>
<p>启动成功后会显示一个URL,能成功访问则代表部署成功。</p>
<h2 id="创建用户和管理员"><a href="#创建用户和管理员" class="headerlink" title="创建用户和管理员"></a>创建用户和管理员</h2><p><code>fly.toml </code>文件目录执行</p>
<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arcade">flyctl ssh <span class="hljs-built_in">console</span><br></code></pre></td></tr></table></figure>
<ul>
<li>创建用户</li>
</ul>
<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stylus">/gotosocial/gotosocial admin account create <span class="hljs-attr">--username</span> YOUR_USERNAME <span class="hljs-attr">--email</span> YOUR@EMAIL<span class="hljs-selector-class">.COM</span> <span class="hljs-attr">--password</span> <span class="hljs-string">&#x27;SOME_VERY_GOOD_PASSWD&#x27;</span><br></code></pre></td></tr></table></figure>
<p><code>YOUR_USERNAME</code>为用户名<br><code>YOUR@EMAIL.COM</code>为邮箱<br><code>SOME_VERY_GOOD_PASSWD</code>为密码,需设置足够复杂,太简单会提示密码不够安全,需重新设置</p>
<ul>
<li>设置管理员</li>
</ul>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk"><span class="hljs-regexp">/gotosocial/g</span>otosocial admin account promote --username YOUR_USERNAME<br></code></pre></td></tr></table></figure>
<h2 id="演示"><a href="#演示" class="headerlink" title="演示"></a>演示</h2><p><a target="_blank" rel="noopener" href="https://m.ima.cm/">https://m.ima.cm</a></p>
<p><a target="_blank" rel="noopener" href="https://m.ima.cm/@jkjoy">https://m.ima.cm/@jkjoy</a></p>
<h2 id="下载数据库"><a href="#下载数据库" class="headerlink" title="下载数据库"></a>下载数据库</h2><p><code>fly.toml </code>文件目录执行</p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">flyctl sftp get <span class="hljs-regexp">/gotosocial/</span>storage/sqlite.db<br></code></pre></td></tr></table></figure>
</div>
<hr/>
<div>
<div class="post-metas my-3">
<div class="post-meta mr-3 d-flex align-items-center">
<i class="iconfont icon-category"></i>
<span class="category-chains">
<span class="category-chain">
<a href="/categories/%E5%88%86%E4%BA%AB/" class="category-chain-item">分享</a>
</span>
</span>
</div>
<div class="post-meta">
<i class="iconfont icon-tags"></i>
<a href="/tags/Gotosocial/" class="print-no-link">#Gotosocial</a>
<a href="/tags/fly-io/" class="print-no-link">#fly.io</a>
<a href="/tags/%E9%83%A8%E7%BD%B2/" class="print-no-link">#部署</a>
</div>
</div>
<div class="post-prevnext my-3">
<article class="post-prev col-6">
<a href="/2023/8084c141.html" title="如何在Fly.io部署typecho">
<i class="iconfont icon-arrowleft"></i>
<span class="hidden-mobile">如何在Fly.io部署typecho</span>
<span class="visible-mobile">上一篇</span>
</a>
</article>
<article class="post-next col-6">
<a href="/2023/c80a64e9.html" title="在fly.io部署artalk评论系统">
<span class="hidden-mobile">在fly.io部署artalk评论系统</span>
<span class="visible-mobile">下一篇</span>
<i class="iconfont icon-arrowright"></i>
</a>
</article>
</div>
</div>
<article id="comments" lazyload>
<div id="twikoo"></div>
<script type="text/javascript">
Fluid.utils.loadComments('#comments', function() {
Fluid.utils.createScript('https://lib.baomitu.com/twikoo/1.6.21/twikoo.all.min.js', function() {
var options = Object.assign(
{"envId":"https://twikoo.ima.cm","region":null,"path":"window.location.pathname"},
{
el: '#twikoo',
path: 'window.location.pathname',
onCommentLoaded: function() {
Fluid.utils.listenDOMLoaded(function() {
var imgSelector = '#twikoo .tk-content img:not(.tk-owo-emotion)';
Fluid.plugins.imageCaption(imgSelector);
Fluid.plugins.fancyBox(imgSelector);
});
}
}
)
twikoo.init(options)
});
});
</script>
<noscript>Please enable JavaScript to view the comments</noscript>
</article>
</article>
</div>
</div>
</div>
<div class="side-col d-none d-lg-block col-lg-2">
<aside class="sidebar" style="margin-left: -1rem">
<div id="toc">
<p class="toc-header">
<i class="iconfont icon-list"></i>
<span>目录</span>
</p>
<div class="toc-body" id="toc-body"></div>
</div>
</aside>
</div>
</div>
</div>
<a id="scroll-top-button" aria-label="TOP" href="#" role="button">
<i class="iconfont icon-arrowup" aria-hidden="true"></i>
</a>
<div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
<div class="modal-content">
<div class="modal-header text-center">
<h4 class="modal-title w-100 font-weight-bold">搜索</h4>
<button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body mx-3">
<div class="md-form mb-5">
<input type="text" id="local-search-input" class="form-control validate">
<label data-error="x" data-success="v" for="local-search-input">关键词</label>
</div>
<div class="list-group" id="local-search-result"></div>
</div>
</div>
</div>
</div>
</main>
<footer>
<div class="footer-inner">
<div class="footer-content">
<a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> <br> PowerBy 浪子 ©2023
</div>
<div class="statistics">
<span id="leancloud-site-pv-container" style="display: none">
总访问量
<span id="leancloud-site-pv"></span>
</span>
<span id="leancloud-site-uv-container" style="display: none">
总访客数
<span id="leancloud-site-uv"></span>
</span>
</div>
</div>
</footer>
<!-- Scripts -->
<script src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js" ></script>
<link rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css" />
<script>
NProgress.configure({"showSpinner":false,"trickleSpeed":100})
NProgress.start()
window.addEventListener('load', function() {
NProgress.done();
})
</script>
<script src="https://lib.baomitu.com/jquery/3.6.4/jquery.min.js" ></script>
<script src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js" ></script>
<script src="/js/events.js" ></script>
<script src="/js/plugins.js" ></script>
<script src="https://lib.baomitu.com/typed.js/2.0.12/typed.min.js" ></script>
<script>
(function (window, document) {
var typing = Fluid.plugins.typing;
var subtitle = document.getElementById('subtitle');
if (!subtitle || !typing) {
return;
}
var text = subtitle.getAttribute('data-typed-text');
typing(text);
})(window, document);
</script>
<script src="/js/img-lazyload.js" ></script>
<script>
Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.20.1/tocbot.min.js', function() {
var toc = jQuery('#toc');
if (toc.length === 0 || !window.tocbot) { return; }
var boardCtn = jQuery('#board-ctn');
var boardTop = boardCtn.offset().top;
window.tocbot.init(Object.assign({
tocSelector : '#toc-body',
contentSelector : '.markdown-body',
linkClass : 'tocbot-link',
activeLinkClass : 'tocbot-active-link',
listClass : 'tocbot-list',
isCollapsedClass: 'tocbot-is-collapsed',
collapsibleClass: 'tocbot-is-collapsible',
scrollSmooth : true,
includeTitleTags: true,
headingsOffset : -boardTop,
}, CONFIG.toc));
if (toc.find('.toc-list-item').length > 0) {
toc.css('visibility', 'visible');
}
Fluid.events.registerRefreshCallback(function() {
if ('tocbot' in window) {
tocbot.refresh();
var toc = jQuery('#toc');
if (toc.length === 0 || !tocbot) {
return;
}
if (toc.find('.toc-list-item').length > 0) {
toc.css('visibility', 'visible');
}
}
});
});
</script>
<script src=https://lib.baomitu.com/clipboard.js/2.0.11/clipboard.min.js></script>
<script>Fluid.plugins.codeWidget();</script>
<script>
Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/4.3.1/anchor.min.js', function() {
window.anchors.options = {
placement: CONFIG.anchorjs.placement,
visible : CONFIG.anchorjs.visible
};
if (CONFIG.anchorjs.icon) {
window.anchors.options.icon = CONFIG.anchorjs.icon;
}
var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
var res = [];
for (var item of el) {
res.push('.markdown-body > ' + item.trim());
}
if (CONFIG.anchorjs.placement === 'left') {
window.anchors.options.class = 'anchorjs-link-left';
}
window.anchors.add(res.join(', '));
Fluid.events.registerRefreshCallback(function() {
if ('anchors' in window) {
anchors.removeAll();
var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
var res = [];
for (var item of el) {
res.push('.markdown-body > ' + item.trim());
}
if (CONFIG.anchorjs.placement === 'left') {
anchors.options.class = 'anchorjs-link-left';
}
anchors.add(res.join(', '));
}
});
});
</script>
<script>
Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
Fluid.plugins.fancyBox();
});
</script>
<script>Fluid.plugins.imageCaption();</script>
<script defer src="/js/leancloud.js" ></script>
<script src="/js/local-search.js" ></script>
<!-- 主题的启动项,将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script src="/js/boot.js" ></script>
<noscript>
<div class="noscript-warning">博客在允许 JavaScript 运行的环境下浏览效果更佳</div>
</noscript>
</body>
</html>