2025-12-06 01:17:27

最近 Next.js 官方发布了 CVE-2025-66478 安全公告(详情可见官方链接)。由于 Umami 采用 Next.js 构建,因此同样受到本次漏洞影响
好消息是:Umami 官方已经发布新版本修复漏洞
同时需要注意:Umami 从 v3 起彻底移除 MySQL 支持,统一切换为 PostgreSQL
如果你仍在使用 MySQL 版本,强烈建议你尽快升级并迁移数据,避免暴露在风险中
我已经同步好了官方镜像, 替换直接升级,由于 v2 版本没有打 patch 只能升级到 v3 才能解决
- ghcr.io/umami-software/umami:mysql-latest
- ccr.ccs.tencentyun.com/k7scn/umami:mysql-latest
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
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
mysqldump --no-create-info --default-character-set=utf8mb4 --quick --skip-add-locks -uroot -h100.90.80.10 -poAkahz4ahvei1oReing6oh5ubaen1veV umami > umami.sql
具体参考流程可以参考 部署轻量数据统计分析 umami
官方镜像 ghcr.io/umami-software/umami:postgresql-v2
国内镜像 ccr.ccs.tencentyun.com/k7scn/umami:postgresql-v2
替换一下镜像地址和环境变量
mysql 环境变量为
- env:
- name: DATABASE_URL
value: mysql://root:[email protected]: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:[email protected]:5432/umami
- name: HASH_SALT
value: ezee4eGhalaishiphese8yaiphomon
image: ccr.ccs.tencentyun.com/k7scn/umami:postgresql-v2
等初始化完成,关闭服务,避免重复初始化数据库(避免影响下面流程)
使用 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 版本, 还是重装方便
由于兼容性问题太多,我最终选择放弃 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 漏洞受到影响
如果你还在运行旧版本,请尽快升级,避免站点暴露在风险中!我今天至少已经看到 10+ 站点被入侵挂马了。
2025-12-02 22:35:49

很早之前我出的,然后又被我收到了,现在又闲置了,打算出了
老牌 IDC 了,工单响应速度极快,即使凌晨 15 分钟接单。
Platinum8259CL*2
128GB DDR4
1TB NVMe SSD
续费 358/月
带宽上限 50Mbps (上行是 50Mbps,下行是 150Mbps)
防护峰值 400Gbps
迁移至宁波电信需在账单日进行且该机器为十堰活动款,迁移至宁波地区您的续费价格将会上调至 398 元,需要实名的。
12.19 到期, 一口价 300,需要自备实名账号,有意可以私聊我。
2025-12-01 22:09:17

算是一个比较老的知识点了 😂
之前都是使用云服务商提供的免密凭证,最近需要跨云跨账号,使用 AI 自己实现了一个通用的
借助 ServiceAccount,实现 Pod 自动免密拉取私有镜像,做到镜像凭据配置一次,全命名空间或指定应用自动生效
使用 ServiceAccount 可以带来两个好处:
主要参考官方文档 为服务账号添加 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,因为权限难以收敛,当然我是没听他的建议。
2025-11-30 21:48:04
最近比较火的,可以 NSFW, 模型默认生成美女 😂
如果你正在寻找一款高性能、轻量、可灵活集成的图片处理方案,那么 Z-Image-Turbo 绝对值得重点关注
Z-Image 是由阿里云通义万相团队推出的一款高效文生图 AI 模型,其核心优势在于 Turbo 级的极致推理速度,能够在秒级时间内将文本描述转化为高质量图像,完美平衡了生成效率与画质表现,极大提升了 AI 创作的实时交互体验
可能被人大量生成 NSFW,目前官方 demo 已经禁止,自建是没限制的
其实类似教程 L 站也有不少,有兴趣可以搜搜。
2025-11-28 22:25:29

最近升级了 Gitspace 基础环境版本,导致没法使用 RemoteSSH。
在新版本系统中,不少人发现原本一直使用的 RSA SSH Key 突然无法登录了。原因不是你的服务器出了问题,而是 OpenSSH 在 8.3 版本之后,默认关闭了对 ssh-rsa 的支持。
本文带你快速了解为什么会这样、怎样安全地重新启用 RSA Key 登录,以及需要注意哪些风险和最佳实践。全文简单易懂、一步到位。
OpenSSH 官方从 8.3 起,将 ssh-rsa 标记为过时算法,主要原因是:
因此,在看到日志类似:
Authentications that can continue: publickey,password
Trying private key: /root/.ssh/id_rsa
之前免密配置了但就是死活登录不上
注意:客户端其实仍然可以使用 RSA,只不过是服务器拒绝了它
大多数情况下,客户端不用配置任何内容,因为 OpenSSH 客户端默认依然支持 RSA
真正需要修改的是服务器,因为服务器默认不接受 ssh-rsa 公钥
当然还有少数情况下客户端也需要配置,我就是改出问题了,客户端也需要配置
为了避免修改主配置文件 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-keygen -t rsa -b 4096
或者 默认 -a是16
ssh-keygen -t ed25519 -a 100
只在必要场景下开启 RSA,新的环境更推荐 ed25519
2025-11-11 21:47:42

最近写了几个 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"
}
}
npm install -g @vscode/vsce
# 打包扩展, 会生成一个 .vsix 文件
vsce package
npm install -g ovsx
官方文档 发布扩展 很详细,根据步骤来就可以。
vsce 只能使用个人访问令牌发布扩展,默认使用 Github 登录就可以。
访问 aex.dev.azure.com,反正跳过来跳过去,主要入口就是 Azure DevOps

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

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

方便起见,我设置全部权限,最长有效期为 1 年。
妥善保管好生成 Token
访问设置 Visual Studio Marketplace 发布者管理页面
只需要填 ID 和 Name,不重复就行,我保持一样。
先登录,按提示输入 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 通过 GitHub 登录就可以了, 需要签一个 VSX Publisher Agreement 申明才能创建 Namespaces
相对来说比较简单,我直接后台上传构建出 vsix 文件

需要两个扩展同步发布,以便官方和第三方 IDE 安装
如果有使用 harness(原 gitness)的 Gitspace 功能的,可以使用我提供的插件,也可以使用官方插件。需要设置环境变量 GITNESS_IDE_VSCODE_Plugin_Name=gaeaflow.gaeaflow-gitspace
可以在应用市场直接安装 GaeaFlow Gitspace
下次有时间说说如何集成 k8s gitspace 环境限定版