普通视图

Umami 升级提醒:尽快更新以修复 Next.js CVE-2025-66478 漏洞

2025年12月6日 01:17

使用 chatgpt 生成

最近 Next.js 官方发布了 CVE-2025-66478 安全公告(详情可见官方链接)。由于 Umami 采用 Next.js 构建,因此同样受到本次漏洞影响

好消息是:Umami 官方已经发布新版本修复漏洞

同时需要注意:Umami 从 v3 起彻底移除 MySQL 支持,统一切换为 PostgreSQL
如果你仍在使用 MySQL 版本,强烈建议你尽快升级并迁移数据,避免暴露在风险中

v2 升级到最新版本

我已经同步好了官方镜像, 替换直接升级,由于 v2 版本没有打 patch 只能升级到 v3 才能解决

- ghcr.io/umami-software/umami:mysql-latest
- ccr.ccs.tencentyun.com/k7scn/umami:mysql-latest

将 MySQL 迁移到 PostgreSQL

Umami v3 确保数据的一致性,废弃了对 mysql 的支持,统一采用 PostgreSQL。本步骤参考官方文档 install-umami-with-a-postgresql-database 实践。

升级真是一件糟糕的体验,如果你之前是使用 MySQL,不建议升级,直接重装 v3

环境要求

官方要求迁移前 MySQL 结构必须达到 v2.19.0,否则执行迁移脚本会失败
你可以通过升级镜像确保数据库 schema 是最新的

  • 两个数据库的登录凭证:
MySQL: mysql://user:password@host:port/dbname
PostgreSQL: postgresql://user:password@host:port/dbname

PG 数据库

bitnami 操作也很蜜汁。如下示例,对应 ip 密码自行修改

services:
  postgresql:
    image: h.ysicing.net/bitnami/postgresql
    container_name: postgresql
    ports:
      - '100.90.80.10:5432:5432'
    volumes:
      - '/data/postgresql:/bitnami/postgresql'
    environment:
      - POSTGRESQL_DATABASE=umami
      - POSTGRESQL_USERNAME=user
      - POSTGRESQL_PASSWORD=password
      - POSTGRESQL_POSTGRES_PASSWORD=password_root
    restart: always

导出 mysql 数据

mysqldump --no-create-info --default-character-set=utf8mb4 --quick --skip-add-locks -uroot -h100.90.80.10 -poAkahz4ahvei1oReing6oh5ubaen1veV umami > umami.sql

部署 pg 版 Umami v2

具体参考流程可以参考 部署轻量数据统计分析 umami

官方镜像 ghcr.io/umami-software/umami:postgresql-v2
国内镜像 ccr.ccs.tencentyun.com/k7scn/umami:postgresql-v2

替换一下镜像地址和环境变量

mysql 环境变量为

- env:
        - name: DATABASE_URL
          value: mysql://root:oAkahz4ahvei1oReing6oh5ubaen1veV@100.90.80.10:3306/umami
        - name: HASH_SALT
          value: ezee4eGhalaishiphese8yaiphomon
        - name: DATABASE_TYPE
          value: mysql
        image: ccr.ccs.tencentyun.com/k7scn/umami:mysql-latest

pg 环境变量为

- env:
        - name: DATABASE_URL
          value: postgresql://ysicing:oAkahz4ahvei1oReing6oh5ubaen1veV@100.90.80.10:5432/umami
        - name: HASH_SALT
          value: ezee4eGhalaishiphese8yaiphomon
        image: ccr.ccs.tencentyun.com/k7scn/umami:postgresql-v2
  • 去掉了 DATABASE_TYPE, 修改了 DATABASE_URL
  • 镜像换成了 pg v2 版本镜像

等初始化完成,关闭服务,避免重复初始化数据库(避免影响下面流程)

修改 pg 数据库

使用 DataGrip 连接 umami 数据库,执行下面的 sql,这两个表数据将从 mysql 的数据中获取

truncate table "_prisma_migrations";
truncate table "user";

效果如下

[2025-12-05 22:24:47] 已连接到 umami
[2025-12-05 22:24:47] umami> truncate table "_prisma_migrations"
[2025-12-05 22:24:47] 在 10 ms 内完成
[2025-12-05 22:24:47] umami> truncate table "user"
[2025-12-05 22:24:47] 在 11 ms 内完成

导入数据

使用上面的备份数据 umami.sql

22:22 ➜  ~ ls -alh umami.sql
-rw-r--r--  1 ysicing  staff    99M 12  5 22:09 umami.sql

将反引号替换为双引号,使其与 PostgreSQL 兼容, 如果 macOS 执行有问题,在 Linux 搞下。操作前可以备份一下,避免搞坏了

sed -i 's/`/"/g' umami.sql

macOS

sed -i '' 's/`//g' umami.sql
sed -i '' 's/\\"/"/g' umami.sql
sed -i '' "s/\\\\'/'/g" umami.sql
sed -i '' "s/Xi'an/Xi''an/g" umami.sql
sed -i '' "s/Lu'an/Lu''an/g" umami.sql
sed -i '' "s/Ma'anshan/Ma''anshan/g" umami.sql
sed -i '' "s/Rui'an/Rui''an/g" umami.sql
sed -i '' "s/Yu'an/Yu''an/g" umami.sql
sed -i '' "s/Bo'an/Bo''an/g" umami.sql
sed -i '' "s/Tai'an/Tai''an/g" umami.sql
sed -i '' "s/Cao'an/Cao''an/g" umami.sql
sed -i '' "s/Chang'an/Chang''an/g" umami.sql
sed -i '' 's/ENGINE=[^ ]*//g' umami.sql
sed -i '' 's/AUTO_INCREMENT/[generated always as identity]/g' umami.sql
sed -i '' 's/unsigned//g' umami.sql
sed -i '' '/_prisma_migrations/d' umami.sql

可以手搓如下,我这里直接使用 DataGrip

psql -U username -d mydb < umami.sql

由于 MySQL → PostgreSQL 差异巨大,需要执行大量替换操作。报错太多,决定放弃升级改成使用 v3 版本, 还是重装方便

v3 版本镜像

由于兼容性问题太多,我最终选择放弃 v2 的 MySQL → PostgreSQL 迁移,转而直接部署 全新的 Umami v3。

v3 镜像地址:

官方:ghcr.io/umami-software/umami:postgresql-latest
国内同步:ccr.ccs.tencentyun.com/k7scn/umami:postgresql-latest

v3 使用体验更流畅、性能也更好,而且完全修复了此次 Next.js 漏洞。

总结:请大家尽快升级,避免被入侵

Umami 因 Next.js 漏洞受到影响

  • v3 已发布修复版本
  • 强烈建议优先考虑升级至 v3
  • MySQL 用户请务必注意:v3 不再支持 MySQL

如果你还在运行旧版本,请尽快升级,避免站点暴露在风险中!我今天至少已经看到 10+ 站点被入侵挂马了。

  •  

出一台闲置的物理服务器

2025年12月2日 22:35

使用 chatgpt 生成

很早之前我出的,然后又被我收到了,现在又闲置了,打算出了

厂家

老牌 IDC 了,工单响应速度极快,即使凌晨 15 分钟接单。

机器配置

Platinum8259CL*2
128GB DDR4
1TB NVMe SSD

续费 358/月
带宽上限 50Mbps (上行是 50Mbps,下行是 150Mbps)
防护峰值 400Gbps

迁移至宁波电信需在账单日进行且该机器为十堰活动款,迁移至宁波地区您的续费价格将会上调至 398 元,需要实名的。

12.19 到期, 一口价 300,需要自备实名账号,有意可以私聊我。

  •  

k8s免密拉取镜像实践

2025年12月1日 22:09

使用 copilot.microsoft.com 生成

算是一个比较老的知识点了 😂

之前都是使用云服务商提供的免密凭证,最近需要跨云跨账号,使用 AI 自己实现了一个通用的

原理

借助 ServiceAccount,实现 Pod 自动免密拉取私有镜像,做到镜像凭据配置一次,全命名空间或指定应用自动生效

主要优势

  • 一个 ns 空间下只需要配置一次 secrets。Kubernetes 拉取私有镜像需要认证信息。如果每个服务都写 imagePullSecrets,不仅配置冗余,也不利于权限统一管理

使用 ServiceAccount 可以带来两个好处:

  • 配置一次,全自动继承
  • 不污染 Pod 等 yaml,让业务部署更干净

手动配置

主要参考官方文档 为服务账号添加 ImagePullSecrets

首先,生成一个 imagePullSecret; 接下来,验证该 Secret 已被创建。例如:

kubectl create secret docker-registry myregistrykey --docker-server=<registry name> \
        --docker-username=DUMMY_USERNAME --docker-password=DUMMY_DOCKER_PASSWORD \
        --docker-email=DUMMY_DOCKER_EMAIL
        
# 检查该 Secret 已经被创建
kubectl get secrets myregistrykey
NAME             TYPE                              DATA    AGE
myregistrykey    kubernetes.io/.dockerconfigjson   1       1d

将镜像拉取 Secret 添加到服务账号

接下来更改名字空间的默认服务账号,将该 Secret 用作 imagePullSecret

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

效果等同于

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2021-07-07T22:02:39Z
  name: default
  namespace: default
  uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
imagePullSecrets:
  - name: myregistrykey

再当前命名空间下创建一个私有仓库的 Pod 测试看看

自动实现

原理就是 watch ns 创建,当收到 ns 创建后,自动创建相关凭证,同时给 ns 打上凭证版本标签,方便后续凭证有更新。

其他

不建议把 secret 绑定到 default ServiceAccount,因为权限难以收敛,当然我是没听他的建议。

  •  

Z-Image-Turbo,快就完事了

2025年11月30日 21:48

最近比较火的,可以 NSFW, 模型默认生成美女 😂
如果你正在寻找一款高性能、轻量、可灵活集成的图片处理方案,那么 Z-Image-Turbo 绝对值得重点关注

简介

Z-Image 是由阿里云通义万相团队推出的一款高效文生图 AI 模型,其核心优势在于 Turbo 级的极致推理速度,能够在秒级时间内将文本描述转化为高质量图像,完美平衡了生成效率与画质表现,极大提升了 AI 创作的实时交互体验

主要优势

  • 极致推理速度 (Turbo 级) 核心特点是。通过深度模型优化或技术蒸馏,显著减少了推理步数,实现秒级图像生成,极大提升了创作的实时性和交互感
  • 速度与质量兼备 在追求极致速度的同时,保持了高水准的图像生成质量。它在快速出图和细节、结构、光影表现之间取得了优秀的平衡,产出图片具备实用价值
  • 原生中文语境理解 继承了通义大模型家族强大的语言能力,对中文提示词(Prompt)及中国文化元素有深刻的理解,能更准确地还原中文用户的创作意图
  • 低门槛 对计算资源的消耗相对较低,降低了开发者的使用和部署门槛,利于集成到各类实时应用中
  • NSFW

体验地址

可能被人大量生成 NSFW,目前官方 demo 已经禁止,自建是没限制的

其他

其实类似教程 L 站也有不少,有兴趣可以搜搜。

  •  

Debian/Ubuntu 默认禁用 SSH RSA 密钥?一篇文章教你彻底解决

2025年11月28日 22:25

使用 copilot.microsoft.com 生成

最近升级了 Gitspace 基础环境版本,导致没法使用 RemoteSSH。

在新版本系统中,不少人发现原本一直使用的 RSA SSH Key 突然无法登录了。原因不是你的服务器出了问题,而是 OpenSSH 在 8.3 版本之后,默认关闭了对 ssh-rsa 的支持。

本文带你快速了解为什么会这样、怎样安全地重新启用 RSA Key 登录,以及需要注意哪些风险和最佳实践。全文简单易懂、一步到位。

RSA 过时协议

OpenSSH 官方从 8.3 起,将 ssh-rsa 标记为过时算法,主要原因是:

  • RSA(尤其是小于 4096 位的)安全性相对较弱
  • 更现代、更高强度的算法例如 ed25519、ecdsa 已经普及
  • 出于安全考虑,服务器端默认不再接受 ssh-rsa 签名

因此,在看到日志类似:

Authentications that can continue: publickey,password
Trying private key: /root/.ssh/id_rsa

之前免密配置了但就是死活登录不上

注意:客户端其实仍然可以使用 RSA,只不过是服务器拒绝了它

大多数情况下,客户端不用配置任何内容,因为 OpenSSH 客户端默认依然支持 RSA
真正需要修改的是服务器,因为服务器默认不接受 ssh-rsa 公钥

当然还有少数情况下客户端也需要配置,我就是改出问题了,客户端也需要配置

重新启用 RSA Key 登录

为了避免修改主配置文件 sshd_config 被升级覆盖,我们使用新版本系统推荐的配置目录 /etc/ssh/sshd_config.d

sudo tee /etc/ssh/sshd_config.d/enable_rsa_keys.conf > /dev/null << EOF
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
EOF

然后重启 ssh 服务

sudo systemctl restart ssh
或
sudo systemctl restart sshd

到这里,服务器已恢复对 RSA Key 的支持。

如果已经执行了这个,还不行就需要配置客户端了

# ~/.ssh/config
Host *
	User root
	ServerAliveInterval 60
	ForwardAgent yes
	TCPKeepAlive no
	ControlMaster auto
	ControlPath ~/.ssh/tmp/connection-%r@%h:%p
	ControlPersist 1h
	Compression yes
	HostkeyAlgorithms +ssh-rsa
	PubkeyAcceptedKeyTypes +ssh-rsa

如果没有 SSH 密钥

ssh-keygen -t rsa -b 4096
或者 默认 -a是16
ssh-keygen -t ed25519 -a 100

其他

只在必要场景下开启 RSA,新的环境更推荐 ed25519

  •  

Tailscale Peer Relay 实战指南,让内网穿透更稳更快

2025年11月12日 14:16

使用 copilot.microsoft.com 生成

我已经配置了,由于我的网络最近过于流畅没法体验,没有经过 peer relay 节点 😂,整体操作是没有问题,可以放心食用

在使用 Tailscale 的过程中,我们经常会遇到这样的问题:

  • 某些节点在 NAT、防火墙或弱网环境下,P2P 直连失败,只能走官方 DERP 中继,速度偏慢、延迟偏高
  • 小厂国内大带宽节点需要实名备案,使用不方便
  • 大厂国内水管节点能用,仅限于能用

上面的还需要依赖 DERP 中继,但是最近 Tailscale Peer Relay(对等中继)提供公开测试,
它允许你在自己的 Tailnet 中选一台网络条件好的节点,作为专属中继,让其他设备通过它转发流量,从而实现更快、更稳定的内网穿透体验。免费用户也可以有两个中继节点

Peer Relay 简介

一句话解释:

Peer Relay 是你自己控制的私有中继节点,它替代官方 DERP,为 Tailnet 内部节点中转加密流量。

这意味着你可以在靠近设备的地区部署中继,减少绕行路径,让连接速度更快。

具体可以查阅官方邮件公告 Introducing Tailscale Peer Relays

要求

你需要:

  • 默认已经安装好了 Tailscale
  • 所有设备属于同一个 Tailnet
  • 其中有一台网络良好的机器,我们称它为 锐驰 A(应该大家都人手一台锐驰 A 吧)

如果 Debian 系安装 Tailscale 有问题可以参考 tailscale 部署加速

在锐驰 A 上启用 Peer Relay

执行命令(以 UDP 44400 端口为例):

tailscale set --relay-server-port 44400

由于使用的腾讯云锐驰机器,还需要单独放行 UDP44400 端口,其他云也类似

配置防火墙

完成后请确保:

  • 锐驰 A 的 UDP 44400 端口已在防火墙或云安全组中放行
  • 该节点运行的 Tailscale 版本 ≥ 1.86 (目前最新 1.90.6,最近更新特别快,问题也有点多 😂)

这样,锐驰 A 就具备了中继能力

在后台配置 Access Controls

打开 Tailscale 管理后台,编辑 Access controls。
在 ACL 文件中添加以下配置:

官方推荐写法(使用标签管理)

在锐驰 A 上给它打上标签:

tailscale up --advertise-tags=tag:relay

然后在 Access Controls 中添加规则

{
  "grants": [
    {
      "src": ["tag:mjj"],
      "dst": ["tag:relay"],
      "app": {
        "tailscale.com/cap/relay": []
      }
    }
  ]
}

配置说明:

  • src:哪些节点可以使用中继(这里用 tag:mjj 分组管理)
  • dst:哪些节点可作为中继(用标签 tag:relay 标识)
  • "app": {"tailscale.com/cap/relay": []}:授予中继功能权限

这种方式可扩展性最好。后续新增中继节点时,只需打上 tag:relay 即可自动生效。

指定单个节点

我个人推荐使用,不建议使用 Tag,tag 标签功能会影响 tailscale file, 这个是我最常用功能之一。

如果你想让使用单个中继节点,可以写成:

"grants": [
		{
			"src": ["*"], // Devices that can be accessed through the peer relay
			"dst": ["100.90.80.20"], // Devices functioning as peer relays for the src devices
			"app": {
				"tailscale.com/cap/relay": [], // The relay capability doesn't require any parameters
			},
		},
	]

规则配置

配置说明:

  • 100.90.80.20 为锐驰 A 的 IP

主要参考官方文档 kb/1591/peer-relays

验证是否生效

tailscale ping <目标节点>

如果输出中出现 “via peer-relay”,表示连接确实经过中继节点。

进阶玩法

  • 与 Exit Node 结合: 让中继节点同时充当出口节点,实现统一外网出口
  • 多中继负载与分区: 不同区域的设备可绑定各自的中继节点,优化跨区访问
  • 替代 DERP: 对企业内网或跨云架构,可完全用私有 Peer Relay 取代官方/自建中继,减少延迟

找一台网络最好的节点,开启 Peer Relay, 让你的 Tailscale 网络快如闪电

  •  

从零到上架:VS Code 扩展如何发布到 VS Code Marketplace 和 Open VSX

2025年11月11日 21:47

使用 copilot.microsoft.com 生成

最近写了几个 VSCode 扩展,为了方便分发,上架了应用市场。由于 Code 主要分官方的和开源社区的 IDE,需要上架 VS Code Marketplace(微软官方扩展市场)和 Open VSX(VSCodium、Gitpod 等使用)

本文将手把手带你完成两个平台的发布流程,让你的扩展真正上线可用

准备工作

在正式发布之前,你需要确保扩展已经具备以下内容, 这个是示例参考比较简单:

{
    "name": "cnb-welcome",
    "publisher": "cnbcool",
    "displayName": "cnb-welcome",
    "description": "cnb welcome",
    "version": "0.2.8",
    "icon": "src/images/logo.png",
    "engines": {
        "vscode": "^1.89.0"
    },
    "categories": [
        "Other"
    ],
    "activationEvents": [
        "onStartupFinished"
    ],
    "main": "./dist/extension.js",
    "repository": {
        "type": "git",
        "url": "https://cnb.cool/cnb/cool/cnb-welcome.git"
    },
    "contributes": {
        "commands": [
            {
                "command": "cnb.welcome",
                "title": "CNB Welcome"
            },
            {
                "command": "extension.openTerminal",
                "title": "CNB Open Terminal"
            },
            {
                "command": "extension.resetIsFirstRun",
                "title": "CNB ResetIsFirstRun"
            }
        ]
    },
    "scripts": {
        "build": "vsce package",
        "vscode:prepublish": "npm run package",
        "compile": "webpack",
        "watch": "webpack --watch",
        "package": "webpack --mode production --devtool hidden-source-map",
        "compile-tests": "tsc -p . --outDir out",
        "watch-tests": "tsc -p . -w --outDir out",
        "pretest": "npm run compile-tests && npm run compile && npm run lint",
        "lint": "eslint src --ext ts",
        "test": "vscode-test"
    },
    "devDependencies": {
        "@types/mocha": "^10.0.6",
        "@types/node": "18.x",
        "@types/vscode": "^1.89.0",
        "@typescript-eslint/eslint-plugin": "^7.7.1",
        "@typescript-eslint/parser": "^7.7.1",
        "@vscode/test-cli": "^0.0.9",
        "@vscode/test-electron": "^2.3.9",
        "eslint": "^8.57.0",
        "file-loader": "^6.2.0",
        "ts-loader": "^9.5.1",
        "typescript": "^5.4.5",
        "vsce": "^2.15.0",
        "webpack": "^5.91.0",
        "webpack-cli": "^5.1.4"
    },
    "license": "MIT",
    "dependencies": {
        "axios": "^1.9.0",
        "handlebars": "^4.7.8"
    }
}

安装打包工具

  • 安装 vsce 工具:
npm install -g @vscode/vsce
# 打包扩展, 会生成一个 .vsix 文件
vsce package
  • open-vsx CLI 工具(上传用 open-vsx)
npm install -g ovsx

发布到 VS Code Marketplace

官方文档 发布扩展 很详细,根据步骤来就可以。

创建个人令牌

vsce 只能使用个人访问令牌发布扩展,默认使用 Github 登录就可以。

访问 aex.dev.azure.com,反正跳过来跳过去,主要入口就是 Azure DevOps

devops 组织

随便选择一下 Project 进入,打开您的个人资料图片旁边的用户设置下拉菜单,然后选择个人访问令牌:

创建 token

在创建新的个人访问令牌模式中,选择令牌的以下详细信息:

权限设置

方便起见,我设置全部权限,最长有效期为 1 年。

妥善保管好生成 Token

创建发布者

访问设置 Visual Studio Marketplace 发布者管理页面

只需要填 ID 和 Name,不重复就行,我保持一样。

  • ID:您的发布商在 Marketplace 中的唯一标识符,将在您的扩展程序 URL 中使用。ID 一旦创建就无法更改。
  • 名称:您的发布商的唯一名称,将与您的扩展程序一起显示在 Marketplace 中。这可以是您的公司名称或品牌名称。

发布

先登录,按提示输入 PAT

vsce login <publisher-ID>

当然可以先本地测试, 构建出 vsix 文件,本地安装

vsce package

本地安装

发布

vsce publish

成功的日志大概如下:

INFO  Publishing 'gaeaflow.gaeaflow-gitspace v1.0.1'...
 INFO  Extension URL (might take a few minutes): https://marketplace.visualstudio.com/items?itemName=gaeaflow.gaeaflow-gitspace
 INFO  Hub URL: https://marketplace.visualstudio.com/manage/publishers/gaeaflow/extensions/gaeaflow-gitspace/hub
 DONE  Published gaeaflow.gaeaflow-gitspace v1.0.1.

发布到 Open VSX Registry

注册账号打开 Open VSX 通过 GitHub 登录就可以了, 需要签一个 VSX Publisher Agreement 申明才能创建 Namespaces

相对来说比较简单,我直接后台上传构建出 vsix 文件

替换

其他注意

需要两个扩展同步发布,以便官方和第三方 IDE 安装

如果有使用 harness(原 gitness)的 Gitspace 功能的,可以使用我提供的插件,也可以使用官方插件。需要设置环境变量 GITNESS_IDE_VSCODE_Plugin_Name=gaeaflow.gaeaflow-gitspace

可以在应用市场直接安装 GaeaFlow Gitspace

下次有时间说说如何集成 k8s gitspace 环境限定版

  •  

轻松搭出属于你的 AI 网关:5 分钟搞定 NewAPI 上云

2025年11月3日 22:46

使用 copilot.microsoft.com 生成,生成了 10 多次效果越来越差

为了方便同事接入 AI,也方便同事可以自主申请 AI 账号

New API 作为一款「新一代大模型网关与 AI 资产管理平台」,提供丰富的模型接入、接口管理、计费统计等功能,非常适合在 Kubernetes 集群中进行部署。本文带你一步步完成在 K8s 环境中的部署。

环境

  • 阿里云 k8s
  • 已经有分布式存储作为存储类(nas-sc)
  • Caddy
  • LDAP
  • openkruise

内部服务使用 Caddy 作为 Ingress 入口网关轻轻松松,顺便解决证书问题;使用 openkruise cloneset 管理,对标 Deployment

k8s 部署

官方文档还是比较清晰的,不需要额外拓展。默认部署在 newapi 命名空间下

吐槽一下 Bitnami,博通收啥黄啥。

Redis 部署

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: redis
  name: redis
  namespace: newapi
spec:
  storageClassName: nas-sc
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi
---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  labels:
    app: redis
  name: redis
  namespace: newapi
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  updateStrategy:
    type: InPlaceIfPossible
  template:
    metadata:
      labels:
        app: redis
    spec:
      initContainers:
        - name: volume-permissions
          image: ccr.ccs.tencentyun.com/k7scn/os-shell:bitnami-latest
          imagePullPolicy: "IfNotPresent"
          command:
            - /bin/bash
            - -ec
            - |
              chown -R 1001:1001 /data
          securityContext:
            runAsUser: 0
            seLinuxOptions: {}
          resources:
            limits:
              cpu: 150m
              ephemeral-storage: 2Gi
              memory: 192Mi
            requests:
              cpu: 100m
              ephemeral-storage: 50Mi
              memory: 128Mi
          volumeMounts:
            - name: redis
              mountPath: /data
      containers:
      - image: ccr.ccs.tencentyun.com/k7scn/redis:bitnami-8.2
        imagePullPolicy: IfNotPresent
        name: redis
        env:
        - name: REDIS_PASSWORD
          value: da06b1fa13bc643ede15newapi8anewapiacfed04ac12e8bf5e6b78406d9
        - name: REDIS_DISABLE_COMMANDS
          value: FLUSHALL
        ports:
        - containerPort: 6379
          protocol: TCP
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
        volumeMounts:
        - mountPath: /bitnami/redis/data
          name: redis
      restartPolicy: Always
      volumes:
      - name: redis
        persistentVolumeClaim:
          claimName: redis
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: newapi
spec:
  selector:
    app: redis
  ports:
  - port: 6379
    targetPort: 6379
    name: redis

部署 mysql

本来打算用 bitnami 的 mysql 折腾了一下初始化有点问题换成官方的了

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: mysql
  name: mysql
  namespace: newapi
spec:
  storageClassName: nas-sc
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi
---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  labels:
    app: mysql
  name: mysql
  namespace: newapi
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  updateStrategy:
    type: InPlaceIfPossible
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: ccr.ccs.tencentyun.com/k7scn/mysql:hub-8.4.7
        imagePullPolicy: IfNotPresent
        name: mysql
        env:
        - name: MYSQL_USER
          value: newapi
        - name: MYSQL_PASSWORD
          value: da06b1fa13bc6syzede15f3860b8newapiacfed04ac12e8bf5e6b78406d9
        - name: MYSQL_ROOT_PASSWORD
          value: oaPei9xoh7shipimoom0zysAhnewapi7iDair7EVie1Va0ahth8eu3row
        - name: MYSQL_DATABASE
          value: newapi
        ports:
        - containerPort: 3306
          protocol: TCP
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql
      restartPolicy: Always
      volumes:
      - name: mysql
        persistentVolumeClaim:
          claimName: mysql
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: newapi
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    targetPort: 3306
    name: mysql

部署 newapi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: newapi
  name: newapi
  namespace: newapi
spec:
  storageClassName: nas-sc
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi
---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  labels:
    app: newapi
  name: newapi
  namespace: newapi
spec:
  replicas: 1
  selector:
    matchLabels:
      app: newapi
  updateStrategy:
    type: InPlaceIfPossible
  template:
    metadata:
      labels:
        app: newapi
    spec:
      containers:
      - image: ccr.ccs.tencentyun.com/k7scn/new-api:v0.9.15-patch.2
        imagePullPolicy: IfNotPresent
        name: newapi
        env:
        - name: SQL_DSN
          value: newapi:da06b1fa13bc6syzede15f3860b8newapiacfed04ac12e8bf5e6b78406d9@tcp(mysql.newapi.svc:3306)/newapi?charset=utf8mb4&parseTime=True&loc=Local
        - name: REDIS_CONN_STRING
          value: redis://default:da06b1fa13bc643ede15newapi8anewapiacfed04ac12e8bf5e6b78406d9@redis.newapi.svc:6379
        - name: TZ
          value: Asia/Shanghai
        - name: ERROR_LOG_ENABLED
          value: "true"
        - name: BATCH_UPDATE_ENABLED
          value: "true"
        - name: SESSION_SECRET
          value: newapi-zysHuuch3joF9doe8dooviequuth4ohf6
        - name: CRYPTO_SECRET
          value: newapi-xeiRic0beuPaeQu7eanech3nai6iasyz
        - name: FRONTEND_BASE_URL
          value: https://newapi.ysicing.cloud
        ports:
        - containerPort: 3000
          protocol: TCP
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
        volumeMounts:
        - mountPath: /data
          subPath: data
          name: newapi
        - mountPath: /app/logs
          subPath: logs
          name: newapi
      restartPolicy: Always
      volumes:
      - name: newapi
        persistentVolumeClaim:
          claimName: newapi
---
apiVersion: v1
kind: Service
metadata:
  name: newapi
  namespace: newapi
spec:
  selector:
    app: newapi
  ports:
  - port: 3000
    targetPort: 3000
    name: newapi

部署 Dex

由于官方不支持 LDAP,暂时只能折中使用 OIDC 方式支持,username 是 sAMAccountName 还是 uid 根据 ladp 实际情况配置,正常只需要调整我打码的部分,Dex 还是很灵活的,官方文档也很齐全

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: dex
  namespace: newapi
data:
  dex.yaml: |
    issuer: https://newapi.ysicing.cloud/dex
    storage:
      type: memory
    web:
      http: 0.0.0.0:5556
    staticClients:
      - id: newapi
        redirectURIs:
          - "https://newapi.ysicing.cloud/oidc/callback"
        name: "newapi"
        secret: newapi-secret
    connectors:
      - type: ldap
        id: ldap
        name: "LDAP"
        config:
          host: "ldap.ysicing.cloud:389"
          insecureNoSSL: true
          startTLS: false
          bindDN: "****隐藏****"
          bindPW: "****隐藏****"
          userSearch:
            baseDN: "****隐藏****"
            filter: "(objectClass=person)"
            username: "sAMAccountName"
            idAttr: "sAMAccountName"
            emailAttr: "mail"
            nameAttr: "cn"
---
# apiVersion: apps/v1
# kind: Deployment
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  name:  dex
  namespace: newapi
  labels:
    app:  dex
spec:
  selector:
    matchLabels:
      app: dex
  replicas: 1
  updateStrategy:
    type: InPlaceIfPossible
    inPlaceUpdateStrategy:
      gracePeriodSeconds: 10
  template:
    metadata:
      labels:
        app: dex
    spec:
      containers:
      - name:  dex
        image:  ccr.ccs.tencentyun.com/k7scn/dex
        args:
          - dex
          - serve
          - /etc/dex/dex.yaml
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        livenessProbe:
          tcpSocket:
            port: 5556
          initialDelaySeconds: 5
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
          periodSeconds: 10
        ports:
        - containerPort:  5556
          name: dex
        volumeMounts:
        - name: dex
          mountPath: /etc/dex
      volumes:
        - name: dex
          configMap:
            name: dex
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: dex
  namespace: newapi
spec:
  selector:
    app: dex
  type: ClusterIP
  ports:
  - name: dex
    protocol: TCP
    port: 5556
    targetPort: 5556

配置 Caddy

由于是复用之前的 Caddy,这里只列出 newapi.caddy 配置

newapi.ysicing.cloud {
  @dex {
    path /dex*
  }
  import LOG /var/log/caddy/newapi.ysicing.cloud.log
  import COMCFG
  import TLS
  handle @dex {
    reverse_proxy dex.newapi.svc.cluster.local:5556
  }
  reverse_proxy newapi.newapi.svc.cluster.local:3000
}

配置

第一次访问,走安装向导即可。

OIDC 配置

开启 OIDC 登录,需要允许新用户注册,不然登录会失败

注册

OIDC 配置页,只需要配置 3 个

- Well-Known URL: https://newapi.ysicing.cloud/dex/.well-known/openid-configuration
- Client ID: newapi
- Client Secret: newapi-secret

配置 ClaudeCode

51

需要开启透传,还需要重写 UA, 请求头覆写

{
  "User-Agent": "claude-cli/2.0.31 (external, cli)"
}

其他注意

改完要记得保存 😂, 如果你的环境没要求,其实 compose 部署也比较简单

  •  

AI 编程新宠:MiniMax M2 搭配 Claude Code,效率飙升,成本直降!

2025年10月29日 21:28

AI 编程新宠:MiniMax M2 搭配 Claude Code,效率飙升,成本直降!

使用 copilot.microsoft.com 生成

今天刷 L 站,发现好多人安利,由于跟风试试,感觉效果要比 GLM 要好

如果你是开发者、程序员,或者对 AI 辅助编码感兴趣,这个 MiniMax M2 + Claude Code 搭配绝对能让你眼前一亮。为什么?因为它不只性能强劲,还超级亲民:MiniMax M2 以 Claude Sonnet 8% 的价格,提供 2 倍速度,最近还限时免费!

本文大部分数据来源 L 站[MiniMax] M2 简单实战测评:Java 多模块 bug 修复、小项目生成,文档来源于官网。

官网

官网使用手册很详细了,分国内站和国际站,总体没啥区别。

  • 国际站: minimax 使用 Google 登录
  • 国内站: minimaxi 使用手机号登录

模型优劣势横向对比

模型优劣势横向对比-来源 L 站

综合评分

综合评分-来源 L 站

在不当人的某 A,确实 T0 级别,如果 Codex 能提提速也是不错的选择。

注册

默认以国内站为示例,使用手机号注册,暂时好像不需要实名。

PS: 他们家短信验证码发送有点滞后,大概需要 20s 左右才能收到。

登录成功后访问接口密钥,或者下面这个地址

https://platform.minimaxi.com/user-center/basic-information/interface-key

创建密钥,记得保存后续留用。

创建密钥

配置 Claude Code

官方文档也是很详细,这里简单说下。

默认已经安装了 Claude Code,或者参考如下安装

npm install -g @anthropic-ai/claude-code

Linux 配置 ~/.claude/settings.json

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
    "ANTHROPIC_AUTH_TOKEN": "<需要替换为你申请的token>",
    "API_TIMEOUT_MS": "3000000",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1,
    "ANTHROPIC_MODEL": "MiniMax-M2",
    "ANTHROPIC_SMALL_FAST_MODEL": "MiniMax-M2",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "MiniMax-M2",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "MiniMax-M2",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "MiniMax-M2"
  }
}

macOS 我使用佬友写的 CCS(cc-switch)

配置大概如下所示

cc-switch

配置完成,可以直接开干。

其他

MiniMax M2 模型 API 限时免费调用!活动截止时间:2025 年 11 月 7 日 上午 08:00

在 AI 浪潮下,MiniMax M2 的出现,让高性能编码工具不再是奢侈品。搭配 Claude Code,它不只适合专业开发者,也完美契合初学者。想体验普惠智能,现在就行动吧。最后在文尾安利一下 Zeus 的中转服务,让我实现了付费上班哈哈哈。

让我也吃一下 AFF

https://www.packyapi.com/register?aff=NnSl
  •  

周末闲逛朝阳馆茶博会

2025年10月20日 22:16

周末闲来无事,听说北京朝阳馆的茶博会正热火朝天地进行中(2025 北京国际秋季茶业交易博览会,从 10 月 16 日到 19 日,在中国国际展览中心朝阳馆举办),赶紧拉上茶友去转转。没想到这一逛,就是简单的一逛!今天就来给大家分享我的闲逛笔记,带你云游这场茶的盛宴

这是今年第三场茶博会了我记得没错的话,规格算比较小的了,11 月还有一场在国家会议中心,爱喝茶的可以约起来。

总体评价

可圈可点,主要为云南福建等地区地方茶偏多。绿茶只有一家皖南的,茶香肆意,忘记名字了。皖南的名茶太多了,几乎每个市县都有自己的特色地方茶,这里打个广告安利一下我们的桐城小花,从小喝到大。不太好找,在珠宝展后面,问了几次路。

初入展馆

真是败笔,有个展馆入口是卖鱼干的(巧了不是,我比较不耐受这种味道)。然后选择先去看了茶具,由于地方不大,卖茶具的也不多,品质把玩了一下感觉还行。价格也不便宜,砍价也砍不动,只能看看摸摸上上手。

比较喜欢这种小杯子

目标价位 6-8 块,没砍下来哈哈哈

亮点摊位

逛着逛着,我被一个云南地方茶茶摊吸引住了。摊主是个有点懵的小姐姐,别人都是焖好了茶等人,小姐姐直接给你现在开泡哈哈哈。

入坑的摊位

莓茶

野不野生咱不知道,但是第一口入口挺特别的,回甘比较慢。湖南地方特色茶

第一次喝,后面也搜了一下

莓茶不含茶碱、咖啡因,饮后不会兴奋,能改善并提高睡眠质量,老少皆宜。莓茶所含活性黄酮能杀灭细菌,沏泡一周仍可饮用,不会变馊(nb)

云南小粒咖啡

摊位试了几杯,感觉还行。云南高黎问候品牌

老实说,买完出门就后悔了哈哈哈,感觉没刀好了高了。

哦,对了,只看到一个美女茶艺师哈哈哈。

总之,这次周末闲逛朝阳馆茶博会,从忙碌的工作中抽身,也挺好的。茶不只是一种饮品,更是生活态度。如果你也爱茶,不妨约下个月展会一起去转转!

  •  

GitHub Spec Kit 与 Claude 4.5那点事

2025年9月30日 11:55

GitHub Spec Kit 与 Claude 4.5 那点事

GitHub Spec Kit

上周抽空将 GitHub Spec Kit 移植到了 code-pilot, 新的大型项目使用起来体验还不错,就是特别耗 token,不过今天有了转机了 Claude 4.5 发布了

Spec Kit 是什么?

这里不细说了,类似介绍的文章有很多,核心工作原理是让规范成为工程流程的中心

核心阶段

  • Specify 用户需求阶段 /spec-kit:specify
  • Clarify 澄清需求阶段 /spec-kit:clarify
  • Plan 制定开发方案阶段 /spec-kit:plan
  • Tasks 制定计划阶段 /spec-kit:tasks
  • Implement 实现计划阶段 /spec-kit:implement

安装

git clone https://github.com/ysicing/code-pilot.git ~/.claude
cd .claude
cp CLAUDE.md.example CLAUDE.md

使用

记得将模型从 Opus 切到推荐模型 Sonnet 4.5

/spec-kit:specify [你的需求]
# 澄清需求
/spec-kit:clarify
# 后面一直输入 继续 继续 继续 就可以了

Claude 4.5 和 Claude Code 2.0 更新

新模型确实很能打,没有降智,还便宜。减少了阿谀奉承、欺骗、权力追求和鼓励妄想思维等相关行为

新增功能

  • 支持检查点
  • 内置**/usage**查询用量信息
  • 原生 VSCode 插件

问题

  1. 新版本 Claude Code 强制登录
  2. 终端深色背景不可用,可按下面配置
  3. 有人说降智哈哈


欢迎关注,可以看看我郑再打工每天都在折腾什么。

  •  

ClaudeCode和Codex的MCP有趣玩法

2025年9月24日 10:00

已经使用很长一段时间,ClaudeCode 和 Codex 互相调用,简单分享一下。我使用的场景大多数在 ClaudeCode 降智瞎写时,你干不了用 codex 帮你看看吧

Codex 为主,调用 Claude Code

如果你的主 AI 编程工具是 Codex,可以在 ~/.codex/config.toml 配置文件中配置一个 Claude Code MCP 服务

[mcp_servers.claude]
command = "claude"
args = ["mcp", "serve"]

配好后打开 Codex,输入 /mcp 就能看到 Claude 的工具了。

使用技巧:

使用claude帮我制定迭代计划保存到plan.md

Claude Code 为主,调用 Codex

如果你的主 AI 编程工具是 Claude Code,则可以添加 Codex MCP 服务:

claude mcp add -s user codex-gpt-5 -- codex mcp

添加之后,打开 Claude Code 的 /mcp 命令可以看到 codex 工具

使用技巧:

使用codex基于plan.md完成todo的任务
  •  

物语云/Zouter 香港存储型VPS 小测

2025年9月19日 21:37

背景

物语云筹办的国际站(无需 KYC、中立服务)在今天上线,非常荣幸能作为内测用户,提前体验到物语云的香港产品线(HK BGP Global)。

后台管理面板依旧是和物语云国内站点一样,自主研发 简单易用。

本文测评主要以存储型示例,系统默认为 FNOS,由于测评时间属于晚高峰,跨境且无大陆优化,链路情况仅供参考。

官网

zouter.io

如果打不开或者打开比较慢很正常,目前正在接受洗礼, 官方备货充足,可以错峰购买。

套餐

首发循环优惠 5 折, 下面为优惠后价格

  • 经典通用型 Standard 1c/1g/15g/2T 流量 9.9r/月
  • 大盘存储型 Storage 1c/1g/15g+1T(raid10 存储盘)/2T 流量 29.9r/月
  • 高频性能型 Performance 1c(9950x 高频)/1g/15g/2T 流量 16.9r/月

每款配置都配备了 1Gbps 的带宽,纯国际线路无大陆优化, 防护峰值 10Gbps

除此之外,还有福利:

  • 年付仅需 10 个月费用
  • 额外增购流量包价格 5¥/TB(双向)
  • 限定 +1¥ 可升至 2GB RAM,+2¥ 可升至 2vCore(除高频性能型外)
  • 免费 2 快照和 2 备份(存储型不支持)
  • 提供 DNS 解锁,目前解锁地域为 DE

测评

以下测评基于 NodeQuality 测试脚本测评,且未使用物语云 DNS 解锁服务

基本信息

Basic System Information:
---------------------------------
Uptime     : 0 days, 9 hours, 41 minutes
Processor  : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
CPU cores  : 1 @ 2494.140 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ✔ Enabled
RAM        : 976.7 MiB
Swap       : 1024.0 MiB
Disk       : 515.0 GiB
Distro     : Debian GNU/Linux 12 (bookworm)
Kernel     : 6.12.18-trim
VM Type    : STANDARD PC (I440FX + PIIX, 1996)
IPv4/IPv6  : ✔ Online / ✔ Online

IPv6 Network Information:
---------------------------------
ISP        : Unknown
ASN        : AS205548 ZOUTER LIMITED
Location   : Hong Kong, Kowloon ()
Country    : Hong Kong

fio Disk Speed Tests (Mixed R/W 50/50) (Partition -):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 71.93 MB/s   (17.9k) | 1.06 GB/s    (16.7k)
Write      | 72.11 MB/s   (18.0k) | 1.07 GB/s    (16.7k)
Total      | 144.04 MB/s  (36.0k) | 2.14 GB/s    (33.4k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 1.02 GB/s     (1.9k) | 1.00 GB/s      (984)
Write      | 1.07 GB/s     (2.0k) | 1.07 GB/s     (1.0k)
Total      | 2.09 GB/s     (4.0k) | 2.08 GB/s     (2.0k)

Geekbench 5 Benchmark Test:
---------------------------------
Test            | Value                         
                |                               
Single Core     | 794                           
Multi Core      | 789                           
Full Test       | https://browser.geekbench.com/v5/cpu/23794734

 SysBench CPU 测试 (Fast Mode, 1-Pass @ 5sec)
---------------------------------
 1 线程测试(单核)得分:          1008 Scores
 SysBench 内存测试 (Fast Mode, 1-Pass @ 5sec)
---------------------------------
 单线程读测试:          20287.46 MB/s
 单线程写测试:          17149.31 MB/s

🎬IP 质量

IP 质量

🌐 网络质量

网络质量

📍 回程路由

回程路由

细节详情

NodeQuality 链接

磁盘性能

大盘的性能 IO 还是挺满意,秒杀其他石头盘,内测早期测评数据(后面官方放宽了硬盘 I/O 限制)

启动盘:

fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/vda1):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 66.85 MB/s   (16.7k) | 89.56 MB/s    (1.3k)
Write      | 67.00 MB/s   (16.7k) | 90.03 MB/s    (1.4k)
Total      | 133.85 MB/s  (33.4k) | 179.60 MB/s   (2.8k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 179.56 MB/s    (350) | 247.14 MB/s    (241)
Write      | 189.10 MB/s    (369) | 263.60 MB/s    (257)
Total      | 368.66 MB/s    (719) | 510.75 MB/s    (498)

存储盘:

fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/vdb1):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 41.38 MB/s   (10.3k) | 77.65 MB/s    (1.2k)
Write      | 41.45 MB/s   (10.3k) | 78.06 MB/s    (1.2k)
Total      | 82.84 MB/s   (20.7k) | 155.71 MB/s   (2.4k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 183.89 MB/s    (359) | 241.67 MB/s    (236)
Write      | 193.66 MB/s    (378) | 257.76 MB/s    (251)
Total      | 377.55 MB/s    (737) | 499.44 MB/s    (487)

其他 FAQ

测试 IP: 151.243.229.1

对比其他家优势:

  • 极速的工单响应:继承饱受好评的物语云主站高标准售后,客服团队平均在 5 分钟内响应工单(工单响应超快,即使夜间 15 分钟内也会响应,而且技术专业)
  • 退款利索,可试用
  • 可靠的存储方案:存储介质均配备 RAID 阵列 + 热备盘(Hot Spare)
  • 免费的备份服务:除大盘实例外,标准实例均支持免费的备份与快照
  • 目前防御阈值为 10G,超过后将进入黑洞 30 分钟
  • DMCA 宽松,但是需要遵循当地法律法规
  • 流量用完,目前为断网不关机,后续有计划改为限速,现处于技术评估阶段
  •  

PVE9与k3s那点事:深夜填坑记,搞定AppArmor

2025年8月21日 21:25

适用于部署了 PVE9 的 k3s 节点。由于本文属于回忆文,可能存在一些出入,总体流程没问题。

背景

我目前已经将大部分 k3s 节点系统升级到最新的 Debian13 了,最近手头又多了一台杜甫,首先装了 Debian13,部署了 k3s 计算节点,然后观察到节点资源还很富裕,可以跑个 PVE 集群节点。

PVE 部署

主要参考 oneclickvirt/pve,直接在 Debian13 上安装 PVE9。中间踩了一个坑,忘记安装前配置 hosts

# 确定能ping,不然后面/etc/pve/local/pve-ssl.key创建失败导致pve没法正常启动
ping $(uname -n)

现象

未部署 PVE 前,k3s 正常工作了很长时间。安装完 PVE 后,部分 POD 开始报错了,本文以 kruise-daemon 为例,一直启动不了直至 CrashLoopBackOff。

查看相关日志后,发现 pod 所在节点审计日志:

[Thu Aug 21 11:52:09 2025] audit: type=1400 audit(1755748328.817:29): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="cri-containerd.apparmor.d" pid=20287 comm="kruise-daemon" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none

发现 AppArmor 这位严格的安全管家把你的应用操作给拦下来了。分析一下这个日志,这是一条典型的 AppArmor 安全策略拒绝 (DENIED) 日志。简单来说,系统上的一个名为 kruise-daemon 的程序(运行在容器内)尝试执行一个操作,但被 AppArmor 安全模块阻止了

AI 分析

节选自 AI 分析

日志逐段分析

[Thu Aug 21 11:09:38 2025] audit: type=1400: 这是日志的时间戳和审计事件类型。
apparmor="DENIED": 核心信息。AppArmor 拒绝了一个操作。AppArmor 是 Linux 内核的一个强制访问控制(MAC)安全模块,它可以将程序限制在一组有限的资源中。
operation="create": 被拒绝的操作是“创建”。
class="net": 操作的类别是网络(net)相关的。
info="failed protocol match": 拒绝的详细原因。程序尝试创建的套接字(socket)的协议类型与 AppArmor 策略文件中允许的协议不匹配。
error=-13: 对应系统错误码 EACCES (Permission denied),进一步证实是权限问题。
profile="cri-containerd.apparmor.d": 关键信息。触发这个拒绝事件的安全策略文件是 cri-containerd.apparmor.d。这通常是 containerd 容器运行时的默认 AppArmor 配置文件,用于限制所有由 containerd 管理的容器的行为。
pid=48236 comm="kruise-daemon": 执行这个操作的进程是 kruise-daemon,进程 ID 是 48236。kruise-daemon 是 OpenKruise 的一个组件,通常以 DaemonSet 的形式运行在 Kubernetes 的每个节点上,负责一些节点级的增强功能。
family="unix": 网络套接字的类型是 Unix Domain Socket (UDS),这是一种用于同一台主机上进程间通信的机制,而非跨主机的 TCP/IP 网络。
sock_type="stream": 套接字的类型是流式套接字(stream),类似于 TCP。
protocol=0: 使用的协议号是 0(默认协议)。

问题核心概括

一句话总结: 运行在 containerd 容器中的 kruise-daemon 进程试图创建一个 Unix 域流式套接字(Unix Domain Stream Socket),但是 Kubernetes 节点上为容器配置的默认 AppArmor 安全策略 (cri-containerd.apparmor.d) 不允许这个操作。
这通常意味着 kruise-daemon 需要通过 Unix Socket 与节点上的其他服务(例如 Docker daemon、CNI 插件或其他 agent)进行通信,但默认的安全策略为了保证容器的隔离性,限制了这类“高级”或“特殊”的网络操作。

处理过程

确认 AppArmor 服务状态和已加载的 Profile

需要查看 AppArmor 当前在内核中加载了哪些 Profile

apparmor_status 或者aa-status
# 结果(这个是我调整后的,默认 cri-containerd.apparmor.d也是强制模式)
apparmor module is loaded.
8 profiles are loaded.
7 profiles are in enforce mode.
   /usr/bin/lxc-copy
   /usr/bin/lxc-start
   docker-default
   lxc-container-default
   lxc-container-default-cgns
   lxc-container-default-with-mounting
   lxc-container-default-with-nesting
1 profiles are in complain mode.
   cri-containerd.apparmor.d
0 profiles are in prompt mode.
0 profiles are in kill mode.
0 profiles are in unconfined mode.
1 processes have profiles defined.
0 processes are in enforce mode.
1 processes are in complain mode.
   /kruise-daemon (31408) cri-containerd.apparmor.d
0 processes are in prompt mode.
0 processes are in kill mode.
0 processes are unconfined but have a profile defined.
0 processes are in mixed mode.

默认 /etc/apparmor.d/ 目录下是没有这个的,是 containerd 启动时加载到内核的。针对这种情况下,最好的办法是覆盖它。 我们可以在标准路径 /etc/apparmor.d/ 下创建一个同名的文件。当 AppArmor 服务重载配置时,它会优先使用磁盘上的文件来覆盖内存中已加载的同名 Profile

这里简单记录一下,没那么简单。

在 /etc/apparmor.d/ 目录下创建一个新文件,名字就叫 cri-containerd.apparmor.d

cat > /etc/apparmor.d/cri-containerd.apparmor.d <<EOF
# AppArmor Profile for cri-containerd.apparmor.d
# SYNTAX: AppArmor 4.1 (for Debian 13+)

#include <tunables/global>

# 声明我们使用的是新的 v4 语法,这非常重要!
abi <abi/4.0>,

profile cri-containerd.apparmor.d flags=(attach_disconnected, complain, mediate_deleted) {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  # 授予容器运行时所需的大部分 POSIX capabilities
  capability,

  # 拒绝直接写内核和内存等危险操作
  deny /dev/mem w,
  deny /dev/kmem w,

  # 允许通用的网络操作 (TCP/IP 等)
  # 在新语法中,这个规则不包含 unix socket
  network,

  # === AppArmor 4.x 关键修改 ===
  # 使用新的、独立的 unix socket 规则族
  # 直接允许创建、连接、监听、发送、接收 stream 类型的 unix socket
  unix (create, connect, listen, accept, send, receive) type=stream,

  # 允许挂载相关的操作
  mount options=(ro, nosuid, nodev, noexec, remount, bind),
  remount,

  # 允许容器运行时需要的一些基本文件访问
  /dev/urandom r,
  /sys/devices/system/cpu/online r,
  /sys/fs/cgroup/ r,
  /sys/fs/cgroup/** r,

  # 拒绝修改 AppArmor 自身,增强安全性
  deny /sys/kernel/security/apparmor/** w,

}
EOF

重新加载 AppArmor 配置,让我们的新文件生效

# -r 表示 replace,会替换掉内存中已有的同名 profile
apparmor_parser -r /etc/apparmor.d/cri-containerd.apparmor.d

再次运行 aa_status,确保 Profile 仍然在加载状态。然后尝试重建一下出问题的那个 kruise-daemon Pod,发现还是会 Deny,换了一个新错

了[Thu Aug 21 12:07:43 2025] audit: type=1400 audit(1755749262.720:42): apparmor="DENIED" operation="open" class="file" profile="cri-containerd.apparmor.d" name="/run/secrets/kubernetes.io/serviceaccount/..2025_08_21_04_07_36.2733297639/token" pid=28709 comm="kruise-daemon" requested_mask="r" denied_mask="r" fsuid=0 ouid=0

同上流程,是不是改一下配置文件就可以,是的, 截取了新增的地方如下

/sys/fs/cgroup/** r,
  # --- 本次新增规则 ---
  # 允许 Pod 读取其 Service Account Token,以便与 K8s API Server 通信
  "/run/secrets/kubernetes.io/serviceaccount/**" r,
  # 拒绝修改 AppArmor 自身,增强安全性
  deny /sys/kernel/security/apparmor/** w,

}

作为暴躁小伙,这样多麻烦,反正自己的环境应该也没啥大问题, 一梭子解决,观察者模式, 只需记录,不会拦截

aa-complain /etc/apparmor.d/cri-containerd.apparmor.d

其实到这里,问题基本解决了,但是没彻底解决。可以根据审计日志来完善,收集全部权限需求,一次性构建完整的 Profile,然后切换回 Enforce

官方这里确实好像有 BUG,事后没搜到了。

参考文档

希望这次的分享能帮到大家!觉得有用的话,别忘了点赞、在看、分享三连哦!

  •  

Claude Code之Statusline小工具 大用处

2025年8月12日 21:38

这是最近新出的功能状态栏配置, 要求版本至少是 1.0.72, 官方文档已经很详细,具体可以参考 claude-code/statusline

状态栏配置用途

为 Claude Code 创建自定义状态栏以显示上下文信息

通过自定义状态栏让 Claude Code 成为您专属的工具,该状态栏显示在 Claude Code 界面底部,类似于终端提示符(PS1)在 Oh-my-zsh 等 shell 中的工作方式。

示例

创建自定义状态栏

官方给了两种方式:

  • 运行 /statusline 让 Claude Code 帮助您设置自定义状态栏。默认情况下,它会尝试复制您终端的提示符,但您可以向 Claude Code 提供关于所需行为的额外说明,例如 /statusline show the model name in orange
  • 直接在 .claude/settings.json 中添加 statusLine 命令(推荐用这种)

另外我的 code-pilot 默认也集成了基础版本的,具体可以参考 settings.example

"statusLine": {
    "type": "command",
    "command": "~/.claude/scripts/statusline.sh",
    "padding": 0
  }

不过,本文主要将如何使用佬友写的 CCometixLine

CCometixLine 配置指南

有兴趣的可以查阅佬友的原文 Claude Code StatusLine | 小工具 大用处

由于我个人的习惯, 二进制放 bin,脚本放 scripts 目录下

20:26 ➜  .claude git:(master) tree -L 1
.
├── assets
├── bin
├── scripts
├── settings.json
└── CLAUDE.md

11 directories, 11 files

项目地址: CCometixLine

macOS 部署

涉及到非中文字体安装, 主要是 CCometixLine 图标依靠 Nerd Font

brew tap laishulu/homebrew
 brew install font-meslo-lg-nerd-font

佬友推荐了:

  • MesloLGS NF(Powerlevel10k 官方推荐)
  • FiraCode Nerd Font(支持编程连字)
  • JetBrainsMono Nerd Font(现代等宽字体)
  • Hack Nerd Font(清晰易读)

安装完成后设置 iTerm2 的字体,主要设置我勾选的那个就可以使图标生效

示例

配置也比较简单, 从 github 下载对应的二进制压缩包,解压放到对应的目录即可,检查一下权限,需要有执行权限

mkdir -p ~/.claude/bin  
wget https://github.com/Haleclipse/CCometixLine/releases/latest/download/ccline-macos-arm64.tar.gz
tar -xzf ccline-macos-arm64.tar.gz
cp ccline ~/.claude/bin/
chmod +x ~/.claude/bin/ccline

然后 settings.json 配置如下:

cat settings.json | jq .statusLine
{
  "type": "command",
  "command": "~/.claude/bin/ccline",
  "padding": 0
}

linux 部署

佬友提供的,可能受限于编译环境,可能提示 glibc 问题。现象就是配置了不生效,可以使用 .claude/bin/ccline -V 测试,如果能提示版本就没问题。

这里我也提供一个在 Debian13(12)都可以运行

https://c.ysicing.net/oss/tiga/linux/amd64/ccline-linux-amd64

其他

除了这些外,还可以使用 ccusage, 可以实时看到今天的总费用、当前活跃的 5 小时区块费用 & 剩余时间、实时消耗速率

{
  "statusLine": {
    "type": "command",
    "command": "bun x ccusage statusline"
  }
}
  •  

Claude Code 多智能体工作流系统:从手动敲代码到AI自动化, 开发效率直接起飞!

2025年8月10日 21:32

大家好,今天来给大家安利一个超级黑科技工具——基于 Claude Code 多智能体工作流系统!这个工作流,它不是简单的代码生成器,而是将你的开发流程从手动命令链升级成自动化专家团队。想象一下,原本需要你一步步监督代码的编写、测试、优化,现在交给一群 AI 智能体分工协作,质量把控还自动过关,简直是福音!如果你是开发者、产品经理,或者对 AI 辅助编程感兴趣,强烈安利。咱们一步步来拆解这个系统的魅力,看看它如何让你的工作流变得更高效、更智能。

项目

https://github.com/ysicing/code-pilot

仓库 README 文件或者 guide 指南文件也是非常详细的,也会随着项目迭代而更新,本文也是根据相关内容撰写而来,有兴趣可以尝试一下

什么是 Claude Code 多智能体工作流系统

简单来说,这个系统是基于 Anthropic 的 Claude Code 构建的开发工具。它将传统的开发过程(如需求分析、代码实现、质量审查、测试、调试)拆分成多个专业 AI 智能体,每个智能体专注于一个领域,避免了万能 AI 带来的泛化问题

核心理念

  • 从主观判断转向客观标准,从手动监督转向自动化质量关卡
  • 大道至简(KISSYAGNISOLID)

内置智能体

系统内置了 14 个专家智能体,比如:

  • 需求生成智能体:帮你拆解用户故事,生成详细规格。
  • 代码实现智能体:根据需求自动生成代码。
  • 审查智能体:客观评分代码质量,确保达到 90% 标准。
  • 测试智能体:智能评估变更影响,进行比例测试,避免过度测试

它不是孤立的,而是无缝集成 Claude Code 命令行(如 /ask/code/test),让整个流程像流水线一样顺畅。

为什么这个系统这么 NB?几大亮点抢先看

一开始想用 agentscommands 子目录功能,使用 znb 区分自定义命令,避免重复,不过好在放弃了。

这个工作流不是吹牛,它的设计直接解决了开发中的痛点,让我来列举几个亮点:

  • 质量控制自动化:不再靠主观“看起来行”,系统用客观 90% 评分作为关卡。通过就继续,不通过就迭代优化,省时省力
  • 专业分工:每个智能体只干一件事,避免上下文污染。比如代码智能体专注生成,审查智能体专注挑刺,测试智能体专注验证 UI 或逻辑变更
  • 轻量级流程(最常用):核心步骤无冗余,聚焦需求驱动。支持全自动化模式(一键从需求到发布)和分阶段手动协调模式,灵活性拉满。
  • 智能测试策略:根据变更类型(如 UI vs. 业务逻辑)比例测试,还能感知 UI 变化,防止过度测试浪费资源(这个是根据实践来的,涉及到前端资源变更时,浪费时间和 Token 要比其他类型要多的多)
  • 需求澄清与拆分: 认识我的人都知道我所在的行业,基于我的实践丰富了这方面内容,试图探索使用 Claude Code 管理我的需求

总之一句话,让开发从监督密集型转向 自动化专家型,特别适合 Web 应用、DevOps 等场景。
举个例子:某系统登录支持 LDAP,原本可能花半天,现在用 /requirements-pilot 命令,几分钟就搞定从用户需求到研发需求、拆迭代、编写代码、测试、预发布检查全流程。

如何快速上手?

最大的门槛是如何稳定使用 Claude Code

安装和使用超简单,别担心,这个系统安装门槛低,提供了详细指南。咱们一步步来。

支持用户级或项目级安装,本人推荐使用用户级安装使用

操作流程

先安装 Claude Code CLI,通过 npm 全局安装:

npm install -g @anthropic-ai/claude-code

然后检查版本:

claude --version
# 本文时版本为1.0.72
1.0.72 (Claude Code)

如果你已有 .claude,先重命名你的

mv ~/.claude ~/.claude-old

克隆到 ~/.claude 目录

git clone https://github.com/ysicing/code-pilot ~/.claude

已有 .claude 的,你可以根据 ~/.claude/.gitignore 内容将 ~/.claude-old 内的目录或者文件同步到 ~/.claude

根据自己的需求,可以将 CLAUDE.md.example 复制一份重命名为 CLAUDE.md, 作为全局 AI 工作流指导文件,大方针;

最后,需要根据自己的实际情况配置了,仅适用于 macOS

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "token",
    "ANTHROPIC_BASE_URL": "url",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
    "CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR": "true",
    "CLAUDE_LANGUAGE": "zh"
  },
  "includeCoAuthoredBy": false,
  "permissions": {
    "allow": [
    ],
    "deny": [
      "Bash(rm -rf:*)",
      "Bash(rmdir:*)"
    ]
  },
  "hooks": {
    "Notification": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/show-notification.sh"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/check-continue.sh"
          },
          {
            "type": "command",
            "command": "~/.claude/scripts/task-completed.sh"
          }
        ]
      }
    ]
  },
  "feedbackSurveyState": {
    "lastShownTime": 1754092908693
  }
}

重点内容在 hooks 里,是等待指示和完成的通知,默认使用的 macOS 自带工具实现。

示例, 更多提示音可以查看 assets 目录下文件,也可以自定义(示例提示音使用 fish.audio 生成)

# 等待提示
afplay assets/49-confirm.mp3 -v 1
# 完成提示音
afplay assets/49-perfect.mp3 -v 1
# 鸽鸽
afplay assets/cxk-v1-perfect.mp3

使用示例

  • 全自动化模式:直接输入 /requirements-pilot "系统登录支持 LDAP" ,系统自动处理需求生成、需求澄清确认、代码实现、审查、测试,也可以添加 --no-test 跳过测试流程
    -分阶段模式:
  1. /story-breakdown "电商结账流程":拆解用户故事。
  2. /ask "结账流程:微服务 vs 单体架构":咨询架构建议。
  3. /requirements-pilot "支付处理故事 1" --test:生成需求并测试。
  4. /review "验证支付安全性":质量审查。
  5. /release-check "支付系统":准备发布。

另外还提供了多种模式,如需求驱动、问题驱动、质量优先,由于流程不太适合公开分享,建议大家可以拿自己的项目实际跑一跑,用过我这套工作流的都说好。

使用体验

效率翻倍,质量更稳

本套流程我已经跑了差不多两周了,效率大大的提升,任何需求一来,/requirements-pilot 基本一梭子就解决了

结语

快来试试,AI 开发新时代已来!Claude Code 多智能体工作流系统绝对是 2025 年开发者的必备神器!它不只是工具,更像是你的 AI 团队伙伴。基于 ysicing/code-pilot 赶紧去试用一下吧,5 分钟就能上手。

致谢

本项目基于 myclaude 进行二次迭代,在此基础上实现了重大增强和创新。我们衷心感谢:

  • @cexll 创建了奠基性的 myclaude 项目,为本项目提供了灵感
  • Claude (Anthropic) 在整个开发过程中提供了卓越的 AI 协助和大力支持
  • Linux.do 社区成员们提供的宝贵建议
  • anyrouter 早期的测试支持

特别感谢与 Claude 的持续合作,使得复杂的多智能体工作流系统和质量门控自动化成为可能。

  •  

Debian 12 Bookworm 升级 Debian 13 Trixie

2025年8月8日 20:54

本文将手把手指导如何升级 Debian 12 Bookworm 到 Debian 13 Trixie

不建议跨大版本升级,Debian 11 Bullseye 升级 Debian 12 Bookworm, 其他版本也是类似,如果机器配置足够低,推荐 Debian 10 养老

准备工作

操作前,重要数据先备份,默认使用 root 操作

  • 不支持 LXC
  • Debian 12
  • root 用户

更新系统

先更新系统,更新到最新版本

apt update
apt upgrade -y
apt autoclean
apt autoremove -y

升级系统

在升级前,先说一下镜像源文件的变化。

之前版本的 Debian 软件源配置文件使用传统的 One-Line-Style,路径为 /etc/apt/sources.list;但是从 Debian 12 的容器版本开始,以及 Debian 13 正式版后,其软件源配置文件变更为 DEB822 格式,路径为 /etc/apt/sources.list.d/debian.sources

推荐使用新的软件源配置文件 DEB822 格式, 然后安全的删除 /etc/apt/sources.list, 当然目前使用老格式也是没问题的。

源示例对比

两者保留其一即可

Debian 13 /etc/apt/sources.list

deb http://mirrors.tencent.com/debian/ trixie main contrib non-free non-free-firmware
deb http://mirrors.tencent.com/debian/ trixie-updates main contrib non-free non-free-firmware
deb http://mirrors.tencent.com/debian/ trixie-backports main contrib non-free non-free-firmware
deb http://mirrors.tencent.com/debian-security trixie-security main contrib non-free non-free-firmware

Debian 13 /etc/apt/sources.list.d/debian.sources

Types: deb
URIs: http://mirrors.tencent.com/debian
Suites: trixie trixie-updates trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: http://mirrors.tencent.com/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

升级系统

根据自己的实际情况,操作

sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.list
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.sources

如果有错误提示文件或目录不存在,忽略即可。

apt update
apt upgrade -y
apt full-upgrade -y
# 在升级完成没报错后执行,也可以在reboot后执行
apt autoclean
apt autoremove -y

reboot

更新过程中,用 Debian 都知道的

  • 更新过程种会提示一些软件是否需要自动重启,选 Yes 即可,以及一些软件的配置文件是否需要更新,按照自己的情况选择即可,默认回车即视为使用旧的配置文件
  • 另外有些软件会提示是否变更配置, 默认选择 keep the local version 即可

确定查看系统版本

root@service:~$ cat /etc/debian_version
13.0

确定查看系统版本

# 升级后重启前
root@service:~$ uname -a
Linux service 6.6.13+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.6.13-1~bpo12+1 (2024-02-15) x86_64 GNU/Linux
# 升级重启后
root@service:~$ uname -a
Linux service 6.12.38+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.38-1 (2025-07-16) x86_64 GNU/Linux
  •  

使用 LiteLLM 自建 Claude Code 中转服务

2025年8月5日 20:27

最近 A 站大规模封号,导致之前的号商的中转大都歇菜了,另外加上国内用户在使用 Claude Code 时常常面临网络限制、账号注册门槛等难题。如何绕过这些障碍,稳定、高效地使用 Claude Code?答案是:自建 Claude Code 中转服务!

今天,我们将介绍如何利用开源工具 LiteLLM 自建 Claude Code 中转服务,不仅能规避官方限制,还能灵活调用多种语言模型(如 OpenAI、Vertex AI、xAI 等),实现成本优化和高效开发。无论你是个人开发者还是团队用户,这篇保姆级教程都能帮你快速上手。

LiteLLM 是什么

LiteLLM 是一个轻量级的开源代理工具,支持将 Claude Code 的 API 请求转换为多种语言模型的格式,兼容 Anthropic、OpenAI、Vertex AI 等主流模型。通过 LiteLLM,你可以:

  • 绕过地域限制:无需海外账号,国内也能流畅使用 Claude Code
  • 灵活切换模型:支持多种模型(如 Claude Sonnet、GPT-4o、Gemini),按需分配任务以优化成本
  • 本地部署:数据隐私更有保障,适合对安全性要求高的项目
  • 开源免费:完全开源,社区活跃,易于扩展和维护

实操

litellm 主要使用 python 编写,部署途径有两种,我这里方便操作使用镜像方式

  • ghcr.io/berriai/litellm:main-latest
  • 国内镜像 ccr.ccs.tencentyun.com/k7scn/litellm:main-latest

使用 compose 部署

  • docker-compose.yaml
services:
  litellm:
    image: ccr.ccs.tencentyun.com/k7scn/litellm:main-latest
    container_name: litellm
    command: --config /app/config.yaml --detailed_debug
    environment:
      - OPENAI_API_KEY=sk-PpJVj1N7Btoken
      - OPENAI_API_URL=https://api.example.ai
      - LITELLM_MASTER_KEY=sk-nb666
    volumes:
      - '/data/litellm/config.yaml:/app/config.yaml'
    ports:
      - '4000:4000'
    restart: always

本文示例使用的是某中转 claude 服务商

  • /data/litellm/config.yaml
litellm_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

model_list:
  # Responses API models
  - model_name: claude-sonnet-4-20250514
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/OPENAI_API_KEY
      api_base: os.environ/OPENAI_API_URL
      cache_control_injection_points:
        - location: message
          role: system

启动完成后,在环境里配置

export ANTHROPIC_BASE_URL=http://127.0.0.1:4000
export ANTHROPIC_AUTH_TOKEN=sk-nb666
claude --model claude-sonnet-4-20250514
# 或者在claude里使用/model设置

一分钱一分货,真是贵的可怕。

后续高级玩法

  • 多模型协同:通过 LiteLLM 的路由功能,为不同任务分配不同模型。例如:
  • 代码生成:Claude-3-5-Sonnet
  • 语法检查:GPT-4o-mini
  • 复杂架构分析:Gemini-1.5-Pro

在配置文件中添加更多模型和提供商

总结

通过 LiteLLM 自建 Claude Code 中转服务,你不仅能绕过地域和账号限制,还能灵活调用多种模型,兼顾性能与 成本。这种方式特别适合国内开发者,既省钱又高效!无论你是想快速生成代码、优化开发流程,还是探索 AI 编程的更多可能,这套方案都能让你事半功倍。

其他

本文主要参考两个文档

  •  

安利神器:Claude Code Router

2025年8月3日 21:43

在如今的 AI 开发浪潮中,编码辅助工具层出不穷,但能真正提升效率、灵活适配多种模型的却不多。今天,我要给大家强烈安利一个开源项目——Claude Code Router!这个基于 Claude Code 开发的智能路由器*,不仅能让你更灵活地使用 AI 编码能力,还能无缝切换多种模型,堪称开发者的小助手

主要是体验国内大模型不是

什么是 Claude Code Router

Claude Code Router(后续简称 CCR)是一个开源项目,基于 Anthropic 的 Claude Code 打造,旨在为开发者提供一个灵活的编码基础设施。它就像一个智能路由器,可以将你的编码请求分发到不同的 AI 模型(如 DeepSeek、Ollama 等),并支持高度自定义的配置,让你根据任务需求选择最合适的模型。简单来说,CCR 让你在享受 Claude Code 强大编码能力的同时,还能灵活适配其他模型,省时省力又省钱

一句话总结:CCR 是一个让开发者自由掌控 AI 编码能力的超级工具, 你的省钱小能手

为什么需要 Claude Code Router

灵活的模型切换,打破 API 限制

我们都知道,Anthropic 的 Claude 系列模型在编码任务上表现优异,但它的 API 有时会受到限制,比如封号风险或高昂的 Token 费用。CCR 通过启动一个本地服务,将 Claude Code 的 API 请求转发到任何支持 OpenAI 格式的 API 接口,完美规避了这些问题。你可以用 DeepSeek、Gemini 等其他模型的 API 来驱动 Claude Code,灵活又高效!

高度自定义,适配多样化需求

CCR 支持通过 Providers 数组和 Transformer 机制自定义模型和 API 交互方式。你可以为不同模型设置全局或特定的转换器(Transformer),确保请求和响应的兼容性。比如,AnthropicTransformer 可以实现 Claude 与 OpenAI 格式的双向转换,而 GeminiTransformer 则处理 Gemini 与 OpenAI 格式的转换。这种"混搭"能力让多个模型无缝协作,简直是国内开发者的福音

自动化任务,节省成本

CCR 支持通过 GitHub Actions 实现自动化任务。例如,你可以在非高峰时段运行编码任务,降低 API 调用成本。它的配置简单,配合 GitHub Actions 可以轻松实现触发式自动化,比如当 Issue 评论中包含 @claude 时自动启动编码任务。省时又省钱,效率拉满!

开源免费

CCR 是完全开源的,托管在 GitHub,你可以自由下载、修改和贡献代码

项目地址: musistudio/claude-code-router

核心功能

  • 多模型支持
  • Transformer 机制, 核心功能。它能将不同模型的请求和响应统一到 OpenAI 格式,确保兼容性。
  • 支持本地化
  • Tool Mode,智能任务处理。借鉴了 Claude Code 的 Plan Mode,CCR 为 DeepSeek 等模型实现了 Tool Mode。当启用时,模型会主动选择最合适的工具来完成任务,极大提升编码效, 具体可以参考 Tool Mode

快速上手

  • 本地运行(个人推荐)
  • docker 部署(任意地方)

本地运行

本文示例对接魔搭的 qwen3 最新模型。

环境要求

安装依赖:确保 Node.js 版本 ≥18.0.0,使用 bun 或 npm 安装所需包

安装

  1. 安装 Claude Code
npm install -g @anthropic-ai/claude-code
  1. 安装 CCR
npm install -g @musistudio/claude-code-router

配置

默认配置文件 ~/.claude-code-router/config.json

{
  "LOG": true,
  "CLAUDE_PATH": "",
  "HOST": "127.0.0.1",
  "PORT": 3456,
  "APIKEY": "",
  "API_TIMEOUT_MS": "600000",
  "transformers": [],
  "Providers": [
    {
      "name": "modelscope",
      "api_base_url": "https://api-inference.modelscope.cn/v1/chat/completions",
      "api_key": "不要ms-的token",
      "models": [
        "Qwen/Qwen3-Coder-480B-A35B-Instruct"
      ],
      "transformer": {
        "use": [
          [
            "maxtoken",
            {
              "max_tokens": 65536
            }
          ]
        ]
      }
    }
  ],
  "Router": {
    "default": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "background": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "think": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContext": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContextThreshold": 60000,
    "webSearch": ""
  }
}

启动

ccr code

容器版部署(非编译版)

容器部署可以从源码编译,也可以像本地一样 npm 安装

  • Dockerfile
FROM node:lts
WORKDIR /app
RUN npm install -g @musistudio/claude-code-router
CMD ["ccr","start"]

基于上面的构建出一个镜像

  • docker-compose.yaml
version: "3.8"

services:
  ccr:
    build: .
    container_name: ccr
    ports:
      - "3456:3456"
    volumes:
      - ./:/root/.claude-code-router
    restart: unless-stopped

配置 config.json 区别, 仅列出调整的

"APIKEY": "xxxxxx", // 必须要有
"HOST": "0.0.0.0", // 以及这里

在本地的配置~/.claude/settings.json,和配置 Claude Code 一样

{
    "env": {
        "ANTHROPIC_BASE_URL": "https://xxxxxxx",
        "ANTHROPIC_AUTH_TOKEN": "123"
    }
}

然后 claude 开始你的编码

总结

潜力已经显而易见, 未来可期哈哈。如果正在为 Claude 的高成本和限制头疼,国内开发者还是值得试一试,当然如果能直接用 Claude Code,还是推荐用 Claude Code

  •  

解锁知识管理新体验:安利 AI 驱动的 Wiki 知识库 PandaWiki

2025年7月29日 22:35

解锁知识管理新体验:安利 AI 驱动的 Wiki 知识库 PandaWiki

在信息爆炸的时代,如何高效地整理、存储和利用知识成为了企业和个人的共同需求。传统的 Wiki 系统虽然功能强大,但在智能化和易用性上往往稍显不足。今天,我要向大家强烈安利一款由 AI 大模型驱动的开源知识库搭建系统 PandaWiki,它不仅继承了传统 Wiki 的文档管理能力,还通过 AI 的加持,为用户带来了前所未有的智能体验。

什么是 PandaWiki?

PandaWiki 是一款由长亭科技开发的开源知识库系统,融合了强大的 AI 大模型能力,旨在帮助用户快速构建智能化的产品文档技术文档FAQ、博客系统等。它不仅能满足企业级的知识管理需求,还适合个人用户打造个性化的知识库。简单来说,PandaWiki 是一个兼具传统 Wiki 功能和 AI 智能化的下一代知识管理工具。

通过 AI 驱动,PandaWiki 提供了 AI 辅助创作AI 智能问答AI 语义搜索等核心功能,让知识的创建、查询和共享变得更加高效和便捷。无论是企业用于构建产品手册、帮助中心,还是个人用于记录学习笔记、整理生活经验,PandaWiki 都能轻松胜任。

PandaWiki 的核心亮点

AI 驱动的智能化体验

PandaWiki 的最大特色在于其深度集成了 AI 大模型能力,为用户提供了以下智能功能:

  • AI 智能问答:基于知识库中的内容,用户可以通过自然语言提问,系统能够快速理解并返回精准答案。想象一下,客户或团队成员无需翻阅冗长的文档,只需一句提问就能获得所需信息!

智能问答

  • AI 语义搜索:传统的关键字搜索常常不够智能,而 PandaWiki 的语义搜索能够理解用户意图,检索出最相关的文档或答案,极大提升信息查找效率。

AI 语义搜索

  • AI 辅助创作:无需从零开始编写文档,AI 可以根据你的需求生成初稿或优化内容,大幅提升创作效率。无论是技术文档还是博客文章,PandaWiki 都能帮你快速产出高质量内容(目前开源版创作这里体现不是很明显, 写完本文发现了,没有凸显出来 😂)

AI 辅助创作

这些 AI 功能依赖于接入的 Chat 模型、Embedding 模型和 Reranker 模型

  • Chat 模型:又称为对话模型, 常见的 chatGPT4、Deepseek-r1、Deepseek-v3 等可以聊天的模型都属于 Chat 模型
  • Embedding 模型:又称为嵌入模型,可以将文档转化为向量,为 PandaWiki 提供了智能搜索和内容关联的能力
  • Reranker 模型:又称为重排模型,通过对初始结果进行二次排序,实现快速召回 + 精准排序,是提升检索系统质量的关键技术

强大的富文本编辑能力

这个是基本功能吧,目前导出的格式支持有限,如果支持 PDF 导出就更好了。

PandaWiki 支持 Markdown 和 HTML 两种格式的富文本编辑,满足不同用户的使用习惯。你可以轻松创建结构清晰、格式美观的文档,并支持将文档导出为 HTML 或 Markdown 两种格式,方便分享和存档。无论是撰写复杂的技术文档还是简单的笔记,PandaWiki 都能提供流畅的编辑体验。

灵活的第三方集成

PandaWiki 的设计非常注重开放性和兼容性。它支持与多种第三方应用无缝集成,例如:

  • 网页挂件:可以将 PandaWiki 嵌入其他网站,方便用户在不同平台访问知识库。
  • 聊天机器人:支持集成到钉钉、飞书、企业微信等平台,打造智能化的问答机器人,助力企业提升客户服务效率

这种灵活性让 PandaWiki 能够轻松融入现有的工作流,适配各种使用场景。 只不过暂时还不支持问答机器人 API

多样化的内容导入方式

PandaWiki 支持从多种来源导入内容,极大简化了知识库的搭建过程。你可以通过以下方式快速填充知识库:

  • 网页 URL 导入:直接抓取网页内容,快速生成文档
  • Sitemap 导入:从网站站点地图批量导入内容
  • RSS 订阅:自动获取订阅源的最新内容
  • 离线文件导入:支持上传本地文件,轻松整合现有文档
  • 飞书文档
  • Confluence 文档

导入方式

更多细节可以参考官方文档 导入现有文档到 PandaWiki

简单高效的部署体验

实测 1c1g 也可以轻松部署

PandaWiki 的安装过程非常友好,只需一台支持 Docker 20.x 以上版本的 Linux 系统,就能通过一键安装脚本快速部署。安装完成后,系统会自动输出管理面板的登录方式,默认账号密码随机生成,确保安全性。整个过程仅需几分钟,即使是技术小白也能轻松上手。

使用场景:从企业到个人,PandaWiki 无所不能

PandaWiki 的应用场景非常广泛,以下是一些典型用法:

  • 企业产品文档管理:快速创建产品手册、技术规格、用户指南,结合 AI 问答功能提升客户支持效率。
  • 智能 FAQ 系统:整理常见问题,客户通过自然语言提问即可获得答案,减轻客服压力。
  • 团队知识共享平台:团队成员可以记录项目经验、技术笔记,形成知识库,促进团队协作。
  • 个人知识管理:记录学习笔记、工作心得、生活经验,打造专属的智能化知识库。

一个有趣的例子是,开发者曾用 PandaWiki 创建了一个名为“PandaWiki 品三国”的知识库,将《三国演义》小说导入后,系统能够基于小说内容回答相关问题,展现了其强大的智能化能力。

为什么选择 PandaWiki?

相比传统的 Wiki 系统(如 Confluence 等),PandaWiki 在以下方面具有明显优势:

  • 智能化:AI 驱动的创作、问答和搜索功能,极大提升效率。
  • 易用性:一键安装、简单配置,技术门槛低。
  • 灵活性:支持多知识库管理、多种内容导入方式和第三方集成。
  • 开源免费

项目地址

https://github.com/chaitin/PandaWiki

如何快速上手 PandaWiki?

搭建一个智能化的 PandaWiki 知识库只需三步:

  1. ssh 到目标机器
  2. 执行安装脚本
  3. 选择动作类型安装
bash -c "$(curl -fsSLk https://release.baizhi.cloud/panda-wiki/manager.sh)"

安装完成后,根据提示访问对应的 URL 进入管理面板。
如果你是内网环境,使用内网地址; 使用腾讯云等云服务商,使用公网地址(记得防火墙放行对应端口)

登录完成后安装引导操作即可。

使用过程中的注意事项

所有改动操作都不要保存

  1. 只需要配置 Chat 模型即可测试,根据自己实际情况填写,我这里是第三方中转商

配置通用格式

  1. 内网测试域名, 影响 web 挂件生成

sslip

  1. 配置 web 挂件

配置挂件

  1. 效果

配置挂件

不足之处

  • 图片、附件支持效果不太好
  • 部分导入方式失败率较高
  • 仅支持单知识库
  • 没法查看或者回滚历史版本
  • 不知道为啥我测试老是遇到未发布情况,都没编辑

未发布

写在最后

PandaWiki 是一款真正将 AI 技术与知识管理结合的创新工具,它不仅功能强大、简单易用,还完全开源,适合各种规模的团队和个人用户。如果你正在寻找一款能够提升知识管理效率的工具,或者想体验 AI 驱动的智能文档系统,PandaWiki 绝对值得一试!

  •  
❌