普通视图

告别屎山代码!我如何用code-simplifier + code-review将代码审查效率提升200%

2026年1月12日 23:34

由豆包生成

每天面对大量 AI 产生的可能是工作垃圾的代码,评审则占据了我大量时间。不仅要检查功能是否正确,还要纠结代码风格、可读性、可维护性...直到上周五看到 ClaudeCode 开源代码优化插件。今天分享一下我最近 3 天的使用体验,真的效率翻倍了不少(如果能给屎山翻新就好了)!

本文主要介绍这两个插件的本地配置和使用,后续还会介绍如何在代码 PR 评审中使用

code-simplifier: 一键把丑代码变漂亮

先说第一个神器 code-simplifier

这是什么?简单说,就是 Claude Code 官方开源的代码整理插件。它不会改你的代码功能实现,只会把代码整理得清清楚楚、漂漂亮亮。

为什么需要它?

用 AI 写代码的朋友应该都有这个痛点:

  • 对话轮次多了,代码就开始变味
  • 嵌套三层,逻辑一团糟
  • 前后风格不统一,看着就头大

以前 AI 生产 AI 改,改着改着就放弃了手动改。

实际效果

// 优化前
const result = data ? (data.user ? data.user.name : null) : null;
const isActive = status === 'active' || (status === 'pending' && isNewUser) ? true : false;
// 优化后: 
if (!data || !data.user) {
  return null;
}
const result = data.user.name;

const isActive = status === 'active' || 
                 (status === 'pending' && isNewUser);

这是简单示例哈,我遇到的更多的是把你啰哩啰嗦的代码一下精简了,一下子清爽不少,还会清理 AI 生成的垃圾无用注释

而且最厉害的是它会自动遵守你项目的代码规范,你只要在项目根目录放个 CLAUDE.md,写清楚代码风格,它就会照着执行。不用每次都手动告诉 Claude"请严格按照我的规范写"

code-review: 帮你查漏补缺

第二个神器是 code-review

这个插件会自动帮你检查代码问题,就像有个资深同事帮你把关一样:

  • 代码好不好看(可读性)
  • 有没有安全漏洞
  • 性能有没有问题
  • 符不符合团队规范

为什么推荐?

人工审查容易漏,人都会累啊!但 AI 不会:

  • 每次检查维度一致,质量稳定
  • 不会漏掉常见问题
  • 给出具体建议,直接照改就行(现在都不需要手动改了,让他自己查自己改)

以前我审查一个功能,大半小时过去了还累得半死。现在 code-review 帮我扫一遍,我只要看看它标记的问题就行,真的轻松太多

怎么用?三步搞定

本文在最新版本 ClaudeCode 下操作

更新应用市场

启动 ClaudeCode,输入**/plugin**, 按左、右切换 tab,选择 Marketplaces

确定官方应用市场

如果没有的话,直接添加即可 anthropics/claude-plugins-official, 正常情况下都是有官方的。

如果有的话,需要更新插件市场,同步最新插件及版本

更新官方应用市场

安装插件

claude plugin install code-simplifier
claude plugin install code-review

也可以参考如下方式,由于我已经安装了,搜索不出来了

插件安装

完整安装如下:

插件已安装

开始用

一套流程下来是这样的,但是中间可能会经过几轮

AI生成完代码 
  ↓
code-simplifier整理 
  ↓
code-review检查 
  ↓
AI修复问题 
  ↓
AI提交

用了几天,真实感受

质量上去了, 代码也整洁了不少,代码可读性直接拉满(当然有时候会带来理解的难度,语法糖太多)

写在最后

简单总结一下:

  • code-simplifier 整理代码,让丑代码变漂亮
  • code-review 检查代码,帮你查漏补缺

两个配合用,代码审查效率提升 200% 不是吹的! 强烈推荐大家试试

  •  

2025年终不总结

2026年1月2日 13:11

2025 年终不总结

抽着空肝一下年终总结,不知道写些什么,跟前几年没有特别大变化的就不写了,主要写写变化

技术

2025 年,我把大量精力投入在可长期运行的个人与小团队技术基础设施上, 围绕私有化部署,我持续实践并输出,然而只坚持了 2 个月左右。年中开始,AI 成为新的重点方向,也是从 Cursor 换成到 Claude Code 的开始,期间将博客系统升级了一波,2025 年初说的给奶爸提 PR 一直鸽着 😂。

博客

由于 umami 受框架漏洞影响,不得不升级,数据兼容性问题,12 月之前的数据基本都没了。

  • ysicing.me 主站,托管于 Cloudflare 赛博菩萨

  • blog.ysicing.net 国内站,托管于 EO

从谷歌广告分析了一下,还是主站真人多些,人人都是广告屏蔽大师哈哈哈。

折腾

  • 保持着最新版本的依赖,追着最新版本的 k3s,尽可能的保持最新,时刻都在折腾着。
  • 感谢腾讯云的锐驰机器的大力支持,解决了我很多网络问题。
  • 25 年也是一个我参与炒鸡的元年,做起了 #AFF, 小有收获哈哈哈。
  • 截止今天目前有 24 台机器,上传 64T/下载 38T(不太精准大概值)

公众号

公众号 缘生小助手 也成功突破 1000 人关注,希望今年来带来更大的突破。

阅读

在 NotebookLM 支持中文播客之前,我一直都在使用微信读书。今年满打满算只读完了 4 本书,还有 20 多本只是读过部分,这里介绍两本我觉得还很 OK 的书:

  • 以日为鉴:衰退时代生存指南
  • 一转念:用经济学思考

26 年还是打算继续看一些经济学和工程类的书籍,大环境目前还是你懂的,多了解些还是很有必要的。

游戏

今年主要玩了缺氧,玩了 385 局

观影

今年主要以 youtube 为主,大会员到期了,不想给叔叔送钱了

基本都是下饭剧为主,重温了大明王朝 1566

AI 改变工作

23 年度不总结,曾说过 过去一年是比较煎熬的一年,也是 AI 智能觉醒元年,可能也是这未来几年中最好的一年。

经过 10 月份短暂的休息后,11 月开启了新的征程,全力拥抱 AI,截止 1 月 1 日,Token 消耗费用已经超 4000$ 了,大家都比较清楚哈,跨领域的挑战,真实和虚构,刨根问底时,一句您说的对,我确实没阅读您提供的资料

说个不简单的: 用时差不多两个月的时间,重构了几年前的项目,之前是 3 个人的活,现在是 1 个人和 3 个 AI 黑奴的活(Claude、Gemini、Codex), 整整 800 次提交,也算是一场比较完美的答卷了。

其他

在漫长而又短暂的一年中,生活不过多了一些艰难度过的坎坷与波折。

求满几时满,知止方为止

  •  

使用Let's Encrypt 签发的 IP 地址 SSL 证书

2025年12月25日 22:11

由 copilot.microsoft.com 生成
由 copilot.microsoft.com 生成

本文将介绍使用 Caddy 和 acme.sh 配置 Let's Encrypt 为 IP 地址签发 SSL 证书

前提说明

国内大概率个人是用不了的,即使现在没限制。如果你的 IP 已经备案了,那另说。

什么情况下需要

正常没啥需要,如果 1.2.4.8 在我手上那就好了。

  • • 临时测试服务,又不想老大哥时刻看着你
  • • DOH

Caddy

最新版本 2.10 版本是支持的,貌似只支持 ipv4, ipv6 没签发成功

1.2.4.8 {
  tls {
    issuer acme {
      profile shortlived
    }
  }
  respond {remote_host}
}

可以使用我提供的镜像

ghcr.io/ysicing/caddy2:latest
ysicing/caddy2
# 国内
ccr.ccs.tencentyun.com/k7scn/caddy2

如果遇到证书已经生成,但是访问还有有问题,需要在全局配置里添加一下

{
        debug
	# admin off
	default_sni 1.2.4.8
}

acme.sh

使用 acme.sh 需要满足几个条件, 因为 IP 证书目前只支持通过 http-01tls-alpn-01 方式进行验证

  • • 需要使用最新版本 acme.sh
  • • 当前机器是公网机器 80/443 可以被访问
acme.sh --issue -d <ip地址1>  -d <ip地址2> -w <默认网站根目录> --server letsencrypt --certificate-profile shortlived --days 5

Let's Encrypt 的 IP 证书有效期只有 160 小时(差不多 6.5 天),同时 acme.sh 需要更短的时间来进行检查更新证书,所以可以设置 --days 5 参数,让它 5 天检查并更新一次,你也可以设置 3 或 4。

访问

ip 证书
ip 证书

  •  

Tailscale Peer Relay 最新变更解读

2025年12月25日 22:11

使用 chatgpt 生成

在我之前的文章 Tailscale Peer Relay 实战指南,让内网穿透更稳更快中,我介绍了如何通过在 Tailnet 内配置一台网络条件良好的设备作为中继,来优化内网穿透体验。最近 Tailscale 官方对 Peer Relay 做出了重要更新,尤其是 新增支持 Static Endpoints,这是一次值得关注的变化。


核心更新一览

  1. 新增 Static Endpoints

    • 过去:Peer Relay 只能依赖 Tailnet 内的某个设备作为中继,设备必须在线。
    • 现在:支持配置 固定的中继地址(Static Endpoint),例如云服务器或数据中心节点。
    • 意义:让 Peer Relay 从“临时设备中继”升级为“可控的固定中继”,更稳定、更适合企业和高吞吐场景。
  2. 官方定位调整

    • 旧理解:Peer Relay 可以替代 DERP。
    • 新定位:Peer Relay 是 DERP 的补充,在直连失败时优先尝试,如果不可用仍会回退到 DERP。
    • 这意味着 DERP 依旧是兜底方案,而 Peer Relay 更像是加速器。
  3. 权限与安全控制

    • 官方强调避免过度宽泛的 ACL 配置(如 src: *),否则可能导致所有设备都走中继,增加延迟。
    • 最佳实践:只针对受限环境或特定标签设备开放 Peer Relay/Static Endpoint。
  4. 配置与验证方式

    • 启用命令保持一致:

      tailscale set --relay-server-port=40000
      
    • ACL 中新增写法:

      {
        "grants": [
          {
            "src": ["tag:restricted-devices"],
            "dst": ["static:relay.example.com:40000"],
            "app": { "tailscale.com/cap/relay": [] }
          }
        ]
      }
      
    • 验证方式:除了 tailscale ping,还可以用

      tailscale status | grep peer-relay
      

      来确认连接是否走中继。

  5. 典型应用场景

    • 大文件传输:提升吞吐,避免 DERP 带宽瓶颈。
    • 媒体流播放:高清视频/音频流更流畅。
    • 区域优化:在不同地理位置部署静态中继,降低跨区延迟。
  6. 禁用

tailscale set --relay-server-port=""

总结

这次更新的最大亮点就是 Static Endpoints 的支持,让 Peer Relay 从“设备中继”走向“固定中继”,更适合企业和高吞吐场景。同时,官方也明确了 Peer Relay 的定位——它是 DERP 的补充,而不是替代。

如果你之前已经部署过 Peer Relay,现在可以考虑在云端或数据中心配置一个 Static Endpoint,让整个 Tailnet 的中继更加稳定和可控。

  •  

使用Let's Encrypt 签发的 IP 地址 SSL 证书

2025年12月18日 21:20

由 copilot.microsoft.com 生成
由 copilot.microsoft.com 生成

本文将介绍使用 Caddy 和 acme.sh 配置 Let's Encrypt 为 IP 地址签发 SSL 证书

前提说明

国内大概率个人是用不了的,即使现在没限制。如果你的 IP 已经备案了,那另说。

什么情况下需要

正常没啥需要,如果 1.2.4.8 在我手上那就好了。

  • • 临时测试服务,又不想老大哥时刻看着你
  • • DOH

Caddy

最新版本 2.10 版本是支持的,貌似只支持 ipv4, ipv6 没签发成功

1.2.4.8 {
  tls {
    issuer acme {
      profile shortlived
    }
  }
  respond {remote_host}
}

可以使用我提供的镜像

ghcr.io/ysicing/caddy2:latest
ysicing/caddy2
# 国内
ccr.ccs.tencentyun.com/k7scn/caddy2

如果遇到证书已经生成,但是访问还有有问题,需要在全局配置里添加一下

{
        debug
	# admin off
	default_sni 1.2.4.8
}

acme.sh

使用 acme.sh 需要满足几个条件, 因为 IP 证书目前只支持通过 http-01tls-alpn-01 方式进行验证

  • • 需要使用最新版本 acme.sh
  • • 当前机器是公网机器 80/443 可以被访问
acme.sh --issue -d <ip地址1>  -d <ip地址2> -w <默认网站根目录> --server letsencrypt --certificate-profile shortlived --days 5

Let's Encrypt 的 IP 证书有效期只有 160 小时(差不多 6.5 天),同时 acme.sh 需要更短的时间来进行检查更新证书,所以可以设置 --days 5 参数,让它 5 天检查并更新一次,你也可以设置 3 或 4。

访问

ip 证书
ip 证书

  •  

使用Let's Encrypt 签发的 IP 地址 SSL 证书

2025年12月17日 22:40

由 copilot.microsoft.com 生成
由 copilot.microsoft.com 生成

本文将介绍使用 Caddy 和 acme.sh 配置 Let's Encrypt 为 IP 地址签发 SSL 证书

前提说明

国内大概率个人是用不了的,即使现在没限制。如果你的 IP 已经备案了,那另说。

什么情况下需要

正常没啥需要,如果 1.2.4.8 在我手上那就好了。

  • • 临时测试服务,又不想老大哥时刻看着你
  • • DOH

Caddy

最新版本 2.10 版本是支持的,貌似只支持 ipv4, ipv6 没签发成功

1.2.4.8 {
  tls {
    issuer acme {
      profile shortlived
    }
  }
  respond {remote_host}
}

可以使用我提供的镜像

ghcr.io/ysicing/caddy2:latest
ysicing/caddy2
# 国内
ccr.ccs.tencentyun.com/k7scn/caddy2

acme.sh

使用 acme.sh 需要满足几个条件, 因为 IP 证书目前只支持通过 http-01tls-alpn-01 方式进行验证

  • • 需要使用最新版本 acme.sh
  • • 当前机器是公网机器 80/443 可以被访问
acme.sh --issue -d <ip地址1>  -d <ip地址2> -w <默认网站根目录> --server letsencrypt --certificate-profile shortlived --days 5

Let's Encrypt 的 IP 证书有效期只有 160 小时(差不多 6.5 天),同时 acme.sh 需要更短的时间来进行检查更新证书,所以可以设置 --days 5 参数,让它 5 天检查并更新一次,你也可以设置 3 或 4。

访问

ip 证书
ip 证书

  •  

MinIO迁移RustFS实战指南一

2025年12月14日 21:36

由 copilot.microsoft.com 生成

作为资深 MinIO 用户,经历过 MinIO 一系列操作,从砍掉网关模式,砍掉控制台,到维护模式。老实说,我个人认为这类开源产品很难实现商业化。这种不断收缩能力边界的变化,对使用者来说影响是实实在在的。并不是功能不好,而是你已经把它当作基础设施依赖了,却发现它的产品路线在变, 这也是我开始认真考虑 MinIO 之外的选择的直接原因

项目地址

为啥选择 RustFS,经过大量讨论与实践,RustFS 逐渐成为那个改动最小、适配最易的首选替代品,深度兼容 MinIO 的 API 与架构。

快速部署

本次主要迁移了一个大盘鸡备份 MinIO, 方便操作直接使用 compose 部署

services:
  minio:
    image: ccr.ccs.tencentyun.com/k7scn/minio:2025
    container_name: minio
    restart: always
    environment:
      - MINIO_ROOT_USER=Fah0quaixei0
      - MINIO_ROOT_PASSWORD=wi0iez3gaaZoghohCai5zeedeenatooxunoh8AhwangeiPho8Obahja
      - MINIO_DEFAULT_BUCKETS=backup
    ports:
      - '100.90.80.15:9000:9000'
      - '100.90.80.15:9001:9001'
    volumes:
      - '/data/minio:/bitnami/minio/data'

  rustfs:
    image: ccr.ccs.tencentyun.com/k7scn/rustfs:latest
    container_name: rustfs
    restart: always
    environment:
      - RUSTFS_ACCESS_KEY=Fah0quaixei0
      - RUSTFS_SECRET_KEY=wi0iez3gaaZoghohCai5zeedeenatooxunoh8AhwangeiPho8Obahja
    ports:
      - '192.168.94.15:9000:9000'
      - '192.168.94.15:9001:9001'
    volumes:
      - '/data/rustfs/data:/data'
      - '/data/rustfs/logs:/logs'

注意 RustFS 的日志目录,不确定官方文档和示例有冲突(/logs 或者 /app/logs), 其实影响不大。

docker compose up -d
chown -R 10001:10001 /data/rustfs/data /data/rustfs/logs
docker compose down -v
docker compose up -d

其他的都和 MinIO 没啥区别,登录控制台创建 Bucket

可以直接使用 MC 操作

mc alias set rustfs http://192.168.94.15:9000 Fah0quaixei0 wi0iez3gaaZoghohCai5zeedeenatooxunoh8AhwangeiPho8Obahja

测试直接使用 restic 测试

export RESTIC_REPOSITORY=s3:http://192.168.94.15:9000/backup/test
export AWS_ACCESS_KEY_ID=Fah0quaixei0
export AWS_SECRET_ACCESS_KEY=wi0iez3gaaZoghohCai5zeedeenatooxunoh8AhwangeiPho8Obahja
export RESTIC_PASSWORD=eexeeWie1ri

直接备份测试

restic init
restic backup /data/mariadb --tag mariadb

repository 7d5b008d opened (version 2, compression level auto)
found 2 old cache directories in /root/.cache/restic, run `restic cache --cleanup` to remove them
no parent snapshot found, will read all files
[0:01] 100.00%  1 / 1 index files loaded

Files:         205 new,     0 changed,     0 unmodified
Dirs:            8 new,     0 changed,     0 unmodified
Added to the repository: 10.385 MiB (730.814 KiB stored)

processed 205 files, 124.408 MiB in 0:10
snapshot fed84173 saved

从目前来看没啥问题,可以先跑一段时间再看看。也可以使用 mc mirror 等工具将存量数据从 MinIO 迁移至 RustFS

最后

开源的魅力,就是你永远有选择的余地。

  •  

Tailscale Peer Relay 最新变更解读

2025年12月11日 22:50

使用 chatgpt 生成

在我之前的文章 Tailscale Peer Relay 实战指南,让内网穿透更稳更快中,我介绍了如何通过在 Tailnet 内配置一台网络条件良好的设备作为中继,来优化内网穿透体验。最近 Tailscale 官方对 Peer Relay 做出了重要更新,尤其是 新增支持 Static Endpoints,这是一次值得关注的变化。


核心更新一览

  1. 新增 Static Endpoints

    • 过去:Peer Relay 只能依赖 Tailnet 内的某个设备作为中继,设备必须在线。
    • 现在:支持配置 固定的中继地址(Static Endpoint),例如云服务器或数据中心节点。
    • 意义:让 Peer Relay 从“临时设备中继”升级为“可控的固定中继”,更稳定、更适合企业和高吞吐场景。
  2. 官方定位调整

    • 旧理解:Peer Relay 可以替代 DERP。
    • 新定位:Peer Relay 是 DERP 的补充,在直连失败时优先尝试,如果不可用仍会回退到 DERP。
    • 这意味着 DERP 依旧是兜底方案,而 Peer Relay 更像是加速器。
  3. 权限与安全控制

    • 官方强调避免过度宽泛的 ACL 配置(如 src: *),否则可能导致所有设备都走中继,增加延迟。
    • 最佳实践:只针对受限环境或特定标签设备开放 Peer Relay/Static Endpoint。
  4. 配置与验证方式

    • 启用命令保持一致:

      tailscale set --relay-server-port=40000
      
    • ACL 中新增写法:

      {
        "grants": [
          {
            "src": ["tag:restricted-devices"],
            "dst": ["static:relay.example.com:40000"],
            "app": { "tailscale.com/cap/relay": [] }
          }
        ]
      }
      
    • 验证方式:除了 tailscale ping,还可以用

      tailscale status | grep peer-relay
      

      来确认连接是否走中继。

  5. 典型应用场景

    • 大文件传输:提升吞吐,避免 DERP 带宽瓶颈。
    • 媒体流播放:高清视频/音频流更流畅。
    • 区域优化:在不同地理位置部署静态中继,降低跨区延迟。
  6. 禁用

tailscale set --relay-server-port=""

总结

这次更新的最大亮点就是 Static Endpoints 的支持,让 Peer Relay 从“设备中继”走向“固定中继”,更适合企业和高吞吐场景。同时,官方也明确了 Peer Relay 的定位——它是 DERP 的补充,而不是替代。

如果你之前已经部署过 Peer Relay,现在可以考虑在云端或数据中心配置一个 Static Endpoint,让整个 Tailnet 的中继更加稳定和可控。

  •  

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的任务
  •  
❌