<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://blog.elysium-stack.cn/</id>
  <title type="text">ElysiumStack</title>
  <subtitle type="text">不会摄影的设计师不是优秀的旅行家</subtitle>
  <updated>2026-07-22T15:37:00.000Z</updated>
  <author><name>梅莉</name></author>
  <link rel="alternate" href="https://blog.elysium-stack.cn/"/>
  <link rel="self" href="https://blog.elysium-stack.cn/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.9</generator>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/bc-2nd-anniversary/</id>
      <title type="text">BlogsClub二周年快乐</title>
      <published>2026-07-22T15:37:00.000Z</published>
      <updated>2026-07-22T15:37:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/bc-2nd-anniversary/"/>
      <summary type="text">BlogsClub二周年快乐，迟来的庆贺文与纪念品返图！</summary>
      <content type="html"><![CDATA[<p>一晃眼的功夫BlogsClub(BC)已经陪伴了我一年了，时间过的真快，今年上半年没发文章，工作忙，生活也忙，打开交流群发现多了很多新来的小伙伴，也有一些曾经活跃的“老伙伴”慢慢淡出了视野，多少觉得有些遗憾。</p>
<p>我很少在BC交流群里说话，很多时候其实更喜欢看大家聊天，做一个聆听者，当然也偶尔会加入讨论或时不时出来冒个泡，有时候只是想通过这样的方式告诉大家“我还在，我没有离开BC”。我记得白熊老师曾经在BC群里说过一句话“新的来，老的在”，我非常认同，尤其是在博客圈子里，长期运营博客还是需要一些坚持和成本的，可能下一刻就会有小伙伴因为工作、学业或是财力的原因而离开，能运营起一个博客圈子并且把大家连接在一起，更是一件难上加难的事情。</p>
<p>今年的二周年纪念币环节依旧没有错过，也是成功兑换到了春夏秋冬系列鼠标垫，非常开心。</p>
<div><figure><img src="/_astro/bc-2nd-anniversary-1.OpNJU-w8_Z2usLMJ.webp" alt="二周年纪念币" loading="lazy" width="2300" height="2624" /><figcaption>二周年纪念币</figcaption></figure><figure><img src="/_astro/bc-2nd-anniversary-2.DScei3M3_Z1LRBii.webp" alt="二周年钥匙扣" loading="lazy" width="3064" height="2624" /><figcaption>二周年钥匙扣</figcaption></figure><figure><img src="/_astro/bc-2nd-anniversary-3.D-C6Vl_J_ZuxAuM.webp" alt="周年纪念币合照" loading="lazy" width="4096" height="2632" /><figcaption>周年纪念币合照</figcaption></figure></div>
<p>可以说二周年logo的辨识度还是相当高的，而且纪念币的包装上也比去年精致了许多，看得出花了很大的心思。</p>
<div><figure><img src="/_astro/bc-2nd-anniversary-4.ChnMqM8P_Z1p26YL.webp" alt="四季鼠标垫-春" loading="lazy" width="4096" height="2628" /><figcaption>四季鼠标垫-春</figcaption></figure><figure><img src="/_astro/bc-2nd-anniversary-5.4EjpKMcW_ZFfsOP.webp" alt="四季鼠标垫-夏" loading="lazy" width="4096" height="2628" /><figcaption>四季鼠标垫-夏</figcaption></figure><figure><img src="/_astro/bc-2nd-anniversary-6.2Hroy7W-_UzGiN.webp" alt="四季鼠标垫-秋" loading="lazy" width="4096" height="2628" /><figcaption>四季鼠标垫-秋</figcaption></figure><figure><img src="/_astro/bc-2nd-anniversary-7.DvPZ3esa_Z25Q23Q.webp" alt="四季鼠标垫-冬" loading="lazy" width="4096" height="2628" /><figcaption>四季鼠标垫-冬</figcaption></figure></div>
<p><figure><img src="/_astro/bc-2nd-anniversary-8.BrpiyLZl_1XrIUm.webp" alt="四季鼠标垫" loading="lazy" width="2300" height="4420" /><figcaption>四季鼠标垫</figcaption></figure></p>
<p>这个鼠标垫我是真没想到会这么大，收到快递的那一刻我都震惊了，四卷超大号的鼠标垫，四季装扮的博小玥也是非常可爱了～</p>
<p><strong>该死！有点舍不得用！怎么办！</strong></p>
<p>总之也是和BC一起度过了一整年，希望下一周年的此刻，有更多的小伙伴加入，曾经的“老资历”们也都还在，迟来的纪念文，祝BlogsClub二周年快乐！</p>
<div><a href="https://www.blogsclub.org/apply.html?inviteCode=825c29ec"><p>👉 👉 即刻加入 BlogsClub 成为老资历 👈👈</p></a></div>
<div><img src="/_astro/bc-2nd-anniversary-9.CceOUbje_Z1H8ytj.webp" alt="老资历" loading="lazy" width="250" height="250" /></div>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/arknights-endfield-tools/</id>
      <title type="text">明日方舟终末地工具站汇总</title>
      <published>2026-01-22T11:19:00.000Z</published>
      <updated>2026-01-22T11:19:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/arknights-endfield-tools/"/>
      <summary type="text">汇总明日方舟终末地相关工具网站，涵盖协议终端、基质规划器、量化计算器、排轴终端、互动地图、剧情检索、一图流、拼图解密、Wiki及MAA小助手等实用资源</summary>
      <content type="html"><![CDATA[<p>本文将持续更新汇总明日方舟终末地相关的工具网站（目前截止2026年11月4日），由于内容过多，请根据目录自行取阅跳转</p>
<div><div><div></div><div>插个名片先 UID 1341030657</div></div><div><p></p><figure><img alt="终末地UID 1341030657" loading="lazy" width="3440" height="1440" src="/_astro/arknights-endfield-tools-1.D48cmSlS_2hxWaC.webp" /><figcaption>终末地UID 1341030657</figcaption></figure><p></p></div></div>
<section><h3>终末地懒人工坊<a href="#终末地懒人工坊"><span>#</span></a></h3><p><a href="https://endfield-helper.cnbarrier.com/omv-dijiang" target="_blank">帝江号干员进驻</a></p><p><a href="https://endfield-helper.cnbarrier.com/yuanyuan-manor-inn" target="_blank">缘缘庄客栈经营</a></p></section>
<section><h3>终末地·协议终端<a href="#终末地协议终端"><span>#</span></a></h3><p><a href="https://end.shallow.ink/" target="_blank">终末地·协议终端</a></p></section>
<section><h3>终末地基质规划器<a href="#终末地基质规划器"><span>#</span></a></h3><p><a href="https://end.canmoe.com/" target="_blank">终末地基质规划器</a></p></section>
<section><h3>终末地量化计算器<a href="#终末地量化计算器"><span>#</span></a></h3><p><a href="https://factory.ef.yituliu.cn/aef?v=11" target="_blank">终末地量化计算器</a></p></section>
<section><h3>排轴终端<a href="#排轴终端"><span>#</span></a></h3><p><a href="https://www.end-axis.com/timeline" target="_blank">排轴终端</a></p></section>
<section><h3>互动地图<a href="#互动地图"><span>#</span></a></h3><p><a href="https://www.zmdmap.com/" target="_blank">互动地图</a></p></section>
<section><h3>官方地图工具<a href="#官方地图工具"><span>#</span></a></h3><p><a href="https://game.skland.com/map/endfield" target="_blank">官方地图工具</a></p></section>
<section><h3>剧情检索系统<a href="#剧情检索系统"><span>#</span></a></h3><p><a href="https://endfield.prts.chat/" target="_blank">剧情检索系统</a></p></section>
<section><h3>一图流<a href="#一图流"><span>#</span></a></h3><p><a href="https://ef.yituliu.cn/" target="_blank">一图流</a></p></section>
<section><h3>拼图解密<a href="#拼图解密"><span>#</span></a></h3><p><a href="https://ak-endfield-puzzle.sihenzhang.com/" target="_blank">拼图解密</a></p></section>
<section><h3>Warfarin Wiki<a href="#warfarin-wiki"><span>#</span></a></h3><div><div><div></div><div>国内访问不太稳定</div></div><div></div></div><p><a href="https://warfarin.wiki/cn/operators" target="_blank">Warfarin Wiki</a></p></section>
<section><h3>MAA终末地小助手<a href="#maa终末地小助手"><span>#</span></a></h3><p><a href="https://maaend.com/" target="_blank">MAA终末地小助手</a></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/happy-new-year-2026/</id>
      <title type="text">告别2025 迎接2026</title>
      <published>2025-12-29T17:19:00.000Z</published>
      <updated>2025-12-29T17:19:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/happy-new-year-2026/"/>
      <summary type="text">2025年终总结，回顾博客建设、情感生活、明日方舟、旅行与演唱会等</summary>
      <content type="html"><![CDATA[<section><h3>开头 START<a href="#开头-start"><span>#</span></a></h3><p>不知不觉快2026年了，感叹一下时间真的是过得太快了，今年觉得自己过得浑浑噩噩的，年初的时候也是因为一些琐碎的事情给整个2025开了个不太好的头，觉得做什么事情都不太顺心。既然一年到头了，那么也该来一些轻松的总结，去去晦气，迎接更加美好的2026了。</p></section>
<section><h3>博客站 BLOGS<a href="#博客站-blogs"><span>#</span></a></h3><p>今年在ElysiumStack建设的投入上花费的时间其实并不是很多，一方面工作比较忙，另一方面应该是比较懒（忙占4成，懒占6成），想到要做一件事情的时候才会去做，也没什么提前规划和布局。比较开心的一件事情是今年8月份加入了BlogsClub这个大家庭，整个俱乐部的氛围我非常喜欢，也是希望BlogsClub来年乃至未来能发展得更好！今年一共发了18篇文章：</p><p>这个发文数我其实对自己是不太满意的，很多时候其实是可以写一点东西出来的，但是又不想写成纯技术文，开站至今感触很深的一点就是，纯技术类的文章受众比较窄，除了同行很少有人会在意，所以明年会考虑多分享一些日常生活和一些不那么技术的技术文。</p></section>
<section><h3>情感 EMOTION<a href="#情感-emotion"><span>#</span></a></h3><p>从年初到年末一直不是很顺利，暂时也没遇到正缘，也一直在反思是不是自己的问题，情感上的事情真的只能说随缘吧，希望明年能够遇到合适的那个人吧。</p></section>
<section><h3>明日方舟 ARKNIGHTS<a href="#明日方舟-arknights"><span>#</span></a></h3><p>今年基本上舟的线上活动全勤，线下参加了一些联名快闪和主题活动，5月参加了和名创联名的绒梦畅想会快闪，可惜音律联觉没抢到。7月参加了集成映射展，不过纯粹去买买买的。8月拥有了自己的痛柜，总算是把之前羊的周边和谷子聚集在一块儿了，看着还是挺舒服的。10月把羊的通行证全部收集齐。11月和朋友去吃了海底捞的联动，兔兔立牌是真的可爱。</p></section>
<section><h3>旅行 TRAVEL<a href="#旅行-travel"><span>#</span></a></h3><p>今年没有去太多地方游玩，2月份和朋友去了一次杭州，还拍到了招财猫猫，10月份开车陪爸妈去了嘉兴南湖，原本计划去西安可惜没去成。</p></section>
<section><h3>演唱会 CONCERT<a href="#演唱会-concert"><span>#</span></a></h3><p>3月份去看了八爷的演唱会，有些歌真的在现场和在某云听完全是不一样的感受。今年倒是没怎么去看汪苏泷的演唱会，因为根本抢不到23333</p></section>
<section><h3>最后 FINALLY<a href="#最后-finally"><span>#</span></a></h3><p>2025年尽管诸事不顺，但也让我成长了许多，学会与自己和解，学会珍惜，也学会了告别，祝愿自己2026年心想事成，ElysiumStack也将奔着10年的目标一直运营下去，共同努力，共同进步，共同成长。</p><div><div><div></div><div><strong>提前祝大家2026年新年快乐</strong></div></div><div></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/birthday-20251202/</id>
      <title type="text">2025.12.2 祝我生日快乐</title>
      <published>2025-12-02T12:02:00.000Z</published>
      <updated>2025-12-02T12:02:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/birthday-20251202/"/>
      <summary type="text">生日感悟——学会与自己和解、学会珍惜、学会告别</summary>
      <content type="html"><![CDATA[<p>又到了一年一度的生日，又长大一岁，但是并没有想着去庆祝，只是想当做很平常的一天去过。过去的一年里 ，遇到了很多事、遇见了很多人，也学会了更好的成为自己。</p>
<section><h2>学会与自己和解<a href="#学会与自己和解"><span>#</span></a></h2><p>过去我总是在乎别人对我的看法，总是害怕被别人耻笑，总觉得自己还能做得更好。这都让我在无形之中哪怕是一件很小的事情也会背上沉重的压力，我不允许自己失误，更不允许自己失败。但是后来我开始慢慢与自己和解，为何要没苦硬吃呢？人生本就是一段旅程，不可能做到每一步都踩出近乎完美和一模一样的足迹，与其如此不如开开心心过好每一天，偶尔允许自己失误、允许自己犯错、允许自己可以不优秀，不用过分在意别人对自己的看法，每一件事尽力而为不留遗憾便可。</p></section>
<section><h2>学会珍惜<a href="#学会珍惜"><span>#</span></a></h2><p>我非常珍惜每一个愿意听我讲废话的朋友、愿意陪我发呆的朋友、很少联系却依然记得我的朋友，以及总是对我唠唠叨叨的父母，这里的每一个人都值得被珍惜。有时候幸福并不是我拥有了多少或者说我拥有了很多，而是我能被理解、能被记得、能被看到。</p></section>
<section><h2>学会告别<a href="#学会告别"><span>#</span></a></h2><p>过去的一年里，我也学会了去告别一些人，有些人走着走着就走散了，有些事情久而久之就淡了，真的不必强求谁留下或者去责怪谁突然离开，大家都有属于自己的路要走，能同行一段路就已经是很幸运的一件事情了。</p><p>今天是 2025 年 12 月 2 日，我只想对自己说：</p><blockquote><p><strong><em>祝你生日快乐～</em></strong></p><p><strong><em>谢谢你在每一个想要放弃的时刻都坚持了下来～</em></strong></p><p><strong><em>谢谢你一直在努力让自己变得更好～</em></strong></p><p><strong><em>愿你在今后的日子里，始终都能眼里有光～心中有火～脚下有路～</em></strong></p><p><strong><em>愿你继续温柔，继续真诚，即使在过去的日子里你的感情一直都很糟糕，但是请相信你一定会遇见那个同样温柔真诚的人～</em></strong></p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/elysium-meting-api/</id>
      <title type="text">Elysium-Meting-Api公益服务</title>
      <published>2025-10-11T18:15:00.000Z</published>
      <updated>2025-10-11T18:15:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/elysium-meting-api/"/>
      <summary type="text">基于Meting-API自建的公开音乐API服务，支持网易云、QQ音乐等多平台搜索与播放链接获取</summary>
      <content type="html"><![CDATA[<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>笔者最近在整理源站自用的一些API服务，想把部分API服务提供出来帮助一些博主降低部分功能的部署难度和复杂度，当然笔者依然还是提倡自行学习进行私有化部署，<strong>ElysiumMeting</strong> 是笔者基于Meting-API自建的音乐API服务，现已完全公开且<strong>仅供学习交流使用，请勿用于任何商业用途</strong>。</p><div><div><div></div><div>仅供学习交流使用，请勿用于任何商业用途</div></div><div></div></div></section>
<section><h2>相关资源<a href="#相关资源"><span>#</span></a></h2><a href="https://github.com/metowolf/Meting-API" target="_blank"><div><div><div><div></div><div>metowolf</div></div><div>/</div><div>Meting-API</div></div><div></div></div><div>Repository details unavailable</div><div><div>—</div><div>—</div><div>—</div><span>Unavailable</span></div></a></section>
<section><h2>使用方法<a href="#使用方法"><span>#</span></a></h2><section><h3>基础请求格式<a href="#基础请求格式"><span>#</span></a></h3><p><code>https://meting.elysium-stack.cn/api?参数1=XXX&amp;参数2=XXX&amp;参数3=XXX</code></p></section><section><h3>参数说明（必填）<a href="#参数说明必填"><span>#</span></a></h3><ul>
<li>
<p><code>server</code> - 音乐平台</p>
<ul>
<li>
<p><code>netease</code>（网易云，已支持VIP解析）</p>
</li>
<li>
<p><code>tencent</code>（QQ音乐）</p>
</li>
<li>
<p><code>kugou</code>（酷狗）</p>
</li>
<li>
<p><code>xiami</code>（虾米）</p>
</li>
<li>
<p><code>baidu</code>（百度）</p>
</li>
<li>
<p><code>kuwo</code>（酷我）</p>
</li>
</ul>
</li>
<li>
<p><code>type</code> - 操作类型</p>
<ul>
<li>
<p><code>search</code>（搜索歌曲）</p>
</li>
<li>
<p><code>song</code>（获取歌曲详情）</p>
</li>
<li>
<p><code>album</code>（获取专辑）</p>
</li>
<li>
<p><code>artist</code>（获取歌手）</p>
</li>
<li>
<p><code>playlist</code>（获取歌单）</p>
</li>
<li>
<p><code>lrc</code>（获取歌词）</p>
</li>
<li>
<p><code>url</code>（获取播放链接）</p>
</li>
<li>
<p><code>pic</code>（获取封面图片）</p>
</li>
</ul>
</li>
<li>
<p><code>id</code> - 资源ID</p>
</li>
</ul></section><section><h3>请求示例<a href="#请求示例"><span>#</span></a></h3><ul>
<li><strong>搜索歌曲</strong></li>
</ul><p><code>https://meting.elysium-stack.cn/api?server=netease&amp;type=search&amp;id=周杰伦</code></p><ul>
<li><strong>获取歌曲详情</strong></li>
</ul><p><code>https://meting.elysium-stack.cn/api?server=netease&amp;type=song&amp;id=歌曲ID</code></p><ul>
<li><strong>获取歌词</strong></li>
</ul><p><code>https://meting.elysium-stack.cn/api?server=netease&amp;type=lrc&amp;id=歌曲ID</code></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/hollow-knight-silksong/</id>
      <title type="text">《空洞骑士：丝之歌》适不适合入手？</title>
      <published>2025-09-22T12:24:00.000Z</published>
      <updated>2025-09-22T12:24:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/hollow-knight-silksong/"/>
      <summary type="text">从地图、系统、剧情、难度等方面评测《空洞骑士：丝之歌》，分析适合入手的人群</summary>
      <content type="html"><![CDATA[<section><h2>前言<a href="#前言"><span>#</span></a></h2><p>自2019年Team Cherry公布<strong>空洞骑士：丝之歌</strong>已时隔6年之久，而就在这个月4号（9月4日），<strong>丝之歌</strong>也是正式上架了Steam，笔者作为一个<strong>空洞骑士</strong>老玩家那自然也是二话不说直接就buy了，结合最近一段时间的游玩体验再加上笔者个人对游戏的客观理解，今天来说说这个“从DLC演变成正统续作”的<strong>丝之歌</strong>到底适不适合入手。</p><div><div><div></div><div>以下所有内容不会涉及游戏剧透，请放心阅读</div></div><div></div></div><p>笔者目前游戏大约50个小时，只玩了猎手和漫游者两个职能，先贴个小黑盒存档解析，目前在做全收集。</p><p>ps：但这真的不是笔者半个月没更新博客的原因_(&lt;з&gt;」∠)_</p><p></p><figure><img alt="小黑盒存档解析" loading="lazy" width="2016" height="9492" src="/_astro/hollow-knight-silksong-1.Dx3yvi41_Z2uaJWI.webp" /><figcaption>小黑盒存档解析</figcaption></figure><p></p></section>
<section><h2>关于游戏<a href="#关于游戏"><span>#</span></a></h2><div><div><div></div><div>以下内容为个人观点，仅供参考，每个人对游戏理解都不一样，没有对错之分</div></div><div></div></div><p><strong>丝之歌</strong>延续了前作<strong>空洞骑士</strong>的大部分要素，除了该死的游戏难度，TC你是觉得大家都是硬核高玩是吗！因此很多地方你能看到前作的影子，以下从不同方面来说说笔者对本作的一些游戏感受。</p><section><h3>地图<a href="#地图"><span>#</span></a></h3><p>游戏地图还是一如既往的大，笔者感觉比前作大不少但这同样也增加了跑尸的时间_(&lt;з&gt;」∠)_</p></section><section><h3>系统<a href="#系统"><span>#</span></a></h3><p>本作取消了前作的<strong>护符系统</strong>，取而代之的是新的<strong>纹章系统</strong>（可以理解为职业切换）和<strong>陷阱工具</strong>系统（可以携带各种小道具辅助探索打怪），网上看到有玩家对这一变化表示不如前作的护符可进行多样化搭配，但笔者认为本作更强调的是合理搭配不同职业（纹章）和道具进行克敌制胜，只能说玩法各有各的优点，观点各有各的见解。</p></section><section><h3>剧情<a href="#剧情"><span>#</span></a></h3><p>依旧是半碎片化叙事，虽说是正统续作，笔者个人认为不及前作的剧情，但不乏一些令人震撼的场景，可能称其为“剧情补充”会更合理？纯属个人观点，如果单看<strong>丝之歌</strong>本身的话，整体剧情还是不错的。</p></section><section><h3>音乐与美术<a href="#音乐与美术"><span>#</span></a></h3><p>绝赞！TC在这方面从不会令人失望！</p></section><section><h3>本土化翻译<a href="#本土化翻译"><span>#</span></a></h3><p>部分中文翻译不佳，笔者一个中国人居然有看不懂中文的一天，但TC承诺后续补丁改进，所以可以观望一下。</p></section><section><h3>操作<a href="#操作"><span>#</span></a></h3><p>仁者见仁智者见智，不同纹章的操作略有不同，入手的小伙伴自行体会。</p><div><div><div></div><div>强烈推荐使用手柄进行游玩！</div></div><div></div></div></section><section><h3>难度<a href="#难度"><span>#</span></a></h3><p>这笔者就不得不吐槽了！**本作比前作难，但难的不是boss！**而是包含但不限于以下内容：</p><ul>
<li>
<p>伤害高到离谱的小怪 后期虫均打一下扣2滴血</p>
</li>
<li>
<p>大量专治手残的跳跳乐地图 玩了<strong>丝之歌</strong>，人人都能成为前作<strong>苦痛之路</strong>高手（bushi）</p>
</li>
<li>
<p>令人发指的长距离跑尸地图 ♪三百六十五里路呦~~~~~♪</p>
</li>
<li>
<p>各种收费椅子和陷阱椅子 TC你什么不学好！整这个是吧！</p>
</li>
<li>
<p>etc.</p>
</li>
</ul><p>难度方面笔者建议先去玩前作，再来玩<strong>丝之歌</strong>，游戏体验也许会好一点。</p></section><section><h3>价格<a href="#价格"><span>#</span></a></h3><p>目前（截止2025年9月22日），游戏steam国区售价76元。</p></section></section>
<section><h2>适不适合入手<a href="#适不适合入手"><span>#</span></a></h2><div><div><div></div><div>以下内容为个人观点，仅供参考，每个人对游戏理解都不一样，没有对错之分</div></div><div></div></div><section><h3>适合入手<a href="#适合入手"><span>#</span></a></h3><ul>
<li>
<p>[x]</p>
<p><strong>平台跳跃</strong>类型或<strong>类银河恶魔城</strong>类型游戏的高手</p>
</li>
<li>
<p>[x]</p>
<p>完美通关前作<strong>空洞骑士</strong>的老玩家（玩过前作真心建议入）</p>
</li>
<li>
<p>[x]</p>
<p>对自己的操作信心十足的小伙伴</p>
</li>
</ul></section><section><h3>视钱包情况入手<a href="#视钱包情况入手"><span>#</span></a></h3><ul>
<li>
<p>[x]</p>
<p>喜欢玩<strong>平台跳跃</strong>类型或<strong>类银河恶魔城</strong>类型的小伙伴</p>
</li>
<li>
<p>[x]</p>
<p>没玩过前作<strong>空洞骑士</strong>或只玩了一半没通关的小伙伴</p>
</li>
<li>
<p>[x]</p>
<p>对自己的操作没什么信心，但是想玩玩看的小伙伴</p>
</li>
</ul></section><section><h3>不适合入手<a href="#不适合入手"><span>#</span></a></h3><ul>
<li>
<p>[x]</p>
<p>没接触过<strong>平台跳跃</strong>类型或<strong>类银河恶魔城</strong>类型游戏的小伙伴</p>
</li>
<li>
<p>[x]</p>
<p>没什么耐心，比较容易自暴自弃的小伙伴（真不建议浪费这个钱，为啥不去吃顿好的呢）</p>
</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/bc-1st-anniversary/</id>
      <title type="text">BlogsClub一周年纪念币Get✓</title>
      <published>2025-09-04T11:09:00.000Z</published>
      <updated>2025-09-04T11:09:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/bc-1st-anniversary/"/>
      <summary type="text">回顾ElysiumStack建站历程与加入BlogsClub的经历，分享一周年纪念币返图</summary>
      <content type="html"><![CDATA[<section><h3>建站初衷<a href="#建站初衷"><span>#</span></a></h3><p><strong>“<strong>搭建一个属于自己的博客站</strong>”</strong>——这个想法始于笔者2023年12月一个加班通宵的夜晚，原因很简单，当时正苦思冥想解决某个技术层面的问题，在查找问题解决方案时看到很多大佬会把自己对技术的理解、问题的解决方法等等内容记录在自己的博客里。和内容过于杂乱的社交网站比起来，博客似乎非常适合用来记录自己对知识的积累和对生活的所思所想所闻与所见，完全属于自己的一个赛博空间，因此笔者在2024年初的时候决定搭建一个专属于自己的博客，以此来分享、记录、思考、总结。</p><p>2024年01月02日：注册域名elysium-stack.cn</p><p></p><figure><img alt="域名注册信息" loading="lazy" width="647" height="640" src="/_astro/bc-1st-anniversary-1.DtReQTgj_ZjHSun.webp" /><figcaption>域名注册信息</figcaption></figure><p></p><p>2024年01月07日：ElysiumStack1.0站点上线（Hexo+Butterfly）</p><p>2024年01月11日：完成ICP备案</p><p></p><figure><img alt="ICP备案信息" loading="lazy" width="665" height="912" src="/_astro/bc-1st-anniversary-2.BbvyAMDL_620B7.webp" /><figcaption>ICP备案信息</figcaption></figure><p></p><p>2024年11月27日：因个人工作原因，ElysiumStack1.0进入无期限停更状态</p><p>2025年01月03日：重建ElysiumStack1.0计划启动</p><p>2025年02月15日：ElysiumStack1.0重建完成，ElysiumStack2.0站点上线（Halo+Dream2.0Plus）</p><p>2025年08月13日：正式加入BlogsClub</p><p></p><figure><img alt="加入BlogsClub" loading="lazy" width="3440" height="3220" src="/_astro/bc-1st-anniversary-3.CF5-FceU_1y64dC.webp" /><figcaption>加入BlogsClub</figcaption></figure><p></p></section>
<section><h3>加入BlogsClub<a href="#加入blogsclub"><span>#</span></a></h3><p>BlogsClub是笔者第一个加入的博客组织，过去，笔者几乎不曾与任何其它博主有过互动交流，加入BlogsClub之后，笔者见到了很多文笔大佬与技术大佬，大家都在坚持做着自己所热爱的事情，记录心情记录生活分享知识分享所见。笔者每天都会打开友链朋友圈逛上一会儿，没有写作质量的比较，没有技术力的比较，没有利益关系，没有阶级关系，没有身份的约束，每个人都是独立的个体，这一切都显得比社交平台的所见更加真实。</p></section>
<section><h3>纪念币返图<a href="#纪念币返图"><span>#</span></a></h3><p>非常感谢白熊老师的精心准备，一周年纪念币分量很足，质感和包装都非常精致，期待与大家在BlogsClub的下一个周年~</p><p></p><figure><img alt="一周年纪念币返图1" loading="lazy" width="1057" height="200" src="/_astro/bc-1st-anniversary-4.Dh-N9q-4_Z1kNX9B.webp" /><figcaption>一周年纪念币返图1</figcaption></figure><p></p><div><figure><img alt="一周年纪念币返图2" loading="lazy" width="4000" height="3424" src="/_astro/bc-1st-anniversary-5.D_sktnwp_Z208zbA.webp" /><figcaption>一周年纪念币返图2</figcaption></figure><figure><img alt="一周年纪念币返图3" loading="lazy" width="4000" height="3424" src="/_astro/bc-1st-anniversary-6.DF-mCj58_2ul1K5.webp" /><figcaption>一周年纪念币返图3</figcaption></figure><figure><img alt="一周年纪念币返图4" loading="lazy" width="4000" height="3424" src="/_astro/bc-1st-anniversary-7.wcxkmNSl_ZdpWRG.webp" /><figcaption>一周年纪念币返图4</figcaption></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/halo-dream20plus/</id>
      <title type="text">Dream2.0Plus主题访客信息侧边栏美化</title>
      <published>2025-08-26T16:12:00.000Z</published>
      <updated>2025-08-26T16:12:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/halo-dream20plus/"/>
      <summary type="text">基于Nice猫API实现Halo Dream2.0Plus主题访客信息侧边栏，含IP定位、距离计算及完整源码</summary>
      <content type="html"><![CDATA[<p>前段时间有小伙伴问这个是怎么实现的，单独开一篇来说一下</p>
<p></p><figure><img alt="访客信息侧边栏效果" loading="lazy" width="366" height="304" src="/_astro/halo-dream2.0plus-1.BH1qyUPO_1aSy52.webp" /><figcaption>访客信息侧边栏效果</figcaption></figure><p></p>
<p>首先说明一下Dream2.0Plus的主题文档中提供了访客侧边栏的源码方案~~（笔者也是自己写完了才发现原来主题作者其实有提供）~~</p>
<p><a href="https://www.hcjike.com/docs/halo-theme-dream2.0/theme/sidebar-assembly" target="_blank">https://www.hcjike.com/docs/halo-theme-dream2.0/theme/sidebar-assembly</a></p>
<blockquote><p>如果想直接采用主题作者方案的小伙伴，直接套用上述链接内的代码按照常规的自定义侧边栏配置即可，也可自行编写HTML嵌入</p></blockquote>
<p>~~为了对得起自己造的轮子，~~下面笔者详细说明一下制作过程。</p>
<section><h2>定位API服务<a href="#定位api服务"><span>#</span></a></h2><p>市面上有太多免费的API接口服务了，笔者测试了很多不同服务商的，当然也包括腾讯、高德、百度这些大厂，总结来说大厂的东西确实更好用，但作为个人开发者每天有限额，比如腾讯的地图服务大概是每天6000次的调用量，当然这个量级对于一个博客站来说已经完全够用了，但是配置过于复杂。经过三番比较，笔者最终选择了<strong>Nice猫</strong>，只能说这大概是笔者见过的最稳定最好用的API聚合站之一。</p><p><a href="https://api.nsmao.net/" target="_blank">https://api.nsmao.net/</a></p></section>
<section><h2>注册并获取API Key<a href="#注册并获取api-key"><span>#</span></a></h2><p>打开<strong>Nice猫</strong>，注册并登录，随后在密钥管理中找<code>您的API KEY 密钥</code>同时根据需要配置<code>安全校验方式</code> ，建议配置。</p><p></p><figure><img alt="Nice猫API密钥管理" loading="lazy" width="1987" height="988" src="/_astro/halo-dream2.0plus-2.40C0ARxo_1lSX2G.webp" /><figcaption>Nice猫API密钥管理</figcaption></figure><p></p></section>
<section><h2>本站访客信息侧边栏源码<a href="#本站访客信息侧边栏源码"><span>#</span></a></h2><p>废话不多说，直接看代码</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>    </span><span>/* 通用居中 */</span></div></div><div><div><div>3</div></div><div><span>    </span><span>.align-center</span><span> {</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span>/* 高亮文字颜色 */</span></div></div><div><div><div>8</div></div><div><span>    </span><span>.font-color</span><span> {</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>color: </span><span>deepskyblue</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>/* IP 遮罩：默认模糊，鼠标悬停后清晰 */</span></div></div><div><div><div>13</div></div><div><span>    </span><span>.ip-mask</span><span> {</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>cursor: </span><span>pointer</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>user-select: </span><span>none</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>transition: </span><span>all</span><span> </span><span><span>.3</span><span>s</span></span><span><span> </span><span>ease</span><span>;</span></span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>filter: </span><span>blur</span><span>(</span><span><span>4</span><span>px</span></span><span>);</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span><span>.ip-mask</span><span>:hover</span></span><span> {</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>filter: </span><span>none</span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>23</div></div><div><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>24</div></div><div><span>&lt;!-- 欢迎信息容器 --&gt;</span></div></div><div><div><div>25</div></div><div><span>&lt;</span><span>div</span><span> </span><span>id</span><span>=</span><span>"welcomeMessage"</span><span> </span><span>class</span><span>=</span><span>"align-center"</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>&lt;</span><span>p</span><span>&gt;🌍 小伙伴你好呀！ 🌍&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>&lt;</span><span>p</span><span>&gt;正在寻找你的足迹...&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>28</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>&lt;!-- 开往/空间穿梭按钮 --&gt;</span></div></div><div><div><div>31</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"align-center"</span><span>&gt;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>&lt;</span><span>p</span><span>&gt;🚇 继续探索未知 👇️👇️ 发现更多精彩 🚇&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"https://www.travellings.cn/go.html"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span> </span><span>rel</span><span>=</span><span>"noopener"</span><span> </span><span>title</span><span>=</span><span>"开往-友链接力"</span><span>&gt;</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"https://www.travellings.cn/assets/logo.gif"</span><span> </span><span>alt</span><span>=</span><span>"开往-友链接力"</span><span> </span><span>width</span><span>=</span><span>"120"</span><span> /&gt;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>&lt;</span><span>a</span><span> </span><span>href</span><span>=</span><span>"https://blogs.quest"</span><span> </span><span>target</span><span>=</span><span>"_blank"</span><span> </span><span>title</span><span>=</span><span>"空间穿梭-随机访问 BlogsClub 成员博客"</span><span>&gt;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>&lt;</span><span>img</span><span> </span><span>src</span><span>=</span><span>"https://www.blogsclub.org/images/shuttle_4.png"</span><span> </span><span>alt</span><span>=</span><span>"空间穿梭"</span><span> /&gt;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>&lt;/</span><span>a</span><span>&gt;</span></div></div><div><div><div>39</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>42</div></div><div><span>    </span><span>/***********************</span></div></div><div><div><div>43</div></div><div><span><span>     </span></span><span>* 工具函数</span></div></div><div><div><div>44</div></div><div><span><span>     </span></span><span>***********************/</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>    </span><span>/** 根据当前小时获取问候语与建议 */</span></div></div><div><div><div>47</div></div><div><span>    </span><span>function</span><span> </span><span>getGreetingAndAdvice</span><span>() {</span></div></div><div><div><div>48</div></div><div><span>        </span><span>const</span><span> </span><span>hour</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Date</span><span>().</span><span>getHours</span><span>();</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>        </span><span>if</span><span><span> (</span><span>hour</span><span> </span></span><span>&lt;</span><span> </span><span>6</span><span>) {</span></div></div><div><div><div>51</div></div><div><span>            </span><span>return</span><span> {</span></div></div><div><div><div>52</div></div><div><span>                </span><span>greeting</span><span>:</span><span> </span><span>"🌛 深夜好呀 👋"</span><span>,</span></div></div><div><div><div>53</div></div><div><span>                </span><span>advice</span><span>:</span><span> </span><span>"🌙这么晚还不睡嘛，不要熬夜，早点休息啦！🌙"</span></div></div><div><div><div>54</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>hour</span><span> </span></span><span>&lt;</span><span> </span><span>11</span><span>) {</span></div></div><div><div><div>56</div></div><div><span>            </span><span>return</span><span> {</span></div></div><div><div><div>57</div></div><div><span>                </span><span>greeting</span><span>:</span><span> </span><span>"🌞 早上好呀 👋"</span><span>,</span></div></div><div><div><div>58</div></div><div><span>                </span><span>advice</span><span>:</span><span> </span><span>"💪新的一天！ 充满活力！💪"</span></div></div><div><div><div>59</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>60</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>hour</span><span> </span></span><span>&lt;</span><span> </span><span>13</span><span>) {</span></div></div><div><div><div>61</div></div><div><span>            </span><span>return</span><span> {</span></div></div><div><div><div>62</div></div><div><span>                </span><span>greeting</span><span>:</span><span> </span><span>"🍽️ 中午好呀 👋"</span><span>,</span></div></div><div><div><div>63</div></div><div><span>                </span><span>advice</span><span>:</span><span> </span><span>"🍔别忘了享受一顿美味的午餐！🍔"</span></div></div><div><div><div>64</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>65</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>hour</span><span> </span></span><span>&lt;</span><span> </span><span>18</span><span>) {</span></div></div><div><div><div>66</div></div><div><span>            </span><span>return</span><span> {</span></div></div><div><div><div>67</div></div><div><span>                </span><span>greeting</span><span>:</span><span> </span><span>"☕ 下午好呀 👋"</span><span>,</span></div></div><div><div><div>68</div></div><div><span>                </span><span>advice</span><span>:</span><span> </span><span>"🍵休息一下，喝杯咖啡吧！🍵"</span></div></div><div><div><div>69</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>70</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> </span><span>if</span><span><span> (</span><span>hour</span><span> </span></span><span>&lt;</span><span> </span><span>22</span><span>) {</span></div></div><div><div><div>71</div></div><div><span>            </span><span>return</span><span> {</span></div></div><div><div><div>72</div></div><div><span>                </span><span>greeting</span><span>:</span><span> </span><span>"🌜 晚上好呀 👋"</span><span>,</span></div></div><div><div><div>73</div></div><div><span>                </span><span>advice</span><span>:</span><span> </span><span>"🌃放松心情，享受夜晚的宁静！🌃"</span></div></div><div><div><div>74</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>75</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>76</div></div><div><span>            </span><span>return</span><span> {</span></div></div><div><div><div>77</div></div><div><span>                </span><span>greeting</span><span>:</span><span> </span><span>"🌛 深夜好呀 👋"</span><span>,</span></div></div><div><div><div>78</div></div><div><span>                </span><span>advice</span><span>:</span><span> </span><span>"🌙这么晚还不睡嘛，不要熬夜，早点休息啦！🌙"</span></div></div><div><div><div>79</div></div><div><span><span>            </span></span><span>};</span></div></div><div><div><div>80</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>81</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>82</div></div><div>
</div></div><div><div><div>83</div></div><div><span>    </span><span>/** 角度转弧度 */</span></div></div><div><div><div>84</div></div><div><span>    </span><span>function</span><span> </span><span>toRadians</span><span><span>(</span><span>degrees</span><span>) {</span></span></div></div><div><div><div>85</div></div><div><span>        </span><span>return</span><span><span> </span><span>degrees</span><span> </span></span><span>*</span><span><span> (</span><span>Math</span><span>.</span></span><span>PI</span><span> </span><span>/</span><span> </span><span>180</span><span>);</span></div></div><div><div><div>86</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>87</div></div><div>
</div></div><div><div><div>88</div></div><div><span>    </span><span>/** 根据经纬度计算与“本站”之间的距离（km） */</span></div></div><div><div><div>89</div></div><div><span>    </span><span>function</span><span> </span><span>calculateDistance</span><span><span>(</span><span>lat</span><span>, </span><span>lng</span><span>) {</span></span></div></div><div><div><div>90</div></div><div><span>        </span><span>// 地球半径 km</span></div></div><div><div><div>91</div></div><div><span>        </span><span>const</span><span> </span><span>R</span><span> </span><span>=</span><span> </span><span>6371</span><span>;</span></div></div><div><div><div>92</div></div><div><span>        </span><span>// 自定义纬度</span></div></div><div><div><div>93</div></div><div><span>        </span><span>const</span><span> </span><span>customLat</span><span> </span><span>=</span><span> </span><span>0.0</span><span>;</span></div></div><div><div><div>94</div></div><div><span>        </span><span>// 自定义经度</span></div></div><div><div><div>95</div></div><div><span>        </span><span>const</span><span> </span><span>customLng</span><span> </span><span>=</span><span> </span><span>0.0</span><span>;</span></div></div><div><div><div>96</div></div><div>
</div></div><div><div><div>97</div></div><div><span>        </span><span>const</span><span> </span><span>dLat</span><span> </span><span>=</span><span> </span><span>toRadians</span><span><span>(</span><span>lat</span><span> </span></span><span>-</span><span><span> </span><span>customLat</span><span>);</span></span></div></div><div><div><div>98</div></div><div><span>        </span><span>const</span><span> </span><span>dLon</span><span> </span><span>=</span><span> </span><span>toRadians</span><span><span>(</span><span>lng</span><span> </span></span><span>-</span><span><span> </span><span>customLng</span><span>);</span></span></div></div><div><div><div>99</div></div><div>
</div></div><div><div><div>100</div></div><div><span>        </span><span>const</span><span> </span><span>a</span><span> </span><span>=</span></div></div><div><div><div>101</div></div><div><span><span>            </span></span><span>Math</span><span>.</span><span>sin</span><span><span>(</span><span>dLat</span><span> </span></span><span>/</span><span> </span><span>2</span><span>) </span><span>**</span><span> </span><span>2</span><span> </span><span>+</span></div></div><div><div><div>102</div></div><div><span><span>            </span></span><span>Math</span><span>.</span><span>cos</span><span>(</span><span>toRadians</span><span><span>(</span><span>customLat</span><span>)) </span></span><span>*</span></div></div><div><div><div>103</div></div><div><span><span>            </span></span><span>Math</span><span>.</span><span>cos</span><span>(</span><span>toRadians</span><span><span>(</span><span>lat</span><span>)) </span></span><span>*</span></div></div><div><div><div>104</div></div><div><span><span>            </span></span><span>Math</span><span>.</span><span>sin</span><span><span>(</span><span>dLon</span><span> </span></span><span>/</span><span> </span><span>2</span><span>) </span><span>**</span><span> </span><span>2</span><span>;</span></div></div><div><div><div>105</div></div><div>
</div></div><div><div><div>106</div></div><div><span>        </span><span>const</span><span> </span><span>c</span><span> </span><span>=</span><span> </span><span>2</span><span> </span><span>*</span><span><span> </span><span>Math</span><span>.</span></span><span>atan2</span><span><span>(</span><span>Math</span><span>.</span></span><span>sqrt</span><span><span>(</span><span>a</span><span>), </span><span>Math</span><span>.</span></span><span>sqrt</span><span>(</span><span>1</span><span> </span><span>-</span><span><span> </span><span>a</span><span>));</span></span></div></div><div><div><div>107</div></div><div><span>        </span><span>return</span><span> (</span><span>R</span><span> </span><span>*</span><span><span> </span><span>c</span><span>).</span></span><span>toFixed</span><span>(</span><span>2</span><span>);</span></div></div><div><div><div>108</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>109</div></div><div>
</div></div><div><div><div>110</div></div><div><span>    </span><span>/***********************</span></div></div><div><div><div>111</div></div><div><span><span>     </span></span><span>* 网络请求</span></div></div><div><div><div>112</div></div><div><span><span>     </span></span><span>***********************/</span></div></div><div><div><div>113</div></div><div>
</div></div><div><div><div>114</div></div><div><span>    </span><span>/** 获取当前访问者的 IP 与地理位置信息 */</span></div></div><div><div><div>115</div></div><div><span>    </span><span>async</span><span> </span><span>function</span><span> </span><span>fetchLocation</span><span>() {</span></div></div><div><div><div>116</div></div><div><span>        </span><span>// 拼接上你的key</span></div></div><div><div><div>117</div></div><div><span>        </span><span>const</span><span> </span><span>url</span><span> </span><span>=</span><span> </span><span>"https://api.nsmao.net/api/ip/query?key="</span><span>;</span></div></div><div><div><div>118</div></div><div><span>        </span><span>try</span><span> {</span></div></div><div><div><div>119</div></div><div><span>            </span><span>const</span><span> </span><span>res</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>fetch</span><span><span>(</span><span>url</span><span>);</span></span></div></div><div><div><div>120</div></div><div><span>            </span><span>const</span><span> { </span><span>code</span><span>, </span><span>data</span><span> } </span><span>=</span><span> </span><span>await</span><span><span> </span><span>res</span><span>.</span></span><span>json</span><span>();</span></div></div><div><div><div>121</div></div><div><span>            </span><span>if</span><span><span> (</span><span>code</span><span> </span></span><span>===</span><span> </span><span>200</span><span>) {</span></div></div><div><div><div>122</div></div><div><span>                </span><span>return</span><span> {</span></div></div><div><div><div>123</div></div><div><span>                    </span><span>ip</span><span>:</span><span><span> </span><span>data</span><span>.</span></span><span>ip</span><span>,</span></div></div><div><div><div>124</div></div><div><span>                    </span><span>country</span><span>:</span><span><span> </span><span>data</span><span>.</span></span><span>country</span><span>,</span></div></div><div><div><div>125</div></div><div><span>                    </span><span>province</span><span>:</span><span><span> </span><span>data</span><span>.</span></span><span>prov</span><span>,</span></div></div><div><div><div>126</div></div><div><span>                    </span><span>city</span><span>:</span><span><span> </span><span>data</span><span>.</span></span><span>city</span><span>,</span></div></div><div><div><div>127</div></div><div><span>                    </span><span>district</span><span>:</span><span><span> </span><span>data</span><span>.</span></span><span>district</span><span>,</span></div></div><div><div><div>128</div></div><div><span>                    </span><span>adcode</span><span>:</span><span><span> </span><span>data</span><span>.</span></span><span>adcode</span><span>,</span></div></div><div><div><div>129</div></div><div><span>                    </span><span>length</span><span>:</span><span> </span><span>calculateDistance</span><span><span>(</span><span>data</span><span>.</span></span><span>lat</span><span><span>, </span><span>data</span><span>.</span></span><span>lng</span><span>)</span></div></div><div><div><div>130</div></div><div><span><span>                </span></span><span>};</span></div></div><div><div><div>131</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>132</div></div><div><span><span>        </span></span><span>} </span><span>catch</span><span><span> (</span><span>e</span><span>) {</span></span></div></div><div><div><div>133</div></div><div><span><span>            </span></span><span>console</span><span>.</span><span>error</span><span>(</span><span>"获取地理位置失败："</span><span><span>, </span><span>e</span><span>);</span></span></div></div><div><div><div>134</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>135</div></div><div><span>        </span><span>return</span><span> </span><span>null</span><span>;</span></div></div><div><div><div>136</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>137</div></div><div>
</div></div><div><div><div>138</div></div><div><span>    </span><span>/***********************</span></div></div><div><div><div>139</div></div><div><span><span>     </span></span><span>* 渲染逻辑</span></div></div><div><div><div>140</div></div><div><span><span>     </span></span><span>***********************/</span></div></div><div><div><div>141</div></div><div>
</div></div><div><div><div>142</div></div><div><span>    </span><span>/** 将获取到的信息渲染到欢迎区域 */</span></div></div><div><div><div>143</div></div><div><span>    </span><span>function</span><span> </span><span>renderWelcomeMessage</span><span><span>(</span><span>location</span><span>) {</span></span></div></div><div><div><div>144</div></div><div><span>        </span><span>const</span><span> { </span><span>greeting</span><span>, </span><span>advice</span><span> } </span><span>=</span><span> </span><span>getGreetingAndAdvice</span><span>();</span></div></div><div><div><div>145</div></div><div><span><span>        </span></span><span>document</span><span>.</span><span>getElementById</span><span>(</span><span>"welcomeMessage"</span><span>).</span><span>innerHTML</span><span> </span><span>=</span><span> </span><span>`</span></div></div><div><div><div>146</div></div><div><span><span>                </span></span><span>&lt;p class="align-center"&gt;&lt;strong&gt;</span><span>${</span><span>greeting</span><span>}</span><span>&lt;/strong&gt;&lt;/p&gt;</span></div></div><div><div><div>147</div></div><div><span><span>                </span></span><span>&lt;p&gt;</span></div></div><div><div><div>148</div></div><div><span><span>                    </span></span><span>欢迎来自</span></div></div><div><div><div>149</div></div><div><span><span>                    </span></span><span>&lt;strong class="font-color"&gt;</span><span>${</span><span>location</span><span>.</span><span>province</span><span>}</span><span>&lt;/strong&gt;</span></div></div><div><div><div>150</div></div><div><span><span>                    </span></span><span>&lt;strong class="font-color"&gt;</span><span>${</span><span>location</span><span>.</span><span>city</span><span>}</span><span>&lt;/strong&gt;</span></div></div><div><div><div>151</div></div><div><span><span>                    </span></span><span>&lt;strong class="font-color"&gt;</span><span>${</span><span>location</span><span>.</span><span>district</span><span>}</span><span>&lt;/strong&gt;</span></div></div><div><div><div>152</div></div><div><span><span>                    </span></span><span>的小伙伴！</span></div></div><div><div><div>153</div></div><div><span><span>                </span></span><span>&lt;/p&gt;</span></div></div><div><div><div>154</div></div><div><span><span>                </span></span><span>&lt;p class="align-center"&gt;</span><span>${</span><span>advice</span><span>}</span><span>&lt;/p&gt;</span></div></div><div><div><div>155</div></div><div><span><span>                </span></span><span>&lt;p class="align-center"&gt;</span></div></div><div><div><div>156</div></div><div><span><span>                    </span></span><span>🌍 您当前的 IP 是</span></div></div><div><div><div>157</div></div><div><span><span>                    </span></span><span>&lt;strong&gt;&lt;span class="ip-mask font-color"&gt;</span><span>${</span><span>location</span><span>.</span><span>ip</span><span>}</span><span>&lt;/span&gt;&lt;/strong&gt; 🌍</span></div></div><div><div><div>158</div></div><div><span><span>                </span></span><span>&lt;/p&gt;</span></div></div><div><div><div>159</div></div><div><span><span>                </span></span><span>&lt;p class="align-center"&gt;</span></div></div><div><div><div>160</div></div><div><span><span>                    </span></span><span>📍 距离 &lt;strong class="font-color"&gt;本站&lt;/strong&gt; 约</span></div></div><div><div><div>161</div></div><div><span><span>                    </span></span><span>&lt;strong class="font-color"&gt;</span><span>${</span><span>location</span><span>.</span><span>length</span><span>}</span><span>&lt;/strong&gt; 公里哦！📍</span></div></div><div><div><div>162</div></div><div><span><span>                </span></span><span>&lt;/p&gt;</span></div></div><div><div><div>163</div></div><div><span><span>                </span></span><span>&lt;hr /&gt;</span></div></div><div><div><div>164</div></div><div><span><span>            </span></span><span>`</span><span>;</span></div></div><div><div><div>165</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>166</div></div><div>
</div></div><div><div><div>167</div></div><div><span>    </span><span>/** 初始化：获取地理位置并渲染 */</span></div></div><div><div><div>168</div></div><div><span>    </span><span>async</span><span> </span><span>function</span><span> </span><span>init</span><span>() {</span></div></div><div><div><div>169</div></div><div><span>        </span><span>const</span><span> </span><span>location</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>fetchLocation</span><span>();</span></div></div><div><div><div>170</div></div><div><span>        </span><span>if</span><span><span> (</span><span>location</span><span>) {</span></span></div></div><div><div><div>171</div></div><div><span>            </span><span>renderWelcomeMessage</span><span><span>(</span><span>location</span><span>);</span></span></div></div><div><div><div>172</div></div><div><span><span>        </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>173</div></div><div><span><span>            </span></span><span>document</span><span>.</span><span>getElementById</span><span>(</span><span>"welcomeMessage"</span><span>).</span><span>innerHTML</span><span> </span><span>=</span></div></div><div><div><div>174</div></div><div><span>                </span><span>`&lt;p&gt;🌍 这位小伙伴，你似乎迷失了~🌍&lt;/p&gt;</span></div></div><div><div><div>175</div></div><div><span><span>                     </span></span><span>&lt;p&gt;获取位置信息失败，请稍后再试~😅&lt;p&gt;`</span><span>;</span></div></div><div><div><div>176</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>177</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>178</div></div><div>
</div></div><div><div><div>179</div></div><div><span>    </span><span>/***********************</span></div></div><div><div><div>180</div></div><div><span><span>     </span></span><span>* 入口</span></div></div><div><div><div>181</div></div><div><span><span>     </span></span><span>***********************/</span></div></div><div><div><div>182</div></div><div>
</div></div><div><div><div>183</div></div><div><span>    </span><span>// 兼容各种加载状态</span></div></div><div><div><div>184</div></div><div><span>    </span><span>if</span><span><span> (</span><span>document</span><span>.</span></span><span>readyState</span><span> </span><span>===</span><span> </span><span>"loading"</span><span>) {</span></div></div><div><div><div>185</div></div><div><span><span>        </span></span><span>document</span><span>.</span><span>addEventListener</span><span>(</span><span>"DOMContentLoaded"</span><span><span>, </span><span>init</span><span>);</span></span></div></div><div><div><div>186</div></div><div><span><span>    </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>187</div></div><div><span>        </span><span>init</span><span>();</span></div></div><div><div><div>188</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>189</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>以上有几个需要进行配置的地方：</p><ul>
<li>
<p><code>customLat</code>（纬度）和<code>customLng</code>（经度）分别代表自定义的经纬度，默认是<code>0.0</code>，你可以设置成任何位置，同时也可以一并修改描述信息<code>&lt;strong class="font-color"&gt;本站&lt;/strong&gt;</code>，将<code>本站</code>改为你的目标地点名称。</p>
</li>
<li>
<p><code>const url = "https://api.nsmao.net/api/ip/query?key=";</code>这里的key需要自行拼接上刚才在<strong>Nice猫</strong>生成的key</p>
</li>
</ul><p>经纬度的获取也非常方便，直接使用百度坐标拾取器就行</p><p><a href="https://lbs.baidu.com/maptool/getpoint" target="_blank">https://lbs.baidu.com/maptool/getpoint</a></p><p>最后，把代码复制进<code>自定义模块</code>侧边栏的<code>侧边栏内容</code>里就大功告成了。</p><p></p><figure><img alt="自定义模块侧边栏配置" loading="lazy" width="549" height="720" src="/_astro/halo-dream2.0plus-3.CBjCLzaQ_Z1PJyRN.webp" /><figcaption>自定义模块侧边栏配置</figcaption></figure><p></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/uptimekuma-install/</id>
      <title type="text">四个步骤使用UptimeKuma搭建状态监测站</title>
      <published>2025-08-24T23:36:00.000Z</published>
      <updated>2025-08-24T23:36:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/uptimekuma-install/"/>
      <summary type="text">使用Docker四步部署UptimeKuma自托管监控工具，实现域名与中间件服务状态监测及SSL到期提醒</summary>
      <content type="html"><![CDATA[<section><h2>简介<a href="#简介"><span>#</span></a></h2><p>UptimeKuma是一个开源的自托管监控工具，详情可见Github</p><p><a href="https://github.com/louislam/uptime-kuma" target="_blank">https://github.com/louislam/uptime-kuma</a></p><p>它可以帮助我们定时监控目标域名或中间件服务的运行状态，同时提供SSL证书到期提示的能力。本站的ElysiumKuma监测站便是基于UptimeKuma容器来进行部署的</p><p><a href="https://kuma.elysium-stack.cn/manage-status-page" target="_blank">https://kuma.elysium-stack.cn/manage-status-page</a></p><p>UptimeKuma的部署方式也非常简单，只需进行一些细节的配置便可进行使用，那么和往常一样，笔者还是以docker容器化部署来详细说明过程中的要点。本文全程会使用docker，如果不会部署docker，可以参考我的这篇文章</p><p><a href="https://www.elysium-stack.cn/archives/docker-install" target="_blank">https://www.elysium-stack.cn/archives/docker-install</a></p></section>
<section><h2>第一步：拉取uptime-kuma镜像<a href="#第一步拉取uptime-kuma镜像"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span> </span></span><span>docker pull louislam/uptime-kuma:1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>由于dockerhub在国内访问受限，如果拉取失败请更换镜像源/添加镜像加速。</p></blockquote></section>
<section><h2>第二步：创建运行kuma容器<a href="#第二步创建运行kuma容器"><span>#</span></a></h2><p>一行命令搞定</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>docker run -d --restart=always -p 3003:3001 -v /data/uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>这里有两个需要注意的地方：</div></div><div><ol>
<li>
<p><code>-p 3003:3001</code> kuma容器内的运行端口是<code>3001</code>，由于笔者的服务器中<code>3001</code>端口被Meting占用，因此映射到了<code>3003</code>，请根据自己的服务器的实际情况调整。</p>
</li>
<li>
<p><code>-v /data/uptime-kuma:/app/data</code> kuma在容器内部的安装目录在<code>/app/data</code>下，而<code>/data/uptime-kuma</code>是笔者自定义的本地挂载目录，可以改成本地其他目录，请根据实际需要调整。</p>
</li>
</ol></div></div></section>
<section><h2>第三步：访问kuma控制台<a href="#第三步访问kuma控制台"><span>#</span></a></h2><p>浏览器访问<code>ip+映射端口号</code>，例如笔者的就是<code>http://x.x.x.x:3003</code></p><p></p><figure><img alt="UptimeKuma控制台" loading="lazy" width="1716" height="788" src="/_astro/uptimekuma-install-1.iFhpajec_2lUUVF.webp" /><figcaption>UptimeKuma控制台</figcaption></figure><p></p><p>首次访问需要配置管理员账号，按步骤操作，随后使用管理员账号登录即可。</p></section>
<section><h2>第四步：添加监控项及状态页面<a href="#第四步添加监控项及状态页面"><span>#</span></a></h2><p>点击添加监控项，在右侧的页面中配置需要监控的内容</p><p></p><figure><img alt="添加监控项" loading="lazy" width="1870" height="1200" src="/_astro/uptimekuma-install-2.D2VXPojd_Z2kefS8.webp" /><figcaption>添加监控项</figcaption></figure><p></p><p>可以监控的类型有很多，大家可以自行研究</p><p></p><figure><img alt="监控类型列表" loading="lazy" width="584" height="663" src="/_astro/uptimekuma-install-3.DSFw26nk_Z23h5r4.webp" /><figcaption>监控类型列表</figcaption></figure><p></p><p>添加完成后，可以在左侧的列表中看到已经配置的监控内容</p><p></p><figure><img alt="已配置的监控列表" loading="lazy" width="608" height="635" src="/_astro/uptimekuma-install-4.BJNNukeA_16jaJb.webp" /><figcaption>已配置的监控列表</figcaption></figure><p></p><p>接着点击状态页面，创建一个状态页</p><p></p><figure><img alt="创建状态页面" loading="lazy" width="1872" height="666" src="/_astro/uptimekuma-install-5.CVh3uFCf_Z1x6l4.webp" /><figcaption>创建状态页面</figcaption></figure><p></p><p>需要注意的是<code>路径</code>是访问状态页面的地址拼接，之后在你需要进行页面跳转的地方会用到，不要和其它页面路由冲突</p><p></p><figure><img alt="状态页面路径配置" loading="lazy" width="1229" height="400" src="/_astro/uptimekuma-install-6.CchBJgAh_218fbx.webp" /><figcaption>状态页面路径配置</figcaption></figure><p></p><p>添加完<code>状态页面</code>后，点击新增的记录，随后点击<code>添加监控项</code>配置需要展示的监控项，也可以<code>添加分组</code>便于分类。例如笔者先添加了<code>主站</code>组和<code>友情链接</code>组，根据分组点击把监控项拖进对应的分组，最后点击<code>保存</code></p><p></p><figure><img alt="添加监控项到分组" loading="lazy" width="1865" height="1199" src="/_astro/uptimekuma-install-7.BX70AFvP_2a56O4.webp" /><figcaption>添加监控项到分组</figcaption></figure><p></p><p>至此，一个属于你自己的kuma监测站就完成了，复制页面地址，将其配置在你需要进行跳转的位置即可~</p><p></p><figure><img alt="UptimeKuma监测站完成效果" loading="lazy" width="1748" height="1369" src="/_astro/uptimekuma-install-8.wJu-De7R_1sjxz7.webp" /><figcaption>UptimeKuma监测站完成效果</figcaption></figure><p></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/ssl-security/</id>
      <title type="text">自签证书真的安全吗？什么是中间人攻击？</title>
      <published>2025-08-18T20:59:00.000Z</published>
      <updated>2025-08-18T20:59:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/ssl-security/"/>
      <summary type="text">分析自签证书在不同场景下的安全性，讲解中间人攻击的原理、类型及常见防御手段</summary>
      <content type="html"><![CDATA[<p>关于如何制作自签证书，笔者在这篇文章中有详细的讲解</p>
<ul>
<li><a href="https://www.elysium-stack.cn/archives/Self-Signed%20SSL%20Certification" target="_blank">《自建CA证书与带CA的SSL自签证书》</a></li>
</ul>
<p>本篇文章会作为补充，说明自签证书的风险，以及何种情况下能使用，何种情况下不能使用，在介绍这些之前我们先来看一个问题：</p>
<section><h2><strong>自签证书究竟安不安全？</strong><a href="#自签证书究竟安不安全"><span>#</span></a></h2><p><strong>安全但也不安全！</strong></p><p>看似说了句废话，但确实如此，我们需要根据不同的场景来分析这个问题。</p><p>首先，我们在上一篇文章中说过，证书一般由受信任的第三方CA来签发，这就意味着应用系统必须部署在能够被CA验证到的地方，也就是公网环境，但并不是所有的应用系统一定会部署在公网，比如企业的OA系统、银行的清分系统等等，这些系统通常会部署在内网环境，因此需要使用自签证书。</p><p>其次自签证书由于是由不受信任的CA签发，因此绝大多数的浏览器也不会信任这些网站，同时还会弹出警告提醒用户甄别。</p><p></p><figure><img alt="浏览器自签证书警告" loading="lazy" width="1340" height="68" src="/_astro/custom-ssl-3.aZQIPAiH_Z2lhXd8.webp" /><figcaption>浏览器自签证书警告</figcaption></figure><p></p><div><div><div></div><div>从加密手段上来说，自签证书是安全的，但是对于整个系统的生态来说，自签证书也是不安全的。</div></div><div></div></div></section>
<section><h2>自签证书何时安全？何时不安全？<a href="#自签证书何时安全何时不安全"><span>#</span></a></h2><p>笔者整理了一张表格，相信聪明的你看完就能明白~</p>

<table><thead><tr><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>场景</td><td></td><td>安全性</td><td>说明</td></tr><tr><td>本地开发环境</td><td></td><td>安全</td><td>数据流只会在自己的机器或者容器里打转，几乎不会受到攻击。</td></tr><tr><td>内网环境</td><td>未安装证书</td><td>危险</td><td>自签证书必须通过内网DNS服务器配置或者终端进行安装才能生效，否则无法抵御<strong>中间人攻击</strong>。</td></tr><tr><td>所有设备安装证书</td><td>安全</td><td>自己当<strong>CA</strong>自己签发证书自己批量安装证书使所有设备受信，整个链路完整，浏览器不会弹出警告，能在一定程度上抵御<strong>中间人攻击</strong>。</td><td></td></tr><tr><td>公网环境</td><td></td><td>危险</td><td>自签证书不受CA认证，赤裸裸的活靶子，无法抵御<strong>中间人攻击</strong>。</td></tr></tbody></table></section>
<section><h2>什么是<strong>中间人攻击</strong><a href="#什么是中间人攻击"><span>#</span></a></h2><p><strong>中间人攻击</strong>，全称<strong>Man-in-the-Middle Attack</strong>（简称<strong>MitM</strong>），攻击者通过一些技术手段将自己置于用户与目标服务之间的通信链路中，扮演“中间人”的角色，看似是用户直接访问了服务，实际上用户的访问首先经过了“中间人”，再到达目标服务，从而实现：</p><ul>
<li>
<p><strong>窃听</strong>：监听并窃取敏感信息。</p>
</li>
<li>
<p><strong>篡改</strong>：修改通信内容。</p>
</li>
<li>
<p><strong>会话劫持</strong>：窃取用户的会话令牌，冒充用户身份。</p>
</li>
<li>
<p><strong>伪装</strong>：伪造身份，欺骗通信双方。</p>
</li>
</ul><p>按照<strong>攻击类型</strong>，笔者粗略整理了六大类攻击类型：</p><ul>
<li>
<p><strong>WiFi假冒</strong>：攻击者创建恶意的WiFi热点，名称与合法热点相似，诱导用户连接，从而截获流量。</p>
</li>
<li>
<p><strong>DNS劫持</strong>：攻击者伪造ARP响应包，将自己的MAC地址伪装成网关或其他主机的MAC地址，从而截获局域网流量。</p>
</li>
<li>
<p><strong>SSL劫持</strong>：攻击者伪造或盗用合法网站的SSL证书，欺骗用户浏览器，使其误以为连接的是安全网站。</p>
</li>
<li>
<p><strong>邮件劫持</strong>：攻击者置己于发送方与接收方之间，截获、篡改甚至重定向邮件流量。</p>
</li>
<li>
<p><strong>ARP欺骗</strong>：攻击者篡改DNS解析结果，将用户访问的合法网站域名解析到恶意的IP地址，从而将用户重定向到钓鱼网站。</p>
</li>
<li>
<p><strong>SSL剥离</strong>：攻击者拦截用户与服务器之间的HTTPS连接请求，强制降级为不安全的HTTP连接，从而以明文方式窃取数据。</p>
</li>
</ul></section>
<section><h2><strong>如何抵御中间人攻击</strong><a href="#如何抵御中间人攻击"><span>#</span></a></h2><p>笔者整理了一些技术层面常用的防护手段，如：</p><ul>
<li>
<p>强制使用HTTPS加密</p>
</li>
<li>
<p>验证SSL证书</p>
</li>
<li>
<p>实施证书固定</p>
</li>
<li>
<p>采取端到端加密</p>
</li>
<li>
<p>使用VPN</p>
</li>
<li>
<p>etc.</p>
</li>
</ul><p>防护的手段不止局限于技术层面，人为层面的防护也尤为重要，凡事没有绝对，网络安全亦是如此，而我们需要做的就是不断去完善、持续去迭代防御体系，把中间人攻击的发生概率和造成的影响降到最低。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/custom-ssl/</id>
      <title type="text">自建CA证书与带CA的SSL自签证书</title>
      <published>2025-08-13T16:39:00.000Z</published>
      <updated>2025-08-13T16:39:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/custom-ssl/"/>
      <summary type="text">使用OpenSSL自建CA并签发带CA的SSL自签证书，涵盖密钥生成、证书签发及域名绑定全流程</summary>
      <content type="html"><![CDATA[<section><h2>①基本概念<a href="#基本概念"><span>#</span></a></h2><section><h4><strong>HTTP(Hypertext Transfer Protocol)</strong><a href="#httphypertext-transfer-protocol"><span>#</span></a></h4><ul>
<li><strong>超文本传输协议</strong>，使用该协议进行访问的数据是没有任何加密措施的，任何人都可以使用监听等手段窃取传输过程中的信息数据，因此是一种<strong>不安全的传输协议</strong>。</li>
</ul></section><section><h4><strong>HTTPS(Hypertext Transfer Protocol Secure)</strong><a href="#httpshypertext-transfer-protocol-secure"><span>#</span></a></h4><ul>
<li><strong>超文本传输安全协议</strong>，基于<strong>HTTP</strong>的基础之上结合了<strong>SSL</strong>与<strong>TLS</strong>协议，提供了加密通讯以及服务器身份鉴定的能力，是一种<strong>安全的传输协议</strong>。</li>
</ul></section><section><h4><strong>SSL(Secure Socket Layer)</strong><a href="#sslsecure-socket-layer"><span>#</span></a></h4><ul>
<li><strong>安全套接层</strong>，通俗点说就是数据加密，它的作用就是对服务器与客户端之间传输的数据流进行加密。</li>
</ul></section><section><h4><strong>SSL证书</strong><a href="#ssl证书"><span>#</span></a></h4><ul>
<li>可以理解为服务器的“营业执照”，通常由<strong>公认受信的互联网数字证书颁发机构</strong>，也就是<strong>CA(Certificate Authority)</strong>，经过服务器身份验证后所签发的“营业执照”，即<strong>SSL证书</strong></li>
</ul></section><section><h4><strong>域名</strong><a href="#域名"><span>#</span></a></h4><ul>
<li>可以理解为一个网站的标识符，访问一个网站需要知道对应服务器的IP地址，但是如果靠IP地址来记忆对应的网站着实有些麻烦，而域名的存在便是简化了这种访问成本，例如本站的域名是<code>elysium-stack.cn</code>，当你访问本站时你不需要知道本站的IP是什么，DNS服务器会自动将域名进行解析并找到对应的站点IP地址，从而进一步访问，<strong>通常域名会与SSL证书进行绑定</strong>。</li>
</ul></section></section>
<section><h2>②为什么要使用SSL证书<a href="#为什么要使用ssl证书"><span>#</span></a></h2><p>最根本的目的是<strong>保护数据在传输过程中的安全！<strong>如果你的系统要做</strong>信息安全等级保护</strong>（<strong>等保测评</strong>），那么就必须要使用基于<strong>HTTPS</strong>协议的安全连接。那么你可能发现了一个问题：</p><p>Q：如果我的系统部署在内网，<em><strong>CA</strong>没办法验证我的服务器，那我不是就拿不到<strong>公认CA</strong>签发的<strong>SSL证书</strong>了吗？</em></p><p>A：确实如此，但是我们可以<strong>自建CA</strong>同时<strong>自己签发证书</strong></p></section>
<section><h2><strong>③什么是自签证书</strong><a href="#什么是自签证书"><span>#</span></a></h2><p>自签证书是<strong>不受信任的CA</strong>所签发的<strong>SSL证书</strong>，讲人话就是自己手搓的<strong>SSL</strong>证书，自签证书可以分为两种：</p><ul>
<li>
<p><strong>带CA的自签证书</strong></p>
<ul>
<li>先手搓一个<strong>CA</strong>，然后再手搓一张<strong>SSL证书</strong>，同时使用自己的<strong>CA</strong>来进行证书的签发，便于管理与控制证书吊销等操作，一般会用这个（本文也将以此为例）。</li>
</ul>
</li>
<li>
<p><strong>不带CA的自签证书</strong></p>
<ul>
<li>直接手搓一张<strong>SSL证书</strong>。</li>
</ul>
</li>
</ul></section>
<section><h2><strong>④创建CA证书与自签证书</strong><a href="#创建ca证书与自签证书"><span>#</span></a></h2><p>正片开始 接下来笔者会详细说明如何创建自己的<strong>CA</strong>以及如何通过自己的<strong>CA</strong>来签发证书</p><ul>
<li>
<p>前置条件：</p>
<ul>
<li>
<p>一台<strong>linux</strong>服务器或<strong>mac</strong>电脑</p>
</li>
<li>
<p><strong>OpenSSL</strong>库（笔者的版本是<code>3.0.13</code>）</p>
</li>
<li>
<p>一个自定义的域名且<strong>必须要满足域名的命名规则</strong></p>
</li>
</ul>
</li>
</ul><blockquote><p>以下笔者会以test.study.cn域名为例</p></blockquote><section><h3>第一步：创建自定义CA密钥<a href="#第一步创建自定义ca密钥"><span>#</span></a></h3><p>在控制台中输入以下命令</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># customCA这个名字可以自己改</span></div></div><div><div><div>2</div></div><div><span>openssl genrsa -des3 -out customCA.key 2048</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>接着会提示<code>Enter PEM pass phrase</code>与<code>Verifying - Enter PEM pass phrase</code>，创建密码同时会有二次确认，<strong>记住这个密码，后面会用到！</strong></p><p></p><figure><img alt="创建CA密钥" loading="lazy" width="781" height="100" src="/_astro/custom-ssl-1.D0J33bOf_cQqQu.webp" /><figcaption>创建CA密钥</figcaption></figure><p></p><p>然后在目录中会自动生成文件<code>customCA.key</code></p><p></p><figure><img alt="CA密钥文件生成" loading="lazy" width="820" height="74" src="/_astro/custom-ssl-2.Cxc5r537_15znCa.webp" /><figcaption>CA密钥文件生成</figcaption></figure><p></p></section><section><h3>第二步：根据CA密钥，创建CA证书<a href="#第二步根据ca密钥创建ca证书"><span>#</span></a></h3><p>在控制台中输入以下命令</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># customCA.key是第一步中生成的，3650是证书的有效期（单位：天），那这里就是10年的有效期</span></div></div><div><div><div>2</div></div><div><span>openssl req -x509 -new -nodes -key customCA.key -sha256 -days 3650 -out customCA.pem</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>接着会提示<code>Enter pass phrase for customCA.key</code>要求输入第一步中你创建的密码，输入即可</p><p></p><figure><img alt="填写CA证书信息" loading="lazy" width="1340" height="68" src="/_astro/custom-ssl-3.aZQIPAiH_Z2lhXd8.webp" /><figcaption>填写CA证书信息</figcaption></figure><p></p><p>验证通过后需要填写关于<strong>CA</strong>的信息，来看一下都是什么意思：</p>

<table><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td>名称</td><td>填写内容</td><td>示例（说明）</td></tr><tr><td>Country Name (2 letter code) [AU]</td><td>国家代码</td><td>CN（中国）</td></tr><tr><td>State or Province Name (full name) [Some-State]</td><td>省级名称</td><td>Shanghai（上海）</td></tr><tr><td>Locality Name (eg, city) []</td><td>市级名称</td><td>Shanghai（上海）</td></tr><tr><td>Organization Name (eg, company) [Internet Widgits Pty Ltd]</td><td>组织名称</td><td>StudyCA（根据实际修改）</td></tr><tr><td>Organizational Unit Name (eg, section) []</td><td>组织单位名称</td><td>StudyCA（根据实际修改）</td></tr><tr><td>Common Name (e.g. server FQDN or YOUR name) []</td><td>CA证书名称</td><td>Study Cert（根据实际修改）</td></tr><tr><td>Email Address []</td><td>邮箱</td><td>（根据实际填写）</td></tr></tbody></table><p></p><figure><img alt="CA证书信息填写完成" loading="lazy" width="1060" height="425" src="/_astro/custom-ssl-4.BepiS8_F_28QMmS.webp" /><figcaption>CA证书信息填写完成</figcaption></figure><p></p><p>填写完成后，会在目录下生成pem格式的CA证书文件<code>customCA.pem</code>，但我们需要把它转成crt格式，输入以下命令</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># customCA.pem是刚才生成的pem格式证书</span></div></div><div><div><div>2</div></div><div><span>openssl x509 -outform der -in customCA.pem -out customCA.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后我们会得到一个crt格式的CA证书文件<code>customCA.crt</code></p><p></p><figure><img alt="CA证书文件生成" loading="lazy" width="805" height="120" src="/_astro/custom-ssl-5.BSxmtVWc_Z2b6Bs9.webp" /><figcaption>CA证书文件生成</figcaption></figure><p></p></section><section><h3>第三步：创建用以生成域名证书的配置文件<a href="#第三步创建用以生成域名证书的配置文件"><span>#</span></a></h3><p>输入以下命令（一行一行输入）</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cat &gt;&gt; study.ext &lt;&lt;EOF</span></div></div><div><div><div>2</div></div><div><span>authorityKeyIdentifier=keyid,issuer</span></div></div><div><div><div>3</div></div><div><span>basicConstraints=CA:FALSE</span></div></div><div><div><div>4</div></div><div><span>keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment</span></div></div><div><div><div>5</div></div><div><span>subjectAltName=@alt_names</span></div></div><div><div><div>6</div></div><div><span>[alt_names]</span></div></div><div><div><div>7</div></div><div><span># 注意这里test.study.cn是需要关联的域名，替换成你自己的即可</span></div></div><div><div><div>8</div></div><div><span>DNS.1 = test.study.cn</span></div></div><div><div><div>9</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img alt="创建ext配置文件" loading="lazy" width="1210" height="320" src="/_astro/custom-ssl-6.DH1fwIe9_tf9wS.webp" /><figcaption>创建ext配置文件</figcaption></figure><p></p><p>然后我们会得到一个<code>study.ext</code>的配置文件</p><p></p><figure><img alt="ext配置文件生成" loading="lazy" width="825" height="146" src="/_astro/custom-ssl-7.Rp76SbxL_Z1QYqgE.webp" /><figcaption>ext配置文件生成</figcaption></figure><p></p></section><section><h3>第四步：创建域名证书密钥<a href="#第四步创建域名证书密钥"><span>#</span></a></h3><p>输入以下命令</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># test.study.cn.csr和test.study.cn.csr.key是域名test.study.cn.csr的密钥</span></div></div><div><div><div>2</div></div><div><span>openssl req -new -sha256 -nodes -out test.study.cn.csr -newkey rsa:2048 -keyout test.study.cn.csr.key</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>接着需要填写关于域名的信息，也还是先看一下都是什么意思：</p>

<table><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td>名称</td><td>填写内容</td><td>示例（说明）</td></tr><tr><td>Country Name (2 letter code) [AU]</td><td>国家代码</td><td>CN（中国）</td></tr><tr><td>State or Province Name (full name) [Some-State]</td><td>省级名称</td><td>Shanghai（上海）</td></tr><tr><td>Locality Name (eg, city) []</td><td>市级名称</td><td>Shanghai（上海）</td></tr><tr><td>Organization Name (eg, company) [Internet Widgits Pty Ltd]</td><td>组织名称</td><td>Study（根据实际修改）</td></tr><tr><td>Organizational Unit Name (eg, section) []</td><td>组织单位名称</td><td>Study（根据实际修改）</td></tr><tr><td>Common Name (e.g. server FQDN or YOUR name) []</td><td>域名</td><td>test.study.cn（根据实际修改）</td></tr><tr><td>Email Address []</td><td>邮箱</td><td>（根据实际填写）</td></tr><tr><td>A challenge password []</td><td>创建私钥保护密码</td><td>（根据实际填写）</td></tr><tr><td>An optional company name []</td><td>额外公司名称</td><td>（根据实际填写）</td></tr></tbody></table><p></p><figure><img alt="填写域名证书信息" loading="lazy" width="2136" height="876" src="/_astro/custom-ssl-8.Cv9PJBCx_ctOe0.webp" /><figcaption>填写域名证书信息</figcaption></figure><p></p></section><section><h3>第五步：根据【第一步的<strong>CA密钥】</strong>、【第二步的<strong>CA证书】</strong>、【第三步的<strong>配置文件】</strong>、【第四步<strong>域名证书密钥】<strong>生成</strong>自签域名证书</strong><a href="#第五步根据第一步的ca密钥第二步的ca证书第三步的配置文件第四步域名证书密钥生成自签域名证书"><span>#</span></a></h3></section><section><h3>只需一行命令，如下：<a href="#只需一行命令如下"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 365是证书的有效期（单位：天），那这里就是1年的有效期</span></div></div><div><div><div>2</div></div><div><span>openssl x509 -req -in test.study.cn.csr -CA customCA.pem -CAkey customCA.key -CAcreateserial -out test.study.cn.crt -days 365 -sha256 -extfile study.ext</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>提示需要输入【第一步的<strong>CA</strong>证书密码】，输入即可</p><p></p><figure><img alt="签发域名证书" loading="lazy" width="2124" height="170" src="/_astro/custom-ssl-9.DsAa-mRz_UnXxp.webp" /><figcaption>签发域名证书</figcaption></figure><p></p><p>完成后，我们就能得到自定义CA证书与域名test.study.cn的SSL自签证书</p><p></p><figure><img alt="CA证书与自签域名证书生成完成" loading="lazy" width="815" height="243" src="/_astro/custom-ssl-10.BtX2PwRY_1EHB5f.webp" /><figcaption>CA证书与自签域名证书生成完成</figcaption></figure><p></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/arknights-maa/</id>
      <title type="text">明日方舟MAA定时自动化一键长草</title>
      <published>2025-07-22T13:19:00.000Z</published>
      <updated>2025-07-22T13:19:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/arknights-maa/"/>
      <summary type="text">介绍如何配置MAA实现明日方舟定时自动化一键长草，涵盖定时执行、模拟器连接、启动设置、外部通知及自动更新等详细配置步骤</summary>
      <content type="html"><![CDATA[<p>今天来记录些不一样的东西，玩过明日方舟的博士们对MAA应该都不会陌生吧，以防有人不知道还是在此简单介绍一下。</p>
<section><h2>什么是MAA<a href="#什么是maa"><span>#</span></a></h2><p><strong>MAA</strong>全称<strong>MaaAssistantArknights</strong>，是各位民间大佬们基于安卓模拟器以及图像识别技术开发的一款自动刷图、自动基建换班以及一键日常的明日方舟减负工具，具体内容可自行查阅官网及开源项目了解。</p><section><h3>MAA官网<a href="#maa官网"><span>#</span></a></h3><p><a href="https://maa.plus/" target="_blank">https://maa.plus/</a></p></section><section><h3>MAA开源项目<a href="#maa开源项目"><span>#</span></a></h3><a href="https://github.com/MaaAssistantArknights/MaaAssistantArknights" target="_blank"><div><div><div><div></div><div>MaaAssistantArknights</div></div><div>/</div><div>MaaAssistantArknights</div></div><div></div></div><div>Repository details unavailable</div><div><div>—</div><div>—</div><div>—</div><span>Unavailable</span></div></a><p>MAA本身的功能实际上已经满足了绝大多数博士们的需求，配合安卓模拟器即可轻松实现一键清理日常，但笔者认为这还不够，有没有一种能够完全解放双手实现全自动化的一键日常的方式呢？答案当然是有的，实际上MAA的开发者们其实也为博士们提供了很多配置功能来辅助实现这样的效果。</p><div><div><div></div><div>前置条件</div></div><div><p>笔者只说明MAA在计算机不断电情况下的自动化配置，如果你不希望电表爆炸，请通过bios或其它工具来实现自动定时开机（MAA本身提供了任务完成后关机的功能），同时请确保你已经安装安卓模拟器，以下会以<code>MuMu模拟器12</code>来说明，以MAA<code>v5.20.0</code>版本为例。</p></div></div><p></p><figure><img alt="MAA主界面" loading="lazy" width="1248" height="771" src="/_astro/arknights-maa-1.D6llGdpn_TXbMq.webp" /><figcaption>MAA主界面</figcaption></figure><p></p></section></section>
<section><h2>1.切换配置【可忽略】<a href="#1切换配置可忽略"><span>#</span></a></h2><p></p><figure><img alt="切换配置" loading="lazy" width="978" height="159" src="/_astro/arknights-maa-2.DuturfkN_ZwXKA1.webp" /><figcaption>切换配置</figcaption></figure><p></p><p>没啥好说的，建议自己新增一个配置出来，直接在<code>配置名称</code>中输入一个新的配置名字，然后点击<code>添加</code>，稍后MAA会重启并加载新的配置</p></section>
<section><h2>2.定时执行<a href="#2定时执行"><span>#</span></a></h2><p></p><figure><img alt="定时执行配置" loading="lazy" width="981" height="294" src="/_astro/arknights-maa-3.DTiXhFMK_NMhgd.webp" /><figcaption>定时执行配置</figcaption></figure><p></p><p>MAA提供了同时设置8个启动时间点的配置，简单说就是你希望MAA什么时候开始进行工作，笔者这里设置的是每8小时工作一次，即早上8点、下午16点和晚上0点，根据需要可自行修改，最后鼠标点击勾选上，左键点击表示循环执行，右键点击表示该时间点在配置完成后只会生效一次，<code>强制定时启动</code>不建议勾选。</p></section>
<section><h2>3.性能设置【可忽略】<a href="#3性能设置可忽略"><span>#</span></a></h2><p></p><figure><img alt="性能设置" loading="lazy" width="960" height="117" src="/_astro/arknights-maa-4.CHRV_Yh4_20LOaP.webp" /><figcaption>性能设置</figcaption></figure><p></p><p>无需修改</p></section>
<section><h2>4.运行设置<a href="#4运行设置"><span>#</span></a></h2><p></p><figure><img alt="运行设置" loading="lazy" width="968" height="473" src="/_astro/arknights-maa-5.B8Rzq8qs_ZBeds1.webp" /><figcaption>运行设置</figcaption></figure><p></p><p>仅客户端类型需要根据不同服务器进行修改，其余项不用调整。</p><div><div><div></div><div><code>开始前脚本</code>与<code>结束后脚本</code>可以根据需要添加一些额外的功能。</div></div><div></div></div></section>
<section><h2>5.连接设置<a href="#5连接设置"><span>#</span></a></h2><p></p><figure><img alt="连接设置" loading="lazy" width="972" height="630" src="/_astro/arknights-maa-6.CoeeX8Jt_Z1q7u3e.webp" /><figcaption>连接设置</figcaption></figure><p></p><p>这里的配置有点多，来看一下几个重点配置项，未提到的项可忽略：</p><ol>
<li>
<p><code>自动检测连接</code>：取消勾选。</p>
</li>
<li>
<p><code>ADB路径（相对/绝对）</code>：选择你的模拟器<code>ADB</code>启动项，以<code>MuMu模拟器12</code>为例，<code>ADB</code>的启动项一般在安装路径下的<code>shell</code>文件夹内，如果你找不到模拟器的安装路径，可以右键模拟器的快捷方式查看属性。</p>
</li>
</ol><p></p><figure><img alt="查看模拟器安装路径" loading="lazy" width="738" height="920" src="/_astro/arknights-maa-7.Bcm1aAwj_1XGmdb.webp" /><figcaption>查看模拟器安装路径</figcaption></figure><p></p><ol>
<li>
<p><code>连接地址</code>：输入<code>127.0.0.1:16384</code>。</p>
</li>
<li>
<p><code>连接配置</code>：以<code>MuMu模拟器12</code>为例，这里选择<code>MuMu模拟器12</code>。</p>
</li>
<li>
<p><code>MuMu安装路径</code>：参考<code>ADB路径（相对/绝对）</code>的配置，需要注意的是这里选择安装根目录。</p>
</li>
<li>
<p><code>ADB连接失败时尝试启动模拟器</code>：勾选。</p>
</li>
<li>
<p><code>退出时释放ADB</code>：勾选。</p>
</li>
</ol><div><div><div></div><div>ADB是什么？ADB全称AndroidDebugBridge，它是一个能够让计算机与Android设备进行连接调试以及控制的命令行工具。</div></div><div></div></div></section>
<section><h2>6.启动设置<a href="#6启动设置"><span>#</span></a></h2><p></p><figure><img alt="启动设置" loading="lazy" width="981" height="234" src="/_astro/arknights-maa-8.C1vqEdg4_Z1Vah03.webp" /><figcaption>启动设置</figcaption></figure><p></p><p>这里只需要设置<code>模拟器路径</code>和<code>等待模拟器启动时间</code>，为的是让MAA唤起模拟器，笔者额外设置了开机MAA自启，可根据情况勾选。以<code>MuMu模拟器12</code>为例找到模拟器安装路径下<code>shell</code>文件夹内的<code>MuMuPlayer.exe</code>，等待时间笔者设置的是60秒。</p></section>
<section><h2>7.远程控制【可忽略】<a href="#7远程控制可忽略"><span>#</span></a></h2><p></p><figure><img alt="远程控制" loading="lazy" width="978" height="345" src="/_astro/arknights-maa-9.DkNAFQMh_lt7wx.webp" /><figcaption>远程控制</figcaption></figure><p></p><p>无需修改</p></section>
<section><h2>8.界面设置【可忽略】<a href="#8界面设置可忽略"><span>#</span></a></h2><p></p><figure><img alt="界面设置" loading="lazy" width="974" height="444" src="/_astro/arknights-maa-10.BNJlVm-p_Z27SzXB.webp" /><figcaption>界面设置</figcaption></figure><p></p><p>无需修改</p></section>
<section><h2>9.背景设置【可忽略】<a href="#9背景设置可忽略"><span>#</span></a></h2><p></p><figure><img alt="背景设置" loading="lazy" width="993" height="302" src="/_astro/arknights-maa-11.CUg2X_7h_Z2gLTw4.webp" /><figcaption>背景设置</figcaption></figure><p></p><p>无需修改</p></section>
<section><h2>10.外部通知【可忽略但建议设置】<a href="#10外部通知可忽略但建议设置"><span>#</span></a></h2><p></p><figure><img alt="外部通知配置" loading="lazy" width="990" height="407" src="/_astro/arknights-maa-12.CxUEoNx3_joqxV.webp" /><figcaption>外部通知配置</figcaption></figure><p></p><p>根据需要可以配置MAA完成任务后通过<code>SMTP协议</code>或其他<code>消息中间件</code>发送邮件或消息以反馈MAA任务完成情况，笔者这里配置了<code>SMTP协议</code>，关于如何开启邮箱的<code>SMTP服务</code>，可参考这篇文章：<a href="https://blog.csdn.net/m0_62140641/article/details/142205387" target="_blank">https://blog.csdn.net/m0_62140641/article/details/142205387</a></p><p>下面这个是笔者的最终效果图</p><p></p><figure><img alt="SMTP邮件通知效果" loading="lazy" width="1260" height="6386" src="/_astro/arknights-maa-13.T1oMjsdc_Z12YPjL.webp" /><figcaption>SMTP邮件通知效果</figcaption></figure><p></p></section>
<section><h2>11.热键设置【可忽略】<a href="#11热键设置可忽略"><span>#</span></a></h2><p></p><figure><img alt="热键设置" loading="lazy" width="990" height="185" src="/_astro/arknights-maa-14.BN4vtd25_Z1i8s1B.webp" /><figcaption>热键设置</figcaption></figure><p></p><p>无需修改</p></section>
<section><h2>12.成就设置【可忽略】<a href="#12成就设置可忽略"><span>#</span></a></h2><p></p><figure><img alt="成就设置" loading="lazy" width="977" height="255" src="/_astro/arknights-maa-15.DQtXah5g_Z1RyE6p.webp" /><figcaption>成就设置</figcaption></figure><p></p><p>嗯？？？？？无需修改</p></section>
<section><h2>13.更新设置【可忽略但建议设置】<a href="#13更新设置可忽略但建议设置"><span>#</span></a></h2><p></p><figure><img alt="更新设置" loading="lazy" width="972" height="435" src="/_astro/arknights-maa-16.Ca3icUNI_Zt0swm.webp" /><figcaption>更新设置</figcaption></figure><p></p><p>建议勾选<code>自动下载更新包</code>与<code>自动安装更新包</code>，当然国内Github下载资源的速度非常慢，可以花一点小小的代价用Mirror酱更新。</p><div><div><div></div><div>Mirror酱是一个国内Docker镜像加速服务，可以显著提升镜像拉取速度。</div></div><div></div></div></section>
<section><h2>14.完成后退出模拟器【可忽略但建议设置】<a href="#14完成后退出模拟器可忽略但建议设置"><span>#</span></a></h2><p></p><figure><img alt="完成后退出模拟器" loading="lazy" width="818" height="729" src="/_astro/arknights-maa-17.JMSxeg1X_Z1M1sRr.webp" /><figcaption>完成后退出模拟器</figcaption></figure><p></p><p>最后一步，需要在<code>一键长草</code>界面中修改<code>完成后</code>的事件，仅勾选<code>退出模拟器</code></p><p>OK，那么在完成上述配置以后，只需要把MAA启动着，无需点击<code>LinkStart!</code>即可实现不断电情况下的定时自动化一键长草。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/docker-help/</id>
      <title type="text">Docker常用指令大全</title>
      <published>2025-06-30T12:03:00.000Z</published>
      <updated>2025-06-30T12:03:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/docker-help/"/>
      <summary type="text">整理Docker常用命令，涵盖服务管理、镜像操作、容器生命周期及日志查看等，长期更新</summary>
      <content type="html"><![CDATA[<p>整理一些常用的docker命令，同时也是方便笔者自己在工作中查阅，长期更新</p>
<div><div><div></div><div>由于篇幅过长，可使用<code>Ctrl+F</code> 根据关键词搜索</div></div><div></div></div>
<section><h3>docker服务类命令<a href="#docker服务类命令"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#查看docker服务运行状态</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>docker</span></div></div><div><div><div>3</div></div><div><span>#启动docker服务</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>docker</span></div></div><div><div><div>5</div></div><div><span>#停止docker服务</span></div></div><div><div><div>6</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>docker</span></div></div><div><div><div>7</div></div><div><span>#重启docker服务</span></div></div><div><div><div>8</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>docker</span></div></div><div><div><div>9</div></div><div><span>#设置docker服务开机自启动</span></div></div><div><div><div>10</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>docker</span></div></div><div><div><div>11</div></div><div><span>#查看docker版本信息</span></div></div><div><div><div>12</div></div><div><span>docker</span><span> </span><span>version</span></div></div><div><div><div>13</div></div><div><span>#查看docker详细信息</span></div></div><div><div><div>14</div></div><div><span>docker</span><span> </span><span>info</span></div></div><div><div><div>15</div></div><div><span>#查看所有容器占用资源情况</span></div></div><div><div><div>16</div></div><div><span>docker</span><span> </span><span>stats</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h3>docker镜像类命令<a href="#docker镜像类命令"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#根据名称拉取镜像（此方法会默认拉取最新版本）</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>pull</span><span> [image_name]</span></div></div><div><div><div>3</div></div><div><span>#根据名称+标签拉取镜像（标签一般为版本号，如：docker pull nginx:1.24）</span></div></div><div><div><div>4</div></div><div><span>docker</span><span> </span><span>pull</span><span> [image_name]:[tag]</span></div></div><div><div><div>5</div></div><div><span>#搜索指定镜像</span></div></div><div><div><div>6</div></div><div><span>docker</span><span> </span><span>search</span><span> [image_name]</span></div></div><div><div><div>7</div></div><div><span>#查看已拉取的所有镜像信息</span></div></div><div><div><div>8</div></div><div><span>docker</span><span> </span><span>images</span></div></div><div><div><div>9</div></div><div><span>#移除指定镜像</span></div></div><div><div><div>10</div></div><div><span>docker</span><span> </span><span>rmi</span><span> </span><span>-f</span><span> [image_id]</span></div></div><div><div><div>11</div></div><div><span>#移除多个指定镜像</span></div></div><div><div><div>12</div></div><div><span>docker</span><span> </span><span>rmi</span><span> </span><span>-f</span><span> [image_id] [image_id]</span></div></div><div><div><div>13</div></div><div><span>#移除所有镜像</span></div></div><div><div><div>14</div></div><div><span>docker</span><span> </span><span>rmi</span><span> </span><span>-f</span><span> $(</span><span>docker</span><span> </span><span>images</span><span> </span><span>-aq</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h3>docker容器类命令<a href="#docker容器类命令"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#查看运行中的容器</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>ps</span></div></div><div><div><div>3</div></div><div><span>#查看所有容器</span></div></div><div><div><div>4</div></div><div><span>docker</span><span> </span><span>ps</span><span> </span><span>-a</span></div></div><div><div><div>5</div></div><div><span>#进入一个运行中的指定ID容器</span></div></div><div><div><div>6</div></div><div><span>docker</span><span> </span><span>exec</span><span> </span><span>-it</span><span> [container_id] /bin/bash</span></div></div><div><div><div>7</div></div><div><span>#【仅限在容器内部使用】停止容器并退出</span></div></div><div><div><div>8</div></div><div><span>exit</span></div></div><div><div><div>9</div></div><div><span>#【仅限在容器内部使用】不停止容器并退出</span></div></div><div><div><div>10</div></div><div><span>ctrl+P+Q</span></div></div><div><div><div>11</div></div><div><span>#根据指定ID镜像启动一个新的容器(params可以忽略也可以加入多个参数，具体如下)</span></div></div><div><div><div>12</div></div><div><span>docker</span><span> </span><span>run</span><span> [params] [image_id]:[version]</span></div></div><div><div><div>13</div></div><div><span>           </span><span>#为容器命名</span></div></div><div><div><div>14</div></div><div><span>           </span><span>--name</span><span> [container_name]</span></div></div><div><div><div>15</div></div><div><span>           </span><span>#启用容器守护</span></div></div><div><div><div>16</div></div><div><span>           </span><span>-d</span></div></div><div><div><div>17</div></div><div><span>           </span><span>#创建宿主机与容器内部的端口映射</span></div></div><div><div><div>18</div></div><div><span>           </span><span>-p</span><span> [host_port]:[container_port]</span></div></div><div><div><div>19</div></div><div><span>           </span><span>#将宿主机指定目录挂载到容器内部的指定目录，即持久化目录映射</span></div></div><div><div><div>20</div></div><div><span>           </span><span>-v</span><span> [host_path]:[container_path]</span></div></div><div><div><div>21</div></div><div><span>#启动指定ID容器</span></div></div><div><div><div>22</div></div><div><span>docker</span><span> </span><span>start</span><span> [container_id]</span></div></div><div><div><div>23</div></div><div><span>#停止指定ID容器</span></div></div><div><div><div>24</div></div><div><span>docker</span><span> </span><span>stop</span><span> [container_id]</span></div></div><div><div><div>25</div></div><div><span>#强制停止指定ID容器</span></div></div><div><div><div>26</div></div><div><span>docker</span><span> </span><span>kill</span><span> [container_id]</span></div></div><div><div><div>27</div></div><div><span>#重启指定ID容器</span></div></div><div><div><div>28</div></div><div><span>docker</span><span> </span><span>restart</span><span> [container_id]</span></div></div><div><div><div>29</div></div><div><span>#移除指定ID容器</span></div></div><div><div><div>30</div></div><div><span>docker</span><span> </span><span>rm</span><span> </span><span>-f</span><span> [container_id]</span></div></div><div><div><div>31</div></div><div><span>#移除所有容器</span></div></div><div><div><div>32</div></div><div><span>docker</span><span> </span><span>rm</span><span> </span><span>-f</span><span> $(</span><span>docker</span><span> </span><span>ps</span><span> </span><span>-aq</span><span>)</span></div></div><div><div><div>33</div></div><div><span>#查看指定容器的日志信息(params可以忽略也可以加入多个参数，具体如下)</span></div></div><div><div><div>34</div></div><div><span>docker</span><span> </span><span>logs</span><span> [params] [container_id]</span></div></div><div><div><div>35</div></div><div><span>            </span><span>#显示日志时间戳</span></div></div><div><div><div>36</div></div><div><span>            </span><span>-t</span></div></div><div><div><div>37</div></div><div><span>            </span><span>#实时更新日志信息（使用该参数会一直打印日志）</span></div></div><div><div><div>38</div></div><div><span>            </span><span>-f</span></div></div><div><div><div>39</div></div><div><span>            </span><span>#指定显示最后多少条日志</span></div></div><div><div><div>40</div></div><div><span>            </span><span>--tail</span><span> [number]</span></div></div><div><div><div>41</div></div><div><span>#查看容器内部的进程占用情况</span></div></div><div><div><div>42</div></div><div><span>docker</span><span> </span><span>top</span><span> [container_id]</span></div></div><div><div><div>43</div></div><div><span>#将容器内指定目录下的内容拷贝到宿主机指定目录下</span></div></div><div><div><div>44</div></div><div><span>docker</span><span> </span><span>cp</span><span> [contianer_id]:[contianer_path] [host_path]</span></div></div><div><div><div>45</div></div><div><span>#将宿主机指定目录下的内容拷贝到容器内指定目录下</span></div></div><div><div><div>46</div></div><div><span>docker</span><span> </span><span>cp</span><span> [host_path] [contianer_id]:[contianer_path]</span></div></div><div><div><div>47</div></div><div><span>#将容器转换为自定义名称与自定义标签的镜像，标签一般为版本号（params可以忽略也可以加入多个参数，具体如下）</span></div></div><div><div><div>48</div></div><div><span>docker</span><span> </span><span>commit</span><span> [params] [container_id] [image_name]:[tag]</span></div></div><div><div><div>49</div></div><div><span>              </span><span>#为镜像添加描述信息</span></div></div><div><div><div>50</div></div><div><span>              </span><span>-m</span><span> [description]</span></div></div><div><div><div>51</div></div><div><span>              </span><span>#为镜像添加作者信息</span></div></div><div><div><div>52</div></div><div><span>              </span><span>-a</span><span> [author_name]</span></div></div><div><div><div>53</div></div><div><span>#将指定镜像导出为镜像压缩包</span></div></div><div><div><div>54</div></div><div><span>docker</span><span> </span><span>save</span><span> </span><span>-o</span><span> [tar_name].tar [image_name]</span></div></div><div><div><div>55</div></div><div><span>#导入镜像压缩包</span></div></div><div><div><div>56</div></div><div><span>docker</span><span> </span><span>load</span><span> </span><span>-i</span><span> [tar_name].tar</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/meting-install/</id>
      <title type="text">Meting快速私有化部署及SSL配置教程</title>
      <published>2025-06-18T17:09:00.000Z</published>
      <updated>2025-06-18T17:09:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/meting-install/"/>
      <summary type="text">使用Docker私有化部署Meting-API并配置Nginx反向代理与SSL证书实现HTTPS域名访问</summary>
      <content type="html"><![CDATA[<p>Meting是一个非常好用的开源音乐Api框架，笔者在重建本站后将音乐模块由原先的Aplayer框架改为了使用Meting框架，但在整个使用过程中发现公共的MetingApi接口经常会由于网络原因导致加载不出音乐模块，因此笔者选择将Meting进行私有化部署，以提高音乐模块的稳定性。接下来笔者会详细说明部署流程以及SSL相关的配置，最终使用域名来访问Meting接口。</p>
<section><h2>事前准备工作<a href="#事前准备工作"><span>#</span></a></h2><ul>
<li>
<p>linux服务器一台</p>
</li>
<li>
<p>Nginx环境</p>
</li>
<li>
<p>Docker环境及docker-compose插件</p>
</li>
<li>
<p>（可选）SSL证书</p>
</li>
<li>
<p>不怕踩坑的良好心态</p>
</li>
</ul></section>
<section><h2>第一步：编写docker-compose.yml配置文件<a href="#第一步编写docker-composeyml配置文件"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>services</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>meting</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>image</span><span>: </span><span>intemd/meting-api:latest</span></div></div><div><div><div>4</div></div><div><span>    </span><span>hostname</span><span>: </span><span>meting-api</span></div></div><div><div><div>5</div></div><div><span>    </span><span>container_name</span><span>: </span><span>meting-api</span></div></div><div><div><div>6</div></div><div><span>    </span><span>restart</span><span>: </span><span>always</span></div></div><div><div><div>7</div></div><div><span>    </span><span>ports</span><span>:</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>- </span><span>"3000:3000"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>第二步：执行配置文件并创建容器<a href="#第二步执行配置文件并创建容器"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker-compose</span><span> </span><span>-f</span><span> </span><span>docker-compose.yml</span><span> </span><span>up</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>完整这一步之后，就可以通过3000端口访问meting的测试页面了，例：<code>127.0.0.1:3000</code></p></section>
<section><h2>第三步【可选】：配置HTTPS域名访问<a href="#第三步可选配置https域名访问"><span>#</span></a></h2><div><div><div></div><div>如果你已经配置好了SSL证书可以直接进入第四步</div></div><div></div></div><p>打开Nginx的配置文件，添加SSL证书配置</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 配置 域名访问</span></div></div><div><div><div>2</div></div><div><span>server</span><span> {</span></div></div><div><div><div>3</div></div><div><span>   <span> </span></span><span>listen </span><span>443</span><span> ssl;</span></div></div><div><div><div>4</div></div><div><span>    </span><span># 【需要修改】</span></div></div><div><div><div>5</div></div><div><span>   <span> </span></span><span>server_name </span><span>www.xxxxxx.cn;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span># SSL 配置</span></div></div><div><div><div>8</div></div><div><span>    </span><span># 【需要修改】</span></div></div><div><div><div>9</div></div><div><span>   <span> </span></span><span>ssl_certificate </span><span>/ssl/xxxxxx.crt;</span></div></div><div><div><div>10</div></div><div><span>    </span><span># 【需要修改】</span></div></div><div><div><div>11</div></div><div><span>   <span> </span></span><span>ssl_certificate_key </span><span>/ssl/xxxxxx.key;</span></div></div><div><div><div>12</div></div><div><span>   <span> </span></span><span>ssl_session_timeout </span><span>5m</span><span>;</span></div></div><div><div><div>13</div></div><div><span>   <span> </span></span><span>ssl_protocols </span><span>TLSv1.2 TLSv1.3;</span></div></div><div><div><div>14</div></div><div><span>   <span> </span></span><span>ssl_ciphers </span><span>ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;</span></div></div><div><div><div>15</div></div><div><span>   <span> </span></span><span>ssl_prefer_server_ciphers </span><span>on</span><span>;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span># 设置客户端请求体的最大大小</span></div></div><div><div><div>18</div></div><div><span>   <span> </span></span><span>client_max_body_size </span><span>100m</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span># 拒绝基于 IP 的直接访问</span></div></div><div><div><div>21</div></div><div><span>    </span><span># 【需要修改】</span></div></div><div><div><div>22</div></div><div><span>    </span><span>if</span><span> ($</span><span>host</span><span> != </span><span>"www.xxxxxx.cn"</span><span>) {</span></div></div><div><div><div>23</div></div><div><span>        </span><span># 直接关闭连接</span></div></div><div><div><div>24</div></div><div><span>        </span><span>return</span><span> </span><span>444</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span># 默认代理到 实际内网ip地址及端口，也就是前端访问页面的入口</span></div></div><div><div><div>28</div></div><div><span>    </span><span>location</span><span> / {</span></div></div><div><div><div>29</div></div><div><span>        </span><span># 【需要修改】</span></div></div><div><div><div>30</div></div><div><span>       <span> </span></span><span>proxy_pass </span><span>http://127.0.0.1:8080/;</span></div></div><div><div><div>31</div></div><div><span>       <span> </span></span><span>proxy_set_header </span><span>HOST $</span><span>host</span><span>;</span></div></div><div><div><div>32</div></div><div><span>       <span> </span></span><span>proxy_set_header </span><span>X-Forwarded-Proto $</span><span>scheme</span><span>;</span></div></div><div><div><div>33</div></div><div><span>       <span> </span></span><span>proxy_set_header </span><span>X-Real-IP $</span><span>remote_addr</span><span>;</span></div></div><div><div><div>34</div></div><div><span>       <span> </span></span><span>proxy_set_header </span><span>X-Forwarded-For $</span><span>proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>    </span><span># 错误页面配置</span></div></div><div><div><div>38</div></div><div><span>   <span> </span></span><span>error_page </span><span>500</span><span> </span><span>502</span><span> </span><span>503</span><span> </span><span>504</span><span> /50x.html;</span></div></div><div><div><div>39</div></div><div><span>    </span><span>location</span><span> = </span><span>/50x.html </span><span>{</span></div></div><div><div><div>40</div></div><div><span>       <span> </span></span><span>root </span><span>/usr/share/nginx/html;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>然后重启nginx生效</p></section>
<section><h2>第四步【可选】：添加meting接口反向代理<a href="#第四步可选添加meting接口反向代理"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>location</span><span> /meting/ {</span></div></div><div><div><div>2</div></div><div><span>  </span><span># 【需要修改】</span></div></div><div><div><div>3</div></div><div><span>  </span><span>#  meting的访问地址,这里的端口一定要和meting部署的外部端口保持一致</span></div></div><div><div><div>4</div></div><div><span> <span> </span></span><span>proxy_pass </span><span>http://127.0.0.1:3000/; </span><span># 设置的端口</span></div></div><div><div><div>5</div></div><div><span> <span> </span></span><span>proxy_set_header </span><span>X-Forwarded-Host $</span><span>scheme</span><span>://$</span><span>host</span><span>:$</span><span>server_port</span><span>/meting;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>这里有个坑，如果你希望使用一个独立的域名来访问Meting接口，那么必须要给代理加上一个路由，例如：<code>/meting</code>，直接代理到<code>/</code>虽然也可以访问，但是访问协议会变成<code>HTTP</code>，而不是<code>HTTPS</code>，从而导致<code>.lrc</code>歌词文件或<code>.mp3</code>音频文件获取失败。</div></div><div></div></div><p>至此，Meting的部署与SSL配置就完成了，接下来就可以通过Meting提供的接口来播放自己喜欢的歌曲啦</p><p>Meting接口帮助文档参考：<a href="https://github.com/metowolf/Meting" target="_blank">https://github.com/metowolf/Meting</a></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/proxy-help/</id>
      <title type="text">快速理解正向代理与反向代理</title>
      <published>2025-06-16T23:51:00.000Z</published>
      <updated>2025-06-16T23:51:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/proxy-help/"/>
      <summary type="text">图解正向代理与反向代理的区别，解答加速器、VPN、负载均衡分别属于哪种代理</summary>
      <content type="html"><![CDATA[<p>刚步入工作跟项目时，经常会有前端的同学和你说“XXX跨域了，Nginx做一下代理”，你也明白用Nginx做一下代理就能解决跨域的问题，但是对于“代理”这两个字你既熟悉又陌生，直到有人来问你，<code>加速器是正向代理还是反向代理？VPN是正向代理还是反向代理？负载均衡是正向代理还是反向代理？</code>你蒙圈了。</p>
<section><h2>Q1：加速器是正向代理还是反向代理？<a href="#q1加速器是正向代理还是反向代理"><span>#</span></a></h2></section>
<section><h2>Q2：VPN是正向代理还是反向代理？<a href="#q2vpn是正向代理还是反向代理"><span>#</span></a></h2></section>
<section><h2>Q3：负载均衡是正向代理还是反向代理？<a href="#q3负载均衡是正向代理还是反向代理"><span>#</span></a></h2><blockquote><p>在回答这三个问题之前，来快速理解一下正、反向代理的区别</p></blockquote></section>
<section><h2>正向代理<a href="#正向代理"><span>#</span></a></h2><p></p><figure><img alt="正向代理" loading="lazy" width="1100" height="684" src="/_astro/proxy-help-1.CnY5lQEm_j6LS3.webp" /><figcaption>正向代理</figcaption></figure><p></p><p>如上图，<code>用户</code>在已知<code>目标服务器</code>的地址的情况下，<code>用户</code>无法直接访问<code>目标服务器</code>，此时就需要一台能访问<code>目标服务器</code>的<code>代理服务器</code>，让它来代替<code>用户</code>去获取<code>目标服务器</code>的资源然后返回给<code>用户</code>，这种情况被称为<code>正向代理</code>。</p><blockquote><p><strong>很显然，正向代理的场景下，用户明确知道目标服务器的地址，但是无法访问，需要借助一些中间手段。</strong></p></blockquote></section>
<section><h2>反向代理<a href="#反向代理"><span>#</span></a></h2><p></p><figure><img alt="反向代理" loading="lazy" width="1228" height="765" src="/_astro/proxy-help-2.XmiKJgJ2_ZVulHl.webp" /><figcaption>反向代理</figcaption></figure><p></p><p>如上图，依然是<code>用户</code>在已知<code>目标服务器（代理服务器）</code>的地址的情况下，<code>用户</code>可以直接访问<code>目标服务器（代理服务器）</code>，但是实际上，<code>用户</code>的请求会被转发到对应的<code>目标服务器ABC</code>，比如<code>目标服务器（代理服务器）</code>收到<code>用户</code>的请求后发现<code>用户</code>需要的资源在<code>目标服务器A</code>，那么<code>目标服务器（代理服务器）</code>就会去<code>目标服务器A</code>获取<code>用户</code>需要的资源然后返回给<code>用户</code>，同样如果<code>目标服务器（代理服务器）</code>发现<code>用户</code>需要的资源在<code>目标服务器B</code>，那么<code>目标服务器（代理服务器）</code>就会去<code>目标服务器B</code>获取<code>用户</code>需要的资源然后返回给<code>用户</code>，这种情况被称为<code>反向代理</code>。</p><blockquote><p><strong>很显然，反向代理的场景下，用户只知道目标服务器的地址，并不知道目标服务器A、目标服务器B、目标服务器C的存在，整个请求转发的过程对用户来说都是无感的，从用户侧看到的“目标服务器”实则上是“代理服务器”。</strong></p></blockquote><p>那么接下来回答一下开头的三个问题</p></section>
<section><h2>Q1、Q2、Q3答案<a href="#q1q2q3答案"><span>#</span></a></h2><p><strong>A1：加速器属于</strong><code>正向代理</code></p><p><strong>A2：VPN属于</strong><code>正向代理</code></p><p><strong>A3：负载均衡属于</strong><code>反向代理</code></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/umami-install/</id>
      <title type="text">基于Postgresql使用Umami搭建访客监测站</title>
      <published>2025-06-13T17:50:00.000Z</published>
      <updated>2025-06-13T17:50:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/umami-install/"/>
      <summary type="text">使用Docker部署PostgreSQL与Umami，搭建轻量级网站访客分析工具并配置JS注入与分享链接</summary>
      <content type="html"><![CDATA[<p>Umami 是一款轻量级的开源网站分析工具，能够非常方便的分析出网站的访客来源以及访客最常访问的资源等数据并以可视化图表的形式展示出来，本站已私有化部署了Umami来分析访客来源以及访问资源数据，具体可查看下方地址体验。</p>
<p><a href="https://umami.elysium-stack.cn/share/gOS01HeeWBxf0yRj/www.elysium-stack.cn" target="_blank">https://umami.elysium-stack.cn/share/gOS01HeeWBxf0yRj/www.elysium-stack.cn</a></p>
<p>如果需要了解更多关于Umami的内容，也可以访问<a href="https://umami.is/" target="_blank">https://umami.is/</a>查看</p>
<section><h4>第一步：编写postgres的docker-compose.yml配置<a href="#第一步编写postgres的docker-composeyml配置"><span>#</span></a></h4><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>services</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>db</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span># postgres最新镜像</span></div></div><div><div><div>4</div></div><div><span>    </span><span>image</span><span>: </span><span>postgres:latest</span></div></div><div><div><div>5</div></div><div><span>    </span><span>hostname</span><span>: </span><span>postgres</span></div></div><div><div><div>6</div></div><div><span>    </span><span>container_name</span><span>: </span><span>postgres</span></div></div><div><div><div>7</div></div><div><span>    </span><span>restart</span><span>: </span><span>always</span></div></div><div><div><div>8</div></div><div><span>    </span><span>environment</span><span>:</span></div></div><div><div><div>9</div></div><div><span>      </span><span># 初始数据库（可自行修改）</span></div></div><div><div><div>10</div></div><div><span>      </span><span>POSTGRES_DB</span><span>: </span><span>postgres</span></div></div><div><div><div>11</div></div><div><span>      </span><span># 数据库连接用户（可自行修改）</span></div></div><div><div><div>12</div></div><div><span>      </span><span>POSTGRES_USER</span><span>: </span><span>postgres</span></div></div><div><div><div>13</div></div><div><span>      </span><span># 数据库连接密码（可自行修改）</span></div></div><div><div><div>14</div></div><div><span>      </span><span>POSTGRES_PASSWORD</span><span>: </span><span>postgres</span></div></div><div><div><div>15</div></div><div><span>    </span><span>ports</span><span>:</span></div></div><div><div><div>16</div></div><div><span>      </span><span># 容器内外映射端口号</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>- </span><span>"5432:5432"</span></div></div><div><div><div>18</div></div><div><span>    </span><span>volumes</span><span>:</span></div></div><div><div><div>19</div></div><div><span>      </span><span># 容器内外持久化目录</span></div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>- </span><span>/data/postgresql/data:/var/lib/postgresql/data</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h4>第二步：创建并启动postgres容器<a href="#第二步创建并启动postgres容器"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 会自动拉取postgres:latest镜像</span></div></div><div><div><div>2</div></div><div><span>docker-compose</span><span> </span><span>-f</span><span> </span><span>docker-compose.yml</span><span> </span><span>up</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第三步：编写umami的docker-compose.yml配置<a href="#第三步编写umami的docker-composeyml配置"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>services</span><span>:</span></div></div><div><div><div>2</div></div><div><span>    </span><span>umami</span><span>:</span></div></div><div><div><div>3</div></div><div><span>        </span><span># umami pg版本最新镜像</span></div></div><div><div><div>4</div></div><div><span>        </span><span>image</span><span>: </span><span>umamisoftware/umami:postgresql-latest</span></div></div><div><div><div>5</div></div><div><span>        </span><span>container_name</span><span>: </span><span>umami</span></div></div><div><div><div>6</div></div><div><span>        </span><span>environment</span><span>:</span></div></div><div><div><div>7</div></div><div><span>            </span><span># 示例：- DATABASE_URL=postgresql://postgres:postgres@127.0.0.1:5432/postgres</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>- </span><span>DATABASE_URL=postgresql://&lt;数据库连接用户&gt;:&lt;数据库连接密码&gt;@&lt;数据库访问ip&gt;:&lt;端口号&gt;/&lt;默认数据库&gt;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>ports</span><span>:</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>- </span><span>3000:3000</span></div></div><div><div><div>11</div></div><div><span>        </span><span>restart</span><span>: </span><span>always</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第四步：创建并启动umami容器<a href="#第四步创建并启动umami容器"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 会自动拉取umamisoftware/umami:postgresql-latest镜像</span></div></div><div><div><div>2</div></div><div><span>docker-compose</span><span> </span><span>-f</span><span> </span><span>docker-compose.yml</span><span> </span><span>up</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第五步：访问umami管理页，获取分享链接以及js注入代码<a href="#第五步访问umami管理页获取分享链接以及js注入代码"><span>#</span></a></h4><p>浏览器输入部署终端的<code>ip+端口号</code>，如：<code>127.0.0.1:3000</code></p><p></p><figure><img alt="umami登录页" loading="lazy" width="2559" height="1399" src="/_astro/umami-install-1.BcM27-rF_dmmW9.webp" /><figcaption>umami登录页</figcaption></figure><p></p><p>默认用户名为<code>admin</code>，密码为<code>umami</code>，登录成功后进入管理页面</p><p></p><figure><img alt="umami管理页" loading="lazy" width="2559" height="1399" src="/_astro/umami-install-2.DFrtcW8q_ZTU7cq.webp" /><figcaption>umami管理页</figcaption></figure><p></p><p>点击导航栏<code>Settings</code></p><p></p><figure><img alt="umami设置页" loading="lazy" width="2559" height="1399" src="/_astro/umami-install-3.CcFGi8sn_bedT.webp" /><figcaption>umami设置页</figcaption></figure><p></p><p>点击<code>Add website</code>输入需要观测的域名（不是ip地址）</p><p></p><figure><img alt="umami添加站点页" loading="lazy" width="1057" height="177" src="/_astro/umami-install-4.D0LMaXlG_Z7Mj28.webp" /><figcaption>umami添加站点页</figcaption></figure><p></p><p>添加完成后点击<code>Edit</code>，然后点击<code>Tracking code</code>获取JS注入代码，复制它</p><p></p><figure><img alt="umami获取js注入代码页" loading="lazy" width="1710" height="885" src="/_astro/umami-install-5.5biEbk0e_2ak4lC.webp" /><figcaption>umami获取js注入代码页</figcaption></figure><p></p><p>将这段代码注入到你的站点全局<code>head</code>标签中</p><p></p><figure><img alt="umami注入js代码页" loading="lazy" width="817" height="417" src="/_astro/umami-install-6.DNS-_fgQ_266B1M.webp" /><figcaption>umami注入js代码页</figcaption></figure><p></p><p>所有配置工作完成，接下来回到管理页面点击<code>Share URL</code>，启动<code>Enable share URL</code>，同时获取URL地址</p><p></p><figure><img alt="umami分享链接页" loading="lazy" width="1714" height="892" src="/_astro/umami-install-7.Ba3Ocjh9_Z162bVe.webp" /><figcaption>umami分享链接页</figcaption></figure><p></p></section>
<section><h4>第六步：访问Umami Share URL<a href="#第六步访问umami-share-url"><span>#</span></a></h4><div><figure><img alt="umami访客概览" loading="lazy" width="1712" height="780" src="/_astro/umami-install-8.Y1IqeH2q_Z2qe300.webp" /><figcaption>umami访客概览</figcaption></figure><figure><img alt="umami访客分析" loading="lazy" width="1714" height="883" src="/_astro/umami-install-9.kYQMzdhW_2q6psI.webp" /><figcaption>umami访客分析</figcaption></figure><figure><img alt="umami实时数据" loading="lazy" width="1705" height="804" src="/_astro/umami-install-10.DZzNAcNM_2p7lRD.webp" /><figcaption>umami实时数据</figcaption></figure></div><p>至此Umami的搭建大功告成，需要观测其它站点同样也只需添加配置，然后JS注入即可</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/nacos-install/</id>
      <title type="text">Nacos安装部署及配置教程</title>
      <published>2025-06-06T17:00:00.000Z</published>
      <updated>2025-06-06T17:00:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/nacos-install/"/>
      <summary type="text">使用Docker部署Nacos并适配人大金仓数据库，含驱动配置、数据库建表脚本及完整启动流程</summary>
      <content type="html"><![CDATA[<p>由于nacos原生只支持内存数据库与mysql，对于一些国产化数据库来说并没有做好适配，那么笔者想专门说一说对于一些国产化数据库该如何去进行nacos的配置，笔者将会从nacos的部署到人大金仓（kingbase）的配置，讲解这整个流程中的操作方式，下面直接进入正题。</p>
<section><h4>第一步：获取Nacos镜像<a href="#第一步获取nacos镜像"><span>#</span></a></h4><p>使用pull拉取最新nacos镜像</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>nacos/nacos-server</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img alt="拉取nacos镜像" loading="lazy" width="1363" height="562" src="/_astro/nacos-install-1.CmXxUamj_1nrgba.webp" /><figcaption>拉取nacos镜像</figcaption></figure><p></p></section>
<section><h4>第二步：获取数据库驱动jar包<a href="#第二步获取数据库驱动jar包"><span>#</span></a></h4><p>官网也给出了下载地址<a href="https://download.kingbase.com.cn/xzzx/index.htm" target="_blank">人大金仓下载中心</a>，同样选择对应的数据库版本，然后在”<strong><em>接口驱动</em></strong>”中进行下载，可以在下载解压后的压缩包里找到对应版本的驱动包</p><p></p><figure><img alt="下载数据库驱动" loading="lazy" width="286" height="211" src="/_astro/nacos-install-2.SHUDwquu_mfIVU.webp" /><figcaption>下载数据库驱动</figcaption></figure><p></p><p>那么这里笔者将会使用<strong>kingbase8-8.6.0.jar</strong>这个驱动，按照实际情况选择对应的包即可</p></section>
<section><h4>第三步：创建持久化目录（conf、logs、data、libs）<a href="#第三步创建持久化目录conflogsdatalibs"><span>#</span></a></h4><p>笔者在根目录data文件中创建，你也可以选择其它位置作为你的之后挂载节点</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/data</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>nacos</span></div></div><div><div><div>3</div></div><div><span>cd</span><span> </span><span>/data/nacos</span></div></div><div><div><div>4</div></div><div><span>mkdir</span><span> </span><span>conf</span></div></div><div><div><div>5</div></div><div><span>mkdir</span><span> </span><span>logs</span></div></div><div><div><div>6</div></div><div><span>mkdir</span><span> </span><span>libs</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>文件目录结构如下</p><p></p><figure><img alt="创建nacos持久化目录" loading="lazy" width="1371" height="178" src="/_astro/nacos-install-3.O3WR5Xw3_Z1I2MKq.webp" /><figcaption>创建nacos持久化目录</figcaption></figure><p></p></section>
<section><h4>第四步：上传数据库驱动包至libs文件夹<a href="#第四步上传数据库驱动包至libs文件夹"><span>#</span></a></h4><p>这一步没啥好说的，有手就行</p><p></p><figure><img alt="上传数据库驱动" loading="lazy" width="1407" height="181" src="/_astro/nacos-install-4.JEhjZ9cd_160Eau.webp" /><figcaption>上传数据库驱动</figcaption></figure><p></p></section>
<section><h4>第五步：编写application.properties配置文件<a href="#第五步编写applicationproperties配置文件"><span>#</span></a></h4><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 这里这个mysql不用管，不影响最终连接kingbase</span></div></div><div><div><div>2</div></div><div><span>spring.datasource.platform</span><span><span>=</span><span>mysql</span></span></div></div><div><div><div>3</div></div><div><span>db.num</span><span><span>=</span><span>1</span></span></div></div><div><div><div>4</div></div><div><span># 【需要修改】这里替换成你的数据库连接ip和端口，其它参数不要动</span></div></div><div><div><div>5</div></div><div><span>db.url.0</span><span><span>=</span><span>jdbc:kingbase8://127.0.0.1:54321/nacos_config?</span></span><span>allowEncodingChanges</span><span><span>=</span><span>true&amp;</span></span><span>clientEncoding</span><span><span>=</span><span>UTF8</span></span></div></div><div><div><div>6</div></div><div><span># 【需要修改】数据库认证用户</span></div></div><div><div><div>7</div></div><div><span>db.user.0</span><span><span>=</span><span>admin</span></span></div></div><div><div><div>8</div></div><div><span># 【需要修改】数据库认证密码</span></div></div><div><div><div>9</div></div><div><span>db.password.0</span><span><span>=</span><span>admin123</span></span></div></div><div><div><div>10</div></div><div><span># 开启集群鉴权</span></div></div><div><div><div>11</div></div><div><span>nacos.core.auth.enabled</span><span><span>=</span><span>true</span></span></div></div><div><div><div>12</div></div><div><span>nacos.core.auth.enable.userAgentAuthWhite</span><span><span>=</span><span>false</span></span></div></div><div><div><div>13</div></div><div><span>nacos.core.auth.plugin.nacos.token.secret.key</span><span><span>=</span><span>${NACOS_AUTH_TOKEN:iW0hB1iM1gX3uG5bF1kB4wB4gY9oP0pR9yI4fK0zE4kJ3gR9vU8uV9uH3xP8cJ7hX3uX5xO0}</span></span></div></div><div><div><div>14</div></div><div><span>nacos.core.auth.server.identity.key</span><span><span>=</span><span>${NACOS_AUTH_IDENTITY_KEY:admin}</span></span></div></div><div><div><div>15</div></div><div><span>nacos.core.auth.server.identity.value</span><span><span>=</span><span>${NACOS_AUTH_IDENTITY_VALUE:admin}</span></span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>然后将这个配置文件上传至config文件夹内</p><p></p><figure><img alt="上传application.properties" loading="lazy" width="1460" height="186" src="/_astro/nacos-install-5.Cyr5w7Ql_Z255RKk.webp" /><figcaption>上传application.properties</figcaption></figure><p></p></section>
<section><h4>第六步：配置Nacos数据库<a href="#第六步配置nacos数据库"><span>#</span></a></h4><p>这里直接提供SQL脚本了，直接丢数据库运行一下一键生成所需要的库和表单</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>CREATE</span><span> </span><span>DATABASE</span><span> </span><span>nacos_config</span><span> </span><span>ENCODING</span><span><span> </span><span>=</span><span> </span></span><span>'UTF8'</span><span>;</span></div></div><div><div><div>2</div></div><div><span>\ C nacos_config;</span></div></div><div><div><div>3</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> "</span><span>config_info</span><span>" (</span></div></div><div><div><div>4</div></div><div><span>  </span><span>"id"</span><span> </span><span>BIGSERIAL</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>"data_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>255</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>6</div></div><div><span>  </span><span>"group_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ),</span></div></div><div><div><div>7</div></div><div><span>  </span><span>"content"</span><span> </span><span>TEXT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>8</div></div><div><span>  </span><span>"md5"</span><span> </span><span>VARCHAR</span><span> ( </span><span>32</span><span> ),</span></div></div><div><div><div>9</div></div><div><span>  </span><span>"gmt_create"</span><span> </span><span>TIMESTAMP</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>10</div></div><div><span>  </span><span>"gmt_modified"</span><span> </span><span>TIMESTAMP</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>11</div></div><div><span>  </span><span>"src_user"</span><span> </span><span>TEXT</span><span>,</span></div></div><div><div><div>12</div></div><div><span>  </span><span>"src_ip"</span><span> </span><span>VARCHAR</span><span> ( </span><span>50</span><span> ),</span></div></div><div><div><div>13</div></div><div><span>  </span><span>"app_name"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ),</span></div></div><div><div><div>14</div></div><div><span>  </span><span>"tenant_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>15</div></div><div><span>  </span><span>"c_desc"</span><span> </span><span>VARCHAR</span><span> ( </span><span>256</span><span> ),</span></div></div><div><div><div>16</div></div><div><span>  </span><span>"c_use"</span><span> </span><span>VARCHAR</span><span> ( </span><span>64</span><span> ),</span></div></div><div><div><div>17</div></div><div><span>  </span><span>"effect"</span><span> </span><span>VARCHAR</span><span> ( </span><span>64</span><span> ),</span></div></div><div><div><div>18</div></div><div><span>  </span><span>"type"</span><span> </span><span>VARCHAR</span><span> ( </span><span>64</span><span> ),</span></div></div><div><div><div>19</div></div><div><span>  </span><span>"c_schema"</span><span> </span><span>TEXT</span><span>,</span></div></div><div><div><div>20</div></div><div><span>  </span><span>"encrypted_data_key"</span><span> </span><span>VARCHAR</span><span> ( </span><span>1024</span><span> ) </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>21</div></div><div><span>  </span><span>PRIMARY KEY</span><span> ( </span><span>"id"</span><span> ),</span></div></div><div><div><div>22</div></div><div><span>  </span><span>UNIQUE</span><span> ( </span><span>"data_id"</span><span>, </span><span>"group_id"</span><span>, </span><span>"tenant_id"</span><span> )</span></div></div><div><div><div>23</div></div><div><span>);</span></div></div><div><div><div>24</div></div><div><span>COMMENT ON TABLE </span><span>"config_info"</span><span> </span><span>IS</span><span> </span><span>'config_info'</span><span>;</span></div></div><div><div><div>25</div></div><div><span>COMMENT ON COLUMN </span><span>"config_info"</span><span>.</span><span>"id"</span><span> </span><span>IS</span><span> </span><span>'id'</span><span>;</span></div></div><div><div><div>26</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> "</span><span>config_info_gray</span><span>" (</span></div></div><div><div><div>27</div></div><div><span>  </span><span>"id"</span><span> </span><span>BIGSERIAL</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>28</div></div><div><span>  </span><span>"data_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>255</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>29</div></div><div><span>  </span><span>"group_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>30</div></div><div><span>  </span><span>"content"</span><span> </span><span>TEXT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>31</div></div><div><span>  </span><span>"md5"</span><span> </span><span>VARCHAR</span><span> ( </span><span>32</span><span> ),</span></div></div><div><div><div>32</div></div><div><span>  </span><span>"src_user"</span><span> </span><span>TEXT</span><span>,</span></div></div><div><div><div>33</div></div><div><span>  </span><span>"src_ip"</span><span> </span><span>VARCHAR</span><span> ( </span><span>100</span><span> ),</span></div></div><div><div><div>34</div></div><div><span>  </span><span>"gmt_create"</span><span> </span><span>TIMESTAMP</span><span> ( </span><span>3</span><span> ) </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>CURRENT_TIMESTAMP</span><span> ( </span><span>3</span><span> ),</span></div></div><div><div><div>35</div></div><div><span>  </span><span>"gmt_modified"</span><span> </span><span>TIMESTAMP</span><span> ( </span><span>3</span><span> ) </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>CURRENT_TIMESTAMP</span><span> ( </span><span>3</span><span> ),</span></div></div><div><div><div>36</div></div><div><span>  </span><span>"app_name"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ),</span></div></div><div><div><div>37</div></div><div><span>  </span><span>"tenant_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>38</div></div><div><span>  </span><span>"gray_name"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>39</div></div><div><span>  </span><span>"gray_rule"</span><span> </span><span>TEXT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>40</div></div><div><span>  </span><span>"encrypted_data_key"</span><span> </span><span>VARCHAR</span><span> ( </span><span>256</span><span> ) </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>41</div></div><div><span>  </span><span>PRIMARY KEY</span><span> ( </span><span>"id"</span><span> ),</span></div></div><div><div><div>42</div></div><div><span>  </span><span>UNIQUE</span><span> ( </span><span>"data_id"</span><span>, </span><span>"group_id"</span><span>, </span><span>"tenant_id"</span><span>, </span><span>"gray_name"</span><span> )</span></div></div><div><div><div>43</div></div><div><span>);</span></div></div><div><div><div>44</div></div><div><span>CREATE</span><span> </span><span>INDEX</span><span> "</span><span>idx_dataid_gmt_modified</span><span>" </span><span>ON</span><span> </span><span>"config_info_gray"</span><span> ( </span><span>"data_id"</span><span>, </span><span>"gmt_modified"</span><span> );</span></div></div><div><div><div>45</div></div><div><span>CREATE</span><span> </span><span>INDEX</span><span> "</span><span>idx_gmt_modified</span><span>" </span><span>ON</span><span> </span><span>"config_info_gray"</span><span> ( </span><span>"gmt_modified"</span><span> );</span></div></div><div><div><div>46</div></div><div><span>COMMENT ON TABLE </span><span>"config_info_gray"</span><span> </span><span>IS</span><span> </span><span>'config_info_gray'</span><span>;</span></div></div><div><div><div>47</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> "</span><span>config_tags_relation</span><span>" (</span></div></div><div><div><div>48</div></div><div><span>  </span><span>"id"</span><span> </span><span>BIGINT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>49</div></div><div><span>  </span><span>"tag_name"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>50</div></div><div><span>  </span><span>"tag_type"</span><span> </span><span>VARCHAR</span><span> ( </span><span>64</span><span> ),</span></div></div><div><div><div>51</div></div><div><span>  </span><span>"data_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>255</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>52</div></div><div><span>  </span><span>"group_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>53</div></div><div><span>  </span><span>"tenant_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>54</div></div><div><span>  </span><span>"nid"</span><span> </span><span>BIGSERIAL</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>55</div></div><div><span>  </span><span>PRIMARY KEY</span><span> ( </span><span>"nid"</span><span> ),</span></div></div><div><div><div>56</div></div><div><span>  </span><span>UNIQUE</span><span> ( </span><span>"id"</span><span>, </span><span>"tag_name"</span><span>, </span><span>"tag_type"</span><span> )</span></div></div><div><div><div>57</div></div><div><span>);</span></div></div><div><div><div>58</div></div><div><span>CREATE</span><span> </span><span>INDEX</span><span> "</span><span>idx_tenant_id</span><span>" </span><span>ON</span><span> </span><span>"config_tags_relation"</span><span> ( </span><span>"tenant_id"</span><span> );</span></div></div><div><div><div>59</div></div><div><span>COMMENT ON TABLE </span><span>"config_tags_relation"</span><span> </span><span>IS</span><span> </span><span>'config_tag_relation'</span><span>;</span></div></div><div><div><div>60</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> "</span><span>group_capacity</span><span>" (</span></div></div><div><div><div>61</div></div><div><span>  </span><span>"id"</span><span> </span><span>BIGSERIAL</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>62</div></div><div><span>  </span><span>"group_id"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>63</div></div><div><span>  </span><span>"quota"</span><span> </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>64</div></div><div><span>  </span><span>"usage"</span><span> </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>65</div></div><div><span>  </span><span>"max_size"</span><span> </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>66</div></div><div><span>  </span><span>"max_aggr_count"</span><span> </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>67</div></div><div><span>  </span><span>"max_aggr_size"</span><span> </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>68</div></div><div><span>  </span><span>"max_history_count"</span><span> </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>0</span><span>,</span></div></div><div><div><div>69</div></div><div><span>  </span><span>"gmt_create"</span><span> </span><span>TIMESTAMP</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>70</div></div><div><span>  </span><span>"gmt_modified"</span><span> </span><span>TIMESTAMP</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>71</div></div><div><span>  </span><span>PRIMARY KEY</span><span> ( </span><span>"id"</span><span> ),</span></div></div><div><div><div>72</div></div><div><span>  </span><span>UNIQUE</span><span> ( </span><span>"group_id"</span><span> )</span></div></div><div><div><div>73</div></div><div><span>);</span></div></div><div><div><div>74</div></div><div><span>COMMENT ON TABLE </span><span>"group_capacity"</span><span> </span><span>IS</span><span> </span><span>'集群、各Group容量信息表'</span><span>;</span></div></div><div><div><div>75</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> "</span><span>users</span><span>" ( </span><span>"username"</span><span> </span><span>VARCHAR</span><span> ( </span><span>50</span><span> ) </span><span>NOT NULL</span><span> </span><span>PRIMARY KEY</span><span>, </span><span>"password"</span><span> </span><span>VARCHAR</span><span> ( </span><span>500</span><span> ) </span><span>NOT NULL</span><span>, </span><span>"enabled"</span><span> </span><span>BOOLEAN</span><span> </span><span>NOT NULL</span><span> );</span></div></div><div><div><div>76</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> "</span><span>roles</span><span>" ( </span><span>"username"</span><span> </span><span>VARCHAR</span><span> ( </span><span>50</span><span> ) </span><span>NOT NULL</span><span>, </span><span>"role"</span><span> </span><span>VARCHAR</span><span> ( </span><span>50</span><span> ) </span><span>NOT NULL</span><span>, </span><span>UNIQUE</span><span> ( </span><span>"username"</span><span>, </span><span>"role"</span><span> ) );</span></div></div><div><div><div>77</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> "</span><span>permissions</span><span>" (</span></div></div><div><div><div>78</div></div><div><span>  </span><span>"role"</span><span> </span><span>VARCHAR</span><span> ( </span><span>50</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>79</div></div><div><span>  </span><span>"resource"</span><span> </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>80</div></div><div><span>  </span><span>"action"</span><span> </span><span>VARCHAR</span><span> ( </span><span>8</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>81</div></div><div><span>  </span><span>UNIQUE</span><span> ( </span><span>"role"</span><span>, </span><span>"resource"</span><span>, </span><span>"action"</span><span> )</span></div></div><div><div><div>82</div></div><div><span>);</span></div></div><div><div><div>83</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> </span><span>config_info_beta</span><span> (</span></div></div><div><div><div>84</div></div><div><span><span>  </span></span><span>ID </span><span>INTEGER</span><span> AUTO_INCREMENT </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>85</div></div><div><span><span>  </span></span><span>data_id </span><span>VARCHAR</span><span> ( </span><span>255</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>86</div></div><div><span><span>  </span></span><span>group_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>87</div></div><div><span><span>  </span></span><span>app_name </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>88</div></div><div><span><span>  </span></span><span>CONTENT </span><span>TEXT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>89</div></div><div><span><span>  </span></span><span>beta_ips </span><span>TEXT</span><span> </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>90</div></div><div><span><span>  </span></span><span>md5 </span><span>VARCHAR</span><span> ( </span><span>32</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>91</div></div><div><span><span>  </span></span><span>gmt_create </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>92</div></div><div><span><span>  </span></span><span>gmt_modified </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>93</div></div><div><span><span>  </span></span><span>src_user </span><span>TEXT</span><span>,</span></div></div><div><div><div>94</div></div><div><span><span>  </span></span><span>src_ip </span><span>VARCHAR</span><span> ( </span><span>20</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>95</div></div><div><span><span>  </span></span><span>tenant_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>96</div></div><div><span><span>  </span></span><span>encrypted_data_key </span><span>TEXT</span></div></div><div><div><div>97</div></div><div><span>);</span></div></div><div><div><div>98</div></div><div><span>COMMENT ON TABLE </span><span>config_info_beta </span><span>IS</span><span> </span><span>'config_info_beta'</span><span>;</span></div></div><div><div><div>99</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_beta</span><span>.</span><span>gmt_create</span><span> </span><span>IS</span><span> </span><span>'创建时间'</span><span>;</span></div></div><div><div><div>100</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_beta</span><span>.</span><span>gmt_modified</span><span> </span><span>IS</span><span> </span><span>'修改时间'</span><span>;</span></div></div><div><div><div>101</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_beta</span><span>.</span><span>src_user</span><span> </span><span>IS</span><span> </span><span>'source user'</span><span>;</span></div></div><div><div><div>102</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_beta</span><span>.</span><span>tenant_id</span><span> </span><span>IS</span><span> </span><span>'租户字段'</span><span>;</span></div></div><div><div><div>103</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_beta</span><span>.</span><span>encrypted_data_key</span><span> </span><span>IS</span><span> </span><span>'秘钥'</span><span>;</span></div></div><div><div><div>104</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> config_info_beta </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> pk_config_info_beta </span><span>PRIMARY KEY</span><span> ( ID ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>105</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> config_info_beta </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> uk_configinfobeta_datagrouptenant </span><span>UNIQUE</span><span> ( data_id, group_id, tenant_id ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>106</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> </span><span>config_info_tag</span><span> (</span></div></div><div><div><div>107</div></div><div><span><span>  </span></span><span>ID </span><span>INTEGER</span><span> AUTO_INCREMENT </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>108</div></div><div><span><span>  </span></span><span>data_id </span><span>VARCHAR</span><span> ( </span><span>255</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>109</div></div><div><span><span>  </span></span><span>group_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>110</div></div><div><span><span>  </span></span><span>tenant_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>111</div></div><div><span><span>  </span></span><span>tag_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>112</div></div><div><span><span>  </span></span><span>app_name </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>113</div></div><div><span><span>  </span></span><span>CONTENT </span><span>TEXT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>114</div></div><div><span><span>  </span></span><span>md5 </span><span>VARCHAR</span><span> ( </span><span>32</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>115</div></div><div><span><span>  </span></span><span>gmt_create </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>116</div></div><div><span><span>  </span></span><span>gmt_modified </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>117</div></div><div><span><span>  </span></span><span>src_user </span><span>TEXT</span><span>,</span></div></div><div><div><div>118</div></div><div><span><span>  </span></span><span>src_ip </span><span>VARCHAR</span><span> ( </span><span>20</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span></div></div><div><div><div>119</div></div><div><span>);</span></div></div><div><div><div>120</div></div><div><span>COMMENT ON TABLE </span><span>config_info_tag </span><span>IS</span><span> </span><span>'config_info_tag'</span><span>;</span></div></div><div><div><div>121</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_tag</span><span>.</span><span>gmt_create</span><span> </span><span>IS</span><span> </span><span>'创建时间'</span><span>;</span></div></div><div><div><div>122</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_tag</span><span>.</span><span>gmt_modified</span><span> </span><span>IS</span><span> </span><span>'修改时间'</span><span>;</span></div></div><div><div><div>123</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_tag</span><span>.</span><span>src_user</span><span> </span><span>IS</span><span> </span><span>'source user'</span><span>;</span></div></div><div><div><div>124</div></div><div><span>COMMENT ON COLUMN </span><span>config_info_tag</span><span>.</span><span>src_ip</span><span> </span><span>IS</span><span> </span><span>'source ip'</span><span>;</span></div></div><div><div><div>125</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> config_info_tag </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> pk_config_info_tag </span><span>PRIMARY KEY</span><span> ( ID ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>126</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> config_info_tag </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> uk_configinfotag_datagrouptenanttag </span><span>UNIQUE</span><span> ( data_id, group_id, tenant_id, tag_id ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>127</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> </span><span>his_config_info</span><span> (</span></div></div><div><div><div>128</div></div><div><span><span>  </span></span><span>ID </span><span>BIGINT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>129</div></div><div><span><span>  </span></span><span>nid </span><span>BIGINT</span><span> </span><span>NOT NULL</span><span> AUTO_INCREMENT,</span></div></div><div><div><div>130</div></div><div><span><span>  </span></span><span>data_id </span><span>VARCHAR</span><span> ( </span><span>255</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>131</div></div><div><span><span>  </span></span><span>group_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>132</div></div><div><span><span>  </span></span><span>app_name </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>133</div></div><div><span><span>  </span></span><span>CONTENT </span><span>TEXT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>134</div></div><div><span><span>  </span></span><span>md5 </span><span>VARCHAR</span><span> ( </span><span>32</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>135</div></div><div><span><span>  </span></span><span>gmt_create </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>136</div></div><div><span><span>  </span></span><span>gmt_modified </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>137</div></div><div><span><span>  </span></span><span>src_user </span><span>TEXT</span><span>,</span></div></div><div><div><div>138</div></div><div><span><span>  </span></span><span>src_ip </span><span>VARCHAR</span><span> ( </span><span>20</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>139</div></div><div><span><span>  </span></span><span>op_type </span><span>CHAR</span><span> ( </span><span>10</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>140</div></div><div><span><span>  </span></span><span>tenant_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>141</div></div><div><span><span>  </span></span><span>encrypted_data_key </span><span>TEXT</span></div></div><div><div><div>142</div></div><div><span>);</span></div></div><div><div><div>143</div></div><div><span>COMMENT ON TABLE </span><span>his_config_info </span><span>IS</span><span> </span><span>'多租户改造'</span><span>;</span></div></div><div><div><div>144</div></div><div><span>COMMENT ON COLUMN </span><span>his_config_info</span><span>.</span><span>tenant_id</span><span> </span><span>IS</span><span> </span><span>'租户字段'</span><span>;</span></div></div><div><div><div>145</div></div><div><span>COMMENT ON COLUMN </span><span>his_config_info</span><span>.</span><span>encrypted_data_key</span><span> </span><span>IS</span><span> </span><span>'秘钥'</span><span>;</span></div></div><div><div><div>146</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> his_config_info </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> pk_his_config_info </span><span>PRIMARY KEY</span><span> ( nid ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>147</div></div><div><span>CREATE</span><span> </span><span>INDEX</span><span> </span><span>idx_gmt_create</span><span> </span><span>ON</span><span> his_config_info </span><span>USING</span><span> BTREE ( gmt_create ) TABLESPACE sys_default;</span></div></div><div><div><div>148</div></div><div><span>CREATE</span><span> </span><span>INDEX</span><span> </span><span>idx_gmt_modified</span><span> </span><span>ON</span><span> his_config_info </span><span>USING</span><span> BTREE ( gmt_modified ) TABLESPACE sys_default;</span></div></div><div><div><div>149</div></div><div><span>CREATE</span><span> </span><span>INDEX</span><span> </span><span>idx_did</span><span> </span><span>ON</span><span> his_config_info </span><span>USING</span><span> BTREE ( data_id ) TABLESPACE sys_default;</span></div></div><div><div><div>150</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> </span><span>tenant_capacity</span><span> (</span></div></div><div><div><div>151</div></div><div><span><span>  </span></span><span>ID </span><span>BIGINT</span><span> </span><span>NOT NULL</span><span> AUTO_INCREMENT,</span></div></div><div><div><div>152</div></div><div><span><span>  </span></span><span>tenant_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>153</div></div><div><span><span>  </span></span><span>quota </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>'0'</span><span>,</span></div></div><div><div><div>154</div></div><div><span><span>  </span></span><span>USAGE </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>'0'</span><span>,</span></div></div><div><div><div>155</div></div><div><span><span>  </span></span><span>max_size </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>'0'</span><span>,</span></div></div><div><div><div>156</div></div><div><span><span>  </span></span><span>max_aggr_count </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>'0'</span><span>,</span></div></div><div><div><div>157</div></div><div><span><span>  </span></span><span>max_aggr_size </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>'0'</span><span>,</span></div></div><div><div><div>158</div></div><div><span><span>  </span></span><span>max_history_count </span><span>INTEGER</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> </span><span>'0'</span><span>,</span></div></div><div><div><div>159</div></div><div><span><span>  </span></span><span>gmt_create </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP,</span></div></div><div><div><div>160</div></div><div><span><span>  </span></span><span>gmt_modified </span><span>datetime</span><span> </span><span>NOT NULL</span><span> </span><span>DEFAULT</span><span> CURRENT_TIMESTAMP</span></div></div><div><div><div>161</div></div><div><span>);</span></div></div><div><div><div>162</div></div><div><span>COMMENT ON TABLE </span><span>tenant_capacity </span><span>IS</span><span> </span><span>'租户容量信息表'</span><span>;</span></div></div><div><div><div>163</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>ID</span><span> </span><span>IS</span><span> </span><span>'主键ID'</span><span>;</span></div></div><div><div><div>164</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>tenant_id</span><span> </span><span>IS</span><span> </span><span>'Tenant ID'</span><span>;</span></div></div><div><div><div>165</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>quota</span><span> </span><span>IS</span><span> </span><span>'配额，0表示使用默认值'</span><span>;</span></div></div><div><div><div>166</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>USAGE</span><span> </span><span>IS</span><span> </span><span>'使用量'</span><span>;</span></div></div><div><div><div>167</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>max_size</span><span> </span><span>IS</span><span> </span><span>'单个配置大小上限，单位为字节，0表示使用默认值'</span><span>;</span></div></div><div><div><div>168</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>max_aggr_count</span><span> </span><span>IS</span><span> </span><span>'聚合子配置最大个数'</span><span>;</span></div></div><div><div><div>169</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>max_aggr_size</span><span> </span><span>IS</span><span> </span><span>'单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值'</span><span>;</span></div></div><div><div><div>170</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>max_history_count</span><span> </span><span>IS</span><span> </span><span>'最大变更历史数量'</span><span>;</span></div></div><div><div><div>171</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>gmt_create</span><span> </span><span>IS</span><span> </span><span>'创建时间'</span><span>;</span></div></div><div><div><div>172</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_capacity</span><span>.</span><span>gmt_modified</span><span> </span><span>IS</span><span> </span><span>'修改时间'</span><span>;</span></div></div><div><div><div>173</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> tenant_capacity </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> pk_tenant_capacity </span><span>PRIMARY KEY</span><span> ( ID ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>174</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> tenant_capacity </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> uk_tenant_id </span><span>UNIQUE</span><span> ( tenant_id ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>175</div></div><div><span>CREATE</span><span> </span><span>TABLE</span><span> </span><span>tenant_info</span><span> (</span></div></div><div><div><div>176</div></div><div><span><span>  </span></span><span>ID </span><span>BIGINT</span><span> </span><span>NOT NULL</span><span> AUTO_INCREMENT,</span></div></div><div><div><div>177</div></div><div><span><span>  </span></span><span>kp </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>178</div></div><div><span><span>  </span></span><span>tenant_id </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>179</div></div><div><span><span>  </span></span><span>tenant_name </span><span>VARCHAR</span><span> ( </span><span>128</span><span> ) </span><span>DEFAULT</span><span> </span><span>''</span><span>,</span></div></div><div><div><div>180</div></div><div><span><span>  </span></span><span>tenant_desc </span><span>VARCHAR</span><span> ( </span><span>256</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>181</div></div><div><span><span>  </span></span><span>create_source </span><span>VARCHAR</span><span> ( </span><span>32</span><span> ) </span><span>DEFAULT</span><span> </span><span>NULL</span><span>,</span></div></div><div><div><div>182</div></div><div><span><span>  </span></span><span>gmt_create </span><span>BIGINT</span><span> </span><span>NOT NULL</span><span>,</span></div></div><div><div><div>183</div></div><div><span><span>  </span></span><span>gmt_modified </span><span>BIGINT</span><span> </span><span>NOT NULL</span></div></div><div><div><div>184</div></div><div><span>);</span></div></div><div><div><div>185</div></div><div><span>COMMENT ON TABLE </span><span>tenant_info </span><span>IS</span><span> </span><span>'tenant_info'</span><span>;</span></div></div><div><div><div>186</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_info</span><span>.</span><span>gmt_create</span><span> </span><span>IS</span><span> </span><span>'创建时间'</span><span>;</span></div></div><div><div><div>187</div></div><div><span>COMMENT ON COLUMN </span><span>tenant_info</span><span>.</span><span>gmt_modified</span><span> </span><span>IS</span><span> </span><span>'修改时间'</span><span>;</span></div></div><div><div><div>188</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> tenant_info </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> pk_tenant_info </span><span>PRIMARY KEY</span><span> ( ID ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>189</div></div><div><span>ALTER</span><span> </span><span>TABLE</span><span> tenant_info </span><span>ADD</span><span> </span><span>CONSTRAINT</span><span> uk_tenant_info_kptenantid </span><span>UNIQUE</span><span> ( kp, tenant_id ) </span><span>ENABLE</span><span> VALIDATE;</span></div></div><div><div><div>190</div></div><div><span>CREATE</span><span> </span><span>INDEX</span><span> </span><span>idx_tenant_id_2</span><span> </span><span>ON</span><span> tenant_info </span><span>USING</span><span> BTREE ( tenant_id ) TABLESPACE sys_default;</span></div></div><div><div><div>191</div></div><div><span>INSERT INTO</span><span> tenant_info ( ID, kp, tenant_id, tenant_name, tenant_desc, create_source, gmt_create, gmt_modified )</span></div></div><div><div><div>192</div></div><div><span>VALUES</span></div></div><div><div><div>193</div></div><div><span><span>  </span></span><span>( </span><span>1</span><span>, </span><span>'1'</span><span>, </span><span>'dev'</span><span>, </span><span>'dev'</span><span>, </span><span>'开发环境'</span><span>, </span><span>NULL</span><span>, </span><span>1641741270448</span><span>, </span><span>1641741287236</span><span> ),</span></div></div><div><div><div>194</div></div><div><span><span>  </span></span><span>( </span><span>2</span><span>, </span><span>'1'</span><span>, </span><span>'prod'</span><span>, </span><span>'prod'</span><span>, </span><span>'生产环境'</span><span>, </span><span>NULL</span><span>, </span><span>1641741270448</span><span>, </span><span>1641741287236</span><span> ),</span></div></div><div><div><div>195</div></div><div><span><span>  </span></span><span>( </span><span>3</span><span>, </span><span>'1'</span><span>, </span><span>'test'</span><span>, </span><span>'test'</span><span>, </span><span>'测试环境'</span><span>, </span><span>NULL</span><span>, </span><span>1641741270448</span><span>, </span><span>1641741287236</span><span> );</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>正常情况会生成如下库和表单</p><p></p><figure><img alt="nacos数据库表" loading="lazy" width="378" height="468" src="/_astro/nacos-install-6.DSvDeT1H_RKFFy.webp" /><figcaption>nacos数据库表</figcaption></figure><p></p></section>
<section><h4>第七步：编写docker-compose.yml文件<a href="#第七步编写docker-composeyml文件"><span>#</span></a></h4><p>这个配置文件放哪儿都可以，笔者放在/home/nacos下，配置内容如下</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>services</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>nacos</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>image</span><span>: </span><span>nacos/nacos-server:latest</span></div></div><div><div><div>4</div></div><div><span>    </span><span>container_name</span><span>: </span><span>nacos</span></div></div><div><div><div>5</div></div><div><span>    </span><span>environment</span><span>:</span></div></div><div><div><div>6</div></div><div><span>      </span><span>MODE</span><span>: </span><span>standalone</span></div></div><div><div><div>7</div></div><div><span>      </span><span>JVM_XMS</span><span>: </span><span>512m</span></div></div><div><div><div>8</div></div><div><span>      </span><span>JVM_XMX</span><span>: </span><span>512m</span></div></div><div><div><div>9</div></div><div><span>      </span><span>JVM_XMN</span><span>: </span><span>256m</span></div></div><div><div><div>10</div></div><div><span>      </span><span>DB_POOL_CONFIG_DRIVERCLASSNAME</span><span>: </span><span>com.kingbase8.Driver</span></div></div><div><div><div>11</div></div><div><span>    </span><span>volumes</span><span>:</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>- </span><span>/data/nacos/libs/kingbase8-8.6.0.jar:/home/nacos/plugins/kingbase8-8.6.0.jar</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>- </span><span>/data/nacos/conf/application.properties:/home/nacos/conf/application.properties</span></div></div><div><div><div>14</div></div><div><span><span>      </span></span><span>- </span><span>/data/nacos/logs/:/home/nacos/logs</span></div></div><div><div><div>15</div></div><div><span>    </span><span>privileged</span><span>: </span><span>true</span></div></div><div><div><div>16</div></div><div><span>    </span><span>restart</span><span>: </span><span>always</span></div></div><div><div><div>17</div></div><div><span>    </span><span>network_mode</span><span>: </span><span>"host"</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h4>第八步：启动Nacos容器并访问<a href="#第八步启动nacos容器并访问"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 【需要修改】进入刚才编写好的docker-compose.yml所在目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/home/nacos</span></div></div><div><div><div>3</div></div><div><span># 启动！</span></div></div><div><div><div>4</div></div><div><span>docker-compose</span><span> </span><span>-f</span><span> </span><span>up</span><span> </span><span>docker-compose.yml</span><span> </span><span>up</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>接着直接访问服务器ip的8848端口即可打开nacos管理页，首次登录会要求设置密码</p><p></p><figure><img alt="设置nacos密码" loading="lazy" width="1920" height="1032" src="/_astro/nacos-install-7.BP1gFUFv_11YnzO.webp" /><figcaption>设置nacos密码</figcaption></figure><p></p><p></p><figure><img alt="nacos登录页" loading="lazy" width="1920" height="1032" src="/_astro/nacos-install-8.ZMbztnbz_Z24KYtY.webp" /><figcaption>nacos登录页</figcaption></figure><p></p><p>完成以上步骤便大功告成</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/kafka-install/</id>
      <title type="text">Kafka安装部署及配置教程</title>
      <published>2025-03-07T15:14:00.000Z</published>
      <updated>2025-03-07T15:14:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/kafka-install/"/>
      <summary type="text">使用Docker部署Kafka消息中间件，含镜像拉取、持久化目录映射及IP访问配置</summary>
      <content type="html"><![CDATA[<p>今天来说一下关于Kafka（卡夫卡）的部署方法，以下是市面上的主流消息中间件（如果打不开请使用科学手段）</p>
<p><strong>RabbitMQ</strong> <a href="https://www.rabbitmq.com/" target="_blank">https://www.rabbitmq.com/</a></p>
<p><strong>Kafka</strong> <a href="https://kafka.apache.org/" target="_blank">https://kafka.apache.org/</a></p>
<p><strong>RocketMQ</strong> <a href="https://rocketmq.apache.org/" target="_blank">https://rocketmq.apache.org/</a></p>
<p><strong>ActiveMQ</strong> <a href="https://activemq.apache.org/" target="_blank">https://activemq.apache.org/</a></p>
<p>其中，后三者为Apache基金会产品，这里不展开说明Apache基金会是什么以及四种消息中间件的优劣势，笔者最近正好在使用Kafka，那么下面直接进入正题。</p>
<section><h4>第一步：获取Kafka Docker镜像<a href="#第一步获取kafka-docker镜像"><span>#</span></a></h4><p>使用pull拉取最新Kafka镜像</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>apache/kafka</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第二步：启动临时容器并创建本地持久化目录<a href="#第二步启动临时容器并创建本地持久化目录"><span>#</span></a></h4><p>Kafka默认端口使用9092，首先先随便启一个容器，这样做只是为了方便创建容器内外目录的映射关系</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--name</span><span> </span><span>kafka</span><span> </span><span>-p</span><span> </span><span>9092:9092</span><span> </span><span>apache/kafka</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>使用cp命令拷贝容器内目录到本地，笔者此处将容器内目录拷贝至本地/data/kafka下，因此先创建本地目录</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data/kafka</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后拷贝容器内的目录至本地，注意冒号前的kafka是容器的名字，也可以使用容器id</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>cp</span><span> </span><span>kafka:/etc/kafka</span><span> </span><span>/data/kafka</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>拷贝完成后这个容器就没用了，干掉它，要先停止容器才能移除容器</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 停止容器</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>stop</span><span> </span><span>kafka</span></div></div><div><div><div>3</div></div><div><span># 移除容器</span></div></div><div><div><div>4</div></div><div><span>docker</span><span> </span><span>rm</span><span> </span><span>kafka</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第三步：创建Kafka容器并映射到本地持久化目录<a href="#第三步创建kafka容器并映射到本地持久化目录"><span>#</span></a></h4><p>很简单，直接一行命令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--name</span><span> </span><span>kafka</span><span> </span><span>-p</span><span> </span><span>9092:9092</span><span> </span><span>-v</span><span> </span><span>/data/kafka/:/etc/kafka/</span><span>  </span><span>apache/kafka</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样kafka服务就创建完成并且在9092端口上运行起来了，但是还没完，还需要开放ip访问，默认只允许使用localhost访问</p></section>
<section><h4>第四步：配置访问ip地址<a href="#第四步配置访问ip地址"><span>#</span></a></h4><p>在本地持久化目录下找到server.properties配置文件</p><p></p><figure><img alt="配置kafka访问ip" loading="lazy" width="776" height="336" src="/_astro/kafka-install-1.DWhDzgsh_Z10kz8A.webp" /><figcaption>配置kafka访问ip</figcaption></figure><p></p><p>把这里的ip地址改成服务器的IP地址，笔者使用的内网ip，根据实际开发需要修改，</p><div><div><div></div><div>如果是正式部署上线的项目，请不要使用服务器的公网ip</div></div><div></div></div><p></p><figure><img alt="配置kafka访问ip" loading="lazy" width="1060" height="96" src="/_astro/kafka-install-2.Vv_LFptn_Z2wukmt.webp" /><figcaption>配置kafka访问ip</figcaption></figure><p></p><p>最后重启一下容器，大功告成</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>restart</span><span> </span><span>kafka</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>完成以上步骤，一个简单的kafka服务就部署完成了</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/kingbase-install/</id>
      <title type="text">国产化数据库人大金仓（KingBase）部署教程</title>
      <published>2025-02-18T23:45:00.000Z</published>
      <updated>2025-02-18T23:45:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/kingbase-install/"/>
      <summary type="text">使用Docker部署国产化数据库人大金仓，涵盖镜像加载、持久化配置及数据库连接验证</summary>
      <content type="html"><![CDATA[<div><div><div></div><div>最近同事求助，加上笔者自己也没有做过相关的记录，在此讲解一下国产化数据库（KingBase）的部署教程，KingBase本质是什么用过PostgreSql的懂的都懂</div></div><div></div></div>
<p>Kingbase有多种部署方式，笔者这里推荐使用docker容器部署，维护方便，但是需要写一些配置文件，笔者将会以Linux环境下的部署为例，请确认你的Linux环境已经安装好docker服务以及docker-compose工具，如果没有安装，可以参考我之前的文章</p>
<p><a href="https://www.elysium-stack.cn/archives/docker-install" target="_blank">https://www.elysium-stack.cn/archives/docker-install</a></p>
<p>那么下面正式开始。</p>
<section><h4>第一步：获取人大金仓docker镜像<a href="#第一步获取人大金仓docker镜像"><span>#</span></a></h4><p>如果你有现成的镜像压缩包，比如<code>kingbase\_v008r006c008b0014\_single\_x86.tar</code>，那么可以跳过此步骤。</p><p>如果没有，打开</p><p><a href="https://www.kingbase.com.cn/download.html" target="_blank">https://www.kingbase.com.cn/download.html</a></p><p>找到**“<em>KingbaseES数据库Docker镜像</em>”**，右侧选择需要使用版本，然后在下方选择对应CPU的镜像包进行下载，一般选择X64_Linux，如果你使用的是国产化CPU，也可以选择对应的CPU版本进行下载。<code>（过程中可能会需要填写一些信息，看着填写即可）</code></p><div><figure><img alt="KingBaseES数据库Docker镜像" loading="lazy" width="1478" height="519" src="/_astro/kingbase-install-2.DE2Nmf6u_2sUDDX.webp" /><figcaption>KingBaseES数据库Docker镜像</figcaption></figure><figure><img alt="下载验证" loading="lazy" width="703" height="575" src="/_astro/kingbase-install-3.Dppp84Tv_2bYJrO.webp" /><figcaption>下载验证</figcaption></figure></div><p>接着你会得到一个tar格式的镜像压缩包。</p></section>
<section><h4>第二步：上传镜像压缩包至服务器<a href="#第二步上传镜像压缩包至服务器"><span>#</span></a></h4><p>可以随意找个文件夹塞进去，比如笔者喜欢放在<code>/home</code>下，然后cd进入该目录</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/home</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第三步：使用docker读取镜像压缩包<a href="#第三步使用docker读取镜像压缩包"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>load</span><span> </span><span>-i</span><span> </span><span>kingbase_v008r006c008b0014_single_x86.tar</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把压缩包的名字改成你实际压缩包的名字，读取完成后，可以使用images指令，查看当前已加载镜像。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>images</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第四步：创建数据持久化目录<a href="#第四步创建数据持久化目录"><span>#</span></a></h4><p>这个目录的作用是持久化数据库的数据，避免容器重启后数据丢失，笔者喜欢在根目录下创建一个<code>data</code>文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>data</span></div></div><div><div><div>3</div></div><div><span>cd</span><span> </span><span>/data</span></div></div><div><div><div>4</div></div><div><span>mkdir</span><span> </span><span>kingbase</span></div></div><div><div><div>5</div></div><div><span>cd</span><span> </span><span>/data/kingbase</span></div></div><div><div><div>6</div></div><div><span>mkdir</span><span> </span><span>data</span></div></div><div><div><div>7</div></div><div><span>cd</span><span> </span><span>/data/kingbase/data</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>稍后将会把容器内的数据库目录挂载到本地<code>/data/kingbase/data</code>目录下</p></section>
<section><h4>第五步：编写docker-compose.yml文件<a href="#第五步编写docker-composeyml文件"><span>#</span></a></h4><p>老规矩，回到笔者最爱的<code>home</code>，创建<code>docker-compose.yml</code>文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/home</span></div></div><div><div><div>2</div></div><div><span>vim</span><span> </span><span>docker-compose.yml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在<code>docker-compose.yml</code>中编写如下内容</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>services:</span></div></div><div><div><div>2</div></div><div><span>    </span><span>kingbase:</span></div></div><div><div><div>3</div></div><div><span>        </span><span># 这里可以自行修改你的容器名称（需自行修改）</span></div></div><div><div><div>4</div></div><div><span>        </span><span>container_name:</span><span> </span><span>kingbase</span></div></div><div><div><div>5</div></div><div><span>        </span><span># 这里是镜像名称，如果你不知道镜像名称可以使用docker images查看（需自行修改）</span></div></div><div><div><div>6</div></div><div><span>        </span><span>image:</span><span> </span><span>kingbase_v008r006c008b0014_single_x86:v1</span></div></div><div><div><div>7</div></div><div><span>        </span><span>privileged:</span><span> </span><span>true</span></div></div><div><div><div>8</div></div><div><span>        </span><span>restart:</span><span> </span><span>always</span></div></div><div><div><div>9</div></div><div><span>        </span><span>environment:</span></div></div><div><div><div>10</div></div><div><span>            </span><span>TZ:</span><span> </span><span>"Asia/Shanghai"</span></div></div><div><div><div>11</div></div><div><span>            </span><span># 访问数据库的用户名（需自行修改）</span></div></div><div><div><div>12</div></div><div><span>            </span><span>DB_USER:</span><span> </span><span>xxxx</span></div></div><div><div><div>13</div></div><div><span>            </span><span># 访问数据库的密码（需自行修改）</span></div></div><div><div><div>14</div></div><div><span>            </span><span>DB_PASSWORD:</span><span> </span><span>xxxx</span></div></div><div><div><div>15</div></div><div><span>        </span><span>ports:</span></div></div><div><div><div>16</div></div><div><span>            </span><span># 容器内部与外部的端口映射（默认不要动，kingbase默认使用54321端口）</span></div></div><div><div><div>17</div></div><div><span>            </span><span>-</span><span> </span><span>"54321:54321"</span></div></div><div><div><div>18</div></div><div><span>        </span><span>volumes:</span></div></div><div><div><div>19</div></div><div><span>            </span><span># 持久化目录映射，如果你刚才创建/data/kingbase/data/，那么你可以直接使用下面这个映射配置</span></div></div><div><div><div>20</div></div><div><span>            </span><span>-</span><span> </span><span>/data/kingbase/data/:/home/kingbase/userdata/data/</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>保存<code>docker-compose.yml</code>文件</p></section>
<section><h4>第六步：创建并运行容器<a href="#第六步创建并运行容器"><span>#</span></a></h4><p>使用docker-compose工具开始创建容器，首先确保处在<code>docker-compose.yml</code>同级目录中</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/home</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后执行如下命令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker-compose</span><span> </span><span>-f</span><span> </span><span>docker-compose.yml</span><span> </span><span>up</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>等待容器创建完毕</p></section>
<section><h4>第七步：查看容器运行状态<a href="#第七步查看容器运行状态"><span>#</span></a></h4><p>使用如下命令查看容器的运行状态</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>ps</span><span> </span><span>-a</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不出意外，你应该会看到</p><p></p><figure><img alt="容器运行状态" loading="lazy" width="1801" height="55" src="/_astro/kingbase-install-1.Cr6EC4qb_1ASlCJ.webp" /><figcaption>容器运行状态</figcaption></figure><p></p><p><code>STATUS</code>表示<code>Up xx xx</code>，即表示容器正在运行，部署完成。</p><p>下面是一些常用的容器管理指令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 启动容器</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>start</span><span> </span><span>容器名称或容器id</span></div></div><div><div><div>3</div></div><div><span># 停止容器</span></div></div><div><div><div>4</div></div><div><span>docker</span><span> </span><span>stop</span><span> </span><span>容器名称或容器id</span></div></div><div><div><div>5</div></div><div><span># 重启容器</span></div></div><div><div><div>6</div></div><div><span>docker</span><span> </span><span>restart</span><span> </span><span>容器名称或容器id</span></div></div><div><div><div>7</div></div><div><span># 删除容器</span></div></div><div><div><div>8</div></div><div><span>docker</span><span> </span><span>rm</span><span> </span><span>容器名称或容器id</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h4>第八步：访问数据库<a href="#第八步访问数据库"><span>#</span></a></h4><p>接下来你就可以使用各类DB工具进行访问了，需要注意的是，人大金仓默认初始数据库是<code>kingbase</code>，用户名和密码是刚才<code>docker-compose.yml</code>配置中的用户名和密码，端口号使用<code>54321</code></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.elysium-stack.cn/posts/docker-install/</id>
      <title type="text">docker/docker-compose安装教程</title>
      <published>2025-02-18T15:19:00.000Z</published>
      <updated>2025-02-18T15:19:00.000Z</updated>
      <author><name>梅莉</name></author>
      <link rel="alternate" href="https://blog.elysium-stack.cn/posts/docker-install/"/>
      <summary type="text">Linux环境下离线安装Docker与Docker-Compose的完整步骤，含服务配置与自启动设置</summary>
      <content type="html"><![CDATA[<p>最近经常遇到需要自己部署私有化服务，而多数情况下我都是使用docker容器去部署服务，那么docker的安装便成了部署的前置条件，受制于实际部署过程中有无网络等其它环境因素的影响，离线部署相对来说麻烦一点，下面详细说一下离线部署docker以及docker-compose的方式。</p>
<div><div><div></div><div>本文主要围绕linux操作系统说明docker/docker-compose的安装步骤，windows有桌面程序（<a href="https://www.docker.com/#run" target="_blank"><strong><em>docker desktop</em></strong></a>）可以直接使用，另外不同版本之间的命令可能会有差异，建议自行查阅官方文档获取准确的信息。</div></div><div></div></div>
<section><h2>docker安装<a href="#docker安装"><span>#</span></a></h2><section><h3>离线安装<a href="#离线安装"><span>#</span></a></h3><section><h4>第一步：下载docker离线部署包<a href="#第一步下载docker离线部署包"><span>#</span></a></h4><p>打开<a href="https://download.docker.com/linux/static/stable/x86_64/" target="_blank"><strong><em>下载地址</em></strong></a>随后按需下载对应版本的tgz压缩包即可</p></section><section><h4>第二步：上传docker部署包并解压<a href="#第二步上传docker部署包并解压"><span>#</span></a></h4><p>把下载好的tgz文件上传到你的服务器上，任意文件夹均可，例如 <strong><em>/home/docker-20.10.20.tgz</em></strong></p><p>进入docker包所在的目录下（此处为**<em>/home</em>**目录）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/home</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>解压缩tgz文件得到docker文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>tar</span><span> </span><span>-zxvf</span><span> </span><span>docker-20.10.20.tgz</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>第三步：移动docker文件夹至/usr/bin目录下<a href="#第三步移动docker文件夹至usrbin目录下"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mv</span><span> </span><span>docker/</span><span>*</span><span> </span><span>/usr/bin/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>第四步：创建docker.service配置文件<a href="#第四步创建dockerservice配置文件"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/systemd/system/docker.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>建议这个配置文件放在**<em>/etc/systemd/system/</em>**</p><p>然后将docker.service配置文件中的内容修改为如下</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[Unit]</span></div></div><div><div><div>2</div></div><div><span>Description</span><span>=</span><span>Docker</span><span> </span><span>Application</span><span> </span><span>Container</span><span> </span><span>Engine</span></div></div><div><div><div>3</div></div><div><span>Documentation</span><span>=</span><span>https://docs.docker.com</span></div></div><div><div><div>4</div></div><div><span>After</span><span>=</span><span>network-online.target</span><span> </span><span>firewalld.service</span></div></div><div><div><div>5</div></div><div><span>Wants</span><span>=</span><span>network-online.target</span></div></div><div><div><div>6</div></div><div><span>[Service]</span></div></div><div><div><div>7</div></div><div><span>Type</span><span>=</span><span>notify</span></div></div><div><div><div>8</div></div><div><span>ExecStart</span><span>=</span><span>/usr/bin/dockerd</span></div></div><div><div><div>9</div></div><div><span>ExecReload</span><span>=</span><span>/bin/kill</span><span> </span><span>-s</span><span> </span><span>HUP</span><span> </span><span>$MAINPID</span></div></div><div><div><div>10</div></div><div><span>LimitNOFILE</span><span>=</span><span>infinity</span></div></div><div><div><div>11</div></div><div><span>LimitNPROC</span><span>=</span><span>infinity</span></div></div><div><div><div>12</div></div><div><span>TimeoutStartSec</span><span>=</span><span>0</span></div></div><div><div><div>13</div></div><div><span>Delegate</span><span>=</span><span>yes</span></div></div><div><div><div>14</div></div><div><span>KillMode</span><span>=</span><span>process</span></div></div><div><div><div>15</div></div><div><span>Restart</span><span>=</span><span>on-failure</span></div></div><div><div><div>16</div></div><div><span>StartLimitBurst</span><span>=</span><span>3</span></div></div><div><div><div>17</div></div><div><span>StartLimitInterval</span><span>=</span><span>60s</span></div></div><div><div><div>18</div></div><div><span>[Install]</span></div></div><div><div><div>19</div></div><div><span>WantedBy</span><span>=</span><span>multi-user.target</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>接着保存即可</p></section><section><h4>第五步：修改docker执行权限<a href="#第五步修改docker执行权限"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>/etc/systemd/system/docker.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后重启daemon使其生效</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>第六步：设置自启动<a href="#第六步设置自启动"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>docker.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>第七步：启动docker<a href="#第七步启动docker"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>docker</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>第八步：验证docker安装<a href="#第八步验证docker安装"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>显示docker版本信息即安装完成</p></section></section></section>
<section><h2>docker-compose安装<a href="#docker-compose安装"><span>#</span></a></h2><section><h3>离线安装<a href="#离线安装-1"><span>#</span></a></h3><section><h4>第一步：从github上下载docker-compose<a href="#第一步从github上下载docker-compose"><span>#</span></a></h4><p>打开<a href="https://github.com/docker/compose/releases" target="_blank"><strong><em>https://github.com/docker/compose/releases</em></strong></a>根据需要下载对应的docker-compose文件，我这里下载的docker-compose-linux-x86_64，不同的服务器内核会有区别</p></section><section><h4>第二步：上传docker-compose文件<a href="#第二步上传docker-compose文件"><span>#</span></a></h4><p>随便找个地方放，我放在**<em>/home</em>**下</p></section><section><h4>第三步：移动docker-compose至/usr/local/bin目录下<a href="#第三步移动docker-compose至usrlocalbin目录下"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mv</span><span> </span><span>docker-compose-linux-x86_64</span><span> </span><span>/usr/local/bin/docker-compose</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>第四步：修改docker-conpose执行权限<a href="#第四步修改docker-conpose执行权限"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>/usr/local/bin/docker-compose</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>第五步：验证docker-compose安装<a href="#第五步验证docker-compose安装"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker-compose</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>显示docker-compose版本信息即安装完成</p></section></section></section>]]></content>
    </entry>
</feed>
