MoreRSS

site iconYsicing | 缘生修改

博客名:Solitudes。主要的工作是使用 Go/Rust学习中来实现人们所期望的产品。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Ysicing | 缘生的 RSS 预览

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

2025-12-06 01:17:27

使用 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:[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
  • 去掉了 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-02 22:35:49

使用 chatgpt 生成

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

厂家

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

机器配置

Platinum8259CL*2
128GB DDR4
1TB NVMe SSD

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

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

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

k8s免密拉取镜像实践

2025-12-01 22:09:17

使用 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:04

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

简介

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

主要优势

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

体验地址

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

其他

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

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

2025-11-28 22:25:29

使用 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

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

2025-11-11 21:47:42

使用 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 环境限定版