THsInk https://www.thsink.com Just a Simple Blog Sat, 10 Oct 2026 21:26:08 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.1.4 https://www.thsink.com/wp-content/uploads/2021/04/favicon.png THsInk https://www.thsink.com 32 32 在内网debian虚拟机安装dsh tavern并在本机使用 https://www.thsink.com/notes/2677/ https://www.thsink.com/notes/2677/#respond Sat, 10 Oct 2026 21:10:05 +0000 https://www.thsink.com/?p=2677 为了隔离环境,决定在内网pve的debian kvm vps运行,由于dsh tavern的linux版本本身借助浏览器显示,那么可以把dsh放在vps以节省本机虚拟化性能占用。

安装 Node.js 22

curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh \
  -o /tmp/nvm-install.sh

bash /tmp/nvm-install.sh

export NVM_DIR="$HOME/.nvm"
. "$NVM_DIR/nvm.sh"

nvm install 22
nvm alias default 22

Node 必须至少为 22.19.0

安装项目

export DSH_TAVERN_HOST=cli
export DSH_TAVERN_CLI_HOME="$HOME/.dsh-tavern"
export DSH_TAVERN_NO_OPEN=1

curl -fsSL https://cdn.jsdelivr.net/gh/flizzywine/dsh-tavern@main/install.sh \
  -o /tmp/dsh-tavern-install.sh

sh /tmp/dsh-tavern-install.sh

export PATH="$HOME/.local/bin:$PATH"
dsh-tavern status

若在非root账户执行,则可能启动脚本缺少权限,尝试


chmod u+x "$HOME/.dsh-tavern/apps/dsh-tavern/bin/dsh-tavern.mjs"

export PATH="$HOME/.local/bin:$PATH"

dsh-tavern status

安装caddy (ps. 使用ssh隧道访问localhost也可,但caddy更适合后续直接访问)


sudo apt update
sudo apt install -y caddy

设置页面密码,

caddy hash-password

sudo cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.before-dshtavern
sudo nano /etc/caddy/Caddyfile

参考格式

https://dshtavern {
    tls internal

    basicauth {
        tavern 替换为完整密码哈希
    }

    reverse_proxy 127.0.0.1:3081 {
        header_up Host 127.0.0.1:3081
        header_up Origin http://127.0.0.1:3081
        header_up -Authorization
    }
}
sudo tee /etc/caddy/Caddyfile > /dev/null << 'EOF'
https://dshtavern {
    tls internal

    basicauth {
        tavern 替换
    }

    reverse_proxy 127.0.0.1:3081 {
        header_up Host 127.0.0.1:3081
        header_up Origin http://127.0.0.1:3081
        header_up -Authorization
    }
}
EOF

检查,返回格式错误

sudo runuser -u caddy -- caddy validate --config /etc/caddy/Caddyfile
2026/10/10 20:50:20.894	INFO	using provided configuration	{"config_file": "/etc/caddy/Caddyfile", "config_adapter": ""}
2026/10/10 20:50:20.895	WARN	Caddyfile input is not formatted; run the 'caddy fmt' command to fix inconsistencies	{"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
2026/10/10 20:50:20.895	INFO	tls.cache.maintenance	started background certificate maintenance	{"cache": "0xc0001e5490"}
2026/10/10 20:50:20.896	INFO	http	server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS	{"server_name": "srv0", "https_port": 443}
2026/10/10 20:50:20.896	INFO	http	enabling automatic HTTP->HTTPS redirects	{"server_name": "srv0"}
2026/10/10 20:50:20.896	INFO	tls.cache.maintenance	stopped background certificate maintenance	{"cache": "0xc0001e5490"}
Valid configuration

修复

sudo caddy fmt --overwrite /etc/caddy/Caddyfile

sudo runuser -u caddy -- caddy validate --config /etc/caddy/Caddyfile

通过后启动


sudo systemctl enable caddy
sudo systemctl restart caddy
sudo systemctl status caddy --no-pager

获取登录地址

dsh-tavern status

访问(其中dshtavern为vps主机名)

https://dshtavern/?token=xxx

basic认证账号tavern,密码为设定的值

由于dsh限制,无法在远程网页配置api,因此仍需要通过ssh隧道访问并配置api。否则报错“加载提供方目录失败: settings are unavailable in this browser”

ssh -N \
  -o ExitOnForwardFailure=yes \
  -o ServerAliveInterval=30 \
  -L 127.0.0.1:3081:127.0.0.1:3081 \
  你的Debian用户名@dshtavern

可选,信任证书

导出根证书,在 Debian 执行:

sudo install -m 0644 \
/var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt \
/home/<yourusername>/dshtavern-root.crt

在 Mac 终端执行:

scp <yourusername>@dshtavern:~/dshtavern-root.crt ~/Downloads/

将下载的证书导入 Mac“钥匙串访问”的“登录”钥匙串,双击证书,在“信任”中将且仅将 SSL 设置为“始终信任”。

关闭窗口认证保存。

然后获取项目当前访问地址:

dsh-tavern status

在 Mac 浏览器中,把输出地址的 http://127.0.0.1:3081 替换为 https://dshtavern,保留后面的 token 参数,再用你配置的网页账号密码登录。

图片[1]-THsInk
]]>
https://www.thsink.com/notes/2677/feed/ 0
PVE创建Cloud-init Debian虚拟机模板 https://www.thsink.com/notes/2640/ https://www.thsink.com/notes/2640/#respond Sun, 24 May 2026 22:52:34 +0000 https://www.thsink.com/?p=2640 1. 下载镜像

在 https://cloud.debian.org/images/cloud/ 下载 .qcow2 ,如 https://cloud.debian.org/images/cloud/trixie/20260518-2482/debian-13-genericcloud-amd64-20260518-2482.qcow2

mkdir -p /var/lib/vz/template/qcow2
cd /var/lib/vz/template/qcow2
wget https://cloud.debian.org/images/cloud/trixie/20260518-2482/debian-13-genericcloud-amd64-20260518-2482.qcow2
sha512sum debian-13-genericcloud-amd64-20260518-2482.qcow2

2. 创建模板

2.1 新建虚拟机

  • 操作系统:选择 “不使用任何介质”(Do not use any media)
  • SCSI 控制器选 VirtIO SCSI single
  • 删除默认硬盘
  • 网络选 VirtIO
  • CPU可选host

导入qcow2

qm importdisk 9000 /var/lib/vz/template/qcow2/debian-13-genericcloud-amd64-20260518-2482.qcow2 local-lvm

2.2 挂载硬盘

回到网页端,选中刚才的虚拟机 9000,点击 硬件 (Hardware):

点击上方的 添加 (Add) 按钮 -> 选择 CloudInit 设备 (CloudInit Drive),存储同样选择你的虚拟机存储(如 local-lvm),点击添加。

你会看到底部多了一个 “未使用的磁盘 0”(Unused Disk 0)。双击它,总线选择 SCSI,然后点击 添加 (Add)。

可选优化:

  • Cache: Write Back
  • 勾选 SSD Emulation
  • 勾选 Discard
  • 保持勾选 IO thread 和 Backup

2.3 调整启动顺序

在虚拟机 9000 的 选项 (Options) 菜单中:

  • 双击 引导顺序 (Boot Order)。
  • 勾选刚刚添加的 scsi0 硬盘,并把它拖动到第一位(最顶上)。
  • 点击确定。

编辑 QEMU Guest Agent ,设置为 Enabled

2.4 初始化脚本

点击虚拟机的 Cloud-Init 菜单,配置 IP Config 为 DHCP,未配置ipv6即禁用,点击 Regenerate Image

(若无法编辑,查看是否已经在Hardware添加了一个CloudInit Drive,Bus/Device 默认 IDE 0,Storage选择虚拟机存储卷如 local-lvm)

创建一个自定义初始化脚本

mkdir -p /var/lib/vz/snippets/
nano /var/lib/vz/snippets/vm_config.yaml

设置了时区,sshkey等。公网部署考虑额外收紧安全配置。

#cloud-config
timezone: Asia/Hong_Kong
package_upgrade: true  # 可选,用于首次启动时自动升级软件包

# 定义多个用户
users:
  - name: sysadmin          # 第一个用户名
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL'] # 赋予完整的、免密的 root 权限
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...替换为公钥...

  - name: devops
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3NzaC1...

# 强制允许 SSH 密码登录(覆盖官方镜像的默认安全策略)
ssh_pwauth: true

# 设置初始登录密码(选填,提高一点可能的维护便利性)
chpasswd:
  list: |
    sysadmin:第一个用户的密码
  expire: False

挂载自定义配置

qm set 9000 --cicustom "user=local:snippets/vm_config.yaml"
qm cloudinit regenerate 9000

2.5 创建模板

将vm9000右键转换为模板Convert to template

3. 创建虚拟机

3.1 从模板新建虚拟机

克隆vm9000,选择 完整克隆 (Full Clone) 

可选提前编辑主机名,需要创建单独的初始化脚本:

# 1. 复制一份专门给 9001 使用的配置文件
cp /var/lib/vz/snippets/vm_config.yaml /var/lib/vz/snippets/vm_9001.yaml

# 2. 向这个新文件追加一行主机名设置(注意:冒号后面有一个空格)
echo "hostname: Debian13-9001" >> /var/lib/vz/snippets/vm_9001.yaml

# 3. 将新虚拟机的 Cloud-Init 脚本指向这个专属于它的文件
qm set 9001 --cicustom "user=local:snippets/vm_9001.yaml"

# 4. 刷新 9001 的 Cloud-Init 图像
qm cloudinit update 9001

或者开机后再修改

sudo hostnamectl set-timezone Asia/Hong_Kong && sudo hostnamectl set-hostname Debian13-9001

3.2 调整硬盘大小

开机前可调整vm_9001的硬盘大小。默认3GB。

这个步骤可以在虚拟机开机状态下在线进行(热扩容),但为了保险起见,建议在关键操作前先关闭虚拟机。

  1. 登录 PVE 管理后台,找到该虚拟机。
  2. 点击 硬件 (Hardware) -> 选择你需要扩容的 硬盘 (Hard Disk)。
  3. 点击上方的 磁盘操作 (Disk Action) -> 选择 调整大小 (Resize)。
  4. 在弹出的窗口中,输入你想要增加的容量(例如:输入 20 表示在原基础上增加 20GB),然后点击“调整大小”。

此时,虚拟机的底层虚拟硬盘已经变大了。Resize不能用于减小硬盘。

boot后通常会自动识别扩容,查看Size是否为扩容后的正确大小:

df -h /
]]>
https://www.thsink.com/notes/2640/feed/ 0
docker 搭建 Shlink (self-hosted URL shortener) https://www.thsink.com/notes/2626/ https://www.thsink.com/notes/2626/#respond Fri, 27 Feb 2026 15:58:03 +0000 https://www.thsink.com/?p=2626 Shlink适合单用户非公开用例。更轻量级/多用户/公开项目参考 4. 其他短链接项目

1. 注册MaxMind获取GeoLite2 key (可选)

用于显示访客地区。

注册一个MaxMind账号 https://www.maxmind.com/en/geolite2/signup

生成许可证密钥并自行保存,之后无法恢复 https://www.maxmind.com/en/accounts/current/license-key

2. 配置文件

docker-compose.yml

services:
  # 1. PostgreSQL 数据库
  db:
    image: postgres:18-alpine
    container_name: shlink_db
    environment:
      POSTGRES_USER: shlink
      POSTGRES_PASSWORD: use_openssl_to_radom
      POSTGRES_DB: shlink
    volumes:
      - ./shlink_db_data:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - default
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  # 2. Shlink 核心后端服务
  shlink:
    image: shlinkio/shlink:stable
    container_name: shlink_backend
    depends_on:
      - db
    environment:
      - DB_DRIVER=postgres
      - DB_USER=shlink
      - DB_PASSWORD=use_openssl_to_radom
      - DB_NAME=shlink
      - DB_HOST=db
      # 注意:配合反代使用时,这里应该改成你未来的实际域名,如 shlink.example.com
      - DEFAULT_DOMAIN=shlink-backend.example.com
      - IS_HTTPS_ENABLED=true
      - GEOLITE_LICENSE_KEY=  # 免费注册MaxMind获取GeoLite2 许可证密钥
    expose:
      - "8080"
    networks:
      - default
      - dockernetwork
    restart: unless-stopped
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  # 3. Shlink 前端 Web 管理界面
  shlink-web-client:
    image: shlinkio/shlink-web-client:latest
    container_name: shlink_web
    expose:
      - "8080"
    depends_on:
      - shlink
    networks:
      - dockernetwork
    restart: unless-stopped
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

networks:
  dockernetwork:
    external: true

配置中的default用于后端和db连通,dockernetwork用于使用npm反代。

注意生成替换DB_PASSWORD

3. 启动和测试

启动容器

docker compose up -d

生成 API Key (用于在前端和后端通信),自行保存生成的key

docker compose exec shlink shlink api-key:generate

在npm反代 shlink_backend 和 shlink_web ,这两个域名可以随便使用后端域名,并在waf设置IP白名单。此外,可以解析实际使用的一个或多个短域名到shlink_backend

在前端连接后端后,可以在 /manage-servers 导出服务器配置csv文件

创建短链接时,在Create a short URL点击Advanced options » 展开,输入一个new domain(实际使用的短域名),此短域名就会显示在manage-domains页面,可以编辑其根路径、404、无效路径的跳转。

在设置的Real-time updates中,可以设置更新频率,比如设置20 (分钟)

此外,测试正常后,可以考虑将shlink_backend固定为具体的版本如 image: shlinkio/shlink:5.0.0 。注意备份数据库。

4. 其他短链接项目

yourls,元老项目,更适合部署在传统php环境。我三年前用过这个项目,借助插件也能实现不少细分功能。

kutt,配置比较方便,支持多用户注册,多域名/根域名跳转/限时限次/设置访问密码等功能也有,还支持细分的删除和封禁范围,比较实用。

使用sqlite,轻量使用或测试使用。

services:
  kutt:
    image: kutt/kutt:latest
    container_name: kutt_app
    restart: unless-stopped
    expose:
      - "3000"
    volumes:
      - ./kutt_data:/var/lib/kutt
    environment:
      # 基础设置
      - PORT=3000
      - DEFAULT_DOMAIN= # 如果有公网 IP 或域名,请替换为你的域名
      - SITE_NAME=Kutt Test
      
      # 数据库设置 (使用内置 SQLite)
      - DB_FILENAME=/var/lib/kutt/data.sqlite
      
      # 安全设置 (生产环境必须修改为长随机字符串)
      - JWT_SECRET=
      
      # 管理员邮箱 (在网页端注册此邮箱,会自动获得管理员权限)
      - ADMIN_EMAILS=
      
      # 权限设置
      - DISALLOW_REGISTRATION=true     # 允许用户注册
      - DISALLOW_ANONYMOUS_LINKS=true    # 允许未登录用户生成短链
    networks:
      - dockernetwork

networks:
  dockernetwork:
    external: true

完整部署(PostgreSQL + Redis)参考,此配置我未进行完整测试

services:
  kutt:
    image: kutt/kutt:latest
    container_name: kutt_app
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
      - DEFAULT_DOMAIN=localhost:3000
      - SITE_NAME=Kutt Pro
      # 数据库配置
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_NAME=kutt
      - DB_USER=kutt_user
      - DB_PASSWORD=kutt_password
      # 缓存配置
      - REDIS_ENABLED=true
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_PASSWORD=
      # 其他配置
      - JWT_SECRET=super_secret_jwt_key_change_me
      - ADMIN_EMAILS=admin@example.com
      - DISALLOW_REGISTRATION=false
      - DISALLOW_ANONYMOUS_LINKS=true
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:15-alpine
    container_name: kutt_postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=kutt
      - POSTGRES_USER=kutt_user
      - POSTGRES_PASSWORD=kutt_password
    volumes:
      - kutt_db:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    container_name: kutt_redis
    restart: unless-stopped
    volumes:
      - kutt_redis_data:/data

volumes:
  kutt_db:
  kutt_redis_data:

Slash,更像是个人书签,附带实现了短链接功能。限制100个链接数。docker-compose.yml

Sink,完全运行在cloudflare workers/KV。挺多使用cloudflare部署的项目都设计的挺不错,但我还是觉得部署在vps更能给我安全感(主要是没有请求次数焦虑)。

此外还有Chhoto URL、shrtn.io 等项目,功能精简,stars数较少,我没有实际部署测试,感兴趣可以看一下。

参考

https://shlink.io/documentation/install-docker-image/

https://shlink.io/documentation/geolite-license-key/

]]>
https://www.thsink.com/notes/2626/feed/ 0
在u盘中刷入debian live,并添加一个加密持久化存储分区 https://www.thsink.com/record/2611/ https://www.thsink.com/record/2611/#respond Fri, 20 Feb 2026 21:08:17 +0000 https://www.thsink.com/?p=2611 如果不需要加密分区,使用任意能想到的方式刷入iso即可。

我想要直接在u盘安装debian live,而不是通过ventoy加载。先刷入镜像,再使用fdisk进行分区会由于debian live分区奇怪导致无法启动,GParted和parted也没有帮助。因此使用工具 mkusb

1. 在ubuntu安装mkusb (debian操作稍麻烦点)

# 启用 universe 仓库并添加 mkusb 官方源
sudo add-apt-repository universe
sudo add-apt-repository ppa:mkusb/ppa

# 更新并安装
sudo apt update
sudo apt install mkusb mkusb-nox usb-pack-efi -y

我在ventoy启动ubuntu,尝试挂载ventoy u盘中的debian live镜像失败。因此考虑直接通过另一个u盘拷入,或者直接wget下载到本地。

2. 刷入系统并分区

  1. 启动程序:在终端输入 sudo mkusb。选择d 开始,即 dus (Classic, easy to use),这是 mkusb 最经典、也是功能最完整的向导模式。
  2. 安全提示:此时会弹出一个警告窗口,问你是否运行(Run mkusb?),点击 Yes。
  3. 主菜单:选择第一项 Install (make a boot device),点击 OK。
  4. 模式选择(关键):选择 'Persistent live' - only Debian and Ubuntu,点击 OK。
  5. 选择镜像:在弹出的文件浏览器中,找到你的 debian-live.iso。
  6. 选择目标 U 盘:仔细核对,选中你的 U 盘(例如 sdb),点击 OK。
  7. select method/tool 选择 p (‘dus-Persistent’, classic dus method)。即需要的“Persistent(持久化)”
  8. persistent live drive settings 保持默认都不勾选
  9. 空间分配:
    • mkusb 会非常贴心地问你:“持久化分区要占可用空间的百分之几?”
    • 例如,你可以拖动滑块或输入 50%。
    • (剩下的 50% 它会帮你做成一个名为 usbdata 的 NTFS 分区,你插到 Windows 电脑上也能当普通 U 盘存文件!),不需要此分区,因此直接拉满100%(需要就保留)
    • select pack 选择默认的usb-pack-efi-1
  10. 最终确认:勾选 Go ahead,点击 Go。

3. 加密分区

首先确认 mkusb 把持久化分区分配到了几号

lsblk -f /dev/sdb

找到带有 persistence 标签或者体积最大的那个分区(通常是 /dev/sdb4 或 /dev/sdb5)。

假设你确认了目标分区是 /dev/sdb5(务必替换为自己 lsblk 看到的实际编号):

sudo cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 /dev/sdb5

输入大写的 YES,然后输入你要设置的保险箱密码。

解开刚建好的加密层,并在里面建立 Debian 认识的持久化格式:

sudo cryptsetup open /dev/sdb5 my_vault
sudo mkfs.ext4 -L persistence /dev/mapper/my_vault

答案是:随时可以更改,而且非常简单。 LUKS 加密机制极其高级,它支持所谓的“密钥槽(Key Slots)”,你可以随时修改密码,甚至可以同时设置多个不同的密码来解锁同一个 U 盘。

更改密码不需要格式化,也不会丢失任何数据。操作如下:

1. 找到底层的物理分区编号

在终端输入:

lsblk

找到你的 U 盘,看一下被标记为 crypt 的那个分区叫什么(通常是 /dev/sdb5 或 /dev/sdc5 之类,注意不是 /dev/dm-0,必须找它下面的物理盘符)。

2. 执行修改密码命令

假设你通过 lsblk 确认了加密分区是 /dev/sdb5:

sudo cryptsetup luksChangeKey /dev/sdb5

3. 按照提示输入

终端会依次提示你:

  1. Enter any existing passphrase:(输入你现在的密码,输入时屏幕不会有任何显示,输完按回车)。
  2. Enter new passphrase for key slot:(输入你想要的新密码)。
  3. Verify passphrase:(再次输入新密码确认)。

只要没报错,密码就瞬间修改完成了!下次开机解锁时,直接使用新密码即可。

4. 在内存中运行

最开始选择运行方式时,直接按e编辑启动参数

在大概第二行 linux 最长的那行末尾添加 空格 toram

在 Debian Live 系统中,你可以通过几种简单的方法来确认系统是直接从 U 盘读取数据,还是已经完全加载到了内存(RAM)中。

通常,这取决于你在启动时的引导参数(Boot Parameters)中是否使用了 toram 选项。

1. 检查启动参数(最直接的方法)

查看内核启动时携带的指令。如果其中包含 toram,说明系统在启动时尝试将整个文件系统镜像加载进 RAM。

运行以下命令:

cat /proc/cmdline
  • 如果看到 toram: 说明系统运行在 RAM 中。
  • 如果没有 toram: 说明系统按常规模式运行,即实时从 U 盘读取数据。

2. 使用 lsblk 查看挂载点

通过查看设备挂载情况,可以观察“介质”在哪里。

运行命令:

lsblk
  • 常规模式: 你会看到你的 U 盘分区(如 /dev/sdb1)被挂载在 /run/live/medium。这意味着系统仍在使用 U 盘。
  • RAM 模式(toram): 在某些配置下,如果成功加载到内存,/run/live/medium 可能会被卸载,或者你会发现根目录对应的 loop 设备不再频繁访问 U 盘分区。

3. 检查 df 磁盘占用

查看文件系统的来源:

df -h | grep /run/live
  • 如果 /run/live/medium 指向一个物理设备(如 /dev/sdX),且系统运行缓慢(取决于 U 盘速度),通常是 U 盘运行。
  • 如果系统是 toram 模式,你会发现系统响应极快,且在拔掉 U 盘后(如果已手动卸载介质),系统依然能正常运行程序。

]]>
https://www.thsink.com/record/2611/feed/ 0
删除ventoy安装的安全启动证书 https://www.thsink.com/notes/2608/ https://www.thsink.com/notes/2608/#respond Fri, 20 Feb 2026 20:42:35 +0000 https://www.thsink.com/?p=2608 ventoy可以不关闭安全启动,通过Enroll Key [MOK (Machine Owner Keys,机器所有者密钥)] 运行,详见https://www.ventoy.net/cn/doc_secure.html

如果需要删除,可以在ventoy运行一个debian desktop (try)

把主板内所有已注册的自定义密钥导出到当前文件夹

sudo mokutil --export

确认哪个是 Ventoy 的密钥,对每一个生成的 .der 文件运行:

# 假设文件是 MOK-0001.der
openssl x509 -in MOK-0001.der -inform DER -text -noout | grep -E "Subject|Issuer"

通常是最新的,比如MOK-0002.der。输出中包含 CN=grub 或者含有 Ventoy 的就是需要找的密钥。

进行删除:

sudo mokutil --delete MOK-0002.der

输入临时密码:提示 input password 时,输入 1234 并回车,再次输入确认。此临时密码仅用于下一步确认删除。

重启,再次选择ventoy启动,回到蓝色界面,执行删除确认:

选择 Delete MOK。

选择 Continue 查看密钥信息(确认是 CN=grub)。

选择 Yes。

输入你刚才设置的临时密码(比如 1234)。

最后选择 Reboot。

]]>
https://www.thsink.com/notes/2608/feed/ 0
ChatGPT 5.2 的内容审查已经严重影响到回复质量 https://www.thsink.com/record/2596/ https://www.thsink.com/record/2596/#comments Mon, 16 Feb 2026 17:03:09 +0000 https://www.thsink.com/?p=2596 我记忆中chatgpt最好用的时期是2025年中上旬5.0时期(主要指日常通用体验,我那时使用chatgpt处理的代码问题少 不做评价)。

随着尼区涨价,我就没再用过pro版了。后来gemini3.0之后大部分日常问题都是使用gemini了。最近一个月再次体验chatgpt,让我感觉像在使用朝鲜的模型,简单列出几个让我忍不住记一笔的糟糕体验:

  • 为了体现自己回答的客观全面,开头必须要怼我一句,非要指出一个我问题中的反例细节,即使这个细节非常不重要。
  • 回复结构体验差。免费版喜欢使用emoji、频繁分段(甚至一段一两句)。team版结构有改善,但易读性相较gemini仍较差。
  • 道德水准高到偏执。全身上下到处都是G点,甚至让我感觉它在硬性地根据关键词匹配,即使这样匹配的断句/断词方式是错误的。而gemini现在给我的体验类似chatgpt5.0时期。

我发现我好像有点踩一捧一了,这样不太好,我应该只是喷chatgpt。

但chatgpt现在的体验实在是太垃圾了。我上次给出垃圾的评价还是对mac的中英文切换。mac输入法尚能自适应,chatgpt让我只能停止使用。 chatgpt仍有优势区域,仍有可取之处。

]]>
https://www.thsink.com/record/2596/feed/ 1
买了一个灵车C-Servers Texas 3C1G15G 小鸡 https://www.thsink.com/vps/2574/ https://www.thsink.com/vps/2574/#respond Fri, 06 Feb 2026 23:52:12 +0000 https://www.thsink.com/?p=2574 3年付6.5usd,很有黑五的感觉。

图片[1]-THsInk

左边那个3年付3.5usd不到,内存太小了,没选。这价格,还有ipv6/64,还有ipv4出口(不用自己加warp),有点香

Falkenstein 和 Helsinki 限制同账户最多3个网站,我是在登陆virtfusion面板时才看到的。看起来美国暂不收限制。

图片[2]-THsInk

yabs还可以,硬盘也没限制,如果稍微稳定点的话比之前7欧一年的host-c好。host-c的7欧ipv6已经比较不稳定了,经常重启,偶尔停机维护。

curl -sL yabs.sh | bash -s -- -r56
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
#              Yet-Another-Bench-Script              #
#                     v2025-04-20                    #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #

Fri Feb  6 11:10:13 PM GMT 2026

Basic System Information:
---------------------------------
Uptime     : 0 days, 0 hours, 3 minutes
Processor  : Intel Xeon Processor (Skylake, IBRS)
CPU cores  : 3 @ 2394.380 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ✔ Enabled
RAM        : 929.1 MiB
Swap       : 2.0 GiB
Disk       : 14.7 GiB
Distro     : Debian GNU/Linux 13 (trixie)
Kernel     : 6.12.63+deb13-amd64
VM Type    : KVM
IPv4/IPv6  : ✔ Online / ✔ Online

IPv6 Network Information:
---------------------------------
ISP        : Snaju Development
ASN        : AS399646 Snaju Development
Location   : Houston, Texas (TX)
Country    : United States

fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/vda3):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 176.74 MB/s  (44.1k) | 1.09 GB/s    (17.1k)
Write      | 177.20 MB/s  (44.3k) | 1.10 GB/s    (17.2k)
Total      | 353.94 MB/s  (88.4k) | 2.20 GB/s    (34.3k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 1.84 GB/s     (3.6k) | 1.83 GB/s     (1.7k)
Write      | 1.94 GB/s     (3.7k) | 1.95 GB/s     (1.9k)
Total      | 3.78 GB/s     (7.3k) | 3.79 GB/s     (3.7k)

iperf3 Network Speed Tests (IPv4):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed      | Ping           
-----           | -----                     | ----            | ----            | ----           
Clouvider       | London, UK (10G)          | 603 Mbits/sec   | 161 Mbits/sec   | 101 ms         
Leaseweb        | Singapore, SG (10G)       | 514 Mbits/sec   | 120 Mbits/sec   | 236 ms         
Leaseweb        | NYC, NY, US (10G)         | 703 Mbits/sec   | 382 Mbits/sec   | 39.4 ms        

iperf3 Network Speed Tests (IPv6):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed      | Ping           
-----           | -----                     | ----            | ----            | ----           
Clouvider       | London, UK (10G)          | 599 Mbits/sec   | 166 Mbits/sec   | 101 ms         
Leaseweb        | Singapore, SG (10G)       | 484 Mbits/sec   | 166 Mbits/sec   | 236 ms         
Leaseweb        | NYC, NY, US (10G)         | 701 Mbits/sec   | 123 Mbits/sec   | 39.4 ms        

Geekbench 5 Benchmark Test:
---------------------------------
Test            | Value                         
                |                               
Single Core     | 783                           
Multi Core      | 2130                          
Full Test       | https://browser.geekbench.com/v5/cpu/24094361

Geekbench 6 Benchmark Test:
---------------------------------
Test            | Value                         
                |                               
Single Core     | 784                           
Multi Core      | 1235                          
Full Test       | https://browser.geekbench.com/v6/cpu/16455691

YABS completed in 17 min 59 sec
dd bs=64k count=4k if=/dev/zero of=test oflag=dsync && rm -f test
4096+0 records in
4096+0 records out
268435456 bytes (268 MB, 256 MiB) copied, 4.54453 s, 59.1 MB/s
curl -sL yabs.sh | bash -s -- -r5
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
#              Yet-Another-Bench-Script              #
#                     v2025-04-20                    #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #

Sun Feb 15 04:20:37 PM GMT 2026

Basic System Information:
---------------------------------
Uptime     : 8 days, 17 hours, 14 minutes
Processor  : Intel Xeon Processor (Skylake, IBRS)
CPU cores  : 3 @ 2394.380 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ✔ Enabled
RAM        : 929.1 MiB
Swap       : 2.0 GiB
Disk       : 14.7 GiB
Distro     : Debian GNU/Linux 13 (trixie)
Kernel     : 6.12.63+deb13-amd64
VM Type    : KVM
IPv4/IPv6  : ✔ Online / ✔ Online

IPv6 Network Information:
---------------------------------
ISP        : Snaju Development
ASN        : AS399646 Snaju Development
Location   : Houston, Texas (TX)
Country    : United States

fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/vda3):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 47.95 MB/s   (11.9k) | 1.00 GB/s    (15.7k)
Write      | 48.00 MB/s   (12.0k) | 1.01 GB/s    (15.8k)
Total      | 95.96 MB/s   (23.9k) | 2.02 GB/s    (31.6k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 1.98 GB/s     (3.8k) | 2.08 GB/s     (2.0k)
Write      | 2.08 GB/s     (4.0k) | 2.22 GB/s     (2.1k)
Total      | 4.07 GB/s     (7.9k) | 4.31 GB/s     (4.2k)

iperf3 Network Speed Tests (IPv4):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed      | Ping           
-----           | -----                     | ----            | ----            | ----           
Clouvider       | London, UK (10G)          | 570 Mbits/sec   | 206 Mbits/sec   | 101 ms         
Leaseweb        | Singapore, SG (10G)       | 273 Mbits/sec   | 113 Mbits/sec   | 229 ms         
Leaseweb        | NYC, NY, US (10G)         | 614 Mbits/sec   | 124 Mbits/sec   | 39.3 ms        

iperf3 Network Speed Tests (IPv6):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed      | Ping           
-----           | -----                     | ----            | ----            | ----           
Clouvider       | London, UK (10G)          | 531 Mbits/sec   | 111 Mbits/sec   | 101 ms         
Leaseweb        | Singapore, SG (10G)       | 414 Mbits/sec   | 42.3 Mbits/sec  | --             
Leaseweb        | NYC, NY, US (10G)         | 696 Mbits/sec   | 187 Mbits/sec   | 39.3 ms        

Geekbench 5 Benchmark Test:
---------------------------------
Test            | Value                         
                |                               
Single Core     | 675                           
Multi Core      | 1774                          
Full Test       | https://browser.geekbench.com/v5/cpu/24114857

YABS completed in 6 min 44 sec
dd bs=64k count=4k if=/dev/zero of=test oflag=dsync && rm -f test
4096+0 records in
4096+0 records out
268435456 bytes (268 MB, 256 MiB) copied, 4.97005 s, 54.0 MB/s
图片[3]-THsInk

图片[4]-THsInk

图片[5]-THsInk

图片[6]-THsInk

图片[7]-THsInk

图片[8]-THsInk

]]>
https://www.thsink.com/vps/2574/feed/ 0
用clawdbot发起了一笔eth转账 https://www.thsink.com/record/2564/ https://www.thsink.com/record/2564/#respond Tue, 03 Feb 2026 23:04:04 +0000 https://www.thsink.com/?p=2564 实际用途不大,只是在早期体验了一次ai转账有实际价值的代币,理论上ai可以用加密货币购买一些资源,扩大其影响范围。

不过bot写的脚本稀碎,复用性和安全性低

图片[1]-THsInk
]]>
https://www.thsink.com/record/2564/feed/ 0
Matrix 使用 BorgBackup 自动备份 https://www.thsink.com/notes/2538/ https://www.thsink.com/notes/2538/#respond Sat, 31 Jan 2026 23:57:30 +0000 https://www.thsink.com/?p=2538 最近两天cloudcone的Virtualizor被黑,导致用户vps数据被加密/删除并受到勒索。我有一个吃灰的小鸡,不知道为什么我没有收到通知邮件。

我目前没有定时备份的、丢失数据后最恶心的估计就是matrix了,而且我部署matrix使用的vps商家也是用Virtualizor的。搜索后发现可以使用borg备份。borg算一种类似timemachine的增量备份,并且可以通过二进制文件在虚拟主机运行,看起来方便且划算。

1. 在备份机下载borg

mkdir borg
cd borg
wget -O borg https://github.com/borgbackup/borg/releases/download/1.4.3/borg-linux-glibc231-x86_64
chmod +x borg
./borg --version

2. 在matrix vps 保存ssh信息

生成一个sshkey,不需要passphrase

ssh-keygen -t ed25519

认证一次

ssh-copy-id -p 端口 -i ~/.ssh/id_ed25519.pub 用户名@存储vpsip

获取私钥,之后放到ansible的vars.yml

cat /root/.ssh/id_ed25519

3. 在ansible机添加borg配置

nano inventory/host_vars/matrix.你的域名.com/vars.yml

在末尾附加以下内容,使用 openssl rand -base64 32 生成需要的密码

# ==========================================
# 异地备份配置 (BorgBackup) - 添加到文件末尾
# ==========================================

backup_borg_enabled: true

# 备份仓库地址
# 格式语法: ssh://用户名@IP:端口/./相对路径
# 这里配置为存放在 matrixbackup 用户主目录下的 matrix-backup 文件夹中
backup_borg_repositories:
  - path:"ssh://matrixbackup@123.45.67.89:23432/./matrix-backup"
    label: "123123"  # (可选) 给仓库起个标签,方便看日志

# Borg 加密密码 (非常重要!)
# 这是你的"最后一道防线"。即使黑客攻破了你的备份服务器,没有这个密码也无法还原数据。
# 请务必生成一个随机字符串并保存到你的 1Password/Bitwarden 中。
backup_borg_storage_encryption_passphrase: "这里填写一个复杂的随机密码不要用123456"

# 备份计划 (默认是每天凌晨),这里可以不改,使用默认即可
# backup_borg_schedule: "*-*-* 04:00:00"

# 自动修剪策略 (默认保留最近7天,4周,6个月) 半年生成大概15个备份点
backup_borg_prune_keep_daily: 7
backup_borg_prune_keep_weekly: 4
backup_borg_prune_keep_monthly: 6

# 忽略 SSH 指纹检查 (为了自动化方便,建议加上此行)
# 加上这个参数后,Ansible 第一次连接备份服务器时不会询问 "Are you sure..."
backup_borg_ssh_extra_args: "-o StrictHostKeyChecking=no"

# 填入你刚才 cat 出来的私钥内容
# 注意:
# 1. 竖线 "|" 后面不能有字符
# 2. 密钥内容的每一行必须比 "backup_borg_ssh_key_private" 多缩进两个空格
backup_borg_ssh_key_private: |
  -----BEGIN OPENSSH PRIVATE KEY-----
  b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
  QyNTUxOQAAAC... 
  ...
  ...tCAF+C5v/Q==
  -----END OPENSSH PRIVATE KEY-----

运行部署

ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start

4. 在matrix服务器测试

运行一次备份任务进行测试

# 进行一次备份
systemctl start matrix-backup-borg.service

# 查看日志
journalctl -fu matrix-backup-borg.service

# 查看下次运行时间
systemctl list-timers matrix-backup-borg.timer

# 查看已有的备份数量
/matrix/backup-borg/bin/borgmatic list

# 查看具体的备份信息
/matrix/backup-borg/bin/borgmatic info --archive matrix-2026-01-31-12345
图片[1]-THsInk

5. 恢复备份

还未尝试,虽然我知道我应该测试一下,但我太懒了,下次一定

参考文档

https://github.com/mother-of-all-self-hosting/ansible-role-backup_borg/blob/main/docs/configuring-backup-borg.md

https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook-backup-borg.md

]]>
https://www.thsink.com/notes/2538/feed/ 0
记录一次安装和配置ClawdBot(现已更名为moltbot)(再次更名为openclaw) https://www.thsink.com/notes/2518/ https://www.thsink.com/notes/2518/#respond Tue, 27 Jan 2026 14:26:04 +0000 https://www.thsink.com/?p=2518 刷到一个项目 https://github.com/moltbot/clawdbot (https://github.com/moltbot/moltbot)

开了一个debian12虚拟机,2h4g50g测试,文档中建议2h2g即可

安装文档https://docs.molt.bot/start/getting-started,我使用手动安装。

适用于参考本文安装clawdbot的用例

停止服务

sudo systemctl stop clawdbot

备份与数据迁移

# 1. 备份旧数据(防止万一)
cp -r ~/.clawdbot ~/.clawdbot_final_backup

# 2. 将旧数据目录重命名为新名称
# OpenClaw 启动时会自动识别该目录结构
mv ~/.clawdbot ~/.openclaw

更换软件包

# 卸载旧包
pnpm remove -g clawdbot

# 安装新包
pnpm add -g openclaw

在安装新包时,可能需要批准构建脚本,按a选择全部

pnpm approve-builds -g

验证安装,此时应显示最新版本(例如 2026.2.1 或更新)

openclaw --version

更新 Systemd 配置文件

sudo nano /etc/systemd/system/clawdbot.service

将ExecStart=.../pnpm/clawdbot gateway 改为 ExecStart=/home/clawdbot/.local/share/pnpm/openclaw gateway

启动并验证

# 重载配置
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start clawdbot

# 查看日志
sudo journalctl -u clawdbot -f

考虑运行一次

openclaw doctor
openclaw doctor --fix

根据具体提示判断,可能需要/可能不需要运行

# 停止并禁用残留的用户级服务
systemctl --user disable --now clawdbot-gateway.service 2>/dev/null || true
systemctl --user disable --now openclaw-gateway.service 2>/dev/null || true

# 删除残留的服务文件
rm -f ~/.config/systemd/user/clawdbot-gateway.service
rm -f ~/.config/systemd/user/openclaw-gateway.service
rm -f ~/.config/systemd/user/moltbot-gateway.service

再次安装skill

npx clawhub install <插件名>
sudo systemctl restart clawdbot

后续更新步骤

🚀 标准更新流程 (SOP)

当您看到 GitHub 发布了新版本,或者想要获取新功能时,请按顺序执行:

1. 停止服务

为了防止文件锁冲突或数据库写入错误,更新前务必停止服务。

Bash

sudo systemctl stop clawdbot

2. 更新核心程序 (OpenClaw)

使用 pnpm 拉取最新版。

Bash

# 切换到 clawdbot 用户 (如果您不是用 root 跑 pnpm 的话)
# su - clawdbot
​
# 1. 更新包
pnpm add -g openclaw@latest
​
# 2. ⚠️ 关键步骤:批准构建脚本
# 每次更新核心包,大概率需要重新下载/编译底层依赖(如 sharp, llama-cpp)
pnpm approve-builds -g
​
# 如果上一步提示 skipped 或 nothing to build,为了保险可以强制 rebuild 一次
# pnpm rebuild -g

3. 更新技能 (Skills)

核心程序更新了,插件最好也跟上。

Bash

# 更新所有已安装的技能
npx clawhub update

4. 重启服务

Bash

# 切回有 sudo 的用户
sudo systemctl start clawdbot
​
# 查看日志确认启动成功
sudo journalctl -u clawdbot -f

🛠️ 进阶:自动化更新脚本 (Lazy Mode)

建议在 clawdbot 用户的目录下创建一个更新脚本 update_openclaw.sh,这样以后只需运行一个命令。

Bash

#!/bin/bash
​
echo "🦞 Stopping OpenClaw service..."
sudo systemctl stop clawdbot
​
echo "⬇️ Updating OpenClaw Core..."
# 注意:如果您是在 clawdbot 用户下安装的 global 包,不需要 sudo
pnpm add -g openclaw@latest
​
echo "🏗️ Approving builds..."
pnpm approve-builds -g
​
echo "🧩 Updating Skills..."
npx clawhub update
​
echo "🚀 Restarting Service..."
sudo systemctl start clawdbot
​
echo "✅ Done! Checking logs..."
sleep 2
sudo journalctl -u clawdbot -n 20 --no-pager

使用方法:

  1. 保存为 update.sh。
  2. 赋予执行权限:chmod +x update.sh。
  3. 以后更新只需:./update.sh。

⚠️ 注意事项

  1. 关注 “Breaking Changes”:虽然现在的名字固定为 OpenClaw 了,但项目仍在快速迭代。在执行更新前,建议先看一眼 GitHub Releases 页面,看看有没有由 ⚠️ 标记的重大变更(比如配置文件结构变更)。
  2. Doctor 是好朋友:如果更新后服务起不来,或者行为怪异,第一时间运行:Bashopenclaw doctor –fix它能自动修复大部分因版本升级导致的配置结构差异。
  3. 服务名重命名(可选):您的服务文件名目前还是 clawdbot.service。这不影响运行,但如果您有强迫症,可以在下次空闲时将其重命名为 openclaw.service,这样以后日志命令就是 journalctl -u openclaw,看起来更统一。

1. 安装

安装node环境,https://nodejs.org/en/download

图片[1]-THsInk

安装clawdbot cli

source ~/.bashrc
sudo apt install git -y
pnpm add -g moltbot@latest
moltbot onboard --install-daemon

报错

Already up to date
Progress: resolved 1, reused 0, downloaded 0, added 0, done
 WARN  moltbot has no binaries
Done in 1s using pnpm v10.28.2

发现clawdbot在今天(2026年1月27日)由于商标争议,更名为 Moltbot 了。虽然文档中已经更名,但当前仓库里的 moltbot 包可能还没配置好可执行文件。于是先使用clawdbot安装

pnpm remove -g moltbot
pnpm add -g moltbot@latest

2. 配置clawdbot / moltbot

运行引导程序(并安装服务)

clawdbot onboard --install-daemon

通常按照recommend设置,我使用比较方便的telegram bot,获取bot和claude的apikey步骤省略。建议使用官方api(anthropic、openai、google)先安装测试,后续再更换为各种低成本或白嫖api,由于后续勾选了session-memory ,因此理论上不会丢失记忆。

在Homebrew选择yes,或者直接跳过(linux环境)

Preferred node manager for skill installs 选择 pnpm

Install missing skill dependencies 跳过,或参考

技能挑选建议 (Skills)

这个列表里,带“苹果图标”或桌面软件名的统统跳过。

✅ 建议勾选 (VPS 常用/实用):

summarize: 极其好用,让 AI 帮你总结网页或长文本。

nano-pdf / nano-doc: 让 AI 具备读取你服务器上 PDF/Word 文档的能力。

openai-whisper: 如果你的 VPS 配置还行(至少 2 核 4G),选它。它能让机器人听懂你发的语音消息。

clawdhub: 方便以后直接从社区下载更多新技能。

webwatcher / blogwatcher: 让机器人监控网站变化,非常适合 VPS 挂机。

❌ 坚决不选 (选了也没用):

1password / apple-notes / apple-reminders / bear-notes: 这些是给苹果全家桶用户在本地 Mac 上用的,服务器端没这些 App。

sonoscli / openhue: 这是控制家里智能音箱和电灯的,你的 VPS 在机房里,管不到你家的灯泡。

gog / goplaces: 这些涉及桌面端游戏或本地地理位置的服务。

后续安装技能参考

moltbot skills
# 或安装具体技能
moltbot add skill <技能名称>
# 或在webui安装

安装时报错summarize — brew not installed ,等待后续配置

后续尝试修复参考

# 激活 Homebrew
test -d ~/.linuxbrew && eval "$(~/.linuxbrew/bin/brew shellenv)"
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bashrc
# 安装刚才失败的工具 
brew install go uv
## Go: 支撑 blogwatcher。
## uv: 支撑 nano-pdf(这是一个超快的 Python 包管理器)。

# 或者尝试自动修复
moltbot doctor

在Enable hooks 勾选session-memory 和 command-logger ,功能说明参考:

1. session-memory (强烈推荐)

  • 功能:这是 AI 的“长期记忆”插件。它会将你们的对话上下文、执行过的任务进度保存到本地数据库。
  • 为什么要装:如果不勾选,Moltbot 每次重启后都会“失忆”,不记得你之前让它做过什么。在 VPS 上作为守护进程(Daemon)运行时,这个功能是保证它能持续工作的灵魂。

2. command-logger (建议安装)

  • 功能:记录 AI 在你服务器上运行过的每一条 Shell 命令。
  • 为什么要装:这相当于一个“黑匣子”。在 VPS 上,AI 有时候会自主执行一些复杂的维护命令,万一系统配置被改乱了,你可以通过日志查到它到底干了什么,方便复盘或修复。

3. boot-md (可选)

  • 功能:在机器人启动时,自动生成一份 Markdown 格式的运行报告(包含版本号、已开启的技能、系统负载等)。
  • 为什么要装:如果你经常通过查看日志文件来确认机器人状态,它能提供一个很整洁的“启动简报”。

后续几个google相关服务可以跳过。

3. 配对和运行

启动测试

clawdbot gateway --verbose

此时可以在tg机器人使用 /start,获取配对码

在vps配对

clawdbot pairing approve telegram 你的配对码

设置一个systemd用来运行clawdbot

sudo nano /etc/systemd/system/clawdbot.service

如果版本路径不同,注意修改

[Unit]
Description=Clawdbot Gateway Service
After=network.target

[Service]
Type=simple
User=clawdbot
Group=clawdbot
# 这里的 PATH 非常关键,包含了 pnpm 和 node 的位置
Environment=PATH=/home/clawdbot/.local/share/pnpm:/home/clawdbot/.nvm/versions/node/v24.13.0/bin:/usr/local/bin:/usr/bin:/bin
Environment=PNPM_HOME=/home/clawdbot/.local/share/pnpm
WorkingDirectory=/home/clawdbot
# 核心启动命令
ExecStart=/home/clawdbot/.local/share/pnpm/clawdbot gateway
# 崩溃后 10 秒自动重启
Restart=always
RestartSec=10
# 标准输出和错误都会记入 journal
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

激活服务

sudo systemctl daemon-reload
sudo systemctl enable clawdbot
sudo systemctl start clawdbot

查看日志(代替 --verbose)

sudo journalctl -u clawdbot -f

现在可以通过交互设置提示词

图片[2]-THsInk

比如

“你叫 Molt,是一个冷静、专业且带点极客幽默的 AI 助手。你精通 Linux 运维和 Typescript 开发。我是你的开发者 Clawd,你的最高权限拥有者。请用简洁、直接的方式和我沟通。”

或者尝试

# Role: Molt
- Personality: 冷静、专业、极客幽默
- Expertise: Linux 运维, TypeScript 开发
- Style: 极简主义, 直接给出方案, 无需基础概念解释

# User: Clawd
- Relation: 开发者 & 最高权限拥有者
- Preference: 偏好 Zsh 语法, 代码需符合 TS 严格模式

# Rules:
1. 性能优先级最高,回复必须简洁。
2. 忽略礼貌性寒暄,直接进入技术核心。
3. 身份设定仅作为沟通语气参考,不影响技术准确性。

4.访问webui

由于我的vps运行在内网,Dashboard运行在vps的localhost,因此使用ssh隧道访问

ssh -N -L 18789:127.0.0.1:18789 clawdbot@clawdbot

之后在浏览器访问 http://localhost:18789/?token=yourtoken 即可。

对于某些有网络连通性问题的用例,有可能需要使用Tailscale/ZeroTier打洞或使用Cloudflare Zero Trust隧道。或者考虑开启公网访问,再做一下ip鉴权。

5. 使用其他api端点

之前为了便于测试,使用了claude官方api,这里为了降低使用成本,尝试使用各种‘to api’中转的openai兼容格式的自定义端点。

我通过gcli2api使用gemini-3-pro-preview时失败,提示

“Please ensure that the number of function response parts is equal to the number of function call parts of the function call turn.”

使用antigravity转api的gemini-3-pro-low和claude-sonnet-4-5均正常

以下为参考配置(部分说明可参考https://www.nodeseek.com/post-597839-1)

{
  "meta": {
    "lastTouchedVersion": "2026.1.24-3",
    "lastTouchedAt": "2026-01-27"
  },
  "wizard": {
    "lastRunAt": "2026-01-27",
    "lastRunVersion": "2026.1.24-3",
    "lastRunCommand": "doctor",
    "lastRunMode": "local"
  },
  "models": {
    "mode": "merge",
    "providers": {
      "openai-compat": {
        "baseUrl": "http://localhost2:7861/antigravity/v1",
        "apiKey": "你的apikey",
        "api": "openai-completions",
        "models": [
          {
            "id": "gemini-3-pro-low",
            "name": "Gemini 3 Pro",
            "reasoning": false,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 200000,
            "maxTokens": 8192
          },
          {
            "id": "claude-sonnet-4-5",
            "name": "Claude Sonnet 4.5",
            "reasoning": false,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 200000,
            "maxTokens": 8192
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "openai-compat/claude-sonnet-4-5",
        "fallbacks": [
          "openai-compat/gemini-3-pro-low"
        ]
      },
      "elevatedDefault": "full",
      "maxConcurrent": 4,
      "subagents": {
        "maxConcurrent": 8
      },
      "models": {
        "openai-compat/gemini-3-pro-low": {}
      }
    }
  },
  "tools": {
    "allow": [
      "exec",
      "process",
      "read",
      "write",
      "edit",
      "web_search",
      "web_fetch",
      "cron"
    ],
    "elevated": {
      "enabled": true,
      "allowFrom": {
        "telegram": [
          "你的 telegram chat id"
        ]
      }
    },
    "exec": {
      "backgroundMs": 10000,
      "timeoutSec": 1800,
      "cleanupMs": 1800000,
      "notifyOnExit": true
    }
  },
  "messages": {
    "ackReactionScope": "group-mentions"
  },
  "commands": {
    "native": "auto",
    "nativeSkills": "auto"
  },
  "hooks": {
    "internal": {
      "enabled": true,
      "entries": {
        "command-logger": {
          "enabled": true
        },
        "session-memory": {
          "enabled": true
        }
      }
    }
  },
  "channels": {
    "telegram": {
      "enabled": true,
      "dmPolicy": "pairing",
      "botToken": "你的telegram bot token",
      "allowFrom": [
        "你的telegram chat id"
      ],
      "groupPolicy": "disabled",
      "streamMode": "partial"
    }
  },
  "gateway": {
    "port": 18789,
    "mode": "local",
    "bind": "loopback",
    "auth": {
      "mode": "token",
      "token": "webui 访问 token"
    }
  },
  "skills": {
    "install": {
      "nodeManager": "pnpm"
    }
  },
  "plugins": {
    "entries": {
      "telegram": {
        "enabled": true
      }
    }
  }
}

有时可以使用 clawdbot doctor –fix 修复部分配置错误

]]>
https://www.thsink.com/notes/2518/feed/ 0