AndyYan's Blog - AndyYan
type: channel
link: https://www.andy-y.cn/index.php/author/1/
description: AndyYan
items: 通过Asterisk自建PBX以接入Telephony42
items: 一次 Looking Glass 参数注入事件的复盘：从 /etc/shadow 泄露到全集群加固
items: RP Hub——更适合新手的类Silly Tavern项目
items: StableDiffusion学习札记_P1
items: 博客封面是怎么来的？
items: Typecho + JOE 主题下 Mermaid 渲染的解决方案
items: 使用screen/tmux命令实现SSH中任务后台运行
items: Linux环境下的Silly Tavern 云酒馆 AI 搭建与美化完善（几乎0基础？）
items: IOS系统解压.lz4格式压缩包
items: 搭建Grafana监测Bird运行状态

通过Asterisk自建PBX以接入Telephony42
type: item
date: 2026-07-12T08:42:00+00:00
description: 提示：本人对于电话网络的了解停留在初步阶段，本博客仅仅是我初步的学习总结，不仅十分不完善，还可能出现部分知识性错误，如遇错误与意见可联系070127andy@gmail.com，感谢您的理解和指正！另：本文默认您已经加入了DN42并至少和一位peer进行了对等连接。本文部分基础概念和图示基于 Yukari Chiba 的《telephony42 完全指南》整理和改写，原文采用 CC BY-SA 4.0，本文相应部分亦按 CC BY-SA 4.0 发布。前言本人在DN42网络中扮演 AS4242422921 并拥有一个四节点的小集群，集群间建立了 FullMesh 的 IBGP 组网，通过 OSPF 作为 IGP 协议建立内部动态路由，并申请了 andy.dn42 作为我的域名，搭建了 1主+1从 的权威服务器（由knot驱动）。最近在DN42的群里看到了 Yukari 大佬提到的telephony42，即一套实验性质的去中心化电话网络。我觉得自建一个电话网络很酷，于是打算跟着Yukari的 这篇博客 搓一个 PBX(Private Branch Exchange - 私有交换机) ，接入telephony42， 打电话骚扰群友 。前期准备{x} 一个DN42域名 {x} 一台 已接入DN42 的，配置不低于1C1G的服务器 {x} 自建的DN42内部权威DNS（这里以knot演示）概念须知PS：本篇博客仅是“最小加入指南”，后面譬如SRTP的进阶操作本人也在学习，还请自行了解，本部分参考了0x7f的博客内容。组件简要解释PBX (Private Branch Exchange - 私有交换机)视作 VoIP 网络中的路由器，负责处理信令和路由，有时也处理语音数据。B2BUA (Back-to-Back User Agent - 背靠背用户代理)Asterisk 之类的 PBX 就是一个典型的 B2BUA。与仅转发信令的 SIP 代理不同，当 A 通过 PBX 呼叫 B 时，PBX 实际上是先以被叫的身份接听了 A 的电话，然后再以主叫的身份向 B 发起一通全新的电话，最后在内部把这两个独立的通道桥接起来。这使得 PBX 能随时介入通话过程，进行录音、转码、甚至强制掐线。Endpoint (终端设备)任何可以发起或接收呼叫的设备。它可以是电脑上的软件电话应用、桌面的实体 IP 电话机、ATA、网页上的 WebRTC 电话，甚至是另一个网络的 PBX。协议简要解释会话发起协议 (SIP - RFC 3261)作为控制平面。采用纯文本格式，长得有点像 HTTP，包含 URI、头字段和正文。主要负责信令传输，例如传递呼叫的来源和目标、接通、挂断或拒接等，不负责传输具体的语音流。SIP 默认监听于 UDP/TCP 5060 端口（在报文较大时通常优先使用 TCP），TLS 加密状态下监听 TCP 5061 端口。实时传输协议 (RTP - RFC 3550)作为数据平面。当 SIP 握手与 SDP 协商完成后，双方会在协商好的高位动态端口（通常在 UDP 10000 至 20000 之间）互相传递 RTP 数据包。这些包对延迟和抖动极其敏感。如果防火墙只放行了 SIP (5060) 但没放行 RTP，就会遇到 VoIP 史上最著名的故障： 单通（接通了但听不到声音）。路由简要解释ENUM (E.164 Number Mapping)是一种自动发现路由的机制。当拨打目标是未知目的地的电话时，PBX 会根据号码查询 DNS 的 NAPTR 记录，查找到该号码对应的 SIP 目标地址，在DN42通过一个特殊的DNS查询实现Context (上下文)是 Asterisk 拨号计划的关键组件。可以把它理解为 VoIP 系统中的 VRF。它可以把不信任的外部呼叫丢进一个没有外拨权限的隔离上下文中，并且能够通过 Goto 等语句实现在不同上下文间链式跳转，在后面的拦截伪造来电等功能上很有用对于跨网的SIP呼叫，可以分为 三个阶段 ：第一部分：SIP 呼叫建立PBX将充当一个类似“ 中转站 ”的角色，先接听主叫设备的 INVITE ，使用 ENUM DNS 查询（ 后面会展开解释 ）与信令路由，查询到对方的PBX之后向其转发INVITE，由对方的PBX再呼叫被叫设备，接听后层层转发回200 OKsequenceDiagram participant Caller as 主叫设备 (A) participant PBXA as 本地 PBX participant PBXB as 对端 PBX participant Callee as 被叫设备 (B) Note over Callee, Caller: 控制平面交互 (SIP) Caller->>PB…

一次 Looking Glass 参数注入事件的复盘：从 /etc/shadow 泄露到全集群加固
type: item
date: 2026-07-02T06:21:00+00:00
description: 本文隐去了真实主机名、域名与 IP，但保留了完整的攻击 payload 与处置命令，方便复现与自查。TL;DR我的 DN42 集群跑着一个公网可访问的 bird-lg-go Looking Glass，四台节点共用一个前端。其中 bird-lgproxy ≤ v1.4.6 存在参数注入漏洞（CVE-2026-26514，GHSA-3qm5-22pm-wqg9）：攻击者通过 traceroute 功能的 q 参数注入 mtr 的 -F 选项，把任意文件当作“报告文件”读出来，最终读到了每台机器的 /etc/shadow——也就是 root 密码哈希。注意 v1.4.6 的修复不完整、可被绕过，真正修好是在 v1.4.7。处置结论：四台节点全部升级到 v1.4.7、轮换全部 root 密码、审计 SSH 密钥与计划任务、确认无后门与异常登录。 漏洞在公网边缘已验证彻底关闭。漏洞原理Looking Glass 的 traceroute 功能，本质上是把用户输入的目标丢给系统的 mtr / traceroute 去跑。问题出在旧版 bird-lgproxy 直接把用户输入拼进 exec.Command，既没有把它当成单一目标、也没有拒绝以 - 开头的输入。于是用户输入里可以夹带选项。攻击者只要构造：-F /etc/shadow test.invalid它就被当成了 mtr -F /etc/shadow test.invalid。而 mtr 的 -F 选项恰好是“从文件读取主机列表（report file）”——mtr 会尝试打开 /etc/shadow，并在报错信息里带出文件内容；而 proxy 用 CombinedOutput() 把 stdout + stderr 一起回显给前端，于是文件内容就顺着错误输出泄露了出去。test.invalid 只是凑一个“看起来像目标”的占位。于是一条 HTTP GET 就能读任意文件：# 攻击者视角：通过公网 LG 前端读取 /etc/shadow curl 'https://<lg-frontend>/traceroute/<node>/-F%20%2Fetc%2Fshadow%20test.invalid'这类问题的根源是老生常谈的一句话：永远不要把用户输入拆成命令行参数。目标就该当作一个不可拆分的整体字符串，任何以 - 开头的东西都不该被解释成选项。下面这张图把整条注入链路画出来了——注意红色路径是漏洞如何从一个 HTTP 参数一路变成任意文件读取的：flowchart LR A[公网攻击者] -->|"GET /traceroute/node/ -F /etc/shadow test.invalid"| B[LG 前端 bird-lg] B -->|转发请求 源 IP = 前端| C[节点 bird-lgproxy :8000] C -->|"输入直接进 exec.Command 未拒绝 - 开头参数"| D{"mtr -F /etc/shadow test.invalid"} D -->|-F 被解释为 read report file| E"读取 /etc/shadow" E -->|回显文件内容| A style A fill:#ffd5d5,stroke:#c0392b style D fill:#ffe6cc,stroke:#e67e22 style E fill:#ffd5d5,stroke:#c0392b,stroke-width:2px攻击时间线从被攻击节点的 bird-lgproxy 日志里，能看到一段非常“教科书”的探测→提权信息收集过程（时间为东八区，2026 年 7 月 1 日晚）：时间（UTC+8）谁干了什么07-01 21:47攻击者（经前端转发）bird-lgproxy 读 /etc/passwd（枚举用户、确认可读文件）07-01 21:53攻击者读 /root/.bash_history（翻历史命令，找线索/凭据）07-01 21:57攻击者读 /etc/shadow（拿到 root 密码哈希）用时序图看这十分钟的动作更直观，也能看清“攻击者 → 前端 → proxy → 文件系统”这条链路上，日志分别记在了哪一层：sequenceDiagram autonumber actor Atk as 攻击者（公网） participant FE as LG 前端 bird-lg participant PX as 节点 bird-lgproxy participant FS as 节点文件系统 Note over Atk,FS: 2026-07-01 晚（UTC+8） Atk->>FE: 21:47 GET -F /etc/passwd FE->>PX…

RP Hub——更适合新手的类Silly Tavern项目
type: item
date: 2026-06-26T13:06:00+00:00
description: 声明：此项目二改自 RP-Hub ，根据原项目作者要求，本人已得到原作者关于二改的授权。二改过程中使用了AI，若您对此反对可停止阅读前言众所周知，原版的Silly Tavern，动画是 没有 的，界面是 臃肿 的，对新手是 地狱 的。我一直想找到一个易用且现代的类Silly Tavern项目，某次偶然在B站看到了这个视频：{bilibili bvid="BV1yKSSBKERq" page=""/}可谓是正中下怀啊！但是仔细看了看项目发现，由于偏向仅前端开发，项目没有原版Silly Tavern的多用户功能，也没有多端同步能力，和我的预期相差较多，于是 秉承着Plus订阅不用白不用的态度 我决定手搓出多用户和同步功能。博弈于是我便把项目克隆，打开了Codex，开始了和AI博弈的两天。过程就不多说了，本次二改项目使用了GLM-5.2、GPT-5.5，Claude-Opus-4.6模型共同开发，由GPT主写代码，GLM进行代码审批， Claude负责摸鱼 。跌跌撞撞花了不少token，反正是做出来了。 成果二改项目我已经放在了 Github 在原纯前端项目基础上，新增了以下功能（详见 DEPLOY.md）：多用户体系JWT 认证（用户名 + 密码 + 刷新令牌轮转）用户数据云端同步（基于时间戳的智能合并，非整体覆盖）本地模式 / 服务端模式可切换（未登录时与原项目完全一致）公共角色库（自建）用户提交角色卡 → 管理员审核 → 公共展示 → 其他用户下载与原作者的「万相广场」并存，侧边栏明确区分后台管理（admin.html）系统统计（用户/角色卡/登录趋势）用户管理（增删改查、封禁/解封、API Key 绑定、配额）角色卡审核（预览、通过、拒绝带理由、下架）公告管理（创建/编辑/置顶，前端主页自动展示）API 用量统计、审计日志站点公告系统管理员发布公告 → 前端主页弹窗展示（区别于原版本更新日志）

StableDiffusion学习札记_P1
type: item
date: 2026-06-20T07:58:00+00:00
description: 前言之前就一直想玩StableDiffusion奈何没有合适的显卡。高考完终于买了个5080的笔电想着是时候开玩了~初步了解鉴于StableDiffusion的webui有段时间没更新了，我选择使用comfyUI作为可视化界面----更加现代化，并且拓展性更强开整1部署comfyUI对于新手来说，使用StabilityMatrix部署comfyUI是个不错的选择1.1建一个固定目录在一个空间比较大的盘，新建一个文件夹用于存放后续文件，比如：D:\AI1.2下载StabilityMatrix与安装前往github，在 这里 下载最新版release安装到：D:\AI\StabilityMatrix{alert type="warning"}注意：下载下来的压缩文件必须解压后运行，否则安装程序受限{/alert}第一次打开 Stability Matrix，通常会让你设置一个数据目录 / Library 路径。填写：D:\AI\AIData以后模型、包、缓存都存这个目录。1.3安装comfyUI打开 Stability Matrix 后，找到它里面的包 / Packages / Install入口。找到 ComfyUI安装 最新版其它设置都保持默认装完后，点击 Launch / 启动{alert type="warning"}注意，下载过程需要从github拉取release，若使用代理，请开启tun模式。{/alert}若一切正常，应该会出现这个提示：[INFO] To see the GUI go to: http://127.0.0.1:8188访问即可。2.加入模型，创建工作流2.1模型获取新手可以直接使用我在网上找到的资源。只有度盘链接还请见谅 {cloud title="SD" type="bd" url="https://pan.baidu.com/s/1v2g_4hKDafaS9tcYEouYxA?pwd=1ajk" password="1ajk"/}或者前往 C站 寻找模型{collapse}{collapse-item label="附C站Content Moderation设置指南" close}代理 访问https://civitai.red/登录账号点击右上角个人图标，选择最下方的齿轮图标进入账户设置找到Content Moderation修改注：一定要使用代理，也不要访问.com域名{/collapse-item}{/collapse}2.2模型识别模型的识别比较重要，使用错误的模型+Lora会导致报错首先是 模型文件类型 建议直接识别后缀1..safetensors / .ckpt 这个属于Checkpoint（大模型主体），可以单独出图模型代数识别：sd15 / 1-5 / v1-5 → SD1.5sd21 / 2-1 → SD2.1xl / SDXL → SDXL2..safetensors 这个属于LoRA（风格/角色插件）不能单独出图，必须 + base model3..vae.safetensors这个是VAE，是用来改善颜色/对比度的4..pt / .bin这个属于Embedding / Textual Inversion，是用于用于触发关键词的2.3创建工作流打开ComfyUI，你应该能看见一个空白画布双击左键，搜索 Load Checkpoint ，添加节点双击左键，搜索 CLIP Text Encode ，添加节点（要添加两个，这是正向和反向提示词的输入处）双击左键，搜索 KSampler ，添加节点双击左键，搜索 VAE Decode ，添加节点双击左键，搜索 Save Image ，添加节点连线规则： 从 Checkpoint加载器（简易）连出去：模型 → KSampler 的 modelCLIP → 两个 CLIP文本编码 节点的 clipVAE → VAE Decode 的 vae 文本节点：正向 CLIP文本编码 → KSampler 的 positive负向 CLIP文本编码 → KSampler 的 negative Empty Latent Image：输出 → KSampler 的 latent_image KSampler：输出 → VAE Decode 的 samples VAE Decode：输出 → Save Image 的 images 3.开始作画3.1填入提示词正向提示词填到第一个 CLIP 文本编码里：masterpiece, best quality, ultra detailed, 1girl, portrait, soft lighting, detailed eyes负向提示词填到第二个 CLIP 文本编码里：low quality, blu…

博客封面是怎么来的？
type: item
date: 2026-06-11T13:08:00+00:00
description: 这个博客上的封面是怎么来的？其实是用 GPT-Image-2生成的随手让它写了个prompt可以保持创作风格：我会给你一篇技术博客原文，请你根据文章内容生成一张博客封面图。 要求： 1. 先理解文章主题，不要逐字照搬正文。 2. 封面用于博客首页卡片展示，显示区域较小，所以画面必须简洁、清晰、缩略图可读。 3. 图片比例为 3:2，横向构图，例如 1200x800。 4. 风格为深色科技风、蓝紫霓虹、现代极客风，适合技术博客。 5. 不要做复杂信息图，不要大量小字，不要密集代码，不要完整教程步骤。 6. 画面只保留一个大标题、一个短副标题，以及 1 到 3 个能表达主题的简洁图标或抽象元素。 7. 中文标题要大、粗、清晰，距离边缘留足安全边距，避免被博客卡片裁切。 8. 右侧可以放终端、服务器、网络连接、代码窗口、流程节点、工具图标等抽象元素，但不要太复杂。 9. 不要水印，不要真实品牌 Logo，不要生成过多装饰。 10. 如果文章主题偏运维、Linux、网络、自建服务，请优先使用终端、服务器、连接线、状态图标等视觉元素。 请根据下面的文章原文，自动提炼： - 封面主标题 - 封面副标题 - 画面主体元素 - 最终生成一张 3:2 技术博客封面图 文章原文如下： 【在这里粘贴文章全文】

Typecho + JOE 主题下 Mermaid 渲染的解决方案
type: item
date: 2026-04-05T12:04:00+00:00
description: 阅前须知：由于博主现在 并没有太多自己写代码甚至脚本的能力 ，本篇文章在我和AI共同解决了这个问题之后 直接由AI生成 ，若你对此感到反感，可以现在 关闭该帖 （ 我是废物 ）一、问题背景在 Typecho 中使用 Mermaid 一直不算难，但一旦换成 JOE 主题，问题就开始变得复杂：写好的 `mermaid 代码块被当成普通代码高亮插件明明启用了，但图表不渲染翻页（PJAX）后 Mermaid 直接失效我一开始也尝试用常规方案（正则替换 HTML），结果发现：👉 根本不稳定二、问题的本质JOE 主题做了很多“增强”，包括：自定义代码高亮（Prism / Highlight.js）改写 Markdown 输出结构使用 PJAX（局部刷新页面）这导致一个核心问题：你在后端生成的 HTML，很可能在前端被再次修改甚至覆盖例如你期望的是： 但实际可能变成： 甚至： ... 👉 结构不稳定 → 正则必炸三、传统方案为什么不行？常见插件思路：Markdown → HTML → 正则替换 → 问题在于：依赖 HTML 结构（不可靠）容易被主题覆盖PJAX 后不会重新执行结论：后端改 HTML，在 JOE 这种强主题下是错误方向四、最终解决方案：前端接管我最后采用的是：✅ 完全绕过后端，前端动态解析 Mermaid核心流程：页面加载 ↓ 扫描所有 language-mermaid 代码块 ↓ 替换为 .mermaid DOM ↓ 调用 Mermaid 渲染五、核心实现解析1. 扫描代码块const blocks = document.querySelectorAll( 'pre code.language-mermaid, pre.language-mermaid' );为什么这样写？👉 兼容两种结构： 2. 提取原始代码let code = codeBlock.textContent;👉 直接拿文本，不依赖 HTML 结构3. 重建 DOMconst container = document.createElement('div'); container.className = 'mermaid-container'; const mermaidDiv = document.createElement('div'); mermaidDiv.className = 'mermaid'; mermaidDiv.textContent = code; container.appendChild(mermaidDiv);最终结构： ... 4. 替换原代码块pre.replaceWith(container);👉 关键点：删除原代码高亮 DOM避免主题再次干扰5. 渲染 Mermaidmermaid.initialize({ startOnLoad: false, theme: getTheme() }); mermaid.init(undefined, document.querySelectorAll('.mermaid'));为什么不用自动加载？👉 因为 DOM 是动态生成的6. 防止重复渲染if (codeBlock.dataset.mermaidDone) return;👉 防止：PJAX 重复执行多次渲染报错7. 适配 PJAX（关键）document.addEventListener('pjax:complete', run);👉 没有这行：❌ 翻页后 Mermaid 全部失效六、主题适配（暗黑模式）function getTheme() { if (document.body.classList.contains('dark')) { return 'dark'; } return 'default'; }👉 自动跟随主题切换七、为什么这个方案最稳？对比一下：方案稳定性原因后端正则替换❌依赖 HTML修改 Markdown 解析❌被主题覆盖前端接管（本方案）✅直接操作 DOM八、核心设计思想这次优化本质上是一次“架构调整”：1️⃣ 不和主题抢控制权JOE 已经接管了渲染链：👉 你再插手，只会冲突2️⃣ 前端才是最终执行层只要页面上存在：language-mermaid👉 就一定能识别3️⃣ 幂等设计data-mermaidDone👉 保证多次执行不会出问题九、最终效果✅ 支持所有 Mermaid 图✅ 支持 PJAX✅ 不受代码高亮影响✅ 自动暗黑模式✅ 主题无关（通用）十、一句话总结与其试图修补被主题打乱的 HTML，不如直接绕过它，在前端重建渲染链。十一、源码附上{collapse}{collapse-item label="过长，已折叠，点击查看" close}<?php if (!defined('__TYPECHO_…

使用screen/tmux命令实现SSH中任务后台运行
type: item
date: 2026-04-05T11:29:00+00:00
description: 前言：在我们使用ssh的时候正常情况下，如果我们退出ssh，进程会被杀掉，导致一些需要运行较长时间（比如 rsync/cp ）的命令中断，十分的难受，这里提供两种解决办法：1.使用screen1.1开启 screen：screen -S upload1.2执行命令##举例 rsync -avh --progress /data/myfolder/ /mnt/myfolder/1.3退出SSH保持后台运行：按：Ctrl + A 然后按 D1.4重新连接后恢复screen -r upload2.使用tmux2.1启动tmuxtmux new -s upload2.2执行命令后，退出保持后台Ctrl + B 然后按 D2.3重新连接后恢复tmux attach -t upload

Linux环境下的Silly Tavern 云酒馆 AI 搭建与美化完善（几乎0基础？）
type: item
date: 2026-03-13T15:09:00+00:00
description: {alert type="info"}感谢McD大佬的指导{/alert}前言Silly Tavern Chat（云酒馆） 是一个强大的AI Role Play网站，依赖于庞大的社区资源，可以实现多样化的角色互动。 支持国内外多种AI模型，有着比较直观 但一点也不好看 的用户界面。其实酒馆ai可以直接部署在很多设备上（安卓，Windows），但是不便于多端同步等等，将酒馆部署在云端可以使用WebUI方便的使用任何设备访问酒馆。下面是从0开始的云端Silly Tavern部署教程。前期准备{x} 一台至少1核2G的云服务器（推荐JP区域）{x} 本地SSH工具（我使用的是termius）{x} 一点点linux基本使用技巧{x} 已对Silly Tavern有一定了解{x} 最好加入了类脑ΟΔΥΣΣΕΙΑ社区，截至2026/03/12仍然是开放状态开始部署0.SSH的连接0.1打开Termius（这里以电脑版举例）0.2点击 NEW HOST，在红框内填写IDC商家提供给你的信息( Lable 就是你给vps起的名字)0.3点击 Connect 连接1.安装1panel面板为了方便萌新进行后续反代等等的搭建，建议先安装1p。输入下方这串命令，按提示操作（提示是否安装docker时直接按enter键）bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"{alert type="warning"}安装完之后一定要记住访问地址与端口号！{/alert}2.获取项目2.1首先安装gitsudo apt update ##一行一行执行 sudo apt install git2.2从github拉取项目git clone https://github.com/SillyTavern/SillyTavern等待一会拉取3.启动容器，调整参数3.1启动容器cd SillyTavern/docker docker compose up -d3.2编辑配置文件sudo nano config/config.yaml此时进入到你 config 配置文件点击向下，直到看到 whitelistMode 把后面的 true 改为 false 再往下找到basicAuthMode把false改为true最后在下方设置你的账号密码按 ctrl+O ，再按 enter 接着按 ctrl+X 保存退出nano编辑器3.3重启容器，使改动生效docker compose restart sillytavern到此处恭喜你酒馆AI搭建已经完成。打开浏览器输入 http://<你的ip>:8000 访问界面4.基础参数设置打开WebUI跟随它的提示进行填写，这里不多提。5.美化先贴一张效果图我使用的是类脑频道里面这位大佬的美化方案这个美化很重要的一点就是对手机端非常友好:在滑动 正则 时不会误触改变顺序没有进频道的我这里提供下载链接修改方式如下：6.优化与增强在最上面一栏从右往左第三个里可以安装拓展，从而增强酒馆游玩的舒适度主要是下面这几个：6.1酒馆助手这是项目地址6.2提示词模板这是项目地址6.3文生图插件这是项目地址7.域名反代{ } 待完成

IOS系统解压.lz4格式压缩包
type: item
date: 2026-03-13T12:27:00+00:00
description: 前言大家可能会遇到lz4格式的压缩包（多见于防止用户 手贱 在线解压的网盘资源），这时安卓可以使用ZArchiver方便的解压，但是ios就不行了，这里分享一个基于iSH的解压教程。开整1.下载iSH这里用到了一个叫做iSH的工具，这是一个适用于 iOS 设备的开源终端模拟器，相当于一个轻量化的linux环境。直接打开AppStore搜索 iSH 下载 2.打开 iSH，安装 lz4apk add lz43.把.lz4文件导入iSH通过“文件”App分享 → iSH）4.开始解压lz4 -d <XXX.lz4> <输出文件名> #注：自行替换尖括号里面的内容为实际名称{collapse}{collapse-item label="example" close}lz4 -d test.lz4 test.rar{/collapse-item}{/collapse}5.验证解压结果ls -a

搭建Grafana监测Bird运行状态
type: item
date: 2026-02-19T14:39:00+00:00
description: 写在前面本人在dn42网络中有4个节点，本来搭建了LookingGlass来监测节点运行状态，但考虑到不够直观 其实是想折腾，所以打算搭建一个可以图形化监控每台节点Bird运行状态的仪表盘，在社区里面发现可以用Grafana搭配Prometheus作为数据源实现拓扑图如下：graph TD subgraph DN42 Network N1[Node 1] --> NE1(Node Exporter) N1 --> BE1(Bird/FRR Exporter) N2[Node 2] --> NE2(Node Exporter) N2 --> BE2(Bird/FRR Exporter) N3[Node 3] --> NE3(Node Exporter) N3 --> BE3(Bird/FRR Exporter) N4[Node 4] --> NE4(Node Exporter) N4 --> BE4(Bird/FRR Exporter) end NE1 --> P(Prometheus Server) NE2 --> P NE3 --> P NE4 --> P BE1 --> P BE2 --> P BE3 --> P BE4 --> P P --> G(Grafana Server) User[用户] --> G搭建部署 Prometheus ServerPrometheus Server 将运行在独立的监控服务器上。创建工作目录mkdir -p /opt/prometheus/config /opt/prometheus/data创建 Prometheus 配置文件 (/opt/prometheus/config/prometheus.yml)global: scrape_interval: 15s # 默认抓取间隔 scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] # 监控 Prometheus 自身 - job_name: 'node_exporter' static_configs: - targets: ['<node1_ip>:9100', '<node2_ip>:9100', '<node3_ip>:9100', '<node4_ip>:9100'] # 替换为您的 DN42 节点 IP - job_name: 'bird_exporter' static_configs: - targets: ['<node1_ip>:9324', '<node2_ip>:9324', '<node3_ip>:9324', '<node4_ip>:9324'] # 替换为您的 DN42 节点 IP注意: 请将 <nodeX_ip> 替换为您的 DN42 节点的实际 IP 地址。使用 Docker Compose 部署 Prometheus创建 docker-compose.yml 文件：services: prometheus: image: prom/prometheus container_name: prometheus network_mode: host ports: - "9090:9090" volumes: - /opt/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml - /opt/prometheus/data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.enable-lifecycle' restart: unless-stopped将数据目录的权限赋予 Prometheus 用户：chown -R 65534:65534 /opt/prometheus/data启动 Prometheus：docker-compose up -d通过访问 http://<监控服务器IP>:9090 来验证 Prometheus 是否正常运行。部署 Node Exporter (每个 DN42 节点上)创建工作目录mkdir -p /opt/node_exporter方式1：使用 Docker 部署 Node Exporterdocker run -d \ --name node_exporter \ --net="host" \ --pid="host" \ -v "/:/host:ro,rslave" \ quay.io/promethe…