2026-01-13 14:00:00
前些天在 macOS 上启动 Strapi,发现它依赖特定的 Node.js TLS 版本,之前电脑 node 使用 Brew 安装,切换起来也不是太方便,遂尝试了解前端版本管理工具。
发现 Volta(管理 Node 版本) + Corepack(管理依赖安装工具的版本)正式我要找的,笔记记录如下:
使用 Brew 安装 Volta
$ brew install volta
安装不同版本的 Node
# 安装 Node.js 22 版本
$ volta install node@22
# 安装 Node.js 24 版本
$ volta install node@24
安装 Tools
# 作为演示,暂时先安装,后文有更适合的安装方式
$ volta install pnpm
查看已经安装的工具
$ volta list
输出默认版本

查看已安装的全部 Node 版本
$ volta list node
可以看到多个 Node 版本

设置全局默认 Node 版本 & 设置项目固定的版本
$ volta install node@24 --default
# 在前端项目根目录下执行,需要有 package.json 否则报错
$ volta pin node@22
Pin 之后,Volta 会根据项目自动切换 Node 版本!
另外,可临时指定 Node 版本运行脚本
$ echo "console.log('node version:', process.version)" > app.js
$ volta run --node 22 node app.js
node version: v22.21.1
$ volta run --node 24 node app.js
node version: v24.12.0
卸载 Node 版本
$ volta uninstall node@22 # 卸载特定版本
查看当前使用的 node 路径
$ volta which node
/Users/dongdong/.volta/tools/image/node/24.12.0/bin/node
volta 常用的命令如上,我使用它切换、锁定 Node 版本,很方便!
在项目中,除了锁 Node 版本,对应的依赖工具的版本也推荐锁定,因为 volta 无法锁定 pnpm 的版本,所以使用另外的工具
这个 corepack 我是刚听说的工具,它在 Node 16.9 版本中引入,安装了 Node.js 就有。
GPT: Corepack 是 Node 官方内置的工具,用于管理和锁定包管理器(如 pnpm、yarn)的版本,确保项目使用固定的包管理器而不依赖全局安装。
# 卸载 pnpm(之前是由 volta 安装的,无法切换锁定)
$ volta uninstall pnpm
# 安装(使用 volta 统一管理)
$ volta install corepack
success: installed [email protected] with executables: corepack, pnpm, pnpx, yarn, yarnpkg
启用 Corepack
# 查看版本
$ corepack -v
0.34.5
$ corepack enable
使用 Corepack 安装 pnpm(准备并激活)
$ corepack prepare [email protected] --activate
(或者)在启用 Corepack 后,直接运行 pnpm 命令也会触发其安装提醒

安装后会打印 pnpm 版本
$ pnpm -v
10.28.0
如果项目中已经有 package.json 文件,可以执行命令设置 pnpm 的版本值,需要三位准确版本号
$ pnpm pkg set [email protected]
执行后会写入 packageManager 字段声明 pnpm 版本,示例 JSON 如下:
{
"name": "volta-test",
"private": true,
"version": "0.1.0",
"scripts": {
"dev": "node index.js"
},
"volta": {
"node": "22.21.1"
},
"packageManager": "[email protected]"
}
补充说明:Corepack 并非只能管理 pnpm,Yarn、Npm 包管理器也都支持,非常适合多项目的管理。
至此,项目中 Volta 锁 Node,Corepack 锁 pnpm,他们的关系如下:
Volta
├─ node
└─ corepack
└─ [email protected](按项目)
GPT:Volta 是 Node 与工具版本管理的核心,Corepack 是包管理器版本管理的核心,两者结合后可以实现项目级、团队级、跨机器环境一致性。
2026-01-07 18:37:16
懒得折腾。但还是部署了,因为足够简单、轻量。

找一台 Linux 机器安装 Beszel 服务
mkdir -p /opt/service/beszel/ && cd /opt/service/beszel/
编辑
vim /opt/service/beszel/docker-compose.yml
配置内容
配置通常可以直接使用,不用管配置中的 <令牌> 和 <密钥> 值,稍后启动服务后,通过 Console 页面可以获取到 Agent 的 KEY 和 Token
services:
beszel:
image: henrygd/beszel:latest
container_name: beszel
restart: unless-stopped
ports:
- 8090:8090
volumes:
- ./beszel_data:/beszel_data
- ./beszel_socket:/beszel_socket
beszel-agent:
image: henrygd/beszel-agent:latest
container_name: beszel-agent
restart: unless-stopped
network_mode: host
volumes:
- ./beszel_agent_data:/var/lib/beszel-agent
- ./beszel_socket:/beszel_socket
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
LISTEN: /beszel_socket/beszel.sock
HUB_URL: http://localhost:8090
TOKEN: "<令牌>"
KEY: "<密钥>"
启动
docker compose up -d
稍等下请求本地端口
$ curl -I http://localhost:8090
预期打印
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
Date: Wed, 07 Jan 2026 10:03:22 GMT
Content-Length: 761
以往一直使用 Nginx,这还是第一次使用 Caddy,为了 Auto HTTPS 特性。
安装文档:https://caddyserver.com/docs/install
编辑配置文件
vim /etc/caddy/Caddyfile
# 格式化
caddy fmt --overwrite /etc/caddy/Caddyfile
配置内容
beszel.yasking.org {
reverse_proxy 127.0.0.1:8090
}
校验
sudo caddy validate --config /etc/caddy/Caddyfile
# 重载
sudo systemctl reload caddy
# 查看状态
sudo systemctl status caddy
将域名地址指向服务器 IP,给 DNS 解析生效留点儿时间
而后在服务器上请求验证
curl -I -L --header "Host: beszel.yasking.org" http://localhost
预期输出
HTTP/1.1 308 Permanent Redirect
Connection: close
Location: https://beszel.yasking.org/
Server: Caddy
Date: Wed, 07 Jan 2026 10:09:33 GMT
HTTP/2 200
alt-svc: h3=":443"; ma=2592000
content-type: text/html; charset=utf-8
date: Wed, 07 Jan 2026 10:09:33 GMT
vary: Origin
via: 1.1 Caddy
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
content-length: 761
此时部署完成,可以访问:https://beszel.yasking.org/
你要监控哪个服务器,就在哪个机器上安装 Agent
添加本机
在部署 Beszel 服务的时候已经同时启动了 Beszel Agent,只是最初的 YAML 配置中 TOKEN 和 KEY 没有设置。
在 Console 上点击「添加客户端」,填入机器名称、主机填写
名称:(自定义名称)
主机:/beszel_socket/beszel.sock(不要修改)

保存后重启服务
$ docker compose up -d
添加其它服务器
也还是点击「添加客户端」
名称:(自定义名称)
主机:11.22.33.44(要监控指标的服务器 IP)
复制 Compose 文件或者 Docker run 命令到要监控指标的服务器上执行。

页面美观,部署简单、Golang 开发的也足够轻量。
首页

详情

移动端兼容良好

另外还支持 Webhook 推送告警信息,我暂时不需要就没继续设置了。
2026-01-06 14:18:59
前两天刷 V2EX 看到站长推荐「Claude Code in Action」教程,收藏了还没看,刚发现有网友翻译整理了中文版:
官方教程地址:https://anthropic.skilljar.com/claude-code-in-action
中文翻译地址:https://cholf5.com/claude-code-in-action/index.html
Github 仓库:https://github.com/cholf5/claude-code-in-action

2025-12-31 19:30:00
想了想,还是记录一下。
今年下半年重拾了阅读习惯,准确的说是从八月份开始,利用碎片化的时间在微信读书上阅读,也看了一些纸质书,平均每天不到一小时。
微信读书上领取体验卡,攒够 60 张 + 6 元可以兑换 30 天的会员(最近我发现如果 30 天会员每天都读书,30 天刚好能攒够 60 张体验卡,一年 72 元是微信读书会员最经济的开通方式)
2025 我阅读的书籍目录,其中《丰乳肥臀》、《一个名叫欧维的男人决定去死》、《置身事内》是我很推荐的书籍。
今年初从手写代码转向 AI 辅助编程,使用 Cursor 刚好满一年,Cursor 提供的 2025 年终报告中显示我一年消耗了 1.57B 的 Token(Tab 用的较少),全年新增代码约 15+ 万行(保守统计),而在前两年,每年的编码行数都在 5 万行左右。
看了最近开发的需求,假设一年多前到现在,在编码速度上我没有显著变快的前提下,以下是开发两个需求的统计信息对比:
| 比对项 | 2025 项目 A(AI Assisted) | 2024 项目 B(Manual) | 备注信息 |
|---|---|---|---|
| 开发时长 | 7d | 23d | 借助 AI 显著压缩了开发时间。 |
| 新增行数 | 11,240 | 6,335 | 这两个需求难度差异不大,代码量差异主要跟需求大小有关。 |
| 删除行数 | 2,869 | 83 | 项目 A 新增模块的同时重构了旧有模块 |
| 日均净新增 | ≈1,196 | ≈272 | 单位时间产出显著提升。 |
| 日均变动量 | ≈2,015 | ≈279 | “吞吐量” 约 7.2× 提升。 |
| 代码重构率 | ≈25.5% | ≈1.3% | 使用 AI 开发 “持续重构” 的主观意愿更强。 |
近一年时间使用 AI 编程最大的感受是模型的能力越来越强,开发者可以越来越 “省力”,手不酸了,等 AI 写代码期间可以冲杯咖啡歇息下。
但 “省力” 不等于 “不费脑”,根据 “Garbage in, garbage out” 原理,代码的质量上限完全取决于使用的人,对使用者的工程化实践和软件架构能力会有更高的要求,编程的核心进一步从 “编” 代码偏向于架构设计,AI 并没有让编程更 “简单”,而是让 “会不会做工程” 这件事更赤裸。
以往在博客主要是技术笔记,今年陆续增加了“阅读”、“生活”、“生活技巧” 类别,很多时候适当的记录也有助于思考,技术如此,生活亦是如此,写博客也保持了一定的克制,避免博客内容过于零散、碎片化。
博客的样式在不改变主题的情况下,借助 AI 对样式进行了调优,这在以前对于后端工程师来说是很困难的。
写了一个 Obsidian 插件用于导出文章,这样博文中添加图像与发布能在一定程度上自动化,方便很多。
年末各家都出了年度报告,想了下自己就微信读书、B 站、QQ 音乐用的多。
在哔哩哔哩天均半小时,主要看了一些 UP 主自制的熊猫人动画,追一些动漫及纪录片,预计明年会因为读书的等效替代而降低刷视频时间;
中国移动 APP 每个月能领一个月的 QQ 音乐会员(网龄礼),所以今年听歌使用的是 QQ 音乐,2025 年听歌时长 100 小时,年度歌手是 G.E.M 邓紫棋,但是第二名杨瑜婷和第三名程响,对我来说后两者是很陌生的名字,单曲循环最多是《旅人》,出自《凡人修仙传》,这个动漫现在真的是国漫独一档,为了看它我开了 B 站会员。
最近的思考是资源如果不整理,那么只会占用磁盘而没有太多的意义。
近五年的照片,有几百 GB 存储在 OneDrive,另外还有一些分散在电脑、存储卡、移动硬盘、还有百度网盘中,大多处于无序的状态;对于重要的内容,加密后遵循 3-2-1 原则进行备份,文字笔记使用 Obsidian 记录。
这两个月在抽空将图像视频去重、归档,需要备份的资料也在分门别类。将已经有序化的数据存储到一个 4TB 的机械硬盘中(使用带有独立电源的硬盘盒),每个月也将上个月手机产生的图像视频进行备份后从手机删除。
对于在 macOS 上从 OneDrive 网盘下载回来的数据,我先导入到相机的 SD 卡,然后再从 SD 卡通过 Windows 电脑导入到 NTFS 格式的机械硬盘中,这个速度其实有些慢,所以妻子问我在做什么,我总是在导数据,我就说 “在备份照片”,并答应她以后也将她的手机照片备份。
一年中有欢笑、有悲伤,最难过的莫过于 11.27 日,爷爷走了。
突闻噩耗,我手忙脚乱,这是我第一次面对亲人的离世,爷爷今年 79 岁,这两年一直卧床,身体状况越来越差,只能喂流食,过了年的阴历二月就是爷爷八十岁的生日,没人想到在一个寻常的下午,爷爷没了气息,爸爸给我打了电话,妻子陪我回的老家。
想起小时候的关于爷爷的记忆总会心里难受,看他日渐衰残的状态更让人心疼,但也明白爷爷这样每天的生活很遭罪,家人照料也很辛苦,爷爷忘记了所有人,更没办法说话表达,不能抽颗烟,也喝不了他爱的酒。
思绪总在闲暇时上涌,写着写着眼泪又在眼中打转,想起那天,告别仪式我努力想记住爷爷的样子,火化后众人将骨灰埋入坟莹,那天天气晴朗,山上的雪很白,落叶满地,我拾了两叶,就好像能回到那天...
2025-12-26 10:51:59
在网上看到有人推荐 tanaos/tanaos-text-anonymizer-v1 可用于信息脱敏,496 MB 大小很适合本地使用。
一开始我还以为它是大语言模型(LLM),想着用 Ollama 拉起来跑,之后发现完全不是一回事。它本质上是一个用于 NER(命名实体识别)任务的模型。
用人话说就是:输入一段文本,模型会扫描其中的实体,并返回命中的内容和对应的标签。
PERSON John Smith
EMAIL [email protected]
PHONE_NUMBER +1-202-555-0199
LOCATION New York
测试后感觉英文人名和地址识别还不错,不支持中文,另外想要识别数据库链接、AK/SK 等敏感信息也还是需要搭配正则表达式使用,之前我把它理解成了 “万能脱敏器”。🤷
Python3 的示例代码在:Gist
2025-12-19 14:41:59
查询 Google 账号的注册时间:
我的 Google 账号注册时间是 2015-01-24,一个寻常的午后。