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云服务。
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
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
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。
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这样的开源项目还有几个也做的还可以,但是我还没实际体验过,所以就不怎么好评价了,有机会我会部署一下然后进行对比。
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