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
2026-10-20 21:06:07
记录下DeepSeek Harness安装、反向代理、接入ChatGPT订阅、MCP配置等。
机器配置:OVH-KS-LE-B
操作系统:OVH官方Debian 13模板,无桌面环境
登录方式:SSH密钥
默认用户:debian
这个系统模板不允许SSH密码登录,也不允许用root账号登录SSH,用默认的debian用户登录上去后,创建自己喜欢的新用户:
sudo adduser imlala
按提示设置密码,姓名等信息可以直接回车跳过,系统会自动创建。之后赋予sudo权限:
sudo usermod -aG sudo imlala
复用同一把私钥,就不需要重新生成密钥了:
sudo install -d -m 700 -o imlala -g imlala /home/imlala/.ssh
sudo install -m 600 -o imlala -g imlala \
/home/debian/.ssh/authorized_keys \
/home/imlala/.ssh/authorized_keys
建议退出终端重新使用新的用户登录,而不是使用su等命令切换,主要是验证一下你的SSH密钥是否配置正确。登录成功后,旧的这个debian用户如不需要可以删掉。
安装xdg-user-dirs:
sudo apt install xdg-user-dirs
执行如下命令进行设置,如果你的系统是带桌面环境的(KDE、GNOME等),一般情况下可以省略这些步骤:
mkdir -p "$HOME/Documents"
xdg-user-dirs-update --set DOCUMENTS "$HOME/Documents"
xdg-user-dir DOCUMENTS
这个是为了解决DeepSeek Harness在首次启动时无法创建默认工作区的问题。服务器系统普遍过于精简且不带桌面环境,会缺少这个包和相关设置。
安装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和pnpm:
mise use -g --pin node@24 pnpm@10
-g:全局安装,--pin:固定精确版本,这里额外装一个pnpm包管理器是因为DeepSeek Harness内部安装插件需要用到。经常搞前端开发的肯定也知道pnpm本身就是另一个包管理器,如果你想直接用pnpm安装DeepSeek Harness也是可以的,只是后续编写systemd配置文件的时候会麻烦一点,你可能需要配置它自己的全局命令目录和PATH,而用Node.js自带的npm的话就没这些问题。
所以这里我还是图简单就用npm安装DeepSeek Harness:
npm install -g @deepseek-ai/[email protected]
接下来为DeepSeek Harness创建systemd用户服务,注意这里是用户服务,创建用户服务需要使用这个目录:
~/.config/systemd/user
新建的用户默认不一定有这个目录,如果没有得先创建:
mkdir -p ~/.config/systemd/user
创建DeepSeek Harness的systemd用户服务配置文件:
nano ~/.config/systemd/user/dsh.service
写入如下内容:
[Unit]
Description=DSH Web
[Service]
Type=simple
WorkingDirectory=%h
ExecStart=/usr/bin/mise exec -- dsh web --no-open --host 127.0.0.1 --port 3080 --public-url https://dsh.example.com/ --trusted-host dsh.example.com
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
[Install]
WantedBy=default.target
注意修改域名:
--public-url #设置外部访问地址。
--trusted-host #允许该域名通过DSH的Host校验。
启动并设置开机自启:
systemctl --user enable --now dsh
systemd用户服务在你退出登录后(终端、桌面等)会自动停止,执行下面的命令启用用户服务在退出登录后继续运行的能力:
sudo loginctl enable-linger imlala
接下来配置反向代理,安装NGINX、Certbot、htpasswd:
sudo apt install -y nginx python3-certbot-nginx apache2-utils
DeepSeek Harness的Web UI自带令牌验证,如果不放心可以再加一个basic auth,设置账号密码:
sudo htpasswd -cB /etc/nginx/dsh.htpasswd admin
sudo chown root:www-data /etc/nginx/dsh.htpasswd
sudo chmod 640 /etc/nginx/dsh.htpasswd
新建NGINX站点配置文件:
sudo nano /etc/nginx/sites-available/dsh
写入如下内容:
map $http_upgrade $dsh_connection_upgrade {
default upgrade;
'' close;
}
# 不记录查询参数,避免启动链接中的token写入访问日志
log_format dsh_no_query
'$remote_addr - $remote_user [$time_local] '
'"$request_method $uri $server_protocol" $status $body_bytes_sent';
server {
listen 80;
listen [::]:80;
server_name dsh.example.com;
access_log /var/log/nginx/dsh.access.log dsh_no_query;
error_log /var/log/nginx/dsh.error.log;
client_max_body_size 0;
auth_basic "DSH";
auth_basic_user_file /etc/nginx/dsh.htpasswd;
location / {
proxy_pass http://127.0.0.1:3080;
proxy_http_version 1.1;
# 保留浏览器访问的域名和端口
proxy_set_header Host $http_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;
# WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $dsh_connection_upgrade;
# Basic 认证由 Nginx 完成,不把该密码头传给 DSH
proxy_set_header Authorization "";
# HTTPS 在 Nginx 终止,为后端 Cookie 添加 Secure
proxy_cookie_flags ~ secure;
# 支持流式响应和长连接
proxy_buffering off;
proxy_cache off;
proxy_connect_timeout 10s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
启用站点:
sudo ln -s /etc/nginx/sites-available/dsh /etc/nginx/sites-enabled/dsh
检查配置、签发证书:
sudo nginx -t
sudo certbot --nginx
查看DeepSeek Harness的Web UI访问链接:
sudo journalctl _SYSTEMD_USER_UNIT=dsh.service -f
给DeepSeek Harness接入浏览器自动化工具,这里我采用Playwright MCP + 无头Chromium的方式。无头浏览器在服务器后台运行,可以打开网页、点击、填写表单和截图等操作,无需安装桌面,只是服务器系统没有桌面普遍会缺少中文字体,安装一个中文字体可以避免网页截图中文字显示成方块。
安装Chromium和中文字体:
sudo apt update
sudo apt install -y chromium chromium-sandbox fonts-noto-cjk
添加MCP配置:
nano ~/.dsh/profiles/web/cordis.patch.yml
把下面内容作为一个新的列表项追加进去,保留原有配置。如果文件只有[],则用下面内容替换:
- insert:
- id: mcp-playwright
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: playwright
transport: stdio
command: npx
args:
- '-y'
- '@playwright/mcp@latest'
- '--headless'
- '--executable-path'
- '/usr/bin/chromium'
toolCallTimeoutMs: 120000
failOnStartupError: false
把ChatGPT / Codex订阅直接接入DeepSeek Harness,我推荐用这个dsh-codex-subscription插件:
dsh plugin --profile web add [email protected]
DeepSeek Harness有热更新能力,安装完成后无需重启,打开Web UI找到设置-Codex订阅-添加账号-设备代码登录。不要使用浏览器登录,这个在我们当前的环境是无法登录成功的,我们是部署在服务器上供远程访问使用,这里的浏览器登录是使用xdg-open打开本地浏览器,也就是服务器上的浏览器。
用ChatGPT Plus订阅,建议把这个subagent(子智能体)的功能给关了,不然你5小时的额度跑个稍微大一点的任务,20分钟就能给你干光:
注意不是上面的Codex子智能体,是子智能体,在里面按图设置:
DeepSeek Harness位于反向代理之后可能会遇到这个问题:#7206
安装下面的插件可解决,如该插件不兼容最新版可以在网上搜索一下,有很多同类替代品:
dsh plugin --profile web add @exagone313/[email protected]
systemctl --user restart dsh
更新大骚货:
npm install -g @deepseek-ai/dsh@目标版本号
不想用大骚货了?卸载并删除所有相关数据:
systemctl --user disable --now dsh.service
npm uninstall -g @deepseek-ai/dsh
rm -rf -- "$HOME/.dsh"
rm ~/.config/systemd/user/dsh.service
systemctl --user daemon-reload
补充记录一点内容,之前查看用户systemd服务日志的命令是:
sudo journalctl _SYSTEMD_USER_UNIT=dsh.service -f
这其实是不太合理的,按道理来说应该使用这个命令看,因为这是用户自己的服务:
journalctl --user -u dsh.service
用户自己的服务日志还需要用sudo去提权才能看这不是倒反天罡了,我这个系统当时是有点问题,用上面的命令报错:
Hint: You are currently not seeing messages from the system.
Users in groups 'adm', 'systemd-journal' can see all messages.
Pass -q to turn off this notice.
No journal files were opened due to insufficient permissions.
和AI周旋了一下解决了,根本原因是系统把所有journal日志都存内存里面了,上面这个提示具有迷惑性,看似是权限问题。先用这个命令检查现有配置:
systemd-analyze cat-config systemd/journald.conf
如下:
# /etc/systemd/journald.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file (or a copy of it placed in
# /etc/ if the original file is shipped in /usr/), or by creating "drop-ins" in
# the /etc/systemd/journald.conf.d/ directory. The latter is generally
# recommended. Defaults can be restored by simply deleting the main
# configuration file and all drop-ins located in /etc/.
#
# Use 'systemd-analyze cat-config systemd/journald.conf' to display the full config.
#
# See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=0
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#MaxLevelSocket=debug
#LineMax=48K
#ReadKMsg=yes
#Audit=yes
# /usr/lib/systemd/journald.conf.d/syslog.conf
# Undo upstream commit 46b131574fdd7d77 for now. For details see
# http://lists.freedesktop.org/archives/systemd-devel/2014-November/025550.html
[Journal]
ForwardToSyslog=yes
说明:
Storage=auto:存在/var/log/journal就持久化,否则只存内存。
SplitMode=uid:已经默认按用户拆分,无需另外开启。
ForwardToSyslog=yes:只是转发日志,与这个读取权限问题无关。
确认这个目录是否存在:/var/log/journal
ls -ld /var/log/journal /run/log/journal
/var/log/journal不存在这就解释得通了,内存日志不支持按用户拆分:
创建目录并切换到持久化即可:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo journalctl --flush
现在就可以不加sudo用journalctl命令查看用户自己的systemd服务日志了。
还有刚才的ForwardToSyslog=yes这个设置,意思是向syslog接口转发日志,但系统根本没有安装rsyslog软件包,也就是说系统重启后:启动日志、内核日志、服务日志都会消失。而现在已启用持久化,systemd收集到的启动日志、内核日志、服务日志,都可以用journalctl查看,保存下来的记录也能跨重启查询。
内核、systemd服务等日志
↓
journald
├─ 内存日志:/run/log/journal → 重启丢失
│
└─ syslog 接口 → rsyslog
↓
/var/log/syslog 等磁盘文件
↓
重启后仍保留
它但凡给装个rsyslog也不会这么离谱。所以说这就是为什么在用VPS或者独立服务器的时候,能挂载iso安装就用iso安装,不能用iso就自己用preseed重装,商家的系统模板质量真的参差不齐。。。
2026-10-12 00:10:20
PaperPhone这项目是我朋友一直在开发的,这里帮他推荐一下。项目主要分为两个版本:Plus、Lite,Plus比Lite多了音视频会议、朋友圈等功能。
项目的亮点是端到端加密,且使用Tor接入服务,服务器部署不需要准备域名、TLS证书或NGNIX。
这里我部署一个Lite版本的服务端,安装Docker:
apt update
apt install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
克隆存储库:
cd /opt
git clone https://github.com/619dev/PaperPhoneLite.git
cd PaperPhoneLite/
复制一份配置文件:
cp server/.env.example .env
编辑env配置文件:
nano .env
至少设置以下内容:
JWT_SECRET
DB_PASS
MYSQL_ROOT_PASSWORD
REDIS_PASS
如果你不想手动配置,上述配置全部都可以使用以下命令生成:
openssl rand -hex 32
启动:
docker compose up -d
查看Tor域名:
cat logs/onion-address.log
选择你的客户端,输入刚才查看到的Tor域名,连接服务器以开始使用,其中iOS客户端已经在AppStore上架:
https://github.com/619dev/ppl-android
https://github.com/619dev/ppl-ios
https://github.com/619dev/ppl-mac
https://github.com/619dev/ppl-win
