MoreRSS

site iconLala | 荒岛修改

一个应用分享、教程类的博客,主要是那些需要自部署的。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Lala | 荒岛的 RSS 预览

OpenMausBot:开源的Grok Bot替代方案

2026-11-10 06:33:22

OpenMausBot是一个开源的Grok Bot替代方案:一个受Grok Bot启发而开发的独立项目,同时也是Meta Muse、OpenAI dots的开源替代方案。它也被称为MausBot;曾用名OpenGrokBot。与xAI、Meta、OpenAI或Manus无任何关联。

侧边栏中的每个机器人都是一个真正的Agent:底层运行的是本地的Claude或Codex。它们拥有各自的个性、模型、云端计算机以及关联的应用程序。像与联系人交流一样与它们互动。观察它们的运作。批准重要的事项。

本文记录在独立服务器上部署OpenMausBot并让每个机器人拥有一台“个人电脑”的方法。

创建一个专用用户:

sudo useradd --create-home --shell /bin/bash maus

安装podman,后续每个机器人拥有的“个人电脑”就是通过podman创建出来的:

sudo apt update
sudo apt install podman

安装mise:

sudo apt install -y extrepo
sudo extrepo enable mise
sudo apt update
sudo apt install -y mise

激活mise:

echo 'eval "$(mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

为该用户启用后台运行systemd服务的能力,后续创建属于该用户的systemd服务:

sudo loginctl enable-linger maus

这里有个问题,如果用sudo切到这个用户,启用systemd用户服务的时候会报错:

Failed to connect to user scope bus via local transport: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined

最佳的做法是改用machinectl shell切换到该用户,machinectl能够建立完整的新登录会话,通常会正确设置XDG_RUNTIME_DIR等环境。如果机器找不到machinectl命令需要安装下面这个软件包:

sudo apt install -y systemd-container

然后切换到maus用户,切换的时候需要输入当前用户的密码:

machinectl shell [email protected]

使用mise安装并管理Node.js环境:

mise use -g --pin node@24

这里用mise安装的Node.js环境不影响原来用户的环境,每个用户的环境都是独立且隔离的。每个用户都需要激活mise,不要认为刚才激活过了就不用激活了:

echo 'eval "$(mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

否则你在终端使用的时候会找不到刚才安装的npm和node命令,当然不激活也可以通过mise exec这种方式使用,但太麻烦了,exec一般只用在systemd配置。

安装openmausbot和codex:

npm install --global --prefix "$HOME/.local" openmausbot@latest
npm install --global --prefix "$HOME/.local" @openai/codex@latest

这里安装的codex也是独立的,即便你原来的用户已经安装codex了,这里安装的codex也不影响之前的。个人是建议专门为openmausbot安装一个codex,不要和之前的混用。

--prefix是可选的,但建议使用。如果不配置会使用npm当前的全局安装前缀。通过mise管理Node.js,它通常会跟随对应的Node.js版本安装目录,可以查看实际值:

npm prefix -g

一般输出的内容类似:

/home/maus/.local/share/mise/installs/node/24.22.2

使用这个参数的好处是更新或切换mise的Node.js版本后,应用安装路径仍然固定。有些Linux系统没有将这个路径加入PATH,安装后找不到openmausbot和codex的话需要自己添加一下:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

确保两个命令都能执行且有输出:

openmausbot --help
codex --version

创建systemd用户服务,准备目录:

mkdir -p ~/.config/systemd/user

创建配置文件:

nano ~/.config/systemd/user/openmausbot.service

写入如下内容:

[Unit]
Description=OpenMausBot server
After=network-online.target

[Service]
WorkingDirectory=/home/maus
Environment=HOME=/home/maus
ExecStart=/usr/bin/mise exec -- /home/maus/.local/bin/openmausbot serve --port 8799 --public-url https://maus.example.com --no-pair
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

启动并设置开机自启:

systemctl --user enable --now openmausbot

使用如下命令获取登录令牌,有效期5分钟:

openmausbot pair --label "Windows Chrome"

[可选]配置Nginx反向代理,使用exit命令退出当前的maus用户,安装Nginx:

sudo apt install nginx python3-certbot-nginx

新建站点配置文件:

sudo nano /etc/nginx/sites-available/openmausbot

写入如下内容:

map $http_upgrade $omb_connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    server_name maus.example.com;

    gzip off;
    client_max_body_size 0;

    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $omb_connection_upgrade;

    proxy_buffering off;
    proxy_cache off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;

    location /hooks/ {
        proxy_pass http://127.0.0.1:8800;
    }

    location / {
        proxy_pass http://127.0.0.1:8799;
    }
}

检查配置、启用站点、签发证书:

sudo nginx -t
sudo ln -s /etc/nginx/sites-available/openmausbot /etc/nginx/sites-enabled/openmausbot
sudo certbot --nginx

配置机器人的“私人电脑”,在Web UI按照步骤操作就行:

然后选择这里的私有桌面:

随便测试一下:

目前OpenMausBot支持三种方式让机器人拥有自己的电脑:一种是本文介绍的,通过podman创建的容器。还有一种是直接让机器人去操控你的宿主机或者其它VPS,我不太推荐这种方式,因为风险不可控,所以本文没有介绍这种方式,如果你想用这种方式,可以参考官方的文档配置。最后一种就是花钱买他们的那个Boat云服务。

smolvm:为AI智能体打造、可分支的微型虚拟机

2026-11-09 09:35:22

如果要运行未知的代码或者让Coding Agent做一些高风险的操作,怕污染宿主机、把宿主机搞坏,这个项目就非常适合了。你可以通过一段提示词或者skill让Coding Agent在smolvm虚拟机内操作。

让Coding Agent在smolvm虚拟机内操作,可以理解为两种食用方式:一种是直接将Coding Agent安装在smolvm虚拟机,还有一种是Coding Agent安装在宿主机,让它从宿主机控制虚拟机。我更倾向于后者这种方式。

安装smolvm:

echo 'deb [trusted=yes] https://smol-machines.github.io/smolvm/apt ./' \
  | sudo tee /etc/apt/sources.list.d/smolvm.list

sudo apt update
sudo apt install smolvm

初次使用可能会遇到这个问题:start machine: kvm permission denied: Cannot access /dev/kvm (permission denied) 将当前用户添加到kvm组:

sudo usermod -aG kvm "$USER"

建议在执行usermod后,退出SSH重新登录,让组权限生效,如果你要让当前的shell立即生效:

newgrp kvm

用这个命令立即生效可能会有副作用:在这个shell中新建的文件会归kvm组。如果想保持原来的主组,同时获得KVM权限,退出SSH,再重新登录即可。

# 创建机器;sleep infinity让环境持续运行
smolvm machine create \
  --name ubuntu \
  --image ubuntu:24.04 \
  --cpus 2 \
  --mem 2048 \
  --net \
  -- sleep infinity

# 启动机器,首次需要下载镜像
smolvm machine start --name ubuntu

# 进入 Ubuntu 终端
smolvm machine exec --name ubuntu -it -- /bin/bash

#输入 exit 退出终端,机器仍会继续运行。以后重新进入
smolvm machine exec --name ubuntu -it -- /bin/bash

这里的ubuntu:24.04是精简的OCI镜像。smolvm启动自己的Linux内核和管理进程,再运行镜像里的工作负载;我们指定的工作负载是sleep infinity,用来保持环境运行,也就是说这个系统内没有systemd。

如果你需要使用支持systemd的系统,可以用这个第三方维护的镜像:

# 不要在创建命令后加-- sleep infinity让它使用镜像默认的systemd启动命令
smolvm machine create \
  --name ubuntu-systemd \
  --image docker.io/jrei/systemd-ubuntu:24.04 \
  --cpus 2 \
  --mem 2048 \
  --net

# 启动机器,首次需要下载镜像
smolvm machine start --name ubuntu-systemd

# 进入 Ubuntu 终端
smolvm machine exec --name ubuntu-systemd -it -- /bin/bash

数据保存在宿主机磁盘上,可以用命令查询任意机器的数据目录:

smolvm machine data-dir --name ubuntu-systemd

配置端口转发。端口转发的格式是“宿主机端口:虚拟机端口”。例如:

8080:80:访问宿主机的8080,转到虚拟机的80端口。
2222:22:访问宿主机的2222,转到虚拟机的22端口。

具体配置:

# 停止虚拟机
smolvm machine stop --name ubuntu-systemd

# 添加端口转发:
smolvm machine update --name ubuntu-systemd \
  -p 8080:80 \
  -p 2222:22

# UDP映射加/udp即可,例如停机后添加:
smolvm machine update --name ubuntu-systemd -p 27015:27015/udp

# 删除端口转发:
smolvm machine update --name ubuntu-systemd --remove-port 8080:80

# 允许其他电脑通过宿主机IP访问映射端口
SMOLVM_PUBLISH_ADDR=0.0.0.0 \
  smolvm machine start --name ubuntu-systemd

# 查看配置
smolvm machine status --name ubuntu-systemd

如果不配置SMOLVM_PUBLISH_ADDR=0.0.0.0则默认使用127.0.0.1,也就是说只有宿主机自己能访问虚拟机,如果你的宿主机是一台远程服务器,那么你本地是访问不了的,在这种情况下必须配置SMOLVM_PUBLISH_ADDR=0.0.0.0,你才可以通过宿主机的公网IP访问到虚拟机内的服务。

smolvm有两种主要网络方式:

TSI:不创建普通虚拟网卡,通过宿主机代为完成TCP/UDP通信。因此可以上网,但看不到eth0。也就是虚拟机内只有lo和dummy0。

virtio-net:提供虚拟网卡,流量经过宿主机上的smolvm网络栈转发,虚拟机内存在eth0。

未明确指定后端时,普通CLI创建的、只需要出站联网的机器通常选择TSI;设置了SMOLVM_PUBLISH_ADDR、配置了端口映射或加入命名网络等情况,会默认选择virtio-net。

如果你希望两台机器通过不同IP能够互相访问,则需要加入同一个命名网络。新建时这样配置:

smolvm machine create --name ubuntu-a \
  --image docker.io/jrei/systemd-ubuntu:24.04 \
  --cpus 2 --mem 2048 --network lab

smolvm machine create --name ubuntu-b \
  --image docker.io/jrei/systemd-ubuntu:24.04 \
  --cpus 2 --mem 2048 --network lab

smolvm machine start --name ubuntu-a
smolvm machine start --name ubuntu-b

同一命名网络内会分配不同的100.96.N.2地址,并支持按IP互通;地址可能随停止、启动变化,目前没有自动的机器名解析。

配置虚拟机的磁盘容量,这里要区分两个参数:

--storage:默认20GB,保存OCI镜像层、镜像工作负载的持久化修改以及/workspace等数据。

--overlay:默认10GB,用于smolvm基础系统根文件系统的持久化写入层。

对于用OCI镜像创建的Ubuntu,安装软件、写入/home、/var等普通目录所需的空间,主要看–storage。不要把两个容量简单相加,理解成一个 Ubuntu根分区。创建时,例如配置80GB存储:

smolvm machine create \
  --name ubuntu-big \
  --image docker.io/jrei/systemd-ubuntu:24.04 \
  --cpus 2 \
  --mem 2048 \
  --storage 80 \
  --overlay 10 \
  --net

已有的虚拟机例如:ubuntu-systemd,是不需要重新创建的,可以直接扩容,虚拟机无需停机,使用:

smolvm machine resize --name ubuntu-systemd --storage 80

这里的80是扩容后的总容量,不是再增加80GB。在线扩容要求运行时支持,如果提示不支持可以停机扩容。

平时我们也不需要了解太多的东西,记住一些常用的操作命令就行了:

# 停止机器
smolvm machine stop --name ubuntu

# 再次启动
smolvm machine start --name ubuntu

# 删除机器
smolvm machine delete --name ubuntu

让Coding Agent把这些约定写进项目根目录的AGENTS.md:

本项目使用 smolvm 作为开发执行环境,请完成环境准备后再开始开发。

要求:
1. 先检查项目技术栈、现有 AGENTS.md 和宿主机 smolvm 的状态。
2. 为当前项目创建或复用专用虚拟机,不使用其他项目的机器。
3. 根据项目选择合适的镜像,配置合适的虚拟机磁盘容量。
4. 代码可以通过当前工作区直接修改;依赖安装、项目脚本、
   格式检查、构建、测试及开发服务都在虚拟机内执行。
5. 宿主机仅执行项目文件操作、Git 和 smolvm 管理命令。
6. 需要预览时选择空闲的宿主机端口;服务在虚拟机内监听
   0.0.0.0,映射端口默认只供宿主机本机访问。
7. 如果虚拟机执行遇到问题,先排查,不要自动退回宿主机
   安装依赖或运行项目。
8. 将机器名称、镜像、挂载、端口和常用命令记录到项目中,
   让后续会话可以继续使用。完成后保留开发环境和数据。

官方也提供了很多skill:https://github.com/smol-machines/smolvm/blob/main/docs/llms.txt

Debian 13配置Nginx启用HTTP/3

2026-11-06 06:33:51

我升级到Debian 13后发现Nginx的版本是1.26.3,这个版本我没记错的话是支持HTTP/3的,然后看了一下编译参数,正好包含:--with-http_v3_module

这就意味着无需重新安装或编译Nginx。启用HTTP/3只需要添加QUIC监听和协议通告配置就行了,特别简单。

假设给一个WordPress站点配置HTTP/3,编辑站点的vhost配置文件:

nano /etc/nginx/sites-available/wordpress

在现有HTTPS的server { ... }中增加如下内容:

# 现有 HTTPS:TCP 443 不做修改
listen 443 ssl;
listen [::]:443 ssl ipv6only=on;
http2 on;

# 新增 HTTP/3:UDP 443
listen 443 quic reuseport;
listen [::]:443 quic reuseport;
http3 on;

# 告诉浏览器该站点支持 HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400' always;

WordPress站点已经设置reuseport后,如果你还有其它站点,那么这些站点就不用配置reuseport了,同一个地址、端口的socket参数只能指定一次。

另外一个站点:

nano /etc/nginx/sites-available/website2

只需要配置:

listen 443 quic;
listen [::]:443 quic;
http3 on;

add_header Alt-Svc 'h3=":443"; ma=86400' always;

还有一个需要注意的点是,HTTP/3只能使用TLS1.3,如果你没有配置TLS1.3则需要添加:

ssl_protocols TLSv1.2 TLSv1.3;

如果使用Certbot管理Nginx的证书则不存在这个问题,Certbot维护的/etc/letsencrypt/options-ssl-nginx.conf默认就启用了TLSv1.3。

检查配置:

nginx -t

平滑加载:

systemctl reload nginx

可以使用这个网站检查:https://http3check.net

Debian 11升级到Debian 13

2026-11-05 18:56:23

一直拖着,最终还是得升,记录下步骤和遇到的问题解决办法。升级前建议先备份一下,我是在Hetzner创建了一个VPS的快照。从11升级到13,必须先升级到12,再从12升到13。也就是:11 → 12 → 13。而不是:11 → 13。

跨版本升级最好先把当前版本的系统更新到最新。且Debian 11已经EOL,现有软件源不能用的话,就先换成Debian的archive仓库:

nano /etc/apt/sources.list

改成下面列出的内容,main contrib non-free这些套件根据自己的需要配置:

deb [check-valid-until=no] https://archive.debian.org/debian bullseye main contrib non-free
deb [check-valid-until=no] https://archive.debian.org/debian bullseye-updates main contrib non-free
deb [check-valid-until=no] https://archive.debian.org/debian-security bullseye-security main contrib non-free

先把Debian 11更新到最新:

apt update
apt full-upgrade
reboot

重启后安装tmux,后续升级在tmux会话中进行:

apt update
apt install tmux
tmux new -s debian-upgrade

如果ssh中断,可以用这个命令回到之前的会话:

tmux attach -t debian-upgrade

编辑sources.list:

nano /etc/apt/sources.list

将Debian archive条目替换为:

deb https://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb https://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
deb https://deb.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

接下来修改/etc/apt/sources.list.d目录内的第三方软件源。

我目前有sury的PHP软件源,Docker软件源,还有一个CrowdSec的软件源。这其中值得注意的是CrowdSec的源,因为他们使用的是any any main,所以无需替换发行版名称,也就是保持默认即可不做修改:

deb [signed-by=/etc/apt/keyrings/crowdsec_crowdsec-archive-keyring.gpg] https://packagecloud.io/crowdsec/crowdsec/any any main
deb-src [signed-by=/etc/apt/keyrings/crowdsec_crowdsec-archive-keyring.gpg] https://packagecloud.io/crowdsec/crowdsec/any any main

修改sury的PHP软件源:

nano /etc/apt/sources.list.d/php.list

将bullseye改为bookworm:

deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ bookworm main

修改Docker软件源:

nano /etc/apt/sources.list.d/docker.list

将bullseye改为bookworm:

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable

由于我用的Hetzner云服务器,Hetzner会额外配置两个自己的候选软件源,在这里都需要禁用掉。

一个是hetzner-mirror.list:

nano /etc/apt/sources.list.d/hetzner-mirror.list

注释:

# deb http://mirror.hetzner.com/debian/packages bullseye main contrib non-free
# deb http://mirror.hetzner.com/debian/packages bullseye-updates main contrib non-free

还有一个hetzner-security-updates.list:

nano /etc/apt/sources.list.d/hetzner-security-updates.list

注释:

# deb http://mirror.hetzner.com/debian/security bullseye-security main contrib non-free

有人可能会担心,这样升级的话会不会导致PHP版本也跟着一起升了?实际上是不会的,例如我现在用的是PHP7.4,升级后还是PHP7.4。升级前可以先查看一下PHP的候选版本:

apt update
apt-cache policy php7.4-fpm php7.4-common php7.4-mysql

PHP7.4的候选包来自Sury的Debian 12构建。所以不要为了保留PHP7.4而锁住旧的Debian 11构建,新系统需要匹配新的依赖,你要把包给锁了那相反还会出问题。

升级前先停止数据库:

systemctl stop mariadb

先执行最小升级,完成后再进行完全升级:

apt update
apt upgrade --without-new-pkgs
apt full-upgrade

期间弹这个出来就选yes:

弹这个就选keep the local version currently installed:

弹这个就直接按回车或者输入N按回车:

然后不出意外的话就要出意外了,Nginx报错了:

测试下Nginx配置,也是报错:

初步发现是Nginx的Lua模块在升级的时候被卸载了,遂重新安装一下:

apt install libnginx-mod-http-lua libnginx-mod-http-ndk

结果安装过程中又报错了,而且是连锁依赖错误,看到这里头都是大的:

确认Lua、NDK的模块文件和加载链接是否齐全:

原因很明显了,Lua模块已经在磁盘上,但它的加载链接被改名为50-mod-http-lua.conf.removed。Nginx只加载*.conf所以跳过了它。NDK的加载链接正常。所以只需要把文件名给恢复:

mv -i /etc/nginx/modules-enabled/50-mod-http-lua.conf.removed /etc/nginx/modules-enabled/50-mod-http-lua.conf

完成尚未配置的软件包并进行必要的检查和服务重启:

dpkg --configure -a
apt-get check
dpkg --audit
systemctl restart nginx
systemctl is-active nginx

其中check和audit预期应该是没有任何输出。事后让Codex分析了一下原因:

现在已经将系统从Debian 11升级到Debian 12了,建议重启一遍:

reboot

重启后继续按Debian 12 → 13(trixie)的路线来升级。编辑sources.list:

nano /etc/apt/sources.list

将软件源从bookworm切换到trixie:

deb https://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb https://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
deb https://deb.debian.org/debian-security trixie-security main contrib non-free non-free-firmware

修改sury的PHP软件源:

nano /etc/apt/sources.list.d/php.list

将bookworm改为trixie:

deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ trixie main

修改Docker软件源:

nano /etc/apt/sources.list.d/docker.list

将bookworm改为trixie:

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian trixie stable

升级前先停止数据库:

systemctl stop mariadb

在tmux会话内先执行最小升级,完成后再进行完全升级:

tmux new -s upgrade13
apt update
apt upgrade --without-new-pkgs
apt full-upgrade

如果弹这个就选keep the local version currently installed:

完成后重启并清理不再需要的软件包:

reboot
apt autoremove

升级到Debian 13后的一些问题。

原先的bbr配置不生效了?这是由于从13起不再使用/etc/sysctl.conf配置文件,升级上来的系统会保留:/etc/sysctl.conf.dpkg-bak。可以将/etc/sysctl.conf.dpkg-bak里面的内容移到/etc/sysctl.d/。

创建配置文件:

nano /etc/sysctl.d/99-bbr.conf

写入:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

应用配置:

sysctl -p /etc/sysctl.d/99-bbr.conf

验证:

sysctl net.core.default_qdisc net.ipv4.tcp_congestion_control

找不到last命令了,这是Debian 13的正式变更:util-linux不再提供旧版last,改用基于SQLite的wtmpdb,以避免旧日志格式的2038年时间限制。如果要用last命令,需要手动安装:

apt install wtmpdb libpam-wtmpdb

Nginx配置检查有一大堆弃用警告:

意思是旧的HTTP/2写法已被弃用,目前仍兼容:

listen 443 ssl http2;

新版推荐在同一个server { ... }中改为:

listen 443 ssl;
http2 on;

IPv6的listen行也类似处理;每个server中只需写一次http2 on。

T3 Code:开源AI编程Agent管理平台部署

2026-10-27 15:19:38

T3 Code是一款免费开源的AI编程Agent管理平台,支持Codex、Claude Code、OpenCode等多种Coding Agent。本文详细介绍T3 Code 的安装部署、WebUI访问及服务器配置方法,帮助你搭建自己的AI编程开发环境。

T3 Code不是Coding Agent Harness,它的核心职责是统一控制和编排Coding Agent,并支持跨平台使用,目标是打造一款高性能、支持远程办公且真正开源的产品。

本文将T3 Code部署在Debian 13服务器上,通过Web UI访问,接入Codex。

创建一个普通用户,后续使用该用户运行t3code,已有普通用户的可跳过该步骤:

sudo adduser imlala
sudo usermod -aG sudo imlala

重新使用新的用户登录ssh,安装mise:

sudo apt install -y extrepo
sudo extrepo enable mise
sudo apt update
sudo apt install -y mise

激活mise:

echo 'eval "$(mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

使用mise安装Node.js:

mise use -g --pin node@24

安装Codex CLI:

npm install -g @openai/codex

1.如果已经安装了Codex CLI可以跳过。
2.如果不打算使用Codex CLI可以跳过。
3.不手动安装,稍后也可以让T3 Code去帮你安装Codex CLI。
4.我建议在这里手动安装,不要将Codex CLI这个Coding Agent和T3 Code深度绑定。

如果是首次安装Codex CLI,需要先登录你的ChatGPT账号,以便后续使用你账号内的订阅:

codex login --device-auth

查看登录状态,确保输出是:Logged in using ChatGPT

codex login status

安装T3 Code:

npm install -g t3@latest

配置后台常驻运行,创建systemd用户服务需要用到的目录:

mkdir -p ~/.config/systemd/user

执行下面的命令T3 Code将自动安装并配置systemd用户服务:

t3 service install

查看状态,确保正常:

t3 service status

systemd用户服务在你退出登录后(SSH终端、桌面等)会自动停止,执行下面的命令启用用户服务在退出登录后继续运行的能力,将用户名改为你自己的:

sudo loginctl enable-linger imlala

接下来配置反向代理,安装NGINX、Certbot:

sudo apt install -y nginx python3-certbot-nginx

新建NGINX站点配置文件:

sudo nano /etc/nginx/sites-available/t3code

写入如下内容:

map $http_upgrade $t3_connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    listen [::]:80;
    server_name t3code.example.com;

    client_max_body_size 0;

    location / {
        proxy_pass http://127.0.0.1:3773;
        proxy_http_version 1.1;

        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $t3_connection_upgrade;

        # 实时消息与长连接
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

启用站点:

sudo ln -s /etc/nginx/sites-available/t3code /etc/nginx/sites-enabled/t3code

检查配置、签发证书:

sudo nginx -t
sudo certbot --nginx

获取T3 Code登录令牌,令牌默认有效期5分钟,5分钟没使用则需要重新生成:

t3 pair

在Web UI使用刚才的令牌登录,登录有效期默认30天,如果你清理浏览器的Cookie缓存则立即失效:

T3 Code令牌和登录会话管理:

# 查看活动登录会话
t3 auth session list

# 撤销指定会话,将ID替换为上面列出的sessionId
t3 auth session revoke id

# 查看仍有效的登录令牌
t3 auth pairing list

# 撤销指定登录令牌
t3 auth pairing revoke id

登录进去后,在向导这里需要注意:

如果之前已经安装并登录了Codex CLI,这里直接点Continue,不需要点击Use existing CLI进行配置,正常情况下T3 Code会自动识别Codex CLI环境。如果没有手动安装Codex CLI,则这里的Continue with ChatGPT不仅仅指登录你的ChatGPT账号使用账号内的订阅,而是由T3 Code帮你安装并管理一个Codex CLI环境。

向导完成后,只需要确保这里识别到Codex CLI就行了:

现在就可以使用了:

我用了一段时间,咱不吹不黑,反正我个人觉得T3 Code是挺好用的。而且这里只介绍了最基本的能力,实际上T3 Code还可以管理多台机器上的Coding Agent,就小鸡挂探针这个架构你懂吧,一台机器装T3 Code,其它的机器装各种各样的Coding Agent,然后统一使用T3 Code去管理。目前类似T3 Code这样的开源项目还有几个也做的还可以,但是我还没实际体验过,所以就不怎么好评价了,有机会我会部署一下然后进行对比。

Debian 11 EOL更新系统并修复PHP高危漏洞

2026-10-21 23:58:27

今天PHP爆了两个高危漏洞:CVE-2026-109618、CVE-2026-109619,本站受影响,第一时间维护并着手更新。顺带把之前的一些问题一并解决了,记录下过程用于备忘。

我这个破站运行在Debian 11,因为一些历史遗留问题一直没更新到新系统,Debian 11已经停止支持了,官方不再为其提供安全更新,所以这不是一个好的示范,如果有能力应该还是升级系统。但好在我的PHP是通过sury的仓库安装的,不得不说sury真的是一个特别敬业的软件包维护者,他几乎与PHP上游同一时间发布了修复漏洞后的PHP软件包,包括向后移植的旧版本。

执行apt dist-upgrade报错,原因是Debian 11已经EOL了,Debian官方会把仓库归档,虽然Hetzner的系统模板会配置一个自家的镜像源,但这个镜像源也是404的状态:

Ign:1 http://security.debian.org/debian-security bullseye-security/main amd64 dpkg amd64 1.20.14
Ign:2 http://security.debian.org/debian-security bullseye-security/main amd64 libc-bin amd64 2.31-13+deb11u14
Err:1 http://mirror.hetzner.com/debian/security bullseye-security/main amd64 dpkg amd64 1.20.14
  404  Not Found [IP: 2a04:4e42:6e::644 80]
Err:2 http://mirror.hetzner.com/debian/security bullseye-security/main amd64 libc-bin amd64 2.31-13+deb11u14
  404  Not Found [IP: 2a04:4e42:6e::644 80]

解决办法就是编辑sources.list:

nano /etc/apt/sources.list

将Debian源统一替换为以下归档配置:

deb [check-valid-until=no] https://archive.debian.org/debian bullseye main contrib non-free
deb [check-valid-until=no] https://archive.debian.org/debian bullseye-updates main contrib non-free
deb [check-valid-until=no] https://archive.debian.org/debian-security bullseye-security main contrib non-free

这些对应Debian官方的更新归档和安全归档。Hetzner的镜像源可以不做修改,因为两边的优先级都是500,如果不放心可以将其注释掉以禁用。

Hetzner镜像源:

nano /etc/apt/sources.list.d/hetzner-mirror.list

注释掉:

# deb http://mirror.hetzner.com/debian/packages bullseye main contrib non-free
# deb http://mirror.hetzner.com/debian/packages bullseye-updates main contrib non-free

Hetzner安全更新镜像源:

nano /etc/apt/sources.list.d/hetzner-security-updates.list

注释掉:

# deb http://mirror.hetzner.com/debian/security bullseye-security main contrib non-free

第二个问题是Sury PHP仓库的签名密钥过期:

下载并安装最新的官方密钥包:

curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
dpkg -i /tmp/debsuryorg-archive-keyring.deb

编辑Sury PHP仓库配置文件:

nano /etc/apt/sources.list.d/php.list

改用新密钥路径:

deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ bullseye main

现在就可以更新系统了:

apt update
apt dist-upgrade

更新的过程中又报错了,CrowdSec的安装配置未完成,看样子单纯是网络问题:

Hub 规则下载返回 503
        ↓
CrowdSec 安装后脚本失败,配置流程中断
        ↓
本地 API(LAPI)未能恢复服务
        ↓
bouncer 连接 127.0.0.1:8088 被拒绝
        ↓
bouncer 启动失败并反复重试

重试CrowdSec规则更新,理想结果,第4条命令不再报错,第5条命令没有输出:

cscli hub update
cscli hub upgrade
dpkg --configure crowdsec
dpkg --configure -a
dpkg --audit

至此系统更新完成。在这次系统更新完成的时候Sury仓库还没有发布新的软件包更新,所以我是等到发布后,又更新了一遍:

apt update
apt dist-upgrade

收到了新的更新:

根据Sury的更新记录,7.4.33-31包含这两个CVE的回移修复,更新记录明确写着:

* Backported from 8.2.35
  + [CVE-2026-109618, CVE-2026-109619]: Avoid state corruption via
    bailout.

更新完成后重启PHP-FPM:

systemctl restart php7.4-fpm

对于有使用旧版本PHP需求的,我非常推荐使用Sury的仓库,该仓库作者本身就一直是Debian/Ubuntu官方PHP软件包的维护者,也是得益于他的细心且负责任的维护才让我们的一些老旧程序(垃圾程序)能够安全的运行,再次感谢Sury!另外,从这个事件也能够看出来CrowdSec在这块就是个玩具级别,漏洞它是拦不了的(waf不能第一时间出vpath),阻碍正常的系统更新是有一套。(bushi