<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>飞污熊小站</title><link>https://xiongneng.me/</link><description>飞污熊小站</description><generator>Hugo 0.161.1 &amp; FixIt v0.4.6-20260512073637-464c4659</generator><language>zh-CN</language><managingEditor>yidao620@163.com (XiongNeng)</managingEditor><webMaster>yidao620@163.com (XiongNeng)</webMaster><copyright>XiongNeng</copyright><lastBuildDate>Sun, 24 May 2026 02:49:17 +0000</lastBuildDate><atom:link href="https://xiongneng.me/index.xml" rel="self" type="application/rss+xml"/><item><title>阿里云Ubuntu24搭建个人云平台</title><link>https://xiongneng.me/posts/devops/cloud-platform/</link><pubDate>Sat, 09 May 2026 09:54:29 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/devops/cloud-platform/</guid><category domain="https://xiongneng.me/categories/devops/">DevOps</category><description>&lt;p&gt;最近我购买了个人域名，一直在思考怎么去搭建个人全栈云平台，包括个人博客、品牌站点、管理后台（前后端分离）、小程序/APP后台服务、OpenClaw等。&lt;/p&gt;
&lt;p&gt;之前有试过方案是静态网站托管在Cloudflare Pages上，另外将OpenClaw和其他动态服务都部署在家里的Raspberry上面，
然后再通过Cloudflare Tunnel做内网穿透。&lt;/p&gt;
&lt;p&gt;但是这里有个问题就是域名没办法做ICP备案了，因为域名备案必须有一个真实托管IP。因此最终我还是选择了阿里云主机。
这里我选择阿里云性价比最高的轻量级应用服务器，首次购买一年才几百块钱。刚开始不用买太好的配置，先把东西做出来后面再升级。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最终我的架构是这样子的：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;个人品牌站点、管理后台服务、小程序/APP后台服务全部部署在阿里云轻量级应用服务器上。&lt;/li&gt;
&lt;li&gt;所有服务统一使用Nginx反向代理，通过二级子域名去访问。&lt;/li&gt;
&lt;li&gt;Nginx开启SSL/TLS，并且Nginx上面要配置Let&amp;rsquo;s Encrypt证书（支持泛域名），使用Certbot脚本支持自动延期证书。&lt;/li&gt;
&lt;li&gt;个人品牌站点统一使用www域名&lt;code&gt;www.xiongneng.me&lt;/code&gt;去访问，并开启CDN加速。&lt;/li&gt;
&lt;li&gt;管理后台（包括前端页面和后端服务）使用子域名&lt;code&gt;admin.xiongneng.me&lt;/code&gt;去访问。&lt;/li&gt;
&lt;li&gt;小程序/APP后台服务使用统一的FastAPI服务，并通过&lt;code&gt;api.xiongneng.me&lt;/code&gt;去访问。&lt;/li&gt;
&lt;li&gt;所有后端服务中涉及到数据库全部使用SQLite实现。&lt;/li&gt;
&lt;li&gt;所有前端页面中涉及到图片资源的全部使用腾讯云COS服务，并开启CDN加速。&lt;/li&gt;
&lt;li&gt;家里的一台Raspberry用于安装OpenClaw智能体平台。并通过长连接方式连接飞书平台，避免开放公网IP。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="heading-element" id="云服务器基础环境准备"&gt;&lt;span&gt;云服务器基础环境准备&lt;/span&gt;
 &lt;a href="#%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%9f%ba%e7%a1%80%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;登录服务器后，首先更新系统并安装项目所需的必要软件包。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 更新系统并安装基础依赖
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
sudo apt install -y curl wget gnupg2 ca-certificates lsb-release ufw build-essential python3 python3-pip python3-venv git nginx

# 2. 安装 Node.js 22.x (用于管理后台前端构建)
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - # 设置 NodeSource 仓库
sudo apt-get install -y nodejs # 安装 Node.js
node -v &amp;amp;&amp;amp; npm -v # 验证安装

# 3. 配置基础防火墙 (ufw)
sudo ufw allow OpenSSH # 允许 SSH (端口 22)
sudo ufw allow &amp;#39;Nginx Full&amp;#39; # 允许 Nginx (端口 80 和 443)
sudo ufw enable # 启用防火墙&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="安装并配置-nginx-反向代理"&gt;&lt;span&gt;安装并配置 Nginx 反向代理&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85%e5%b9%b6%e9%85%8d%e7%bd%ae-nginx-%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Nginx 将作为所有服务的统一入口，负责接收外部请求并将其分发到对应的内部服务。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 确认 Nginx 已安装并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 2. 配置 Nginx 核心文件 (/etc/nginx/nginx.conf)
# 使用你熟悉的编辑器打开它 (如 vim 或 nano)
sudo vim /etc/nginx/nginx.conf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 http 块内，增加或修改以下配置，用于优化反向代理性能：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http {
 # ... (保留原有基础配置) ...
 server_tokens off; # 隐藏 Nginx 版本号，增强安全性

 # 代理缓冲区优化
 proxy_buffer_size 128k;
 proxy_buffers 4 256k;
 proxy_busy_buffers_size 256k;

 # 客户端请求体大小限制 (可按需调整)
 client_max_body_size 20m;

 # 引入所有站点独立的配置文件
 include /etc/nginx/conf.d/*.conf;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;保存文件后，测试配置并重载 Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -t
sudo systemctl reload nginx&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="申请-lets-encrypt-泛域名证书并配置自动续期"&gt;&lt;span&gt;申请 Let&amp;rsquo;s Encrypt 泛域名证书并配置自动续期&lt;/span&gt;
 &lt;a href="#%e7%94%b3%e8%af%b7-lets-encrypt-%e6%b3%9b%e5%9f%9f%e5%90%8d%e8%af%81%e4%b9%a6%e5%b9%b6%e9%85%8d%e7%bd%ae%e8%87%aa%e5%8a%a8%e7%bb%ad%e6%9c%9f" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;本步骤将申请一个覆盖一级域名 &lt;code&gt;xiongneng.me&lt;/code&gt; 和 &lt;code&gt;*.xiongneng.me&lt;/code&gt; 的泛域名证书，并设置自动续期任务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置阿里云&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;登录阿里云RAM访问控制页面。
创建一个RAM用户，勾选“OpenAPI调用访问”，并为它授权 AliyunDNSFullAccess 权限。
生成并记录下这个用户的 AccessKey ID 和 AccessKey Secret。
在服务器上创建一个凭据文件，如 &lt;code&gt;/opt/certbot_dns/credentials.ini&lt;/code&gt;，并写入以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dns_aliyun_access_key = 你的AccessKey_ID
dns_aliyun_access_key_secret = 你的AccessKey_Secret&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;必须设置权限，保护密钥文件安全：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod 600 /opt/certbot_dns/credentials.ini&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;安装插件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建 Python 虚拟环境
sudo apt install python3-venv
sudo python3 -m venv /opt/certbot
# 在虚拟环境中安装 Certbot 和阿里云插件
# 升级 pip
sudo /opt/certbot/bin/pip install --upgrade pip
# 安装 certbot 和阿里云插件 (以下为一行命令)
sudo /opt/certbot/bin/pip install certbot certbot-dns-aliyun
# 建立软链接
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;申请证书&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot certonly \
 --authenticator dns-aliyun \
 --dns-aliyun-credentials /opt/certbot_dns/credentials.ini \
 -d &amp;#34;xiongneng.me&amp;#34; \
 -d &amp;#34;*.xiongneng.me&amp;#34; \
 --agree-tos \
 --email yidao620@163.com&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;生成成功日志：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Account registered.
Requesting a certificate for xiongneng.me and *.xiongneng.me
Waiting 30 seconds for DNS changes to propagate

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/xiongneng.me/fullchain.pem
Key is saved at: /etc/letsencrypt/live/xiongneng.me/privkey.pem
This certificate expires on 2026-08-08.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let&amp;#39;s Encrypt: https://letsencrypt.org/donate
 * Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;设置自动续期与重载 Nginx&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直接编辑 root 用户的 crontab：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo EDITOR=vim crontab -e&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在文件末尾添加下面这一行即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 2 * * * /opt/certbot/bin/certbot renew --quiet --deploy-hook &amp;#34;systemctl reload nginx&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0 2 * * *&lt;/code&gt;：每天凌晨 2 点执行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/opt/certbot/bin/certbot renew&lt;/code&gt;：调用虚拟环境中的 &lt;code&gt;certbot&lt;/code&gt; 检查并续期证书。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--quiet&lt;/code&gt;：安静模式，没有错误不输出。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--deploy-hook &amp;quot;systemctl reload nginx&amp;quot;&lt;/code&gt;：自动完成脚本的工作——续期成功后立即重载 Nginx，无需额外的脚本文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;测试自动续期是否能成功。看到 &lt;code&gt;Congratulations, all simulated renewals succeeded&lt;/code&gt; 就代表一切就绪。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo /opt/certbot/bin/certbot renew --dry-run&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="部署各个服务"&gt;&lt;span&gt;部署各个服务&lt;/span&gt;
 &lt;a href="#%e9%83%a8%e7%bd%b2%e5%90%84%e4%b8%aa%e6%9c%8d%e5%8a%a1" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;管理后台前端（Vue）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设管理后台为 &lt;code&gt;admin.xiongneng.me&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地打包：在项目根目录下执行 &lt;code&gt;npm run build&lt;/code&gt;，得到 &lt;code&gt;dist&lt;/code&gt; 文件夹。&lt;/li&gt;
&lt;li&gt;上传文件：将 &lt;code&gt;dist&lt;/code&gt; 目录下的所有内容上传至服务器 &lt;code&gt;/var/www/admin&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;Nginx 配置：创建文件 &lt;code&gt;/etc/nginx/conf.d/admin.conf&lt;/code&gt;，内容如下&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;server {
 listen 443 ssl http2; # 使用 SSL 并启用 HTTP/2 加速
 server_name admin.xiongneng.me;

 # 指定 SSL 证书路径
 ssl_certificate /etc/letsencrypt/live/xiongneng.me/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/xiongneng.me/privkey.pem;

 root /var/www/admin; # 指定项目文件根目录
 index index.html;

 location / {
 try_files $uri $uri/ /index.html; # 处理 Vue Router 的 history 模式
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重载 Nginx：&lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;品牌站点/个人博客（静态站）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;类似于管理后台前端服务，假设品牌站为 &lt;code&gt;www.xiongneng.me&lt;/code&gt;。将静态网站文件上传至 &lt;code&gt;/var/www/main&lt;/code&gt;。
Nginx 配置 &lt;code&gt;/etc/nginx/conf.d/main.conf&lt;/code&gt;，结构与 &lt;code&gt;admin.conf&lt;/code&gt; 类似，只需修改 &lt;code&gt;server_name&lt;/code&gt; 和 &lt;code&gt;root&lt;/code&gt; 即可。&lt;/p&gt;
&lt;p&gt;若品牌站点/个人博客使用静态站点生成器（如Hugo、Hexo），部署完成后的访问加速补充步骤请见 CDN 章节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FastAPI 后端服务&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这部分将部署一个统一的 API 服务，为管理后台前端、小程序和 APP 提供后端API数据支持。&lt;/p&gt;
&lt;p&gt;环境准备：创建项目目录并搭建 Python 虚拟环境：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /opt/fastapi-app &amp;amp;&amp;amp; cd /opt/fastapi-app
python3 -m venv venv # 创建虚拟环境
source venv/bin/activate # 激活虚拟环境&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install fastapi uvicorn[standard] gunicorn
# 如果有 requirements.txt 文件，则执行：
pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 systemd 来管理 FastAPI 进程，确保其稳定运行和开机自启。创建文件 &lt;code&gt;/etc/systemd/system/fastapi.service&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=FastAPI Application
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/opt/fastapi-app
Environment=&amp;#34;PATH=/opt/fastapi-app/venv/bin&amp;#34;
ExecStart=/opt/fastapi-app/venv/bin/gunicorn -k uvicorn.workers.UvicornWorker -w 4 -b 127.0.0.1:8000 app.main:app
Restart=always

[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-w 4&lt;/code&gt;：表示启动4个工作进程，可根据服务器配置调整。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app.main:app&lt;/code&gt;：请替换为你项目中实际的模块和 FastAPI 实例位置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;启动并设置服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl start fastapi.service
sudo systemctl enable fastapi.service
sudo systemctl status fastapi.service # 检查运行状态&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;小程序与 APP 后台（统一 API 服务）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Nginx 层面，通过不同 location 块或不同的 server_name 前缀来区分各端 API 请求，统一转发至上述 FastAPI 服务。&lt;/p&gt;
&lt;p&gt;创建 Nginx 配置：&lt;code&gt;/etc/nginx/conf.d/api.conf&lt;/code&gt;，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
 listen 443 ssl http2;
 # 可同时监听多个域名
 server_name api.xiongneng.me mini.xiongneng.me app.xiongneng.me;
 ssl_certificate /etc/letsencrypt/live/xiongneng.me/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/xiongneng.me/privkey.pem;

 location / {
 # 将请求转发到本地 8000 端口的 FastAPI 服务
 proxy_pass http://127.0.0.1:8000;

 # 设置代理头信息
 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_connect_timeout 60s;
 proxy_read_timeout 120s;
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;重要：&lt;/strong&gt; 在微信小程序后台，需要将 &lt;code&gt;https://api.xiongneng.me&lt;/code&gt; 和 &lt;code&gt;https://mini.xiongneng.me&lt;/code&gt; 都配置为合法的 request 域名。&lt;/p&gt;
&lt;h2 class="heading-element" id="配置对象存储以腾讯云-cos-为例"&gt;&lt;span&gt;配置对象存储（以腾讯云 COS 为例）&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e5%af%b9%e8%b1%a1%e5%ad%98%e5%82%a8%e4%bb%a5%e8%85%be%e8%ae%af%e4%ba%91-cos-%e4%b8%ba%e4%be%8b" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;COS 配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;若已有用于图片存储的 COS 存储桶，则只需将博客等涉及资源访问的域名指向该存储桶。在腾讯云 COS 控制台，
为存储桶绑定自定义 CDN 加速域名，例如 &lt;code&gt;image.xiongneng.me&lt;/code&gt;，并上传 SSL 证书。详细步骤可参考腾讯云官方文档。&lt;/p&gt;
&lt;h2 class="heading-element" id="配置dns域名解析"&gt;&lt;span&gt;配置DNS域名解析&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%aedns%e5%9f%9f%e5%90%8d%e8%a7%a3%e6%9e%90" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;如果之前有修改过域名的默认NS的，则先要去阿里云服务器找到我的域名 &amp;gt; 管理。把DNS服务器还原到阿里云分配的默认值。&lt;/p&gt;
&lt;p&gt;然后再去域名解析配置地方，增加多个域名解析记录。把主域名 &lt;code&gt;xiongneng.me&lt;/code&gt;
和所有不需要走 CDN 的子域名（如 api、admin、mini、app 等）都通过 A 记录 指向你阿里云轻量服务器的公网 IP。&lt;/p&gt;
&lt;p&gt;走 CDN 的子域名：像 &lt;code&gt;image.xiongneng.me&lt;/code&gt;（如果绑定腾讯云 COS 加速域名），则需要配置 CNAME 记录，
指向腾讯云 CDN 提供的 CNAME 地址，而不是服务器 IP。&lt;/p&gt;
&lt;h2 class="heading-element" id="icp备案流程"&gt;&lt;span&gt;ICP备案流程&lt;/span&gt;
 &lt;a href="#icp%e5%a4%87%e6%a1%88%e6%b5%81%e7%a8%8b" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;在国内，ICP备案是网站正式上线前必须完成的合规流程。这个过程可以简单理解为：你提供个人资料和网站信息，阿里云初审，再由工信部终审。&lt;/p&gt;
&lt;p&gt;整个过程在阿里云系统里操作很方便，通常有5个步骤，快的话1-2天，慢则20天左右&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;提交材料：登录阿里云备案系统（&lt;code&gt;beian.aliyun.com&lt;/code&gt;），按要求填写你的个人信息（姓名、身份证号、地址等）和网站信息，并上传身份证、完成人脸识别等。&lt;/li&gt;
&lt;li&gt;阿里云初审：阿里云会在1-2个工作日内完成审核。过程中可能会电话联系你核实信息，请保持手机畅通。&lt;/li&gt;
&lt;li&gt;提交管局：初审通过后，阿里云会将你的备案申请正式提交给你所在省市的通信管理局（工信部）。&lt;/li&gt;
&lt;li&gt;工信部短信核验：提交管局后，你会收到工信部发送的短信核验码，需要在24小时内登录工信部备案系统完成核验，否则申请会被视为放弃。&lt;/li&gt;
&lt;li&gt;管局审核：完成核验后，管局会进行最终审核，这个过程通常需要1-20个工作日不等。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;备案期间网站能访问，但是又不能有内容，其实有点搞笑。但是又不得不这样做。因此需要修改Nginx，让它默认返回503。
编辑&lt;code&gt;/etc/nginx/nginx.conf &lt;/code&gt;，创建一个最高优先级的 server 块，放在所有server前面，并重新加载 Nginx 即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
 listen 80 default_server;
 # 如果有 IPv6 也需要监听
 listen [::]:80 default_server;
 server_name _;

 # 返回一个符合备案审核的响应
 return 503;
 # 或者更友好一点，但同样合规
 # return 200 &amp;#34;Temporarily Unavailable for ICP Filing.&amp;#34;;
}
include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -t # 测试配置
sudo systemctl reload nginx # 重载，无需重启&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="配置esa加速"&gt;&lt;span&gt;配置ESA加速&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%aeesa%e5%8a%a0%e9%80%9f" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;在阿里云的体系里，能加速网站的“边缘安全加速资源包”主要对应 边缘安全加速 ESA (Edge Security Acceleration)。
它很适合你轻量服务器上的个人博客，官网甚至提供了免费套餐。&lt;/p&gt;
&lt;p&gt;必须先删除原来的A记录，才能添加CNAME记录。而是DNS协议本身的技术限制：CNAME记录不能与任何其他类型的记录共存于同一个子域名下。
也就是说，对于 &lt;code&gt;xiongneng.me&lt;/code&gt; 和 &lt;code&gt;www.xiongneng.me&lt;/code&gt;，要么用A记录（直接指向IP），要么用CNAME记录（指向ESA的别名），两者不能同时存在。&lt;/p&gt;
&lt;p&gt;进入ESA控制台后，你会看到“站点管理”的界面。要开始为你的博客接入服务，只需：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点击 “新增站点”。&lt;/li&gt;
&lt;li&gt;根据页面指引，填写你的域名、选择加速区域（建议选择“中国内地”）和接入方式（如 CNAME）。&lt;/li&gt;
&lt;li&gt;选择套餐类型这一步非常关键，请务必选择 “免费版”（即我们之前讨论过的Entrance套餐），不要误选付费版。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置 ESA 回源协议为 HTTPS。进入 ESA 控制台，在你的站点管理中找到&lt;code&gt;回源规则&lt;/code&gt;配置，将回源协议明确设置为 HTTPS，回源端口设置为 443。&lt;/p&gt;
&lt;p&gt;证书的配置就在 ESA 控制台里，路径是固定的：进入你的站点详情页，在左侧导航栏就能找到“边缘证书”入口。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入站点管理：登录 ESA 控制台，在“站点管理”页面点击你的目标站点，进入详情页。&lt;/li&gt;
&lt;li&gt;找到功能入口：在详情页的左侧导航栏中，找到并点击 “边缘证书”。基础和高级设置都在这里。注意这里最好申请泛域名（如 &lt;code&gt;*.xiongneng.me&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;确认HTTPS状态：进入“边缘证书”页面后，请先检查“配置状态”。如果显示“已配置”但你的网站还是HTTP访问，可以在这里开启 “强制HTTPS” 功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果申请免费证书报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;若您的 NS 站点已激活，或 CNAME 站点证书域名的 DNS 已解析至 ESA，则免费证书申请大约需要5-10分钟；
否则需要您在1小时内自行配置证书校验 DCV 信息。您可以在异步任务中查看免费证书申请状态。&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;则需要配置托管DCV，再次申请即可成功：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;获取CNAME信息：在ESA控制台左侧菜单找到“托管DCV”，复制系统生成的CNAME信息。&lt;/li&gt;
&lt;li&gt;添加CNAME记录：前往你的DNS服务商控制台，添加一条新的CNAME记录。记录类型选择CNAME，主机记录和记录值粘贴刚才复制的内容。&lt;/li&gt;
&lt;li&gt;验证生效：配置完成后，等待几分钟使其生效&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="heading-element" id="优化建议"&gt;&lt;span&gt;优化建议&lt;/span&gt;
 &lt;a href="#%e4%bc%98%e5%8c%96%e5%bb%ba%e8%ae%ae" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;在 Nginx 全局配置中增加安全头，如 &lt;code&gt;X-Frame-Options&lt;/code&gt;、&lt;code&gt;X-Content-Type-Options&lt;/code&gt; 等。&lt;/li&gt;
&lt;li&gt;为后端 API 增加身份认证（如 JWT）和限流措施。&lt;/li&gt;
&lt;li&gt;监控与告警：可接入免费的云监控（如阿里云云监控），设置 CPU、内存、磁盘和网站可用性的告警。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>使用Cloudflare+Raspberry搭建个人平台</title><link>https://xiongneng.me/posts/devops/cloudflare-raspberry/</link><pubDate>Wed, 06 May 2026 19:11:29 +0000</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/devops/cloudflare-raspberry/</guid><category domain="https://xiongneng.me/categories/devops/">DevOps</category><description>&lt;p&gt;最近我购买了个人域名，一直在思考怎么去搭建个人开发平台，包括OpenClaw智能体平台、个人博客和品牌网站，还需要部署一些自己写的管理子系统。
最简单方式肯定是直接去购买云主机，当前已经买了腾讯云的轻量级应用服务器，但是网络特别卡。要是购买云服务器CVM费用又太高了。
然后我突然想起来我家里还有2台Raspberry还闲置着呢？是不是可以发挥下它的作用。&lt;/p&gt;
&lt;p&gt;然后我通过跟DeepSeek交流方案，它给出了一个当前最优的方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主域名指向我的个人静态网站并托管在Cloudflare Pages上，可保证全球访问的稳定性。&lt;/li&gt;
&lt;li&gt;一台Raspberry用于部署管理子系统，包含前后端服务。通过Cloudflare Tunnel内网穿透，将域名绑定到我内网Nginx上。
在内网Nginx使用反向代理方式，所有/api请求转发到后端服务，其他请求转发到前端服务，内外服务全部使用HTTP即可。&lt;/li&gt;
&lt;li&gt;一台Raspberry用于安装OpenClaw智能体平台。并通过长连接方式连接飞书平台，避免开放公网IP。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整体架构图如下：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src='https://xnstatic-1253397658.file.myqcloud.com/Cloudflare-20260513.jpg' alt="img.png"&gt;&lt;/p&gt;
&lt;h2 class="heading-element" id="cloudflare-pages托管静态网站"&gt;&lt;span&gt;Cloudflare Pages托管静态网站&lt;/span&gt;
 &lt;a href="#cloudflare-pages%e6%89%98%e7%ae%a1%e9%9d%99%e6%80%81%e7%bd%91%e7%ab%99" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;我当前使用的是Hugo构建的个人静态网站，源代码托管在GitHub上面。
进入Cloudflare控制台后，在&lt;code&gt;构建 &amp;gt; 计算 &amp;gt; Workers &amp;amp; Pages&lt;/code&gt;，点击 “创建应用程序” ➔ “Pages” ➔ “连接到 Git”。
授权访问GitHub仓库，个人私仓也是可以的。填写以下几个参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;框架预设: 在下拉菜单中选择 Hugo&lt;/li&gt;
&lt;li&gt;构建命令: 本地构建命令保持一致&lt;/li&gt;
&lt;li&gt;输出目录: 填写 public（即 Hugo 默认的编译输出目录）&lt;/li&gt;
&lt;li&gt;环境变量：HUGO_VERSION=你本地构建的Hugo版本号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后点击构建和部署，成功消息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;成功！您的项目已部署到以下区域：全球
您可以在 xiongneng-me.pages.dev 预览项目&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这时候再选择&lt;code&gt;添加自定义域名&lt;/code&gt;，输入&lt;code&gt;xiongneng.me&lt;/code&gt;后保存，然后回去后再选择&lt;code&gt;添加自定义域名&lt;/code&gt;，输入&lt;code&gt;www.xiongneng.me&lt;/code&gt;后保存。&lt;/p&gt;
&lt;p&gt;然后再去域名注册地方比如我的阿里云，在域名解析地方添加两条CNAME记录，一个是&lt;code&gt;@&lt;/code&gt;，一个是&lt;code&gt;www&lt;/code&gt;，都指向&lt;code&gt;xiongneng-me.pages.dev&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这样设置完成后，每次push到github上面会自动触发Cloudflare Pages的构建流程，整个过程十秒左右。&lt;/p&gt;
&lt;h2 class="heading-element" id="cloudflare-tunnel内网穿透"&gt;&lt;span&gt;Cloudflare Tunnel内网穿透&lt;/span&gt;
 &lt;a href="#cloudflare-tunnel%e5%86%85%e7%bd%91%e7%a9%bf%e9%80%8f" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;h3 class="heading-element" id="先清空域名解析记录"&gt;&lt;span&gt;先清空域名解析记录&lt;/span&gt;
 &lt;a href="#%e5%85%88%e6%b8%85%e7%a9%ba%e5%9f%9f%e5%90%8d%e8%a7%a3%e6%9e%90%e8%ae%b0%e5%bd%95" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;我之前购买了腾讯云主机，并将域名解析配置到云主机IP。在阿里云上面购买的域名，
因此需要登录阿里云去域名解析那里把我的域名解析记录删掉即可。&lt;/p&gt;
&lt;h3 class="heading-element" id="准备将域名托管给-cloudflare"&gt;&lt;span&gt;准备：将域名托管给 Cloudflare&lt;/span&gt;
 &lt;a href="#%e5%87%86%e5%a4%87%e5%b0%86%e5%9f%9f%e5%90%8d%e6%89%98%e7%ae%a1%e7%bb%99-cloudflare" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;要让Cloudflare管理你的域名，你需要修改它的DNS服务器，这是后续一切的基础。&lt;/p&gt;
&lt;p&gt;注册 Cloudflare 账号，并添加你的域名。输入你的完整域名（不要带 www.），计划选择 Free 免费套餐。
Cloudflare 会提供两个新的 NS (Name Server) 地址，你需要复制下来。以 &lt;code&gt;.ns.cloudflare.com&lt;/code&gt; 结尾。&lt;/p&gt;
&lt;p&gt;再去阿里云域名控制台，找到你的域名，将它的 DNS 服务器修改为 Cloudflare 提供的那两个 NS 地址。
具体方法是找到 &lt;code&gt;域名与网站 &amp;gt; 域名管理 &amp;gt; 域名列表&lt;/code&gt;。在列表中找到&lt;code&gt;你的域名 &amp;gt; 管理 &amp;gt; DNS管理 &amp;gt; DNS修改&lt;/code&gt;。
然后点击&lt;code&gt;修改DNS服务器&lt;/code&gt;，在弹出的窗口中，删除原来阿里云的 NS 地址，然后再把上面的两个NS地址复制进去。&lt;/p&gt;
&lt;p&gt;等待DNS生效（一般几分钟到几小时），期间网站服务可能会短暂中断。生效后，域名就算正式托管给 Cloudflare 了。&lt;/p&gt;
&lt;h3 class="heading-element" id="安装nginx"&gt;&lt;span&gt;安装Nginx&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85nginx" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在树莓派上安装Nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nginx -y&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新增个人域名网站配置&lt;code&gt;/etc/nginx/conf.d/xiongneng.conf&lt;/code&gt;，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
 listen 80;
 server_name xiongneng.me www.xiongneng.me;

 root /usr/share/nginx/html;
 index index.html index.htm;

 location / {
 try_files $uri $uri/ /index.html;
 }

 error_page 500 502 503 504 /50x.html;
 location = /50x.html {
 root /usr/share/nginx/html;
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="创建隧道打通内外网"&gt;&lt;span&gt;创建隧道：打通内外网&lt;/span&gt;
 &lt;a href="#%e5%88%9b%e5%bb%ba%e9%9a%a7%e9%81%93%e6%89%93%e9%80%9a%e5%86%85%e5%a4%96%e7%bd%91" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;后面两步需要在树莓派的终端里完成，我们一条条来。&lt;/p&gt;
&lt;p&gt;🔑 步骤一：安装 cloudflared&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载并安装 cloudflared (适用于 Ubuntu 24.04)
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb
sudo dpkg -i cloudflared-linux-arm64.deb
# 验证安装是否成功
cloudflared --version&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;🔑 步骤二：认证并创建隧道&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 用你的 Cloudflare 账号授权这台树莓派
cloudflared tunnel login&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这条命令执行后，会给你返回一个浏览器页面地址。将它复制出来，打开浏览器，让你选择域名并授权。它会自动生成TLS证书，耐心等待几秒。
认证成功后，开始创建隧道：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建一个新隧道，名字可以自己取
cloudflared tunnel create xiong-tunnel&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;成功后，会生成一个唯一的 Tunnel ID 和对应的 credentials 文件，同时会告诉你如何通过 DNS 路由流量。&lt;/p&gt;
&lt;p&gt;🚀 步骤三：配置 DNS&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建一条 DNS CNAME 记录，将你的域名（两个域名，包含www）指向这个隧道
cloudflared tunnel route dns xiongneng-tunnel xiongneng.me
cloudflared tunnel route dns xiongneng-tunnel www.xiongneng.me&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果以上都没有报错，并且提示连接成功，就说明你的隧道已经跑通了。
服务一旦启用，Cloudflare 会自动为你的域名签发并续期 SSL/TLS 证书，访客看到的将是受信任的安全连接&lt;/p&gt;
&lt;h3 class="heading-element" id="让隧道常驻后台"&gt;&lt;span&gt;让隧道常驻后台&lt;/span&gt;
 &lt;a href="#%e8%ae%a9%e9%9a%a7%e9%81%93%e5%b8%b8%e9%a9%bb%e5%90%8e%e5%8f%b0" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在系统服务专用的目录下创建 config.yml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/cloudflared&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编辑配置文件&lt;code&gt;sudo vim /etc/cloudflared/config.yml&lt;/code&gt;，内容如下。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tunnel: xiongneng-tunnel
credentials-file: /home/ubuntu/.cloudflared/你的隧道ID.json

ingress:
 - hostname: xiongneng.me
 service: http://localhost:80
 - hostname: www.xiongneng.me
 service: http://localhost:80
 # 如果你还有想公开的子域名，可以继续添加规则
 # - hostname: admin.xiongneng.me
 # service: http://localhost:8080
 - service: http_status:404&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;验证配置文件正确性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cloudflared tunnel --config /etc/cloudflared/config.yml ingress validate&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建并启用 Systemd 服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/systemd/system/cloudflared.service&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;粘贴以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Cloudflare Tunnel Service
After=network.target

[Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared --config /etc/cloudflared/config.yml tunnel run
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个文件告诉 systemd 如何管理和启动 cloudflared 服务。&lt;/p&gt;
&lt;p&gt;启动并验证服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 设置服务开机自启
sudo systemctl enable cloudflared
# 立即启动服务
sudo systemctl start cloudflared
# 检查服务运行状态
sudo systemctl status cloudflared&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>使用Hugo搭建个人静态网站</title><link>https://xiongneng.me/posts/devops/hugo/</link><pubDate>Mon, 27 Apr 2026 21:56:21 +0000</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/devops/hugo/</guid><category domain="https://xiongneng.me/categories/devops/">DevOps</category><description>&lt;p&gt;Hugo是一个静态网站生成器，基于Go语言，使用Markdown写作。构建速度极快，速度之王 (10000页约2.95秒)。本地写作能实时预览，体验流畅。
单个二进制文件，无需node_modules，升级只需替换新文件，适用于大型内容站，追求极致性能与长期免维护。&lt;/p&gt;
&lt;p&gt;官网地址：https://gohugo.io/&lt;/p&gt;
&lt;h2 class="heading-element" id="安装"&gt;&lt;span&gt;安装&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;首先安装Go语言：https://go.dev/doc/install&lt;/p&gt;
&lt;p&gt;再安装Git：https://git-scm.com/&lt;/p&gt;
&lt;p&gt;然后打开Powershell，输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 先安装 Scoop 包管理器
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果已经是管理员用户了，就输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iex &amp;#34;&amp;amp; {$(irm get.scoop.sh)} -RunAsAdmin&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后安装 Hugo Extended 版（支持 Sass/SCSS 编译）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scoop install hugo-extended
scoop install sass&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;后续Hugo版本更新：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#更新 Scoop 和软件仓库
scoop update
#升级 hugo-extended 软件包
scoop update hugo-extended&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="创建站点并添加主题"&gt;&lt;span&gt;创建站点并添加主题&lt;/span&gt;
 &lt;a href="#%e5%88%9b%e5%bb%ba%e7%ab%99%e7%82%b9%e5%b9%b6%e6%b7%bb%e5%8a%a0%e4%b8%bb%e9%a2%98" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;# 创建新站点
hugo new site xiongneng-me
cd xiongneng-me

# 初始化 Git 仓库
git init

# 以 FixIt 为例，添加为主题子模块
git submodule add --depth=1 https://github.com/hugo-fixit/FixIt.git themes/FixIt

# 更新子模块
git submodule update --remote --merge&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="最简配置文件"&gt;&lt;span&gt;最简配置文件&lt;/span&gt;
 &lt;a href="#%e6%9c%80%e7%ae%80%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;站点根目录下的 &lt;code&gt;hugo.toml&lt;/code&gt;（或 config.yaml）是核心配置文件。以下是一个最小可运行配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;baseURL = &amp;#39;https://xiongneng.me&amp;#39;
languageCode = &amp;#39;zh-CN&amp;#39;
title = &amp;#39;飞污熊&amp;#39;
theme = &amp;#39;FixIt&amp;#39;

[ params ]
[ params.profileMode ]
enabled = true
title = &amp;#34;全栈开发 | Python/Java/Web/AI&amp;#34;
subtitle = &amp;#34;专注于全栈开发和AI应用&amp;#34;
imageUrl = &amp;#34;images/avatar.png&amp;#34;
# 主页按钮（引导访客到项目页或博客）
[[params.profileMode.buttons]]
name = &amp;#34;项目作品&amp;#34;
url = &amp;#34;/projects&amp;#34;
[[params.profileMode.buttons]]
name = &amp;#34;技术博客&amp;#34;
url = &amp;#34;/posts&amp;#34;

# 社交链接
[ [ params.socialIcons ] ]
name = &amp;#34;github&amp;#34;
url = &amp;#34;https://github.com/yidao620c&amp;#34;
[[params.socialIcons]]
name = &amp;#34;email&amp;#34;
url = &amp;#34;mailto:yidao620@gmail.com&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建第一篇内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建文章
hugo new posts/hello-world.md

# 用编辑器打开 content/posts/hello-world.md
# 将 draft: true 改为 draft: false（否则不会发布）&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;启动开发服务器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hugo server&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;浏览器访问 &lt;code&gt;http://localhost:1313&lt;/code&gt;。Hugo 支持热重载——你改动 Markdown 或配置后，浏览器会自动刷新，无需手动重启。&lt;/p&gt;
&lt;h2 class="heading-element" id="文章规范"&gt;&lt;span&gt;文章规范&lt;/span&gt;
 &lt;a href="#%e6%96%87%e7%ab%a0%e8%a7%84%e8%8c%83" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;每篇文章顶部的 Front Matter 不只是给人类看的，它会影响搜索引擎收录效果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &amp;#34;Hugo 建站完整指南&amp;#34;
date: 2026-04-28
draft: false
tags: [&amp;#34;Hugo&amp;#34;, &amp;#34;建站&amp;#34;, &amp;#34;静态网站&amp;#34;]
categories: [&amp;#34;教程&amp;#34;]
description: &amp;#34;从零搭建 Hugo 静态博客，并部署到阿里云的完整教程&amp;#34;
---&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中 &lt;code&gt;description&lt;/code&gt; 字段会直接渲染为页面的 &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;，对 SEO 至关重要。&lt;/p&gt;
&lt;h2 class="heading-element" id="创建独立页面作品集服务页等"&gt;&lt;span&gt;创建独立页面（作品集、服务页等）&lt;/span&gt;
 &lt;a href="#%e5%88%9b%e5%bb%ba%e7%8b%ac%e7%ab%8b%e9%a1%b5%e9%9d%a2%e4%bd%9c%e5%93%81%e9%9b%86%e6%9c%8d%e5%8a%a1%e9%a1%b5%e7%ad%89" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;除了博客文章，你还可以创建独立页面来展示项目案例和未来工作室的服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hugo new projects/_index.md
hugo new services/_index.md&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每个 &lt;code&gt;_index.md&lt;/code&gt; 会作为一个独立路由（如 &lt;code&gt;/projects/&lt;/code&gt;），你可以在对应的 Markdown 中自由排版。&lt;/p&gt;
&lt;h2 class="heading-element" id="生产构建"&gt;&lt;span&gt;生产构建&lt;/span&gt;
 &lt;a href="#%e7%94%9f%e4%ba%a7%e6%9e%84%e5%bb%ba" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;# 生成静态文件到 public/ 目录
hugo --minify

# 文件结构示例：
# public/
# ├── index.html
# ├── posts/
# │ └── hello-world/
# │ └── index.html
# └── ...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;--minify&lt;/code&gt; 参数会压缩 HTML/CSS/JS，减小文件体积 30%-50%。&lt;code&gt;public/&lt;/code&gt; 目录里的所有文件就是你要部署到服务器上的内容。&lt;/p&gt;
&lt;h2 class="heading-element" id="github-actions-自动部署"&gt;&lt;span&gt;GitHub Actions 自动部署&lt;/span&gt;
 &lt;a href="#github-actions-%e8%87%aa%e5%8a%a8%e9%83%a8%e7%bd%b2" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;手动 &lt;code&gt;scp&lt;/code&gt; 上传虽然可行，但每次写文章都要手动构建+上传，效率不高。利用 GitHub Actions 可以实现「推送代码即自动部署」。&lt;/p&gt;
&lt;p&gt;工作流设计思路：在 GitHub Actions 中安装 Hugo → 拉取源码 → 执行构建 → 通过 &lt;code&gt;scp&lt;/code&gt; 将 &lt;code&gt;public/&lt;/code&gt; 上传到云服务器的Nginx目录。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成 SSH 密钥对&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用以下命令生成一个专门用于部署的密钥对，建议保存在 ~/.ssh/ 下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -m PEM -t rsa -b 4096 -C &amp;#34;github-action-deploy&amp;#34; -f ~/.ssh/github-action-deploy&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这会产生两个文件：私钥 (github-action-deploy) 和公钥 (github-action-deploy.pub)。注意：请不要设置密码短语，留空即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建deploy用户&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建用户（如果尚未存在）
sudo adduser deploy --disabled-password
sudo mkdir -p /home/deploy/.ssh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置Nginx目录权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown -R deploy:www-data /var/www/html
sudo chmod -R 755 /var/www/html&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;赋予 &lt;code&gt;sudo&lt;/code&gt; 权限：在服务器上运行 &lt;code&gt;sudo visudo&lt;/code&gt;，在文件末尾添加以下内容，允许 deploy 用户无密码执行 &lt;code&gt;systemctl reload nginx&lt;/code&gt;命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;配置服务器授权&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;将刚刚生成的公钥内容添加到deploy用户的授权文件中，并设置正确的权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat ~/.ssh/github-action-deploy.pub | sudo tee -a /home/deploy/.ssh/authorized_keys
# 修正权限
sudo chown -R deploy:deploy /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh
sudo chmod 600 /home/deploy/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;配置 GitHub Secrets（在 GitHub 网页端操作）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;进入GitHub仓库页面，依次点击 Settings ➔ Secrets and variables ➔ Actions，然后点击 New repository secret，创建四个 Secrets：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SERVER_IP: 你的阿里云服务器公网 IP 地址。&lt;/li&gt;
&lt;li&gt;SERVER_USER: 登录服务器的用户名（刚刚创建的用户 deploy）。&lt;/li&gt;
&lt;li&gt;SSH_PRIVATE_KEY: 私钥文件的内容&lt;code&gt;~/.ssh/github-action-deploy&lt;/code&gt;，包括 &lt;code&gt;-----BEGIN RSA PRIVATE KEY-----&lt;/code&gt; 和 &lt;code&gt;-----END RSA PRIVATE KEY-----&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;TARGET_DIR: 你的 Nginx HTML 目录在服务器上的绝对路径。比如，如果你已经配置好 Nginx，并且目录为 &lt;code&gt;/var/www/html/main&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;创建核心文件：GitHub Actions 配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在你的本地 Hugo 项目根目录下，创建文件 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;，并填入以下内容。这份配置是自动化的核心引擎。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Deploy Hugo Site to Aliyun ECS

on:
 push:
 branches:
 - main # 监听 main 分支的推送，请替换为你的主分支名，如 master

jobs:
 build-and-deploy:
 runs-on: ubuntu-latest

 steps:
 # 步骤一：拉取你的 Hugo 源代码
 - name: Checkout
 uses: actions/checkout@v4
 with:
 submodules: true # 如果你的主题是 Git 子模块，需要这个
 fetch-depth: 1 # 只需要最新的代码

 # ---------- 安装 sass ----------
 - name: Setup Node.js
 uses: actions/setup-node@v4
 with:
 node-version: &amp;#39;24&amp;#39;

 # 通过 npm 安装 sass-embedded，解决 CSS 编译问题
 - name: Install sass-embedded via npm
 run: |
 npm install -g sass-embedded
 NPM_BIN_DIR=$(npm prefix -g)/bin
 echo &amp;#34;NPM bin directory: $NPM_BIN_DIR&amp;#34;
 ls -la &amp;#34;$NPM_BIN_DIR&amp;#34;
 # 可执行文件是 &amp;#39;sass&amp;#39;，而非 &amp;#39;sass-embedded&amp;#39;
 sudo ln -sf &amp;#34;$NPM_BIN_DIR/sass&amp;#34; /usr/local/bin/sass
 sudo ln -sf &amp;#34;$NPM_BIN_DIR/sass&amp;#34; /usr/local/bin/dart-sass-embedded
 # 验证
 /usr/local/bin/dart-sass-embedded --version
 # ------------------------------

 # 步骤二：安装 Hugo
 - name: Setup Hugo
 uses: peaceiris/actions-hugo@v2
 with:
 hugo-version: &amp;#39;latest&amp;#39;
 extended: true # 如果需要 Sass/SCSS 支持

 # 步骤三：构建静态网站
 - name: Build
 run: hugo build --gc --minify --environment production --cleanDestinationDir -F -E

 # 步骤四：部署到阿里云服务器
 - name: Deploy to Aliyun ECS
 uses: easingthemes/ssh-deploy@main
 env:
 SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
 ARGS: &amp;#34;-azr --delete&amp;#34; # rsync 参数：归档、压缩、递归、删除目标多余文件[reference:9]
 SOURCE: &amp;#34;public/&amp;#34; # Hugo 将构建好的文件放在 public 目录
 REMOTE_HOST: ${{ secrets.SERVER_IP }}
 REMOTE_USER: ${{ secrets.SERVER_USER }}
 TARGET: ${{ secrets.TARGET_DIR }}
 # 以下两个脚本实现 Nginx 平滑重载
 SCRIPT_AFTER: |
 if sudo -n systemctl reload nginx 2&amp;gt;/dev/null; then
 echo &amp;#34;Nginx reloaded successfully (sudo mode).&amp;#34;
 else
 echo &amp;#34;Warning: Failed to reload nginx.&amp;#34;
 fi
 SCRIPT_AFTER_REQUIRED: false&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;测试与运行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;将 deploy.yml 和你的 Hugo 源码一起提交并推送到 GitHub。你可以通过 git push 命令或在 GitHub 网页端操作。
推送后，前往你 GitHub 仓库的 Actions 标签页，就能看到工作流正在运行。如果一切顺利，第一个绿色的勾就出现了！&lt;/p&gt;
&lt;h2 class="heading-element" id="日常维护命令手册"&gt;&lt;span&gt;日常维护命令手册&lt;/span&gt;
 &lt;a href="#%e6%97%a5%e5%b8%b8%e7%bb%b4%e6%8a%a4%e5%91%bd%e4%bb%a4%e6%89%8b%e5%86%8c" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;命令&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;新建文章&lt;/td&gt;
 &lt;td&gt;hugo new posts/文章标题.md&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;本地预览（含草稿）&lt;/td&gt;
 &lt;td&gt;hugo server -D&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;生产构建&lt;/td&gt;
 &lt;td&gt;hugo &amp;ndash;minify&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;清理 public 目录后重建&lt;/td&gt;
 &lt;td&gt;rm -rf public/ &amp;amp;&amp;amp; hugo &amp;ndash;minify&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;更新主题子模块&lt;/td&gt;
 &lt;td&gt;git submodule update &amp;ndash;remote &amp;ndash;merge&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;检查 Hugo 版本&lt;/td&gt;
 &lt;td&gt;hugo version&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 class="heading-element" id="好看主题推荐"&gt;&lt;span&gt;好看主题推荐&lt;/span&gt;
 &lt;a href="#%e5%a5%bd%e7%9c%8b%e4%b8%bb%e9%a2%98%e6%8e%a8%e8%8d%90" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;主题列表：https://themes.gohugo.io/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FixIt：一个简洁、优雅且高效的个人网站主题。适合技术博客、个人站点。&amp;ndash;推荐&lt;/li&gt;
&lt;li&gt;PaperMod：以极快的速度和简洁的设计著称，功能丰富且维护积极。适合技术博客、个人站点。&amp;ndash;推荐&lt;/li&gt;
&lt;li&gt;doks：美观高性能技术文档网站。&amp;ndash;推荐&lt;/li&gt;
&lt;li&gt;docsy：一款非常简单的技术文档网站。&lt;/li&gt;
&lt;li&gt;hextra：现代响应式，开箱即用的静态网站。&lt;/li&gt;
&lt;li&gt;hugo-saasify-theme：使用TailwindCSS构建的SaaS服务网站&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="heading-element" id="霞鹜文楷"&gt;&lt;span&gt;霞鹜文楷&lt;/span&gt;
 &lt;a href="#%e9%9c%9e%e9%b9%9c%e6%96%87%e6%a5%b7" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;其实我平时不怎么在意网页字体什么的，直到无意间看到了霞鹜文楷，真漂亮啊，而且免费开源可商用，于是就用上了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字体来源：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lxgw/LxgwWenKai" target="_blank" rel="external nofollow noopener noreferrer"&gt;霞鹜文楷 Github&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CMBill/lxgw-wenkai-screen-web" target="_blank" rel="external nofollow noopener noreferrer"&gt;霞鹜文楷屏幕阅读版&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;屏幕阅读版比原版更适用屏幕显示，区别其实不是很大，但是看着更顺眼一些。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;FixIt 主题安装霞鹜文楷字体。在 FixIt 主题的说明文档中其实也描述了，直接加一个全局覆盖 css 就可以。
以下字体样式均在 &lt;code&gt;assets/scss/custom.scss&lt;/code&gt; 中定义。自定义全局字体为霞鹜文楷屏幕阅读版，同时还有代码字体:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@import url(&amp;#39;https://cdn.jsdelivr.net/npm/lxgw-wenkai-screen-web/style.css?display=swap&amp;#39;);
@import url(&amp;#39;https://cdn.jsdelivr.net/npm/@fontsource/fira-mono@5.2.7/index.min.css&amp;#39;);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 &lt;code&gt;assets/scss/override.scss&lt;/code&gt; 中定义字体覆盖变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@forward &amp;#34;variables&amp;#34; with (
 $global-font-family: (&amp;#39;LXGW WenKai Screen&amp;#39;, &amp;#39;PingFang SC&amp;#39;, &amp;#39;Microsoft YaHei&amp;#39;, serif),
 $code-font-family: (&amp;#39;Fira Mono&amp;#39;, &amp;#39;JetBrains Mono&amp;#39;, monospace),
);&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="参考"&gt;&lt;span&gt;参考&lt;/span&gt;
 &lt;a href="#%e5%8f%82%e8%80%83" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Hugo 官方文档：&lt;a href="https://gohugo.io/documentation/" target="_blank" rel="external nofollow noopener noreferrer"&gt;gohugo.io/documentation&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hugo 主题市场：&lt;a href="https://themes.gohugo.io/" target="_blank" rel="external nofollow noopener noreferrer"&gt;themes.gohugo.io&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;（300+ 免费主题）&lt;/li&gt;
&lt;li&gt;GitHub Pages 免费托管：&lt;a href="https://gohugo.io/host-and-deploy/host-on-github-pages/" target="_blank" rel="external nofollow noopener noreferrer"&gt;gohugo.io/host-on-github-pages&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Claude Code使用指南</title><link>https://xiongneng.me/posts/ai/claudecode-handbook/</link><pubDate>Tue, 21 Apr 2026 22:11:35 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/ai/claudecode-handbook/</guid><category domain="https://xiongneng.me/categories/ai/">AI</category><description>&lt;p&gt;Claude Code‌是 Anthropic 公司推出的终端 AI 编程助手，可通过命令行界面直接读取、编辑代码库并执行开发任务。当今世界AI编程助手稳坐第一。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;智能文件操作‌：自动读取和分析项目文件，理解代码结构和上下文，无需手动添加文件到对话中 。‌&lt;/li&gt;
&lt;li&gt;全项目上下文‌：理解整个代码库的架构和依赖关系，支持跨文件追踪代码依赖 。‌&lt;/li&gt;
&lt;li&gt;自主任务执行‌：可读取、编辑、创建文件，执行 shell 命令，运行测试和构建流程 。‌&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="heading-element" id="安装脚本"&gt;&lt;span&gt;安装脚本&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85%e8%84%9a%e6%9c%ac" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;打开Windows PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;irm https://claude.ai/install.ps1 | iex&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;后续如果更新到最新版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;claude update&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="配置文件"&gt;&lt;span&gt;配置文件&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;下载cc-switch，添加智普GLM供应商，配置好API Key，选择模型名称统一为&lt;code&gt;glm-5.1&lt;/code&gt;。
按智普官网文档，还要新建一个&lt;code&gt;~/.claude/.claude.json&lt;/code&gt;，内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
 &amp;#34;hasCompletedOnboarding&amp;#34;: true
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;主配置文件为&lt;code&gt;~/.claude/settings.json&lt;/code&gt;，在其中添加权限配置，设置编辑文件和执行命令时都不需要确认。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
 &amp;#34;permissions&amp;#34;: {
 &amp;#34;defaultMode&amp;#34;: &amp;#34;acceptEdits&amp;#34;,
 &amp;#34;allow&amp;#34;: [ &amp;#34;Read&amp;#34;, &amp;#34;Write&amp;#34;, &amp;#34;Edit&amp;#34;, &amp;#34;Glob&amp;#34;, &amp;#34;Grep&amp;#34;, &amp;#34;Bash(*)&amp;#34;, &amp;#34;PowerShell(*)&amp;#34; ],
 &amp;#34;deny&amp;#34;: [ &amp;#34;Bash(rm -rf *)&amp;#34;, &amp;#34;Bash(curl * | *bash)&amp;#34; ]
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;完全不需要任何确认，则使用启动参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;claude --dangerously-skip-permissions&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="安装技能"&gt;&lt;span&gt;安装技能&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85%e6%8a%80%e8%83%bd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;两个SKILL市场网站，一个中文一个英文：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.agentskills.in/zh-CN" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://www.agentskills.in/zh-CN&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skills.sh/" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://skills.sh/&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装技能前提是必须得能访问GitHub网站。&lt;/p&gt;
&lt;p&gt;配置Git代理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global http.proxy http://127.0.0.1:8086
git config --global https.proxy http://127.0.0.1:8086
git config --global http.sslVerify false

#取消
git config --global --unset http.proxy
git config --global --unset https.proxy

#查看
git config list --global&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;skills.sh&lt;/code&gt;安装方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx skills list #项目级
npx skills list -g #全局级
npx skills add https://github.com/anthropics/skills --skill pdf -g&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;agentskills.in&lt;/code&gt;安装方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx agent-skills-cli install @anthropics/pdf -g&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装技能列表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;find-skills&lt;/strong&gt;：当用户询问&amp;quot;如何做某事&amp;quot;、&amp;ldquo;寻找某技能&amp;quot;或希望扩展功能时，帮助发现并安装智能体技能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skill-creator&lt;/strong&gt;：创建有效技能指南。当用户希望创建新技能或更新现有技能时使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;frontend-design&lt;/strong&gt;：创建具有高品质设计、独特且适用于生产环境的前端用户界面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;web-design-guidelines&lt;/strong&gt;：审查UI代码以确保符合Web界面指南。当被要求“审查我的UI”、“检查可访问性”、“审计设计”时使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ui-ux-pro-max&lt;/strong&gt;：提供 UI/UX 设计智能与实现指导，帮助打造精美界面。适用于前端 UI生成/评审/改进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;agent-browser&lt;/strong&gt;：无头浏览器自动化CLI，允许AI代理通过结构化命令执行页面导航、点击、输入和快照操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;playwright-cli&lt;/strong&gt;：自动化浏览器交互，用于网页测试、表单填写、截图和数据提取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pptx&lt;/strong&gt;：使用设计指导和质量保证工作流程创建、编辑、阅读和操作 PowerPoint 演示文稿。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;xlsx&lt;/strong&gt;：创建、编辑和分析带有公式、格式和计算正确的Excel电子表格。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pdf&lt;/strong&gt;：全面的PDF处理功能，包括文本提取、合并、拆分、表单填写及OCR识别能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;self-improving-agent&lt;/strong&gt;：记录经验教训、错误及修正以实现持续改进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;planning-with-files&lt;/strong&gt;：使用文件做任务规划，用于组织和跟踪复杂任务的进度。创建&lt;code&gt;task_plan.md&lt;/code&gt;、&lt;code&gt;findings.md&lt;/code&gt;和&lt;code&gt;progress.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tavily-search&lt;/strong&gt;：面向AI和RAG（检索增强生成）的搜索。返回结构化/摘要信息，附带来源。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装命令列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx skills add https://github.com/vercel-labs/skills --skill find-skills -g
npx skills add https://github.com/anthropics/skills --skill skill-creator -g
npx skills add https://github.com/anthropics/skills --skill frontend-design -g
npx skills add https://github.com/vercel-labs/agent-skills --skill web-design-guidelines -g
npx skills add https://github.com/nextlevelbuilder/ui-ux-pro-max-skill --skill ui-ux-pro-max -g
npx skills add https://github.com/vercel-labs/agent-browser --skill agent-browser -g
npx skills add https://github.com/microsoft/playwright-cli --skill playwright-cli -g
npx skills add https://github.com/anthropics/skills --skill pptx -g
npx skills add https://github.com/anthropics/skills --skill xlsx -g
npx skills add https://github.com/anthropics/skills --skill pdf -g
npx skills add https://github.com/charon-fan/agent-playbook --skill self-improving-agent -g
npx skills add https://github.com/othmanadi/planning-with-files --skill planning-with-files -g
npx skills add https://github.com/tavily-ai/skills --skill tavily-search -g&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="superpowers"&gt;&lt;span&gt;Superpowers&lt;/span&gt;
 &lt;a href="#superpowers" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Superpowers 是一个强化编程工作流的插件（Skills 框架），核心是给 Claude 套上软件工程纪律，让它按规范流程写代码，而不是即兴输出。
固定的7 步标准化开发流程，全程按顺序走，每个阶段对应一个独立的技能（Skill），按顺序自动触发：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;brainstorming：苏格拉底式提问，澄清需求，输出设计文档&lt;/li&gt;
&lt;li&gt;using-git-worktrees：创建隔离的 Git 工作区，验证测试基线&lt;/li&gt;
&lt;li&gt;writing-plans：把工作拆成 2-5 分钟的小任务，每个任务有完整代码和验证步骤。&lt;/li&gt;
&lt;li&gt;subagent-driven-development：每个任务派一个独立子代理执行，两阶段审查。&lt;/li&gt;
&lt;li&gt;test-driven-development：强制 RED-GREEN-REFACTOR：先写失败测试 → 实现 → 通过 → 重构。&lt;/li&gt;
&lt;li&gt;requesting-code-review：审查代码质量和规格合规性，Critical 问题阻断进度&lt;/li&gt;
&lt;li&gt;finishing-a-development-branch：验证测试全部通过，合并 / PR / 清理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;打开Claude Code后执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 注册市场
/plugin marketplace add obra/superpowers-marketplace
# 安装插件
/plugin install superpowers@superpowers-marketplace&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="openspec"&gt;&lt;span&gt;OpenSpec&lt;/span&gt;
 &lt;a href="#openspec" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;OpenSpec 是 Fission AI 团队做的规约框架。核心理念就一句话：写代码之前，先把要做什么写清楚，而且要写成 AI 可读的格式。
它不是让你写 PRD 文档那种纯文本。OpenSpec 的产物是结构化的 Markdown 文件，AI 编程助手可以直接读取、理解、执行。&lt;/p&gt;
&lt;p&gt;在终端中全局安装 OpenSpec：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g @fission-ai/openspec@latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装后使用 &lt;code&gt;openspec --version&lt;/code&gt; 检查版本号，确认安装成功。&lt;/p&gt;
&lt;p&gt;设置环境变量关闭遥测：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;OPENSPEC_TELEMETRY=0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;项目初始化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入项目：&lt;code&gt;cd your-project&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;执行初始化：&lt;code&gt;openspec init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选择工具：在交互界面中，通过方向键和空格键选择 Claude Code。&lt;/li&gt;
&lt;li&gt;初始化完成后，会在项目根目录创建 &lt;code&gt;openspec/&lt;/code&gt; 目录和针对 Claude Code 的斜杠命令（Slash Commands）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心工作流&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OpenSpec 将开发工作拆解为下面4个阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📝 提案：描述目标，AI 生成任务清单，人类审查确认。在 Claude Code 中输入 &lt;code&gt;/opsx:propose&lt;/code&gt; 后跟功能描述。&lt;/li&gt;
&lt;li&gt;⚙️ 实施：命令 AI 自动完成任务清单。确认提案后，使用 &lt;code&gt;/opsx:apply&lt;/code&gt; 进入编码阶段。&lt;/li&gt;
&lt;li&gt;✅ 验证（可选）：利用 &lt;code&gt;openspec-validate-change&lt;/code&gt; 技能检查代码与规范的匹配度。&lt;/li&gt;
&lt;li&gt;🗄️ 归档：功能完成后归档变更，更新主规范，让 &lt;code&gt;openspec/specs/&lt;/code&gt; 保持最新。使用 &lt;code&gt;/opsx:archive&lt;/code&gt; 命令完成变更归档。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="heading-element" id="优秀实践"&gt;&lt;span&gt;优秀实践&lt;/span&gt;
 &lt;a href="#%e4%bc%98%e7%a7%80%e5%ae%9e%e8%b7%b5" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;h3 class="heading-element" id="安装karpathy准则"&gt;&lt;span&gt;安装Karpathy准则&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85karpathy%e5%87%86%e5%88%99" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;一个单一的 &lt;code&gt;CLAUDE.md&lt;/code&gt; 文件，用于改善 Claude Code 的行为，源自 Andrej Karpathy 的观察 关于 LLM 编码陷阱的总结。
项目地址：https://github.com/forrestchang/andrej-karpathy-skills&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选项 A：Claude Code 插件（推荐）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Claude Code 中，首先添加插件市场：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/plugin marketplace add https://github.com/forrestchang/andrej-karpathy-skills.git&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后安装插件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/plugin install andrej-karpathy-skills@karpathy-skills&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这会将指南安装为 Claude Code 插件，使其在你所有项目中可用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选项 B：CLAUDE.md（按项目）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;新项目：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -o CLAUDE.md https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;已有项目（追加）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;#34;&amp;#34; &amp;gt;&amp;gt; CLAUDE.md
curl https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/main/CLAUDE.md &amp;gt;&amp;gt; CLAUDE.md&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;如何判断它在起作用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你看到以下情况，说明这些指南正在发挥作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;diff 中不必要的改动更少&lt;/strong&gt; —— 只有请求的改动出现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;因过度复杂而导致的重写更少&lt;/strong&gt; —— 代码第一次就写得简洁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;澄清问题在实现之前提出&lt;/strong&gt; —— 而不是在犯错之后&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;干净、精简的 PR&lt;/strong&gt; —— 没有顺带的重构或&amp;quot;改进&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些指南设计用于与项目特定指令合并。将它们添加到你现有的 &lt;code&gt;CLAUDE.md&lt;/code&gt; 或创建一个新的。
对于项目特定规则，添加如下章节：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 项目特定指南

- 使用 TypeScript 严格模式
- 所有 API 端点必须有测试
- 遵循 `src/utils/errors.ts` 中现有的错误处理模式&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="designmd"&gt;&lt;span&gt;DESIGN.md&lt;/span&gt;
 &lt;a href="#designmd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;VoltAgent/awesome-design-md&lt;/code&gt;是一个前端页面设计&lt;code&gt;DESIGN.md&lt;/code&gt;风格库，给AI补一套审美说明书。
地址：https://github.com/VoltAgent/awesome-design-md&lt;/p&gt;
&lt;p&gt;使用非常简单，先打开网站：https://getdesign.md/ 找到一个你想要的UI风格主题，把对应文件夹中的&lt;code&gt;DESIGN.md&lt;/code&gt;复制到项目根目录。
然后你就可以跟AI Agent说：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;build me a page that looks like this&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="skilltavily-search"&gt;&lt;span&gt;【SKILL】tavily-search&lt;/span&gt;
 &lt;a href="#skilltavily-search" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;首先免费获取 API Key：访问 &lt;a href="https://tavily.com/" target="_blank" rel="external nofollow noopener noreferrer"&gt;Tavily官网&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 注册，可以免费获取一个月度1000次查询的API Key。
然后设置环境变量TAVILY_API_KEY为刚刚申请到的API Key。完成设置后，请完全退出并重启 Claude Code，让配置生效。&lt;/p&gt;
&lt;p&gt;AI 自动模式（推荐）：直接在对话中提出你的需求，AI 会根据情况自动调用搜索。这是最自然直观的方式。
示例提问：“帮我搜索一下过去一周内，关于AI Agent领域的重要融资事件”&lt;/p&gt;
&lt;p&gt;命令手动调用：你也可以用明确的斜杠命令，指定让它执行哪种任务。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索：/tavily-search 2026年最新的前端框架趋势&lt;/li&gt;
&lt;li&gt;提取网页：/tavily-extract &lt;a href="https://example.com/blog/post" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://example.com/blog/post&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;爬取站点：/tavily-crawl &lt;a href="https://docs.example.com" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://docs.example.com&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;深度研究：/tavily-research 大语言模型的市场竞争格局&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="heading-element" id="skill洁癖"&gt;&lt;span&gt;【SKILL】洁癖&lt;/span&gt;
 &lt;a href="#skill%e6%b4%81%e7%99%96" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;大家现在也都知道，在很多时候，你的Agent之所以越用越笨，其实是因为，你的上下文过于混乱。
上下文不止是你跟你的Agent在单次对话中的聊天记录，也包括你这个项目里面的，各种文档，还有约束，还有记忆。&lt;/p&gt;
&lt;p&gt;它的功能是在开发阶段结束后，自动审查并同步项目文档（&lt;code&gt;CLAUDE.md&lt;/code&gt;、&lt;code&gt;README.md&lt;/code&gt;、&lt;code&gt;docs/&lt;/code&gt;）和 Agent 记忆，确保知识体系与代码保持一致。&lt;/p&gt;
&lt;p&gt;如果你用Agent开发过任何东西，你就知道，一个项目里的知识其实分三层，每一层服务的人不太一样。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一层是Agent自己的记忆系统，过去的聊天记录、项目的隐性知识。&lt;/li&gt;
&lt;li&gt;第二层是项目根目录的&lt;code&gt;CLAUDE.md&lt;/code&gt;，给AI自己看的，项目约定、结构、红线、路由清单等等。&lt;/li&gt;
&lt;li&gt;第三层是&lt;code&gt;docs/&lt;/code&gt;目录和&lt;code&gt;README.md&lt;/code&gt;，给其他人看的，比如Agent、同事、下游开发者等等，比如接入指南、架构说明、运维手册等等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;项目地址：https://github.com/KKKKhazix/khazix-skills&lt;/p&gt;
&lt;p&gt;打开Claude Code后直接跟它讲&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;帮我安装这个 skill：https://github.com/KKKKhazix/khazix-skills/tree/main/neat-freak&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;触发提示词，退出会话的时候最好都执行一遍：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/neat # 直接命令
整理一下 # 自然语言
同步一下 # 自然语言
sync up # English&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="skillagent-browser"&gt;&lt;span&gt;【SKILL】agent-browser&lt;/span&gt;
 &lt;a href="#skillagent-browser" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;安装 CLI 工具&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g agent-browser
agent-browser install # 自动下载 Chromium&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;直接用中文指令，Claude 自动转命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;测试表单：&amp;ldquo;打开 http://localhost/register ，填 test 和 123456，提交并截图错误提示&amp;rdquo;&lt;/li&gt;
&lt;li&gt;UI 验证：&amp;ldquo;访问首页，全屏截图，检查导航栏是否正常显示&amp;rdquo;&lt;/li&gt;
&lt;li&gt;流程自动化：&amp;ldquo;登录后台，点击‘用户列表’，滚动到底部，截图所有数据&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="heading-element" id="skillplaywright-cli"&gt;&lt;span&gt;【SKILL】playwright-cli&lt;/span&gt;
 &lt;a href="#skillplaywright-cli" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;安装 CLI 工具&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 安装 Playwright
npm install -g playwright
# 2. 安装浏览器（Chromium）
playwright install chromium&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;你可以直接在 Claude 里发指令，让它用 Playwright CLI 帮你写自动化脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;用 playwright-cli 打开 localhost:3000，点击登录按钮，输入账号密码，截图验证。&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Ubuntu24安装Hermes Agent</title><link>https://xiongneng.me/posts/ai/hermes-ubuntu-install/</link><pubDate>Sun, 19 Apr 2026 07:47:29 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/ai/hermes-ubuntu-install/</guid><category domain="https://xiongneng.me/categories/ai/">AI</category><description>&lt;p&gt;Hermes Agent 是 Nous Research 今年 2 月底开源的 AI 智能体框架。&lt;/p&gt;
&lt;p&gt;上线不到两个月，GitHub 星标冲到了三万多。社区里不少人把它称为 OpenClaw 上线以来，第一个真正意义上的竞争对手。&lt;/p&gt;
&lt;p&gt;OpenClaw 的核心是一个 Gateway。网关守护进程，负责统一管理会话、路由消息、连接各种聊天平台。
你可以理解成一个调度中心，把所有聊天应用接到 AI Agent 上。龙虾解决的核心问题是：怎么把消息送到 Agent。&lt;/p&gt;
&lt;p&gt;Hermes 不太关心这个，它更在意的是：Agent 怎么变得越来越强。官方管这叫 &lt;code&gt;closed learning loop&lt;/code&gt;，闭环学习循环。
整个框架围绕的就是一件事——让 Agent 在使用过程中自我进化。&lt;/p&gt;
&lt;p&gt;当它完成一个复杂任务——通常涉及五次以上工具调用——它不是做完就算了。
它会把整个过程沉淀成一份结构化的技能文档，存成 Markdown 文件，放在 &lt;code&gt;~/.hermes/skills/&lt;/code&gt; 目录下。
下次遇到类似任务？直接加载这份技能文档，不用从头解决。
更狠的是，这些技能在使用过程中会自我迭代。Agent 执行某个技能时发现了更好的方法，它会自动更新技能文档。不需要你手动维护。&lt;/p&gt;
&lt;h2 class="heading-element" id="安装脚本"&gt;&lt;span&gt;安装脚本&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85%e8%84%9a%e6%9c%ac" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;一行命令搞定安装。安装脚本会自动处理 Python、Node.js 和所有依赖。MacOS、Linux、WSL2 都能跑。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;装完之后，按照安装指引配置后台模型，这里我选择的是最新的MiniMax2.7。&lt;/p&gt;
&lt;h2 class="heading-element" id="配置飞书接入"&gt;&lt;span&gt;配置飞书接入&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e9%a3%9e%e4%b9%a6%e6%8e%a5%e5%85%a5" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Hermes的飞书接入简单到爆炸，它在配置指导里面会让你扫个二维码就搞定了，你就有了一个能聊天的Hermes机器人。
你不需要去飞书平台去创建应用、配置权限、设置事件与回调。这些它都会自动给你做完。&lt;/p&gt;
&lt;p&gt;将Hermes Gateway安装为系统服务开机自启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo /home/ubuntu/.local/bin/hermes gateway install --system
sudo systemctl restart hermes-gateway
# 查看日志文件
tail -200f ~/.hermes/logs/agent.log&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="迁移openclaw配置"&gt;&lt;span&gt;迁移OpenClaw配置&lt;/span&gt;
 &lt;a href="#%e8%bf%81%e7%a7%bbopenclaw%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;一行命令搞定&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hermes claw migrate --dry-run
hermes claw migrate --overwrite&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;底层模型不会覆盖，如果要修改模型需要执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hermes model&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;还需要编辑文件&lt;code&gt;~/.hermes/.env&lt;/code&gt;把密钥写进去。&lt;/p&gt;</description></item><item><title>小龙虾OpenClaw使用指南</title><link>https://xiongneng.me/posts/ai/openclaw-handbook/</link><pubDate>Tue, 07 Apr 2026 17:15:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/ai/openclaw-handbook/</guid><category domain="https://xiongneng.me/categories/ai/">AI</category><description>&lt;p&gt;记录一些自己在使用OpenClaw过程中的笔记。&lt;/p&gt;
&lt;h2 class="heading-element" id="定时任务cron"&gt;&lt;span&gt;定时任务（Cron）&lt;/span&gt;
 &lt;a href="#%e5%ae%9a%e6%97%b6%e4%bb%bb%e5%8a%a1cron" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;想让龙虾每天早上给你推新闻？那就需要定时任务。
最简单的例子——每天早上 8 点发天气预报：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw cron add --name &amp;#34;天气预报&amp;#34; --cron &amp;#34;0 8 * * *&amp;#34; \
 --message &amp;#34;查询今天西安的天气，发送给我&amp;#34; \
 --channel &amp;#34;feishu&amp;#34; \
 --to &amp;#34;&amp;lt;chat_id&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个chat_id获取可以从日志里面看到。你在飞书群里面@机器人后发信息过来，就可以在日志里面查看到这个群ID。&lt;/p&gt;
&lt;p&gt;飞书channel配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
 &amp;#34;channels&amp;#34;: {
 &amp;#34;feishu&amp;#34;: {
 &amp;#34;appId&amp;#34;: &amp;#34;&amp;lt;appId&amp;gt;&amp;#34;,
 &amp;#34;appSecret&amp;#34;: &amp;#34;&amp;lt;appSecret&amp;gt;&amp;#34;,
 &amp;#34;enabled&amp;#34;: true,
 &amp;#34;connectionMode&amp;#34;: &amp;#34;websocket&amp;#34;,
 &amp;#34;requireMention&amp;#34;: true,
 &amp;#34;groupPolicy&amp;#34;: &amp;#34;open&amp;#34;,
 &amp;#34;groups&amp;#34;: {
 &amp;#34;*&amp;#34;: {
 &amp;#34;requireMention&amp;#34;: true
 }
 },
 &amp;#34;dmPolicy&amp;#34;: &amp;#34;pairing&amp;#34;
 }
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;三种调度方式按需选：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 固定周期：每 30 分钟执行一次
openclaw cron add --name &amp;#34;定期检查&amp;#34; --every 30m \
 --message &amp;#34;检查有没有需要我处理的事情&amp;#34; \
 --channel &amp;#34;feishu&amp;#34; \
 --to &amp;#34;&amp;lt;chat_id&amp;gt;&amp;#34;

# 一次性延时：20 分钟后提醒
openclaw cron add --name &amp;#34;提醒&amp;#34; --at 20m \
 --message &amp;#34;提醒：该休息一下了！&amp;#34; \
 --channel &amp;#34;feishu&amp;#34; \
 --to &amp;#34;&amp;lt;chat_id&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;任务定义的配置文件位于&lt;code&gt;~/.openclaw/cron/jobs.json&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;管理定时任务命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw cron list # 查看所有任务
openclaw cron run &amp;lt;taskId&amp;gt; # 手动触发一次
openclaw cron runs --id &amp;lt;taskId&amp;gt; # 查看执行历史
openclaw cron disable &amp;lt;taskId&amp;gt; # 暂停
openclaw cron enable &amp;lt;taskId&amp;gt; # 恢复
openclaw cron edit &amp;lt;job-id&amp;gt; --message &amp;#34;新指令&amp;#34; # 修改指令内容
openclaw cron edit &amp;lt;job-id&amp;gt; --name &amp;#34;新名称&amp;#34; # 修改指令名称
openclaw cron rm &amp;lt;taskId&amp;gt; # 删除&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="workspace文件一览"&gt;&lt;span&gt;Workspace文件一览&lt;/span&gt;
 &lt;a href="#workspace%e6%96%87%e4%bb%b6%e4%b8%80%e8%a7%88" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;工作区（Workspace）是龙虾的&amp;quot;家&amp;quot;——它的身份、性格、记忆、技能全都存放在这里。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;文件&lt;/th&gt;
 &lt;th&gt;用途&lt;/th&gt;
 &lt;th&gt;加载时机&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;AGENTS.md&lt;/td&gt;
 &lt;td&gt;操作指令：告诉龙虾&amp;quot;怎么做事&amp;quot;和如何使用记忆&lt;/td&gt;
 &lt;td&gt;每次会话开始&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SOUL.md&lt;/td&gt;
 &lt;td&gt;Agent人设：性格、语气、边界&lt;/td&gt;
 &lt;td&gt;每次会话开始&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;USER.md&lt;/td&gt;
 &lt;td&gt;用户资料：你是谁、怎么称呼你&lt;/td&gt;
 &lt;td&gt;每次会话开始&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IDENTITY.md&lt;/td&gt;
 &lt;td&gt;龙虾身份：名字、风格、表情符号&lt;/td&gt;
 &lt;td&gt;每次会话开始&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;TOOLS.md&lt;/td&gt;
 &lt;td&gt;工具使用备注（不控制工具开关，只是使用建议）&lt;/td&gt;
 &lt;td&gt;每次会话开始&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;HEARTBEAT.md&lt;/td&gt;
 &lt;td&gt;心跳任务清单&lt;/td&gt;
 &lt;td&gt;心跳运行时&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BOOT.md&lt;/td&gt;
 &lt;td&gt;启动清单（可选，Gateway 重启时执行）&lt;/td&gt;
 &lt;td&gt;Gateway 启动时&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BOOTSTRAP.md&lt;/td&gt;
 &lt;td&gt;首次引导仪式（完成后删除）&lt;/td&gt;
 &lt;td&gt;仅首次引导运行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MEMORY.md&lt;/td&gt;
 &lt;td&gt;长期记忆（可选）&lt;/td&gt;
 &lt;td&gt;仅主会话&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;memory/YYYY-MM-DD.md&lt;/td&gt;
 &lt;td&gt;每日记忆日志&lt;/td&gt;
 &lt;td&gt;每次会话开始：今天+昨天；其余按需读取&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;skills/&lt;/td&gt;
 &lt;td&gt;工作区级技能（可选）&lt;/td&gt;
 &lt;td&gt;按需加载&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;备注：&lt;code&gt;BOOT.md&lt;/code&gt; (可选的启动检查清单)：仅在开启内部钩子（internal hooks）后才会在 Gateway 重启时执行。
它是一个完全可选的功能，通常需要用户手动创建或通过设置启用，因此在全新工作区中它不会自动生成。&lt;/p&gt;
&lt;p&gt;这些文件在每次对话时都会注入到 AI 模型的上下文窗口中，会消耗 Token。保持文件简洁，尤其是 MEMORY.md——它会随时间增长，
导致上下文使用量增大和更频繁的压缩。
&lt;code&gt;memory/YYYY-MM-DD.md &lt;/code&gt;中今天和昨天的文件会在会话开始时自动读取，其余日期的文件通过 &lt;code&gt;memory_search&lt;/code&gt; 和 &lt;code&gt;memory_get&lt;/code&gt;
工具按需访问，不占用上下文窗口。&lt;/p&gt;
&lt;p&gt;先配好身份三件套（让龙虾认识你），再写 AGENTS.md（教它做事），其余按需添加。
每个文件都是纯 Markdown，直接用文本编辑器编辑即可。9 个文件看起来不少，但它们各司其职，可以分为四组来理解：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;分组&lt;/th&gt;
 &lt;th&gt;文件&lt;/th&gt;
 &lt;th&gt;一句话说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;身份三件套&lt;/td&gt;
 &lt;td&gt;IDENTITY.md / SOUL.md / USER.md&lt;/td&gt;
 &lt;td&gt;龙虾是谁、什么性格、服务谁&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;行为指南&lt;/td&gt;
 &lt;td&gt;AGENTS.md / TOOLS.md&lt;/td&gt;
 &lt;td&gt;怎么做事、怎么用工具&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;记忆系统&lt;/td&gt;
 &lt;td&gt;MEMORY.md&lt;/td&gt;
 &lt;td&gt;跨会话记住什么&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;生命周期&lt;/td&gt;
 &lt;td&gt;BOOTSTRAP.md / BOOT.md / HEARTBEAT.md&lt;/td&gt;
 &lt;td&gt;首次启动 → 每次重启 → 定期巡检&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 class="heading-element" id="identitymd"&gt;&lt;span&gt;IDENTITY.md&lt;/span&gt;
 &lt;a href="#identitymd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# 身份

- 名字：小南瓜
- 物种：一只住在电脑里的龙虾 🦞
- 称呼用户：熊二
- 气质：温暖但不啰嗦，偶尔也会有点小幽默
- 语言：中文为主，技术术语保留英文
- 表情符号：🎃（签名）、✅❌（判断）、🔥（重要）、💡（建议）
- 头像：avatars/lobster.png
- 签名风格：回复末尾不加落款，不用&amp;#34;祝好&amp;#34;之类的客套&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="soulmd"&gt;&lt;span&gt;SOUL.md&lt;/span&gt;
 &lt;a href="#soulmd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# 人设

你不是通用助手。
你是我的 OpenClaw Agent系统搭建助手。

## 你的核心任务
- 帮我把 Agent 系统搭稳
- 优先给可执行方案，不给空泛建议
- 默认先完成最小闭环，再谈优化

## 你的说话方式
- 先给结论
- 少讲概念
- 少用正确但没用的废话
- 能给命令就直接给命令

## 你的工作原则
- 不讨论政治、宗教等敏感话题
- 不泄露密钥、令牌、账号信息
- 遇到高风险操作先确认
- 不确定就直说不确定
- 不要为了显得聪明而编造结论
- 不擅自替我做对外承诺

## 延续性
- 每次会话你都是全新醒来的，工作区文件就是你的记忆
- 重要的事情写进文件，不要&amp;#34;心里记着&amp;#34;
- 如果你修改了这个文件，告诉用户——这是你的灵魂，他们应该知道

---

_This file is yours to evolve. As you learn who you are, update it._&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="usermd"&gt;&lt;span&gt;USER.md&lt;/span&gt;
 &lt;a href="#usermd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# 用户信息

## 基本资料
- 称呼：熊二
- 角色：AI高级工程师
- 公司/团队：柠檬树工作室
- 时区：Asia/Shanghai
- 工作语言：中文
- 工作时间：周一至周天 9:00-22:00

## 工作偏好
- 先看结论，再看解释
- 喜欢可执行动作，不喜欢空谈
- 重视 ROI、速度、闭环
- 讨厌 AI 味太重、太工整、太像汇报材料的表达

## 技能水平
- 熟练使用飞书、Excel、PPT等办公软件
- 10年以上的Python/Java/JS开发经验，擅长微服务架构设计、WEB软件开发
- 掌握最新最前沿的AI技术和应用，以及Claude Code、OpenClaw等工具使用。

## 当前重点
- 搭建可长期使用的 OpenClaw Agent 系统
- 让 Agent 真正像员工，不只是像聊天机器人
- 把内容生产、执行、沉淀串成闭环&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="agentsmd"&gt;&lt;span&gt;AGENTS.md&lt;/span&gt;
 &lt;a href="#agentsmd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# 操作指令

## 会话启动
每次会话开始前，依次执行（不需要请示）：
1. 读取 `SOUL.md` —— 了解自己是谁
2. 读取 `USER.md` —— 了解服务对象
3. 读取最近2天的记忆文件 —— 依次尝试读取 `memory/YYYY-MM-DD.md`（今天 &amp;#43; 昨天）文件，存在则读取其内容作为近期上下文，文件不存在则直接跳过。
4. **仅在主会话中**：读取 `MEMORY.md`

## 通用规则
- 收到任务后，先确认理解再执行
- 每完成一个步骤，主动汇报进度
- 遇到错误先尝试自行解决，解决不了再告知用户
- 回复要简洁，不需要&amp;#34;好的，我来帮你&amp;#34;之类的开场白

## 记忆
龙虾每次会话都是全新的，记忆文件是唯一的&amp;#34;前世今生&amp;#34;：
- **每日日志：** `memory/YYYY-MM-DD.md` —— 当天发生了什么
- **长期记忆：** `MEMORY.md` —— 精炼后的持久知识（仅主会话加载）

### 记忆规则
- 用户说&amp;#34;记住这个&amp;#34;时，立即写入 `memory/YYYY-MM-DD.md`
- 重要的长期信息写入 `MEMORY.md`
- 每次会话结束前，主动总结关键决策写入记忆
- 一定要写进文件——&amp;#34;心里记着&amp;#34;熬不过会话重启

### 安全设计
- `MEMORY.md` **不在群聊中加载** —— 防止个人上下文泄露给陌生人
- 这是刻意的隐私保护，不要手动在群聊中读取 `MEMORY.md`

## 红线
- 绝不外泄用户隐私数据
- 执行破坏性命令前必须确认
- 拿不准的事，先问再做

## 群聊礼仪
**该回复时：**
- 被直接 @ 或被提问
- 能提供有价值的信息、见解或帮助

**该沉默时（回复 HEARTBEAT_OK）：**
- 只是人类之间的闲聊
- 已经有人回答了问题
- 对话流畅，不需要你插嘴

人类法则：人在群聊里也不会每条消息都回。龙虾也不应该。

## 心跳 —— 主动巡检
**定期检查（轮流进行，每天 2-4 次）：**
- 邮件 —— 有没有紧急未读？
- 日历 —— 未来 24-48 小时有什么安排？
- 天气 —— 用户可能出门吗？

**该主动汇报时：** 收到重要邮件、日历事件即将到来（&amp;lt; 2 小时）
**该保持安静时：** 深夜时段（23:00-08:00）、上次检查后没有新消息

## 场景处理 —— 遇到特定需求怎么办

### 日程与提醒类需求
当用户提出涉及日程、提醒的任务时：
1. 确认时间、地点、参与人等关键信息
2. 检查是否与现有日程冲突
3. 创建/修改日程后，汇报确认结果
4. 临近时间主动提醒

### 信息查询类需求
当用户提出&amp;#34;帮我查一下&amp;#34;&amp;#34;看看有没有&amp;#34;类需求时：
1. 优先使用已有工具（搜索、API 调用）获取信息
2. 结果要结构化呈现（表格、列表），不要大段文字
3. 标注信息来源和时效性

### 文件与内容类需求
当用户提出涉及文件整理、文案撰写的任务时：
1. 确认具体要求（格式、风格、长度）
2. 先给出大纲或草稿，确认方向无误再完善
3. 完成后列出要点摘要，方便用户快速检查&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="toolsmd"&gt;&lt;span&gt;TOOLS.md&lt;/span&gt;
 &lt;a href="#toolsmd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# 工具使用说明

## exec（命令执行）
- 长时间运行的命令加 timeout&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="bootstrapmd"&gt;&lt;span&gt;BOOTSTRAP.md&lt;/span&gt;
 &lt;a href="#bootstrapmd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# 引导仪式

## 第一步：认识自己
通过对话确认以下信息，写入 `IDENTITY.md`：
1. 你叫什么名字？（比如：阿虾、Lobster、小龙）
2. 你是什么&amp;#34;物种&amp;#34;？（AI 助手？电子龙虾？数字精灵？）
3. 你的气质是什么？（温暖？犀利？幽默？沉稳？）
4. 选一个专属表情符号（比如 🦞）

## 第二步：认识主人
通过对话确认以下信息，写入 USER.md：
1. 怎么称呼你？（名字或昵称）
2. 你的时区是？
3. 你平时做什么工作？
4. 你喜欢什么样的沟通方式？（简洁 or 详细？正式 or 随意？）

## 第三步：定性格
打开 SOUL.md，一起聊聊：
- 什么话题不该碰？（政治？宗教？其他？）
- 什么操作必须先问？（删除文件？发送消息？花钱？）
- 出错了怎么处理？（直接道歉还是解释原因？）

## 完成后
- 确认 `IDENTITY.md`、`USER.md`、`SOUL.md` 都已写入
- 删除这个文件——你不再需要引导脚本了&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="heartbeatmd"&gt;&lt;span&gt;HEARTBEAT.md&lt;/span&gt;
 &lt;a href="#heartbeatmd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# 心跳任务

- 检查 `memory/` 目录，清理超过 30 天的日志&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="技能安装"&gt;&lt;span&gt;技能安装&lt;/span&gt;
 &lt;a href="#%e6%8a%80%e8%83%bd%e5%ae%89%e8%a3%85" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;技能市场主要有两个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://clawhub.ai/" target="_blank" rel="external nofollow noopener noreferrer"&gt;ClawHub 原版&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skillhub.cn/" target="_blank" rel="external nofollow noopener noreferrer"&gt;ClawHub 中文&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ClawHub原版技能安装命令（推荐）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 默认安装在workspace目录下
clawhub install &amp;lt;skill-name&amp;gt;
# 可以通过添加指定目录安装在全局技能目录
clawhub install &amp;lt;skill-name&amp;gt; --dir ~/.openclaw/skills&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Skillhub技能安装命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 先安装客户端
curl -fsSL https://skillhub.cn/install/install.sh | bash
# 默认会安装在当前执行命令目录的/skills目录下
# skillhub install &amp;lt;skill-name&amp;gt; 
# 也是通过增加--dir参数指定安装目录
# skillhub --dir ~/.openclaw/skills install &amp;lt;skill-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="热门技能"&gt;&lt;span&gt;热门技能&lt;/span&gt;
 &lt;a href="#%e7%83%ad%e9%97%a8%e6%8a%80%e8%83%bd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;OpenClaw热门技能分类：https://github.com/VoltAgent/awesome-openclaw-skills&lt;/p&gt;
&lt;p&gt;当前已经安装的几个热门Skill：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;agent-browser-clawdbot&lt;/strong&gt;：专为AI智能体优化的无头浏览器自动化CLI，支持无障碍树快照和基于引用的元素选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;playwright-cli-openclaw&lt;/strong&gt;：官方Microsoft Playwright CLI网页自动化工具，支持所有主流浏览器的无头/有头自动化操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;agentmail&lt;/strong&gt;：专为AI智能体设计的API优先邮件平台。支持通过API创建专属邮箱、收发邮件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;caldav-calendar&lt;/strong&gt;：使用 vdirsyncer + khal 同步并查询 CalDAV 日历（iCloud、Google、Fastmail、Nextcloud 等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;elite-longterm-memory&lt;/strong&gt;：专为 Cursor、Claude、ChatGPT 和 Copilot 打造的终极 AI 记忆系统。永不错失上下文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;excel-xlsx&lt;/strong&gt;：创建、检查和编辑 Microsoft Excel 工作簿及 XLSX 文件，支持可靠的公式、日期、类型、格式、重算及模板保留功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;file-manager&lt;/strong&gt;：OpenClaw自动化文件管理助手，用于批量文件操作、智能分类、重复文件清理、文件重命名、目录同步等任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;github&lt;/strong&gt;：使用 &lt;code&gt;gh&lt;/code&gt; CLI 与 GitHub 交互，通过 &lt;code&gt;gh issue&lt;/code&gt;、&lt;code&gt;gh pr&lt;/code&gt;、&lt;code&gt;gh run&lt;/code&gt; 和 &lt;code&gt;gh api&lt;/code&gt; 管理议题、PR、CI 运行及高级查询。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gog&lt;/strong&gt;：Google Workspace 命令行工具，支持 Gmail、日历、云端硬盘、通讯录、表格和文档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;humanizer&lt;/strong&gt;：消除AI写作痕迹，使文本更自然真实。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;openclaw-multi-search-engine&lt;/strong&gt;：多搜索引擎集成，17个引擎（8个国内+9个全球），支持高级搜索运算符、时间筛选、站点搜索。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;planning-with-files&lt;/strong&gt;：使用文件做任务规划，用于组织和跟踪复杂任务的进度。创建&lt;code&gt;task_plan.md&lt;/code&gt;、&lt;code&gt;findings.md&lt;/code&gt;和&lt;code&gt;progress.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;powerpoint-pptx&lt;/strong&gt;：创建、检查和编辑 Microsoft PowerPoint 演示文稿及 PPTX 文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;proactive-agent&lt;/strong&gt;：将AI智能体从任务执行者升级为主动预判需求、持续优化的智能伙伴。集成WAL协议、工作缓冲区、自主定时任务及实战验证模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;self-improving&lt;/strong&gt;：自我反思+自我批评+自我学习+自组织记忆。智能体评估自身工作、发现错误并持续改进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skill-finder-cn&lt;/strong&gt;：Skill 查找器 | Skill Finder. 帮助发现和安装 ClawHub Skills&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skill-vetter&lt;/strong&gt;：AI智能体技能安全预审工具。安装ClawdHub、GitHub等来源技能前，检查风险信号、权限范围及可疑模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;weather&lt;/strong&gt;：获取当前天气和预报（无需API密钥）。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu24安装小龙虾OpenClaw</title><link>https://xiongneng.me/posts/ai/openclaw-ubuntu-install/</link><pubDate>Tue, 31 Mar 2026 21:53:19 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/ai/openclaw-ubuntu-install/</guid><category domain="https://xiongneng.me/categories/ai/">AI</category><description>&lt;p&gt;之前在Windows本地机器安装过OpenClaw，但是不能长期稳定运行，因此最后选择云主机。我选择的是腾讯云主机。配置如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;轻量应用服务器新购	
运算组件: 2核CPU、8GB内存 (锐驰型Linux-2核8G-80G-200Mbps峰值带宽)
系统盘: 80GB SSD云硬盘
峰值带宽: 200Mbps峰值带宽
地域: 中国香港
镜像: Ubuntu 24.04 LTS&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;购买地址：https://cloud.tencent.com/product/lighthouse&lt;/p&gt;
&lt;p&gt;LLM模型购买的套餐MiniMax Max，后台使用模型为MiniMax-M2.7。&lt;/p&gt;
&lt;h2 class="heading-element" id="安装脚本"&gt;&lt;span&gt;安装脚本&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85%e8%84%9a%e6%9c%ac" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;安装NodeJS后，配置国内源码。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm config set strict-ssl false
npm config set registry https://registry.npmmirror.com&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;还要开启代理，因为安装过程要访问Github。如果是香港主机就不需要了。&lt;/p&gt;
&lt;p&gt;注意：下面的API_KEY是Token Plan的那个KEY啊，不是普通的那个API_KEY。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# 一键安装 OpenClaw &amp;#43; MiniMax-M2.7 &amp;#43; 微信（ubuntu 用户专用）
# 替换成你的 MiniMax API Key
API_KEY=&amp;#34;你的MiniMax_API_KEY&amp;#34;
# 1. 安装依赖
sudo apt update -y &amp;amp;&amp;amp; sudo apt install -y qrencode
# 2. 静默安装 OpenClaw
curl -fsSL https://openclaw.ai/install.sh | bash -s -- --yes
# 3. 刷新环境
source ~/.bashrc
echo &amp;#39;export PATH=&amp;#34;$HOME/.openclaw/bin:$PATH&amp;#34;&amp;#39; &amp;gt;&amp;gt; ~/.bashrc
source ~/.bashrc
# 4. 配置 MiniMax-M2.7（香港服务器专用 CN 接口）
openclaw config set llm.provider &amp;#34;minimax-cn&amp;#34;
openclaw config set llm.apiKey &amp;#34;${API_KEY}&amp;#34;
openclaw config set llm.model &amp;#34;MiniMax-M2.7&amp;#34;
openclaw config set llm.maxTokens 4096
# 5. 重启网关
openclaw gateway restart&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="配置微信接入"&gt;&lt;span&gt;配置微信接入&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e5%be%ae%e4%bf%a1%e6%8e%a5%e5%85%a5" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;# 1. 安装微信官方插件
openclaw plugins install @tencent-weixin/openclaw-weixin --yes
# 2. 启用微信通道
openclaw config set plugins.entries.openclaw-weixin.enabled true
# 3. 直接生成微信绑定二维码（无弹窗）
openclaw channels login --channel openclaw-weixin --no-prompt
# 5. 重启网关
openclaw gateway restart
# 重新登录微信（出二维码）
openclaw channels login --channel openclaw-weixin --no-prompt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后在手机上面打开微信的openclaw插件，扫描这个二维码即可完成配对。&lt;/p&gt;
&lt;h3 class="heading-element" id="删除openclaw-weixin"&gt;&lt;span&gt;删除openclaw-weixin&lt;/span&gt;
 &lt;a href="#%e5%88%a0%e9%99%a4openclaw-weixin" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;如果不想使用微信接入了，可以删除掉。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 先停止网关，防止操作过程中状态不一致
openclaw gateway stop
# 2. 在配置中禁用微信通道
openclaw config set channels.openclaw-weixin.enabled false

# 方法一：优先尝试使用官方命令卸载
openclaw plugins uninstall openclaw-weixin
# 方法二：如果官方命令无效，手动删除插件目录
rm -rf ~/.openclaw/extensions/openclaw-weixin

# 1. 重启网关
openclaw gateway restart
# 2. 检查服务状态，确认微信通道已不在列表中或显示为 OFF
openclaw status&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="配置飞书接入"&gt;&lt;span&gt;配置飞书接入&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e9%a3%9e%e4%b9%a6%e6%8e%a5%e5%85%a5" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;h3 class="heading-element" id="飞书平台操作步骤"&gt;&lt;span&gt;飞书平台操作步骤&lt;/span&gt;
 &lt;a href="#%e9%a3%9e%e4%b9%a6%e5%b9%b3%e5%8f%b0%e6%93%8d%e4%bd%9c%e6%ad%a5%e9%aa%a4" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1、登录飞书开放平台：访问飞书开放平台，登录你的飞书账号。
2、创建企业自建应用：点击“创建企业自建应用”，填写名称（如“OpenClaw 助手”）和描述后点击“创建”。
3、获取应用凭证（App ID 和 App Secret）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入应用管理页，在左侧菜单找到“凭证与基础信息”。&lt;/li&gt;
&lt;li&gt;在此页面找到“App ID”和“App Secret”，点击复制并妥善保存。
4、添加机器人能力：在左侧菜单点击“添加应用能力”，找到并添加“机器人”能力。
5、配置应用权限：在左侧菜单进入“权限管理”，点击“批量导入/导出权限”，选择“应用身份权限”后将下方 JSON 代码粘贴进去，点击“申请开通”&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
 &amp;#34;scopes&amp;#34;: {
 &amp;#34;tenant&amp;#34;: [
 &amp;#34;application:application:self_manage&amp;#34;,
 &amp;#34;application:bot.menu:write&amp;#34;,
 &amp;#34;aily:file:read&amp;#34;,
 &amp;#34;aily:file:write&amp;#34;,
 &amp;#34;cardkit:card:read&amp;#34;,
 &amp;#34;cardkit:card:write&amp;#34;,
 &amp;#34;contact:contact.base:readonly&amp;#34;,
 &amp;#34;contact:user.base:readonly&amp;#34;,
 &amp;#34;contact:user.employee_id:readonly&amp;#34;,
 &amp;#34;corehr:file:download&amp;#34;,
 &amp;#34;docs:document.comment:create&amp;#34;,
 &amp;#34;docs:document.comment:delete&amp;#34;,
 &amp;#34;docs:document.comment:read&amp;#34;,
 &amp;#34;docs:document.comment:update&amp;#34;,
 &amp;#34;docs:document.comment:write_only&amp;#34;,
 &amp;#34;docx:document.block:convert&amp;#34;,
 &amp;#34;docx:document:create&amp;#34;,
 &amp;#34;docx:document:readonly&amp;#34;,
 &amp;#34;docx:document:write_only&amp;#34;,
 &amp;#34;docs:document.content:read&amp;#34;,
 &amp;#34;drive:drive.metadata:readonly&amp;#34;,
 &amp;#34;drive:drive.search:readonly&amp;#34;,
 &amp;#34;search:docs:read&amp;#34;,
 &amp;#34;sheets:spreadsheet&amp;#34;,
 &amp;#34;wiki:wiki:readonly&amp;#34;,
 &amp;#34;im:chat&amp;#34;,
 &amp;#34;im:chat:read&amp;#34;,
 &amp;#34;im:chat:readonly&amp;#34;,
 &amp;#34;im:chat:update&amp;#34;,
 &amp;#34;im:chat.members:bot_access&amp;#34;,
 &amp;#34;im:message&amp;#34;,
 &amp;#34;im:message.group_at_msg:readonly&amp;#34;,
 &amp;#34;im:message.group_msg&amp;#34;,
 &amp;#34;im:message.p2p_msg:readonly&amp;#34;,
 &amp;#34;im:message.pins:read&amp;#34;,
 &amp;#34;im:message.pins:write_only&amp;#34;,
 &amp;#34;im:message.reactions:read&amp;#34;,
 &amp;#34;im:message.reactions:write_only&amp;#34;,
 &amp;#34;im:message:readonly&amp;#34;,
 &amp;#34;im:message:recall&amp;#34;,
 &amp;#34;im:message:send_as_bot&amp;#34;,
 &amp;#34;im:message:send_multi_users&amp;#34;,
 &amp;#34;im:message:send_sys_msg&amp;#34;,
 &amp;#34;im:message:update&amp;#34;,
 &amp;#34;im:resource&amp;#34;
 ],
 &amp;#34;user&amp;#34;: [
 &amp;#34;contact:user.employee_id:readonly&amp;#34;,
 &amp;#34;offline_access&amp;#34;,
 &amp;#34;contact:contact.base:readonly&amp;#34;,
 &amp;#34;aily:file:read&amp;#34;,
 &amp;#34;aily:file:write&amp;#34;,
 &amp;#34;im:chat.access_event.bot_p2p_chat:read&amp;#34;
 ]
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;6、配置事件订阅：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;事件与回调的配置，都设置成&lt;code&gt;使用长连接接收事件&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;然后在事件配置，这里点击添加事件，增加下面的几个订阅事件。&lt;/li&gt;
&lt;li&gt;在版本管理与发布中，把这个新的应用发布上线。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;订阅事件说明：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;事件&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;im.message.receive_v1&lt;/td&gt;
 &lt;td&gt;接受消息（必须）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;im.message.message_read_v1&lt;/td&gt;
 &lt;td&gt;消息已读回执&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;im.chat.member.bot.added_v1&lt;/td&gt;
 &lt;td&gt;机器人进群&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;im.chat.member.bot.deleted_v1&lt;/td&gt;
 &lt;td&gt;机器人被移出群&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 class="heading-element" id="在-openclaw-中配置飞书纯命令行操作"&gt;&lt;span&gt;在 OpenClaw 中配置飞书（纯命令行操作）&lt;/span&gt;
 &lt;a href="#%e5%9c%a8-openclaw-%e4%b8%ad%e9%85%8d%e7%bd%ae%e9%a3%9e%e4%b9%a6%e7%ba%af%e5%91%bd%e4%bb%a4%e8%a1%8c%e6%93%8d%e4%bd%9c" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;回到你的 Ubuntu 服务器，通过 SSH 连接并执行以下命令。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#安装飞书插件
openclaw plugins install feishu-openclaw
#配置飞书通道的 App ID 和 Secret
openclaw config set channels.feishu.appId &amp;#34;cli_xxxxx&amp;#34;
openclaw config set channels.feishu.appSecret &amp;#34;your_app_secret&amp;#34;
#设置核心配置项：继续执行以下命令，确保服务能正确接收并响应消息。
# 1. 启用飞书通道
openclaw config set channels.feishu.enabled true
# 2. 推荐使用 websocket 长连接模式
openclaw config set channels.feishu.connectionMode websocket
# 3. 开启私聊（直接消息），新私聊需配对，保证安全
openclaw config set channels.feishu.dmPolicy pairing
# 4. 只在群聊中被 @ 时才会响应，避免误触发
openclaw config set channels.feishu.requireMention true
#重启 OpenClaw 网关
openclaw gateway restart
#检查服务状态：验证飞书通道是否正常运行。
openclaw status&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="开始配对"&gt;&lt;span&gt;开始配对&lt;/span&gt;
 &lt;a href="#%e5%bc%80%e5%a7%8b%e9%85%8d%e5%af%b9" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1、在飞书 App 中搜索你创建的应用名称（例如“OpenClaw助手”）。
2、进入聊天窗口，发送“你好”等测试消息。机器人会给你回复一个配对指令。
3、然后在命令行执行上面的配对指令：&lt;code&gt;openclaw pairing approve feishu &amp;lt;配对码&amp;gt;&lt;/code&gt; 完成配对&lt;/p&gt;
&lt;h2 class="heading-element" id="后续更新配置"&gt;&lt;span&gt;后续更新配置&lt;/span&gt;
 &lt;a href="#%e5%90%8e%e7%bb%ad%e6%9b%b4%e6%96%b0%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;openclaw configure&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="使用说明"&gt;&lt;span&gt;使用说明&lt;/span&gt;
 &lt;a href="#%e4%bd%bf%e7%94%a8%e8%af%b4%e6%98%8e" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;把脚本中 你的MiniMax_API_KEY 替换成你真实的密钥，格式：sk-xxxxxxx&lt;/li&gt;
&lt;li&gt;用默认用户 ubuntu 登录服务器&lt;/li&gt;
&lt;li&gt;整段粘贴 → 回车运行&lt;/li&gt;
&lt;li&gt;全程全自动，最后直接出二维码&lt;/li&gt;
&lt;li&gt;打开：微信 → 我 → 设置 → 插件 → ClawBot → 扫一扫。绑定成功即可使用 AI 对话&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="heading-element" id="一键开启防火墙只开-22其他全关"&gt;&lt;span&gt;一键开启防火墙（只开 22，其他全关）&lt;/span&gt;
 &lt;a href="#%e4%b8%80%e9%94%ae%e5%bc%80%e5%90%af%e9%98%b2%e7%81%ab%e5%a2%99%e5%8f%aa%e5%bc%80-22%e5%85%b6%e4%bb%96%e5%85%a8%e5%85%b3" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;微信连接完全不受影响，服务器彻底安全。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 重置防火墙
sudo ufw reset
# 只允许 SSH（22 端口），其他全部拒绝
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
# 启用防火墙
sudo ufw enable
# 查看最终状态
sudo ufw status
ubuntu@VM-0-3-ubuntu:~$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere 
22/tcp (v6) ALLOW Anywhere (v6) &lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="管理-openclaw"&gt;&lt;span&gt;管理 OpenClaw&lt;/span&gt;
 &lt;a href="#%e7%ae%a1%e7%90%86-openclaw" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;完全不用网页后台，这样管理 OpenClaw&lt;/p&gt;
&lt;p&gt;1、查看配置（命令行）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看全部配置
openclaw config get
# 查看某一项（比如模型）
openclaw config get llm
openclaw config get llm.apiKey
openclaw config get channels.openclaw-weixin&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改配置（命令行，推荐）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 改模型密钥
openclaw config set llm.apiKey &amp;#34;sk-xxxxxx&amp;#34;
# 改模型
openclaw config set llm.model &amp;#34;MiniMax-M2.7&amp;#34;
# 改最大 token
openclaw config set llm.maxTokens 4096
# 改完重启网关
openclaw gateway restart --yes&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;直接编辑配置文件（进阶）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 备份（好习惯）
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak
# 编辑
nano ~/.openclaw/openclaw.json
# 保存退出：Ctrl&amp;#43;O → 回车 → Ctrl&amp;#43;X
# 重启网关
openclaw gateway restart&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;常用命令（你以后全用这些）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看状态
openclaw status
openclaw gateway status
# 重启
openclaw gateway restart
# 查看日志
openclaw logs --follow&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="安装为系统服务"&gt;&lt;span&gt;安装为系统服务&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85%e4%b8%ba%e7%b3%bb%e7%bb%9f%e6%9c%8d%e5%8a%a1" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;默认安装完成后openclaw网关并没有自动安装为系统服务。可执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tee /etc/systemd/system/openclaw.service &amp;gt; /dev/null &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
[Unit]
Description=OpenClaw AI Gateway
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/home/ubuntu/.openclaw/bin/openclaw gateway start --no-prompt
Restart=always
RestartSec=5
Environment=&amp;#34;PATH=/home/ubuntu/.openclaw/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin&amp;#34;

[Install]
WantedBy=multi-user.target
EOF&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 重新加载服务配置
sudo systemctl daemon-reload
# 开启开机自启
sudo systemctl enable openclaw
# 启动服务
sudo systemctl start openclaw
# 查看状态
sudo systemctl status openclaw
#查看系统所有服务，过滤看看有没有 openclaw 相关自启
systemctl list-unit-files --type=service | grep -E &amp;#39;openclaw|claw&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="执行exec时报权限不足需要pair"&gt;&lt;span&gt;执行exec时报权限不足需要pair&lt;/span&gt;
 &lt;a href="#%e6%89%a7%e8%a1%8cexec%e6%97%b6%e6%8a%a5%e6%9d%83%e9%99%90%e4%b8%8d%e8%b6%b3%e9%9c%80%e8%a6%81pair" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;我让它直接帮我开通80和443的防火墙，需要用到sudo ufw命令。报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;这个还是要用到 exec 工具，但现在还是 pairing required 的问题没解决，没法直接跑命令。&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先执行下面这条命令，找到Pending状态的一个Request，记住这个RequestId。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw devices list
openclaw devices approve $RequestId
openclaw gateway restart&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者最简单方式就是完全信任exec工具：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw config set tools.exec.security full
openclaw gateway restart&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="openclaw版本升级"&gt;&lt;span&gt;OpenClaw版本升级&lt;/span&gt;
 &lt;a href="#openclaw%e7%89%88%e6%9c%ac%e5%8d%87%e7%ba%a7" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;openclaw update --channel stable&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="迁移到新主机"&gt;&lt;span&gt;迁移到新主机&lt;/span&gt;
 &lt;a href="#%e8%bf%81%e7%a7%bb%e5%88%b0%e6%96%b0%e4%b8%bb%e6%9c%ba" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;旧机器：停止服务，打包备份&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw gateway stop
rm -rf ~/.openclaw/logs/* # 可选，清理日志以减小体积
cd ~ &amp;amp;&amp;amp; tar -czf openclaw-full-backup.tar.gz .openclaw&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新机器：安装与版本匹配：安装与旧机器完全相同版本的 OpenClaw。传输压缩包到目录&lt;code&gt;~/openclaw-full-backup.tar.gz&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;新机器：解压覆盖，修复权限：解压前备份新环境原有的 .openclaw 目录，解压后确保文件拥有者是当前用户：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw gateway stop
mv ~/.openclaw ~/.openclaw.bak # 备份
tar -xzf openclaw-full-backup.tar.gz
sudo chown -R $USER:$USER ~/.openclaw
openclaw gateway start&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="迁移到docker容器"&gt;&lt;span&gt;迁移到Docker容器&lt;/span&gt;
 &lt;a href="#%e8%bf%81%e7%a7%bb%e5%88%b0docker%e5%ae%b9%e5%99%a8" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;如果在云主机上面安装OpenClaw，最安全和推荐的做法是使用Docker容器安装。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：安装docker，拉取镜像。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因为我的是香港主机，因此直接使用官方源。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 安装 Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker # 或者直接重新登录 SSH

# 2. 拉取 OpenClaw 官方镜像
docker pull ghcr.io/openclaw/openclaw:latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果是国内主机，则使用下面的命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 安装 Docker（使用国内源，推荐）
sudo apt-get remove -y docker docker-engine docker.io containerd runc
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y ca-certificates curl gnupg lsb-release
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
echo &amp;#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] http://mirrors.aliyun.com/docker-ce/linux/ubuntu noble stable&amp;#34; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-world

# 2. 配置免 sudo 权限（可选）
sudo usermod -aG docker $USER &amp;amp;&amp;amp; newgrp docker

# 3. 配置国内镜像加速（强烈建议）
sudo tee /etc/docker/daemon.json &amp;lt;&amp;lt;EOF
{
 &amp;#34;registry-mirrors&amp;#34;: [&amp;#34;https://docker.mirrors.ustc.edu.cn&amp;#34;]
}
EOF
sudo systemctl daemon-reload &amp;amp;&amp;amp; sudo systemctl restart docker

# 4. 拉取 OpenClaw 镜像（国内源）
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/openclaw:latest
docker tag registry.cn-hangzhou.aliyuncs.com/qiluo-images/openclaw:latest openclaw:latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;第二步：备份宿主机上面的openclaw配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是最重要的一步。&lt;code&gt;~/.openclaw&lt;/code&gt; 目录存储了所有配置、认证、已安装技能和会话历史。我们把它完整打包，为迁移做准备。
命令执行后，你会得到一个名为 &lt;code&gt;openclaw-backup.tar.gz&lt;/code&gt; 的备份文件，它包含了你的全部数据&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~
# 先停止旧版服务，防止迁移时写入数据
openclaw gateway stop
# 清理日志以减小备份包体积
rm -rf ~/.openclaw/logs/*.log

# 打包整个配置目录（注意排除 logs 和 node_modules 等不必要的大文件夹）
tar -czvf openclaw-backup.tar.gz \
 --exclude=&amp;#39;.openclaw/logs&amp;#39; \
 .openclaw&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;第三步：映射数据目录&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建数据目录
sudo mkdir -p /data/openclaw
sudo tar -xzvf openclaw-backup.tar.gz -C /data/openclaw --strip-components=1
sudo chown -R 1000:1000 /data/openclaw
sudo chmod -R u&amp;#43;rwX /data/openclaw&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;第四步：使用 Docker 命令启动容器&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -d \
 --name openclaw \
 --restart unless-stopped \
 -p 18789:18789 \
 -v /data/openclaw:/home/node/.openclaw \
 ghcr.io/openclaw/openclaw:latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;第五步：验证迁移状态&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker logs openclaw
docker exec -it openclaw openclaw doctor
docker exec -it openclaw openclaw status&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在浏览器中打开 &lt;code&gt;http://你的服务器IP:18789&lt;/code&gt;，如果能正常访问，就说明迁移基本成功了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第六步：6. 清理旧环境（可选）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在确认 Docker 版本的 OpenClaw 工作完全正常后，你就可以安全地移除直接安装的版本了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 停止并禁用旧版 systemd 服务（如果存在）
sudo systemctl stop openclaw
sudo systemctl disable openclaw

# 卸载openclaw软件
openclaw uninstall --all --yes --non-interactive
npm uninstall -g openclaw
# 直接删除旧版的 .openclaw 目录
rm -rf ~/.openclaw&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Windows11安装小龙虾OpenClaw</title><link>https://xiongneng.me/posts/ai/openclaw-windows-install/</link><pubDate>Sun, 01 Feb 2026 20:52:16 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/ai/openclaw-windows-install/</guid><category domain="https://xiongneng.me/categories/ai/">AI</category><description>&lt;p&gt;安装NodeJS后，配置国内源码。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm config set strict-ssl false
npm config set registry https://registry.npmmirror.com
git config --global url.&amp;#34;https://github.com/&amp;#34;.insteadOf &amp;#34;ssh://git@github.com/&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;还要开启代理，因为安装过程要访问Github。然后再输入如下命令安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g openclaw@latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;按理说，输入下面的命令等一个 2 分钟，你会看到下面这种提示：已经添加了 500 多包。&lt;/p&gt;
&lt;p&gt;再输入如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openclaw onboard --install-daemon&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;大概 1 分钟就能看到下面这个界面。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;选择Yes，继续选择QuickStart模式。&lt;/p&gt;
&lt;p&gt;② 配置大模型 API&lt;/p&gt;
&lt;p&gt;接下来配置Model/auth provider，这一步是需要设置你的大模型 API，智谱、Kimi、MiniMax、Qwen 或者国外的都行。
要区分国内还是国外的，一般国内会有一个 cn 的后缀。我这里选择的是&lt;code&gt;MiniMax CN - API Key（minimax.com）&lt;/code&gt;，输入APIKEY，
模型名称输入&lt;code&gt;minimax/MiniMax-M2.7&lt;/code&gt;。默认这个模型没有在列表中，通过手动输入。&lt;/p&gt;
&lt;p&gt;③ 选择一个 channel&lt;/p&gt;
&lt;p&gt;我先接入到飞书里面吧。下面有创建飞书应用的步骤。创建完成后填写飞书的信息，这里Group chat policy选择Open - respond in all
groups&lt;/p&gt;
&lt;h2 class="heading-element" id="创建飞书应用"&gt;&lt;span&gt;创建飞书应用&lt;/span&gt;
 &lt;a href="#%e5%88%9b%e5%bb%ba%e9%a3%9e%e4%b9%a6%e5%ba%94%e7%94%a8" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;前提是先去飞书开放平台创建一个应用。地址：https://open.feishu.cn/app
显示配置权限管理，批量导入权限。自己看情况。。。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
 &amp;#34;scopes&amp;#34;: {
 &amp;#34;tenant&amp;#34;: [
 &amp;#34;aily:file:read&amp;#34;,
 &amp;#34;aily:file:write&amp;#34;,
 &amp;#34;cardkit:card:write&amp;#34;,
 &amp;#34;contact:contact.base:readonly&amp;#34;,
 &amp;#34;contact:user.base:readonly&amp;#34;,
 &amp;#34;im:chat&amp;#34;,
 &amp;#34;im:chat:read&amp;#34;,
 &amp;#34;im:chat:readonly&amp;#34;,
 &amp;#34;im:message&amp;#34;,
 &amp;#34;im:message.group_at_msg:readonly&amp;#34;,
 &amp;#34;im:message.group_msg&amp;#34;,
 &amp;#34;im:message.p2p_msg:readonly&amp;#34;,
 &amp;#34;im:message.reactions:read&amp;#34;,
 &amp;#34;im:message:readonly&amp;#34;,
 &amp;#34;im:message:send_as_bot&amp;#34;,
 &amp;#34;im:message:update&amp;#34;,
 &amp;#34;im:resource&amp;#34;
 ],
 &amp;#34;user&amp;#34;: [
 &amp;#34;contact:contact.base:readonly&amp;#34;
 ]
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;需要配置的地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;事件与回调的配置，都设置成长链接的方式。&lt;/li&gt;
&lt;li&gt;然后再事件配置，这里点击添加事件，增加我这里类似的事件。&lt;/li&gt;
&lt;li&gt;机器人进群、机器人被移出群、消息已读、接受消息。&lt;/li&gt;
&lt;li&gt;然后去复制你的 APP ID 和密钥。再回到终端命令行，把相关的 ID 和密钥都复制进去就行了。&lt;/li&gt;
&lt;li&gt;在版本管理与发布中，把这个新的应用发布上线。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;订阅事件说明：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;事件&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;im.message.receive_v1&lt;/td&gt;
 &lt;td&gt;接受消息（必须）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;im.message.message_read_v1&lt;/td&gt;
 &lt;td&gt;消息已读回执&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;im.chat.member.bot.added_v1&lt;/td&gt;
 &lt;td&gt;机器人进群&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;im.chat.member.bot.deleted_v1&lt;/td&gt;
 &lt;td&gt;机器人被移出群&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意：订阅事件的操作一定要在接入飞书channel之后，否则选长连接会失败。&lt;/p&gt;
&lt;p&gt;④其他配置
接下来命令行中会问你要不要配置搜索、SKill、Hook 等。我建议是都先跳过，然后就可以在 Web 中打开 Gateway 管理模板了。&lt;/p&gt;
&lt;p&gt;⑤ How do you want to hatch your bot?
选择&lt;code&gt;Open the Web UI&lt;/code&gt;界面打开。打开地址：http://127.0.0.1:18789/
后面也可以通过 &lt;code&gt;openclaw dashboard&lt;/code&gt; 命令来打开。&lt;/p&gt;
&lt;p&gt;⑥ 完成配对
进入飞书APP，会看到刚刚发布的应用&amp;quot;小龙虾&amp;quot;。然后你给他发一个消息&amp;quot;你好呀&amp;quot;。它会回复一段文字。把他们复制到 Web 端的聊天框中。
最后等openclaw回复确认，你不用自己去处理，而是回复消息&amp;quot;帮我处理&amp;quot;让小龙虾自己帮你处理。配对成功，然后飞书中就能和OpenClaw聊天了。&lt;/p&gt;
&lt;h2 class="heading-element" id="修改模型配置"&gt;&lt;span&gt;修改模型配置&lt;/span&gt;
 &lt;a href="#%e4%bf%ae%e6%94%b9%e6%a8%a1%e5%9e%8b%e9%85%8d%e7%bd%ae" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;我前面安装配置的时候选择模型都是MiniMax-M2.7，但是安装完后查看配置文件还是有2.5配置。因此我直接让OpenClaw帮我修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;帮我把所有MiniMax模型配置都改成M2.7，主配置也改成M2.7，不要有M2.5配置。&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="开机自动启动"&gt;&lt;span&gt;开机自动启动&lt;/span&gt;
 &lt;a href="#%e5%bc%80%e6%9c%ba%e8%87%aa%e5%8a%a8%e5%90%af%e5%8a%a8" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;默认情况下OpenClaw的gateway会开机自启动。如果不想让它自动启。则Win+R，输入taskschd.msc。
在任务计划程序列表中找到OpenClaw Gateway，右键选择禁用即可。&lt;/p&gt;
&lt;h2 class="heading-element" id="卸载"&gt;&lt;span&gt;卸载&lt;/span&gt;
 &lt;a href="#%e5%8d%b8%e8%bd%bd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;本地Windows上面只是尝尝鲜，真正长期稳定养虾，建议使用阿里云主机。本地卸载命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned
openclaw uninstall --all --yes
npm uninstall -g openclaw&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重启电脑：完成上述步骤后，建议重启一次，确保所有后台进程彻底关闭&lt;/p&gt;</description></item><item><title>语法解析器ANTLR4简易教程</title><link>https://xiongneng.me/posts/tool/basic/antlr4/</link><pubDate>Sun, 23 Jun 2024 11:23:35 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/tool/basic/antlr4/</guid><category domain="https://xiongneng.me/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/">开发工具</category><description>&lt;p&gt;Antlr (ANother Tool for Language Recognition) 是一个强大的跨语言语法解析器，可以用来读取、处理、执行或翻译结构化文本或二进制文件。
它被广泛用来构建语言，工具和框架。。ANTLR 根据语法定义生成解析器，解析器可以构建和遍历解析树。&lt;/p&gt;
&lt;p&gt;所有编程语言的语法，都可以用ANTLR来定义。ANTLR提供了大量的官方 &lt;a href="https://github.com/antlr/grammars-v4/" target="_blank" rel="external nofollow noopener noreferrer"&gt;grammar&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 示例，
包含了各种常见语言，比如Java、SQL、Javascript、PHP等等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;谁在使用&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Twitter搜索使用ANTLR进行语法分析，每天处理超过20亿次查询；&lt;/li&gt;
&lt;li&gt;Hadoop生态系统中的Hive、Pig、数据仓库和分析系统所使用的语言都用到了ANTLR；&lt;/li&gt;
&lt;li&gt;Lex Machina将ANTLR用于分析法律文本；Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR；&lt;/li&gt;
&lt;li&gt;NetBeans公司的IDE使用ANTLR来解析C++；&lt;/li&gt;
&lt;li&gt;Hibernate对象-关系映射框架（ORM）使用ANTLR来处理HQL语言&lt;/li&gt;
&lt;li&gt;其他还有Oracle、Presto、Elasticsearch、Spark&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官网地址：https://www.antlr.org&lt;/p&gt;
&lt;h2 class="heading-element" id="基本概念"&gt;&lt;span&gt;基本概念&lt;/span&gt;
 &lt;a href="#%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img loading="lazy" src='https://xnstatic-1253397658.file.myqcloud.com/antlr4-01.png' alt="img.png"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;词法分析器 (Lexer)词法分析是指在计算机科学中，将字符序列转换为单词(Token)的过程。词法分析器(Lexer)一般是用来供语法解析器(Parser)调用的。&lt;/li&gt;
&lt;li&gt;语法解析器 (Parser) 语法解析器通常作为编译器或解释器出现。它的作用是进行语法检查，并构建由输入单词(Token)组成的数据结构(即抽象语法树)。
语法解析器通常使用词法分析器(Lexer)从输入字符流中分离出一个个的单词(Token)，并将单词(Token)流作为其输入。实际开发中，语法解析器可以手工编写，也可以使用工具自动生成。&lt;/li&gt;
&lt;li&gt;抽象语法树 (Abstract Syntax Tree,AST) 抽象语法树是源代码结构的一种抽象表示，它以树的形状表示语言的语法结构。抽象语法树一般可以用来进行代码语法的检查，
代码风格的检查，代码的格式化，代码的高亮，代码的错误提示以及代码的自动补全等等。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="heading-element" id="其他常见的语法分析器"&gt;&lt;span&gt;其他常见的语法分析器&lt;/span&gt;
 &lt;a href="#%e5%85%b6%e4%bb%96%e5%b8%b8%e8%a7%81%e7%9a%84%e8%af%ad%e6%b3%95%e5%88%86%e6%9e%90%e5%99%a8" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;JavaCC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JavaCC，即Java Cmopiler Compiler，为了简化基于Java语言的词法分析器或者语法分析器的开发，Sun公司的开发人员开发了JavaCC(Java Compiler Compiler)。
JavaCC是一个基于Java语言的分析器的自动生成器。用户只要按照JavaCC的语法规范编写JavaCC的源文件，然后使用JavaCC的编译器编译，
就能够生成基于Java语言的某种特定语言的分析器。JavaCC已经成为最受欢迎的Java解析器创建工具。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YACC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;YACC(Yet Another Compiler-Compiler): 1975 年由贝尔实验室 Mike Lesk &amp;amp; Eric Schmidt 开发，UNIX 标准实用工具 (utility)。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SqlParser&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;位于Alibaba的Druid库中，只能解析sql语句，功能比较单一。&lt;/p&gt;
&lt;h2 class="heading-element" id="安装方式"&gt;&lt;span&gt;安装方式&lt;/span&gt;
 &lt;a href="#%e5%ae%89%e8%a3%85%e6%96%b9%e5%bc%8f" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;有多种安装Antlr4的方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用pip方式安装antlr4-tools&lt;/li&gt;
&lt;li&gt;Maven工程中引入antlr4的依赖&lt;/li&gt;
&lt;li&gt;IDEA中安装antlr4的插件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我平时都是喜欢用maven开发代码，因此选择第二种maven方式。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;project xmlns=&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34; xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;
 xsi:schemaLocation=&amp;#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&amp;gt;
 &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
 &amp;lt;groupId&amp;gt;com.xncoding&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;antlr4-demo&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
 &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;

 &amp;lt;name&amp;gt;antlr4-demo&amp;lt;/name&amp;gt;
 &amp;lt;description&amp;gt;antlr4 java source&amp;lt;/description&amp;gt;
 &amp;lt;url&amp;gt;https://maven.apache.org&amp;lt;/url&amp;gt;

 &amp;lt;properties&amp;gt;
 &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
 &amp;lt;/properties&amp;gt;

 &amp;lt;dependencies&amp;gt;
 &amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;org.antlr&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;antlr4&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt;
 &amp;lt;/dependency&amp;gt;
 &amp;lt;/dependencies&amp;gt;

 &amp;lt;build&amp;gt;
 &amp;lt;finalName&amp;gt;antlr4&amp;lt;/finalName&amp;gt;
 &amp;lt;sourceDirectory&amp;gt;src/main/java&amp;lt;/sourceDirectory&amp;gt;
 &amp;lt;plugins&amp;gt;
 &amp;lt;plugin&amp;gt;
 &amp;lt;groupId&amp;gt;org.antlr&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;antlr4-maven-plugin&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt;
 &amp;lt;executions&amp;gt;
 &amp;lt;execution&amp;gt;
 &amp;lt;id&amp;gt;antlr4&amp;lt;/id&amp;gt;
 &amp;lt;goals&amp;gt;
 &amp;lt;goal&amp;gt;antlr4&amp;lt;/goal&amp;gt;
 &amp;lt;/goals&amp;gt;
 &amp;lt;configuration&amp;gt;
 &amp;lt;includes&amp;gt;
 &amp;lt;include&amp;gt;**/*.g4&amp;lt;/include&amp;gt;
 &amp;lt;/includes&amp;gt;
 &amp;lt;listener&amp;gt;true&amp;lt;/listener&amp;gt;
 &amp;lt;visitor&amp;gt;true&amp;lt;/visitor&amp;gt;
 &amp;lt;/configuration&amp;gt;
 &amp;lt;/execution&amp;gt;
 &amp;lt;/executions&amp;gt;
 &amp;lt;/plugin&amp;gt;
 &amp;lt;/plugins&amp;gt;
 &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="基本使用步骤"&gt;&lt;span&gt;基本使用步骤&lt;/span&gt;
 &lt;a href="#%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8%e6%ad%a5%e9%aa%a4" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;通过一个简单额hello world的例子来介绍Antlr4语法解析器开发的基本使用步骤。&lt;/p&gt;
&lt;h3 class="heading-element" id="定义一个g4文件"&gt;&lt;span&gt;定义一个G4文件&lt;/span&gt;
 &lt;a href="#%e5%ae%9a%e4%b9%89%e4%b8%80%e4%b8%aag4%e6%96%87%e4%bb%b6" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;需要创建一个.g4文件，用于定义词法分析器（lexer）和语法解析器(Parser)。具体语法参见官方文档。下面是一个简单的例子：Hello.g4。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// file Hello.g4
// Define a grammar called Hello
grammar Hello; // 1. grammer name
@header { package pers.me.expression.parser; } // 2. java package
r : &amp;#39;hello&amp;#39; ID ; // 3. match keyword hello followed by an identifier
ID : [a-z]&amp;#43; ; // match lower-case identifiers
WS : [ \t\r\n]&amp;#43; -&amp;gt; skip ; // 4. skip spaces, tabs, newlines&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;
&lt;li&gt;定义了 grammar 的名字，名字需要与文件名对应&lt;/li&gt;
&lt;li&gt;定义生成的Java类的package&lt;/li&gt;
&lt;li&gt;r 定义的语法，会使用到下方定义的正则表达式词法&lt;/li&gt;
&lt;li&gt;定义了空白字符，后面的 skip 是一个特殊的标记，标记空白字符会被忽略&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 class="heading-element" id="生成代码"&gt;&lt;span&gt;生成代码&lt;/span&gt;
 &lt;a href="#%e7%94%9f%e6%88%90%e4%bb%a3%e7%a0%81" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;执行 &lt;code&gt;mvn clean compile&lt;/code&gt; 可自动生成Antlr的代码。&lt;/p&gt;
&lt;h3 class="heading-element" id="测试"&gt;&lt;span&gt;测试&lt;/span&gt;
 &lt;a href="#%e6%b5%8b%e8%af%95" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;我们可以利用下面这段代码来测试一下ParseTree。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class HelloTest {
 public static void main(String[] args) throws Exception {
 HelloLexer lexer = new HelloLexer(CharStreams.fromString(&amp;#34;hello world&amp;#34;));
 CommonTokenStream tokens = new CommonTokenStream(lexer);
 HelloParser parser = new HelloParser(tokens);
 ParseTree tree = parser.r();
 System.out.println(tree.toStringTree(parser));
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行上面的代码可以得到如下输出，程序识别出输入的字符串符合r的语法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(r hello world)&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="listener和visitor"&gt;&lt;span&gt;Listener和Visitor&lt;/span&gt;
 &lt;a href="#listener%e5%92%8cvisitor" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;ANTLR提供了两种方法来访问ParseTree：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一种是通过Parse-Tree Listener的方法&lt;/li&gt;
&lt;li&gt;另一种是通过Parse-Tree Visitor的方法&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Listener有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;访问AST的所有节点&lt;/li&gt;
&lt;li&gt;重写（Override）进入时（enterXXX方法）和退出时（exitXXX方法）要执行的方法&lt;/li&gt;
&lt;li&gt;要重写的方法没有返回值，因此需要在属性中保留所需的值&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Visitor有以下特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;并非所有 AST 节点都被访问&lt;/li&gt;
&lt;li&gt;根据目的重写进入节点时要执行的过程（visitXXX方法）&lt;/li&gt;
&lt;li&gt;重写方法有一个返回值，因此您不必在属性中保存所需的值&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最大的区别是Listener会自动访问 AST 的所有节点，而Visitor如果要访问当前节点的子树，则需要手工实现。
Visitor 较为简单方便，继承 HelloBaseVisitor 类即可，内部的方法与 g4 文件定义相对应，对照看即可理解。实现了 visitor 之后，
就可以完成一个简单的自定义解析器了。自动生成的HelloBaseVisitor.java如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
/**
 * This class provides an empty implementation of {@link HelloVisitor},
 * which can be extended to create a visitor which only needs to handle a subset
 * of the available methods.
 *
 * @param &amp;lt;T&amp;gt; The return type of the visit operation. Use {@link Void} for
 * operations with no return type.
 */
public class HelloBaseVisitor&amp;lt;T&amp;gt; extends AbstractParseTreeVisitor&amp;lt;T&amp;gt; implements HelloVisitor&amp;lt;T&amp;gt; {
 /**
 * {@inheritDoc}
 *
 * &amp;lt;p&amp;gt;The default implementation returns the result of calling
 * {@link #visitChildren} on {@code ctx}.&amp;lt;/p&amp;gt;
 */
 @Override public T visitR(HelloParser.RContext ctx) { return visitChildren(ctx); }
}&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="计算器的实现"&gt;&lt;span&gt;计算器的实现&lt;/span&gt;
 &lt;a href="#%e8%ae%a1%e7%ae%97%e5%99%a8%e7%9a%84%e5%ae%9e%e7%8e%b0" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;接下来进入实战环节，我们来实现一个简单的计算器。&lt;/p&gt;
&lt;h3 class="heading-element" id="定义语法和词法"&gt;&lt;span&gt;定义语法和词法&lt;/span&gt;
 &lt;a href="#%e5%ae%9a%e4%b9%89%e8%af%ad%e6%b3%95%e5%92%8c%e8%af%8d%e6%b3%95" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;创建Expression.g4。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 定义了 grammar 的名字，名字需要与文件名对应
grammar Expression;
@header {
// 定义package
package pers.me.expression.parser;
}

/**
 * parser
 * calc 和 expr 就是定义的语法，会使用到下方定义的词法
 * 注意 # 后面的名字，是可以在后续访问和处理的时候使用的。
 * 一个语法有多种规则的时候可以使用 | 来进行配置。
 */

 calc
 : (expr)* EOF # calculationBlock
 ;
// 四则运算分为了两个非常相似的语句，这样做的原因是为了实现优先级，乘除是优先级高于加减的。
 expr
 : BR_OPEN expr BR_CLOSE # expressionWithBr
 | sign=(PLUS|MINUS)? num=(NUMBER|PERCENT_NUMBER) # expressionNumeric
 | expr op=(TIMES | DIVIDE) expr # expressionTimesOrDivide
 | expr op=(PLUS | MINUS) expr # expressionPlusOrMinus
 ;

/**
 * lexer
 */

BR_OPEN: &amp;#39;(&amp;#39;;
BR_CLOSE: &amp;#39;)&amp;#39;;
PLUS: &amp;#39;&amp;#43;&amp;#39;;
MINUS: &amp;#39;-&amp;#39;;
TIMES: &amp;#39;*&amp;#39;;
DIVIDE: &amp;#39;/&amp;#39;;
PERCENT: &amp;#39;%&amp;#39;;
POINT: &amp;#39;.&amp;#39;;

// 定义百分数
PERCENT_NUMBER
 : NUMBER ((&amp;#39; &amp;#39;)? PERCENT)
 ;

NUMBER
 : DIGIT&amp;#43; ( POINT DIGIT&amp;#43; )?
 ;

DIGIT
 : [0-9]&amp;#43;
 ;
 
// 定义了空白字符，后面的 skip 是一个特殊的标记，标记空白字符会被忽略
SPACE
 : &amp;#39; &amp;#39; -&amp;gt; skip
 ;&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="实现visitor"&gt;&lt;span&gt;实现Visitor&lt;/span&gt;
 &lt;a href="#%e5%ae%9e%e7%8e%b0visitor" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;生成Java文件之后，我们来实现自己的Visitor，用于支持BigDecimal。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class BigDecimalCalculationVisitor extends ExpressionBaseVisitor&amp;lt;BigDecimal&amp;gt; {

 /**
 * 100
 */
 private static final BigDecimal HUNDRED = BigDecimal.valueOf(100);

 /**
 * DECIMAL128のMathContext (桁数34、RoundingMode.HALF_EVEN)
 */
 private static final MathContext MATH_CONTEXT = MathContext.DECIMAL128;

 @Override
 public BigDecimal visitCalculationBlock(ExpressionParser.CalculationBlockContext ctx) {
 BigDecimal calcResult = null;
 for (ExpressionParser.ExprContext expr : ctx.expr()) {
 calcResult = visit(expr);
 }
 return calcResult;
 }

 @Override
 public BigDecimal visitExpressionTimesOrDivide(ExpressionParser.ExpressionTimesOrDivideContext ctx) {
 BigDecimal left = visit(ctx.expr(0));
 BigDecimal right = visit(ctx.expr(1));
 switch (ctx.op.getType()) {
 case ExpressionLexer.TIMES: return left.multiply(right, MATH_CONTEXT);
 case ExpressionLexer.DIVIDE: return left.divide(right, MATH_CONTEXT);
 default: throw new RuntimeException(&amp;#34;unsupported operator type&amp;#34;);
 }
 }

 @Override
 public BigDecimal visitExpressionPlusOrMinus(ExpressionParser.ExpressionPlusOrMinusContext ctx) {
 // 此处加减法的实现类似上面的乘除法，省略
 }

 @Override
 public BigDecimal visitExpressionWithBr(ExpressionParser.ExpressionWithBrContext ctx) {
 return visit(ctx.expr());
 }

 @Override
 public BigDecimal visitExpressionNumeric(ExpressionParser.ExpressionNumericContext ctx) {
 BigDecimal numeric = numberOrPercent(ctx.num);
 if (Objects.nonNull(ctx.sign) &amp;amp;&amp;amp; ctx.sign.getType() == ExpressionLexer.MINUS) {
 return numeric.negate();
 }
 return numeric;
 }

 private BigDecimal numberOrPercent(Token num) {
 String numberStr = num.getText();
 switch (num.getType()) {
 case ExpressionLexer.NUMBER: return decimal(numberStr);
 case ExpressionLexer.PERCENT_NUMBER: return decimal(numberStr.substring(0, numberStr.length() - 1).trim()).divide(HUNDRED, MATH_CONTEXT);
 default: throw new RuntimeException(&amp;#34;unsupported number type&amp;#34;);
 }
 }

 private BigDecimal decimal(String decimalStr) {
 return new BigDecimal(decimalStr);
 }

}&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="调用解析器"&gt;&lt;span&gt;调用解析器&lt;/span&gt;
 &lt;a href="#%e8%b0%83%e7%94%a8%e8%a7%a3%e6%9e%90%e5%99%a8" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在Calculator类中调用Expression。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class Calculator {
 public BigDecimal execute(String expression) {
 CharStream cs = CharStreams.fromString(expression);
 ExpressionLexer lexer = new ExpressionLexer(cs);
 CommonTokenStream tokens = new CommonTokenStream(lexer);
 ExpressionParser parser = new ExpressionParser(tokens);
 ExpressionParser.CalcContext context = parser.calc();
 BigDecimalCalculationVisitor visitor = new BigDecimalCalculationVisitor();
 return visitor.visit(context);
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="测试-1"&gt;&lt;span&gt;测试&lt;/span&gt;
 &lt;a href="#%e6%b5%8b%e8%af%95-1" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;最后，我们用一个jUnit来测试一下我们的计算器。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class CalculatorUnitTest {

 private final Calculator calculator = new Calculator();

 @DisplayName(&amp;#34;Test Calculator&amp;#34;)
 @ParameterizedTest
 @CsvSource({
 &amp;#34;1 &amp;#43; 2, 3&amp;#34;,
 &amp;#34;3 - 2, 1&amp;#34;,
 &amp;#34;2 * 3, 6&amp;#34;,
 &amp;#34;6 / 3, 2&amp;#34;,
 &amp;#34;6 / (1 &amp;#43; 2) , 2&amp;#34;,
 &amp;#34;50%, 0.5&amp;#34;,
 &amp;#34;100 * 30%, 30.0&amp;#34;
 })
 void testCalculation(String expression, String expected) {
 assertEquals(expected, calculator.execute(expression).toPlainString());
 }

}&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="推荐阅读"&gt;&lt;span&gt;推荐阅读&lt;/span&gt;
 &lt;a href="#%e6%8e%a8%e8%8d%90%e9%98%85%e8%af%bb" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/antlr/antlr4/blob/master/doc/index.md" target="_blank" rel="external nofollow noopener noreferrer"&gt;Antlr4官方指南&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/antlr/grammars-v4" target="_blank" rel="external nofollow noopener noreferrer"&gt;Antlr4官方示例:Grammars-v4&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>树莓派4B安装Ubuntu Server 22.0.4</title><link>https://xiongneng.me/posts/devops/raspberrypi/</link><pubDate>Thu, 01 Jun 2023 12:23:33 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/devops/raspberrypi/</guid><category domain="https://xiongneng.me/categories/devops/">DevOps</category><description>&lt;p&gt;介绍下树莓派没办法连接显示器和键盘的情况下怎样安装Ubuntu Server 22, 以及如何确定树莓派的 IP 地址并登陆进去等一些实用小技巧. 聪明的你还可以用这些学到的新技巧去扫描你的网络。&lt;/p&gt;
&lt;p&gt;准备软件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pan.baidu.com/s/1fpKnVL8Kcpd4OidMMUhkKw?pwd=3zh5" target="_blank" rel="external nofollow noopener noreferrer"&gt;SDFormatter 5.0.2&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 用来格式化闪存卡&lt;/li&gt;
&lt;li&gt;&lt;a href="https://downloads.raspberrypi.org/imager/imager_latest.exe" target="_blank" rel="external nofollow noopener noreferrer"&gt;Raspberry Pi Imager&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 用来烧录镜像&lt;/li&gt;
&lt;li&gt;&lt;a href="https://old-releases.ubuntu.com/releases/22.04/ubuntu-22.04.1-preinstalled-server-arm64+raspi.img.xz" target="_blank" rel="external nofollow noopener noreferrer"&gt;Ubuntu Server 22.0.4&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; 操作系统镜像文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="heading-element" id="格式化闪存卡"&gt;&lt;span&gt;格式化闪存卡&lt;/span&gt;
 &lt;a href="#%e6%a0%bc%e5%bc%8f%e5%8c%96%e9%97%aa%e5%ad%98%e5%8d%a1" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;把闪存卡插入到读卡器中，插入笔记本/电脑的USB插口中，然后打开SDFormatter直接格式化即可。&lt;/p&gt;
&lt;h2 class="heading-element" id="烧录镜像"&gt;&lt;span&gt;烧录镜像&lt;/span&gt;
 &lt;a href="#%e7%83%a7%e5%bd%95%e9%95%9c%e5%83%8f" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;打开Raspberry Pi Imager，选择自定义的镜像并选中上面已经下载好的Ubuntu镜像，然后再选择存储卡，点击烧录即可。&lt;/p&gt;
&lt;h2 class="heading-element" id="配置网络"&gt;&lt;span&gt;配置网络&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e7%bd%91%e7%bb%9c" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;烧录完了先不要急着拔掉闪存卡，这里可以先配置下网络，后面可以SSH连接上，这样就不需要键盘鼠标和显示器了。在闪存卡的根目录找到network-config文件，
用记事本打开。将下面的这段前面注释解开：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wifis:
 wlan0:
 dhcp4: true
 optional: true
 access-points:
 &amp;#34;你的无线SSID&amp;#34;:
 password: &amp;#34;你的无线密码&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意无线网络名和密码都是英文双引号括起来，并且这是个yaml文件格式，缩进一定要看清楚。
配置完毕后, 将 SD 卡插入树莓派, 第一次启动后配置还没有生效, 需要重启一遍, 第二次应该就能自动连接 WiFi 了&lt;/p&gt;
&lt;h2 class="heading-element" id="树莓派通电"&gt;&lt;span&gt;树莓派通电&lt;/span&gt;
 &lt;a href="#%e6%a0%91%e8%8e%93%e6%b4%be%e9%80%9a%e7%94%b5" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;先安装上散热片，时候注意不要手抖，以免歪斜，贴纸双面，注意轻撕。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src='https://xnstatic-1253397658.file.myqcloud.com/20230729-05.png' alt="img.png"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通电之前推荐先扫描一下局域网ip，这样好判断树莓派ip是哪一个。&lt;/li&gt;
&lt;li&gt;在电脑上使用“弹出”方式，弹出内存卡。直接将内存卡取出，有可能会损坏内存卡上的文件，推荐优雅取出。&lt;/li&gt;
&lt;li&gt;将烧录好的闪存卡插入树莓派，然后连接电源通电。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;把 SD 卡插入树莓派, 然后给树莓派插上USB-C供电, 确认红灯亮起 (供电正常),
然后绿灯开始闪烁 (机器运行)，树莓派就开始正常工作了。&lt;/p&gt;
&lt;h2 class="heading-element" id="查找ip地址"&gt;&lt;span&gt;查找IP地址&lt;/span&gt;
 &lt;a href="#%e6%9f%a5%e6%89%beip%e5%9c%b0%e5%9d%80" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;下载安装nmap之后，只需要输入如下命令就可以扫描局域网内的在线主机。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmap -sP 192.168.1.0/24&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者如果不想下载nmap，也可以使用系统自带的工具。打开电脑的cmd命令行界面执行如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for /L %i IN (1,1,254) DO ping -w 1 -n 1 192.168.1.%i
arp -a&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="ssh连接"&gt;&lt;span&gt;SSH连接&lt;/span&gt;
 &lt;a href="#ssh%e8%bf%9e%e6%8e%a5" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;用你的 SSH 客户端去连接刚才确定的树莓派的 IP 地址, 就可以连接上树莓派了.&lt;/p&gt;
&lt;p&gt;默认的用户名和密码都是 &amp;ldquo;ubuntu&amp;rdquo;, 第一次登陆后系统会要求你修改密码. 安全起见, 一定要修改密码.&lt;/p&gt;
&lt;h2 class="heading-element" id="配置静态ip"&gt;&lt;span&gt;配置静态IP&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e9%9d%99%e6%80%81ip" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;用户SSH连接上Ubuntu Server 22.0.4之后，第一件事就是将动态DHCP分配IP修改成静态IP地址。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/netplan/50-cloud-init.yaml&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改文件内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;network:
 ethernets:
 eth0:
 dhcp4: true
 optional: true
 version: 2
 wifis:
 wlan0:
 dhcp4: no
 optional: true
 addresses: [192.168.1.7/24]
 routes:
 - to: default
 via: 192.168.1.1
 nameservers:
 addresses: [192.168.1.1]
 access-points:
 1209-5G:
 password: &amp;#39;12091209&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo netplan generate # 没有报错则ok
sudo netplan apply # 此时应用静态ip修改，IP地址发生改变&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="树莓派备份"&gt;&lt;span&gt;树莓派备份&lt;/span&gt;
 &lt;a href="#%e6%a0%91%e8%8e%93%e6%b4%be%e5%a4%87%e4%bb%bd" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mghcool/Raspberry-backup" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/mghcool/Raspberry-backup&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nanhantianyi/rpi-backup" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/nanhantianyi/rpi-backup&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优选第一个方案。&lt;/p&gt;
&lt;h2 class="heading-element" id="配置国内源"&gt;&lt;span&gt;配置国内源&lt;/span&gt;
 &lt;a href="#%e9%85%8d%e7%bd%ae%e5%9b%bd%e5%86%85%e6%ba%90" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;先备份&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后编辑&lt;code&gt;/etc/apt/sources.list&lt;/code&gt;，内容全部替换为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deb https://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ jammy-backports main restricted universe multiverse&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;再执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="heading-element" id="关闭unattended-upgrades"&gt;&lt;span&gt;关闭unattended upgrades&lt;/span&gt;
 &lt;a href="#%e5%85%b3%e9%97%adunattended-upgrades" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;在使用ubuntu虚拟机的过程中，遇到关机或重启很慢的问题，提示有一个UU（unattended upgrades）进程在工作，需要等待30min。&lt;/p&gt;
&lt;p&gt;经过一番了解，发现这个UU（unattended upgrades）进程就是ubuntu搞的一个类似于windows系统的自动更新程序，
目的是让普通用户的系统能随时保持最新，但对于开发来说实属麻烦。这个进程会在后台自动下载和安装系统更新文件，会阻止关机，有时候还会阻止你安装其他软件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt remove unattended-upgrades&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从此再也不受这个问题困扰了，搞定！重启系统试试吧！
这个方法完全关闭自动更新了，但如果还想手动更新怎么办？完全不用担心，因为还有如下两条指令，在需要的时候手动输入更新就好了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>