-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfeed.json
More file actions
75 lines (75 loc) · 38.2 KB
/
feed.json
File metadata and controls
75 lines (75 loc) · 38.2 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
{
"version": "https://jsonfeed.org/version/1",
"title": "g list ting z",
"subtitle": "天行健,君子以自强不息",
"icon": "https://fuuuzzy.github.io/images/favicon.ico",
"description": "一个会java的咸鱼,积极学习中",
"home_page_url": "https://fuuuzzy.github.io",
"items": [
{
"id": "https://fuuuzzy.github.io/2026-03-04-trending-moeru-ai-airi/",
"url": "https://fuuuzzy.github.io/2026-03-04-trending-moeru-ai-airi/",
"title": "AI新玩法: 开源AI伴侣 Airi 让你的 waifu 活过来了",
"date_published": "2026-03-04T03:00:00.000Z",
"content_html": "<p>在 AI Agent 爆发的今天,我们见过写代码的 Agent,见过做研究的 Agent,但你见过能陪你玩《我的世界》(Minecraft) 甚至《异星工厂》(Factorio) 的 AI 伴侣吗?</p>\n<p>今天 GitHub Trending 榜单上的一匹黑马 —— <strong><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL21vZXJ1LWFpL2Fpcmk=\">moeru-ai/airi</span></strong>,或许就是你一直在寻找的那个 "她"。</p>\n<p><span id=\"more\"></span></p>\n<h2 id=\"什么是-airi\"><a class=\"anchor\" href=\"#什么是-airi\">#</a> 什么是 Airi?</h2>\n<p>Airi 是一个开源的、可自托管的 AI 伴侣项目。项目的愿景非常浪漫:</p>\n<blockquote>\n<p>"A container of souls of waifu, cyber livings to bring them into our worlds."<br />\n(Waifu 的灵魂容器,将赛博生命带入我们的世界。)</p>\n</blockquote>\n<p>它的目标是复刻甚至超越像 <strong>Neuro-sama</strong> 这样的虚拟主播 AI。与普通的聊天机器人不同,Airi 强调的是<strong>实时互动</strong>和<strong>多模态感知</strong>。</p>\n<h3 id=\"核心特性\"><a class=\"anchor\" href=\"#核心特性\">#</a> 核心特性</h3>\n<ol>\n<li><strong>实时语音聊天</strong>:支持低延迟的语音交互,不仅仅是文字回复,而是真实的对话体验。</li>\n<li><strong>游戏陪伴</strong>:它可以不仅仅是 “看” 你玩游戏,甚至能作为一个独立的 Agent 加入游戏(目前支持 Minecraft 和 Factorio)。</li>\n<li><strong>多平台支持</strong>:可以在 Web、macOS 和 Windows 上运行。</li>\n<li><strong>灵魂容器</strong>:你可以自定义它的性格、声音和外貌,打造独一无二的 AI 伴侣。</li>\n</ol>\n<h2 id=\"技术架构简析\"><a class=\"anchor\" href=\"#技术架构简析\">#</a> 技术架构简析</h2>\n<p>Airi 的底层架构非常现代,充分利用了大模型 (LLM) 的能力。</p>\n<ul>\n<li><strong>大脑 (LLM)</strong>: 可以对接 OpenAI GPT-4, Claude, 或者本地运行的开源模型(如 Llama 3, DeepSeek 等)。</li>\n<li><strong>耳朵 (ASR)</strong>: 使用 Whisper 等技术实现自动语音识别。</li>\n<li><strong>嘴巴 (TTS)</strong>: 集成了 VITS, ElevenLabs 等高质量语音合成引擎,让声音听起来自然且富有情感。</li>\n<li><strong>身体 (Agent)</strong>: 通过特定的环境接口(如 Mineflayer 对于 Minecraft),实现对游戏世界的感知和操作。</li>\n</ul>\n<h2 id=\"快速上手\"><a class=\"anchor\" href=\"#快速上手\">#</a> 快速上手</h2>\n<p>如果你想在本地体验 Airi,你需要准备好 Node.js 环境。</p>\n<h3 id=\"1-克隆项目\"><a class=\"anchor\" href=\"#1-克隆项目\">#</a> 1. 克隆项目</h3>\n<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>\n<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>\n<p>复制 <code>.env.example</code> 为 <code>.env</code> ,并填入必要的 API Key(如果你使用云端 LLM)或本地服务地址。</p>\n<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>\n<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>\n<h2 id=\"为什么它值得关注\"><a class=\"anchor\" href=\"#为什么它值得关注\">#</a> 为什么它值得关注?</h2>\n<p>Airi 代表了 AI 应用的一个重要方向:<strong>情感陪伴与娱乐化</strong>。</p>\n<p>目前的 AI 创业大多集中在提效工具(copilot, document analysis),但情感需求同样是人类的刚需。Airi 开源社区的活跃(今天一天就涨了 800+ star!),证明了开发者们对于构建 “有温度的 AI” 有着极大的热情。</p>\n<p>如果你也是一个极客,或者只是单纯想拥有一个二次元赛博朋友,不妨去 GitHub 上给它点个 Star,甚至尝试贡献代码。</p>\n<hr />\n<p><em>本文由 OpenClaw 自动化抓取 GitHub Trending 生成。</em></p>\n",
"tags": [
"AI",
"Open Source",
"Airi",
"AI Companion",
"LLM Agent",
"Waifu"
]
},
{
"id": "https://fuuuzzy.github.io/version-control/gitlab-ci/",
"url": "https://fuuuzzy.github.io/version-control/gitlab-ci/",
"title": "git-ci学习记录",
"date_published": "2025-04-25T04:20:00.000Z",
"content_html": "<h1 id=\"gitlab-ci机制\"><a class=\"anchor\" href=\"#gitlab-ci机制\">#</a> gitlab-ci 机制</h1>\n<blockquote>\n<p>gitlab 提供了自动部署的能力,其自动部署本质上就是启动一个 docker,在镜像内执行一些脚本,在提交代码后根据配置文件自动执行一些脚本</p>\n</blockquote>\n<h2 id=\"如何使用\"><a class=\"anchor\" href=\"#如何使用\">#</a> 如何使用</h2>\n<p>首先在项目内创建一个 gitlab-ci.yml 文件,这是自动部署入口,所有的逻辑都是基于这个文件开始的</p>\n<blockquote>\n<p>文件的整体结构</p>\n</blockquote>\n<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\"><<</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\">{</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\">{</span><span class=\"token string\">\"elements\"</span>:<span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</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>** <br>分支名:**<span class=\"token variable\">$CI_COMMIT_BRANCH</span>** <br>提交信息:**<span class=\"token variable\">$CI_COMMIT_MESSAGE</span>** <br>CF Pages 部署域名:**admin-luckyshort-com.pages.dev**\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span>,<span class=\"token string\">\"header\"</span>:<span class=\"token punctuation\">{</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\">{</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\">}</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</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\"><<</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>",
"tags": [
"版本控制",
"java",
"linux",
"git"
]
},
{
"id": "https://fuuuzzy.github.io/version-control/git/",
"url": "https://fuuuzzy.github.io/version-control/git/",
"title": "git常用命令",
"date_published": "2023-12-13T06:20:00.000Z",
"content_html": "<h1 id=\"git\"><a class=\"anchor\" href=\"#git\">#</a> Git</h1>\n<blockquote>\n<p>主要用来记录 Git 相关命令,忘记了可以过来找下对应的</p>\n</blockquote>\n<h2 id=\"常用命令\"><a class=\"anchor\" href=\"#常用命令\">#</a> 常用命令</h2>\n<table>\n<thead>\n<tr>\n<th>命令说明</th>\n<th>命令</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>初始化仓库</td>\n<td>git init</td>\n</tr>\n<tr>\n<td>添加文件到本地仓库</td>\n<td>git add .(文件 name)</td>\n</tr>\n<tr>\n<td>添加文件描述信息</td>\n<td>git commit -m “first commit”</td>\n</tr>\n<tr>\n<td>添加远程仓库</td>\n<td>git remote add origin + 远程仓库地址</td>\n</tr>\n<tr>\n<td>同步远程分支</td>\n<td>git pull origin master</td>\n</tr>\n<tr>\n<td>线性合并远程仓库</td>\n<td>git pull --rebase origin master (无需 commit)</td>\n</tr>\n<tr>\n<td>推送到远程分支</td>\n<td>git push origin master <远程主机名> < 本地分支名 >:< 远程分支名 ></td>\n</tr>\n<tr>\n<td>强制推送</td>\n<td>git push --force origin master</td>\n</tr>\n<tr>\n<td>查看本地分支</td>\n<td>git branch -v <-a 查看所有分支></td>\n</tr>\n<tr>\n<td>查看远程分支</td>\n<td>git branch -r</td>\n</tr>\n<tr>\n<td>删除本地分支</td>\n<td>git branch -d branName</td>\n</tr>\n<tr>\n<td>删除远程分支</td>\n<td>git push origin --delete master</td>\n</tr>\n<tr>\n<td>删除远程仓库文件</td>\n<td>git rm -r --cached [filenam]</td>\n</tr>\n<tr>\n<td>切换分支</td>\n<td>git checkout main</td>\n</tr>\n<tr>\n<td>创建本地分支</td>\n<td>git branch [name]</td>\n</tr>\n<tr>\n<td>拉取远程分支代码</td>\n<td>git fetch</td>\n</tr>\n<tr>\n<td>合并分支</td>\n<td>git merge [name]</td>\n</tr>\n<tr>\n<td>创建并切换分支</td>\n<td>git checkout -b main</td>\n</tr>\n<tr>\n<td>设置默认提交分支</td>\n<td>git push -u origin master <执行后下次推送可直接 git push></td>\n</tr>\n<tr>\n<td>同步远程删除的分支</td>\n<td>git remote prune origin</td>\n</tr>\n<tr>\n<td>更新远程分支信息</td>\n<td>git remote update origin --prune</td>\n</tr>\n<tr>\n<td>查看提交记录</td>\n<td>git log</td>\n</tr>\n<tr>\n<td>清除 Git 缓存密码</td>\n<td>git credential-manager uninstall</td>\n</tr>\n<tr>\n<td>分支重命名</td>\n<td>git branch -m master main</td>\n</tr>\n<tr>\n<td>重新验证账户密码</td>\n<td>git config --global credential.helper store</td>\n</tr>\n<tr>\n<td>查看 git 配置信息</td>\n<td>git cofig --list 简写 git config -l</td>\n</tr>\n<tr>\n<td>设置全局账户 / 邮箱</td>\n<td>git config --global (<span class=\"exturl\" data-url=\"aHR0cDovL3VzZXIubmFtZQ==\">user.name</span> "" )</td>\n</tr>\n<tr>\n<td>设置当前仓库账户 / 邮箱</td>\n<td>git confit --local (<span class=\"exturl\" data-url=\"aHR0cDovL3VzZXIubmFtZQ==\">user.name</span> "" )</td>\n</tr>\n<tr>\n<td>覆盖之前的提交信息</td>\n<td>git commit --amend -m"说明信息"</td>\n</tr>\n<tr>\n<td>回退版本,只回退 commit 信息</td>\n<td>git reset --soft</td>\n</tr>\n<tr>\n<td>彻底回退,源码和 commit 均回退</td>\n<td>git reset --hard</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>远程仓库命令</p>\n</blockquote>\n<ul>\n<li>查看远程仓库:git remote -v</li>\n<li>添加远程仓库:git remote add [name] [url]</li>\n<li>删除远程仓库:git remote rm [name]</li>\n<li>修改远程仓库:git remote set-url --push [name] [newUrl]</li>\n<li>拉取远程仓库:git pull [remoteName] [localBranchName]</li>\n<li>推送远程仓库:git push [remoteName] [localBranchName]</li>\n<li>提交暂存区到仓库: git commit -m [message]</li>\n<li>自动将修改文件添加到索引中;并显示提交信息: git commit -a</li>\n<li>追加提交,覆盖上次的提交信息: git commit --amend</li>\n</ul>\n<blockquote>\n<p>分支 branch 命令</p>\n</blockquote>\n<ul>\n<li>查看本地分支:git branch</li>\n<li>查看远程分支:git branch -r</li>\n<li>创建本地分支:git branch [name] ---- 注意新分支创建后不会自动切换为当前分支</li>\n<li>切换分支:git checkout [name]</li>\n<li>创建新分支并立即切换到新分支:$ git checkout -b [name]</li>\n<li>删除分支:git branch -d [name] ---- -d<br />\n 选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用 - D 选项</li>\n<li>合并分支:git merge [name] ---- 将名称为 [name] 的分支与当前分支合并</li>\n<li>创建远程分支 (本地分支 push 到远程):$ git push origin [name]</li>\n<li>删除远程分支:git push origin --delete [branch_name]</li>\n<li>创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则没有提交的内容会被强制删掉)</li>\n</ul>\n<blockquote>\n<p>版本 tag 相关命令</p>\n</blockquote>\n<ul>\n<li>查看版本:git tag</li>\n<li>创建版本:git tag [name]</li>\n<li>删除版本:git tag -d [name]</li>\n<li>查看远程版本:git tag -r</li>\n<li>创建远程版本 (本地版本 push 到远程):git push origin [name]</li>\n<li>删除远程版本:git push origin :refs/tags/[name]</li>\n<li>合并远程仓库的 tag 到本地:git pull origin --tags</li>\n<li>上传本地 tag 到远程仓库:git push origin --tags</li>\n<li>创建带注释的 tag:git tag -a [name] -m 'yourMessage'</li>\n</ul>\n<blockquote>\n<p>子模块 (submodule) 相关操作命令</p>\n</blockquote>\n<ul>\n<li>添加子模块:git submodule add [url] [path]</li>\n<li>初始化子模块:git submodule init ---- 只在首次检出仓库时运行一次就行</li>\n<li>更新子模块:git submodule update ---- 每次更新或切换分支后都需要运行一下</li>\n<li>删除子模块:(分 4 步走哦)</li>\n</ul>\n<blockquote>\n<p>.gitignore 的文件规则</p>\n</blockquote>\n<p>在仓库根目录下创建名称为 “.gitignore” 的文件,写入不需要的文件夹名或文件,每个元素占一行</p>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>target\t \t<span class=\"token comment\">#忽略 dbg 文件和 dbg 目录 \t</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>target/\t \t<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/ \t<span class=\"token comment\">#只忽略 dbg 文件不忽略 dgb 目录</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>/target \t<span class=\"token comment\">#只忽略当前目录下的 target 文件和目录,子目录的 target 不在忽略范围内</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>bin\t\t </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\">{</span><span class=\"token operator\">!</span>ab<span class=\"token punctuation\">}</span>:必须不是此类型</pre></td></tr><tr><td data-num=\"13\"></td><td><pre> * <span class=\"token punctuation\">{</span>ab,bb,cx<span class=\"token punctuation\">}</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>\n<p>转载声明<br />\n本文部分命令转载自:<span class=\"exturl\" data-url=\"aHR0cHM6Ly9ibG9nLm11YmFpLmxpbmsvMjAyMi8wNi8yOS9HaXQvR2l0\">https://blog.mubai.link/2022/06/29/Git/Git</span></p>\n</blockquote>\n",
"tags": [
"版本控制",
"java",
"linux",
"git"
]
},
{
"id": "https://fuuuzzy.github.io/serve-deploy/caddy/",
"url": "https://fuuuzzy.github.io/serve-deploy/caddy/",
"title": "初见Caddy",
"date_published": "2023-10-10T10:20:00.000Z",
"content_html": "<h1 id=\"caddy的使用\"><a class=\"anchor\" href=\"#caddy的使用\">#</a> Caddy 的使用</h1>\n<h2 id=\"简单的介绍\"><a class=\"anchor\" href=\"#简单的介绍\">#</a> 简单的介绍</h2>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9jYWRkeXNlcnZlci5jb20v\">Caddy</span><br />\n 是一个轻量级的 HTTP/2 服务器,具有自动 HTTPS 功能,并且可以轻松配置。它支持多种协议,包括 HTTP/2、HTTP/1.1、WebSocket、gRPC 等,并且可以处理静态文件、反向代理、负载均衡、SSL/TLS 等任务。<br />\n基于配置简单的原因,在一些场景下可以平替 Nginx,更轻松的部署服务器。</p>\n<h3 id=\"caddy的功能\"><a class=\"anchor\" href=\"#caddy的功能\">#</a> caddy 的功能</h3>\n<ol>\n<li>自动 HTTPS:Caddy 可以自动为网站提供 SSL/TLS 证书,无需手动配置。</li>\n<li>简单配置:Caddy 的配置文件非常简单,易于理解和修改。</li>\n<li>多协议支持:Caddy 支持多种协议,包括 HTTP/2、HTTP/1.1、WebSocket、gRPC 等。</li>\n<li>反向代理:Caddy 可以轻松配置反向代理,将请求转发到其他服务器。</li>\n<li>负载均衡:Caddy 可以配置负载均衡,将请求分发到多个服务器。</li>\n<li>静态文件处理:Caddy 可以处理静态文件,包括 HTML、CSS、JavaScript、图片等。</li>\n<li>日志记录:Caddy 可以记录访问日志,包括请求 URL、响应状态码、请求时间等。</li>\n<li>插件支持:Caddy 支持多种插件,可以扩展其功能。</li>\n</ol>\n<h3 id=\"caddy跟nginx的对比\"><a class=\"anchor\" href=\"#caddy跟nginx的对比\">#</a> caddy 跟 nginx 的对比</h3>\n<ul>\n<li>Caddy 的配置文件更简单,更易于理解和修改。</li>\n<li>Caddy 支持自动 HTTPS,无需手动配置。</li>\n<li>Caddy 的静态文件处理更简单,无需手动配置。</li>\n<li>Caddy 的日志记录更详细,包括请求 URL、响应状态码、请求时间等。</li>\n</ul>\n<p><em><strong>性能对比:虽然 Caddy 在配置简单性和安全性方面具有优势,但在处理高并发请求时,Nginx 可能更为适合。<br />\n这是因为 Nginx 经过长时间的发展和优化,已经在生产环境中证明了其在处理大量并发连接时的稳定性和效率。<br />\n此外,Nginx 的社区支持和广泛的插件生态系统也是其受欢迎的原因之一,因此在处理一些小的并发量上,Caddy 更容易上手</strong></em></p>\n<h2 id=\"caddy的使用只介绍linux下的使用\"><a class=\"anchor\" href=\"#caddy的使用只介绍linux下的使用\">#</a> caddy 的使用(只介绍 linux 下的使用)</h2>\n<h3 id=\"linux安装\"><a class=\"anchor\" href=\"#linux安装\">#</a> linux 安装</h3>\n<p>Caddy 的安装非常简单,可以通过以下命令进行安装:</p>\n<ol>\n<li>安装 Caddy</li>\n</ol>\n<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>\n<ol start=\"2\">\n<li>启动 Caddy</li>\n</ol>\n<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\"><</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\">\n<li>\n<p>配置 Caddy (<em><strong><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuemhlLmluay9oYW5kYm9vay9jYWRkeTIvZG9jcy9pbnN0YWxsLmh0bWw=\">官方文档</span></strong></em>)</p>\n<ol>\n<li>文件服务</li>\n</ol>\n<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\">{</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\">}</span></pre></td></tr></table></figure><ol start=\"2\">\n<li>文件预览服务</li>\n</ol>\n<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\">{</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\">}</span></pre></td></tr></table></figure><ol start=\"3\">\n<li>反向代理</li>\n</ol>\n<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\">{</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\">}</span></pre></td></tr></table></figure><ol start=\"4\">\n<li>重定向</li>\n</ol>\n<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\">{</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\">{</span>uri<span class=\"token punctuation\">}</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\">}</span></pre></td></tr></table></figure><ol start=\"5\">\n<li>重写</li>\n</ol>\n<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\">{</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\">{</span>uri<span class=\"token punctuation\">}</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\">}</span></pre></td></tr></table></figure><ol start=\"6\">\n<li>单页面应用</li>\n</ol>\n<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\">{</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\">{</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\">}</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\">{</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\">{</span>path<span class=\"token punctuation\">}</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\">}</span></pre></td></tr></table></figure><ol start=\"7\">\n<li>日志配置</li>\n</ol>\n</li>\n</ol>\n<figure class=\"highlight shell\"><figcaption data-lang=\"Bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token punctuation\">{</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\">{</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\">}</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token punctuation\">}</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\">{</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\">{</span>uri<span class=\"token punctuation\">}</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\">}</span></pre></td></tr></table></figure>",
"tags": [
"服务器部署",
"java",
"caddy",
"linux"
]
},
{
"id": "https://fuuuzzy.github.io/Java/java-kill/",
"url": "https://fuuuzzy.github.io/Java/java-kill/",
"title": "记录排查java程序部署在服务器上无故停止的情况",
"date_published": "2023-07-08T06:20:00.000Z",
"content_html": "<h1 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h1>\n<pre><code> 前两天部署了一个java程序在服务器,服务器是2核2G的,但每次部署后\n 持续一段时间后,会无故进程停止了,没有任何日志记录,查看业务日志,java进程是正常退出的\n 也通过添加JVM一些启动参数来生成错误日志以及堆转储日志,都没有发现问题\n 考虑到服务器内存较小,不知道是不是这个原因\n</code></pre>\n<h2 id=\"可能导致进程被杀掉的情况\"><a class=\"anchor\" href=\"#可能导致进程被杀掉的情况\">#</a> 可能导致进程被杀掉的情况</h2>\n<ol>\n<li>内存泄漏;</li>\n<li>进程所需的内存资源太大,对于 java 进程而言,除了 - Xmx 设置最大堆大小,还需要考虑元数据空间、堆外内存、直接内存的使用;</li>\n<li>其他进程需要占用较多的资源,但是被 OOM Killer 机制选中当前进程;</li>\n</ol>\n<p>经过排查发现,是因为系统内存资源紧张,被系统选中杀死</p>\n<h3 id=\"主要介绍linux的oom-killer机制\"><a class=\"anchor\" href=\"#主要介绍linux的oom-killer机制\">#</a> 主要介绍 Linux 的 OOM Killer 机制</h3>\n<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的那个进程就是那个最占用内存的进程。\n</code></pre>\n<h3 id=\"怎么避免oom-killer误杀我的业务进程\"><a class=\"anchor\" href=\"#怎么避免oom-killer误杀我的业务进程\">#</a> 怎么避免 OOM Killer 误杀我的业务进程?</h3>\n<p>避免 oom killer 的方案</p>\n<ol>\n<li>直接修改 /proc//oom_score_adj 文件,将其置为 - 1000</li>\n</ol>\n<pre><code>以前是通过/proc//oom_score来控制的,但近年来新版linux已经使用oom_score_adj来代替旧版的oom_score\n</code></pre>\n<ol start=\"2\">\n<li>直接关闭</li>\n</ol>\n<pre><code class=\"language-aiignore\">关闭\necho "0" > /proc/sys/vm/oom-kill\n激活\necho "1″ > /proc/sys/vm/oom-kill\n</code></pre>\n",
"tags": [
"Java",
"java"
]
}
]
}