hexo/public/2023/88a97a51.html

752 lines
26 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 name="theme-color" content="#2f4154">
<meta name="author" content="浪子">
<meta name="keywords" content="DIY,黑苹果,分享,自由">
<meta name="description" content="项目https:&#x2F;&#x2F;github.com&#x2F;hu3rror&#x2F;memos-on-fly 准备工作 注册FLY.IO用以部署memos 注册B2Chttps:&#x2F;&#x2F;www.backblaze.com&#x2F;cloud-storage 用以同步备份memos数据库 新建BUCKET,并获取&lt;keyId&gt;和&lt;applicationKey&gt; 安装flyctlInstall flyctl以WI">
<meta property="og:type" content="article">
<meta property="og:title" content="如何在Fly.io部署Memos">
<meta property="og:url" content="https://jkjoy.cn/2023/88a97a51.html">
<meta property="og:site_name" content="提剑追梦">
<meta property="og:description" content="项目https:&#x2F;&#x2F;github.com&#x2F;hu3rror&#x2F;memos-on-fly 准备工作 注册FLY.IO用以部署memos 注册B2Chttps:&#x2F;&#x2F;www.backblaze.com&#x2F;cloud-storage 用以同步备份memos数据库 新建BUCKET,并获取&lt;keyId&gt;和&lt;applicationKey&gt; 安装flyctlInstall flyctl以WI">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2023-08-14T16:00:00.000Z">
<meta property="article:modified_time" content="2023-09-25T06:49:19.411Z">
<meta property="article:author" content="浪子">
<meta property="article:tag" content="Memos">
<meta name="twitter:card" content="summary_large_image">
<title>如何在Fly.io部署Memos - 提剑追梦</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/font_1736178_lbnruvf0jn.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>Fluid</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-fill"></i>
<span>首页</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/archives/">
<i class="iconfont icon-archive-fill"></i>
<span>归档</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/categories/">
<i class="iconfont icon-category-fill"></i>
<span>分类</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/tags/">
<i class="iconfont icon-tags-fill"></i>
<span>标签</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/links/">
<i class="iconfont icon-link-fill"></i>
<span>友链</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/about/">
<i class="iconfont icon-user-fill"></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部署Memos"></span>
</div>
<div class="mt-3">
<span class="post-meta">
<i class="iconfont icon-date-fill" aria-hidden="true"></i>
<time datetime="2023-08-15 00:00" pubdate>
2023年8月15日 凌晨
</time>
</span>
</div>
<div class="mt-1">
<span class="post-meta mr-2">
<i class="iconfont icon-chart"></i>
1.3k 字
</span>
<span class="post-meta mr-2">
<i class="iconfont icon-clock-fill"></i>
11 分钟
</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部署Memos</h1>
<p class="note note-info">
本文最后更新于2023年9月25日 下午
</p>
<div class="markdown-body">
<h2 id="项目"><a href="#项目" class="headerlink" title="项目"></a>项目</h2><p><a target="_blank" rel="noopener" href="https://github.com/hu3rror/memos-on-fly">https://github.com/hu3rror/memos-on-fly</a></p>
<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul>
<li>注册FLY.IO<br>用以部署memos</li>
<li>注册B2C<br><a target="_blank" rel="noopener" href="https://www.backblaze.com/cloud-storage">https://www.backblaze.com/cloud-storage</a><br> 用以同步备份memos数据库<br> 新建BUCKET,并获取<code>&lt;keyId&gt;</code><code>&lt;applicationKey&gt;</code></li>
</ul>
<h2 id="安装flyctl"><a href="#安装flyctl" class="headerlink" title="安装flyctl"></a>安装flyctl</h2><p>Install flyctl<br>以WINDOWS为例</p>
<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">pwsh -<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>
<p>其他系统请参照官方</p>
<h2 id="新建APP"><a href="#新建APP" class="headerlink" title="新建APP"></a>新建APP</h2><p>初始化</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">flyctl <span class="hljs-built_in">launch</span><br></code></pre></td></tr></table></figure>
<p>按照提示选择会生成一个FLY.TOML文件</p>
<h2 id="编辑FLY-TOML"><a href="#编辑FLY-TOML" class="headerlink" title="编辑FLY.TOML"></a>编辑FLY.TOML</h2><p>添加以下</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></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-section">[build]</span><br> <span class="hljs-attr">image</span> = <span class="hljs-string">&quot;ghcr.io/hu3rror/memos-litestream:latest&quot;</span><br><span class="hljs-comment">#如果不需要备份数据库则可以选择官方的docker镜像ghcr.io/usememos/memos:latest</span><br><span class="hljs-comment">#使用官方镜像可以删掉env的部分</span><br><span class="hljs-section">[env]</span><br> <span class="hljs-comment"># Details see: https://litestream.io/guides/backblaze/</span><br> <span class="hljs-attr">LITESTREAM_REPLICA_BUCKET</span> = <span class="hljs-string">&quot;B2C桶名称&quot;</span> <span class="hljs-comment"># change to your litestream bucket name</span><br> <span class="hljs-attr">LITESTREAM_REPLICA_ENDPOINT</span> = <span class="hljs-string">&quot;s3.us-east-005.backblazeb2.com&quot;</span> <span class="hljs-comment"># change to your litestream endpoint url</span><br> <span class="hljs-attr">LITESTREAM_REPLICA_PATH</span> = <span class="hljs-string">&quot;memos_prod.db&quot;</span> <span class="hljs-comment"># keep the default or change to whatever path you want</span><br><br><span class="hljs-section">[[mounts]]</span><br> <span class="hljs-attr">source</span> = <span class="hljs-string">&quot;memos_data&quot;</span><br> <span class="hljs-attr">destination</span> = <span class="hljs-string">&quot;/var/opt/memos&quot;</span><br><br><span class="hljs-section">[http_service]</span><br> <span class="hljs-attr">internal_port</span> = <span class="hljs-number">5230</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">0</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 memos_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>将B2存储的密钥添加到fly的密钥存储中,使用官方镜像可以忽略此步骤</p>
<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">flyctl secrets <span class="hljs-built_in">set</span> <span class="hljs-attribute">LITESTREAM_ACCESS_KEY_ID</span>=<span class="hljs-string">&quot;&lt;keyId&gt;&quot;</span> <span class="hljs-attribute">LITESTREAM_SECRET_ACCESS_KEY</span>=<span class="hljs-string">&quot;&lt;applicationKey&gt;&quot;</span><br></code></pre></td></tr></table></figure>
<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>
<h2 id="演示地址"><a href="#演示地址" class="headerlink" title="演示地址"></a>演示地址</h2><p><a target="_blank" rel="noopener" href="https://memosim.fly.dev/">https://memosim.fly.dev/</a><br>绑定域名演示<br><a target="_blank" rel="noopener" href="https://imad.top/">https://imad.top</a></p>
</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/Memos/" class="category-chain-item">Memos</a>
</span>
</span>
</div>
<div class="post-meta">
<i class="iconfont icon-tags"></i>
<a href="/tags/Memos/" class="print-no-link">#Memos</a>
</div>
</div>
<div class="post-prevnext my-3">
<article class="post-prev col-6">
<a href="/2023/c80a64e9.html" title="在fly.io部署artalk评论系统">
<i class="iconfont icon-arrowleft"></i>
<span class="hidden-mobile">在fly.io部署artalk评论系统</span>
<span class="visible-mobile">上一篇</span>
</a>
</article>
<article class="post-next col-6">
<a href="/2023/e48ebe86.html" title="使用 Docker 构建 Pleroma 实例">
<span class="hidden-mobile">使用 Docker 构建 Pleroma 实例</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>
</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>