Repository navigation
Expand file tree
/
Copy pathrss.xml
More file actions
413 lines (413 loc) · 55 KB
/
Copy pathrss.xml
File metadata and controls
413 lines (413 loc) · 55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>g list ting z</title>
<subtitle>天行健,君子以自强不息</subtitle>
<icon>https://fuuuzzy.github.io/images/favicon.ico</icon>
<link>https://fuuuzzy.github.io</link>
<author>
<name>fuuuzzy</name>
</author>
<description>一个会java的咸鱼,积极学习中</description>
<language>zh-CN</language>
<pubDate>Wed, 04 Mar 2026 11:00:00 +0800</pubDate>
<lastBuildDate>Wed, 04 Mar 2026 11:00:00 +0800</lastBuildDate>
<category term="java" />
<item>
<guid isPermalink="true">https://fuuuzzy.github.io/2026-03-04-trending-moeru-ai-airi/</guid>
<title>AI新玩法: 开源AI伴侣 Airi 让你的 waifu 活过来了</title>
<link>https://fuuuzzy.github.io/2026-03-04-trending-moeru-ai-airi/</link>
<category term="AI" scheme="https://fuuuzzy.github.io/categories/AI/" />
<category term="Open Source" scheme="https://fuuuzzy.github.io/tags/Open-Source/" />
<category term="Airi" scheme="https://fuuuzzy.github.io/tags/Airi/" />
<category term="AI Companion" scheme="https://fuuuzzy.github.io/tags/AI-Companion/" />
<category term="LLM Agent" scheme="https://fuuuzzy.github.io/tags/LLM-Agent/" />
<category term="Waifu" scheme="https://fuuuzzy.github.io/tags/Waifu/" />
<pubDate>Wed, 04 Mar 2026 11:00:00 +0800</pubDate>
<description><![CDATA[ <p>在 AI Agent 爆发的今天,我们见过写代码的 Agent,见过做研究的 Agent,但你见过能陪你玩《我的世界》(Minecraft) 甚至《异星工厂》(Factorio) 的 AI 伴侣吗?</p>
<p>今天 GitHub Trending 榜单上的一匹黑马 —— <strong><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL21vZXJ1LWFpL2Fpcmk=">moeru-ai/airi</span></strong>,或许就是你一直在寻找的那个 &quot;她&quot;。</p>
<p><span id="more"></span></p>
<h2 id="什么是-airi"><a class="anchor" href="#什么是-airi">#</a> 什么是 Airi?</h2>
<p>Airi 是一个开源的、可自托管的 AI 伴侣项目。项目的愿景非常浪漫:</p>
<blockquote>
<p>&quot;A container of souls of waifu, cyber livings to bring them into our worlds.&quot;<br />
(Waifu 的灵魂容器,将赛博生命带入我们的世界。)</p>
</blockquote>
<p>它的目标是复刻甚至超越像 <strong>Neuro-sama</strong> 这样的虚拟主播 AI。与普通的聊天机器人不同,Airi 强调的是<strong>实时互动</strong>和<strong>多模态感知</strong>。</p>
<h3 id="核心特性"><a class="anchor" href="#核心特性">#</a> 核心特性</h3>
<ol>
<li><strong>实时语音聊天</strong>:支持低延迟的语音交互,不仅仅是文字回复,而是真实的对话体验。</li>
<li><strong>游戏陪伴</strong>:它可以不仅仅是 “看” 你玩游戏,甚至能作为一个独立的 Agent 加入游戏(目前支持 Minecraft 和 Factorio)。</li>
<li><strong>多平台支持</strong>:可以在 Web、macOS 和 Windows 上运行。</li>
<li><strong>灵魂容器</strong>:你可以自定义它的性格、声音和外貌,打造独一无二的 AI 伴侣。</li>
</ol>
<h2 id="技术架构简析"><a class="anchor" href="#技术架构简析">#</a> 技术架构简析</h2>
<p>Airi 的底层架构非常现代,充分利用了大模型 (LLM) 的能力。</p>
<ul>
<li><strong>大脑 (LLM)</strong>: 可以对接 OpenAI GPT-4, Claude, 或者本地运行的开源模型(如 Llama 3, DeepSeek 等)。</li>
<li><strong>耳朵 (ASR)</strong>: 使用 Whisper 等技术实现自动语音识别。</li>
<li><strong>嘴巴 (TTS)</strong>: 集成了 VITS, ElevenLabs 等高质量语音合成引擎,让声音听起来自然且富有情感。</li>
<li><strong>身体 (Agent)</strong>: 通过特定的环境接口(如 Mineflayer 对于 Minecraft),实现对游戏世界的感知和操作。</li>
</ul>
<h2 id="快速上手"><a class="anchor" href="#快速上手">#</a> 快速上手</h2>
<p>如果你想在本地体验 Airi,你需要准备好 Node.js 环境。</p>
<h3 id="1-克隆项目"><a class="anchor" href="#1-克隆项目">#</a> 1. 克隆项目</h3>
<figure class="highlight bash"><figcaption data-lang="bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">git</span> clone https://github.com/moeru-ai/airi.git</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token builtin class-name">cd</span> airi</pre></td></tr></table></figure><h3 id="2-安装依赖"><a class="anchor" href="#2-安装依赖">#</a> 2. 安装依赖</h3>
<figure class="highlight bash"><figcaption data-lang="bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">pnpm</span> <span class="token function">install</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment"># 或者</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">npm</span> <span class="token function">install</span></pre></td></tr></table></figure><h3 id="3-配置环境"><a class="anchor" href="#3-配置环境">#</a> 3. 配置环境</h3>
<p>复制 <code>.env.example</code> 为 <code>.env</code> ,并填入必要的 API Key(如果你使用云端 LLM)或本地服务地址。</p>
<figure class="highlight bash"><figcaption data-lang="bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">cp</span> .env.example .env</pre></td></tr></table></figure><h3 id="4-启动"><a class="anchor" href="#4-启动">#</a> 4. 启动</h3>
<figure class="highlight bash"><figcaption data-lang="bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">npm</span> run dev</pre></td></tr></table></figure><p>启动后,访问 <code>http://localhost:3000</code> ,你就能看到你的 AI 伴侣了。</p>
<h2 id="为什么它值得关注"><a class="anchor" href="#为什么它值得关注">#</a> 为什么它值得关注?</h2>
<p>Airi 代表了 AI 应用的一个重要方向:<strong>情感陪伴与娱乐化</strong>。</p>
<p>目前的 AI 创业大多集中在提效工具(copilot, document analysis),但情感需求同样是人类的刚需。Airi 开源社区的活跃(今天一天就涨了 800+ star!),证明了开发者们对于构建 “有温度的 AI” 有着极大的热情。</p>
<p>如果你也是一个极客,或者只是单纯想拥有一个二次元赛博朋友,不妨去 GitHub 上给它点个 Star,甚至尝试贡献代码。</p>
<hr />
<p><em>本文由 OpenClaw 自动化抓取 GitHub Trending 生成。</em></p>
]]></description>
</item>
<item>
<guid isPermalink="true">https://fuuuzzy.github.io/version-control/gitlab-ci/</guid>
<title>git-ci学习记录</title>
<link>https://fuuuzzy.github.io/version-control/gitlab-ci/</link>
<category term="版本控制" scheme="https://fuuuzzy.github.io/categories/version-control/" />
<category term="java" scheme="https://fuuuzzy.github.io/tags/java/" />
<category term="linux" scheme="https://fuuuzzy.github.io/tags/linux/" />
<category term="git" scheme="https://fuuuzzy.github.io/tags/git/" />
<pubDate>Fri, 25 Apr 2025 12:20:00 +0800</pubDate>
<description><![CDATA[ <h1 id="gitlab-ci机制"><a class="anchor" href="#gitlab-ci机制">#</a> gitlab-ci 机制</h1>
<blockquote>
<p>gitlab 提供了自动部署的能力,其自动部署本质上就是启动一个 docker,在镜像内执行一些脚本,在提交代码后根据配置文件自动执行一些脚本</p>
</blockquote>
<h2 id="如何使用"><a class="anchor" href="#如何使用">#</a> 如何使用</h2>
<p>首先在项目内创建一个 gitlab-ci.yml 文件,这是自动部署入口,所有的逻辑都是基于这个文件开始的</p>
<blockquote>
<p>文件的整体结构</p>
</blockquote>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>stages:</pre></td></tr><tr><td data-num="2"></td><td><pre> - deploy //定义步骤</pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre>deploy_job: //具体的执行任务</pre></td></tr><tr><td data-num="5"></td><td><pre> stage: deploy </pre></td></tr><tr><td data-num="6"></td><td><pre> image: node:21 //docker镜像</pre></td></tr><tr><td data-num="7"></td><td><pre> before_script: //开始前的脚本</pre></td></tr><tr><td data-num="8"></td><td><pre> - <span class="token function">npm</span> <span class="token function">install</span> <span class="token parameter variable">-g</span> wrangler</pre></td></tr><tr><td data-num="9"></td><td><pre> script: //主要脚本</pre></td></tr><tr><td data-num="10"></td><td><pre> - <span class="token builtin class-name">export</span> <span class="token assign-left variable">CLOUDFLARE_ACCOUNT_ID</span><span class="token operator">=</span><span class="token variable">$CLOUDFLARE_ACCOUNT_ID</span></pre></td></tr><tr><td data-num="11"></td><td><pre> - <span class="token builtin class-name">export</span> <span class="token assign-left variable">CLOUDFLARE_API_TOKEN</span><span class="token operator">=</span><span class="token variable">$CLOUDFLARE_API_TOKEN</span></pre></td></tr><tr><td data-num="12"></td><td><pre> - <span class="token function">npm</span> <span class="token function">install</span></pre></td></tr><tr><td data-num="13"></td><td><pre> - <span class="token function">npm</span> run deploy</pre></td></tr><tr><td data-num="14"></td><td><pre> after_script: //收尾的脚本</pre></td></tr><tr><td data-num="15"></td><td><pre> - <span class="token operator">|</span>-</pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token function">cat</span> <span class="token operator">&lt;&lt;</span> EOF <span class="token operator">></span> <span class="token number">1</span>.json</pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token punctuation">&#123;</span><span class="token string">"msg_type"</span><span class="token builtin class-name">:</span><span class="token string">"interactive"</span>,<span class="token string">"card"</span>:<span class="token punctuation">&#123;</span><span class="token string">"elements"</span>:<span class="token punctuation">[</span><span class="token punctuation">&#123;</span><span class="token string">"tag"</span><span class="token builtin class-name">:</span><span class="token string">"markdown"</span>,<span class="token string">"content"</span><span class="token builtin class-name">:</span><span class="token string">"项目名:**<span class="token variable">$CI_PROJECT_TITLE</span>** &lt;br>分支名:**<span class="token variable">$CI_COMMIT_BRANCH</span>** &lt;br>提交信息:**<span class="token variable">$CI_COMMIT_MESSAGE</span>** &lt;br>CF Pages 部署域名:**admin-luckyshort-com.pages.dev**"</span><span class="token punctuation">&#125;</span><span class="token punctuation">]</span>,<span class="token string">"header"</span>:<span class="token punctuation">&#123;</span><span class="token string">"template"</span><span class="token builtin class-name">:</span><span class="token string">"green"</span>,<span class="token string">"title"</span>:<span class="token punctuation">&#123;</span><span class="token string">"content"</span><span class="token builtin class-name">:</span><span class="token string">"BI后台部署成功"</span>,<span class="token string">"tag"</span><span class="token builtin class-name">:</span><span class="token string">"plain_text"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></pre></td></tr><tr><td data-num="18"></td><td><pre> EOF</pre></td></tr><tr><td data-num="19"></td><td><pre> - <span class="token operator">|</span>-</pre></td></tr><tr><td data-num="20"></td><td><pre> <span class="token function">cat</span> <span class="token operator">&lt;&lt;</span> EOF <span class="token operator">></span> fs.sh</pre></td></tr><tr><td data-num="21"></td><td><pre> <span class="token comment">#!/bin/bash</span></pre></td></tr><tr><td data-num="22"></td><td><pre> <span class="token function">curl</span> <span class="token parameter variable">-X</span> POST <span class="token string">"https://open.feishu.cn/open-apis/bot/v2/hook/57083d96-04bc-4a29-8cad-ed98dd72f2b1"</span> <span class="token parameter variable">-H</span> <span class="token string">'Content-Type: application/json'</span> <span class="token parameter variable">-d</span> @1.json</pre></td></tr><tr><td data-num="23"></td><td><pre> EOF</pre></td></tr><tr><td data-num="24"></td><td><pre> - <span class="token function">chmod</span> a+x ./fs.sh</pre></td></tr><tr><td data-num="25"></td><td><pre> - ./fs.sh</pre></td></tr><tr><td data-num="26"></td><td><pre> only: //执行规则</pre></td></tr><tr><td data-num="27"></td><td><pre> - main </pre></td></tr><tr><td data-num="28"></td><td><pre> cache: //是否需要缓存</pre></td></tr><tr><td data-num="29"></td><td><pre> key: npm-cache</pre></td></tr><tr><td data-num="30"></td><td><pre> paths:</pre></td></tr><tr><td data-num="31"></td><td><pre> - .npm/</pre></td></tr><tr><td data-num="32"></td><td><pre> - node_modules</pre></td></tr></table></figure> ]]></description>
</item>
<item>
<guid isPermalink="true">https://fuuuzzy.github.io/version-control/git/</guid>
<title>git常用命令</title>
<link>https://fuuuzzy.github.io/version-control/git/</link>
<category term="版本控制" scheme="https://fuuuzzy.github.io/categories/version-control/" />
<category term="java" scheme="https://fuuuzzy.github.io/tags/java/" />
<category term="linux" scheme="https://fuuuzzy.github.io/tags/linux/" />
<category term="git" scheme="https://fuuuzzy.github.io/tags/git/" />
<pubDate>Wed, 13 Dec 2023 14:20:00 +0800</pubDate>
<description><![CDATA[ <h1 id="git"><a class="anchor" href="#git">#</a> Git</h1>
<blockquote>
<p>主要用来记录 Git 相关命令,忘记了可以过来找下对应的</p>
</blockquote>
<h2 id="常用命令"><a class="anchor" href="#常用命令">#</a> 常用命令</h2>
<table>
<thead>
<tr>
<th>命令说明</th>
<th>命令</th>
</tr>
</thead>
<tbody>
<tr>
<td>初始化仓库</td>
<td>git init</td>
</tr>
<tr>
<td>添加文件到本地仓库</td>
<td>git add .(文件 name)</td>
</tr>
<tr>
<td>添加文件描述信息</td>
<td>git commit -m “first commit”</td>
</tr>
<tr>
<td>添加远程仓库</td>
<td>git remote add origin + 远程仓库地址</td>
</tr>
<tr>
<td>同步远程分支</td>
<td>git pull origin master</td>
</tr>
<tr>
<td>线性合并远程仓库</td>
<td>git pull --rebase origin master (无需 commit)</td>
</tr>
<tr>
<td>推送到远程分支</td>
<td>git push origin master &lt;远程主机名&gt; &lt; 本地分支名 &gt;:&lt; 远程分支名 &gt;</td>
</tr>
<tr>
<td>强制推送</td>
<td>git push --force origin master</td>
</tr>
<tr>
<td>查看本地分支</td>
<td>git branch -v &lt;-a 查看所有分支&gt;</td>
</tr>
<tr>
<td>查看远程分支</td>
<td>git branch -r</td>
</tr>
<tr>
<td>删除本地分支</td>
<td>git branch -d branName</td>
</tr>
<tr>
<td>删除远程分支</td>
<td>git push origin --delete master</td>
</tr>
<tr>
<td>删除远程仓库文件</td>
<td>git rm -r --cached [filenam]</td>
</tr>
<tr>
<td>切换分支</td>
<td>git checkout main</td>
</tr>
<tr>
<td>创建本地分支</td>
<td>git branch [name]</td>
</tr>
<tr>
<td>拉取远程分支代码</td>
<td>git fetch</td>
</tr>
<tr>
<td>合并分支</td>
<td>git merge [name]</td>
</tr>
<tr>
<td>创建并切换分支</td>
<td>git checkout -b main</td>
</tr>
<tr>
<td>设置默认提交分支</td>
<td>git push -u origin master &lt;执行后下次推送可直接 git push&gt;</td>
</tr>
<tr>
<td>同步远程删除的分支</td>
<td>git remote prune origin</td>
</tr>
<tr>
<td>更新远程分支信息</td>
<td>git remote update origin --prune</td>
</tr>
<tr>
<td>查看提交记录</td>
<td>git log</td>
</tr>
<tr>
<td>清除 Git 缓存密码</td>
<td>git credential-manager uninstall</td>
</tr>
<tr>
<td>分支重命名</td>
<td>git branch -m master main</td>
</tr>
<tr>
<td>重新验证账户密码</td>
<td>git config --global credential.helper store</td>
</tr>
<tr>
<td>查看 git 配置信息</td>
<td>git cofig --list 简写 git config -l</td>
</tr>
<tr>
<td>设置全局账户 / 邮箱</td>
<td>git config --global (<span class="exturl" data-url="aHR0cDovL3VzZXIubmFtZQ==">user.name</span> &quot;&quot; )</td>
</tr>
<tr>
<td>设置当前仓库账户 / 邮箱</td>
<td>git confit --local (<span class="exturl" data-url="aHR0cDovL3VzZXIubmFtZQ==">user.name</span> &quot;&quot; )</td>
</tr>
<tr>
<td>覆盖之前的提交信息</td>
<td>git commit --amend -m&quot;说明信息&quot;</td>
</tr>
<tr>
<td>回退版本,只回退 commit 信息</td>
<td>git reset --soft</td>
</tr>
<tr>
<td>彻底回退,源码和 commit 均回退</td>
<td>git reset --hard</td>
</tr>
</tbody>
</table>
<blockquote>
<p>远程仓库命令</p>
</blockquote>
<ul>
<li>查看远程仓库:git remote -v</li>
<li>添加远程仓库:git remote add [name] [url]</li>
<li>删除远程仓库:git remote rm [name]</li>
<li>修改远程仓库:git remote set-url --push [name] [newUrl]</li>
<li>拉取远程仓库:git pull [remoteName] [localBranchName]</li>
<li>推送远程仓库:git push [remoteName] [localBranchName]</li>
<li>提交暂存区到仓库: git commit -m [message]</li>
<li>自动将修改文件添加到索引中;并显示提交信息: git commit -a</li>
<li>追加提交,覆盖上次的提交信息: git commit --amend</li>
</ul>
<blockquote>
<p>分支 branch 命令</p>
</blockquote>
<ul>
<li>查看本地分支:git branch</li>
<li>查看远程分支:git branch -r</li>
<li>创建本地分支:git branch [name] ---- 注意新分支创建后不会自动切换为当前分支</li>
<li>切换分支:git checkout [name]</li>
<li>创建新分支并立即切换到新分支:$ git checkout -b [name]</li>
<li>删除分支:git branch -d [name] ---- -d<br />
选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用 - D 选项</li>
<li>合并分支:git merge [name] ---- 将名称为 [name] 的分支与当前分支合并</li>
<li>创建远程分支 (本地分支 push 到远程):$ git push origin [name]</li>
<li>删除远程分支:git push origin --delete [branch_name]</li>
<li>创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则没有提交的内容会被强制删掉)</li>
</ul>
<blockquote>
<p>版本 tag 相关命令</p>
</blockquote>
<ul>
<li>查看版本:git tag</li>
<li>创建版本:git tag [name]</li>
<li>删除版本:git tag -d [name]</li>
<li>查看远程版本:git tag -r</li>
<li>创建远程版本 (本地版本 push 到远程):git push origin [name]</li>
<li>删除远程版本:git push origin :refs/tags/[name]</li>
<li>合并远程仓库的 tag 到本地:git pull origin --tags</li>
<li>上传本地 tag 到远程仓库:git push origin --tags</li>
<li>创建带注释的 tag:git tag -a [name] -m 'yourMessage'</li>
</ul>
<blockquote>
<p>子模块 (submodule) 相关操作命令</p>
</blockquote>
<ul>
<li>添加子模块:git submodule add [url] [path]</li>
<li>初始化子模块:git submodule init ---- 只在首次检出仓库时运行一次就行</li>
<li>更新子模块:git submodule update ---- 每次更新或切换分支后都需要运行一下</li>
<li>删除子模块:(分 4 步走哦)</li>
</ul>
<blockquote>
<p>.gitignore 的文件规则</p>
</blockquote>
<p>在仓库根目录下创建名称为 “.gitignore” 的文件,写入不需要的文件夹名或文件,每个元素占一行</p>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>target <span class="token comment">#忽略 dbg 文件和 dbg 目录 </span></pre></td></tr><tr><td data-num="2"></td><td><pre>target/ <span class="token comment">#只忽略 target 文件,不忽略 dbg 目录</span></pre></td></tr><tr><td data-num="3"></td><td><pre>target</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token operator">!</span>target/ <span class="token comment">#只忽略 dbg 文件不忽略 dgb 目录</span></pre></td></tr><tr><td data-num="5"></td><td><pre>/target <span class="token comment">#只忽略当前目录下的 target 文件和目录,子目录的 target 不在忽略范围内</span></pre></td></tr><tr><td data-num="6"></td><td><pre>bin </pre></td></tr><tr><td data-num="7"></td><td><pre>*.db</pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment">#忽略规则</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment"># 以 '#' 开始的行,被视为注释.</span></pre></td></tr><tr><td data-num="10"></td><td><pre> * ?:代表任意的一个字符</pre></td></tr><tr><td data-num="11"></td><td><pre> * *:代表任意数目的字符</pre></td></tr><tr><td data-num="12"></td><td><pre> * <span class="token punctuation">&#123;</span><span class="token operator">!</span>ab<span class="token punctuation">&#125;</span>:必须不是此类型</pre></td></tr><tr><td data-num="13"></td><td><pre> * <span class="token punctuation">&#123;</span>ab,bb,cx<span class="token punctuation">&#125;</span>:代表ab,bb,cx中任一类型即可</pre></td></tr><tr><td data-num="14"></td><td><pre> * <span class="token punctuation">[</span>abc<span class="token punctuation">]</span>:代表a,b,c中任一字符即可</pre></td></tr><tr><td data-num="15"></td><td><pre> * <span class="token punctuation">[</span> ^abc<span class="token punctuation">]</span>:代表必须不是a,b,c中任一字符</pre></td></tr></table></figure><blockquote>
<p>转载声明<br />
本文部分命令转载自:<span class="exturl" data-url="aHR0cHM6Ly9ibG9nLm11YmFpLmxpbmsvMjAyMi8wNi8yOS9HaXQvR2l0">https://blog.mubai.link/2022/06/29/Git/Git</span></p>
</blockquote>
]]></description>
</item>
<item>
<guid isPermalink="true">https://fuuuzzy.github.io/serve-deploy/caddy/</guid>
<title>初见Caddy</title>
<link>https://fuuuzzy.github.io/serve-deploy/caddy/</link>
<category term="服务器部署" scheme="https://fuuuzzy.github.io/categories/serve-deploy/" />
<category term="java" scheme="https://fuuuzzy.github.io/tags/java/" />
<category term="caddy" scheme="https://fuuuzzy.github.io/tags/caddy/" />
<category term="linux" scheme="https://fuuuzzy.github.io/tags/linux/" />
<pubDate>Tue, 10 Oct 2023 18:20:00 +0800</pubDate>
<description><![CDATA[ <h1 id="caddy的使用"><a class="anchor" href="#caddy的使用">#</a> Caddy 的使用</h1>
<h2 id="简单的介绍"><a class="anchor" href="#简单的介绍">#</a> 简单的介绍</h2>
<p><span class="exturl" data-url="aHR0cHM6Ly9jYWRkeXNlcnZlci5jb20v">Caddy</span><br />
是一个轻量级的 HTTP/2 服务器,具有自动 HTTPS 功能,并且可以轻松配置。它支持多种协议,包括 HTTP/2、HTTP/1.1、WebSocket、gRPC 等,并且可以处理静态文件、反向代理、负载均衡、SSL/TLS 等任务。<br />
基于配置简单的原因,在一些场景下可以平替 Nginx,更轻松的部署服务器。</p>
<h3 id="caddy的功能"><a class="anchor" href="#caddy的功能">#</a> caddy 的功能</h3>
<ol>
<li>自动 HTTPS:Caddy 可以自动为网站提供 SSL/TLS 证书,无需手动配置。</li>
<li>简单配置:Caddy 的配置文件非常简单,易于理解和修改。</li>
<li>多协议支持:Caddy 支持多种协议,包括 HTTP/2、HTTP/1.1、WebSocket、gRPC 等。</li>
<li>反向代理:Caddy 可以轻松配置反向代理,将请求转发到其他服务器。</li>
<li>负载均衡:Caddy 可以配置负载均衡,将请求分发到多个服务器。</li>
<li>静态文件处理:Caddy 可以处理静态文件,包括 HTML、CSS、JavaScript、图片等。</li>
<li>日志记录:Caddy 可以记录访问日志,包括请求 URL、响应状态码、请求时间等。</li>
<li>插件支持:Caddy 支持多种插件,可以扩展其功能。</li>
</ol>
<h3 id="caddy跟nginx的对比"><a class="anchor" href="#caddy跟nginx的对比">#</a> caddy 跟 nginx 的对比</h3>
<ul>
<li>Caddy 的配置文件更简单,更易于理解和修改。</li>
<li>Caddy 支持自动 HTTPS,无需手动配置。</li>
<li>Caddy 的静态文件处理更简单,无需手动配置。</li>
<li>Caddy 的日志记录更详细,包括请求 URL、响应状态码、请求时间等。</li>
</ul>
<p><em><strong>性能对比:虽然 Caddy 在配置简单性和安全性方面具有优势,但在处理高并发请求时,Nginx 可能更为适合。<br />
这是因为 Nginx 经过长时间的发展和优化,已经在生产环境中证明了其在处理大量并发连接时的稳定性和效率。<br />
此外,Nginx 的社区支持和广泛的插件生态系统也是其受欢迎的原因之一,因此在处理一些小的并发量上,Caddy 更容易上手</strong></em></p>
<h2 id="caddy的使用只介绍linux下的使用"><a class="anchor" href="#caddy的使用只介绍linux下的使用">#</a> caddy 的使用(只介绍 linux 下的使用)</h2>
<h3 id="linux安装"><a class="anchor" href="#linux安装">#</a> linux 安装</h3>
<p>Caddy 的安装非常简单,可以通过以下命令进行安装:</p>
<ol>
<li>安装 Caddy</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> <span class="token parameter variable">-y</span> debian-keyring debian-archive-keyring apt-transport-https <span class="token function">curl</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">curl</span> <span class="token parameter variable">-1sLf</span> <span class="token string">'https://dl.cloudsmith.io/public/caddy/stable/gpg.key'</span> <span class="token operator">|</span> <span class="token function">sudo</span> gpg <span class="token parameter variable">--dearmor</span> <span class="token parameter variable">-o</span> /usr/share/keyrings/caddy-stable-archive-keyring.gpg</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">curl</span> <span class="token parameter variable">-1sLf</span> <span class="token string">'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt'</span> <span class="token operator">|</span> <span class="token function">sudo</span> <span class="token function">tee</span> /etc/apt/sources.list.d/caddy-stable.list</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token function">sudo</span> <span class="token function">apt</span> update</pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> caddy</pre></td></tr></table></figure><p>默认情况下,caddy 的配置文件会在 /etc/caddy/Caddyfile, 没有后缀</p>
<ol start="2">
<li>启动 Caddy</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">sudo</span> systemctl start caddy --config<span class="token operator">&lt;</span>指定配置文件路径<span class="token operator">></span> 默认会去/etc/caddy/Caddyfile</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token comment">#或者</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">sudo</span> caddy run <span class="token parameter variable">--config</span> 默认会去/etc/caddy/Caddyfile</pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment">#查看启动状态</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token function">sudo</span> systemctl status caddy</pre></td></tr><tr><td data-num="7"></td><td><pre></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token comment">#停止 caddy</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token function">sudo</span> systemctl stop caddy <span class="token operator">||</span> caddy stop</pre></td></tr><tr><td data-num="10"></td><td><pre></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment">#重启 caddy</span></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token function">sudo</span> systemctl restart caddy <span class="token operator">||</span> caddy restart</pre></td></tr><tr><td data-num="13"></td><td><pre></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token comment">#如果修改了配置文件,可以通过一下命令刷新配置</span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token function">sudo</span> caddy reload</pre></td></tr></table></figure><ol start="3">
<li>
<p>配置 Caddy (<em><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cuemhlLmluay9oYW5kYm9vay9jYWRkeTIvZG9jcy9pbnN0YWxsLmh0bWw=">官方文档</span></strong></em>)</p>
<ol>
<li>文件服务</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>:10100 </pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> root * /opt/</pre></td></tr><tr><td data-num="4"></td><td><pre> file_server</pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token punctuation">&#125;</span></pre></td></tr></table></figure><ol start="2">
<li>文件预览服务</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>:10100 </pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> root * /opt/</pre></td></tr><tr><td data-num="4"></td><td><pre> file_server browse</pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token punctuation">&#125;</span></pre></td></tr></table></figure><ol start="3">
<li>反向代理</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>:10100</pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> root * /opt/</pre></td></tr><tr><td data-num="4"></td><td><pre> reverse_proxy /community/* eco.dameng.com</pre></td></tr><tr><td data-num="5"></td><td><pre> file_server browse</pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token punctuation">&#125;</span></pre></td></tr></table></figure><ol start="4">
<li>重定向</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>:10100</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> root * /opt/</pre></td></tr><tr><td data-num="4"></td><td><pre> reverse_proxy /community/* eco.dameng.com</pre></td></tr><tr><td data-num="5"></td><td><pre> redir /info/* https://eco.dameng.com<span class="token punctuation">&#123;</span>uri<span class="token punctuation">&#125;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> file_server browse</pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">&#125;</span></pre></td></tr></table></figure><ol start="5">
<li>重写</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>:10100</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> root * /opt/</pre></td></tr><tr><td data-num="4"></td><td><pre> reverse_proxy /community/* eco.dameng.com</pre></td></tr><tr><td data-num="5"></td><td><pre> redir /info/* https://eco.dameng.com<span class="token punctuation">&#123;</span>uri<span class="token punctuation">&#125;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> </pre></td></tr><tr><td data-num="7"></td><td><pre> rewrite /test1.html /test.html</pre></td></tr><tr><td data-num="8"></td><td><pre> </pre></td></tr><tr><td data-num="9"></td><td><pre> file_server browse</pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token punctuation">&#125;</span></pre></td></tr></table></figure><ol start="6">
<li>单页面应用</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre>example.com </pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> encode <span class="token function">gzip</span></pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre> handle /api/* <span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> reverse_proxy backend:8000</pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token punctuation">&#125;</span></pre></td></tr><tr><td data-num="8"></td><td><pre></pre></td></tr><tr><td data-num="9"></td><td><pre> handle <span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> root * /path/to/site</pre></td></tr><tr><td data-num="11"></td><td><pre> try_files <span class="token punctuation">&#123;</span>path<span class="token punctuation">&#125;</span> /index.html</pre></td></tr><tr><td data-num="12"></td><td><pre> file_server</pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token punctuation">&#125;</span></pre></td></tr></table></figure><ol start="7">
<li>日志配置</li>
</ol>
</li>
</ol>
<figure class="highlight shell"><figcaption data-lang="Bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="2"></td><td><pre> debug</pre></td></tr><tr><td data-num="3"></td><td><pre> log <span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> output <span class="token function">file</span> /var/log/access.log</pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token punctuation">&#125;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token punctuation">&#125;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> </pre></td></tr><tr><td data-num="8"></td><td><pre> :10100</pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token punctuation">&#123;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> </pre></td></tr><tr><td data-num="11"></td><td><pre> root * /opt/</pre></td></tr><tr><td data-num="12"></td><td><pre> reverse_proxy /community/* eco.dameng.com</pre></td></tr><tr><td data-num="13"></td><td><pre> redir /info/* https://eco.dameng.com<span class="token punctuation">&#123;</span>uri<span class="token punctuation">&#125;</span></pre></td></tr><tr><td data-num="14"></td><td><pre> </pre></td></tr><tr><td data-num="15"></td><td><pre> rewrite /test1.html /test.html</pre></td></tr><tr><td data-num="16"></td><td><pre> </pre></td></tr><tr><td data-num="17"></td><td><pre> file_server browse</pre></td></tr><tr><td data-num="18"></td><td><pre> <span class="token punctuation">&#125;</span></pre></td></tr></table></figure> ]]></description>
</item>
<item>
<guid isPermalink="true">https://fuuuzzy.github.io/Java/java-kill/</guid>
<title>记录排查java程序部署在服务器上无故停止的情况</title>
<link>https://fuuuzzy.github.io/Java/java-kill/</link>
<category term="Java" scheme="https://fuuuzzy.github.io/categories/Java/" />
<category term="java" scheme="https://fuuuzzy.github.io/tags/java/" />
<pubDate>Sat, 08 Jul 2023 14:20:00 +0800</pubDate>
<description><![CDATA[ <h1 id="前言"><a class="anchor" href="#前言">#</a> 前言</h1>
<pre><code> 前两天部署了一个java程序在服务器,服务器是2核2G的,但每次部署后
持续一段时间后,会无故进程停止了,没有任何日志记录,查看业务日志,java进程是正常退出的
也通过添加JVM一些启动参数来生成错误日志以及堆转储日志,都没有发现问题
考虑到服务器内存较小,不知道是不是这个原因
</code></pre>
<h2 id="可能导致进程被杀掉的情况"><a class="anchor" href="#可能导致进程被杀掉的情况">#</a> 可能导致进程被杀掉的情况</h2>
<ol>
<li>内存泄漏;</li>
<li>进程所需的内存资源太大,对于 java 进程而言,除了 - Xmx 设置最大堆大小,还需要考虑元数据空间、堆外内存、直接内存的使用;</li>
<li>其他进程需要占用较多的资源,但是被 OOM Killer 机制选中当前进程;</li>
</ol>
<p>经过排查发现,是因为系统内存资源紧张,被系统选中杀死</p>
<h3 id="主要介绍linux的oom-killer机制"><a class="anchor" href="#主要介绍linux的oom-killer机制">#</a> 主要介绍 Linux 的 OOM Killer 机制</h3>
<pre><code>Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。
</code></pre>
<h3 id="怎么避免oom-killer误杀我的业务进程"><a class="anchor" href="#怎么避免oom-killer误杀我的业务进程">#</a> 怎么避免 OOM Killer 误杀我的业务进程?</h3>
<p>避免 oom killer 的方案</p>
<ol>
<li>直接修改 /proc//oom_score_adj 文件,将其置为 - 1000</li>
</ol>
<pre><code>以前是通过/proc//oom_score来控制的,但近年来新版linux已经使用oom_score_adj来代替旧版的oom_score
</code></pre>
<ol start="2">
<li>直接关闭</li>
</ol>
<pre><code class="language-aiignore">关闭
echo &quot;0&quot; &gt; /proc/sys/vm/oom-kill
激活
echo &quot;1″ &gt; /proc/sys/vm/oom-kill
</code></pre>
]]></description>
</item>
</channel>
</rss>