<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Develata&apos;s Space - Knowledge</title>
    <link>https://develata.me/</link>
    <description>Knowledge 板块全部更新。</description>
    <language>zh-CN</language>
    <lastBuildDate>Wed, 13 May 2026 15:57:04 GMT</lastBuildDate>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="https://develata.me/rss/knowledge.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>CLIProxyAPI</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/cliproxyapi</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/cliproxyapi</guid>
    <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
    <description>1. CLIProxyAPI 是什么 Github Repo https://github.com/router-for-me/CLIProxyAPI CLIProxyAPI 是把 Gemini CLI、Antigravity、ChatGPT Codex、Claude Code 等 CLI / OAuth 账号封装成 OpenAI / Gemini / Claude / Codex 兼容 API 的代理服务。 官方文档： https://help.router-for.me/</description>
      <content:encoded><![CDATA[<h1>CLIProxyAPI 使用指南</h1>
<h2>1. CLIProxyAPI 是什么</h2>
<p><a href="https://github.com/router-for-me/CLIProxyAPI">Github Repo</a></p>
<p>CLIProxyAPI 是把 Gemini CLI、Antigravity、ChatGPT Codex、Claude Code 等 CLI / OAuth 账号封装成 OpenAI / Gemini / Claude / Codex 兼容 API 的代理服务。</p>
<pre><code class="language-text">CLI / OAuth 账号
    ↓
CLIProxyAPI
    ↓
OpenAI-compatible / Gemini / Claude / Codex API
</code></pre>
<p>官方文档：</p>
<ul>
<li><a href="https://help.router-for.me/">https://help.router-for.me/</a></li>
<li><a href="https://help.router-for.me/introduction/quick-start">https://help.router-for.me/introduction/quick-start</a></li>
<li><a href="https://help.router-for.me/configuration/basic">https://help.router-for.me/configuration/basic</a></li>
<li><a href="https://help.router-for.me/configuration/options">https://help.router-for.me/configuration/options</a></li>
<li><a href="https://help.router-for.me/docker/docker-compose.html">https://help.router-for.me/docker/docker-compose.html</a></li>
<li><a href="https://github.com/router-for-me/CLIProxyAPI/blob/main/config.example.yaml">https://github.com/router-for-me/CLIProxyAPI/blob/main/config.example.yaml</a></li>
</ul>
<blockquote>
<p>截至 <strong>2026-05-13</strong>，官方 README 明确写出 CLIProxyAPI 支持 Codex、Claude Code、Gemini CLI、Antigravity 等 OAuth / CLI 来源，并提供 OpenAI / Gemini / Claude / Codex compatible API。官方支持 Docker / Docker Compose，但低配 VPS 更适合预编译二进制 + systemd。</p>
</blockquote>
<hr>
<h2>2. 推荐架构</h2>
<p>Docker Compose 模板：</p>
<ul>
<li><a href="https://develata.me/knowledge/sharing/docker/compose/cliproxyapi">CLIProxyAPI Docker Compose</a></li>
</ul>
<p>本文主推二进制部署：</p>
<pre><code class="language-text">客户端
    ↓
https://cliproxyapi.example.com/v1
    ↓
Nginx 443
    ↓
127.0.0.1:8317
    ↓
CLIProxyAPI
    ↓
Codex / ChatGPT OAuth
</code></pre>
<p>原则：</p>
<ul>
<li>CLIProxyAPI 只监听 <code>127.0.0.1:8317</code></li>
<li>公网只暴露 Nginx <code>80/443</code></li>
<li><code>/v1/*</code> 不加 Nginx Basic Auth，只用 CLIProxyAPI 的 Bearer API key</li>
<li>默认关闭管理面板</li>
<li>如果打开管理面板，只给 <code>/management.html</code> 单独加 Basic Auth</li>
</ul>
<hr>
<h2>3. 安装</h2>
<p>基础工具：</p>
<pre><code class="language-bash">sudo apt update
sudo apt install -y curl wget ca-certificates tar openssl nginx certbot python3-certbot-nginx
</code></pre>
<p>1C1G VPS 建议加 2G swap；已有 swap 跳过：</p>
<pre><code class="language-bash">free -h
swapon --show

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
</code></pre>
<p>确认架构：</p>
<pre><code class="language-bash">uname -m
</code></pre>
<p><code>x86_64</code> 用 amd64 包：</p>
<pre><code class="language-bash">cd /tmp

rm -f cli-proxy-api
rm -f CLIProxyAPI_*_linux_amd64.tar.gz

VERSION=$(curl -s https://api.github.com/repos/router-for-me/CLIProxyAPI/releases/latest \
  | grep tag_name \
  | cut -d '&quot;' -f 4)
VERSION_NO_V=&quot;${VERSION#v}&quot;

echo &quot;VERSION=$VERSION&quot;
echo &quot;VERSION_NO_V=$VERSION_NO_V&quot;

wget -O &quot;CLIProxyAPI_${VERSION_NO_V}_linux_amd64.tar.gz&quot; \
  &quot;https://github.com/router-for-me/CLIProxyAPI/releases/download/${VERSION}/CLIProxyAPI_${VERSION_NO_V}_linux_amd64.tar.gz&quot;

tar -xzf &quot;CLIProxyAPI_${VERSION_NO_V}_linux_amd64.tar.gz&quot;
chmod +x cli-proxy-api
sudo install -m 755 cli-proxy-api /usr/local/bin/cli-proxy-api
</code></pre>
<p>验证：</p>
<pre><code class="language-bash">which cli-proxy-api
cli-proxy-api -h
</code></pre>
<p>如果 <code>which</code> 没输出：</p>
<pre><code class="language-bash">/usr/local/bin/cli-proxy-api -h
</code></pre>
<p>如果不是 <code>x86_64</code>，按 GitHub Release assets 替换对应架构包。</p>
<hr>
<h2>4. 配置</h2>
<p>创建目录并生成 API key：</p>
<pre><code class="language-bash">mkdir -p &quot;$HOME/.cli-proxy-api/logs&quot;
API_KEY=$(openssl rand -hex 32)
echo &quot;$API_KEY&quot;
</code></pre>
<p>写入 <code>~/.cli-proxy-api/config.yaml</code>：</p>
<pre><code class="language-bash">cat &gt; &quot;$HOME/.cli-proxy-api/config.yaml&quot; &lt;&lt;EOF
host: &quot;127.0.0.1&quot;
port: 8317

auth-dir: &quot;$HOME/.cli-proxy-api&quot;

api-keys:
  - &quot;$API_KEY&quot;

debug: false
logging-to-file: false

request-retry: 2
max-retry-credentials: 0

routing:
  strategy: &quot;round-robin&quot;

remote-management:
  allow-remote: false
  secret-key: &quot;&quot;
  disable-control-panel: true

commercial-mode: true
EOF
</code></pre>
<p>查看配置：</p>
<pre><code class="language-bash">cat &quot;$HOME/.cli-proxy-api/config.yaml&quot;
</code></pre>
<p>说明：</p>
<ul>
<li><code>host: &quot;127.0.0.1&quot;</code>：只允许本机访问</li>
<li><code>auth-dir</code>：保存 OAuth 凭据</li>
<li><code>api-keys</code>：客户端 Bearer API key</li>
<li><code>disable-control-panel: true</code>：关闭内置管理页</li>
<li><code>commercial-mode: true</code>：降低高并发下的中间件开销</li>
</ul>
<hr>
<h2>5. Codex 登录</h2>
<pre><code class="language-bash">cli-proxy-api -config &quot;$HOME/.cli-proxy-api/config.yaml&quot; -codex-device-login
</code></pre>
<p>按提示在浏览器登录 OpenAI / ChatGPT 账号并输入 code。成功后应出现类似文件：</p>
<pre><code class="language-text">~/.cli-proxy-api/codex-xxxx.json
</code></pre>
<hr>
<h2>6. 前台测试</h2>
<p>启动：</p>
<pre><code class="language-bash">cli-proxy-api -config &quot;$HOME/.cli-proxy-api/config.yaml&quot;
</code></pre>
<p>另开 SSH 窗口检查监听：</p>
<pre><code class="language-bash">ss -lntp | grep 8317
</code></pre>
<p>应为：</p>
<pre><code class="language-text">127.0.0.1:8317
</code></pre>
<p>取 API key：</p>
<pre><code class="language-bash">API_KEY=$(grep -A1 &quot;api-keys:&quot; ~/.cli-proxy-api/config.yaml | tail -n1 | sed 's/^[[:space:]]*- //; s/&quot;//g')
</code></pre>
<p>测试：</p>
<pre><code class="language-bash">curl -i http://127.0.0.1:8317/v1/models \
  -H &quot;Authorization: Bearer $API_KEY&quot;
</code></pre>
<pre><code class="language-bash">curl http://127.0.0.1:8317/v1/chat/completions \
  -H &quot;Authorization: Bearer $API_KEY&quot; \
  -H &quot;Content-Type: application/json&quot; \
  -d '{
    &quot;model&quot;: &quot;gpt-5.4&quot;,
    &quot;messages&quot;: [
      {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Hello&quot;}
    ],
    &quot;stream&quot;: false
  }'
</code></pre>
<p>模型名以 <code>/v1/models</code> 返回为准。<code>/health</code> 返回 <code>404</code> 不代表服务失败。</p>
<hr>
<h2>7. systemd 常驻</h2>
<p>把 <code>deve</code> 改成实际用户名：</p>
<pre><code class="language-bash">sudo tee /etc/systemd/system/cli-proxy-api.service &gt; /dev/null &lt;&lt;'EOF'
[Unit]
Description=CLI Proxy API
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=deve
WorkingDirectory=/home/deve
ExecStart=/usr/local/bin/cli-proxy-api -config /home/deve/.cli-proxy-api/config.yaml
Restart=always
RestartSec=5
Environment=HOME=/home/deve

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF
</code></pre>
<p>如果用户名是 <code>ubuntu</code>，同步修改：</p>
<pre><code class="language-ini">User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/usr/local/bin/cli-proxy-api -config /home/ubuntu/.cli-proxy-api/config.yaml
Environment=HOME=/home/ubuntu
</code></pre>
<p>启动：</p>
<pre><code class="language-bash">sudo systemctl daemon-reload
sudo systemctl enable --now cli-proxy-api
sudo systemctl status cli-proxy-api
</code></pre>
<p>日志：</p>
<pre><code class="language-bash">journalctl -u cli-proxy-api -f
</code></pre>
<p>确认监听：</p>
<pre><code class="language-bash">ss -lntp | grep 8317
</code></pre>
<p>仍应是：</p>
<pre><code class="language-text">127.0.0.1:8317
</code></pre>
<hr>
<h2>8. Nginx + HTTPS</h2>
<p>把 <code>cliproxyapi.example.com</code> 改成实际域名：</p>
<pre><code class="language-bash">sudo tee /etc/nginx/sites-available/cliproxyapi &gt; /dev/null &lt;&lt;'EOF'
server {
    listen 80;
    server_name cliproxyapi.example.com;

    client_max_body_size 100m;

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

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

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;

        proxy_buffering off;
        proxy_request_buffering off;

        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}
EOF

sudo ln -sf /etc/nginx/sites-available/cliproxyapi /etc/nginx/sites-enabled/cliproxyapi
sudo nginx -t
sudo systemctl reload nginx
</code></pre>
<p>如果默认站点干扰：</p>
<pre><code class="language-bash">sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
</code></pre>
<p>申请证书：</p>
<pre><code class="language-bash">sudo certbot --nginx -d cliproxyapi.example.com
sudo nginx -t
sudo systemctl reload nginx
</code></pre>
<p>续签检查：</p>
<pre><code class="language-bash">systemctl list-timers | grep certbot
sudo certbot renew --dry-run
sudo certbot certificates
</code></pre>
<p>公网测试：</p>
<pre><code class="language-bash">curl -i https://cliproxyapi.example.com/v1/models \
  -H &quot;Authorization: Bearer $API_KEY&quot;
</code></pre>
<p>成功标准：</p>
<pre><code class="language-text">HTTP/2 200
content-type: application/json
</code></pre>
<hr>
<h2>9. 客户端填写</h2>
<p>OpenAI-compatible 客户端：</p>
<pre><code class="language-text">Base URL: https://cliproxyapi.example.com/v1
API Key: config.yaml 里的 api-keys
</code></pre>
<p>不要把 <code>/chat/completions</code> 写进 Base URL。</p>
<hr>
<h2>10. 管理页与 Basic Auth</h2>
<p>默认关闭管理页：</p>
<pre><code class="language-yaml">remote-management:
  allow-remote: false
  secret-key: &quot;&quot;
  disable-control-panel: true
</code></pre>
<p>这种情况下 Nginx 不需要 <code>auth_basic</code>，API 只靠：</p>
<pre><code class="language-text">Authorization: Bearer &lt;CLIProxyAPI_API_KEY&gt;
</code></pre>
<p>如果要打开管理页，只给 <code>/management.html</code> 加 Basic Auth：</p>
<pre><code class="language-bash">sudo systemctl restart cli-proxy-api
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.cliproxyapi_htpasswd pwh
</code></pre>
<pre><code class="language-nginx">location = /management.html {
    auth_basic &quot;Restricted&quot;;
    auth_basic_user_file /etc/nginx/.cliproxyapi_htpasswd;

    proxy_pass http://127.0.0.1:8317;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
</code></pre>
<p>不要把 <code>auth_basic</code> 写在 <code>server {}</code> 顶层，否则 <code>/v1/models</code> 和 <code>/v1/chat/completions</code> 也会被拦截。</p>
<hr>
<h2>11. 排错</h2>
<h3>11.1 命令不存在</h3>
<pre><code class="language-bash">cd /tmp
chmod +x cli-proxy-api
sudo install -m 755 cli-proxy-api /usr/local/bin/cli-proxy-api
which cli-proxy-api
</code></pre>
<h3>11.2 Release 下载 404</h3>
<p>当前脚本假设资产名为：</p>
<pre><code class="language-text">CLIProxyAPI_版本号_linux_amd64.tar.gz
</code></pre>
<p>如果下载失败，到 GitHub Release 页面确认实际文件名。</p>
<h3>11.3 公网 API 返回 <code>HTTP/2 401</code></h3>
<p>如果响应头有：</p>
<pre><code class="language-text">www-authenticate: Basic
</code></pre>
<p>说明 Nginx Basic Auth 拦截了 API。检查：</p>
<pre><code class="language-bash">sudo grep -R &quot;auth_basic&quot; -n /etc/nginx
sudo nginx -T | grep -n -C 5 &quot;auth_basic&quot;
</code></pre>
<p>临时删除 Basic Auth：</p>
<pre><code class="language-bash">sudo sed -i '/auth_basic/d' /etc/nginx/sites-available/cliproxyapi
sudo nginx -t
sudo systemctl reload nginx
</code></pre>
<h3>11.4 Nginx 修改后不生效</h3>
<pre><code class="language-bash">sudo nginx -t
sudo systemctl reload nginx
</code></pre>
<hr>
<h2>12. 备份与复刻</h2>
<p>重点备份：</p>
<pre><code class="language-text">~/.cli-proxy-api/config.yaml
~/.cli-proxy-api/codex-*.json
/etc/systemd/system/cli-proxy-api.service
/etc/nginx/sites-available/cliproxyapi
</code></pre>
<p>复刻顺序：</p>
<pre><code class="language-text">安装基础工具
下载 cli-proxy-api
写 config.yaml
执行 Codex device login
配置 systemd
配置 Nginx
申请 HTTPS
用 /v1/models 测试
</code></pre>
<hr>
<h2>13. 参考链接</h2>
<pre><code class="language-text">https://github.com/router-for-me/CLIProxyAPI
https://github.com/router-for-me/CLIProxyAPI/releases
https://github.com/router-for-me/CLIProxyAPI/blob/main/config.example.yaml
https://help.router-for.me/
https://help.router-for.me/introduction/quick-start
https://help.router-for.me/configuration/basic
https://help.router-for.me/configuration/options
https://help.router-for.me/docker/docker-compose.html
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>Sub2API</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/sub2api</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/sub2api</guid>
    <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
    <description>1. Sub2API 是什么 Github Repo https://github.com/Wei-Shaw/sub2api Sub2API 是一个 AI API gateway，用于把上游账号、订阅或多模型服务统一成可管理的 API 服务。它适合放在 new-api 之前，负责上游接入、账号管理、请求转发和后台管理。 本文采用 Docker 部署： 如果服务器访问上游服务需要代理，可以额外加 sing-box： sing-box 不是 Sub2API 的必需组件，只是本文 </description>
      <content:encoded><![CDATA[<h1>Sub2API 使用指南</h1>
<h2>1. Sub2API 是什么</h2>
<p><a href="https://github.com/Wei-Shaw/sub2api">Github Repo</a></p>
<p>Sub2API 是一个 AI API gateway，用于把上游账号、订阅或多模型服务统一成可管理的 API 服务。它适合放在 new-api 之前，负责上游接入、账号管理、请求转发和后台管理。</p>
<p>本文采用 Docker 部署：</p>
<pre><code class="language-text">Sub2API + PostgreSQL + Redis
</code></pre>
<p>如果服务器访问上游服务需要代理，可以额外加 sing-box：</p>
<pre><code class="language-text">Sub2API -&gt; sing-box -&gt; VLESS Reality -&gt; Internet
</code></pre>
<p>sing-box 不是 Sub2API 的必需组件，只是本文 compose 里提供的可选出站代理。</p>
<p>官方文档：</p>
<ul>
<li><a href="https://github.com/Wei-Shaw/sub2api">https://github.com/Wei-Shaw/sub2api</a></li>
<li><a href="https://github.com/Wei-Shaw/sub2api/blob/main/deploy/README.md">https://github.com/Wei-Shaw/sub2api/blob/main/deploy/README.md</a></li>
<li><a href="https://github.com/SagerNet/sing-box">https://github.com/SagerNet/sing-box</a></li>
<li><a href="https://sing-box.sagernet.org/installation/docker/">https://sing-box.sagernet.org/installation/docker/</a></li>
</ul>
<hr>
<h2>2. 推荐架构</h2>
<p>配套模板：</p>
<ul>
<li><a href="https://develata.me/knowledge/sharing/docker/compose/sub2api">Sub2API + sing-box Docker Compose</a></li>
</ul>
<p>完整架构：</p>
<pre><code class="language-text">new-api
    ↓ newapi-sub2api
Sub2API
    ├── PostgreSQL
    ├── Redis
    └── sing-box，可选
            ↓
        代理节点，可选
</code></pre>
<p>dashboard 默认只监听：</p>
<pre><code class="language-text">127.0.0.1:38580
</code></pre>
<p>远程访问建议走 SSH 隧道，或者通过 1Panel / Nginx 加认证反代。</p>
<p>核心约束：</p>
<ul>
<li><code>sub2api</code> 不直接暴露公网端口</li>
<li>PostgreSQL / Redis 只在内部网络可见</li>
<li><code>new-api</code> 通过 Docker 内网访问 <code>http://sub2api:8080</code></li>
<li>需要代理时，Sub2API 出站走 sing-box</li>
<li>不需要代理时，删除 sing-box 相关配置即可</li>
</ul>
<hr>
<h2>3. 快速部署</h2>
<p>创建目录：</p>
<pre><code class="language-bash">mkdir -p /opt/1panel/docker/compose/sub2api
cd /opt/1panel/docker/compose/sub2api

mkdir -p nginx sing-box sing-box-data sub2api_data postgres_data redis_data
</code></pre>
<p>创建 new-api 专用内网：</p>
<pre><code class="language-bash">docker network create --driver bridge --internal newapi-sub2api
</code></pre>
<p>如果网络已存在，报错可以忽略。</p>
<p>准备文件：</p>
<pre><code class="language-text">docker-compose.yml
.env
nginx/default.conf
sing-box/config.json      可选，只有启用 sing-box 时需要
</code></pre>
<p>启动：</p>
<pre><code class="language-bash">docker compose up -d
docker compose ps
docker compose logs -f sub2api
</code></pre>
<p>本机验证：</p>
<pre><code class="language-bash">curl -v http://127.0.0.1:38580/health
</code></pre>
<hr>
<h2>4. WebUI 访问</h2>
<p>模板通过 <code>dashboard-proxy</code> 把 Sub2API WebUI 绑定到宿主机本地：</p>
<pre><code class="language-text">127.0.0.1:38580
</code></pre>
<p>本地电脑访问远程服务器：</p>
<pre><code class="language-powershell">ssh -p 22 -L 38580:127.0.0.1:38580 user@你的服务器IP
</code></pre>
<p>然后浏览器打开：</p>
<pre><code class="language-text">http://127.0.0.1:38580
</code></pre>
<p>账号密码来自 <code>.env</code>：</p>
<pre><code class="language-env">ADMIN_EMAIL=
ADMIN_PASSWORD=
</code></pre>
<p>如果要用 1Panel 反代，目标写：</p>
<pre><code class="language-text">http://sub2api-dashboard-proxy:80
</code></pre>
<p>WebUI 不建议无认证直接暴露公网。</p>
<hr>
<h2>5. new-api 接入</h2>
<p>把 new-api 容器接入同一个 Docker 内网：</p>
<pre><code class="language-bash">docker network connect newapi-sub2api new-api
</code></pre>
<p>如果容器名不是 <code>new-api</code>，先查：</p>
<pre><code class="language-bash">docker ps
</code></pre>
<p>new-api 后台上游地址：</p>
<pre><code class="language-text">http://sub2api:8080
</code></pre>
<p>测试：</p>
<pre><code class="language-bash">docker run --rm -it \
  --network newapi-sub2api \
  curlimages/curl:latest \
  http://sub2api:8080/health
</code></pre>
<hr>
<h2>6. 出站代理，可选</h2>
<p>如果 Sub2API 所在服务器能直连上游服务，不需要 sing-box。删除：</p>
<pre><code class="language-text">sing-box 服务
sub2api-proxy 网络
sub2api-egress 网络
HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / UPDATE_PROXY_URL
depends_on.sing-box
</code></pre>
<p>如果需要代理，本文模板让 Sub2API 访问：</p>
<pre><code class="language-text">http://sing-box:7890
</code></pre>
<p>Sub2API 中的关键环境变量：</p>
<pre><code class="language-text">HTTP_PROXY=http://sing-box:7890
HTTPS_PROXY=http://sing-box:7890
ALL_PROXY=socks5h://sing-box:7890
NO_PROXY=localhost,127.0.0.1,::1,postgres,redis,sing-box,sub2api,new-api,newapi,*.local
UPDATE_PROXY_URL=http://sing-box:7890
</code></pre>
<p><code>NO_PROXY</code> 必须保留内部服务名，否则 PostgreSQL、Redis、new-api 内网访问也可能被送进代理。</p>
<p>sing-box 使用 <code>mixed</code> inbound，<code>7890</code> 同时支持 HTTP proxy 和 SOCKS proxy。出站节点示例使用 VLESS Reality；如果你的节点不是 VLESS Reality，按实际协议修改 <code>outbounds</code>。</p>
<hr>
<h2>7. 数据目录</h2>
<p>推荐目录：</p>
<pre><code class="language-text">/opt/1panel/docker/compose/sub2api
├── docker-compose.yml
├── .env
├── nginx/
│   └── default.conf
├── sing-box/
│   └── config.json
├── sing-box-data/
├── sub2api_data/
├── postgres_data/
└── redis_data/
</code></pre>
<p>重点备份：</p>
<pre><code class="language-text">.env
docker-compose.yml
nginx/default.conf
sub2api_data/
postgres_data/
redis_data/
sing-box/config.json      如果启用代理
</code></pre>
<p>迁移时不要只备份 compose 文件。</p>
<hr>
<h2>8. 常用命令</h2>
<pre><code class="language-bash">docker compose up -d
docker compose down
docker compose ps
docker compose logs -f sub2api
docker compose logs -f postgres
docker compose logs -f redis
docker compose logs -f dashboard-proxy
</code></pre>
<p>启用 sing-box 时：</p>
<pre><code class="language-bash">docker compose logs -f sing-box
docker compose exec sing-box sing-box check -c /etc/sing-box/config.json
</code></pre>
<p>更新：</p>
<pre><code class="language-bash">docker compose pull
docker compose up -d
</code></pre>
<p>备份：</p>
<pre><code class="language-bash">cd /opt/1panel/docker/compose
tar -czf sub2api-backup-$(date +%F).tar.gz sub2api
</code></pre>
<hr>
<h2>9. 验证</h2>
<p>验证 WebUI：</p>
<pre><code class="language-bash">curl -v http://127.0.0.1:38580/health
</code></pre>
<p>验证 new-api 内网访问：</p>
<pre><code class="language-bash">docker run --rm -it \
  --network newapi-sub2api \
  curlimages/curl:latest \
  http://sub2api:8080/health
</code></pre>
<p>验证代理出口：</p>
<pre><code class="language-bash">docker exec -it sub2api sh
wget -O- https://ipinfo.io
</code></pre>
<p>如果返回的是代理节点出口 IP，说明 sing-box 生效。没有启用 sing-box 时，这一步应返回服务器自身出口 IP。</p>
<hr>
<h2>10. 排错</h2>
<h3>10.1 PostgreSQL 密码错误</h3>
<p>如果 <code>postgres_data/</code> 已初始化，之后修改 <code>.env</code> 的 <code>POSTGRES_PASSWORD</code> 不会自动修改数据库内部密码。</p>
<p>新部署可以重置：</p>
<pre><code class="language-bash">docker compose down
rm -rf ./postgres_data ./redis_data ./sub2api_data
docker compose up -d
</code></pre>
<p>已有数据不要直接删目录。</p>
<h3>10.2 Redis 认证失败</h3>
<p>检查：</p>
<pre><code class="language-bash">docker compose logs --tail=100 redis
docker compose logs --tail=100 sub2api
</code></pre>
<p>确认 <code>.env</code> 中 <code>REDIS_PASSWORD</code> 和容器环境变量一致。Redis 数据目录已存在时，也建议先确认是否有旧配置残留。</p>
<h3>10.3 dashboard 访问不了</h3>
<p>先在服务器上测试：</p>
<pre><code class="language-bash">curl -v http://127.0.0.1:38580
docker logs --tail=100 sub2api-dashboard-proxy
</code></pre>
<p>服务器本机不通时，SSH 隧道一定不通。</p>
<h3>10.4 new-api 访问不到 Sub2API</h3>
<p>检查网络：</p>
<pre><code class="language-bash">docker network inspect newapi-sub2api
</code></pre>
<p>确认 <code>new-api</code> 和 <code>sub2api</code> 都在该网络中，上游地址使用：</p>
<pre><code class="language-text">http://sub2api:8080
</code></pre>
<h3>10.5 sing-box 启动失败</h3>
<p>检查配置：</p>
<pre><code class="language-bash">docker compose logs --tail=100 sing-box
docker compose run --rm sing-box check -c /etc/sing-box/config.json
</code></pre>
<p>常见原因：</p>
<ul>
<li>VLESS UUID 不完整</li>
<li>Reality <code>public_key</code> / <code>short_id</code> 不匹配</li>
<li>复制了旧版 DNS 写法</li>
<li>复制了旧版 inbound <code>sniff</code> 字段</li>
</ul>
<hr>
<h2>11. 参考链接</h2>
<pre><code class="language-text">https://github.com/Wei-Shaw/sub2api
https://github.com/Wei-Shaw/sub2api/blob/main/deploy/README.md
https://github.com/SagerNet/sing-box
https://sing-box.sagernet.org/installation/docker/
https://sing-box.sagernet.org/configuration/inbound/mixed/
https://sing-box.sagernet.org/configuration/outbound/vless/
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>cliproxyapi</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/cliproxyapi</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/cliproxyapi</guid>
    <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
    <description>Github Repo CLIProxyAPI Github Repo https://github.com/router-for-me/CLIProxyAPI 官方 Docker Compose 文档： https://help.router-for.me/docker/docker-compose.html 官方流程是克隆仓库、复制 config.example.yaml 为 config.yaml ，再执行 docker compose up -d 。下面是按 1Pan</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/router-for-me/CLIProxyAPI">CLIProxyAPI Github Repo</a></p>
<p>官方 Docker Compose 文档：</p>
<ul>
<li><a href="https://help.router-for.me/docker/docker-compose.html">https://help.router-for.me/docker/docker-compose.html</a></li>
</ul>
<p>官方流程是克隆仓库、复制 <code>config.example.yaml</code> 为 <code>config.yaml</code>，再执行 <code>docker compose up -d</code>。下面是按 1Panel 风格整理后的等价模板。</p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">services:
    cli-proxy-api:
        container_name: cli-proxy-api
        image: ${CLI_PROXY_IMAGE}
        restart: unless-stopped
        environment:
            - DEPLOY=${DEPLOY}
        ports:
            - ${HOST_IP}:${CLI_PROXY_API_PORT}:8317
            - ${HOST_IP}:${CLI_PROXY_MANAGEMENT_PORT}:8085
            - ${HOST_IP}:${CLI_PROXY_EXTRA_PORT_1}:1455
            - ${HOST_IP}:${CLI_PROXY_EXTRA_PORT_2}:54545
            - ${HOST_IP}:${CLI_PROXY_EXTRA_PORT_3}:51121
            - ${HOST_IP}:${CLI_PROXY_EXTRA_PORT_4}:11451
        volumes:
            - ${CLI_PROXY_CONFIG_PATH}:/CLIProxyAPI/config.yaml
            - ${CLI_PROXY_AUTH_PATH}:/root/.cli-proxy-api
            - ${CLI_PROXY_LOG_PATH}:/CLIProxyAPI/logs
</code></pre>
<h2>env</h2>
<pre><code class="language-env">HOST_IP=127.0.0.1

CLI_PROXY_IMAGE=eceasy/cli-proxy-api:latest

CLI_PROXY_API_PORT=8317
CLI_PROXY_MANAGEMENT_PORT=8085
CLI_PROXY_EXTRA_PORT_1=1455
CLI_PROXY_EXTRA_PORT_2=54545
CLI_PROXY_EXTRA_PORT_3=51121
CLI_PROXY_EXTRA_PORT_4=11451

CLI_PROXY_CONFIG_PATH=./config.yaml
CLI_PROXY_AUTH_PATH=./auths
CLI_PROXY_LOG_PATH=./logs

DEPLOY=
</code></pre>
<h2>config.yaml</h2>
<pre><code class="language-yaml">host: &quot;0.0.0.0&quot;
port: 8317

auth-dir: &quot;/root/.cli-proxy-api&quot;

api-keys:
    - &quot;换成 openssl rand -hex 32 生成的强随机字符串&quot;

debug: false
logging-to-file: false

request-retry: 2
max-retry-credentials: 0

routing:
    strategy: &quot;round-robin&quot;

remote-management:
    allow-remote: false
    secret-key: &quot;&quot;
    disable-control-panel: true

commercial-mode: true
</code></pre>
<p>启动：</p>
<pre><code class="language-bash">docker compose up -d
docker compose logs -f cli-proxy-api
</code></pre>
<p>Codex 登录，按提示复制链接到浏览器完成登录：</p>
<pre><code class="language-bash">docker compose exec cli-proxy-api /CLIProxyAPI/CLIProxyAPI -no-browser --codex-login
</code></pre>
<p>其它登录：</p>
<pre><code class="language-bash">docker compose exec cli-proxy-api /CLIProxyAPI/CLIProxyAPI -no-browser --login
docker compose exec cli-proxy-api /CLIProxyAPI/CLIProxyAPI -no-browser --claude-login
docker compose exec cli-proxy-api /CLIProxyAPI/CLIProxyAPI -no-browser --antigravity-login
</code></pre>
<p>测试：</p>
<pre><code class="language-bash">curl -i http://127.0.0.1:8317/v1/models \
    -H &quot;Authorization: Bearer 你的API_KEY&quot;
</code></pre>
<p>OpenAI-compatible 客户端：</p>
<pre><code class="language-text">Base URL: http://127.0.0.1:8317/v1
API Key: config.yaml 里的 api-keys
</code></pre>
<p>如果通过 Nginx / 1Panel 反代，只反代 <code>8317</code>。不要给 <code>/v1/*</code> 加 Basic Auth。</p>
]]></content:encoded>
    </item>
    <item>
      <title>sub2api</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/sub2api</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/sub2api</guid>
    <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
    <description>Github Repo Sub2API Github Repo https://github.com/Wei-Shaw/sub2api 说明 这是 sub2api + PostgreSQL + Redis 模板，附带可选的 sing-box 出站代理。 先创建 new-api 内网： 目录结构： 不用 sing-box 时，删除 sing-box 服务、 sub2api-proxy / sub2api-egress 网络、 depends on.sing-box 和 HTTP</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/Wei-Shaw/sub2api">Sub2API Github Repo</a></p>
<h2>说明</h2>
<p>这是 <code>sub2api + PostgreSQL + Redis</code> 模板，附带可选的 <code>sing-box</code> 出站代理。</p>
<p>先创建 new-api 内网：</p>
<pre><code class="language-bash">docker network create --driver bridge --internal newapi-sub2api
</code></pre>
<p>目录结构：</p>
<pre><code class="language-text">sub2api/
├── docker-compose.yml
├── .env
├── nginx/default.conf
├── sing-box/config.json
├── sub2api_data/
├── postgres_data/
└── redis_data/
</code></pre>
<p>不用 <code>sing-box</code> 时，删除 <code>sing-box</code> 服务、<code>sub2api-proxy</code> / <code>sub2api-egress</code> 网络、<code>depends_on.sing-box</code> 和 <code>HTTP_PROXY</code> / <code>HTTPS_PROXY</code> / <code>ALL_PROXY</code> / <code>UPDATE_PROXY_URL</code>。</p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">services:
    sub2api:
        image: weishaw/sub2api:latest
        container_name: sub2api
        restart: unless-stopped
        ulimits:
            nofile:
                soft: 100000
                hard: 100000
        depends_on:
            postgres:
                condition: service_healthy
            redis:
                condition: service_healthy
            sing-box:
                condition: service_started
        volumes:
            - ./sub2api_data:/app/data
        environment:
            - AUTO_SETUP=true
            - SERVER_HOST=0.0.0.0
            - SERVER_PORT=8080
            - SERVER_MODE=${SERVER_MODE:-release}
            - RUN_MODE=${RUN_MODE:-standard}
            - TZ=${TZ:-Asia/Shanghai}

            - DATABASE_HOST=postgres
            - DATABASE_PORT=5432
            - DATABASE_USER=${POSTGRES_USER:-sub2api}
            - DATABASE_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
            - DATABASE_DBNAME=${POSTGRES_DB:-sub2api}
            - DATABASE_SSLMODE=disable
            - DATABASE_MAX_OPEN_CONNS=${DATABASE_MAX_OPEN_CONNS:-50}
            - DATABASE_MAX_IDLE_CONNS=${DATABASE_MAX_IDLE_CONNS:-10}
            - DATABASE_CONN_MAX_LIFETIME_MINUTES=${DATABASE_CONN_MAX_LIFETIME_MINUTES:-30}
            - DATABASE_CONN_MAX_IDLE_TIME_MINUTES=${DATABASE_CONN_MAX_IDLE_TIME_MINUTES:-5}

            - REDIS_HOST=redis
            - REDIS_PORT=6379
            - REDIS_PASSWORD=${REDIS_PASSWORD:?REDIS_PASSWORD is required}
            - REDIS_DB=${REDIS_DB:-0}
            - REDIS_POOL_SIZE=${REDIS_POOL_SIZE:-1024}
            - REDIS_MIN_IDLE_CONNS=${REDIS_MIN_IDLE_CONNS:-10}
            - REDIS_ENABLE_TLS=false

            - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
            - ADMIN_PASSWORD=${ADMIN_PASSWORD:?ADMIN_PASSWORD is required}
            - JWT_SECRET=${JWT_SECRET:?JWT_SECRET is required}
            - JWT_EXPIRE_HOUR=${JWT_EXPIRE_HOUR:-24}
            - TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY:?TOTP_ENCRYPTION_KEY is required}

            # 可选：sub2api 出站走 sing-box
            - HTTP_PROXY=http://sing-box:7890
            - HTTPS_PROXY=http://sing-box:7890
            - ALL_PROXY=socks5h://sing-box:7890
            - UPDATE_PROXY_URL=http://sing-box:7890
            - NO_PROXY=localhost,127.0.0.1,::1,postgres,redis,sing-box,sub2api,new-api,newapi,*.local

            # 允许 new-api 通过 Docker 内网 HTTP 访问 sub2api
            - SECURITY_URL_ALLOWLIST_ENABLED=false
            - SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=true
            - SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS=true
        networks:
            sub2api-internal:
                aliases:
                    - sub2api
            sub2api-proxy:
                aliases:
                    - sub2api
            newapi-sub2api:
                aliases:
                    - sub2api
        healthcheck:
            test: [&quot;CMD&quot;, &quot;wget&quot;, &quot;-q&quot;, &quot;-T&quot;, &quot;5&quot;, &quot;-O&quot;, &quot;/dev/null&quot;, &quot;http://localhost:8080/health&quot;]
            interval: 30s
            timeout: 10s
            retries: 3
            start_period: 60s

    dashboard-proxy:
        image: nginx:1.27-alpine
        container_name: sub2api-dashboard-proxy
        restart: unless-stopped
        depends_on:
            sub2api:
                condition: service_started
        ports:
            - &quot;127.0.0.1:38580:80&quot;
        volumes:
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
        networks:
            sub2api-internal:
                aliases:
                    - sub2api-dashboard-proxy

    postgres:
        image: postgres:18-alpine
        container_name: sub2api-postgres
        restart: unless-stopped
        environment:
            - POSTGRES_USER=${POSTGRES_USER:-sub2api}
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
            - POSTGRES_DB=${POSTGRES_DB:-sub2api}
            - PGDATA=/var/lib/postgresql/data
            - TZ=${TZ:-Asia/Shanghai}
        volumes:
            - ./postgres_data:/var/lib/postgresql/data
        networks:
            sub2api-internal:
                aliases:
                    - postgres
        healthcheck:
            test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U ${POSTGRES_USER:-sub2api} -d ${POSTGRES_DB:-sub2api} -h 127.0.0.1&quot;]
            interval: 10s
            timeout: 5s
            retries: 10
            start_period: 20s

    redis:
        image: redis:8-alpine
        container_name: sub2api-redis
        restart: unless-stopped
        command: &gt;
            sh -c 'redis-server
            --requirepass &quot;$$REDIS_PASSWORD&quot;
            --save 60 1
            --appendonly yes
            --appendfsync everysec'
        volumes:
            - ./redis_data:/data
        environment:
            - TZ=${TZ:-Asia/Shanghai}
            - REDIS_PASSWORD=${REDIS_PASSWORD:?REDIS_PASSWORD is required}
            - REDISCLI_AUTH=${REDIS_PASSWORD:?REDIS_PASSWORD is required}
        networks:
            sub2api-internal:
                aliases:
                    - redis
        healthcheck:
            test: [&quot;CMD-SHELL&quot;, &quot;redis-cli -a \&quot;$${REDIS_PASSWORD}\&quot; ping | grep PONG&quot;]
            interval: 10s
            timeout: 5s
            retries: 10
            start_period: 10s

    sing-box:
        image: ghcr.io/sagernet/sing-box:latest
        container_name: sub2api-sing-box
        restart: unless-stopped
        command: run -c /etc/sing-box/config.json -D /var/lib/sing-box
        volumes:
            - ./sing-box/config.json:/etc/sing-box/config.json:ro
            - ./sing-box-data:/var/lib/sing-box
        networks:
            sub2api-proxy:
                aliases:
                    - sing-box
            sub2api-egress:
        healthcheck:
            test: [&quot;CMD&quot;, &quot;sing-box&quot;, &quot;check&quot;, &quot;-c&quot;, &quot;/etc/sing-box/config.json&quot;]
            interval: 30s
            timeout: 10s
            retries: 3

networks:
    sub2api-internal:
        driver: bridge
        internal: true

    sub2api-proxy:
        driver: bridge
        internal: true

    sub2api-egress:
        driver: bridge

    newapi-sub2api:
        external: true
</code></pre>
<h2>env</h2>
<pre><code class="language-env">TZ=Asia/Shanghai

SERVER_MODE=release
RUN_MODE=standard

POSTGRES_USER=sub2api
POSTGRES_PASSWORD=换成你的PostgreSQL强密码
POSTGRES_DB=sub2api

REDIS_PASSWORD=换成你的Redis强密码
REDIS_DB=0

ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=换成你的sub2api后台密码

JWT_SECRET=换成openssl生成的hex
TOTP_ENCRYPTION_KEY=换成openssl生成的hex
</code></pre>
<p>生成随机值：</p>
<pre><code class="language-bash">openssl rand -hex 24
openssl rand -hex 24
openssl rand -hex 32
openssl rand -hex 32
</code></pre>
<h2>nginx/default.conf</h2>
<pre><code class="language-nginx">server {
    listen 80;

    location / {
        proxy_pass http://sub2api:8080;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
    }
}
</code></pre>
<h2>sing-box/config.json</h2>
<p>可选。只在需要代理出站时创建：</p>
<pre><code class="language-json">{
  &quot;log&quot;: {
    &quot;level&quot;: &quot;info&quot;,
    &quot;timestamp&quot;: true
  },
  &quot;inbounds&quot;: [
    {
      &quot;type&quot;: &quot;mixed&quot;,
      &quot;tag&quot;: &quot;mixed-in&quot;,
      &quot;listen&quot;: &quot;::&quot;,
      &quot;listen_port&quot;: 7890
    }
  ],
  &quot;outbounds&quot;: [
    {
      &quot;type&quot;: &quot;vless&quot;,
      &quot;tag&quot;: &quot;proxy&quot;,
      &quot;server&quot;: &quot;你的VLESS服务器IP或域名&quot;,
      &quot;server_port&quot;: 443,
      &quot;uuid&quot;: &quot;你的完整UUID&quot;,
      &quot;flow&quot;: &quot;xtls-rprx-vision&quot;,
      &quot;tls&quot;: {
        &quot;enabled&quot;: true,
        &quot;server_name&quot;: &quot;你的Reality伪装域名&quot;,
        &quot;utls&quot;: {
          &quot;enabled&quot;: true,
          &quot;fingerprint&quot;: &quot;chrome&quot;
        },
        &quot;reality&quot;: {
          &quot;enabled&quot;: true,
          &quot;public_key&quot;: &quot;你的Reality公钥&quot;,
          &quot;short_id&quot;: &quot;你的short_id&quot;
        }
      },
      &quot;packet_encoding&quot;: &quot;xudp&quot;
    },
    {
      &quot;type&quot;: &quot;direct&quot;,
      &quot;tag&quot;: &quot;direct&quot;
    }
  ],
  &quot;route&quot;: {
    &quot;final&quot;: &quot;proxy&quot;
  }
}
</code></pre>
<p><code>mixed</code> 同时提供 HTTP proxy 和 SOCKS proxy；不需要写旧版 <code>sniff</code> / <code>dns-out</code>。</p>
<h2>启动</h2>
<pre><code class="language-bash">docker compose up -d
docker compose logs -f sub2api
</code></pre>
<p>WebUI：</p>
<pre><code class="language-text">http://127.0.0.1:38580
</code></pre>
<p>远程访问：</p>
<pre><code class="language-powershell">ssh -p 22 -L 38580:127.0.0.1:38580 user@你的服务器IP
</code></pre>
<p>new-api 上游地址：</p>
<pre><code class="language-text">http://sub2api:8080
</code></pre>
<h2>验证</h2>
<pre><code class="language-bash">curl -v http://127.0.0.1:38580/health
docker compose ps
</code></pre>
<p>启用 <code>sing-box</code> 时：</p>
<pre><code class="language-bash">docker compose run --rm sing-box check -c /etc/sing-box/config.json
docker exec -it sub2api sh
wget -O- https://ipinfo.io
</code></pre>
<p>重点备份：</p>
<pre><code class="language-text">.env
docker-compose.yml
nginx/default.conf
sub2api_data/
postgres_data/
redis_data/
sing-box/config.json
</code></pre>
<p><code>postgres_data/</code> 初始化后，再改 <code>.env</code> 的 <code>POSTGRES_PASSWORD</code> 不会自动修改数据库内部密码。新部署可以删数据重来，已有数据不要直接删目录。</p>
]]></content:encoded>
    </item>
    <item>
      <title>AstrBot</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/astrbot</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/astrbot</guid>
    <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
    <description>1. AstrBot 是什么 Github Repo https://github.com/AstrBotDevs/AstrBot AstrBot 是开源的一体化 Agentic chatbot infrastructure。它的核心功能是把 Agent 接入 QQ、Telegram、飞书、钉钉、Slack、Discord、企业微信、微信公众号等 IM 平台，并在 WebUI 中统一管理模型、插件、知识库、MCP、Skills、人格设定、上下文压缩和沙盒执行。 官方文档： h</description>
      <content:encoded><![CDATA[<h1>AstrBot 使用指南</h1>
<h2>1. AstrBot 是什么</h2>
<p><a href="https://github.com/AstrBotDevs/AstrBot">Github Repo</a></p>
<p>AstrBot 是开源的一体化 Agentic chatbot infrastructure。它的核心功能是把 Agent 接入 QQ、Telegram、飞书、钉钉、Slack、Discord、企业微信、微信公众号等 IM 平台，并在 WebUI 中统一管理模型、插件、知识库、MCP、Skills、人格设定、上下文压缩和沙盒执行。</p>
<p>官方文档：</p>
<ul>
<li><a href="https://astrbot.app/">https://astrbot.app/</a></li>
<li><a href="https://docs.astrbot.app/">https://docs.astrbot.app/</a></li>
<li><a href="https://docs.astrbot.app/deploy/astrbot/docker.html">https://docs.astrbot.app/deploy/astrbot/docker.html</a></li>
<li><a href="https://docs.astrbot.app/use/astrbot-agent-sandbox.html">https://docs.astrbot.app/use/astrbot-agent-sandbox.html</a></li>
</ul>
<blockquote>
<p>截至 <strong>2026-05-12</strong>，官方 README 将 AstrBot 定位为面向个人、开发者和团队的 conversational AI infrastructure；最新 GitHub release 为 <strong>v4.24.2（2026-05-03）</strong>。v4.24.x 的重点包括 Plugin Pages、插件国际化、插件提供 Skills、WebUI 中编辑 Skills、CUA Computer Use 沙盒、后台 Shell、Provider 配置优化和若干安全修复。</p>
</blockquote>
<hr>
<h2>2. 安装与更新</h2>
<h3>2.1 <code>uv</code> 一键部署</h3>
<p>适合本地试用：</p>
<pre><code class="language-bash">uv tool install astrbot --python 3.12
astrbot init
astrbot run
</code></pre>
<p>更新：</p>
<pre><code class="language-bash">uv tool upgrade astrbot --python 3.12
</code></pre>
<p>注意：</p>
<ul>
<li>AstrBot 要求 Python 3.12+</li>
<li><code>uv</code> 部署不支持通过 WebUI 升级</li>
<li>macOS 首次运行可能因系统安全检查慢 <code>10-20s</code></li>
</ul>
<h3>2.2 Docker</h3>
<p>Docker Compose 部署：</p>
<ul>
<li><a href="https://develata.me/knowledge/sharing/docker/compose/astrbot">AstrBot Docker Compose 1Panel版</a></li>
</ul>
<p>该模板包含三部分：</p>
<ul>
<li>AstrBot 主服务</li>
<li>NapCat / OneBot：用于接入 QQ 个人号，可选</li>
<li>Shipyard Neo：用于 Agent Sandbox，可选</li>
</ul>
<p>官方文档：</p>
<ul>
<li><a href="https://docs.astrbot.app/deploy/astrbot/docker.html">Deploy AstrBot with Docker</a></li>
</ul>
<p>仓库根目录当前也直接提供：</p>
<ul>
<li><code>Dockerfile</code></li>
<li><code>compose.yml</code></li>
<li><code>compose-with-shipyard.yml</code></li>
</ul>
<pre><code class="language-bash">docker compose up -d
docker compose logs -f astrbot
</code></pre>
<p>官方镜像：</p>
<pre><code class="language-text">soulter/astrbot:latest
</code></pre>
<p>默认 WebUI 端口：</p>
<pre><code class="language-text">6185
</code></pre>
<h3>2.3 其他部署方式</h3>
<p>官方还提供桌面端、Launcher、AUR、宝塔、1Panel、CasaOS、RainYun、Replit、Kubernetes、手动源码部署。一般建议：</p>
<ul>
<li>本地试用：<code>uv</code></li>
<li>长期运行：Docker</li>
<li>桌面 ChatUI：AstrBot Desktop</li>
<li>面板用户：直接用 1Panel / 宝塔应用商店</li>
</ul>
<hr>
<h2>3. 快速开始</h2>
<p>最短路径：</p>
<pre><code class="language-bash">uv tool install astrbot --python 3.12
astrbot init
astrbot run
</code></pre>
<p>Docker 路径：</p>
<pre><code class="language-bash">docker compose up -d
docker compose logs -f astrbot
</code></pre>
<p>然后在 WebUI 中完成三件事：</p>
<ol>
<li>配置模型服务</li>
<li>接入一个消息平台</li>
<li>按需安装插件、知识库、MCP、Skills 或沙盒</li>
</ol>
<p>如果只启动了 AstrBot 但没有接入平台，它只是一个可管理的 Agent 后端，还不能在 IM 里回复消息。</p>
<hr>
<h2>4. 常用命令</h2>
<pre><code class="language-bash">astrbot init
astrbot run
</code></pre>
<p>Docker 管理：</p>
<pre><code class="language-bash">docker compose up -d
docker compose down
docker compose logs -f astrbot
docker compose pull
docker compose up -d
</code></pre>
<p>进入容器：</p>
<pre><code class="language-bash">docker exec -it astrbot bash
</code></pre>
<p>查看 WebUI：</p>
<pre><code class="language-text">http://127.0.0.1:6185
</code></pre>
<p>初始账号密码通常为：</p>
<pre><code class="language-text">astrbot / astrbot
</code></pre>
<p>首次登录后立刻修改密码。</p>
<hr>
<h2>5. 配置与数据目录</h2>
<p>Docker 内数据目录：</p>
<pre><code class="language-text">/AstrBot/data
</code></pre>
<p>宿主机推荐挂载：</p>
<pre><code class="language-text">./data:/AstrBot/data
</code></pre>
<p>这里会保存：</p>
<pre><code class="language-text">config/       配置
plugins/      插件
data/         运行数据
temp/         临时文件
logs/         日志
</code></pre>
<p>规则：</p>
<ul>
<li>定期备份 <code>data/</code></li>
<li>不提交 API keys、平台 token、会话数据</li>
<li>不让多个 AstrBot 实例同时写同一个 <code>data/</code></li>
<li>迁移服务器时，<code>data/</code> 比 compose 文件更重要</li>
</ul>
<hr>
<h2>6. 模型与中转</h2>
<p>AstrBot 支持 OpenAI-compatible、Anthropic、Gemini、Moonshot、智谱、DeepSeek、Ollama、LM Studio、硅基流动、PPIO、ModelScope、OneAPI、Dify、百炼、Coze 等。</p>
<p>常见顺序：</p>
<ol>
<li>在 WebUI 添加 Provider</li>
<li>填写 API Key / Base URL / 模型名</li>
<li>测试 Provider</li>
<li>设置默认模型</li>
</ol>
<p>OpenAI-compatible endpoint 常见检查：</p>
<pre><code class="language-text">base_url = https://api.example.com/v1
model = provider暴露的真实模型名
</code></pre>
<p>Docker 访问宿主机 Ollama / LM Studio 时，优先使用：</p>
<pre><code class="language-text">http://host.docker.internal:11434
http://host.docker.internal:1234
</code></pre>
<p>Linux Docker 下还需要在 compose 里加入 <code>host.docker.internal:host-gateway</code>。同时确保宿主机模型服务监听 <code>0.0.0.0</code>，不是只监听 <code>127.0.0.1</code>。</p>
<hr>
<h2>7. 消息平台</h2>
<p>官方 README 当前列出的官方平台包括：</p>
<pre><code class="language-text">QQ / OneBot v11 / Telegram / 企业微信 / Wecom AI Bot
微信公众号 / 飞书 / 钉钉 / Slack / Discord / LINE
Satori / KOOK / Misskey / Mattermost
</code></pre>
<p>社区平台包括：</p>
<pre><code class="language-text">Matrix / Rocket.Chat / VoceChat
</code></pre>
<p>流程基本一致：</p>
<ol>
<li>在目标平台创建 bot / app</li>
<li>在 WebUI 添加平台适配器</li>
<li>填写 token、secret、回调地址或 websocket 配置</li>
<li>保存并重启 / 热加载</li>
<li>通过日志确认连接成功</li>
</ol>
<p>飞书、钉钉、企业微信、Telegram 更适合正式机器人场景；QQ 个人号通常走 NapCat / OneBot v11。</p>
<h3>7.1 NapCat / OneBot</h3>
<p>NapCat 是常见的 QQ 个人号接入方案，通常通过 OneBot v11 WebSocket 和 AstrBot 通信。部署关系可以理解为：</p>
<pre><code class="language-text">QQ 个人号
    ↓
NapCat
    ↓ OneBot v11
AstrBot
</code></pre>
<p>1Panel / Docker 部署时，建议让 <code>astrbot</code> 和 <code>napcat</code> 放在同一个 Docker network 中，再在 AstrBot WebUI 添加 OneBot v11 适配器。常见端口：</p>
<pre><code class="language-text">6099  NapCat WebUI
6199  AstrBot OneBot v11 WebSocket
</code></pre>
<p>注意：</p>
<ul>
<li>NapCat 需要独立保存 QQ 登录态和配置</li>
<li>不要把 NapCat WebUI 无保护暴露到公网</li>
<li>QQ 个人号方案有平台风控风险，生产业务更建议用官方机器人、企业微信、飞书、钉钉或 Telegram</li>
</ul>
<hr>
<h2>8. 核心功能</h2>
<h3>8.1 WebUI / Web ChatUI</h3>
<p>WebUI 用于管理 Provider、平台、插件、知识库、MCP、Skills、配置和日志；Web ChatUI 可以直接作为浏览器聊天入口，并集成 Agent Sandbox 和网页搜索。</p>
<h3>8.2 插件</h3>
<p>AstrBot 的插件生态很大，官方 README 当前写明有 <code>1000+</code> 插件可一键安装。v4.24.x 后插件能力继续增强：</p>
<ul>
<li>插件可以暴露 Dashboard 页面</li>
<li>插件支持国际化</li>
<li>插件可以提供 Skills</li>
<li>插件详情页、短描述、置顶和官方插件存储下载能力增强</li>
</ul>
<p>旧教程里某些“内置命令默认存在”的说法可能已经过时；部分低频命令已经迁移到插件，例如 <code>builtin_commands_extension</code>。</p>
<h3>8.3 Skills / MCP / 知识库</h3>
<p>AstrBot 支持：</p>
<ul>
<li>Skills：沉淀可复用能力和提示结构</li>
<li>MCP：接入外部工具服务器</li>
<li>知识库：上传文档后做检索增强</li>
<li>自动上下文压缩：长会话中降低上下文溢出概率</li>
</ul>
<p>使用顺序建议先配模型和平台，再逐步加知识库、MCP 和 Skills。</p>
<h3>8.4 Agent Sandbox</h3>
<p>AstrBot 从 <code>v4.12.0</code> 起引入 Agent 沙盒，用于替代旧代码执行器。当前驱动包括：</p>
<pre><code class="language-text">Shipyard Neo   当前推荐
Shipyard       旧方案，兼容保留
CUA            Computer Use 运行时
</code></pre>
<p>Shipyard Neo 由 Bay、Ship、Gull 组成：</p>
<ul>
<li>Bay：控制面 API</li>
<li>Ship：Python / Shell / 文件系统执行环境</li>
<li>Gull：浏览器能力</li>
</ul>
<p>部署关系：</p>
<pre><code class="language-text">AstrBot
    ↓ Shipyard Neo API
Bay
    ↓ Docker socket
Ship / Gull sandbox containers
</code></pre>
<p>Shipyard Neo 的工作区根目录固定为 <code>/workspace</code>。在 AstrBot 的沙盒文件工具里应传相对路径，例如 <code>reports/result.txt</code>，不要传 <code>/workspace/reports/result.txt</code>。</p>
<p>WebUI 配置入口：</p>
<pre><code class="language-text">AI 配置 -&gt; Agent Computer Use
Computer Use Runtime = sandbox
沙箱环境驱动器 = Shipyard Neo / CUA
</code></pre>
<p>如果使用本文配套 compose，Shipyard Neo 的典型配置是：</p>
<pre><code class="language-text">Shipyard Neo API Endpoint = http://astrbot-bay:8114
Shipyard Neo Access Token = Bay config.yaml 中的 security.api_key
Shipyard Neo Profile = python-default
</code></pre>
<p>资源建议：</p>
<ul>
<li>仅 AstrBot：<code>1C1G</code> 可试用，长期建议 <code>2C2G+</code></li>
<li>AstrBot + Shipyard Neo：至少 <code>2C4G</code> 并开启 Swap</li>
<li>启用浏览器 / CUA：更适合资源充足的独立机器或 homelab</li>
</ul>
<p>低配 VPS 不建议把 AstrBot、浏览器沙盒和多个 IM 适配器全塞在一起。</p>
<h3>8.5 主动任务 / Cron</h3>
<p>AstrBot 支持主动型 Agent 能力和 Cron 任务，可用于定时摘要、提醒、巡检、消息推送等。生产使用时应限制可主动发送的会话范围，避免普通用户借工具向任意 session 发消息。</p>
<hr>
<h2>9. Docker 文件访问与安全</h2>
<p>AstrBot 容器只能访问容器内路径和显式挂载目录。要让它处理宿主机文件，需要挂载：</p>
<pre><code class="language-yaml">volumes:
    - ./data:/AstrBot/data
    - /opt/projects:/workspace/projects
</code></pre>
<p>安全规则：</p>
<ul>
<li>不挂载宿主机根目录</li>
<li>不把 secrets 目录交给 Agent</li>
<li>WebUI 不直接公网裸奔</li>
<li>首次登录后修改默认密码</li>
<li>只开放必要端口</li>
<li>沙盒服务不要匿名访问</li>
<li>使用 Shipyard Neo 时，<code>security.api_key</code> 必须是强随机字符串</li>
<li>Bay 需要 Docker socket，最好单独部署在更可信、更有资源的机器上</li>
</ul>
<hr>
<h2>10. 排错</h2>
<h3>10.1 WebUI 打不开</h3>
<p>确认容器运行：</p>
<pre><code class="language-bash">docker compose logs -f astrbot
</code></pre>
<p>确认端口：</p>
<pre><code class="language-text">6185
</code></pre>
<p>如果通过 1Panel 反代，目标应是：</p>
<pre><code class="language-text">http://astrbot:6185
</code></pre>
<p>不要在 Docker 网络里把反代目标写成 <code>127.0.0.1:6185</code>。</p>
<h3>10.2 平台收不到消息</h3>
<p>检查：</p>
<ul>
<li>平台 token / app secret 是否正确</li>
<li>webhook 地址是否公网可达</li>
<li>websocket 模式是否连上</li>
<li>平台事件订阅是否启用</li>
<li>AstrBot 日志里是否有适配器报错</li>
</ul>
<h3>10.3 模型不可用</h3>
<p>检查：</p>
<ul>
<li>Provider 是否启用</li>
<li>API Key 是否有效</li>
<li>Base URL 是否带 <code>/v1</code></li>
<li>模型名是否真实存在</li>
<li>容器内是否能访问模型网关</li>
</ul>
<h3>10.4 沙盒不可用</h3>
<p>检查：</p>
<ul>
<li>WebUI 中 <code>Computer Use Runtime</code> 是否设为 <code>sandbox</code></li>
<li>Shipyard Neo Endpoint 是否可访问</li>
<li>Bay API Key 是否一致</li>
<li>Docker socket 是否挂载给 Bay</li>
<li><code>config.yaml</code> 中 network 是否和 compose 网络一致</li>
<li>宿主机资源是否足够</li>
</ul>
<hr>
<h2>11. 参考链接</h2>
<pre><code class="language-text">https://github.com/AstrBotDevs/AstrBot
https://github.com/AstrBotDevs/AstrBot/releases
https://astrbot.app/
https://docs.astrbot.app/
https://docs.astrbot.app/deploy/astrbot/docker.html
https://docs.astrbot.app/use/astrbot-agent-sandbox.html
https://github.com/AstrBotDevs/AstrBot-desktop
https://github.com/AstrBotDevs/builtin_commands_extension
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>astrbot</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/astrbot</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/astrbot</guid>
    <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
    <description>Github Repo AstrBot Github Repo https://github.com/AstrBotDevs/AstrBot docker-compose env 如果接入微信公众号、企业微信或 QQ 官方 Webhook，再按需暴露对应回调端口。旧版常见端口是 6194 、 6195 、 6196 ，以 WebUI / 官方适配器文档中的实际配置为准。 启动： WebUI： 初始账号密码通常是： 首次登录后立刻修改密码。 不要直接把 6185 暴露到公网，建</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/AstrBotDevs/AstrBot">AstrBot Github Repo</a></p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">networks:
    1panel-network:
        external: true

services:
    astrbot:
        container_name: astrbot
        image: ${ASTRBOT_IMAGE}
        restart: unless-stopped
        security_opt:
            - no-new-privileges:true
        env_file:
            - .env
        environment:
            - TZ=${TIME_ZONE}
        labels:
            createdBy: Apps
        networks:
            - 1panel-network
        extra_hosts:
            - &quot;host.docker.internal:host-gateway&quot;
        ports:
            - ${HOST_IP}:${ASTRBOT_WEBUI_HOST_PORT}:6185
            - ${HOST_IP}:${ASTRBOT_ONEBOT_HOST_PORT}:6199
            - ${HOST_IP}:${ASTRBOT_WECHAT_CALLBACK_HOST_PORT}:11451
        volumes:
            - ./data:/AstrBot/data
        healthcheck:
            test: [&quot;CMD&quot;, &quot;python&quot;, &quot;-c&quot;, &quot;import urllib.request; urllib.request.urlopen('http://127.0.0.1:6185', timeout=5)&quot;]
            interval: 30s
            timeout: 8s
            start_period: 40s
            retries: 5
</code></pre>
<h2>env</h2>
<pre><code class="language-env">TIME_ZONE=Asia/Shanghai
HOST_IP=127.0.0.1

ASTRBOT_IMAGE=soulter/astrbot:latest

# WebUI
ASTRBOT_WEBUI_HOST_PORT=6185

# OneBot v11 / NapCat WebSocket，可选
ASTRBOT_ONEBOT_HOST_PORT=6199

# 个人微信 / Gewechat callback，可选
ASTRBOT_WECHAT_CALLBACK_HOST_PORT=11451
</code></pre>
<p>如果接入微信公众号、企业微信或 QQ 官方 Webhook，再按需暴露对应回调端口。旧版常见端口是 <code>6194</code>、<code>6195</code>、<code>6196</code>，以 WebUI / 官方适配器文档中的实际配置为准。</p>
<p>启动：</p>
<pre><code class="language-bash">docker compose up -d
docker compose logs -f astrbot
</code></pre>
<p>WebUI：</p>
<pre><code class="language-text">http://127.0.0.1:6185
</code></pre>
<p>初始账号密码通常是：</p>
<pre><code class="language-text">astrbot / astrbot
</code></pre>
<p>首次登录后立刻修改密码。</p>
<p><strong>不要直接把 6185 暴露到公网，建议 <code>HOST_IP=127.0.0.1</code> 后再通过 1Panel 反代访问。</strong></p>
<p>1Panel 反代目标：</p>
<pre><code class="language-text">http://astrbot:6185
</code></pre>
<p>如果需要让 AstrBot 访问更多宿主机目录，用 <code>volumes</code> 显式挂载：</p>
<pre><code class="language-yaml">volumes:
    - ./data:/AstrBot/data
    - /opt/projects:/workspace/projects
</code></pre>
<p>在 AstrBot 中使用容器内路径：</p>
<pre><code class="language-text">/workspace/projects
</code></pre>
<p>这只是 AstrBot 主容器能访问的路径。Shipyard Neo 沙盒的文件工具以 <code>/workspace</code> 为根目录，调用时应传相对路径。</p>
<h2>NapCat / OneBot</h2>
<p>QQ 个人号通常通过 NapCat / OneBot v11 接入。更推荐参考 NapCat 官方的 AstrBot compose；如果只是在同一个 1Panel 网络里连接，可以额外部署：</p>
<pre><code class="language-yaml">services:
    napcat:
        image: mlikiowa/napcat-docker:latest
        container_name: napcat
        restart: unless-stopped
        environment:
            - NAPCAT_UID=${NAPCAT_UID}
            - NAPCAT_GID=${NAPCAT_GID}
            - MODE=astrbot
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${NAPCAT_WEBUI_HOST_PORT}:6099
        volumes:
            - ./napcat/config:/app/napcat/config
            - ./ntqq:/app/.config/QQ
</code></pre>
<p>对应 <code>.env</code>：</p>
<pre><code class="language-env">NAPCAT_UID=1000
NAPCAT_GID=1000
NAPCAT_WEBUI_HOST_PORT=6099
</code></pre>
<p>AstrBot 侧按 WebUI 提示添加 OneBot v11 适配器。</p>
<h2>Agent Sandbox</h2>
<p>AstrBot 的沙盒执行能力建议使用 Shipyard Neo。低配 VPS 不建议默认开启；需要 Python / Shell / 浏览器 / Computer Use 时再部署。</p>
<p>官方推荐单独部署 Shipyard Neo：</p>
<pre><code class="language-bash">git clone https://github.com/AstrBotDevs/shipyard-neo
cd shipyard-neo/deploy/docker
openssl rand -hex 32
# 修改 config.yaml 中 security.api_key 和 docker.network
docker compose up -d
</code></pre>
<p>如果要和 AstrBot 放在同一个 1Panel 网络中，核心配置是：</p>
<pre><code class="language-yaml">services:
    bay:
        image: ghcr.io/astrbotdevs/shipyard-neo-bay:latest
        container_name: astrbot-bay
        restart: unless-stopped
        environment:
            - BAY_CONFIG_FILE=/app/config.yaml
            - BAY_DATA_DIR=/app/data
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${BAY_HOST_PORT}:8114
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./shipyard/config.yaml:/app/config.yaml:ro
            - ./shipyard/data:/app/data
            - ./shipyard/cargos:/var/lib/bay/cargos
        healthcheck:
            test: [&quot;CMD&quot;, &quot;curl&quot;, &quot;-f&quot;, &quot;http://127.0.0.1:8114/health&quot;]
            interval: 30s
            timeout: 10s
            start_period: 15s
            retries: 5
</code></pre>
<p>对应 <code>.env</code>：</p>
<pre><code class="language-env">BAY_HOST_PORT=8114
</code></pre>
<p><code>shipyard/config.yaml</code> 最小关键项：</p>
<pre><code class="language-yaml">server:
  host: &quot;0.0.0.0&quot;
  port: 8114

database:
  url: &quot;sqlite+aiosqlite:///./data/bay.db&quot;
  echo: false

driver:
  type: docker
  image_pull_policy: always
  docker:
    socket: &quot;unix:///var/run/docker.sock&quot;
    connect_mode: container_network
    network: &quot;1panel-network&quot;
    publish_ports: false
    host_port: null

cargo:
  root_path: &quot;/var/lib/bay/cargos&quot;
  default_size_limit_mb: 1024
  mount_path: &quot;/workspace&quot;

security:
  api_key: &quot;换成 openssl rand -hex 32 生成的强随机字符串&quot;
  allow_anonymous: false

profiles:
  - id: python-default
    description: &quot;Python / Shell / filesystem sandbox&quot;
    image: &quot;ghcr.io/astrbotdevs/shipyard-neo-ship:latest&quot;
    runtime_type: ship
    runtime_port: 8123
    resources:
      cpus: 1.0
      memory: &quot;1g&quot;
    capabilities:
      - filesystem
      - shell
      - python
    idle_timeout: 1800
    warm_pool_size: 0
    env: {}

gc:
  enabled: true
  run_on_startup: true
  interval_seconds: 300
  instance_id: &quot;bay-prod&quot;
  idle_session:
    enabled: true
  expired_sandbox:
    enabled: true
  orphan_cargo:
    enabled: true
  orphan_container:
    enabled: true
</code></pre>
<p>AstrBot WebUI 中配置：</p>
<pre><code class="language-text">AI 配置 -&gt; Agent Computer Use
Computer Use Runtime = sandbox
沙箱环境驱动器 = Shipyard Neo
Shipyard Neo API Endpoint = http://astrbot-bay:8114
Shipyard Neo Access Token = config.yaml 中的 security.api_key
Shipyard Neo Profile = python-default
</code></pre>
<p>如果需要浏览器能力，再增加 <code>browser-python</code> profile，并使用 <code>ghcr.io/astrbotdevs/shipyard-neo-gull:latest</code>。浏览器沙盒更吃资源，建议至少 <code>2C4G</code> 并开启 Swap。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hermes Agent</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/hermes-agent</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/hermes-agent</guid>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
    <description>1. Hermes Agent 是什么 Github Repo https://github.com/NousResearch/hermes-agent Hermes Agent（命令 hermes ）是长期运行型 personal agent，独特优势在于长期记忆、skills自我改进，其余功能类似openclaw，跨会话检索、cron 定时任务，多入口支持如：Telegram、飞书等。 官方文档： https://hermes-agent.nousresearch.com</description>
      <content:encoded><![CDATA[<h1>Hermes Agent 使用指南</h1>
<h2>1. Hermes Agent 是什么</h2>
<p><a href="https://github.com/NousResearch/hermes-agent">Github Repo</a></p>
<p>Hermes Agent（命令 <code>hermes</code>）是长期运行型 personal agent，独特优势在于长期记忆、skills自我改进，其余功能类似openclaw，跨会话检索、cron 定时任务，多入口支持如：Telegram、飞书等。</p>
<p>官方文档：</p>
<ul>
<li><a href="https://hermes-agent.nousresearch.com/">https://hermes-agent.nousresearch.com/</a></li>
<li><a href="https://github.com/NousResearch/hermes-agent/blob/main/website/docs/user-guide/docker.md">https://github.com/NousResearch/hermes-agent/blob/main/website/docs/user-guide/docker.md</a></li>
<li><a href="https://github.com/NousResearch/hermes-agent/blob/main/docker-compose.yml">https://github.com/NousResearch/hermes-agent/blob/main/docker-compose.yml</a></li>
</ul>
<blockquote>
<p>截至 <strong>2026-05-11</strong>，官方 README 仍称它为 <strong>“The agent that grows with you”</strong>。它不像 Claude Code / OpenCode 那样主要面向本地项目 TUI，更适合常驻 VPS，通过 gateway 接入多个聊天渠道；模型来源支持 OpenRouter、OpenAI、自定义 endpoint 等。v0.12.0 起官方强调 Autonomous Curator：后台周期性整理、评分、剪枝、合并 skill library，并改进“哪些经验值得保存”的自我更新循环。</p>
</blockquote>
<hr>
<h2>2. 安装与更新</h2>
<h3>2.1 Linux / macOS / WSL2 / Termux</h3>
<pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
source ~/.bashrc
</code></pre>
<h3>2.2 Windows</h3>
<pre><code class="language-powershell">irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1 | iex
</code></pre>
<p>补充：</p>
<ul>
<li>原生 Windows 安装目录通常为 <code>%LOCALAPPDATA%\hermes</code></li>
<li>WSL2 安装目录通常为 <code>~/.hermes</code></li>
<li>原生 Windows 仍偏 early beta；dashboard chat pane 依赖 POSIX PTY，稳定使用建议放在 WSL2 内</li>
</ul>
<h3>2.3 Docker</h3>
<p>Docker Compose部署：</p>
<ul>
<li><a href="https://develata.me/knowledge/sharing/docker/compose/hermes-agent">Hermes Agent Docker Compose 1panel版</a></li>
</ul>
<pre><code class="language-bash">docker compose run --rm hermes setup
docker compose up -d
</code></pre>
<p><code>setup</code> 会把 <code>.env</code>、<code>config.yaml</code> 等配置写入 <code>/opt/data</code> 对应的宿主机目录。</p>
<h3>2.4 更新</h3>
<p>脚本安装：重新执行安装脚本。Docker 部署：</p>
<pre><code class="language-bash">docker compose pull
docker compose up -d
</code></pre>
<hr>
<h2>3. 快速开始</h2>
<h3>3.1 本地 CLI</h3>
<pre><code class="language-bash">hermes setup
hermes model
hermes tools
hermes
</code></pre>
<h3>3.2 Gateway 服务</h3>
<pre><code class="language-bash">hermes gateway run
</code></pre>
<p>官方 Docker 端口：</p>
<ul>
<li><code>8642</code>：gateway API / health endpoint</li>
<li><code>9119</code>：dashboard；浏览器 Chat tab 需要 <code>HERMES_DASHBOARD_TUI=1</code></li>
</ul>
<p>健康检查：</p>
<pre><code class="language-bash">curl http://127.0.0.1:8642/health
</code></pre>
<p>域名反代：</p>
<pre><code class="language-text">dashboard: http://hermes-agent:9119
gateway:   http://hermes-agent:8642
</code></pre>
<h2>4. 常用命令</h2>
<pre><code class="language-bash">hermes
hermes setup
hermes model
hermes tools
hermes config set
hermes gateway run
hermes update
hermes doctor
</code></pre>
<p>Docker 管理：</p>
<pre><code class="language-bash">docker compose up -d
docker compose down
docker compose logs -f hermes
docker compose pull
</code></pre>
<p>容器内打开 Hermes CLI：</p>
<pre><code class="language-bash">docker exec -it hermes-agent bash
/opt/hermes/.venv/bin/hermes
</code></pre>
<p>排查优先看日志：</p>
<pre><code class="language-bash">docker compose logs -f hermes
</code></pre>
<hr>
<h2>5. 配置与数据目录</h2>
<p>Docker 内数据目录：</p>
<pre><code class="language-text">/opt/data
</code></pre>
<p>常见内容：</p>
<pre><code class="language-text">.env          API keys and secrets
config.yaml   Hermes 配置
SOUL.md       Agent personality / identity
sessions/     会话历史
memories/     长期记忆
skills/       skills
cron/         定时任务
hooks/        事件 hooks
logs/         日志
skins/        CLI 皮肤
</code></pre>
<p>规则：</p>
<ul>
<li>定期备份 <code>data/</code></li>
<li>不提交 <code>.env</code>、API keys、sessions、memories</li>
<li>不让多个 gateway 同时写同一个 data 目录</li>
<li>迁移服务器时，<code>data/</code> 比 compose 文件更重要</li>
</ul>
<hr>
<h2>6. 模型与中转</h2>
<p>常见环境变量：</p>
<pre><code class="language-text">OPENROUTER_API_KEY=
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
GOOGLE_API_KEY=
GEMINI_API_KEY=
DEEPSEEK_API_KEY=
</code></pre>
<p>OpenAI-compatible endpoint（vLLM / LiteLLM / xinference）检查：</p>
<ul>
<li><code>base_url</code> 形如 <code>http://vllm:8000/v1</code>，不要带结尾斜杠</li>
<li>Hermes 容器内能访问模型服务</li>
<li>模型服务监听 <code>0.0.0.0</code>，不是只监听 <code>127.0.0.1</code></li>
</ul>
<pre><code class="language-bash">docker exec hermes-agent curl -s http://vllm:8000/v1/models
</code></pre>
<hr>
<h2>7. 聊天渠道</h2>
<p>Gateway 启动后，CLI 和聊天平台共享很多 slash command：</p>
<pre><code class="language-text">/new
/reset
/model
/personality
/retry
/undo
/compress
/usage
/skills
/stop
</code></pre>
<p>Telegram 最小配置：</p>
<pre><code class="language-text">TELEGRAM_BOT_TOKEN=你的bot token
TELEGRAM_ALLOWED_USERS=你的telegram user id
</code></pre>
<p>流程：</p>
<ol>
<li>BotFather 创建 bot。</li>
<li><code>.env</code> 写入 token 和 allowed users。</li>
<li><code>setup</code> / 配置流程启用 Telegram channel。</li>
<li>重启并看日志。</li>
</ol>
<pre><code class="language-bash">docker compose restart hermes
docker compose logs -f hermes
</code></pre>
<p>先只允许自己的 Telegram user id，不要一开始放开群聊。</p>
<h3>7.1 飞书 / Lark</h3>
<p>官方 Feishu/Lark 适配支持私聊、群聊、cron 结果投递、文本、图片、音频、文件附件。推荐 <code>websocket</code> 模式：Hermes 主动连飞书，不需要公网 webhook。</p>
<p>最短流程：</p>
<pre><code class="language-bash">hermes gateway setup
</code></pre>
<p>选择 Feishu / Lark 后扫码创建，或手动填写 App ID / App Secret。</p>
<p>手动 <code>.env</code> 最小项：</p>
<pre><code class="language-text">FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=secret_xxx
FEISHU_DOMAIN=feishu
FEISHU_CONNECTION_MODE=websocket
FEISHU_ALLOWED_USERS=ou_xxx,ou_yyy
FEISHU_HOME_CHANNEL=oc_xxx
</code></pre>
<p>说明：</p>
<ul>
<li><code>FEISHU_DOMAIN=feishu</code> 用国内飞书，<code>lark</code> 用国际版</li>
<li>私聊默认每条消息都响应</li>
<li>群聊默认需要 @bot</li>
<li><code>FEISHU_HOME_CHANNEL</code> 接收 cron 结果和跨平台通知</li>
<li>生产环境务必设置 <code>FEISHU_ALLOWED_USERS</code></li>
</ul>
<hr>
<h2>8. 核心功能</h2>
<h3>8.1 Tools</h3>
<pre><code class="language-bash">hermes tools
</code></pre>
<p>配置启用哪些工具。官方 README 提到 Hermes 有 toolset system 和 40+ tools；按场景逐步开启，不建议一开始全放开。</p>
<h3>8.2 Skills</h3>
<p>Hermes 会在使用中创建和改进 skills，也兼容 <a href="http://agentskills.io">agentskills.io</a> 开放标准。常用入口：</p>
<pre><code class="language-text">/skills
/&lt;skill-name&gt;
</code></pre>
<p>自我更新的关键在 skills：Hermes 会把可复用流程沉淀为 procedural memory；Autonomous Curator 按 gateway 的 cron ticker 后台运行，默认 7 天周期，负责合并重复技能、剪掉低价值技能、保留高价值经验。</p>
<h3>8.3 Memory</h3>
<p>长期记忆、用户画像和跨会话信息主要在：</p>
<pre><code class="language-text">data/memories/
data/sessions/
</code></pre>
<h3>8.4 Cron</h3>
<p>内置 cron scheduler，可把日报、备份、审计、项目跟踪等任务投递到配置好的聊天平台。数据目录：</p>
<pre><code class="language-text">cron/
</code></pre>
<hr>
<h2>9. Docker 文件访问与安全</h2>
<p>Hermes 容器只能访问容器内文件和显式挂载目录。要管理宿主机项目，在 compose 里加 <code>volumes</code>：</p>
<pre><code class="language-yaml">volumes:
    - ./data:/opt/data
    - /opt/projects:/workspace/projects
</code></pre>
<p>在 Hermes 中使用容器内路径：</p>
<pre><code class="language-text">/workspace/projects
</code></pre>
<p>安全规则：</p>
<ul>
<li>不挂载宿主机根目录</li>
<li>只挂载需要管理的目录</li>
<li>secrets 目录不要默认交给 agent</li>
<li>dashboard 域名加访问密码或 IP 白名单</li>
<li><code>API_SERVER_KEY</code> 使用强随机字符串</li>
<li>不直接暴露 <code>9119</code> / <code>8642</code></li>
<li>不覆盖官方镜像 entrypoint；官方要求保留 <code>/opt/hermes/docker/entrypoint.sh</code>，否则可能生成 root-owned 状态文件</li>
</ul>
<h2>10. 排错</h2>
<h3>10.1 dashboard 访问不了</h3>
<p>确认：</p>
<pre><code class="language-text">HERMES_DASHBOARD=1
HERMES_DASHBOARD_HOST=0.0.0.0
HERMES_DASHBOARD_PORT=9119
</code></pre>
<p>Chat tab 不可用再确认：</p>
<pre><code class="language-text">HERMES_DASHBOARD_TUI=1
</code></pre>
<h3>10.2 API 无法访问</h3>
<p>确认：</p>
<pre><code class="language-text">API_SERVER_ENABLED=true
API_SERVER_HOST=0.0.0.0
API_SERVER_KEY=至少8位强随机字符串
</code></pre>
<p>测试：</p>
<pre><code class="language-bash">curl http://127.0.0.1:8642/health
</code></pre>
<h3>10.3 data 权限问题</h3>
<p>查宿主机用户：</p>
<pre><code class="language-bash">id -u
id -g
</code></pre>
<p>然后修改：</p>
<pre><code class="language-text">HERMES_UID=
HERMES_GID=
</code></pre>
<p>官方 Docker 文档说明容器入口会切换到非 root 的 <code>hermes</code> 用户，默认 UID 为 <code>10000</code>。挂载目录不可写时，通常就是这里不匹配。</p>
<h3>10.4 浏览器工具异常</h3>
<p>如果 Playwright / 浏览器工具异常，给容器加：</p>
<pre><code class="language-yaml">shm_size: 1g
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>OpenClaw</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/openclaw</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/openclaw</guid>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
    <description>1. OpenClaw 是什么 Github Repo https://github.com/openclaw/openclaw OpenClaw（命令 openclaw ）是 self-hosted personal AI assistant：一个常驻 Gateway 连接 WhatsApp、Telegram、Slack、Discord、飞书 / Lark、Signal、iMessage、Matrix、Teams、WebChat 等渠道，再把消息交给 agent、tools</description>
      <content:encoded><![CDATA[<h1>OpenClaw 使用指南</h1>
<h2>1. OpenClaw 是什么</h2>
<p><a href="https://github.com/openclaw/openclaw">Github Repo</a></p>
<p>OpenClaw（命令 <code>openclaw</code>）是 self-hosted personal AI assistant：一个常驻 Gateway 连接 WhatsApp、Telegram、Slack、Discord、飞书 / Lark、Signal、iMessage、Matrix、Teams、WebChat 等渠道，再把消息交给 agent、tools、skills、memory、cron 处理。</p>
<p>官方文档：</p>
<ul>
<li><a href="https://docs.openclaw.ai">https://docs.openclaw.ai</a></li>
<li><a href="https://docs.openclaw.ai/start/getting-started">https://docs.openclaw.ai/start/getting-started</a></li>
<li><a href="https://docs.openclaw.ai/install/docker">https://docs.openclaw.ai/install/docker</a></li>
<li><a href="https://docs.openclaw.ai/channels/feishu">https://docs.openclaw.ai/channels/feishu</a></li>
</ul>
<blockquote>
<p>截至 <strong>2026-05-11</strong>，官方 README 仍把 OpenClaw 定位为 <strong>Personal AI Assistant</strong>，并强调 Gateway 只是 control plane，产品本体是 assistant。当前推荐运行时是 <strong>Node 24</strong>，最低 <strong>Node 22.16+</strong>；Windows 建议通过 WSL2 使用。最新 GitHub release 已到 <strong>v2026.5.6（2026-05-06）</strong>，旧文中的 <code>v2026.4.12</code> 已过时。</p>
</blockquote>
<h3>1.1 推荐配置</h3>
<p><code>&gt;= 2 核 2G</code>（建议开 SWAP），最好 <code>&gt;= 2 核 4G</code>。</p>
<p>若服务器性能不足，可考虑基于 Rust 的轻量替代方案 <a href="https://github.com/zeroclaw-labs/zeroclaw">zeroclaw</a>。</p>
<h2>2. 安装与更新</h2>
<h3>2.1 npm / pnpm</h3>
<pre><code class="language-bash">npm install -g openclaw@latest
# 或
pnpm add -g openclaw@latest
</code></pre>
<p>初始化：</p>
<pre><code class="language-bash">openclaw onboard --install-daemon
</code></pre>
<p><code>onboard</code> 会引导你配置 Gateway、模型、工作区、聊天渠道、skills 和后台服务。</p>
<h3>2.2 onboard 关键选择</h3>
<p><code>openclaw onboard</code> 默认 quickstart：本地 Gateway、默认工作区、端口 <code>18789</code>、Token 认证、Tailscale 关闭。单机自用直接选默认；要远程访问、多设备、公开渠道，再走 advanced。</p>
<p>已有配置时：</p>
<ul>
<li><code>Keep</code>：保留现有配置，只补缺项</li>
<li><code>Modify</code>：保留为主，逐步修改关键项</li>
<li><code>Reset</code>：重置配置；优先 <code>Config only</code>，不要一开始 full reset</li>
</ul>
<p>非交互模式必须显式承认风险：</p>
<pre><code class="language-bash">openclaw onboard --non-interactive --accept-risk \
  --mode local \
  --gateway-bind loopback \
  --gateway-port 18789 \
  --install-daemon \
  --daemon-runtime node
</code></pre>
<h3>2.3 Docker</h3>
<p>Docker Compose部署：</p>
<ul>
<li><a href="https://develata.me/knowledge/sharing/docker/compose/openclaw">OpenClaw Docker Compose 1panel版</a></li>
</ul>
<p>官方 Docker 流程推荐从仓库根目录执行：</p>
<pre><code class="language-bash">export OPENCLAW_IMAGE=&quot;ghcr.io/openclaw/openclaw:latest&quot;
./scripts/docker/setup.sh
</code></pre>
<p>这个脚本会自动 onboarding、生成 Gateway token、写入 <code>.env</code> 并启动 compose。手写 compose 时，也要先跑一次 onboarding / config 写入，否则 Gateway 可能因为缺少 <code>gateway.mode=local</code> 拒绝启动。</p>
<h3>2.4 更新</h3>
<pre><code class="language-bash">openclaw update
openclaw doctor
</code></pre>
<p>Docker 部署：</p>
<pre><code class="language-bash">docker compose pull
docker compose up -d
docker compose run --rm openclaw-cli doctor
</code></pre>
<hr>
<h2>3. 快速开始</h2>
<p>本地最短路径：</p>
<pre><code class="language-bash">openclaw onboard --install-daemon
openclaw agent --message &quot;Ship checklist&quot; --thinking high
openclaw status --deep
</code></pre>
<p>前台启动 Gateway：</p>
<pre><code class="language-bash">openclaw gateway run
</code></pre>
<p>默认端口：</p>
<ul>
<li><code>18789</code>：Gateway WebSocket、Control UI / WebChat、health endpoint</li>
<li><code>18790</code>：bridge port，官方 compose 默认也暴露</li>
</ul>
<p>浏览器打开：</p>
<pre><code class="language-text">http://127.0.0.1:18789/
</code></pre>
<p>Docker 健康检查：</p>
<pre><code class="language-bash">curl http://127.0.0.1:18789/healthz
curl http://127.0.0.1:18789/readyz
</code></pre>
<hr>
<h2>4. 常用命令</h2>
<pre><code class="language-bash">openclaw onboard --install-daemon
openclaw configure
openclaw config get
openclaw agent --message &quot;...&quot;
openclaw gateway run
openclaw gateway restart
openclaw status --deep
openclaw logs --follow
openclaw doctor
openclaw health
openclaw gateway status
openclaw gateway probe
</code></pre>
<p>Docker 管理：</p>
<pre><code class="language-bash">docker compose up -d
docker compose down
docker compose logs -f openclaw-gateway
docker compose run --rm openclaw-cli dashboard --no-open
</code></pre>
<p>渠道命令：</p>
<pre><code class="language-bash">docker compose run --rm openclaw-cli channels login
docker compose run --rm openclaw-cli channels add
docker compose run --rm openclaw-cli channels add --channel telegram --token &quot;&lt;token&gt;&quot;
</code></pre>
<hr>
<h2>5. 配置与数据目录</h2>
<p>默认配置：</p>
<pre><code class="language-text">~/.openclaw/openclaw.json
~/.openclaw/.env
~/.openclaw/workspace/
</code></pre>
<p><code>openclaw.json</code> 是 JSON5：支持注释和尾逗号，但 schema 校验严格。未知键、类型错误、非法值都会让 Gateway 拒绝启动。</p>
<p>Docker 内路径：</p>
<pre><code class="language-text">/home/node/.openclaw
/home/node/.openclaw/workspace
</code></pre>
<p>常见内容：</p>
<pre><code class="language-text">openclaw.json                 Gateway / agents / channels 配置
.env                          Gateway token 与模型服务 key
agents/*/agent/auth-profiles   provider OAuth / API-key auth
workspace/MEMORY.md            主记忆
workspace/memory/*.md          结构化记忆
workspace/sessions/            会话数据
workspace/cron/                定时任务运行记录
</code></pre>
<p>规则：</p>
<ul>
<li>定期备份 <code>.openclaw/</code> 或 Docker 的 <code>config/</code>、<code>workspace/</code></li>
<li>不提交 <code>.env</code>、auth profiles、sessions、memory</li>
<li>Docker 中不要把宿主机路径写进容器运行时的 <code>OPENCLAW_CONFIG_DIR</code></li>
<li>多 agent 用 <code>openclaw agents add work</code>，不要手动复制工作区混用</li>
</ul>
<p>改配置的三种入口：</p>
<pre><code class="language-bash">openclaw configure
openclaw configure --section models --section channels
openclaw config get
openclaw config set gateway.mode local
</code></pre>
<p>远程 / UI 场景可用 Gateway RPC：</p>
<pre><code class="language-bash">openclaw gateway call config.get --params '{}'
openclaw gateway call config.patch --params '{&quot;raw&quot;:&quot;{ gateway: { mode: \&quot;local\&quot; } }&quot;,&quot;baseHash&quot;:&quot;&lt;hash&gt;&quot;}'
</code></pre>
<p>如果通过 systemd / launchd 常驻运行，模型 Key 要同时对服务进程可见。Linux user service 常见做法是把 key 放进环境文件，再重启 Gateway；CLI 侧也可放入 <code>~/.openclaw/.env</code>。</p>
<hr>
<h2>6. 模型与中转</h2>
<p>常见认证方式：</p>
<ul>
<li>OpenAI / Codex OAuth</li>
<li>OpenAI API key</li>
<li>Anthropic API key</li>
<li>OpenRouter API key</li>
<li>自定义 OpenAI-compatible / Anthropic-compatible endpoint</li>
</ul>
<p>第三方 OpenAI-compatible 示例：</p>
<pre><code class="language-json5">{
  models: {
    providers: {
      moonshot: {
        baseUrl: &quot;https://api.moonshot.ai/v1&quot;,
        auth: &quot;api-key&quot;,
        apiKey: &quot;${MOONSHOT_API_KEY}&quot;,
        api: &quot;openai-responses&quot;,
        models: [
          { id: &quot;kimi-k2.5&quot;, name: &quot;Kimi K2.5&quot; }
        ]
      }
    }
  },
  agents: {
    defaults: {
      model: {
        primary: &quot;moonshot/kimi-k2.5&quot;,
        fallbacks: [
          &quot;anthropic/claude-sonnet-4-5&quot;,
          &quot;openai/gpt-5.2&quot;
        ]
      }
    }
  }
}
</code></pre>
<p>Docker 里访问宿主机 Ollama / LM Studio：</p>
<pre><code class="language-text">http://host.docker.internal:11434
http://host.docker.internal:1234
</code></pre>
<p>宿主机模型服务要监听 <code>0.0.0.0</code>，不是只监听 <code>127.0.0.1</code>。</p>
<hr>
<h2>7. 聊天渠道</h2>
<p>官方 README 列出的渠道包括 WhatsApp、Telegram、Slack、Discord、Google Chat、Signal、iMessage、IRC、Teams、Matrix、飞书 / Lark、LINE、Mattermost、Nextcloud Talk、Nostr、Synology Chat、Twitch、Zalo、WeChat、QQ、WebChat 等。</p>
<p>安全默认：</p>
<ul>
<li>私信默认 pairing：陌生人先收到配对码，批准后才处理消息</li>
<li>群聊默认建议 require mention</li>
<li>不要把 <code>dmPolicy</code> 改成 <code>open</code> 后再放开 <code>&quot;*&quot;</code>，除非你非常明确风险</li>
</ul>
<p>批准配对：</p>
<pre><code class="language-bash">openclaw pairing approve &lt;channel&gt; &lt;code&gt;
</code></pre>
<h3>7.1 WhatsApp / Telegram</h3>
<p>WhatsApp 扫码：</p>
<pre><code class="language-bash">openclaw channels login
</code></pre>
<p>Telegram：</p>
<pre><code class="language-bash">openclaw channels add --channel telegram --token &quot;&lt;bot-token&gt;&quot;
openclaw gateway restart
</code></pre>
<h3>7.2 飞书 / Lark</h3>
<p>官方 Feishu/Lark 渠道默认事件传输是 <code>websocket</code>，<code>webhook</code> 为可选模式。WebSocket 长连接不需要公网回调 URL，更适合个人服务器。</p>
<p>最短流程：</p>
<pre><code class="language-bash">openclaw channels add
openclaw gateway restart
</code></pre>
<p>选择 Feishu 后填入 App ID / App Secret。飞书开放平台需要启用 Bot 能力、导入权限、事件订阅选择长连接，并添加 <code>im.message.receive_v1</code>。</p>
<p>手动配置结构：</p>
<pre><code class="language-json5">{
  channels: {
    feishu: {
      enabled: true,
      domain: &quot;feishu&quot;,
      dmPolicy: &quot;pairing&quot;,
      groupPolicy: &quot;allowlist&quot;,
      groupAllowFrom: [&quot;oc_xxx&quot;],
      requireMention: true,
      accounts: {
        main: {
          appId: &quot;cli_xxx&quot;,
          appSecret: &quot;${FEISHU_APP_SECRET}&quot;,
          name: &quot;My AI assistant&quot;
        }
      }
    }
  }
}
</code></pre>
<p>说明：</p>
<ul>
<li><code>domain: &quot;feishu&quot;</code> 用国内飞书，<code>&quot;lark&quot;</code> 用国际版</li>
<li>group ID 通常形如 <code>oc_xxx</code></li>
<li>私聊默认 pairing；allowlist 模式下用 open_id，通常形如 <code>ou_xxx</code></li>
<li>支持文本、图片、文件、音频、视频 / media、交互卡片</li>
</ul>
<hr>
<h2>8. 核心功能</h2>
<h3>8.1 Gateway</h3>
<p>Gateway 是 OpenClaw 的常驻控制平面，负责 channels、nodes、sessions、hooks、tools 和 WebChat。默认要求配置中存在：</p>
<pre><code class="language-json5">{
  gateway: {
    mode: &quot;local&quot;
  }
}
</code></pre>
<p>如果缺少该项，Gateway 会拒绝启动；临时调试可用 <code>--allow-unconfigured</code>，但不要把它当成生产配置。</p>
<p>绑定与认证：</p>
<ul>
<li><code>loopback</code>：只允许本机访问，适合 SSH 隧道</li>
<li><code>tailnet</code>：通过 Tailscale 访问，优先于直接开 LAN</li>
<li><code>lan</code>：局域网访问，必须配 token / 反代认证 / 防火墙</li>
<li>非 loopback 绑定不要关闭认证</li>
</ul>
<p>服务管理：</p>
<pre><code class="language-bash">openclaw gateway install
openclaw gateway start
openclaw gateway restart
openclaw gateway stop
openclaw gateway uninstall
</code></pre>
<p>Tailscale：</p>
<pre><code class="language-json5">{
  gateway: {
    tailscale: {
      mode: &quot;serve&quot;
    }
  }
}
</code></pre>
<p><code>serve</code> 只暴露到 tailnet；<code>funnel</code> 是公网入口，默认不建议。</p>
<h3>8.2 Memory</h3>
<p>OpenClaw 的记忆不是黑盒数据库，而是工作区内可编辑的 Markdown：</p>
<pre><code class="language-text">MEMORY.md
memory/**/*.md
</code></pre>
<p>常用命令：</p>
<pre><code class="language-bash">openclaw memory status
openclaw memory status --deep
openclaw memory index --verbose
openclaw memory search &quot;release checklist&quot;
</code></pre>
<p>关键行为：</p>
<ul>
<li>默认会索引 <code>MEMORY.md</code>、<code>memory/**/*.md</code></li>
<li>可用 <code>memorySearch.extraPaths</code> 加入额外路径</li>
<li><code>memory_search</code> 返回片段、路径、行号和分数；完整上下文再用 <code>memory_get</code></li>
<li>direct chat 默认展示引用；group / channel 默认可能不展示 source 行号</li>
<li>OAuth 不等于 embedding key；记忆检索需要单独可用的 embedding provider</li>
</ul>
<p>provider 自动选择逻辑：先看本地模型，再看 OpenAI key，再看 Gemini key；都不可用则 memory search disabled。</p>
<p>OpenAI-compatible embedding 示例：</p>
<pre><code class="language-json5">{
  agents: {
    defaults: {
      memorySearch: {
        provider: &quot;openai&quot;,
        model: &quot;text-embedding-3-small&quot;,
        remote: {
          baseUrl: &quot;https://api.example.com/v1/&quot;,
          apiKey: &quot;${OPENAI_COMPAT_API_KEY}&quot;
        },
        sync: {
          watch: true
        }
      }
    }
  }
}
</code></pre>
<p>本地 embedding 示例：</p>
<pre><code class="language-json5">{
  agents: {
    defaults: {
      memorySearch: {
        provider: &quot;local&quot;,
        fallback: &quot;none&quot;,
        local: {
          modelPath: &quot;hf:ggml-org/embeddinggemma-300M-GGUF/embeddinggemma-300M-Q8_0.gguf&quot;
        }
      }
    }
  }
}
</code></pre>
<h3>8.3 Multi-Agent</h3>
<p>多身份、多工作区、多渠道路由时，核心是：</p>
<ul>
<li><code>agents.defaults</code>：默认 agent 设置</li>
<li><code>agents.list[]</code>：多个 agent，每个可有独立 workspace、model、tools、sandbox</li>
<li><code>bindings</code>：把不同渠道、账号、会话路由到不同 agent</li>
</ul>
<p>新增隔离 agent：</p>
<pre><code class="language-bash">openclaw agents add work
</code></pre>
<p>新 agent 会有独立工作区、会话和认证配置；不要把多个身份直接混在一个 workspace。</p>
<h3>8.4 Skills / Tools</h3>
<p>OpenClaw 支持 bundled / managed / workspace skills。工具权限用 profile、allow、deny 控制：</p>
<pre><code class="language-json5">{
  agents: {
    defaults: {
      tools: {
        profile: &quot;messaging&quot;,
        deny: [&quot;browser&quot;, &quot;canvas&quot;]
      }
    }
  }
}
</code></pre>
<p>暴露到群聊或多人渠道时，不要使用无边界的 <code>full</code> profile。</p>
<p>补充规则：</p>
<ul>
<li><code>allow</code> / <code>deny</code> 是显式白名单 / 黑名单</li>
<li><code>alsoAllow</code> 用于在 profile 基础上增量放行</li>
<li>同一作用域不要同时写 <code>allow</code> 和 <code>alsoAllow</code></li>
<li><code>whatsapp_login</code>、<code>cron</code>、<code>gateway</code> 等高危工具通常应只允许 owner 使用</li>
<li>开自动化前建议启用 <code>tools.loopDetection</code>，避免重复工具调用无进展</li>
</ul>
<p>高危执行权限建议按触发者收紧：</p>
<pre><code class="language-json5">{
  agents: {
    defaults: {
      tools: {
        elevated: {
          enabled: true,
          allowFrom: {
            telegram: [&quot;123456789&quot;]
          }
        }
      }
    }
  }
}
</code></pre>
<h3>8.5 Sandbox</h3>
<p>OpenClaw 支持把工具执行放进 Docker sandbox。Gateway 仍在主机 / 主容器，工具执行在隔离容器，适合开启执行类工具时降低影响面。</p>
<pre><code class="language-json5">{
  agents: {
    defaults: {
      sandbox: {
        mode: &quot;non-main&quot;,
        docker: {
          image: &quot;openclaw-sandbox:bookworm-slim&quot;,
          network: &quot;none&quot;,
          user: &quot;1000:1000&quot;
        }
      }
    }
  }
}
</code></pre>
<p>常用命令：</p>
<pre><code class="language-bash">openclaw sandbox explain
openclaw sandbox list
openclaw sandbox recreate --all
</code></pre>
<p>安全护栏：</p>
<ul>
<li>Docker sandbox 禁止 <code>network: &quot;host&quot;</code></li>
<li>禁止 <code>seccompProfile: &quot;unconfined&quot;</code> 和 <code>apparmorProfile: &quot;unconfined&quot;</code></li>
<li><code>binds.source</code> 必须是绝对路径</li>
<li>镜像或 sandbox 配置更新后，建议 <code>sandbox recreate --all</code></li>
</ul>
<h3>8.6 Cron / Hooks</h3>
<p>Cron 适合日报、提醒、巡检、项目跟踪：</p>
<pre><code class="language-bash">openclaw cron --help
</code></pre>
<p>常见行为：</p>
<ul>
<li><code>cron add</code> 默认可用 <code>--announce</code> 投递摘要</li>
<li><code>--no-deliver</code> 只内部运行，不投递消息</li>
<li>一次性 <code>--at</code> 任务成功后默认删除；需要保留用 <code>--keep-after-run</code></li>
</ul>
<p>Hooks 适合事件驱动自动化：</p>
<pre><code class="language-bash">openclaw hooks list --verbose
openclaw hooks enable session-memory
</code></pre>
<p>内置 hooks 可直接 enable / disable；插件 hooks 通常显示为 <code>plugin:&lt;id&gt;</code>，由插件启停控制。</p>
<h3>8.7 远程访问</h3>
<p>远程访问优先顺序：</p>
<ol>
<li>Tailscale <code>serve</code></li>
<li>SSH 隧道</li>
<li>带认证的反向代理</li>
</ol>
<p>SSH 隧道示例：</p>
<pre><code class="language-text">Host openclaw-vps
    HostName &lt;REMOTE_IP&gt;
    User &lt;REMOTE_USER&gt;
    LocalForward 18789 127.0.0.1:18789
</code></pre>
<pre><code class="language-bash">ssh -N openclaw-vps
</code></pre>
<p>本机客户端连接 <code>ws://127.0.0.1:18789</code>，并提供同一个 <code>OPENCLAW_GATEWAY_TOKEN</code>。</p>
<hr>
<h2>9. Docker 文件访问与安全</h2>
<p>OpenClaw Docker 容器只能访问容器内文件和显式挂载目录。要让 agent 管理宿主机项目，在 compose 中额外挂载：</p>
<pre><code class="language-yaml">volumes:
    - ./config:/home/node/.openclaw
    - ./workspace:/home/node/.openclaw/workspace
    - /opt/projects:/workspace/projects
</code></pre>
<p>安全规则：</p>
<ul>
<li>Gateway 优先绑定 <code>127.0.0.1</code> 或只通过 1Panel / Nginx 反代访问</li>
<li><code>OPENCLAW_GATEWAY_TOKEN</code> 使用强随机字符串</li>
<li>不直接公网暴露 <code>18789</code></li>
<li>不挂载宿主机根目录</li>
<li>secrets 目录不要默认交给 agent</li>
<li>群聊和陌生私信保持 pairing / allowlist</li>
<li>非 main 会话建议启用 sandbox：<code>agents.defaults.sandbox.mode: &quot;non-main&quot;</code></li>
<li>Docker 默认用户是 <code>node</code>，uid 通常为 <code>1000</code>；权限错误时优先修正挂载目录所有权</li>
</ul>
<hr>
<h2>10. 排错</h2>
<h3>10.1 Gateway 起不来</h3>
<p>确认配置里有：</p>
<pre><code class="language-json5">{
  gateway: {
    mode: &quot;local&quot;,
    bind: &quot;lan&quot;
  }
}
</code></pre>
<p>Docker 里修复：</p>
<pre><code class="language-bash">docker compose run --rm openclaw-cli config set --batch-json '[{&quot;path&quot;:&quot;gateway.mode&quot;,&quot;value&quot;:&quot;local&quot;},{&quot;path&quot;:&quot;gateway.bind&quot;,&quot;value&quot;:&quot;lan&quot;}]'
docker compose up -d
</code></pre>
<h3>10.2 Control UI 访问不了</h3>
<p>确认容器健康：</p>
<pre><code class="language-bash">docker compose logs -f openclaw-gateway
curl http://127.0.0.1:18789/healthz
</code></pre>
<p>如果需要重新拿 dashboard URL：</p>
<pre><code class="language-bash">docker compose run --rm openclaw-cli dashboard --no-open
</code></pre>
<h3>10.3 记忆检索不可用</h3>
<pre><code class="language-bash">openclaw memory status --deep
</code></pre>
<p>OAuth 不一定覆盖 embedding；按 <code>memorySearch.provider</code> 配齐 OpenAI / Gemini / local / voyage / mistral 等 embedding provider。</p>
<h3>10.4 Docker 权限问题</h3>
<p>官方镜像默认用 uid <code>1000</code>：</p>
<pre><code class="language-bash">sudo chown -R 1000:1000 ./config ./workspace
</code></pre>
<h3>10.5 飞书消息不响应</h3>
<p>确认：</p>
<pre><code class="language-bash">openclaw --version
openclaw gateway status
openclaw logs --follow
</code></pre>
<p>再检查 <code>dmPolicy</code>、<code>allowFrom</code>、<code>groupPolicy</code>、<code>groupAllowFrom</code>、<code>requireMention</code>。群聊默认不要取消 mention 门控。</p>
]]></content:encoded>
    </item>
    <item>
      <title>只说一句话</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/prompts/%E5%8F%AA%E8%AF%B4%E4%B8%80%E5%8F%A5%E8%AF%9D</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/prompts/%E5%8F%AA%E8%AF%B4%E4%B8%80%E5%8F%A5%E8%AF%9D</guid>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1>只说一句话</h1>
<hr>
<h2>学习</h2>
<h3>1</h3>
<pre><code>生成10个问题，能区分出真正理解这个领域的人和只是背了知识点的人
</code></pre>
<pre><code>生成十问，以辨真知于此领域者，抑或仅诵知识点者
</code></pre>
<pre><code>Generate 10 questions that will differentiate between someone who really understands the field and someone who has just memorized the knowledge
</code></pre>
<h3>2</h3>
<pre><code>我每答错一个问题就告知为什么错了，遗漏了什么
</code></pre>
<pre><code>每错一问便告吾其故，有何所失。
</code></pre>
<pre><code>For every question I got wrong, I was told why I got it wrong and what I missed.
</code></pre>
<h2>润色</h2>
<h3>1</h3>
<pre><code>精简那些啰嗦重复、没有蕴含任何多余信息的废话，请始终保持语言的精炼，但是不能降低信息熵
</code></pre>
<pre><code>简去赘辞复语，去除无益之言，务使辞约而意赅，然信息之丰，不可损也。
</code></pre>
<pre><code>Streamline the verbose and repetitive nonsense that doesn't contain any extra information, and please always keep the language concise, but not reduce the information entropy
</code></pre>
<h3>2</h3>
<pre><code>全文通查一遍，减少一些AI味，但是不能降低信息熵
</code></pre>
<pre><code>通览全文，稍減机巧之气，然信息之丰，不可损也。
</code></pre>
<pre><code>Checking through the whole text once reduces some of the AI flavor, but does not reduce the information entropy
</code></pre>
<h3>3</h3>
<pre><code>为了避免出现错写漏写，你每次添加引理、定理、定义之前都必须阅读原始文献，使之较原始文献一字不差
</code></pre>
<pre><code>欲免误书漏录，凡增引理、定理、定义之前，必先读原文，务使与原文毫厘不差。
</code></pre>
<pre><code>In order to avoid misspellings and omissions, you must read the original literature every time before you add a quotation, theorem, or definition so that it is word-for-word better than the original literature
</code></pre>
<h2>审查</h2>
<h3>1</h3>
<pre><code>以完美主义者的视角来为我的当前项目找茬
</code></pre>
<pre><code>以完美主义者之观，审吾当前之业。
</code></pre>
<pre><code>A perfectionist's perspective on finding fault with my current project
</code></pre>
<h3>2</h3>
<pre><code>基于第一性原理来审查我的当前项目
</code></pre>
<pre><code>以第一性原理审吾当前之业
</code></pre>
<pre><code>Reviewing my current project based on first principles
</code></pre>
<h2>清理</h2>
<h3>1</h3>
<pre><code>你只做检查和规划，告诉我需要删除的多余文件，我来亲自删除
</code></pre>
<pre><code>惟卿但行稽查规划，告我当刪之冗余文件，余将亲刪之。
</code></pre>
<pre><code>You just do the checking and planning, tell me the extra files that need to be removed, and I'll remove them myself
</code></pre>
<h2>循环屎山构建流</h2>
<h3>1</h3>
<p>必须要先完整拟定好一份最终plan,然后可以任意组合循环发出。</p>
<pre><code>Do not deviate from my plan and follow your advice to carry out the next step
</code></pre>
<pre><code>review
</code></pre>
<pre><code>fix bugs you found
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>工程宪法</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/prompts/%E5%B7%A5%E7%A8%8B%E5%AE%AA%E6%B3%95</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/prompts/%E5%B7%A5%E7%A8%8B%E5%AE%AA%E6%B3%95</guid>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1>工程宪法</h1>
<hr>
<h2>0. 适用前提</h2>
<h3>0.1 前提集合</h3>
<p>本宪法建立在以下前提同时成立的条件下：</p>
<ul>
<li>管理员 / USER 具备足够高的系统判断质量</li>
<li>骨架级分析报告具备足够高的事实质量、推理质量与利弊分析质量</li>
<li>骨架级决策以成熟分析为前提，而不以情绪、惯性或短期便利为依据</li>
</ul>
<h3>0.2 适用目标</h3>
<p>本宪法的目标不是弥补低质量判断，而是在高质量判断成立的前提下，约束工程实现对该判断的忠实执行，从而避免以下结果：</p>
<ul>
<li>系统背离本体</li>
<li>骨架被局部功能污染</li>
<li>结构性失稳在实现阶段累积</li>
<li>既有高质量判断在工程演化中被逐步削弱</li>
</ul>
<hr>
<h2>1. 总体约束</h2>
<h3>1.1 总纲</h3>
<p>系统设计满足以下总约束：</p>
<ol>
<li>必须先定义总骨架与边界，再定义模块，再定义实现。</li>
<li>任何局部功能只能填入既定骨架，不得反向塑造骨架。</li>
<li>系统优先保持整体结构长期稳定，而不优先追求局部极致最优。</li>
<li>系统允许模块替换与实现迭代，但不允许日常功能迭代以侵蚀方式改写主骨架。</li>
</ol>
<h3>1.2 固定顺序</h3>
<p>任一设计任务必须严格按以下顺序执行：</p>
<ol>
<li>定义总骨架与边界</li>
<li>列出模块清单</li>
<li>细化实现逻辑</li>
</ol>
<p>禁止跳过前项直接进入后项。</p>
<h3>1.3 骨架约束</h3>
<p>系统演进时必须满足：</p>
<ul>
<li>骨架不因日常功能迭代而重构</li>
<li>模块可替换</li>
<li>实现可迭代</li>
<li>接口尽量稳定</li>
<li>状态模型尽量稳定</li>
<li>数据模型慎改</li>
<li>配置模型早定</li>
</ul>
<h3>1.4 优先级排序</h3>
<p>当多个目标发生冲突时，系统必须按如下严格优先级排序作取舍：</p>
<p>正确性 / 功能实现</p>
<blockquote>
<p>可用性 / 使用体验<br>
根基兼容性<br>
可维护性 / 可诊断性<br>
性能<br>
内存占用<br>
外存占用<br>
其它次级因素（如组件复用、工程复杂度控制等）</p>
</blockquote>
<p>低优先级目标不得破坏高优先级目标。</p>
<h3>1.5 根基兼容性在优先级中的定义</h3>
<p>“根基兼容性”仅指对系统底层、长期稳定且被广泛接受的外部根基生态的兼容能力，以及对若干可能在一至两年内变化的根基外部参数的适应能力，例如：</p>
<ul>
<li>CA 证书体系</li>
<li>系统网络协议</li>
<li>时区配置</li>
<li>Git 生态</li>
<li>编程语言生态及其长期约定</li>
</ul>
<h3>1.6 示例：RSS 阅读器</h3>
<p>对一个纯人类阅读向 RSS 阅读器，即使首版只实现“添加订阅源并阅读文章”，在进入页面与功能实现前，仍必须先确定：</p>
<ul>
<li>订阅源模型</li>
<li>文章模型</li>
<li>阅读状态模型</li>
<li>呈现层与抓取 / 存储的解耦关系</li>
<li>同步与导入导出的骨架挂接方式</li>
</ul>
<p>否则后续“分类、收藏、OPML、全文缓存、云同步”等能力将倾向于以局部补丁方式侵入系统。</p>
<hr>
<h2>2. 元约束</h2>
<h3>2.1 完美主义约束</h3>
<p>系统设计必须以完美主义作为持续自我审查标准，但不得以追求绝对完美为理由：</p>
<ul>
<li>破坏骨架稳定</li>
<li>延迟必要落地</li>
<li>引入无上限复杂化</li>
</ul>
<h3>2.2 完美主义的作用</h3>
<p>完美主义在本宪法中的作用不是驱动系统无限膨胀，而是持续检验以下条件是否仍成立：</p>
<ul>
<li>边界是否干净</li>
<li>抽象是否稳定</li>
<li>实现是否统一</li>
<li>替换点是否明确</li>
<li>失败路径是否完整</li>
<li>当前方案是否忠于系统本体</li>
</ul>
<h3>2.3 结论</h3>
<p>完美主义在工程中的合法形式是：</p>
<ul>
<li>严格约束</li>
<li>持续审查</li>
<li>持续收敛</li>
</ul>
<p>而不是：</p>
<ul>
<li>失控扩张</li>
<li>过度设计</li>
<li>无限推迟实现</li>
</ul>
<hr>
<h2>3. 骨架构造约束</h2>
<h3>3.1 根基兼容性原则</h3>
<p>对于已经形成长期稳定生态、并在系统底层被反复验证数十年的标准、协议、接口习惯、工程范式与工具生态，系统应优先兼容与接入，而不是重复造轮子。</p>
<h3>3.2 根基对象的判定条件</h3>
<p>一个外部生态仅当同时满足以下多数条件时，才应被视为“根基对象”：</p>
<ul>
<li>长期存在</li>
<li>底层基础</li>
<li>大规模接受</li>
<li>稳定运转</li>
<li>工程上具有历史沉淀</li>
</ul>
<h3>3.3 兼容与内生化规则</h3>
<ul>
<li>对根基对象：优先兼容，不轻易重造</li>
<li>对尚未形成长期生态、实现简单、替代成本低的能力：优先内嵌、重构或借鉴后纳入自身系统，不依赖外部兼容</li>
</ul>
<h3>3.4 值得兼容对象的判定条件</h3>
<p>下列特征越多，越应兼容：</p>
<ul>
<li>长期稳定</li>
<li>基础性强</li>
<li>行业共识强</li>
<li>自建收益低</li>
<li>自建维护成本高</li>
<li>脱离它会损失通用性与生存能力</li>
</ul>
<h3>3.5 不值得兼容对象的判定条件</h3>
<p>下列特征越多，越不应兼容：</p>
<ul>
<li>仍在快速变化</li>
<li>实现简单</li>
<li>没有形成深度行业共识</li>
<li>未来失效概率高</li>
<li>接入收益小于绑定风险</li>
</ul>
<h3>3.6 工程实现约束</h3>
<p>所有外部环境依赖必须通过兼容层或适配层进入系统。<br>
核心逻辑不得直接绑定环境细节。</p>
<hr>
<h3>3.7 简洁、有力、整洁、统一原则</h3>
<p>系统骨架只围绕其本体所必需的核心对象、核心关系与高概率能力轴建立。<br>
首版可以只实现其中一部分，但骨架不得被首版功能误导，也不得为异质能力提前膨胀。</p>
<h3>3.8 本体优先规则</h3>
<p>系统定义应围绕本体对象、核心关系和能力轴，而不是围绕首个实现版本的功能清单。<br>
首版功能仅决定实现顺序，不定义系统本体。</p>
<h3>3.9 抽象规则</h3>
<p>抽象只能建立在长期稳定的本体对象、关系与能力边界上，不得建立在以下对象上：</p>
<ul>
<li>首版实现</li>
<li>具体格式</li>
<li>局部技术细节</li>
</ul>
<h3>3.10 平级实现规则</h3>
<p>属于同一变化族的具体实现，必须位于同一抽象之下，并以平级模块形式存在。<br>
新增支持应优先表现为新增模块，而不是侵入既有主流程。</p>
<h3>3.11 替代规则</h3>
<p>系统优先支持模块替代，而不是流程改写。<br>
实现应当可换，主干不应持续长出局部特判。</p>
<h3>3.12 插件规则</h3>
<p>插件机制不是架构起点，而是平级实现数量与替换需求增长后的自然承载形式。</p>
<h3>3.13 能力纳入主骨架的三层判定</h3>
<p>某能力进入主骨架，当且仅当其同时满足以下判定逻辑：</p>
<ol>
<li><strong>本体必要性判定</strong>：该能力直接服务于系统核心存在目的，或与之高度相关</li>
<li><strong>同域延伸性判定</strong>：该能力属于同一问题域内自然延伸</li>
<li><strong>异质侵入性判定</strong>：该能力不会引入一整套新的系统本体、依赖模型与复杂性，从而改变系统性质</li>
</ol>
<p>若第三项不成立，则该能力不得进入主骨架。</p>
<h3>3.14 统一性规则</h3>
<p>系统允许复杂，但复杂必须以统一形式出现。<br>
统一性至少体现在：</p>
<ul>
<li>相同职责使用相同层级表达</li>
<li>相同错误使用相同错误模型表达</li>
<li>相同输入输出使用相同数据模型表达</li>
<li>相同配置项使用相同命名规范表达</li>
<li>相同模块使用相同目录结构表达</li>
<li>相同异步任务使用相同调度接口表达</li>
</ul>
<h3>3.15 示例：RSS 阅读器</h3>
<p>对纯人类阅读向 RSS 阅读器，其本体对象不是“RSS 拉取页面”或“首版文章展示功能”，而是：</p>
<ul>
<li>订阅源</li>
<li>文章</li>
<li>阅读过程</li>
<li>阅读状态</li>
<li>内容来源</li>
<li>内容解析</li>
<li>内容呈现</li>
<li>内容组织</li>
</ul>
<p>因此，“多订阅分组、分类、书签、检索、全文缓存、云同步”属于同域延伸；“AI 分析、AI 问答、TTS、社交分享”若改变系统性质，则不应纳入主骨架。</p>
<hr>
<h2>4. 工程蓝图约束</h2>
<h3>4.1 蓝图要求</h3>
<p>任何架构输出都必须向下细化到实现逻辑，不允许停留在概念层。</p>
<h3>4.2 最低完备项</h3>
<p>一个可施工的工程蓝图至少必须明确以下内容：</p>
<ul>
<li>模块职责</li>
<li>调用关系</li>
<li>输入输出</li>
<li>状态变化</li>
<li>错误处理</li>
<li>配置入口</li>
<li>生命周期</li>
<li>扩展点</li>
<li>替换点</li>
<li>性能关键路径</li>
</ul>
<h3>4.3 判定规则</h3>
<p>若一个方案只能说明系统大致分层、模块大致存在、目标大致正确，而不能继续下钻到具体调用逻辑与运行过程，则该方案只构成概念草图，不构成工程蓝图。</p>
<h3>4.4 一致性要求</h3>
<p>高层骨架、模块边界与实现逻辑之间必须连续。<br>
不允许出现：</p>
<ul>
<li>上层抽象与下层实现脱节</li>
<li>实现阶段临时发明破坏骨架的新结构</li>
</ul>
<h3>4.5 示例：RSS 阅读器</h3>
<p>对“刷新订阅源”这一流程，工程蓝图必须能回答：</p>
<ul>
<li>输入是什么</li>
<li>输出是什么</li>
<li>订阅源状态如何变化</li>
<li>新增文章数如何计算</li>
<li>网络失败、源格式异常、存储失败如何传播</li>
<li>抓取间隔、重试次数、超时时间如何进入配置</li>
<li>解析器、网络层、存储层分别从哪里替换</li>
<li>性能关键路径位于何处</li>
</ul>
<hr>
<h2>5. 默认分层模型</h2>
<h3>5.1 四层架构 + 对象层</h3>
<p>系统推荐采用“四层架构 + 对象层”的组织方式，并坚持壳核分离。</p>
<h3>5.2 第一层：交互壳层</h3>
<p>职责集合：</p>
<ul>
<li>CLI / GUI / Web 界面</li>
<li>动画、样式、按钮、输入控件</li>
<li>平台适配</li>
<li>用户动作捕获</li>
<li>标准指令转译</li>
</ul>
<p>唯一职责：</p>
<p><strong>转译 + 呈现</strong></p>
<h3>5.3 第二层：指令接口层</h3>
<p>职责集合：</p>
<ul>
<li>接收标准化指令</li>
<li>校验合法性</li>
<li>识别状态变化</li>
<li>决定需要调用的能力</li>
<li>组织返回给交互层的结果结构</li>
</ul>
<p>其映射关系定义为：</p>
<ul>
<li>action → intent</li>
<li>intent → state delta</li>
<li>state delta → capability requests</li>
</ul>
<h3>5.4 第三层：流程协调层</h3>
<p>职责集合：</p>
<ul>
<li>任务拆分</li>
<li>调用顺序规划</li>
<li>前后依赖协调</li>
<li>状态推进</li>
<li>错误回滚或异常中止</li>
<li>后方任务分发</li>
</ul>
<p>第三层不直接接触第五层对象。</p>
<h3>5.5 第四层：能力执行层</h3>
<p>职责集合：</p>
<ul>
<li>数据计算</li>
<li>存储</li>
<li>读取</li>
<li>网络通信</li>
<li>文件系统操作</li>
<li>外部系统调用</li>
<li>后台处理</li>
<li>具体算法执行</li>
</ul>
<h3>5.6 第五层：对象层</h3>
<p>对象层不属于骨架分层本身，但必须明确。<br>
其作用是定义系统中实际操作的最小数据元对象。</p>
<p>典型对象形式包括：</p>
<ul>
<li><code>.md</code></li>
<li><code>.pdf</code></li>
<li><code>.jpg</code></li>
<li><code>text::line</code></li>
<li><code>text::byte</code></li>
<li><code>sql::article</code></li>
<li><code>sql::feed</code></li>
<li><code>data::html</code></li>
<li><code>data::xml</code></li>
<li><code>data::opml</code></li>
</ul>
<h3>5.7 表现变化与业务变化分离规则</h3>
<p>界面变化不天然等于业务状态变化。<br>
只有在进入内部指令系统后，系统才判断哪些变化属于业务变化，哪些仅属于表现层变化。</p>
<h3>5.8 示例：RSS 阅读器</h3>
<p>当用户点击“打开某篇文章”时：</p>
<ul>
<li>第一层只表达“打开文章”</li>
<li>第二层判断这是否涉及文章切换、已读状态更新、正文请求等状态变化</li>
<li>第三层组织具体流程</li>
<li>第四层执行读取、解析、状态写入</li>
<li>第五层明确所处理的对象是 <code>sql::article</code>、<code>sql::reading_state</code>、<code>data::html</code> 等</li>
</ul>
<hr>
<h2>6. 一致性约束</h2>
<h3>6.1 边界封闭原则</h3>
<p>一旦骨架划分完成，各层与各模块必须严格遵守职责边界。<br>
任何新增功能都只能通过既定边界接入，不允许跨层直连、跨模块写入或绕过统一入口。</p>
<h3>6.2 单一真相源原则</h3>
<p>对任何核心对象、核心状态与核心配置，系统必须明确唯一可信来源。<br>
同一事实不得在多个模块、多个缓存层、多个界面状态中并列作为最终依据。</p>
<h3>6.3 示例：RSS 阅读器</h3>
<p>文章“已读 / 未读”状态只能由统一的阅读状态模型作为真相源。<br>
界面组件可以缓存显示结果，但不得与数据库状态并列为最终依据。</p>
<hr>
<h2>7. 运行可靠性约束</h2>
<h3>7.1 失败—观测—验证机制</h3>
<h4>7.1.1 失败优先定义原则</h4>
<p>系统设计时，不能只定义成功路径，还必须优先定义失败路径。<br>
任何核心流程在进入实现前，都必须明确：</p>
<ul>
<li>失败条件</li>
<li>失败传播方式</li>
<li>回退策略</li>
<li>重试边界</li>
<li>用户可见结果</li>
</ul>
<h4>7.1.2 可观测性内建原则</h4>
<p>日志、错误码、状态追踪、关键事件记录与性能指标采集，必须作为架构内建能力进入骨架。<br>
不能依赖事后补日志。</p>
<h4>7.1.3 验证先行原则</h4>
<p>任何核心骨架、核心流程、核心边界在进入大规模实现前，都必须有对应验证方式。<br>
若一个原则无法被验证，则该原则在实现中极易失效。</p>
<h3>7.2 版本与迁移原则</h3>
<p>任何核心接口、核心数据模型、核心配置模型一旦变化，都必须回答：</p>
<ul>
<li>旧版本如何兼容</li>
<li>现有数据如何迁移</li>
<li>失败后如何回退</li>
</ul>
<p>凡沉淀到磁盘、数据库、缓存、同步链路或导入导出格式中的结构，都负有版本责任。</p>
<h3>7.3 幂等与重复执行原则</h3>
<p>任何可能被重复触发、重复调用、重复投递、重复恢复执行的核心流程，都必须具备幂等性或显式去重机制。</p>
<h3>7.4 并发与时序一致性原则</h3>
<p>任何核心状态在被多个流程同时读取、修改、同步或回写时，都必须明确：</p>
<ul>
<li>谁先</li>
<li>谁后</li>
<li>谁覆盖谁</li>
<li>冲突如何解决</li>
</ul>
<h3>7.5 示例：RSS 阅读器</h3>
<p>对“刷新订阅源”流程，系统必须同时定义：</p>
<ul>
<li>抓取成功路径</li>
<li>网络失败、解析失败、部分写入失败路径</li>
<li>关键状态是否可追踪</li>
<li>同一文章是否会重复入库</li>
<li>已读状态是否会被刷新或同步错误覆盖</li>
<li>批量刷新时的性能瓶颈位置</li>
</ul>
<hr>
<h2>8. 运行裁量约束</h2>
<h3>8.1 默认保守原则</h3>
<p>在信息不足或不确定性较高时，系统默认选择更保守、更稳定、更容易回退的方案，而不是更激进、更复杂、耦合更深的方案。</p>
<h3>8.2 退出与删除原则</h3>
<p>系统不仅要定义对象如何产生和增长，也必须定义对象如何停用、删除、迁移、失效和清理。<br>
任何可被创建的核心对象，都必须有清晰退出路径。</p>
<hr>
<h2>9. 启动约束</h2>
<h3>9.1 实现最低原则</h3>
<p>系统不得在草案尚未达到最低成熟度之前进入正式动工阶段。<br>
任何实现都必须建立在最低限度分析与骨架确认已经完成的前提下。</p>
<h3>9.2 最低成熟条件</h3>
<p>进入实现阶段的最低条件是：</p>
<ul>
<li>系统本体已得到基本澄清</li>
<li>主骨架与主边界已得到初步确认</li>
<li>明显错误方向与异质能力已完成初步排除</li>
<li>首版目标与主闭环已明确</li>
<li>当前实现不会直接污染未来主干</li>
</ul>
<h3>9.3 探索性实现的限制</h3>
<p>探索性验证可以存在，但不得：</p>
<ul>
<li>伪装为正式骨架实现</li>
<li>未经收敛直接沉淀为长期主干</li>
</ul>
<hr>
<h2>10. 纠偏与治理约束</h2>
<h3>10.1 证伪—纠偏—审批机制</h3>
<h4>10.1.1 证伪即退出原则</h4>
<p>任何方向、能力轴、抽象、边界划分或骨架判断，一旦经分析被认定为错误、失效或已被证伪，就必须立即退出。<br>
不得因沉没成本、既有投入、历史惯性或实现便利而继续占据主骨架。</p>
<h4>10.1.2 骨架即时纠偏原则</h4>
<p>系统在任何阶段都不承认“骨架一旦形成便不得修正”。<br>
只要管理员 / USER 经分析认定某一方向错误、某一骨架判断被证伪，或某一骨架存在明显不完善漏洞，就必须立即进入骨架纠偏流程。</p>
<p>这里的“立即”定义为：立即启动分析、审查与决策流程，而不是绕过审查直接改动主骨架。</p>
<h4>10.1.3 骨架变更审批原则</h4>
<p>任何骨架级变更都必须先提交具体分析报告，并由管理员 / USER 阅读后明确批准，方可执行。<br>
未经审批，不得擅自修改：</p>
<ul>
<li>主骨架</li>
<li>核心边界</li>
<li>核心对象关系</li>
<li>主能力轴</li>
<li>关键接口结构</li>
</ul>
<p>骨架变更分析报告至少必须包含：</p>
<ul>
<li>变更原因</li>
<li>当前骨架存在的问题或已被证伪之处</li>
<li>变更后可获得的收益</li>
<li>变更后新增的风险与代价</li>
<li>对既有模块、状态模型、数据模型、配置模型的影响</li>
<li>是否涉及迁移、兼容、回退与验证</li>
<li>若不变更，会持续产生什么后果</li>
</ul>
<h3>10.2 决策复核与反证原则</h3>
<p>任何管理员 / USER 的骨架级判断、方向性判断或变更性判断，都不因其审批地位而自动免于复核。<br>
只要存在充分理由认为该判断可能失误、偏颇、证据不足或忽略了关键代价，就必须提交高质量、客观、完整的复核分析报告，对该判断进行反证性审查。</p>
<p>复核分析报告至少必须包含：</p>
<ul>
<li>当前判断成立的依据</li>
<li>当前判断可能忽略的问题</li>
<li>若维持原判断，可获得的收益</li>
<li>若维持原判断，可能承受的风险与代价</li>
<li>若修正原判断，可获得的收益</li>
<li>若修正原判断，可能引入的新问题</li>
<li>当前争议究竟属于实现问题、模块问题、边界问题还是骨架问题</li>
</ul>
<p>复核的目的不是削弱管理员 / USER 的决策权，而是保证骨架级决策始终接受高质量反证与双面分析，从而持续逼近更高质量的系统判断。</p>
<hr>
<h2>11. 附录约定</h2>
<h3>11.1 实例附录</h3>
<p>正文中仅保留最小必要实例。<br>
更详细的 RSS 阅读器映射说明应移入附录单独维护。</p>
]]></content:encoded>
    </item>
    <item>
      <title>hermes-agent</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/hermes-agent</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/hermes-agent</guid>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
    <description>Github Repo Hermes Agent Github Repo https://github.com/NousResearch/hermes-agent docker-compose env 不要直接把 9119 / 8642 暴露到公网，建议 HOST IP=127.0.0.1 后再通过 1Panel 反代访问。 如果想要让Hermes管理更多文件夹/文件，就用volumes挂载进容器</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/NousResearch/hermes-agent">Hermes Agent Github Repo</a></p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">networks:
    1panel-network:
        external: true

services:
    hermes:
        container_name: hermes-agent
        image: nousresearch/hermes-agent:latest
        restart: unless-stopped
        command: [&quot;gateway&quot;, &quot;run&quot;]
        env_file:
            - .env
        environment:
            - TZ=${TIME_ZONE}
            - HERMES_UID=${HERMES_UID}
            - HERMES_GID=${HERMES_GID}
            - HERMES_DASHBOARD=${HERMES_DASHBOARD}
            - HERMES_DASHBOARD_HOST=${HERMES_DASHBOARD_HOST}
            - HERMES_DASHBOARD_PORT=${HERMES_DASHBOARD_PORT}
            - HERMES_DASHBOARD_TUI=${HERMES_DASHBOARD_TUI}
            - HERMES_INFERENCE_PROVIDER=${HERMES_INFERENCE_PROVIDER}
            - API_SERVER_ENABLED=${API_SERVER_ENABLED}
            - API_SERVER_HOST=${API_SERVER_HOST}
            - API_SERVER_KEY=${API_SERVER_KEY}
            - API_SERVER_CORS_ORIGINS=${API_SERVER_CORS_ORIGINS}
            - OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
            - OPENAI_API_KEY=${OPENAI_API_KEY}
            - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
            - GOOGLE_API_KEY=${GOOGLE_API_KEY}
            - GEMINI_API_KEY=${GEMINI_API_KEY}
            - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
            - TAVILY_API_KEY=${TAVILY_API_KEY}
            - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
            - TELEGRAM_ALLOWED_USERS=${TELEGRAM_ALLOWED_USERS}
        labels:
            createdBy: Apps
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${HERMES_API_HOST_PORT}:8642
            - ${HOST_IP}:${HERMES_DASHBOARD_HOST_PORT}:9119
        volumes:
            - ./data:/opt/data
        shm_size: 1g
        healthcheck:
            test: [&quot;CMD&quot;, &quot;python3&quot;, &quot;-c&quot;, &quot;import urllib.request; urllib.request.urlopen('http://127.0.0.1:8642/health', timeout=3)&quot;]
            interval: 30s
            timeout: 5s
            start_period: 20s
            retries: 3
</code></pre>
<h2>env</h2>
<pre><code>TIME_ZONE=Asia/Shanghai
HOST_IP=127.0.0.1

HERMES_API_HOST_PORT=8642
HERMES_DASHBOARD_HOST_PORT=9119

HERMES_UID=10000
HERMES_GID=10000

HERMES_DASHBOARD=1
HERMES_DASHBOARD_HOST=0.0.0.0
HERMES_DASHBOARD_PORT=9119
HERMES_DASHBOARD_TUI=1
HERMES_INFERENCE_PROVIDER=deepseek

API_SERVER_ENABLED=true
API_SERVER_HOST=0.0.0.0
API_SERVER_KEY=换成至少8位以上的强随机字符串
API_SERVER_CORS_ORIGINS=*

# 模型服务 Key：至少填一个
OPENROUTER_API_KEY=
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
GOOGLE_API_KEY=
GEMINI_API_KEY=
DEEPSEEK_API_KEY=

# Web-Search Key
TAVILY_API_KEY=

# Telegram，可选
TELEGRAM_BOT_TOKEN=
# 直接搜索 @userinfobot 查询
TELEGRAM_ALLOWED_USERS=
</code></pre>
<p><strong>不要直接把 9119 / 8642 暴露到公网，建议 <code>HOST_IP=127.0.0.1</code> 后再通过 1Panel 反代访问。</strong></p>
<p><strong>如果想要让Hermes管理更多文件夹/文件，就用volumes挂载进容器</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>openclaw</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/openclaw</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/openclaw</guid>
    <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
    <description>Github Repo OpenClaw Github Repo https://github.com/openclaw/openclaw docker-compose env 初始化 首次启动前，先生成 token： 然后执行 onboarding： 后台启动后，日常命令通过 openclaw-cli 执行： 不要直接把 18789 暴露到公网，建议 HOST IP=127.0.0.1 后再通过 1Panel 反代访问。 如果想让 OpenClaw 管理更多文件夹/文件，就</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/openclaw/openclaw">OpenClaw Github Repo</a></p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">networks:
    1panel-network:
        external: true

services:
    openclaw-gateway:
        container_name: openclaw-gateway
        image: ${OPENCLAW_IMAGE}
        restart: unless-stopped
        init: true
        env_file:
            - .env
        environment:
            HOME: /home/node
            TERM: xterm-256color
            TZ: ${TIME_ZONE}
            OPENCLAW_CONFIG_DIR: /home/node/.openclaw
            OPENCLAW_WORKSPACE_DIR: /home/node/.openclaw/workspace
            OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
            OPENCLAW_ALLOW_INSECURE_PRIVATE_WS: ${OPENCLAW_ALLOW_INSECURE_PRIVATE_WS}
            OPENCLAW_DISABLE_BONJOUR: ${OPENCLAW_DISABLE_BONJOUR}
            OPENAI_API_KEY: ${OPENAI_API_KEY}
            ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
            OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
            GOOGLE_API_KEY: ${GOOGLE_API_KEY}
            GEMINI_API_KEY: ${GEMINI_API_KEY}
            DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY}
        labels:
            createdBy: Apps
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${OPENCLAW_GATEWAY_HOST_PORT}:18789
            - ${HOST_IP}:${OPENCLAW_BRIDGE_HOST_PORT}:18790
        volumes:
            - ./config:/home/node/.openclaw
            - ./workspace:/home/node/.openclaw/workspace
        cap_drop:
            - NET_RAW
            - NET_ADMIN
        security_opt:
            - no-new-privileges:true
        extra_hosts:
            - &quot;host.docker.internal:host-gateway&quot;
        command:
            [
                &quot;node&quot;,
                &quot;dist/index.js&quot;,
                &quot;gateway&quot;,
                &quot;--bind&quot;,
                &quot;${OPENCLAW_GATEWAY_BIND}&quot;,
                &quot;--port&quot;,
                &quot;18789&quot;,
            ]
        healthcheck:
            test: [&quot;CMD&quot;, &quot;node&quot;, &quot;-e&quot;, &quot;fetch('http://127.0.0.1:18789/healthz').then((r)=&gt;process.exit(r.ok?0:1)).catch(()=&gt;process.exit(1))&quot;]
            interval: 30s
            timeout: 5s
            start_period: 20s
            retries: 5

    openclaw-cli:
        image: ${OPENCLAW_IMAGE}
        env_file:
            - .env
        network_mode: &quot;service:openclaw-gateway&quot;
        init: true
        stdin_open: true
        tty: true
        environment:
            HOME: /home/node
            TERM: xterm-256color
            TZ: ${TIME_ZONE}
            BROWSER: echo
            OPENCLAW_CONFIG_DIR: /home/node/.openclaw
            OPENCLAW_WORKSPACE_DIR: /home/node/.openclaw/workspace
            OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
            OPENCLAW_ALLOW_INSECURE_PRIVATE_WS: ${OPENCLAW_ALLOW_INSECURE_PRIVATE_WS}
            OPENAI_API_KEY: ${OPENAI_API_KEY}
            ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
            OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
            GOOGLE_API_KEY: ${GOOGLE_API_KEY}
            GEMINI_API_KEY: ${GEMINI_API_KEY}
            DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY}
        volumes:
            - ./config:/home/node/.openclaw
            - ./workspace:/home/node/.openclaw/workspace
        cap_drop:
            - NET_RAW
            - NET_ADMIN
        security_opt:
            - no-new-privileges:true
        entrypoint: [&quot;node&quot;, &quot;dist/index.js&quot;]
        depends_on:
            - openclaw-gateway
</code></pre>
<h2>env</h2>
<pre><code class="language-env">TIME_ZONE=Asia/Shanghai
HOST_IP=127.0.0.1

OPENCLAW_IMAGE=ghcr.io/openclaw/openclaw:latest
OPENCLAW_GATEWAY_HOST_PORT=18789
OPENCLAW_BRIDGE_HOST_PORT=18790
OPENCLAW_GATEWAY_BIND=lan
OPENCLAW_GATEWAY_TOKEN=换成强随机字符串
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=
OPENCLAW_DISABLE_BONJOUR=1

# 模型服务 Key：至少填一个，或在 onboard 中配置 OAuth / API key
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
OPENROUTER_API_KEY=
GOOGLE_API_KEY=
GEMINI_API_KEY=
DEEPSEEK_API_KEY=
</code></pre>
<h2>初始化</h2>
<p>首次启动前，先生成 token：</p>
<pre><code class="language-bash">openssl rand -hex 32
</code></pre>
<p>然后执行 onboarding：</p>
<pre><code class="language-bash">docker compose run --rm --no-deps --entrypoint node openclaw-gateway dist/index.js onboard --mode local --no-install-daemon
docker compose run --rm --no-deps --entrypoint node openclaw-gateway dist/index.js config set --batch-json '[{&quot;path&quot;:&quot;gateway.mode&quot;,&quot;value&quot;:&quot;local&quot;},{&quot;path&quot;:&quot;gateway.bind&quot;,&quot;value&quot;:&quot;lan&quot;},{&quot;path&quot;:&quot;gateway.controlUi.allowedOrigins&quot;,&quot;value&quot;:[&quot;http://localhost:18789&quot;,&quot;http://127.0.0.1:18789&quot;]}]'
docker compose up -d
</code></pre>
<p>后台启动后，日常命令通过 <code>openclaw-cli</code> 执行：</p>
<pre><code class="language-bash">docker compose run --rm openclaw-cli dashboard --no-open
docker compose run --rm openclaw-cli channels login
docker compose run --rm openclaw-cli channels add
docker compose run --rm openclaw-cli doctor
</code></pre>
<p><strong>不要直接把 18789 暴露到公网，建议 <code>HOST_IP=127.0.0.1</code> 后再通过 1Panel 反代访问。</strong></p>
<p><strong>如果想让 OpenClaw 管理更多文件夹/文件，就用 volumes 挂载进容器。</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>OpenClaw Skills 推荐</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/Using/skills%E6%8E%A8%E8%8D%90</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/Using/skills%E6%8E%A8%E8%8D%90</guid>
    <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
    <description>本文主要参考： ClawHub https://clawhub.ai/ 与 OpenClaw Skills 官方文档 https://docs.openclaw.ai/tools/skills 0. 最短安装建议 如果你不想一上来装太多，可以先按下面这个顺序来： 1. 先装 skill-vetter ：先审查，再决定装不装其他 skill。 2. 开发场景优先装 github 。 3. 查资料场景优先装 tavily-search 。 4. 想让 agent 更稳一点，再装 </description>
      <content:encoded><![CDATA[<h1>OpenClaw Skills 推荐</h1>
<p>本文主要参考：<a href="https://clawhub.ai/">ClawHub</a> 与 <a href="https://docs.openclaw.ai/tools/skills">OpenClaw Skills 官方文档</a></p>
<h2>0. 最短安装建议</h2>
<p>如果你不想一上来装太多，可以先按下面这个顺序来：</p>
<ol>
<li>先装 <code>skill-vetter</code>：先审查，再决定装不装其他 skill。</li>
<li>开发场景优先装 <code>github</code>。</li>
<li>查资料场景优先装 <code>tavily-search</code>。</li>
<li>想让 agent 更稳一点，再装 <code>using-superpowers</code>。</li>
<li>真的需要网页自动化时，再装 <code>agent-browser</code>。</li>
</ol>
<p>一个够用的起步组合：</p>
<pre><code class="language-bash">clawhub install skill-vetter
clawhub install github
clawhub install tavily-search
clawhub install using-superpowers
</code></pre>
<p>如果你明确需要浏览器自动化，再补：</p>
<pre><code class="language-bash">clawhub install agent-browser
</code></pre>
<hr>
<h2>1. skills 装到哪里了</h2>
<p>很多人装完以后第一反应都是：<code>为什么我明明装了，但当前 session 里没看到？</code></p>
<p><code>clawhub</code> 默认会优先装到当前工作目录的 <code>./skills</code>；如果你已经配置了 OpenClaw workspace，也可能落到对应 workspace。</p>
<p>常见位置：</p>
<ul>
<li>当前 agent / 当前项目专用：<code>&lt;workspace&gt;/skills</code></li>
<li>全局共享：<code>~/.openclaw/skills</code></li>
</ul>
<p>所以如果一个 agent 能看到 skill，另一个 agent 看不到，通常不是没装上，而是 <strong>skill 装到了某个 workspace，而不是全局位置</strong>。</p>
<hr>
<h2>2. 先看安全，再看功能</h2>
<p>ClawHub 是公开技能市场，不是所有 skill 都由 OpenClaw 官方维护。</p>
<p>官方文档明确提到：</p>
<ul>
<li>安装前会显示将写入的文件与依赖变更。</li>
<li>社区举报达到阈值的 skill 会被自动隐藏。</li>
<li>对会联网、会执行命令、会控制浏览器的 skill，应该先审查再安装。</li>
</ul>
<p>另外，ClawHub 在 <strong>2026 年 2 月</strong> 出现过恶意 skill 事件，所以现在选 skill 不能只看“功能强不强”，还要看 <strong>权限边界是不是清楚、用途是不是单纯</strong>。</p>
<p>所以我自己的习惯是：</p>
<pre><code class="language-bash">clawhub install skill-vetter
</code></pre>
<p>先装它，再去看别的。</p>
<hr>
<h2>3. 常用命令</h2>
<pre><code class="language-bash">clawhub search &quot;github&quot;
clawhub install skill-vetter
clawhub update --all
clawhub whoami
clawhub login
</code></pre>
<hr>
<h2>4. 我最推荐先看的 6 个 skill</h2>
<h3>1）<code>skill-vetter</code></h3>
<p>页面：<a href="https://clawhub.ai/spclaudehome/skill-vetter">spclaudehome/skill-vetter</a></p>
<p>最适合先装。它的价值不在“帮你做业务”，而在“帮你判断别的 skill 能不能装”。如果你准备长期用 OpenClaw，或者准备在 VPS / 常驻环境里装第三方 skill，这个几乎应该算基础设施。</p>
<h3>2）<code>github</code></h3>
<p>页面：<a href="https://clawhub.ai/steipete/github">steipete/github</a></p>
<p>如果你主要用 OpenClaw 做开发，这个基本就是第一优先级，最适合 <strong>仓库浏览、Issue、PR、工程协作流</strong> 这类真实开发任务。</p>
<h3>3）<code>tavily-search</code></h3>
<p>页面：<a href="https://clawhub.ai/arun-8687/tavily-search">arun-8687/tavily-search</a></p>
<p>定位很直接：补强网页搜索。涉及“最近更新”“最新资料”“官网怎么写”这类任务时，它的价值很高。</p>
<h3>4）<code>using-superpowers</code></h3>
<p>页面：<a href="https://clawhub.ai/zlc000190/using-superpowers">zlc000190/using-superpowers</a></p>
<p>它更像一套 <strong>行为纪律框架</strong>。适合“agent 不是不会做，而是步骤不稳、顺序不对、容易乱试”的场景。</p>
<h3>5）<code>prompt-engineering-expert</code></h3>
<p>页面：<a href="https://clawhub.ai/TomsTools11/prompt-engineering-expert">TomsTools11/prompt-engineering-expert</a></p>
<p>适合经常自己写 prompt、系统提示、工作流提示的人。它更适合“把任务描述整理得更可执行”。</p>
<h3>6）<code>ontology</code></h3>
<p>页面：<a href="https://clawhub.ai/oswalpalash/ontology">oswalpalash/ontology</a></p>
<p>适合研究、知识组织、结构化笔记和概念建模。如果你希望 OpenClaw 不只是“回一句话”，而是帮你整理概念、搭知识框架，这类 skill 很有价值。</p>
<hr>
<h2>5. 哪些有用，但不是所有人都先装</h2>
<h3><code>humanizer</code></h3>
<p>页面：<a href="https://clawhub.ai/biostartechnology/humanizer">biostartechnology/humanizer</a></p>
<p>适合写邮件、润色说明文、降低明显的 AI 味；如果你主要做工程任务，它就不是第一优先级。</p>
<h3><code>marketing-skills</code></h3>
<p>页面：<a href="https://clawhub.ai/jchopard69/marketing-skills">jchopard69/marketing-skills</a></p>
<p>更偏市场、运营、活动文案、业务内容场景；如果你的 OpenClaw 更偏内容生产而不是工程协作，它会更有价值。</p>
<hr>
<h2>6. 哪些我建议谨慎安装</h2>
<h3><code>agent-browser</code></h3>
<p>页面：<a href="https://clawhub.ai/TheSethRose/agent-browser">TheSethRose/agent-browser</a></p>
<p>这个 skill 很强，但权限也更高。它适合 <strong>网页浏览、页面导航、登录后台、表单操作</strong>；但也因为能接触更多网页状态和浏览器交互，所以不建议新手一上来就把它当常驻基础 skill。</p>
<p>比较稳的做法：</p>
<ul>
<li>先确认你确实需要浏览器自动化</li>
<li>先用 <code>skill-vetter</code> 审查</li>
<li>尽量放在受控环境里使用</li>
</ul>
<h3><code>self-improving-agent</code></h3>
<p>页面：<a href="https://clawhub.ai/pskoett/self-improving-agent">pskoett/self-improving-agent</a></p>
<p>它的优点很明显：能让 agent 通过反思和规则沉淀逐步改进；但问题也很明显：它影响的是 <strong>长期行为方式</strong>，一旦效果不好，排查通常比普通 skill 更麻烦。</p>
<p>所以我的建议是：</p>
<ul>
<li>它不是不能装</li>
<li>但不建议一开始就常驻启用</li>
<li>更适合你已经有稳定工作流之后再上</li>
</ul>
<hr>
<h2>7. 按场景怎么选</h2>
<h3>开发协作</h3>
<p>优先：<code>github</code></p>
<p>补充：<code>using-superpowers</code>、<code>prompt-engineering-expert</code></p>
<h3>查资料 / 跟踪最新信息</h3>
<p>优先：<code>tavily-search</code></p>
<p>补充：<code>agent-browser</code>（仅在确实需要网页自动化时）</p>
<h3>知识整理 / 研究 / 结构化笔记</h3>
<p>优先：<code>ontology</code></p>
<p>补充：<code>prompt-engineering-expert</code></p>
<h3>文案润色 / 对外表达</h3>
<p>优先：<code>humanizer</code></p>
<h3>市场 / 运营 / 活动内容</h3>
<p>优先：<code>marketing-skills</code></p>
<hr>
<h2>8. 新手最容易踩的几个坑</h2>
<h3>1）装完 skill，不一定当前会话立刻生效</h3>
<p>很多时候需要重新开一个 OpenClaw session，或者至少重新进入对应 workspace，skill 才会被重新扫描到。</p>
<h3>2）你以为装的是“全局”，其实装的是“当前 workspace”</h3>
<p>如果你在某个项目目录里执行 <code>clawhub install ...</code>，它很可能是装到当前项目 / 当前 agent 的 workspace 里，而不是全局位置。</p>
<h3>3）第三方 skill 的敏感配置不是“小事”</h3>
<p>有些 skill 需要 <code>env</code>、<code>apiKey</code>、浏览器登录态或者外部服务 token。这类配置直接决定了 skill 能访问什么资源，所以要特别注意放置位置和最小权限。</p>
<hr>
<h2>9. 推荐节奏</h2>
<p>推荐安装顺序：</p>
<ol>
<li><code>skill-vetter</code></li>
<li><code>github</code> 或 <code>tavily-search</code></li>
<li><code>using-superpowers</code></li>
<li><code>prompt-engineering-expert</code> 或 <code>ontology</code></li>
<li><code>agent-browser</code></li>
<li><code>self-improving-agent</code></li>
</ol>
<p>原因很简单：</p>
<ul>
<li>前 3 个最容易立即产生收益</li>
<li>中间 2 个更偏“增强工作质量”</li>
<li>最后 2 个更强，但也更容易把系统复杂度拉高</li>
</ul>
<h2>10. 什么时候该用共享 skill，什么时候该用单 agent skill</h2>
<p>如果这个 skill 是你几乎所有 agent 都会反复用到的，比如 <code>skill-vetter</code>、<code>tavily-search</code> 这种通用型能力，放到全局共享位置会更省事。</p>
<p>如果这个 skill 只服务某一个工作区，比如某个特定项目、某个特定业务流程，放到该 agent 自己的 workspace 里会更干净，也更容易隔离风险。</p>
<p>一个很实用的经验是：</p>
<ul>
<li>通用能力，尽量共享</li>
<li>高权限能力，尽量按 agent 隔离</li>
<li>和具体项目强绑定的 skill，不要一股脑全局化</li>
</ul>
<h2>参考</h2>
<ul>
<li><a href="https://clawhub.ai/">ClawHub</a></li>
<li><a href="https://docs.openclaw.ai/tools/skills">OpenClaw Skills Overview</a></li>
<li><a href="https://docs.openclaw.ai/tools/skills">OpenClaw Skills Safety</a></li>
<li><a href="https://www.tomshardware.com/tech-industry/cyber-security/malicious-moltbot-skill-targets-crypto-users-on-clawhub">Tom's Hardware: 恶意 ClawHub skill 事件</a></li>
<li><a href="https://www.theverge.com/news/874011/openclaw-ai-skill-clawhub-extensions-security-nightmare">The Verge: OpenClaw 技能市场安全问题报道</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>easytier</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/easytier</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/easytier</guid>
    <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
    <description>Github Repo EasyTier Github Repo https://github.com/EasyTier/EasyTier docker-compose env 防火墙记得放开端口11010</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/EasyTier/EasyTier">EasyTier Github Repo</a></p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">services:
    easytier:
        container_name: easytier
        image: easytier/easytier:latest
        hostname: ${EASYTIER_HOSTNAME}
        labels:
            createdBy: Apps
            com.centurylinklabs.watchtower.enable: 'true'
        restart: unless-stopped
        network_mode: host
        cap_add:
            - NET_ADMIN
            - NET_RAW
        environment:
            - TZ=${TIME_ZONE}
        devices:
            - /dev/net/tun:/dev/net/tun
        volumes:
            - ${EASYTIER_DATA_PATH}:/root
            - /etc/machine-id:/etc/machine-id:ro
        command: &gt;
            -d
            --network-name ${EASYTIER_NETWORK_NAME}
            --network-secret ${EASYTIER_NETWORK_SECRET}
            ${EASYTIER_PEERS}
            ${EASYTIER_IPV4}
</code></pre>
<h2>env</h2>
<pre><code>TIME_ZONE=Asia/Shanghai

EASYTIER_HOSTNAME=ali_ecs
EASYTIER_DATA_PATH=/etc/easytier

EASYTIER_NETWORK_NAME=
EASYTIER_NETWORK_SECRET=

# 可填多个 -p，留空也可以
EASYTIER_PEERS=-p tcp://public.easytier.top:11010

# 例如: EASYTIER_IPV4=-i 10.144.144.2
# 不需要就留空
EASYTIER_IPV4=
</code></pre>
<p><strong>防火墙记得放开端口11010</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>miaomiaowu</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/miaomiaowu</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/miaomiaowu</guid>
    <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
    <description>Github Repo miaomiaowu Github Repo https://github.com/iluobei/miaomiaowu docker-compose env</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/iluobei/miaomiaowu">miaomiaowu Github Repo</a></p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">networks:
    1panel-network:
        external: true

services:
    miaomiaowu:
        container_name: miaomiaowu
        image: ghcr.io/iluobei/miaomiaowu:latest
        user: root
        restart: unless-stopped
        environment:
            - TZ=${TIME_ZONE}
            - PORT=${MMW_CONTAINER_PORT}
            - DATABASE_PATH=/app/data/traffic.db
            - LOG_LEVEL=${MMW_LOG_LEVEL}
            - JWT_SECRET=${MMW_JWT_SECRET}
        labels:
            createdBy: Apps
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${MMW_HOST_PORT}:${MMW_CONTAINER_PORT}
        volumes:
            - ./data:/app/data
            - ./subscribes:/app/subscribes
            - ./rule_templates:/app/rule_templates
        healthcheck:
            test: [&quot;CMD&quot;, &quot;wget&quot;, &quot;--no-verbose&quot;, &quot;--tries=1&quot;, &quot;--spider&quot;, &quot;http://localhost:8080/&quot;]
            interval: 30s
            timeout: 3s
            start_period: 5s
            retries: 3
</code></pre>
<h2>env</h2>
<pre><code>TIME_ZONE=UTC
HOST_IP=127.0.0.1
MMW_HOST_PORT=13200
MMW_CONTAINER_PORT=8080
MMW_LOG_LEVEL=info
MMW_JWT_SECRET=换成一串足够长的随机字符串
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>sing-box</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/sing-box</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/sing-box</guid>
    <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
    <description>Github Repo sing-box Github Repo https://github.com/SagerNet/sing-box 前置工作 目录结构 准备一个目录，构建好如下结构： 证书准备 VLESS + Reality 不依赖你自己的证书域名做握手目标 Hysteria2 / Naive / TUIC 都依赖你自己的真实 TLS 证书 所以你需要把 example.com 对应的证书放到： 密钥和凭据 1）生成 Reality 密钥对 TLS 文档明确写了：Re</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/SagerNet/sing-box">sing-box Github Repo</a></p>
<h2>前置工作</h2>
<h3>目录结构</h3>
<p>准备一个目录，构建好如下结构：</p>
<pre><code class="language-text">/opt/singbox
├─ .env
├─ docker-compose.yml
├─ templates/
│  └─ config.json.template
├─ generated/
│  └─ config.json
├─ data/
├─ www/
└─ ssl/
   └─ example.com/
      ├─ fullchain.pem
      └─ privkey.pem
</code></pre>
<h3>证书准备</h3>
<p><strong>VLESS + Reality 不依赖你自己的证书域名做握手目标</strong>
<strong>Hysteria2 / Naive / TUIC 都依赖你自己的真实 TLS 证书</strong></p>
<p>所以你需要把 <code>example.com</code> 对应的证书放到：</p>
<pre><code class="language-text">/opt/singbox/ssl/example.com/fullchain.pem
/opt/singbox/ssl/example.com/privkey.pem
</code></pre>
<h3>密钥和凭据</h3>
<h4>1）生成 Reality 密钥对</h4>
<p>TLS 文档明确写了：Reality 服务端要用 <code>private_key</code>，客户端要用 <code>public_key</code>，都由 <code>sing-box generate reality-keypair</code> 生成。<code>short_id</code> 是必填，长度是 0 到 8 位十六进制字符串。(<a href="https://sing-box.sagernet.org/configuration/shared/tls/" title="TLS - sing-box">Sing Box</a>)</p>
<pre><code class="language-bash">docker run --rm ghcr.io/sagernet/sing-box generate reality-keypair
</code></pre>
<p>你会拿到两项：</p>
<ul>
<li>
<p><code>PrivateKey</code> → 服务端配置里用</p>
</li>
<li>
<p><code>PublicKey</code> → 客户端配置里用</p>
</li>
</ul>
<p>自己再准备一个 8 位十六进制 <code>short_id</code>，例如：</p>
<pre><code class="language-bash">openssl rand -hex 8
</code></pre>
<h4>2）生成 UUID</h4>
<p>给 VLESS 和 TUIC 各准备一个 UUID：</p>
<pre><code class="language-bash">cat /proc/sys/kernel/random/uuid
cat /proc/sys/kernel/random/uuid
</code></pre>
<h4>3）生成强密码</h4>
<p>给 Hysteria2、Naive、TUIC 分别准备长随机密码：</p>
<pre><code class="language-bash">openssl rand -base64 24
openssl rand -base64 24
openssl rand -base64 24
openssl rand -base64 24
</code></pre>
<p>其中 Hysteria2 我建议准备两个：</p>
<ul>
<li><code>password</code></li>
<li><code>obfs.password</code></li>
</ul>
<h3>templates/config.json.template</h3>
<p>把下面内容保存为 <code>/opt/singbox/templates/config.json.template</code>：</p>
<pre><code class="language-json">{
  &quot;log&quot;: {
    &quot;level&quot;: &quot;${LOG_LEVEL}&quot;,
    &quot;timestamp&quot;: true
  },
  &quot;inbounds&quot;: [
    {
      &quot;type&quot;: &quot;vless&quot;,
      &quot;tag&quot;: &quot;vless-reality-in&quot;,
      &quot;listen&quot;: &quot;::&quot;,
      &quot;listen_port&quot;: ${VLESS_PORT},
      &quot;users&quot;: [
        {
          &quot;name&quot;: &quot;vless-user&quot;,
          &quot;uuid&quot;: &quot;${VLESS_UUID}&quot;,
          &quot;flow&quot;: &quot;xtls-rprx-vision&quot;
        }
      ],
      &quot;tls&quot;: {
        &quot;enabled&quot;: true,
        &quot;server_name&quot;: &quot;${REALITY_HANDSHAKE_SERVER}&quot;,
        &quot;min_version&quot;: &quot;1.3&quot;,
        &quot;max_version&quot;: &quot;1.3&quot;,
        &quot;reality&quot;: {
          &quot;enabled&quot;: true,
          &quot;handshake&quot;: {
            &quot;server&quot;: &quot;${REALITY_HANDSHAKE_SERVER}&quot;,
            &quot;server_port&quot;: ${REALITY_HANDSHAKE_PORT}
          },
          &quot;private_key&quot;: &quot;${REALITY_PRIVATE_KEY}&quot;,
          &quot;short_id&quot;: [
            &quot;${REALITY_SHORT_ID}&quot;
          ],
          &quot;max_time_difference&quot;: &quot;1m&quot;
        }
      }
    },
    {
      &quot;type&quot;: &quot;hysteria2&quot;,
      &quot;tag&quot;: &quot;hy2-in&quot;,
      &quot;listen&quot;: &quot;::&quot;,
      &quot;listen_port&quot;: ${HY2_PORT},
      &quot;up_mbps&quot;: ${HY2_UP_MBPS},
      &quot;down_mbps&quot;: ${HY2_DOWN_MBPS},
      &quot;obfs&quot;: {
        &quot;type&quot;: &quot;salamander&quot;,
        &quot;password&quot;: &quot;${HY2_OBFS_PASSWORD}&quot;
      },
      &quot;users&quot;: [
        {
          &quot;name&quot;: &quot;hy2-user&quot;,
          &quot;password&quot;: &quot;${HY2_PASSWORD}&quot;
        }
      ],
      &quot;ignore_client_bandwidth&quot;: false,
      &quot;tls&quot;: {
        &quot;enabled&quot;: true,
        &quot;certificate_path&quot;: &quot;${TLS_CERT_PATH}&quot;,
        &quot;key_path&quot;: &quot;${TLS_KEY_PATH}&quot;,
        &quot;min_version&quot;: &quot;1.3&quot;,
        &quot;max_version&quot;: &quot;1.3&quot;,
        &quot;alpn&quot;: [
          &quot;h3&quot;
        ]
      },
      &quot;masquerade&quot;: {
        &quot;type&quot;: &quot;file&quot;,
        &quot;directory&quot;: &quot;/srv/www&quot;
      }
    },
    {
      &quot;type&quot;: &quot;naive&quot;,
      &quot;tag&quot;: &quot;naive-in&quot;,
      &quot;listen&quot;: &quot;::&quot;,
      &quot;listen_port&quot;: ${NAIVE_PORT},
      &quot;users&quot;: [
        {
          &quot;username&quot;: &quot;${NAIVE_USERNAME}&quot;,
          &quot;password&quot;: &quot;${NAIVE_PASSWORD}&quot;
        }
      ],
      &quot;tls&quot;: {
        &quot;enabled&quot;: true,
        &quot;certificate_path&quot;: &quot;${TLS_CERT_PATH}&quot;,
        &quot;key_path&quot;: &quot;${TLS_KEY_PATH}&quot;
      }
    },
    {
      &quot;type&quot;: &quot;tuic&quot;,
      &quot;tag&quot;: &quot;tuic-in&quot;,
      &quot;listen&quot;: &quot;::&quot;,
      &quot;listen_port&quot;: ${TUIC_PORT},
      &quot;users&quot;: [
        {
          &quot;name&quot;: &quot;tuic-user&quot;,
          &quot;uuid&quot;: &quot;${TUIC_UUID}&quot;,
          &quot;password&quot;: &quot;${TUIC_PASSWORD}&quot;
        }
      ],
      &quot;congestion_control&quot;: &quot;${TUIC_CONGESTION_CONTROL}&quot;,
      &quot;auth_timeout&quot;: &quot;3s&quot;,
      &quot;zero_rtt_handshake&quot;: false,
      &quot;heartbeat&quot;: &quot;10s&quot;,
      &quot;tls&quot;: {
        &quot;enabled&quot;: true,
        &quot;certificate_path&quot;: &quot;${TLS_CERT_PATH}&quot;,
        &quot;key_path&quot;: &quot;${TLS_KEY_PATH}&quot;,
        &quot;min_version&quot;: &quot;1.3&quot;,
        &quot;max_version&quot;: &quot;1.3&quot;,
        &quot;alpn&quot;: [
          &quot;h3&quot;
        ]
      }
    }
  ],
  &quot;outbounds&quot;: [
    {
      &quot;type&quot;: &quot;direct&quot;,
      &quot;tag&quot;: &quot;direct&quot;
    },
    {
      &quot;type&quot;: &quot;block&quot;,
      &quot;tag&quot;: &quot;block&quot;
    }
  ],
  &quot;route&quot;: {
    &quot;final&quot;: &quot;direct&quot;
  }
}
</code></pre>
<h2>env</h2>
<pre><code>TZ=UTC

HOST_IP=0.0.0.0

VLESS_PORT=17000
HY2_PORT=26000
NAIVE_PORT=35000
TUIC_PORT=48000

SERVER_DOMAIN=example.com
REALITY_HANDSHAKE_SERVER=www.microsoft.com
REALITY_HANDSHAKE_PORT=443

VLESS_UUID=
REALITY_PRIVATE_KEY=
REALITY_PUBLIC_KEY=
REALITY_SHORT_ID=

HY2_PASSWORD=
HY2_OBFS_PASSWORD=
HY2_UP_MBPS=200
HY2_DOWN_MBPS=200

NAIVE_USERNAME=naive-user
NAIVE_PASSWORD=

TUIC_UUID=
TUIC_PASSWORD=
TUIC_CONGESTION_CONTROL=cubic

LOG_LEVEL=warn

TLS_CERT_PATH=/etc/ssl/sing-box/fullchain.pem
TLS_KEY_PATH=/etc/ssl/sing-box/privkey.pem
</code></pre>
<h2>docker-compose</h2>
<pre><code class="language-yaml">networks:
  1panel-network:
    external: true

services:
  singbox-config:
    image: alpine:3.20
    container_name: singbox-config
    restart: &quot;no&quot;
    env_file:
      - .env
    volumes:
      - ./templates:/templates:ro
      - ./generated:/generated
    command: &gt;
      sh -c &quot;
      apk add --no-cache gettext &amp;&amp;
      envsubst &lt; /templates/config.json.template &gt; /generated/config.json &amp;&amp;
      echo 'generated /generated/config.json'
      &quot;
    networks:
      - 1panel-network

  sing-box:
    image: ghcr.io/sagernet/sing-box:latest
    container_name: sing-box
    restart: unless-stopped
    depends_on:
      singbox-config:
        condition: service_completed_successfully
    env_file:
      - .env
    ports:
      - ${HOST_IP}:${VLESS_PORT}:${VLESS_PORT}/tcp
      - ${HOST_IP}:${HY2_PORT}:${HY2_PORT}/udp
      - ${HOST_IP}:${NAIVE_PORT}:${NAIVE_PORT}/tcp
      - ${HOST_IP}:${TUIC_PORT}:${TUIC_PORT}/udp
    volumes:
      - ./generated:/etc/sing-box:ro
      - ./data:/var/lib/sing-box
      - ./www:/srv/www:ro
      - ./ssl/example.com:/etc/ssl/sing-box:ro
    command: -D /var/lib/sing-box -C /etc/sing-box run
    read_only: true
    tmpfs:
      - /tmp
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    networks:
      - 1panel-network
</code></pre>
<p><code>singbox-config</code> 只负责把模板渲染成 <code>generated/config.json</code></p>
<p><strong>防火墙记得放开对应端口</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>v2rayA</title>
      <link>https://develata.me/knowledge/sharing/docker/compose/v2rayA</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/compose/v2rayA</guid>
    <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
    <description>Github Repo v2rayA Github Repo https://github.com/v2rayA/v2rayA docker-compose env 防火墙记得放开端口20171并且v2rayA控制面板设置里面打开端口转发，目的是为了让其它容器或内网其它设备可以正常访问 如果镜像版本太老可能无法识别最新协议，需要手动本地拉取最新镜像后上传至服务器</description>
      <content:encoded><![CDATA[<h2>Github Repo</h2>
<p><a href="https://github.com/v2rayA/v2rayA">v2rayA Github Repo</a></p>
<h2>docker-compose</h2>
<pre><code class="language-yaml">networks:
    1panel-network:
        external: true

services:
    v2raya:
        container_name: v2raya
        image: mzz2017/v2raya:latest
        restart: always
        environment:
            - TZ=${TIME_ZONE}
            - V2RAYA_LOG_FILE=${V2RAYA_LOG_FILE}
        labels:
            createdBy: Apps
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${V2RAYA_PANEL_PORT}:2017
            - ${HOST_IP}:${V2RAYA_SOCKS_PORT}:20170
            - ${HOST_IP}:${V2RAYA_HTTP_PORT}:20171
            - ${HOST_IP}:${V2RAYA_TRANSPARENT_PORT}:20172
        volumes:
            - ${V2RAYA_DATA_PATH}:/etc/v2raya
</code></pre>
<h2>env</h2>
<pre><code>HOST_IP=127.0.0.1
TIME_ZONE=UTC
V2RAYA_PANEL_PORT=2017
V2RAYA_SOCKS_PORT=20170
V2RAYA_HTTP_PORT=20171
V2RAYA_TRANSPARENT_PORT=20172

V2RAYA_LOG_FILE=/tmp/v2raya.log
V2RAYA_DATA_PATH=/etc/v2raya
</code></pre>
<p><strong>防火墙记得放开端口20171并且v2rayA控制面板设置里面打开端口转发，目的是为了让其它容器或内网其它设备可以正常访问</strong></p>
<p>如果镜像版本太老可能无法识别最新协议，需要手动本地拉取最新镜像后上传至服务器</p>
]]></content:encoded>
    </item>
    <item>
      <title>CC Switch</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/cc-switch</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/cc-switch</guid>
    <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    <description>1. CC Switch 是什么 Github Repo https://github.com/farion1231/cc-switch CC Switch Cloud/Code Switch 是一个可视化的终端配置管理工具，目前主要支持 Claude Code 、 Codex 以及 Gemini CLI 。 补充：截至 2026-04-13 ，仓库 README 展示的当前版本为 v3.9.1 。 核心能力： 多环境切换 ：一键覆写 Claude/Codex/Gemini </description>
      <content:encoded><![CDATA[<h1>CC Switch 使用指南</h1>
<h2>1. CC Switch 是什么</h2>
<p><a href="https://github.com/farion1231/cc-switch">Github Repo</a></p>
<p>CC Switch (Cloud/Code Switch) 是一个可视化的终端配置管理工具，目前主要支持 <strong>Claude Code</strong>、<strong>Codex</strong> 以及 <strong>Gemini CLI</strong>。</p>
<blockquote>
<p>补充：截至 <strong>2026-04-13</strong>，仓库 README 展示的当前版本为 <strong>v3.9.1</strong>。</p>
</blockquote>
<p><strong>核心能力：</strong></p>
<ul>
<li><strong>多环境切换</strong>：一键覆写 Claude/Codex/Gemini 的配置文件，毫秒级生效。</li>
<li><strong>MCP 统一管理</strong>：在一个面板管理所有 CLI 的 MCP Server，支持一键开关与同步。</li>
<li><strong>Prompts 系统</strong>：可视化管理 <code>CLAUDE.md</code>、<code>AGENTS.md</code> 和 <code>GEMINI.md</code> 系统提示词。</li>
<li><strong>Skills 仓库</strong>：自动扫描管理Skills，并支持一键安装 GitHub 上的 Claude Skills。</li>
</ul>
<hr>
<h2>2. 安装与更新</h2>
<blockquote>
<p>支持 macOS, Windows, Linux 全平台 (基于 Tauri v2)。</p>
</blockquote>
<h3>2.1 macOS</h3>
<p>推荐使用 Homebrew 安装：</p>
<pre><code class="language-bash"># 1. 订阅 Tap
brew tap farion1231/ccswitch

# 2. 安装
brew install --cask cc-switch
</code></pre>
<p>更新：</p>
<pre><code class="language-bash">brew upgrade --cask cc-switch
</code></pre>
<h3>2.2 Windows</h3>
<p>推荐使用 scoop 安装:</p>
<pre><code>scoop install --cask cc-switch
</code></pre>
<p>更新：</p>
<pre><code class="language-bash">scoop upgrade --cask cc-switch
</code></pre>
<p>其它安装方式：</p>
<ul>
<li><strong>安装包</strong>：下载 <code>.msi</code> 安装程序。</li>
<li><strong>便携版</strong>：下载 <code>.zip</code> 解压即用。</li>
<li><a href="https://github.com/farion1231/cc-switch/releases">前往 GitHub Releases 下载</a></li>
</ul>
<h3>2.3 Linux</h3>
<ul>
<li><strong>Arch Linux (AUR)</strong>:<pre><code class="language-bash">paru -S cc-switch-bin
</code></pre>
</li>
<li><strong>Flatpak</strong>:<pre><code class="language-bash">flatpak install --user ./CC-Switch-v{version}-Linux.flatpak
flatpak run com.ccswitch.desktop
</code></pre>
</li>
<li><strong>其他发行版</strong>: 提供 <code>.deb</code>, <code>.rpm</code> 和 <code>.AppImage</code>。</li>
</ul>
<hr>
<h2>3. 快速上手</h2>
<h3>3.1 添加配置 (Add Provider)</h3>
<blockquote>
<p><em>提示：使用前请确保已安装对应的 CLI 工具（如 <code>npm i -g @anthropic-ai/claude-code</code>），否则无法生效。</em></p>
</blockquote>
<p>CC Switch 的核心概念是 <strong>Provider</strong>（配置预设）。</p>
<ol>
<li>点击主界面右上角的 <strong>Add Provider</strong>。</li>
<li><strong>选择模版</strong>：
<ul>
<li><strong>Claude Official</strong>: 官方 OAuth 登录模式。</li>
<li><strong>OpenAI Compatible</strong>: 适用于 Codex 或使用中转服务的 Claude Code (如 DeepSeek, PackyCode)。</li>
<li><strong>Gemini Official</strong>: Google 官方 API。</li>
</ul>
</li>
<li>填写对应的 <code>API Key</code> 和 <code>Base URL</code>。
<ul>
<li><em>注意：中转服务地址通常需包含 <code>/v1</code> 后缀（如 <code>https://api.example.com/v1</code>）。</em></li>
</ul>
</li>
</ol>
<h3>3.2 一键切换</h3>
<ol>
<li>在列表中选中你想要使用的环境。</li>
<li>点击 <strong>Enable</strong>（或在系统托盘直接选择）。</li>
<li><strong>生效机制</strong>：
<ul>
<li>CC Switch 会自动修改对应 CLI 的配置文件（如 <code>~/.claude/settings.json</code> 或 <code>~/.codex/auth.json</code>）。</li>
<li><strong>通常需要重启终端或对应客户端</strong>：例如重新运行 <code>claude</code>、<code>codex</code> 或 Gemini CLI 后生效。</li>
</ul>
</li>
</ol>
<hr>
<h2>4. 深度功能解析</h2>
<h3>4.1 MCP 管理中心 (Unified MCP)</h3>
<p>不再需要手动编辑复杂的 JSON 配置文件。CC Switch 提供了一个统一的面板来管理所有工具的 MCP Server。</p>
<ul>
<li><strong>多工具同步</strong>：你可以定义一个 MCP Server（如 <code>filesystem</code>），并勾选它同步到 Claude 和 Codex。</li>
<li><strong>配置隔离</strong>：也可以为特定工具设置独享的 MCP。</li>
<li><strong>导入导出</strong>：支持从现有的 <code>claude.json</code> 导入配置。</li>
</ul>
<h3>4.2 Prompts (系统提示词) 管理</h3>
<p>针对不同项目或角色，快速切换系统级指令。</p>
<ul>
<li><strong>文件映射</strong>：
<ul>
<li>Claude -&gt; <code>CLAUDE.md</code></li>
<li>Codex -&gt; <code>AGENTS.md</code></li>
<li>Gemini -&gt; <code>GEMINI.md</code></li>
</ul>
</li>
<li><strong>特色功能</strong>：内置 Markdown 编辑器，支持实时预览。切换 Preset 时，会自动备份当前目录下的原有文件，防止误覆盖。</li>
</ul>
<h3>4.3 Skills 技能库 (v3.7+)</h3>
<ul>
<li><strong>自动发现</strong>：输入 GitHub 仓库地址（如 <code>User/Repo</code>），自动扫描其中的 Skills。</li>
<li><strong>一键安装</strong>：将扫描到的工具直接安装到 <code>~/.claude/skills/</code> 目录，Claude Code 启动时会自动加载。</li>
</ul>
<hr>
<h2>5. 配置文件与数据架构</h2>
<h3>5.1 数据存储</h3>
<p>CC Switch 采用 <strong>SQLite + JSON</strong> 双层架构 (v3.8+)：</p>
<ul>
<li><strong>核心数据 (SSOT)</strong>: <code>~/.cc-switch/cc-switch.db</code> 存储所有 Provider、MCP、Prompts 和 Skills 数据。</li>
<li><strong>本地设置</strong>: <code>~/.cc-switch/settings.json</code> 存储窗口状态、路径等设备级配置。</li>
</ul>
<h3>5.2 云同步 (Cloud Sync)</h3>
<p>实现多台电脑配置一致：</p>
<ol>
<li>进入 <strong>Settings</strong> -&gt; <strong>Custom Configuration Directory</strong>。</li>
<li>选择你的云同步目录（如 Dropbox, OneDrive, iCloud Drive）。</li>
<li>应用重启后，数据将迁移至该目录，在其他电脑指向同一目录即可实现同步。</li>
</ol>
<h3>5.3 CLI 配置文件路径参考</h3>
<p>CC Switch 修改的目标文件如下，了解这些有助于排查问题：</p>
<table>
<thead>
<tr>
<th style="text-align:left">工具</th>
<th style="text-align:left">配置文件路径</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Claude Code</strong></td>
<td style="text-align:left"><code>~/.claude/settings.json</code> / <code>~/.claude.json</code></td>
<td style="text-align:left">存储配置、认证与 MCP</td>
</tr>
<tr>
<td style="text-align:left"><strong>Codex</strong></td>
<td style="text-align:left"><code>~/.codex/auth.json</code></td>
<td style="text-align:left">存储认证信息</td>
</tr>
<tr>
<td style="text-align:left"><strong>Codex</strong></td>
<td style="text-align:left"><code>~/.codex/config.toml</code></td>
<td style="text-align:left">存储 MCP Server</td>
</tr>
<tr>
<td style="text-align:left"><strong>Gemini CLI</strong></td>
<td style="text-align:left"><code>~/.gemini/.env</code></td>
<td style="text-align:left">存储 API Key</td>
</tr>
<tr>
<td style="text-align:left"><strong>Gemini CLI</strong></td>
<td style="text-align:left"><code>~/.gemini/settings.json</code></td>
<td style="text-align:left">存储认证模式和 MCP</td>
</tr>
</tbody>
</table>
<hr>
<h2>6. 常见问题</h2>
<h3>Q: 切换后 Claude Code 报错 401？</h3>
<ul>
<li>检查 <strong>Base URL</strong> 是否正确。如果使用中转，通常需要带上 <code>/v1</code>（如 <code>https://api.example.com/v1</code>）。</li>
<li>如果是官方模式，尝试重新进行 OAuth 授权。</li>
</ul>
<h3>Q: 什么是 Deep Link？</h3>
<ul>
<li>CC Switch 支持 <code>ccswitch://</code> 协议。</li>
<li>你可以将配置导出为链接分享给同事，对方点击链接即可一键导入复杂的 API 和 MCP 配置。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Claude Code</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/claude-code</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/claude-code</guid>
    <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    <description>1. Claude Code 是什么 GitHub Repo https://github.com/anthropics/claude-code Claude Code（命令 claude ）是一个终端内的 Agent：读代码、改文件、执行命令、做 git 工作流。 补充：Claude Code 的官方 GitHub 仓库现在已经公开，仓库内也直接包含 plugins/ 、 .claude/commands/ 、 examples/hooks/ 等官方示例。 官方文档： ht</description>
      <content:encoded><![CDATA[<h1>Claude Code 使用指南</h1>
<h2>1. Claude Code 是什么</h2>
<p><a href="https://github.com/anthropics/claude-code">GitHub Repo</a></p>
<p>Claude Code（命令 <code>claude</code>）是一个终端内的 Agent：读代码、改文件、执行命令、做 git 工作流。</p>
<blockquote>
<p>补充：Claude Code 的官方 GitHub 仓库现在已经公开，仓库内也直接包含 <code>plugins/</code>、<code>.claude/commands/</code>、<code>examples/hooks/</code> 等官方示例。</p>
</blockquote>
<p>官方文档：</p>
<ul>
<li><a href="https://code.claude.com/docs/en/overview">https://code.claude.com/docs/en/overview</a></li>
<li><a href="https://code.claude.com/docs/zh-CN/overview">https://code.claude.com/docs/zh-CN/overview</a></li>
<li><a href="https://code.claude.com/docs/en/setup">https://code.claude.com/docs/en/setup</a></li>
<li><a href="https://code.claude.com/docs/en/cli-reference">https://code.claude.com/docs/en/cli-reference</a></li>
</ul>
<hr>
<h2>2. 安装与更新</h2>
<blockquote>
<p>官方说明：NPM 安装已标记为 deprecated，优先使用 Native 安装脚本 / Homebrew / WinGet。</p>
</blockquote>
<h3>2.1 安装</h3>
<h4>macOS / Linux / WSL</h4>
<h5>Homebrew (macOS/Linux)：</h5>
<pre><code class="language-bash">brew install --cask claude-code
</code></pre>
<h5>直接安装：</h5>
<pre><code class="language-bash">curl -fsSL https://claude.ai/install.sh | bash
</code></pre>
<h4>Windows</h4>
<h5>scoop包管理器：</h5>
<pre><code>scoop install claude-code
</code></pre>
<h5>WinGet (Windows)：</h5>
<pre><code class="language-powershell">winget install Anthropic.ClaudeCode
</code></pre>
<h5>直接安装：</h5>
<pre><code class="language-powershell">irm https://claude.ai/install.ps1 | iex
</code></pre>
<p>Windows CMD：</p>
<pre><code class="language-cmd">curl -fsSL https://claude.ai/install.cmd -o install.cmd &amp;&amp; install.cmd &amp;&amp; del install.cmd
</code></pre>
<h4>NPM (Deprecated)：</h4>
<pre><code class="language-bash">npm install -g @anthropic-ai/claude-code
</code></pre>
<blockquote>
<p>Node.js 18+ 仅对 NPM 安装方式必需。</p>
</blockquote>
<h3>2.3 更新</h3>
<pre><code class="language-bash">claude update
</code></pre>
<blockquote>
<p>Homebrew/WinGet/Scoop 安装不会自动更新：用 <code>brew upgrade claude-code</code> 或 <code>winget upgrade Anthropic.ClaudeCode</code> 或 <code>scoop update claude-code</code>。</p>
</blockquote>
<h3>2.4 健康检查</h3>
<pre><code class="language-bash">claude -v
claude doctor
</code></pre>
<hr>
<h2>3. 快速开始</h2>
<h3>3.1 在项目目录启动</h3>
<pre><code class="language-bash">cd /path/to/your/project
claude
</code></pre>
<h3>3.2 常用指令</h3>
<pre><code class="language-text">/init
/login
/logout
/config
/permissions
/model
/status
/mcp
/agents
/hooks
/plugin
/reload-plugins
/terminal-setup
/sandbox
/compact
/rewind
</code></pre>
<h3>3.3* 非官方中转 / 代理 API（LLM Gateway）</h3>
<blockquote>
<p>适用场景：企业网关 / 自建代理 / LiteLLM 等，把 Claude Code 的请求转发到你自己的网关。</p>
</blockquote>
<h4>A. 最小配置：鉴权 + Base URL</h4>
<p>方式 1：环境变量（示例以 LiteLLM 的 Anthropic unified endpoint 为例）：</p>
<pre><code class="language-bash">export ANTHROPIC_AUTH_TOKEN=sk-your-gateway-key
export ANTHROPIC_BASE_URL=https://litellm-server:4000
</code></pre>
<p>Windows PowerShell：</p>
<pre><code class="language-powershell">$env:ANTHROPIC_AUTH_TOKEN=&quot;sk-your-gateway-key&quot;
$env:ANTHROPIC_BASE_URL=&quot;https://litellm-server:4000&quot;
</code></pre>
<p>方式 2：写进 <code>settings.json</code>（<code>/config</code> 里也可以改）：</p>
<pre><code class="language-json">{
  &quot;env&quot;: {
    &quot;ANTHROPIC_AUTH_TOKEN&quot;: &quot;sk-your-gateway-key&quot;,
    &quot;ANTHROPIC_BASE_URL&quot;: &quot;https://litellm-server:4000&quot;
  }
}
</code></pre>
<blockquote>
<p>网关侧要求：至少兼容 Anthropic Messages 端点（<code>/v1/messages</code>、<code>/v1/messages/count_tokens</code>），并正确转发 <code>anthropic-beta</code> / <code>anthropic-version</code> 等头；否则部分功能可能不可用。</p>
</blockquote>
<h4>B. 兼容性开关（常见）</h4>
<p>当网关对 <code>anthropic-beta</code> 头不兼容时：</p>
<pre><code class="language-bash">export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
</code></pre>
<h4>C. Provider pass-through（按需）</h4>
<p>Bedrock via gateway（示例为 LiteLLM pass-through）：</p>
<pre><code class="language-bash">export ANTHROPIC_BEDROCK_BASE_URL=https://litellm-server:4000/bedrock
export CLAUDE_CODE_SKIP_BEDROCK_AUTH=1
export CLAUDE_CODE_USE_BEDROCK=1
</code></pre>
<p>Vertex via gateway（示例为 LiteLLM pass-through）：</p>
<pre><code class="language-bash">export ANTHROPIC_VERTEX_BASE_URL=https://litellm-server:4000/vertex_ai/v1
export ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id
export CLOUD_ML_REGION=us-east5
export CLAUDE_CODE_SKIP_VERTEX_AUTH=1
export CLAUDE_CODE_USE_VERTEX=1
</code></pre>
<h4>D. 第三方模型直连（Anthropic API 兼容）</h4>
<blockquote>
<p>前提：第三方服务提供 Anthropic Messages 格式（通常为 <code>.../anthropic</code> + <code>/v1/messages</code>）。</p>
</blockquote>
<p>DeepSeek（示例）：</p>
<pre><code class="language-bash">export ANTHROPIC_AUTH_TOKEN=sk-your-deepseek-key
export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
export ANTHROPIC_MODEL=deepseek-chat
</code></pre>
<p>智谱 GLM（示例）：</p>
<pre><code class="language-bash">export ANTHROPIC_AUTH_TOKEN=your_zhipu_api_key
export ANTHROPIC_BASE_URL=https://open.bigmodel.cn/api/anthropic
export ANTHROPIC_DEFAULT_SONNET_MODEL=glm-4.6
export ANTHROPIC_DEFAULT_HAIKU_MODEL=glm-4.5-air
</code></pre>
<hr>
<h2>4. 交互基础（核心用法）</h2>
<h3>4.1 <code>@file</code> 引用文件</h3>
<p>在输入中用 <code>@</code> 触发路径补全并引用文件。</p>
<h3>4.2 <code>!cmd</code> 直接跑命令</h3>
<p>在输入行以 <code>!</code> 开头执行命令并把输出带入上下文：</p>
<pre><code class="language-text">!git status
!npm test
</code></pre>
<h3>4.3 会话续跑</h3>
<pre><code class="language-bash">claude -c
claude -r &quot;session-id-or-name&quot; &quot;prompt&quot;
</code></pre>
<hr>
<h2>5. 配置体系（settings / 作用域）</h2>
<p>Claude Code 的设置有 scope，优先级：Managed &gt; CLI args &gt; Local &gt; Project &gt; User。</p>
<h3>5.1 Settings 文件</h3>
<table>
<thead>
<tr>
<th style="text-align:left">Scope</th>
<th style="text-align:left">文件</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">User</td>
<td style="text-align:left"><code>~/.claude/settings.json</code></td>
<td style="text-align:left">个人全局设置</td>
</tr>
<tr>
<td style="text-align:left">Project</td>
<td style="text-align:left"><code>.claude/settings.json</code></td>
<td style="text-align:left">团队共享（建议提交 git）</td>
</tr>
<tr>
<td style="text-align:left">Local</td>
<td style="text-align:left"><code>.claude/settings.local.json</code></td>
<td style="text-align:left">个人覆盖（通常 gitignore）</td>
</tr>
<tr>
<td style="text-align:left">Managed</td>
<td style="text-align:left"><code>managed-settings.json</code></td>
<td style="text-align:left">组织级强制策略（系统目录下发）</td>
</tr>
</tbody>
</table>
<h3>5.2 状态与 MCP</h3>
<ul>
<li><code>~/.claude.json</code>：偏好、OAuth 会话、用户/本地 MCP、每项目状态与缓存等。</li>
<li><code>.mcp.json</code>：项目级 MCP（适合提交 git）。</li>
</ul>
<h3>5.3 记忆文件 (<a href="http://CLAUDE.md">CLAUDE.md</a>)</h3>
<ul>
<li>项目：<code>CLAUDE.md</code> 或 <code>.claude/CLAUDE.md</code></li>
<li>本地：<code>CLAUDE.local.md</code></li>
</ul>
<hr>
<h2>6. 权限控制（最小模板）</h2>
<p>在项目内创建 <code>.claude/settings.json</code>：</p>
<pre><code class="language-json">{
  &quot;$schema&quot;: &quot;https://json.schemastore.org/claude-code-settings.json&quot;,
  &quot;permissions&quot;: {
    &quot;allow&quot;: [
      &quot;Bash(npm run *)&quot;,
      &quot;Bash(pnpm *)&quot;,
      &quot;Bash(yarn *)&quot;,
      &quot;Bash(git status)&quot;,
      &quot;Bash(git diff *)&quot;
    ],
    &quot;deny&quot;: [
      &quot;Read(./.env)&quot;,
      &quot;Read(./.env.*)&quot;,
      &quot;Read(./secrets/**)&quot;
    ]
  }
}
</code></pre>
<hr>
<h2>7. MCP（模型上下文协议）</h2>
<p>常用命令：</p>
<pre><code class="language-bash">claude mcp list
claude mcp get github
claude mcp remove github
</code></pre>
<p>添加远程 HTTP server：</p>
<pre><code class="language-bash">claude mcp add --transport http notion https://mcp.notion.com/mcp
</code></pre>
<p>添加本地 stdio server：</p>
<pre><code class="language-bash">claude mcp add --transport stdio airtable --env AIRTABLE_API_KEY=YOUR_KEY \
  -- npx -y airtable-mcp-server
</code></pre>
<hr>
<h2>8. Skills / Agents / Rules</h2>
<h3>8.1 Skills（技能系统）</h3>
<p>技能文件：<code>.claude/skills/&lt;skill-name&gt;/SKILL.md</code>（项目级）或 <code>~/.claude/skills/&lt;skill-name&gt;/SKILL.md</code>（全局）。</p>
<p>最小模板：</p>
<pre><code class="language-markdown">---
name: review
description: Review changes with a strict checklist
disable-model-invocation: true
---

1. 运行 `!git diff` 并总结风险点。
2. 检查是否有 secrets / 破坏性变更。
3. 给出可执行的修复建议。
</code></pre>
<p>使用：在 Claude Code 里输入 <code>/review</code>。</p>
<blockquote>
<p>兼容说明：旧的 <code>.claude/commands/*.md</code> 仍可用；同名 skill 会优先于 command。</p>
</blockquote>
<h3>8.2 Subagents（子代理）</h3>
<p><code>/agents</code> 管理子代理（Project: <code>.claude/agents/</code>，User: <code>~/.claude/agents/</code>）。内置常用：Explore（只读搜索）、Plan（plan mode 辅助）。</p>
<p>最小示例：</p>
<pre><code class="language-markdown">---
name: code-reviewer
description: Proactively review code for quality and security
tools: Read, Glob, Grep, Bash
model: sonnet
---

Review changes. Focus on security, correctness, and edge cases.
</code></pre>
<h3>8.3 Rules / Memory（<a href="http://CLAUDE.md">CLAUDE.md</a> + .claude/rules）</h3>
<p>启动时加载 <code>CLAUDE.md</code>（含 <code>~/.claude/CLAUDE.md</code>），并加载 <code>.claude/rules/*.md</code> 作为模块化规则。</p>
<p>常用结构：</p>
<pre><code class="language-text">./CLAUDE.md
./CLAUDE.local.md
./.claude/CLAUDE.md
./.claude/rules/*.md
~/.claude/CLAUDE.md
</code></pre>
<p>路径规则（可选）：</p>
<pre><code class="language-markdown">---
paths:
  - &quot;src/api/**/*.ts&quot;
---

- API 统一返回结构 ...
</code></pre>
<h3>8.4 Hooks / Plugins（可选）</h3>
<p>Hooks：用 <code>/hooks</code> 配置，写入 <code>settings.json</code> 的 <code>hooks</code> 字段；常用于格式化、阻止危险命令、在 compaction 后补充上下文。</p>
<p>Plugins：用于打包分发 skills/agents/hooks/MCP。</p>
<ul>
<li>入口：插件目录下 <code>.claude-plugin/plugin.json</code></li>
<li>本地调试：<code>claude --plugin-dir ./my-plugin</code></li>
</ul>
<p>补充：</p>
<ul>
<li>官方 Anthropic marketplace <code>claude-plugins-official</code> 现在默认可直接使用。</li>
<li>安装/启用/禁用插件后，可执行 <code>/reload-plugins</code> 无需重启会话。</li>
<li>例如安装官方 GitHub 插件：</li>
</ul>
<pre><code class="language-text">/plugin install github@claude-plugins-official
</code></pre>
<hr>
<h2>9. 常用 CLI 形态（速查）</h2>
<pre><code class="language-bash">claude                 # 交互式 REPL
claude &quot;query&quot;        # 带初始 prompt 进入 REPL
claude -p &quot;query&quot;     # 只打印结果（适合脚本）
cat file | claude -p &quot;query&quot;
</code></pre>
<hr>
<h2>10. 常用环境变量（速查）</h2>
<p>这些也可以写进 <code>settings.json</code> 的 <code>env</code> 字段。</p>
<table>
<thead>
<tr>
<th style="text-align:left">变量</th>
<th style="text-align:left">用途</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ANTHROPIC_API_KEY</code></td>
<td style="text-align:left">API Key（<code>X-Api-Key</code>）</td>
</tr>
<tr>
<td style="text-align:left"><code>ANTHROPIC_AUTH_TOKEN</code></td>
<td style="text-align:left">Bearer token（<code>Authorization</code>）</td>
</tr>
<tr>
<td style="text-align:left"><code>ANTHROPIC_MODEL</code></td>
<td style="text-align:left">默认模型（alias 或 model name）</td>
</tr>
<tr>
<td style="text-align:left"><code>ANTHROPIC_BASE_URL</code></td>
<td style="text-align:left">LLM gateway / 代理 base URL（Anthropic Messages 格式）</td>
</tr>
<tr>
<td style="text-align:left"><code>ANTHROPIC_DEFAULT_OPUS_MODEL</code></td>
<td style="text-align:left">覆盖 <code>opus</code> 的默认模型名</td>
</tr>
<tr>
<td style="text-align:left"><code>ANTHROPIC_DEFAULT_SONNET_MODEL</code></td>
<td style="text-align:left">覆盖 <code>sonnet</code> 的默认模型名</td>
</tr>
<tr>
<td style="text-align:left"><code>ANTHROPIC_DEFAULT_HAIKU_MODEL</code></td>
<td style="text-align:left">覆盖 <code>haiku</code> 的默认模型名（<code>ANTHROPIC_SMALL_FAST_MODEL</code> 已 deprecated）</td>
</tr>
<tr>
<td style="text-align:left"><code>ANTHROPIC_CUSTOM_HEADERS</code></td>
<td style="text-align:left">给所有请求追加自定义 HTTP header</td>
</tr>
<tr>
<td style="text-align:left"><code>HTTP_PROXY</code> / <code>HTTPS_PROXY</code> / <code>NO_PROXY</code></td>
<td style="text-align:left">代理配置</td>
</tr>
<tr>
<td style="text-align:left"><code>CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1</code></td>
<td style="text-align:left">同时关闭自动更新/遥测/错误上报等非必要流量</td>
</tr>
<tr>
<td style="text-align:left"><code>NODE_EXTRA_CA_CERTS</code></td>
<td style="text-align:left">追加企业 CA 证书（代理/网关环境常用）</td>
</tr>
<tr>
<td style="text-align:left"><code>CLAUDE_CODE_CLIENT_CERT</code> / <code>CLAUDE_CODE_CLIENT_KEY</code></td>
<td style="text-align:left">mTLS 客户端证书/私钥</td>
</tr>
<tr>
<td style="text-align:left"><code>DISABLE_AUTOUPDATER=1</code></td>
<td style="text-align:left">关闭自动更新</td>
</tr>
<tr>
<td style="text-align:left"><code>CLAUDE_CONFIG_DIR</code></td>
<td style="text-align:left">自定义配置与数据目录</td>
</tr>
<tr>
<td style="text-align:left"><code>MCP_TIMEOUT</code> / <code>MCP_TOOL_TIMEOUT</code></td>
<td style="text-align:left">MCP 启动/执行超时（ms）</td>
</tr>
<tr>
<td style="text-align:left"><code>MAX_MCP_OUTPUT_TOKENS</code></td>
<td style="text-align:left">MCP 输出 token 上限</td>
</tr>
<tr>
<td style="text-align:left"><code>ENABLE_TOOL_SEARCH</code></td>
<td style="text-align:left">MCP tool search（<code>auto</code>/<code>auto:N</code>/<code>true</code>/<code>false</code>）</td>
</tr>
<tr>
<td style="text-align:left"><code>CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1</code></td>
<td style="text-align:left">禁用后台任务</td>
</tr>
<tr>
<td style="text-align:left"><code>CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false</code></td>
<td style="text-align:left">关闭输入框提示补全</td>
</tr>
<tr>
<td style="text-align:left"><code>BASH_DEFAULT_TIMEOUT_MS</code> / <code>BASH_MAX_TIMEOUT_MS</code></td>
<td style="text-align:left">Bash 默认/最大超时（ms）</td>
</tr>
</tbody>
</table>
<hr>
<h2>11. Windows 备注</h2>
<ul>
<li>原生 Windows 运行：官方建议使用 Git Bash 或 WSL。</li>
<li>Git Bash 路径可用环境变量指定：</li>
</ul>
<pre><code class="language-powershell">$env:CLAUDE_CODE_GIT_BASH_PATH=&quot;C:\Program Files\Git\bin\bash.exe&quot;
</code></pre>
<ul>
<li>本地 MCP 若依赖 <code>npx</code>，可能需要 <code>cmd /c</code> 包一层（详见 MCP 文档 Windows Warning）。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Cockpit Tools</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/cockpit-tools</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/cockpit-tools</guid>
    <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    <description>1. Cockpit Tools 是什么 Github Repo https://github.com/jlcodes99/cockpit-tools Cockpit Tools 是一个 通用 AI IDE 账号管理工具 。它不是新的 AI IDE，也不是新的 CLI，而是一个桌面侧“账号中控台”： 管理多平台 AI IDE 账号 查看配额/重置时间 一键切换当前活跃账号 支持部分平台多开实例并行工作 提供本地 WebSocket / 插件集成能力 截至 2026-04-13</description>
      <content:encoded><![CDATA[<h1>Cockpit Tools 使用指南</h1>
<h2>1. Cockpit Tools 是什么</h2>
<p><a href="https://github.com/jlcodes99/cockpit-tools">Github Repo</a></p>
<p>Cockpit Tools 是一个<strong>通用 AI IDE 账号管理工具</strong>。它不是新的 AI IDE，也不是新的 CLI，而是一个桌面侧“账号中控台”：</p>
<ul>
<li>管理多平台 AI IDE 账号</li>
<li>查看配额/重置时间</li>
<li>一键切换当前活跃账号</li>
<li>支持部分平台多开实例并行工作</li>
<li>提供本地 WebSocket / 插件集成能力</li>
</ul>
<blockquote>
<p>截至 <strong>2026-04-13</strong>，我已用 <code>gh api repos/jlcodes99/cockpit-tools/releases/latest</code> 直接核对：最新 GitHub release 为 <strong>v0.21.2（2026-04-13）</strong>。</p>
</blockquote>
<p>仓库当前 README 显示，已经不再只是早期的 Antigravity / Codex 工具，而是扩展为支持：</p>
<ul>
<li>Antigravity</li>
<li>Codex</li>
<li>GitHub Copilot</li>
<li>Windsurf</li>
<li>Kiro</li>
<li>Cursor</li>
<li>Gemini Cli</li>
<li>CodeBuddy</li>
<li>CodeBuddy CN</li>
<li>Qoder</li>
<li>Trae</li>
<li>Zed</li>
</ul>
<p>补充：</p>
<ul>
<li>它本身并不直接“管理 OpenCode 账号”</li>
<li>但 README 中已经出现 <strong>OpenCode App Path</strong> 与 <strong>Codex 切号后自动重启 OpenCode</strong> 的联动设置，说明它开始兼顾 OpenCode 生态的实际配套需求</li>
</ul>
<hr>
<h2>2. 安装与更新</h2>
<blockquote>
<p>当前 README 明确把 <strong>手动下载 Releases 包</strong> 作为推荐安装方式；Homebrew 主要是 macOS 方案，Arch Linux 额外提供 AUR。</p>
</blockquote>
<h3>2.1 手动下载（推荐）</h3>
<p>前往：</p>
<ul>
<li><a href="https://github.com/jlcodes99/cockpit-tools/releases">GitHub Releases</a></li>
</ul>
<p>常见安装包：</p>
<ul>
<li>macOS：<code>.dmg</code>（Apple Silicon / Intel）</li>
<li>Windows：<code>.msi</code>（推荐）或 <code>.exe</code></li>
<li>Linux：<code>.deb</code>、<code>.rpm</code> 或 <code>.AppImage</code></li>
</ul>
<h3>2.2 macOS（Homebrew）</h3>
<pre><code class="language-bash">brew tap jlcodes99/cockpit-tools https://github.com/jlcodes99/cockpit-tools
brew install --cask cockpit-tools
</code></pre>
<p>如果遇到 macOS “App is damaged”：</p>
<pre><code class="language-bash">brew install --cask --no-quarantine cockpit-tools
</code></pre>
<p>如果提示应用已存在：</p>
<pre><code class="language-bash">rm -rf &quot;/Applications/Cockpit Tools.app&quot;
brew install --cask cockpit-tools
</code></pre>
<p>或者直接强制覆盖：</p>
<pre><code class="language-bash">brew install --cask --force cockpit-tools
</code></pre>
<h3>2.3 Arch Linux（AUR）</h3>
<pre><code class="language-bash"># 源码构建包
yay -S cockpit-tools

# 预编译二进制包
yay -S cockpit-tools-bin
</code></pre>
<blockquote>
<p>仓库 README 当前写的是 <code>yay</code> 示例，但按 AUR 习惯，<code>paru</code> 同样可用。</p>
</blockquote>
<h3>2.4 macOS 打不开（额外修复）</h3>
<pre><code class="language-bash">sudo xattr -rd com.apple.quarantine &quot;/Applications/Cockpit Tools.app&quot;
</code></pre>
<hr>
<h2>3. 快速上手</h2>
<h3>3.1 第一次启动后先做什么</h3>
<p>建议顺序：</p>
<ol>
<li>打开 Cockpit Tools</li>
<li>先进入 Settings</li>
<li>检查各平台的可执行路径是否自动识别成功</li>
<li>再添加/导入账号</li>
<li>最后按平台启用自动刷新或 WebSocket 集成</li>
</ol>
<h3>3.2 核心使用流</h3>
<p>以 Codex / Antigravity / Copilot 这类平台为例，Cockpit Tools 的典型用法是：</p>
<ol>
<li>导入账号（OAuth / Token / JSON / 本地状态导入，具体取决于平台）</li>
<li>查看当前账号配额与 reset time</li>
<li>在账号列表里切换活跃账号</li>
<li>如有需要，直接启动对应平台客户端</li>
<li>如果你有多项目并行需求，再启用多实例</li>
</ol>
<h3>3.3 Dashboard（总览页）</h3>
<p>当前 README 里 Dashboard 的定位很明确：</p>
<ul>
<li>多平台账号状态总览</li>
<li>配额与重置时间可视化</li>
<li>一键刷新</li>
<li>一键唤醒</li>
<li>统一进度条视图</li>
</ul>
<p>如果你手里账号很多，Cockpit Tools 的价值主要就在这里：<br>
把原本分散在多个 IDE / CLI / 浏览器页里的“账号状态”收拢到一个桌面面板里。</p>
<hr>
<h2>4. 核心能力</h2>
<h2>4.1 多账号切换</h2>
<p>这是最核心的能力。</p>
<p>不同平台支持的导入方式略有不同，但总体上都围绕：</p>
<ul>
<li>OAuth</li>
<li>Token / JSON 导入</li>
<li>本地登录态导入</li>
</ul>
<p>你不再需要手工反复替换本地配置文件，而是直接在桌面面板切号。</p>
<h2>4.2 配额监控</h2>
<p>仓库 README 当前强调的不是“只有账号切换”，而是：</p>
<ul>
<li>配额剩余量</li>
<li>reset time</li>
<li>plan 类型识别</li>
<li>某些平台的额外 credit / budget / cycle 信息</li>
</ul>
<p>这对多账号调度很关键，因为切号不是目的，<strong>配额可见性</strong>才是切号决策的依据。</p>
<h2>4.3 多实例并行</h2>
<p>当前 README 已明确支持多实例的平台包括：</p>
<ul>
<li>Antigravity</li>
<li>Codex</li>
<li>GitHub Copilot（VS Code 侧）</li>
<li>Windsurf</li>
<li>Kiro</li>
<li>Cursor</li>
<li>CodeBuddy</li>
<li>CodeBuddy CN</li>
<li>Qoder</li>
<li>Trae</li>
</ul>
<p>共同特征：</p>
<ul>
<li>每个实例可绑定不同账号</li>
<li>实例目录/用户数据目录隔离</li>
<li>可独立启动/停止/强制停止</li>
<li>适合同时跑多个项目</li>
</ul>
<p>这类设计的底层逻辑很简单：<br>
不是“让一个 IDE 支持多账号同时在线”，而是通过<strong>实例隔离</strong>把账号和项目运行时分开。</p>
<h2>4.4 唤醒任务（Wake-up Tasks）</h2>
<p>目前 README 里对 Antigravity 的支持最深，包括：</p>
<ul>
<li>唤醒任务</li>
<li>配额重置周期预热</li>
<li>设备指纹管理</li>
<li>多实例</li>
</ul>
<p>如果你主要是 Antigravity 用户，这块会是 Cockpit Tools 的重点价值区。</p>
<h2>4.5 本地 WebSocket / 插件集成</h2>
<p>README 明确提到：</p>
<ul>
<li>WebSocket 默认绑定 <code>127.0.0.1</code></li>
<li>默认端口 <code>19528</code></li>
<li>可在 Settings 中关闭或改端口</li>
</ul>
<p>这意味着 Cockpit Tools 不只是一个“手动点按钮”的桌面应用，也可以作为本地 companion service 被插件或扩展读取状态。</p>
<hr>
<h2>5. 配置与数据（你要知道它改了哪里）</h2>
<h2>5.1 本地数据存储</h2>
<p>README 当前写得比较直接：</p>
<ul>
<li><code>~/.antigravity_cockpit</code>：Antigravity 账号、配置、WebSocket 状态等</li>
<li><code>~/.codex</code>：Codex 官方当前登录态（如 <code>auth.json</code>）</li>
<li><code>~/.gemini</code>：Gemini Cli 本地 session 文件</li>
<li>本地应用数据目录 <code>com.antigravity.cockpit-tools</code>：多平台索引数据等</li>
</ul>
<p>这说明它不是“纯展示工具”，而是<strong>真实会写本地状态</strong>的账号管理器。</p>
<h2>5.2 常见设置项</h2>
<p>README 的设置说明里，当前最值得记住的几类：</p>
<ul>
<li>显示语言 / 主题</li>
<li>关闭窗口行为</li>
<li>各平台自动刷新间隔</li>
<li>数据目录</li>
<li>各平台 App Path</li>
<li>WebSocket 开关与端口</li>
<li>OpenCode App Path</li>
<li>Codex 切号后自动重启 OpenCode</li>
</ul>
<p>补充：<code>v0.21.2</code> 新增了<strong>本地备份/导入包</strong>与<strong>备份管理器</strong>，也就是现在可以在设置页里做“仅账号 / 仅配置 / 两者一起”的备份与恢复。</p>
<h3>5.3 建议的默认策略</h3>
<p>如果你只是想稳定用，不想折腾：</p>
<ul>
<li>自动刷新：<code>5-10</code> 分钟</li>
<li>WebSocket：不用插件就关闭</li>
<li>App Path：优先让它自动识别</li>
<li>多实例：有明确并行项目需求再开</li>
</ul>
<hr>
<h2>6. 安全与风险</h2>
<p>Cockpit Tools 当前 README 的安全表述核心是：</p>
<ul>
<li>这是本地桌面工具，不是云端托管服务</li>
<li>主要数据保存在你的机器上</li>
<li>开网络主要发生在 OAuth、刷新 token、拉取配额、检查更新等场景</li>
</ul>
<p>实战建议：</p>
<ul>
<li>不需要插件联动时，关闭 WebSocket</li>
<li>不要直接分享完整用户目录</li>
<li>备份时先处理 token / auth 文件</li>
<li>在公用电脑上使用后及时移除账号并退出</li>
</ul>
<hr>
<h2>7. FAQ（常见问题）</h2>
<h3>7.1 这和 CC Switch 的区别是什么？</h3>
<p>两者都属于“多工具账号/配置管理”方向，但 Cockpit Tools 当前更偏：</p>
<ul>
<li>桌面总控台</li>
<li>配额可视化</li>
<li>多实例并行</li>
<li>对 Antigravity / Codex / Copilot / Windsurf / Kiro / Cursor 等平台的账号管理</li>
</ul>
<p>如果你的核心诉求是“多账号调度 + 配额总览 + 平台多开”，Cockpit Tools 更贴近这个方向。</p>
<h3>7.2 它支持 OpenCode 吗？</h3>
<p>严格说，当前 README 里它的主支持对象不是 OpenCode 账号本身。<br>
但已经能看到：</p>
<ul>
<li><code>OpenCode App Path</code></li>
<li><code>Auto-restart OpenCode on Codex switch</code></li>
</ul>
<p>所以更准确的说法是：<strong>它主要管理 Codex 等账号，但已经开始兼容 OpenCode 联动场景。</strong></p>
<h3>7.3 WebSocket 要不要开？</h3>
<p>如果你不用本地插件集成，建议默认关闭。<br>
理由很简单：减少常驻暴露面，也减少无意义的后台占用。</p>
<h3>7.4 多实例适合什么场景？</h3>
<p>适合：</p>
<ul>
<li>多个项目并行</li>
<li>多账号隔离运行</li>
<li>测试不同环境/不同额度账号</li>
</ul>
<p>不适合：</p>
<ul>
<li>只偶尔切一次账号</li>
<li>不需要同时开多个 IDE / CLI</li>
</ul>
<hr>
<h2>8. 参考链接</h2>
<pre><code class="language-text">https://github.com/jlcodes99/cockpit-tools
https://github.com/jlcodes99/cockpit-tools/releases
https://github.com/jlcodes99/cockpit-tools#readme
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>OpenCode</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/opencode</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/opencode</guid>
    <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    <description>1. OpenCode 是什么 Github Repo https://github.com/anomalyco/opencode OpenCode（命令通常为 opencode ）是一个面向代码库的 AI 编码agent 截至 2026-04-13 ，GitHub 发布页显示的最新版本为 v1.4.3（2026-04-10） 。</description>
      <content:encoded><![CDATA[<h1>OpenCode 使用指南</h1>
<h2>1. OpenCode 是什么</h2>
<p><a href="https://github.com/anomalyco/opencode">Github Repo</a></p>
<p>OpenCode（命令通常为 <code>opencode</code>）是一个面向代码库的 AI 编码agent</p>
<blockquote>
<p>截至 <strong>2026-04-13</strong>，GitHub 发布页显示的最新版本为 <strong>v1.4.3（2026-04-10）</strong>。</p>
</blockquote>
<hr>
<h2>2. 安装与更新</h2>
<blockquote>
<p>下面按系统选择一种安装方式即可。</p>
</blockquote>
<h3>2.1 macOS / Linux</h3>
<h4>A. 官方安装脚本</h4>
<pre><code class="language-bash">curl -fsSL https://opencode.ai/install | bash
</code></pre>
<h4>B. Homebrew（推荐）</h4>
<pre><code class="language-bash">brew install anomalyco/tap/opencode
</code></pre>
<h4>C. Homebrew（官方 formula，更新通常比 tap 慢）</h4>
<pre><code class="language-bash">brew install opencode
</code></pre>
<h3>2.2 Arch Linux（Paru）</h3>
<pre><code class="language-bash">paru -S opencode-bin
</code></pre>
<p>如需稳定仓库版本，也可使用：</p>
<pre><code class="language-bash">sudo pacman -S opencode
</code></pre>
<h3>2.3 Windows</h3>
<h4>A. Chocolatey</h4>
<pre><code class="language-powershell">choco install opencode
</code></pre>
<h4>B. Scoop</h4>
<pre><code class="language-powershell">scoop install opencode
</code></pre>
<h4>C. NPM（推荐，全局安装）</h4>
<pre><code class="language-powershell">npm install -g opencode-ai
</code></pre>
<h3>2.4 其他安装方式</h3>
<pre><code class="language-bash">mise use -g opencode
nix run nixpkgs#opencode
</code></pre>
<h3>2.5 Desktop App（Beta）</h3>
<p>OpenCode 现在还提供桌面版应用，可从以下地址下载：</p>
<ul>
<li><a href="https://github.com/anomalyco/opencode/releases">GitHub Releases</a></li>
<li><a href="https://opencode.ai/download">opencode.ai/download</a></li>
</ul>
<blockquote>
<p>更新：使用你的包管理器进行更新（brew upgrade / choco upgrade / scoop update / npm update -g opencode-ai
等）。</p>
</blockquote>
<hr>
<h2>3. 快速开始</h2>
<blockquote>
<p>打开命令行窗口cmd</p>
</blockquote>
<h3>3.1 在项目目录启动</h3>
<pre><code class="language-bash">cd /path/to/your/project
opencode
</code></pre>
<p>也可以直接：</p>
<pre><code class="language-bash">opencode /path/to/your/project
</code></pre>
<p>启动后会进入终端交互界面（TUI）。</p>
<h3>3.2 连接模型（必须）</h3>
<p>在 TUI 输入：</p>
<pre><code class="language-text">/connect
</code></pre>
<p>按提示选择 provider，并填写/登录获取 API Key。</p>
<h3>3.2*第三方中转 / 代理 API（OpenAI-Compatible Relay）</h3>
<blockquote>
<p>适用场景：你使用的是“第三方中转/聚合/企业网关/LiteLLM/自建代理”等，提供 <strong>OpenAI 兼容</strong>的接口（通常是 <code>/v1</code> + <code>chat/completions</code> 风格）。</p>
</blockquote>
<p>OpenCode 的做法是：先在 <code>opencode.json/jsonc</code> 里把该中转服务配置成一个“自定义 Provider”,再在 TUI 用 <code>/connect</code> 保存 API Key（凭据）。</p>
<h5>B 第一步：在 opencode.json 中配置 baseURL + models</h5>
<p>在全局目录<code>$USER\.config\opencode</code>项目根目录创建/修改 <code>opencode.jsonc</code>：</p>
<pre><code class="language-jsonc">{
  &quot;$schema&quot;: &quot;https://opencode.ai/config.json&quot;,

  &quot;provider&quot;: {
    &quot;relay&quot;: {
      &quot;npm&quot;: &quot;@ai-sdk/openai-compatible&quot;,
      //claude就写@ai-sdk/anthropic
      &quot;name&quot;: &quot;My Relay (OpenAI-Compatible)&quot;,
      //名字随便取，后面对应地方也要修改
      &quot;options&quot;: {
        &quot;baseURL&quot;: &quot;https://你的中转域名/v1&quot;
      },
      &quot;models&quot;: {
        &quot;gpt-5.1&quot;: { &quot;name&quot;: &quot;GPT-5.2 (via relay)&quot; },
        //填写模型名称，后面的name是自定义的
        &quot;claude-sonnet-4-5&quot;: { &quot;name&quot;: &quot;Claude Sonnet 4.5 (via relay)&quot; }
      }
    }
  },

  &quot;model&quot;: &quot;My Relay (OpenAI-Compatible)/GPT-5.2&quot;
  //选择你进入页面后的默认model
}
</code></pre>
<h5>B 第二步：在 TUI 里添加凭据（/connect → Other）</h5>
<ol>
<li>打开 TUI：<code>opencode</code></li>
<li>输入：<code>/connect</code></li>
<li>在列表输入你刚刚填写的名称，找到后并选择</li>
<li>输入你的中转 API Key（如 <code>sk-...</code>）</li>
</ol>
<p>配置完成后回到 TUI：</p>
<ul>
<li>输入 <code>/models</code>，你会看到 “My Relay (OpenAI-Compatible)” 下的模型并可切换。</li>
</ul>
<hr>
<h5>C) 第三步（可选）：如果中转需要“自定义 Header”而不是标准 Authorization</h5>
<p>有些中转不是 <code>Authorization: Bearer ...</code>，而是例如：</p>
<ul>
<li><code>api-key: xxx</code></li>
<li><code>X-API-Key: xxx</code></li>
<li><code>Authorization: Bearer &lt;自定义token&gt;</code></li>
</ul>
<p>这时你可以在 <code>options.headers</code> 里加自定义头。官方示例支持 <code>options.headers</code>。</p>
<p>示例（把 Key 放在环境变量里更安全）：</p>
<pre><code class="language-jsonc">{
  &quot;$schema&quot;: &quot;https://opencode.ai/config.json&quot;,
  &quot;provider&quot;: {
    &quot;relay&quot;: {
      &quot;npm&quot;: &quot;@ai-sdk/openai-compatible&quot;,
      &quot;name&quot;: &quot;My Relay&quot;,
      &quot;options&quot;: {
        &quot;baseURL&quot;: &quot;https://你的中转域名/v1&quot;,
        &quot;headers&quot;: {
          &quot;api-key&quot;: &quot;{env:RELAY_API_KEY}&quot;
        }
      },
      &quot;models&quot;: {
        &quot;gpt-4.1&quot;: { &quot;name&quot;: &quot;GPT-4.1 (relay)&quot; }
      }
    }
  },
  &quot;model&quot;: &quot;relay/gpt-4.1&quot;
}
</code></pre>
<p>然后在 shell 中设置环境变量（举例）：</p>
<ul>
<li>
<p>macOS/Linux：</p>
<pre><code class="language-bash">export RELAY_API_KEY=&quot;你的key&quot;
</code></pre>
</li>
<li>
<p>Windows PowerShell：</p>
<pre><code class="language-powershell">setx RELAY_API_KEY &quot;你的key&quot;
</code></pre>
</li>
</ul>
<blockquote>
<p>官方也给出了 <code>options.apiKey</code> 与 <code>env</code> 变量写法、以及 headers 的示例，你可以按自己的中转要求选择：</p>
<ul>
<li>如果你已用 <code>/connect</code> 存了 key，通常不必再写 <code>options.apiKey</code>；</li>
<li>如果你的中转只认自定义 header（例如 <code>api-key</code>），就按上面这样在 <code>headers</code> 里显式设置。</li>
</ul>
</blockquote>
<h3>3.3 列出并切换模型</h3>
<p>在 TUI 输入：</p>
<pre><code class="language-text">/models
</code></pre>
<p>然后选择你要用的模型（通常会显示 provider/model）。</p>
<h3>3.4 项目初始化</h3>
<p>在 TUI 输入：</p>
<pre><code class="language-text">/init
</code></pre>
<p>它会生成（或更新）当前目录下的<code>AGENTS.md</code>，用于帮助 OpenCode 更快理解项目结构与约定。建议提交到 Git。</p>
<p>补充：当前官方文档对 <code>/init</code> 的描述更接近“<strong>引导式创建/更新 <code>AGENTS.md</code></strong>”。</p>
<hr>
<h2>4. TUI 交互基础（核心用法）</h2>
<h3>4.1 会话与上下文</h3>
<ul>
<li>OpenCode 会把对话当作“会话（session）”来管理</li>
<li>你可以随时切换/恢复不同会话，避免不同任务互相污染上下文</li>
</ul>
<p>常用命令：</p>
<pre><code class="language-text">/sessions
</code></pre>
<hr>
<h3>4.2 引用文件 <code>@file</code></h3>
<p>在消息里使用 <code>@</code> 搜索并引用文件/路径，让模型把文件内容加入上下文。</p>
<p>示例：</p>
<pre><code class="language-text">请解释 @src/auth/index.ts 的认证流程，并指出入口函数与调用链。
</code></pre>
<p>建议用法：</p>
<ul>
<li>先让它概览，再逐个 <code>@</code> 关键文件深挖</li>
<li>大文件优先引用关键片段所在文件或模块</li>
</ul>
<hr>
<h3>4.3 执行命令 <code>!cmd</code></h3>
<p>在消息中以 <code>!</code> 开头，OpenCode 会执行 shell 命令并把输出带回对话。</p>
<p>示例：</p>
<pre><code class="language-text">!npm test
</code></pre>
<p>常见用途：</p>
<ul>
<li>复现 bug：<code>!pytest -q</code> / <code>!npm test</code> / <code>!go test ./...</code></li>
<li>运行 linter：<code>!eslint .</code> / <code>!ruff check .</code></li>
<li>打印目录结构：<code>!ls -la</code> / <code>!tree -L 3</code></li>
</ul>
<blockquote>
<p>强烈建议配合“权限控制”使用（见 6.3）。</p>
</blockquote>
<hr>
<h3>4.4 常用斜杠命令 <code>/...</code></h3>
<p>以下命令在 TUI 里输入即可（括号内为常用别名）：</p>
<ul>
<li><code>/help</code>：显示帮助对话框</li>
<li><code>/connect</code>：连接/管理 provider 凭据</li>
<li><code>/models</code>：列出与切换模型</li>
<li><code>/sessions</code> (<code>/resume</code>, <code>/continue</code>)：列出/切换历史会话</li>
<li><code>/new</code> (<code>/clear</code>)：开启全新会话</li>
<li><code>/init</code>：生成/更新 <code>AGENTS.md</code></li>
<li><code>/compact</code> (<code>/summarize</code>)：压缩当前会话（总结长上下文以节省 Token）</li>
<li><code>/undo</code>：撤销上一次代码修改（依赖 Git）</li>
<li><code>/redo</code>：重做撤销的修改</li>
<li><code>/share</code> / <code>/unshare</code>：分享/取消分享当前会话</li>
<li><code>/editor</code>：调用外部编辑器（如 VS Code）编写长输入</li>
<li><code>/export</code>：将对话导出为 Markdown 文件</li>
<li><code>/details</code>：切换工具执行细节显示</li>
<li><code>/thinking</code>：切换思考内容显示</li>
<li><code>/themes</code>：切换界面主题</li>
<li><code>/exit</code> (<code>/quit</code>, <code>/q</code>)：退出</li>
</ul>
<hr>
<h3>4.5 快捷键大全（核心效率）</h3>
<p>OpenCode 使用 <strong>Leader 键</strong>（默认 <code>Ctrl+x</code>）来触发快速操作：</p>
<table>
<thead>
<tr>
<th style="text-align:left">快捷键</th>
<th style="text-align:left">功能</th>
<th style="text-align:left">快捷键</th>
<th style="text-align:left">功能</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Ctrl+x n</strong></td>
<td style="text-align:left">开启新会话</td>
<td style="text-align:left"><strong>Ctrl+x u</strong></td>
<td style="text-align:left">撤销修改</td>
</tr>
<tr>
<td style="text-align:left"><strong>Ctrl+x l</strong></td>
<td style="text-align:left">列出历史会话</td>
<td style="text-align:left"><strong>Ctrl+x r</strong></td>
<td style="text-align:left">重做修改</td>
</tr>
<tr>
<td style="text-align:left"><strong>Ctrl+x m</strong></td>
<td style="text-align:left">切换模型</td>
<td style="text-align:left"><strong>Ctrl+x s</strong></td>
<td style="text-align:left">分享会话</td>
</tr>
<tr>
<td style="text-align:left"><strong>Ctrl+x i</strong></td>
<td style="text-align:left">初始化项目</td>
<td style="text-align:left"><strong>Ctrl+x e</strong></td>
<td style="text-align:left">外部编辑器</td>
</tr>
<tr>
<td style="text-align:left"><strong>Ctrl+x t</strong></td>
<td style="text-align:left">切换主题</td>
<td style="text-align:left"><strong>Ctrl+x q</strong></td>
<td style="text-align:left">退出</td>
</tr>
<tr>
<td style="text-align:left"><strong>Ctrl+x b</strong></td>
<td style="text-align:left">切换侧边栏</td>
<td style="text-align:left"><strong>Ctrl+x y</strong></td>
<td style="text-align:left">复制消息</td>
</tr>
<tr>
<td style="text-align:left"><strong>Ctrl+x a</strong></td>
<td style="text-align:left">Agent 列表</td>
<td style="text-align:left"><strong>Ctrl+x g</strong></td>
<td style="text-align:left">会话时间线</td>
</tr>
</tbody>
</table>
<p><strong>基础操作与导航：</strong></p>
<ul>
<li><code>Tab</code> / <code>Shift+Tab</code>：在 <strong>Plan（规划）</strong> 与 <strong>Build（构建）</strong> 模式间切换。</li>
<li><code>Ctrl+x →</code> / <code>Ctrl+x ←</code>：在 <strong>父会话</strong> 与 <strong>子会话</strong>（由 <code>@general</code> 等触发）之间快速切换。</li>
<li><code>Shift+Enter</code> / <code>Ctrl+j</code>：在输入框内换行。</li>
<li><code>PgUp</code> / <code>PgDown</code>：向上/下翻页。</li>
<li><code>Ctrl+Alt+u</code> / <code>Ctrl+Alt+d</code>：向上/下翻 <strong>半页</strong>。</li>
<li><code>Home</code> / <code>End</code>：跳至对话最顶部或最底部。</li>
<li><code>Escape</code>：中断当前的 AI 输出。</li>
</ul>
<hr>
<h2>5. Agent 模式与子代理</h2>
<p>OpenCode 并非单一的对话框，它通过不同的 Agent 协同工作。</p>
<h3>5.1 Plan vs Build 模式</h3>
<ul>
<li><strong>Plan Mode (🧠)</strong>：<strong>只分析，不改代码</strong>。适合架构设计、逻辑推演或大规模重构前的方案评估。</li>
<li><strong>Build Mode (🔨)</strong>：<strong>直接修改文件</strong>。根据指令进行编码、修复 Bug。</li>
<li><strong>最佳实践</strong>：复杂任务先在 Plan 模式确认方案，满意后再切到 Build 模式说“开始执行”。</li>
</ul>
<h3>5.2 子代理（Subagents）</h3>
<p>在对话中使用 <code>@</code> 可以召唤特定功能的子代理：</p>
<ul>
<li><strong><code>@general</code></strong>：用于处理需要多步推理、跨文件搜索的复杂任务。
<ul>
<li><em>示例</em>：“@general 在整个项目中搜索所有使用了 localStorage 的地方并总结用途。”</li>
<li><em>示例</em>：“@general 分析项目依赖，找出是否存在循环引用。”</li>
</ul>
</li>
</ul>
<blockquote>
<p>补充：当前官方 README 明确写出的内置子代理是 <code>@general</code>；<code>@explore</code> 不再适合作为“稳定内置能力”来介绍。</p>
</blockquote>
<hr>
<h2>6. 基本流程（固定）</h2>
<ol>
<li>cmd <code>opencode</code> 或者vscode opencode 扩展（推荐）启动 TUI</li>
<li><code>/connect</code> 连接 provider（填 key 或登录）</li>
<li><code>/models</code> 选择模型</li>
<li><code>/init</code> 更新 <a href="http://AGENTS.md">AGENTS.md</a></li>
<li><code>/sessions</code> 选择历史对话</li>
<li><code>/new</code> 新对话</li>
</ol>
<hr>
<h2>6. 配置体系（opencode.json/jsonc）</h2>
<p>OpenCode 支持项目级与全局配置文件：</p>
<ul>
<li><code>opencode.json</code></li>
<li><code>opencode.jsonc</code>（允许注释，推荐）</li>
</ul>
<hr>
<h3>6.1 配置加载顺序</h3>
<p>常见的覆盖逻辑（后者覆盖前者的冲突项）：</p>
<ol>
<li>组织级默认（远程）</li>
<li>全局配置（如 <code>~/.config/opencode/opencode.json</code>）</li>
<li>环境变量指定 <code>OPENCODE_CONFIG</code></li>
<li>项目根目录 <code>opencode.json</code>/<code>opencode.jsonc</code></li>
<li>项目 <code>.opencode/</code> 下的 agents/commands/plugins 等扩展内容（如你使用了）</li>
</ol>
<blockquote>
<p>建议：团队统一的默认策略放全局或组织层；项目特殊策略放项目根。</p>
</blockquote>
<hr>
<h3>6.2 常用配置项</h3>
<p>在项目根创建 <code>opencode.jsonc</code>：</p>
<pre><code class="language-jsonc">{
  &quot;$schema&quot;: &quot;https://opencode.ai/config.json&quot;,

  // 默认使用的主模型
  &quot;model&quot;: &quot;anthropic/claude-sonnet-4-5&quot;,

  // 工具权限（建议先保守，逐步放开）
  &quot;permission&quot;: {
    &quot;edit&quot;: &quot;ask&quot;,
    &quot;bash&quot;: &quot;ask&quot;,
    &quot;webfetch&quot;: &quot;allow&quot;
  }
}
</code></pre>
<h3>6.3 权限控制（强烈建议启用）</h3>
<p>OpenCode 常见高风险能力：</p>
<ul>
<li>写入/修改文件（edit）</li>
<li>执行命令（bash）</li>
<li>网络抓取（webfetch）</li>
</ul>
<p>建议在初期把关键权限设为 <code>ask</code>：</p>
<ul>
<li><code>allow</code>：允许自动执行</li>
<li><code>deny</code>：禁止</li>
<li><code>ask</code>：每次执行前询问（推荐默认）</li>
</ul>
<p>团队项目建议：</p>
<ul>
<li><code>bash</code> 默认 <code>ask</code>，避免误删/误改环境</li>
<li><code>edit</code> 默认 <code>ask</code>，避免大范围变更未审</li>
<li><code>webfetch</code> 可 <code>allow</code> 或 <code>ask</code>（看你是否允许拉取外部信息）</li>
</ul>
<h2>7.Rules (规则系统)</h2>
<p>Rules 允许你通过 <code>AGENTS.md</code> 文件为项目定义长期遵循的指令（类似于 Cursor 的 <code>.cursorrules</code>）。</p>
<h3>7.1 <a href="http://AGENTS.md">AGENTS.md</a> 层级</h3>
<ol>
<li><strong>项目级</strong>：存放在项目根目录。仅对该项目生效。</li>
<li><strong>全局级</strong>：存放在 <code>~/.config/opencode/AGENTS.md</code>。对所有项目生效（适合存放个人编程偏好）。</li>
</ol>
<h3>7.2 引入外部规则</h3>
<p>在 <code>opencode.jsonc</code> 中，你可以通过 <code>instructions</code> 数组引用现有的 Markdown 文档作为规则：</p>
<pre><code class="language-jsonc">{
  &quot;instructions&quot;: [
    &quot;CONTRIBUTING.md&quot;,
    &quot;docs/coding-standards.md&quot;,
    &quot;.cursor/rules/*.md&quot; // 支持通配符导入 Cursor 规则
  ]
}
</code></pre>
<hr>
<h2>8.MCP (模型上下文协议)</h2>
<p>MCP 允许 OpenCode 挂载外部工具（如 Google Search, GitHub API, SQL 查询等）。</p>
<h3>8.1 本地 MCP 服务器</h3>
<p>在配置文件的 <code>mcp</code> 字段下定义：</p>
<pre><code class="language-jsonc">&quot;mcp&quot;: {
  &quot;my-local-tool&quot;: {
    &quot;type&quot;: &quot;local&quot;,
    &quot;command&quot;: [&quot;npx&quot;, &quot;-y&quot;, &quot;@modelcontextprotocol/server-everything&quot;],
    &quot;enabled&quot;: true
  }
}
</code></pre>
<h3>8.2 远程 MCP 服务器</h3>
<p>支持 OAuth 认证，初次使用时会在浏览器弹出授权：</p>
<pre><code class="language-jsonc">&quot;mcp&quot;: {
  &quot;sentry&quot;: {
    &quot;type&quot;: &quot;remote&quot;,
    &quot;url&quot;: &quot;https://mcp.sentry.dev/mcp&quot;,
    &quot;enabled&quot;: true
  }
}
</code></pre>
<hr>
<h2>9.SKILLS (技能系统)</h2>
<p>Skills 是可复用的指令片段，通过 <code>SKILL.md</code> 文件定义。代理会自动发现这些技能并按需加载。</p>
<h3>9.1 创建技能</h3>
<p>路径：<code>.opencode/skills/&lt;skill-name&gt;/SKILL.md</code></p>
<pre><code class="language-markdown">---
name: git-release
description: 用于起草标准化的 Git Release 说明和版本号更新建议
---
## 指令
1. 检查当前已合并的 PR。
2. 按照 SemVer 建议版本号。
3. 生成 gh release create 命令。
</code></pre>
<h3>9.2 权限管理</h3>
<p>你可以控制哪些技能被允许、拒绝或需要询问：</p>
<pre><code class="language-jsonc">&quot;permission&quot;: {
  &quot;skill&quot;: {
    &quot;git-release&quot;: &quot;allow&quot;,
    &quot;experimental-*&quot;: &quot;ask&quot;,
    &quot;*&quot;: &quot;deny&quot;
  }
}
</code></pre>
<hr>
<h2>10. 进阶指南与最佳实践</h2>
<h3>10.1 避坑与性能优化</h3>
<ul>
<li><strong>上下文超限</strong>：如果项目极大，务必使用 <code>/compact</code>。同时在 <code>opencode.jsonc</code> 中合理配置 <code>ignore</code> 列表（默认遵循 <code>.gitignore</code>）。</li>
<li><strong>图片支持</strong>：直接将图片（报错截图、设计稿）<strong>拖入终端</strong>，OpenCode 即可理解图片内容。</li>
<li><strong>国产模型适配</strong>：对于火山引擎、DeepSeek 等国内 Provider，推荐使用 <strong>OpenAI-Compatible Relay</strong> 模式配置（详见 3.2*）。</li>
</ul>
<h3>10.2 常用 Shell 技巧</h3>
<p>使用 <code>!</code> 执行命令时，输出会直接进入上下文：</p>
<ul>
<li><code>!tree -L 2</code>：让 AI 快速预览目录结构。</li>
<li><code>!git diff HEAD</code>：让 AI 总结你刚才手动做的修改。</li>
<li><code>!npm test -- --grep &quot;auth&quot;</code>：运行特定测试并让 AI 修复报错。</li>
</ul>
<h3>10.4 提示词（Prompt）优化要素</h3>
<p>为了让 OpenCode 给出最精准的代码，建议在消息中包含以下要素：</p>
<ul>
<li><strong>具体文件</strong>：使用 <code>@</code> 引用所有相关文件（如 <code>@api.ts @types.ts</code>），避免 AI 瞎猜。</li>
<li><strong>明确目标</strong>：说清楚“要做什么”，而不是“帮我改下”。（例：“重构 request 函数，使用 async/await 替代 Promise”）。</li>
<li><strong>丰富上下文</strong>：提供完整的错误信息（直接粘贴或拖入截图）、期望的运行结果。</li>
<li><strong>约束条件</strong>：指定技术栈或代码风格（例：“请遵循项目现有的函数式编程风格”）。</li>
</ul>
<h3>10.5 调试与日志</h3>
<p>如果遇到 OpenCode 自身运行异常，可以使用调试模式启动以查看详细日志：</p>
<pre><code class="language-bash"># 开启 debug 级别日志并重定向到文件
opencode --log-level debug &gt; opencode-debug.log
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>everything-claude-code</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/Using/everything-claude-code</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/Using/everything-claude-code</guid>
    <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    <description>信息来源：该仓库的 README.md / README.zh-CN.md 、 rules/README.md 、以及作者的 shortform/longform guide（已通过联网抓取核对）。 1. everything-claude-code 是什么 GitHub Repo https://github.com/affaan-m/everything-claude-code everything-claude-code（简称 ECC）是一套“可直接落地”的 Claud</description>
      <content:encoded><![CDATA[<h1>everything-claude-code 使用指南</h1>
<blockquote>
<p>信息来源：该仓库的 <code>README.md</code> / <code>README.zh-CN.md</code>、<code>rules/README.md</code>、以及作者的 shortform/longform guide（已通过联网抓取核对）。</p>
</blockquote>
<h2>1. everything-claude-code 是什么</h2>
<p><a href="https://github.com/affaan-m/everything-claude-code">GitHub Repo</a></p>
<p>everything-claude-code（简称 ECC）是一套“可直接落地”的 Claude Code 配置集合，目标是把 Claude Code 变成可复用的工程工作流：</p>
<blockquote>
<p>补充：ECC 近几个版本已经不再只面向 Claude Code，本体仍叫 <code>everything-claude-code</code>，但当前 README 已明确扩展到 <strong>Claude Code、Cursor、OpenCode、Codex</strong> 等多工具使用场景。</p>
</blockquote>
<ul>
<li>Agents（子代理）</li>
<li>Skills（技能/工作流）</li>
<li>Commands（斜杠命令）</li>
<li>Hooks（生命周期/工具钩子自动化）</li>
<li>Rules（始终遵循的规则集，按语言分层）</li>
<li>MCP 配置示例（可选）</li>
</ul>
<p>适合人群：你已经在用 Claude Code，但希望把“提示词经验”沉淀为可复用资产，并引入更标准的计划、TDD、审查、验证闭环。</p>
<hr>
<h2>2. 前置要求</h2>
<ol>
<li>已安装 Claude Code CLI。</li>
<li>版本要求：这篇文章原先记录的 <code>v2.1.0+</code> 已偏旧；当前更稳妥的理解是应使用<strong>支持 marketplace / plugins / agents / hooks 的新版本 Claude Code</strong>。</li>
</ol>
<p>检查版本：</p>
<pre><code class="language-bash">claude --version
</code></pre>
<hr>
<h2>3. 快速开始（推荐：安装插件 + 安装 Rules）</h2>
<h3>3.1 安装插件（Claude Code 内执行）</h3>
<p>在 Claude Code 交互界面输入：</p>
<pre><code class="language-text">/plugin marketplace add affaan-m/everything-claude-code
</code></pre>
<pre><code class="language-text">/plugin install everything-claude-code@everything-claude-code
</code></pre>
<p>补充：仓库近版本也开始强调 GitHub Marketplace 入口，<code>ECC Tools</code> 已可作为 marketplace 插件分发。</p>
<p>如果你更偏好直接改配置，也可以在 <code>~/.claude/settings.json</code> 写入（示例以仓库 README 为准）：</p>
<pre><code class="language-json">{
  &quot;extraKnownMarketplaces&quot;: {
    &quot;everything-claude-code&quot;: {
      &quot;source&quot;: {
        &quot;source&quot;: &quot;github&quot;,
        &quot;repo&quot;: &quot;affaan-m/everything-claude-code&quot;
      }
    }
  },
  &quot;enabledPlugins&quot;: {
    &quot;everything-claude-code@everything-claude-code&quot;: true
  }
}
</code></pre>
<p>验证已安装：</p>
<pre><code class="language-text">/plugin list everything-claude-code@everything-claude-code
</code></pre>
<h3>3.2 安装 Rules（仍然重要）</h3>
<p>重要限制：即使现在插件体系已经更完整，<code>rules</code> 仍然通常需要你手动安装（或用仓库脚本安装），这一点没有本质改变。</p>
<p>先克隆仓库：</p>
<pre><code class="language-bash">git clone https://github.com/affaan-m/everything-claude-code.git
cd everything-claude-code
</code></pre>
<p>方式 A：使用安装脚本（仓库推荐）</p>
<pre><code class="language-bash">./install.sh typescript
./install.sh python
./install.sh golang
</code></pre>
<p>方式 B：手动复制（务必保留目录结构）</p>
<blockquote>
<p>不要用 <code>cp -r rules/* ~/.claude/rules/</code> 这种“扁平化复制”。ECC 的 <code>rules/common/</code> 与 <code>rules/&lt;lang&gt;/</code> 里会有同名文件；扁平化会覆盖并破坏 <code>../common/</code> 相对引用。</p>
</blockquote>
<p>macOS/Linux：</p>
<pre><code class="language-bash">mkdir -p ~/.claude/rules
cp -r rules/common ~/.claude/rules/common
cp -r rules/typescript ~/.claude/rules/typescript
cp -r rules/python ~/.claude/rules/python
cp -r rules/golang ~/.claude/rules/golang
</code></pre>
<p>Windows PowerShell（示例）：</p>
<pre><code class="language-powershell">New-Item -ItemType Directory -Force &quot;$HOME\.claude\rules&quot; | Out-Null
Copy-Item -Recurse -Force &quot;rules\common&quot; &quot;$HOME\.claude\rules\common&quot;
Copy-Item -Recurse -Force &quot;rules\typescript&quot; &quot;$HOME\.claude\rules\typescript&quot;
Copy-Item -Recurse -Force &quot;rules\python&quot; &quot;$HOME\.claude\rules\python&quot;
Copy-Item -Recurse -Force &quot;rules\golang&quot; &quot;$HOME\.claude\rules\golang&quot;
</code></pre>
<h3>3.3 试跑一个命令</h3>
<pre><code class="language-text">/plan &quot;添加用户认证&quot;
</code></pre>
<hr>
<h2>4. 主要内容一览（你装进来的是什么）</h2>
<p>ECC 仓库整体可以理解为“工程化 Claude Code 的工具箱”，核心组件与常见落地位置如下：</p>
<ul>
<li><code>agents/</code>：子代理定义（用于委托 planner / architect / code-reviewer / security-reviewer / tdd-guide 等）</li>
<li><code>commands/</code>：斜杠命令（把复杂工作流封装成可重复执行的 prompt）</li>
<li><code>skills/</code>：技能/工作流知识库（更像“可复用 SOP + 参考实现”）</li>
<li><code>hooks/</code>：钩子自动化（PreToolUse/PostToolUse/Stop 等阶段触发脚本）</li>
<li><code>rules/</code>：规则集（永远遵守；按 <code>common/</code> + 语言目录分层）</li>
<li><code>mcp-configs/</code>：MCP server 配置样例（按需拷贝到你的 <code>~/.claude.json</code>）</li>
</ul>
<p>安装方式不同，文件落点不同：</p>
<ul>
<li>插件安装：Claude Code 会把插件内容装入其插件目录；你主要“启用/禁用插件”和“手动安装 rules”。</li>
<li>手动安装：你需要把 agents/commands/skills/rules/hooks 复制到 <code>~/.claude/</code>（或项目 <code>.claude/</code>）对应目录。</li>
</ul>
<hr>
<h2>5. Rules（规则集，全量拆解）</h2>
<p>ECC 的规则目录结构（必须按目录安装，而不是把文件拍平到一个目录）：</p>
<ul>
<li><code>rules/common/</code>：语言无关的“强约束”</li>
<li><code>rules/typescript/</code>：TypeScript/JavaScript 扩展 common</li>
<li><code>rules/python/</code>：Python 扩展 common</li>
<li><code>rules/golang/</code>：Go 扩展 common</li>
</ul>
<p>补充：ECC 后续版本还继续扩展了更多语言/栈支持，因此这里这三组语言规则更适合理解成“最基础、最常用的内置规则层”，而不是全部支持范围。</p>
<blockquote>
<p>规则文件会互相引用（语言目录的规则会引用 <code>../common/...</code>），因此必须保留目录结构。</p>
</blockquote>
<h3>5.1 common（8 个）</h3>
<p><code>rules/common/agents.md</code></p>
<ul>
<li>定义“什么时候应该委托给哪个 agent”（planner / code-reviewer / tdd-guide / architect 等）</li>
<li>强调独立任务应并行执行、多视角审查</li>
</ul>
<p><code>rules/common/coding-style.md</code></p>
<ul>
<li>不可变（immutability）是关键原则：尽量返回新对象/数组，不做原地修改</li>
<li>文件组织偏好“小文件多模块”：典型 200-400 行，建议上限 800 行</li>
<li>错误处理与输入校验必须显式</li>
</ul>
<p><code>rules/common/git-workflow.md</code></p>
<ul>
<li>Conventional Commits：<code>feat/fix/refactor/docs/test/chore/perf/ci</code></li>
<li>PR 工作流：要求看全量 diff、写清测试计划</li>
<li>推荐流程：Plan → TDD → Review → Commit</li>
</ul>
<p><code>rules/common/hooks.md</code></p>
<ul>
<li>hooks 的类型说明：PreToolUse / PostToolUse / Stop</li>
<li>提醒“权限自动放行”要谨慎
*（作者原文里）强调 TodoWrite 的用途（你是否启用取决于你的工作流偏好）</li>
</ul>
<p><code>rules/common/patterns.md</code></p>
<ul>
<li>Skeleton project 思路：优先找“可复用骨架”而不是现场造轮子</li>
<li>Repository pattern / API response envelope 等通用模式</li>
</ul>
<p><code>rules/common/performance.md</code></p>
<ul>
<li>模型选择策略（Haiku / Sonnet / Opus）</li>
<li>上下文窗口管理：避免在窗口尾部做高风险重构</li>
<li>Plan mode + 深度思考（thinking）的开关与建议</li>
</ul>
<p><code>rules/common/security.md</code></p>
<ul>
<li>任何提交前的强制安全检查清单：密钥、输入校验、SQLi、XSS、CSRF、鉴权、限流、错误信息泄露等</li>
<li>一旦发现安全问题：立即停、走 security-reviewer 流程</li>
</ul>
<p><code>rules/common/testing.md</code></p>
<ul>
<li>80% 覆盖率最低门槛（单元/集成/E2E 都要有）</li>
<li>强制 TDD：RED → GREEN → IMPROVE，并要求覆盖边界条件与错误路径</li>
</ul>
<h3>5.2 TypeScript/JavaScript（5 个）</h3>
<p><code>rules/typescript/coding-style.md</code></p>
<ul>
<li>强化不可变更新（spread operator）</li>
<li>建议 async/await + try/catch</li>
<li>建议用 Zod 做 schema 校验</li>
<li>禁止生产代码里 <code>console.log</code></li>
</ul>
<p><code>rules/typescript/patterns.md</code></p>
<ul>
<li>API Response 类型封装示例</li>
<li>React 自定义 hooks 模式示例（如 <code>useDebounce</code>）</li>
<li>Repository interface 模式示例</li>
</ul>
<p><code>rules/typescript/testing.md</code></p>
<ul>
<li>E2E 默认建议 Playwright</li>
<li>提及 agent：<code>e2e-runner</code></li>
</ul>
<p><code>rules/typescript/security.md</code></p>
<ul>
<li>强调环境变量读取密钥、缺失时 fail fast</li>
<li>提及 agent：<code>security-reviewer</code></li>
</ul>
<p><code>rules/typescript/hooks.md</code></p>
<ul>
<li>PostToolUse：Prettier 自动格式化、<code>tsc</code> 类型检查、<code>console.log</code> 告警</li>
<li>Stop：会话结束时做 <code>console.log</code> 审计</li>
</ul>
<h3>5.3 Python（5 个）</h3>
<p><code>rules/python/coding-style.md</code></p>
<ul>
<li>PEP 8 + 类型标注（function signature）</li>
<li>推荐不可变结构（<code>@dataclass(frozen=True)</code> / <code>NamedTuple</code>）</li>
<li>工具链建议：black / isort / ruff</li>
</ul>
<p><code>rules/python/patterns.md</code></p>
<ul>
<li>Protocol（鸭子类型接口）</li>
<li>dataclasses 作为 DTO</li>
<li>context manager / generator 的使用建议</li>
</ul>
<p><code>rules/python/testing.md</code></p>
<ul>
<li>pytest + 覆盖率命令示例</li>
<li>用 <code>pytest.mark</code> 分类（unit/integration）</li>
</ul>
<p><code>rules/python/security.md</code></p>
<ul>
<li>环境变量读密钥（示例用了 python-dotenv）</li>
<li>建议 bandit 做静态安全扫描</li>
</ul>
<p><code>rules/python/hooks.md</code></p>
<ul>
<li>PostToolUse：black/ruff 格式化、mypy/pyright 类型检查</li>
<li>警告 <code>print()</code>（建议用 logging）</li>
</ul>
<h3>5.4 Go（5 个）</h3>
<p><code>rules/golang/coding-style.md</code></p>
<ul>
<li>gofmt/goimports 强制</li>
<li>设计原则：accept interfaces, return structs；接口要小</li>
<li>错误必须 wrap 上下文（<code>fmt.Errorf(&quot;...: %w&quot;, err)</code>）</li>
</ul>
<p><code>rules/golang/patterns.md</code></p>
<ul>
<li>Functional options</li>
<li>小接口 + 就地定义</li>
<li>构造函数依赖注入</li>
</ul>
<p><code>rules/golang/testing.md</code></p>
<ul>
<li>标准 <code>go test</code> + table-driven tests</li>
<li>强制 <code>-race</code></li>
<li>覆盖率 <code>-cover</code></li>
</ul>
<p><code>rules/golang/security.md</code></p>
<ul>
<li>环境变量密钥 + 缺失时 fail fast</li>
<li>静态扫描 gosec</li>
<li>强制 context + timeout</li>
</ul>
<p><code>rules/golang/hooks.md</code></p>
<ul>
<li>PostToolUse：gofmt/goimports、go vet、staticcheck</li>
</ul>
<hr>
<h2>6. Skills（技能/工作流，全量拆解）</h2>
<p>技能在 ECC 里是“可复用的工作流与知识库”。它们通常：</p>
<ul>
<li>给出“什么时候启用”</li>
<li>给出“步骤清单/检查点/示例代码”</li>
<li>部分技能会配套脚本（用于 hooks 触发或生成产物文件）</li>
</ul>
<p>下面按主题把 <code>skills/</code> 目录下的技能逐一拆开说明（共 32 个目录，按 main 分支内容整理）。</p>
<h3>6.1 工程通用（架构/代码规范/检索/上下文管理）</h3>
<p><code>skills/coding-standards</code></p>
<ul>
<li>目的：通用代码规范（命名、不可变、错误处理、类型安全、React 写法、API 返回结构、目录组织等）</li>
<li>关键点：强调不可变；建议并行 async；强调输入校验；给出文件结构模板</li>
</ul>
<p><code>skills/backend-patterns</code></p>
<ul>
<li>目的：后端模式（REST API、Repository/Service 层、middleware、DB 查询优化、缓存、错误处理、鉴权、限流、队列、结构化日志等）</li>
<li>关键点：避免 N+1；缓存旁路（cache-aside）；统一错误处理；RBAC 示例</li>
</ul>
<p><code>skills/frontend-patterns</code></p>
<ul>
<li>目的：前端模式（React/Next.js 组件组合、compound components、自定义 hooks、状态管理、性能优化、表单、Error Boundary、动画、无障碍）</li>
<li>关键点：useMemo/useCallback；lazy load；虚拟列表；键盘导航与 focus 管理</li>
</ul>
<p><code>skills/iterative-retrieval</code></p>
<ul>
<li>目的：解决“子代理不知道该拿哪些上下文”的问题</li>
<li>方法：DISPATCH → EVALUATE → REFINE → LOOP（最多 3 轮），逐步收敛到高相关文件</li>
</ul>
<p><code>skills/strategic-compact</code></p>
<ul>
<li>目的：把 <code>/compact</code> 从“被动自动触发”变成“在里程碑节点主动触发”</li>
<li>典型节点：探索结束→开始实现；完成阶段性里程碑；准备切换任务上下文</li>
<li>hooks 方式：PreToolUse(Edit/Write) 统计调用次数，达到阈值提醒你 compact</li>
</ul>
<p><code>skills/eval-harness</code></p>
<ul>
<li>目的：Eval-Driven Development（把 eval 当作 AI 开发的“单元测试”）</li>
<li>关键概念：Capability eval / Regression eval；grader（代码/模型/人工）；pass@k vs pass^k</li>
<li>产物建议：把 eval 定义与报告存入 <code>.claude/evals/</code></li>
</ul>
<p><code>skills/configure-ecc</code></p>
<ul>
<li>目的：交互式安装向导（帮你选择安装哪些 skills/rules，安装到 user-level 或 project-level，并做覆盖/合并提示）</li>
</ul>
<h3>6.2 质量与交付（TDD / 验证闭环 / 安全）</h3>
<p><code>skills/tdd-workflow</code></p>
<ul>
<li>目的：强制 TDD（覆盖率目标 80%+，覆盖 unit/integration/E2E）</li>
<li>关键点：先写用户旅程→生成用例→先跑失败→最小实现→再跑通过→重构→看覆盖率</li>
<li>给了 Jest/Vitest、API integration test、Playwright E2E 的示例结构</li>
</ul>
<p><code>skills/verification-loop</code></p>
<ul>
<li>目的：PR/交付前的质量闸口（build → typecheck → lint → tests → security → diff review）</li>
<li>输出建议：用固定格式写一份 VERIFICATION REPORT（PASS/FAIL + 待修复列表）</li>
</ul>
<p><code>skills/security-review</code></p>
<ul>
<li>目的：安全审查清单（Secrets、输入校验、SQLi、AuthZ、XSS、CSRF、Rate limit、日志脱敏、依赖安全等）</li>
<li>关键点：示例覆盖 TS/Next.js/Supabase/RLS、CSP、token 存储策略等</li>
</ul>
<p><code>skills/security-scan</code></p>
<ul>
<li>目的：用 AgentShield 扫描你的 Claude Code 配置（<code>.claude/</code>、MCP、hooks、agents 等）</li>
<li>常用命令：<code>npx ecc-agentshield scan</code> / <code>--fix</code> / <code>--format json|markdown|html</code> / <code>--opus</code></li>
</ul>
<h3>6.3 持续学习（从会话沉淀可复用资产）</h3>
<p><code>skills/continuous-learning</code></p>
<ul>
<li>目的：会话结束时（Stop hook）总结“可复用模式”，自动沉淀为 learned skills</li>
<li>默认思路：会话足够长（如 10+ message）才抽取；落盘到 <code>~/.claude/skills/learned/</code></li>
<li>配置项：最小会话长度、抽取阈值、忽略模式、是否自动批准等</li>
</ul>
<p><code>skills/continuous-learning-v2</code></p>
<ul>
<li>目的：升级为“instinct（直觉）”的原子化学习体系（带置信度评分，可导入/导出，可聚类进化为 skills/commands/agents）</li>
<li>关键差异：用 PreToolUse/PostToolUse hooks 做 100% 观测；后台 observer（Haiku）做模式提取</li>
<li>主要目录：<code>~/.claude/homunculus/observations.jsonl</code>、<code>instincts/personal|inherited</code>、<code>evolved/agents|skills|commands</code></li>
</ul>
<h3>6.4 语言/框架专项（把“最佳实践”写成可调用知识库）</h3>
<p>Python：</p>
<ul>
<li><code>skills/python-patterns</code>：Pythonic idioms、PEP8、类型标注等</li>
<li><code>skills/python-testing</code>：pytest、fixtures、mock、参数化、覆盖率要求</li>
<li><code>skills/django-patterns</code>：Django/DRF 架构、ORM、缓存、middleware、生产实践</li>
<li><code>skills/django-security</code>：Django 安全（CSRF/XSS/SQLi/部署安全等）</li>
<li><code>skills/django-tdd</code>：pytest-django、factory_boy、DRF API 测试</li>
<li><code>skills/django-verification</code>：Django 项目验证闭环（migrations、lint、tests、security、diff review）</li>
</ul>
<p>Go：</p>
<ul>
<li><code>skills/golang-patterns</code>：Go 惯用法、并发、错误处理、项目组织等</li>
<li><code>skills/golang-testing</code>：table-driven tests、bench、fuzz、覆盖率</li>
</ul>
<p>Java/Spring：</p>
<ul>
<li><code>skills/java-coding-standards</code>：Java 代码规范（Optional/streams/异常/泛型/布局等）</li>
<li><code>skills/jpa-patterns</code>：JPA/Hibernate 实体/关系/查询优化/事务/索引/分页等</li>
<li><code>skills/springboot-patterns</code>：Spring Boot 架构/分层/缓存/异步/日志等</li>
<li><code>skills/springboot-security</code>：Spring Security + Web 安全建议</li>
<li><code>skills/springboot-tdd</code>：JUnit5/Mockito/MockMvc/Testcontainers/JaCoCo 的 TDD</li>
<li><code>skills/springboot-verification</code>：Spring Boot 项目验证闭环（build、静态分析、测试覆盖率、安全扫描）</li>
</ul>
<p>C++：</p>
<ul>
<li><code>skills/cpp-testing</code>：GoogleTest/CTest、覆盖率、sanitizers、排查 flaky tests</li>
</ul>
<h3>6.5 数据库与文档处理专项</h3>
<ul>
<li><code>skills/postgres-patterns</code>：PostgreSQL/Supabase 相关的 schema/index/query/security 模式</li>
<li><code>skills/clickhouse-io</code>：ClickHouse（MergeTree 家族、聚合表、物化视图、查询优化、监控、ETL/CDC 模式）</li>
<li><code>skills/nutrient-document-processing</code>：Nutrient DWS API 文档处理（转换/OCR/抽取/脱敏/签名/表单填充等）</li>
</ul>
<h3>6.6 模板示例</h3>
<p><code>skills/project-guidelines-example</code></p>
<ul>
<li>这是“项目级 skill”的示例模板：技术栈、目录结构、API 规范、测试与部署流程等</li>
<li>你可以照此结构为自己的项目写一个“项目内专用 skill”，让 Claude Code 对你项目的约束更稳定</li>
</ul>
<hr>
<h2>7. Commands（斜杠命令，全量拆解）</h2>
<p>ECC 在 <code>commands/</code> 下提供了一组可复用的斜杠命令（在 Claude Code 里以 <code>/xxx</code> 调用）。这些命令的核心价值是把“复杂提示词 + 固定流程”封装成稳定入口。</p>
<blockquote>
<p>你看到的每个命令，其实就是一个可重复执行的工作流 prompt；其中一部分会显式调用某个 agent（例如 <code>/plan</code> 调 planner，<code>/tdd</code> 调 tdd-guide）。</p>
</blockquote>
<h3>7.1 命令清单（31 个）</h3>
<p><code>/plan</code></p>
<ul>
<li>作用：调用 <code>planner</code> 产出分阶段计划，并且“必须等待用户确认后才改代码”。</li>
<li>典型用法：<code>/plan &lt;需求描述&gt;</code></li>
</ul>
<p><code>/tdd</code></p>
<ul>
<li>作用：调用 <code>tdd-guide</code> 强制 TDD（先写测试，再最小实现，再重构），目标覆盖率 80%+。</li>
<li>典型用法：<code>/tdd &lt;要实现/修复的功能&gt;</code></li>
</ul>
<p><code>/code-review</code></p>
<ul>
<li>作用：对未提交变更做代码审查（按 CRITICAL/HIGH/MEDIUM/LOW 分级），包含安全项与质量项。</li>
</ul>
<p><code>/verify</code></p>
<ul>
<li>作用：执行验证闭环（build → typecheck → lint → tests → console.log 审计 → git status）。</li>
<li>参数：<code>/verify quick|full|pre-commit|pre-pr</code>（命令文件定义了这几种模式）。</li>
</ul>
<p><code>/build-fix</code></p>
<ul>
<li>作用：增量修复构建/类型错误；强调“一次只修一个错误→重跑验证”。</li>
</ul>
<p><code>/test-coverage</code></p>
<ul>
<li>作用：分析覆盖率并补齐缺失测试（通常与 <code>/tdd</code>、<code>/verify</code> 配合）。</li>
</ul>
<p><code>/e2e</code></p>
<ul>
<li>作用：调用 <code>e2e-runner</code> 生成/维护/执行 Playwright E2E 测试。</li>
</ul>
<p><code>/checkpoint</code></p>
<ul>
<li>作用：创建或验证一个“工作流检查点”（用于阶段性确认与回退/复盘）。</li>
</ul>
<p><code>/eval</code></p>
<ul>
<li>作用：管理 eval-driven development 工作流（定义/运行/报告 eval）。</li>
</ul>
<p><code>/learn</code></p>
<ul>
<li>作用：从当前会话抽取“值得沉淀为技能”的可复用模式。</li>
</ul>
<p><code>/sessions</code></p>
<ul>
<li>作用：管理 Claude Code session 历史（list/load/alias/info 等），会读写 <code>~/.claude/sessions/</code> 和 <code>~/.claude/session-aliases.json</code>。</li>
</ul>
<p><code>/setup-pm</code></p>
<ul>
<li>作用：设置/检测首选包管理器（npm/pnpm/yarn/bun），支持全局与项目级，规则与优先级在命令文档内写得很清楚。</li>
</ul>
<p><code>/skill-create</code></p>
<ul>
<li>作用：本地解析 git 历史，提取项目习惯并生成 <code>SKILL.md</code>（可选同时生成 instincts 供 continuous-learning-v2 使用）。</li>
</ul>
<p>Instinct 系列（continuous-learning-v2 配套）：</p>
<ul>
<li><code>/instinct-status</code>：查看已学习 instincts（带置信度、按 domain 分组）。</li>
<li><code>/instinct-import</code>：导入 instincts。</li>
<li><code>/instinct-export</code>：导出 instincts。</li>
<li><code>/evolve</code>：把 instincts 聚类进化为 skills/commands/agents（命令文件会调用 instinct CLI）。</li>
</ul>
<p>Go 专用：</p>
<ul>
<li><code>/go-review</code>：调用 <code>go-reviewer</code> 做 Go 代码审查。</li>
<li><code>/go-build</code>：调用 <code>go-build-resolver</code> 修 Go build/vet 问题。</li>
<li><code>/go-test</code>：Go 的 TDD 工作流（table-driven tests、race/coverage 等）。</li>
</ul>
<p>Python 专用：</p>
<ul>
<li><code>/python-review</code>：调用 <code>python-reviewer</code> 做 Python 代码审查。</li>
</ul>
<p>多模型编排（高级工作流）：</p>
<ul>
<li><code>/orchestrate</code>：顺序式多 agent 工作流（适合复杂任务分阶段推进）。</li>
<li><code>/multi-plan</code>：多模型协作产计划。</li>
<li><code>/multi-execute</code>：多模型协作执行与审计。</li>
<li><code>/multi-workflow</code>：Research→Ideation→Plan→Execute→Optimize→Review 的全流程多模型协作。</li>
<li><code>/multi-frontend</code>：偏前端的多模型流程。</li>
<li><code>/multi-backend</code>：偏后端的多模型流程。</li>
</ul>
<p>运维/多服务：</p>
<ul>
<li><code>/pm2</code>：扫描项目服务（Vite/Next/FastAPI/Go 等），生成 <code>ecosystem.config.cjs</code> 与一组 <code>.claude/commands/pm2-*.md</code> 便于启动/监控/查看日志（命令文件对 Windows 细节写得很具体）。</li>
</ul>
<h3>7.2 按场景的“推荐命令链”（可直接照抄）</h3>
<p>新增功能（通用）：</p>
<pre><code class="language-text">/plan &quot;...&quot;
/tdd
/test-coverage
/code-review
/verify pre-pr
</code></pre>
<p>构建/类型报错优先绿灯：</p>
<pre><code class="language-text">/build-fix
/verify quick
</code></pre>
<p>准备提 PR：</p>
<pre><code class="language-text">/code-review
/verify pre-pr
</code></pre>
<p>E2E 测试补齐关键用户旅程：</p>
<pre><code class="language-text">/e2e
/verify full
</code></pre>
<p>把团队习惯沉淀为可复用资产：</p>
<pre><code class="language-text">/skill-create --commits 200
/learn
</code></pre>
<h3>7.3 命令速查表（命令 → 调用对象 → 输入/输出要点）</h3>
<blockquote>
<p>说明：部分命令会显式调用 agent（例如 planner/tdd-guide/e2e-runner），其余多为固定工作流 prompt 或 Node 脚本。</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align:left">命令</th>
<th style="text-align:left">主要作用</th>
<th style="text-align:left">主要调用</th>
<th style="text-align:left">参数/备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>/plan</code></td>
<td style="text-align:left">产出分阶段实施计划并等待确认</td>
<td style="text-align:left">agent: <code>planner</code></td>
<td style="text-align:left">命令文档强调“未确认不得改代码”</td>
</tr>
<tr>
<td style="text-align:left"><code>/tdd</code></td>
<td style="text-align:left">强制 TDD：先测试→最小实现→重构→覆盖率</td>
<td style="text-align:left">agent: <code>tdd-guide</code></td>
<td style="text-align:left">覆盖率目标 80%+；E2E 另用 <code>/e2e</code></td>
</tr>
<tr>
<td style="text-align:left"><code>/code-review</code></td>
<td style="text-align:left">未提交变更的安全与质量审查</td>
<td style="text-align:left">workflow（检查清单）</td>
<td style="text-align:left">输出按 CRITICAL/HIGH/MEDIUM/LOW；CRITICAL/HIGH 应阻断提交</td>
</tr>
<tr>
<td style="text-align:left"><code>/verify</code></td>
<td style="text-align:left">验证闭环（build/types/lint/tests/日志审计/git 状态）</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">支持 <code>quick/full/pre-commit/pre-pr</code></td>
</tr>
<tr>
<td style="text-align:left"><code>/build-fix</code></td>
<td style="text-align:left">增量修 build/类型错误（一次只修一个）</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">每次修复后重跑 build；同一错误多次失败应停下</td>
</tr>
<tr>
<td style="text-align:left"><code>/test-coverage</code></td>
<td style="text-align:left">分析覆盖率并补齐缺失测试</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">常与 <code>/tdd</code>、<code>/verify</code> 配合</td>
</tr>
<tr>
<td style="text-align:left"><code>/e2e</code></td>
<td style="text-align:left">生成/维护/执行 Playwright E2E</td>
<td style="text-align:left">agent: <code>e2e-runner</code></td>
<td style="text-align:left">覆盖关键用户旅程；隔离 flaky tests</td>
</tr>
<tr>
<td style="text-align:left"><code>/checkpoint</code></td>
<td style="text-align:left">创建/核对一个工作流检查点</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">用于阶段性确认/复盘</td>
</tr>
<tr>
<td style="text-align:left"><code>/eval</code></td>
<td style="text-align:left">EDD：定义/运行/报告 eval</td>
<td style="text-align:left">workflow（配合 <code>skills/eval-harness</code>）</td>
<td style="text-align:left">适合把“成功标准”先写死</td>
</tr>
<tr>
<td style="text-align:left"><code>/learn</code></td>
<td style="text-align:left">从当前会话提炼可复用模式</td>
<td style="text-align:left">workflow（配合 continuous-learning）</td>
<td style="text-align:left">更偏人工触发抽取</td>
</tr>
<tr>
<td style="text-align:left"><code>/sessions</code></td>
<td style="text-align:left">会话历史管理（list/load/alias/info）</td>
<td style="text-align:left">Node 脚本</td>
<td style="text-align:left">读写 <code>~/.claude/sessions/</code>、<code>~/.claude/session-aliases.json</code></td>
</tr>
<tr>
<td style="text-align:left"><code>/setup-pm</code></td>
<td style="text-align:left">设置/检测包管理器偏好</td>
<td style="text-align:left">Node 脚本</td>
<td style="text-align:left">优先级：env→项目→package.json→lock→全局→fallback</td>
</tr>
<tr>
<td style="text-align:left"><code>/skill-create</code></td>
<td style="text-align:left">从 git 历史生成 <a href="http://SKILL.md">SKILL.md</a>（可选 instincts）</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left"><code>--commits/--output/--instincts</code></td>
</tr>
<tr>
<td style="text-align:left"><code>/instinct-status</code></td>
<td style="text-align:left">查看 instincts（置信度/分组）</td>
<td style="text-align:left">instinct CLI</td>
<td style="text-align:left">continuous-learning-v2 配套</td>
</tr>
<tr>
<td style="text-align:left"><code>/instinct-import</code></td>
<td style="text-align:left">导入 instincts</td>
<td style="text-align:left">instinct CLI</td>
<td style="text-align:left">continuous-learning-v2 配套</td>
</tr>
<tr>
<td style="text-align:left"><code>/instinct-export</code></td>
<td style="text-align:left">导出 instincts</td>
<td style="text-align:left">instinct CLI</td>
<td style="text-align:left">continuous-learning-v2 配套</td>
</tr>
<tr>
<td style="text-align:left"><code>/evolve</code></td>
<td style="text-align:left">instincts 聚类进化为技能/命令/代理</td>
<td style="text-align:left">instinct CLI</td>
<td style="text-align:left">continuous-learning-v2 配套</td>
</tr>
<tr>
<td style="text-align:left"><code>/go-review</code></td>
<td style="text-align:left">Go 专用审查</td>
<td style="text-align:left">agent: <code>go-reviewer</code></td>
<td style="text-align:left">并发/错误处理/性能/惯用法</td>
</tr>
<tr>
<td style="text-align:left"><code>/go-build</code></td>
<td style="text-align:left">Go build/vet 修复</td>
<td style="text-align:left">agent: <code>go-build-resolver</code></td>
<td style="text-align:left">最小改动、快速绿灯</td>
</tr>
<tr>
<td style="text-align:left"><code>/go-test</code></td>
<td style="text-align:left">Go 的 TDD/测试套路</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">table-driven tests、race、coverage</td>
</tr>
<tr>
<td style="text-align:left"><code>/python-review</code></td>
<td style="text-align:left">Python 专用审查</td>
<td style="text-align:left">agent: <code>python-reviewer</code></td>
<td style="text-align:left">PEP8、类型标注、安全与性能</td>
</tr>
<tr>
<td style="text-align:left"><code>/refactor-clean</code></td>
<td style="text-align:left">死代码识别与清理</td>
<td style="text-align:left">agent: <code>refactor-cleaner</code>（概念上）</td>
<td style="text-align:left">强调安全删除 + 验证</td>
</tr>
<tr>
<td style="text-align:left"><code>/update-docs</code></td>
<td style="text-align:left">文档同步</td>
<td style="text-align:left">agent: <code>doc-updater</code>（概念上）</td>
<td style="text-align:left">从 source-of-truth 同步</td>
</tr>
<tr>
<td style="text-align:left"><code>/update-codemaps</code></td>
<td style="text-align:left">生成/更新 codemaps</td>
<td style="text-align:left">agent: <code>doc-updater</code>（概念上）</td>
<td style="text-align:left">适合大仓库导航</td>
</tr>
<tr>
<td style="text-align:left"><code>/orchestrate</code></td>
<td style="text-align:left">顺序式多 agent 协作（复杂任务）</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">把任务拆阶段推进</td>
</tr>
<tr>
<td style="text-align:left"><code>/multi-plan</code></td>
<td style="text-align:left">多模型协作产计划</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">高级用法，依赖额外 wrapper/MCP</td>
</tr>
<tr>
<td style="text-align:left"><code>/multi-execute</code></td>
<td style="text-align:left">多模型协作执行与审计</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">高级用法，依赖额外 wrapper/MCP</td>
</tr>
<tr>
<td style="text-align:left"><code>/multi-frontend</code></td>
<td style="text-align:left">偏前端多模型流程</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">文档标注“Gemini-led”</td>
</tr>
<tr>
<td style="text-align:left"><code>/multi-backend</code></td>
<td style="text-align:left">偏后端多模型流程</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">文档标注“Codex-led”</td>
</tr>
<tr>
<td style="text-align:left"><code>/multi-workflow</code></td>
<td style="text-align:left">全流程多模型协作</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">该命令文档的 usage 写成 <code>/workflow ...</code>；以文件名映射的命令 <code>/multi-workflow</code> 为准</td>
</tr>
<tr>
<td style="text-align:left"><code>/pm2</code></td>
<td style="text-align:left">多服务 PM2 初始化与命令生成</td>
<td style="text-align:left">workflow</td>
<td style="text-align:left">生成 <code>ecosystem.config.cjs</code> 与 <code>.claude/commands/pm2-*.md</code></td>
</tr>
</tbody>
</table>
<hr>
<h2>8. Agents（子代理，全量拆解）</h2>
<p>ECC 的 agents 放在 <code>agents/</code>，每个 agent 都带明确的 “when to use/工具权限/模型选择”。在 Claude Code 中，这些 agent 常被 commands 间接调用。</p>
<h3>8.1 Agent 清单（13 个）</h3>
<table>
<thead>
<tr>
<th style="text-align:left">Agent</th>
<th style="text-align:left">主要职责</th>
<th style="text-align:left">默认模型</th>
<th style="text-align:left">Tools（声明）</th>
<th style="text-align:left">常见入口</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>planner</code></td>
<td style="text-align:left">复杂需求拆解为可执行计划，并等待确认</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Grep,Glob</code></td>
<td style="text-align:left"><code>/plan</code></td>
</tr>
<tr>
<td style="text-align:left"><code>architect</code></td>
<td style="text-align:left">架构设计与技术决策（边界、扩展性、风险）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Grep,Glob</code></td>
<td style="text-align:left">（手动委托/复杂方案评审）</td>
</tr>
<tr>
<td style="text-align:left"><code>tdd-guide</code></td>
<td style="text-align:left">强制 TDD（先测后码、覆盖率目标）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep</code></td>
<td style="text-align:left"><code>/tdd</code></td>
</tr>
<tr>
<td style="text-align:left"><code>code-reviewer</code></td>
<td style="text-align:left">质量 + 安全 + 可维护性审查</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Grep,Glob,Bash</code></td>
<td style="text-align:left"><code>/code-review</code></td>
</tr>
<tr>
<td style="text-align:left"><code>security-reviewer</code></td>
<td style="text-align:left">安全漏洞检测与修复建议</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep,Glob</code></td>
<td style="text-align:left">（敏感改动后）</td>
</tr>
<tr>
<td style="text-align:left"><code>build-error-resolver</code></td>
<td style="text-align:left">修 build/TS 错误，最小 diff 快速变绿</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep,Glob</code></td>
<td style="text-align:left"><code>/build-fix</code></td>
</tr>
<tr>
<td style="text-align:left"><code>e2e-runner</code></td>
<td style="text-align:left">Playwright E2E（含 flaky 隔离与 artifacts）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep,Glob</code></td>
<td style="text-align:left"><code>/e2e</code></td>
</tr>
<tr>
<td style="text-align:left"><code>refactor-cleaner</code></td>
<td style="text-align:left">死代码识别与清理（分析→验证→删除）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep,Glob</code></td>
<td style="text-align:left"><code>/refactor-clean</code></td>
</tr>
<tr>
<td style="text-align:left"><code>doc-updater</code></td>
<td style="text-align:left">文档/codemap 同步与生成</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep,Glob</code></td>
<td style="text-align:left"><code>/update-docs</code>、<code>/update-codemaps</code></td>
</tr>
<tr>
<td style="text-align:left"><code>go-reviewer</code></td>
<td style="text-align:left">Go 代码审查（惯用法/并发/错误处理/性能）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Grep,Glob,Bash</code></td>
<td style="text-align:left"><code>/go-review</code></td>
</tr>
<tr>
<td style="text-align:left"><code>go-build-resolver</code></td>
<td style="text-align:left">Go build/vet/lint 修复（最小改动）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep,Glob</code></td>
<td style="text-align:left"><code>/go-build</code></td>
</tr>
<tr>
<td style="text-align:left"><code>python-reviewer</code></td>
<td style="text-align:left">Python 审查（PEP8/类型标注/安全/性能）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Grep,Glob,Bash</code></td>
<td style="text-align:left"><code>/python-review</code></td>
</tr>
<tr>
<td style="text-align:left"><code>database-reviewer</code></td>
<td style="text-align:left">PostgreSQL/Supabase（schema/index/query/security/perf）</td>
<td style="text-align:left"><code>opus</code></td>
<td style="text-align:left"><code>Read,Write,Edit,Bash,Grep,Glob</code></td>
<td style="text-align:left">（SQL/migration/慢查询时）</td>
</tr>
</tbody>
</table>
<p><code>planner</code></p>
<ul>
<li>职责：复杂功能/重构的计划拆解；输出阶段化计划并等待确认。</li>
<li>常见入口：<code>/plan</code></li>
</ul>
<p><code>architect</code></p>
<ul>
<li>职责：系统设计与架构决策（可扩展性、边界划分、风险评估）。</li>
</ul>
<p><code>tdd-guide</code></p>
<ul>
<li>职责：强制 TDD（先测后码、覆盖率目标）。</li>
<li>常见入口：<code>/tdd</code></li>
</ul>
<p><code>code-reviewer</code></p>
<ul>
<li>职责：质量 + 安全的代码审查；仓库强调“写完代码立即用”。</li>
<li>常见入口：<code>/code-review</code></li>
</ul>
<p><code>security-reviewer</code></p>
<ul>
<li>职责：安全漏洞检测与修复建议（secrets、注入、SSRF、OWASP Top 10 等）。</li>
</ul>
<p><code>build-error-resolver</code></p>
<ul>
<li>职责：修 build/TS 错误；强调最小 diff、快速让 build 变绿。</li>
</ul>
<p><code>e2e-runner</code></p>
<ul>
<li>职责：Playwright E2E（生成/维护/执行）、隔离 flaky tests、收集 artifacts。</li>
<li>常见入口：<code>/e2e</code></li>
</ul>
<p><code>refactor-cleaner</code></p>
<ul>
<li>职责：死代码清理与收敛（仓库说明会用 knip/depcheck/ts-prune 等分析）。</li>
<li>常见入口：<code>/refactor-clean</code></li>
</ul>
<p><code>doc-updater</code></p>
<ul>
<li>职责：文档与 codemap 同步；生成/更新 <code>docs/CODEMAPS/*</code> 等结构化文档。</li>
<li>常见入口：<code>/update-docs</code>、<code>/update-codemaps</code></li>
</ul>
<p>语言/领域专项：</p>
<ul>
<li><code>go-reviewer</code>：Go 代码审查（并发、错误处理、性能、惯用法）。</li>
<li><code>go-build-resolver</code>：Go build/vet/lint 问题修复。</li>
<li><code>python-reviewer</code>：Python 代码审查（PEP8、类型标注、安全、性能）。</li>
<li><code>database-reviewer</code>：PostgreSQL/Supabase（schema/index/query/security/perf）。</li>
</ul>
<h3>8.2 “什么时候用哪个 agent”（更可操作的规则）</h3>
<ul>
<li>需求不清/涉及多模块：先 <code>/plan</code>（planner）把边界与风险说清。</li>
<li>你准备“动架构”：先 <code>architect</code> 让它给出候选方案与 trade-off。</li>
<li>新功能/修 bug：直接 <code>/tdd</code>，用测试把需求钉死。</li>
<li>改完代码：立刻 <code>/code-review</code>，把 CRITICAL/HIGH 先压下去。</li>
<li>build 红了：用 <code>build-error-resolver</code>（或 <code>/build-fix</code>）做最小修复闭环。</li>
<li>E2E 缺口：用 <code>e2e-runner</code> 明确用户旅程与断言。</li>
<li>DB/migration/慢查询：拉 <code>database-reviewer</code>，优先看索引/查询计划/事务边界。</li>
</ul>
<hr>
<h2>9. Hooks（自动化钩子，逐条拆解 + 可复制模板）</h2>
<p>ECC 的 hooks 文件是 <code>hooks/hooks.json</code>。核心特点：</p>
<ul>
<li>全部用 Node.js 实现，跨平台（Windows/macOS/Linux）。</li>
<li>既包含“提醒类”hooks，也包含“阻断类”hooks（会 <code>exit(1)</code> 直接阻止危险操作）。</li>
<li>多个脚本通过 <code>${CLAUDE_PLUGIN_ROOT}</code> 定位插件根目录（插件安装场景下可用）。</li>
</ul>
<h3>9.1 ECC hooks.json 做了什么（按触发点逐条解释）</h3>
<p>PreToolUse（工具执行前）：</p>
<ul>
<li>Dev server 必须在 tmux：当检测到 <code>npm run dev</code> / <code>pnpm dev</code> / <code>yarn dev</code> / <code>bun dev</code>，且不在 tmux 中时，会直接阻断并提示用 tmux 启动。</li>
<li>长命令 tmux 提醒：对 install/test/cargo/docker/pytest/vitest/playwright 等命令给 tmux 提醒。</li>
<li><code>git push</code> 提醒：push 前提醒你复查变更（默认不阻断）。</li>
<li>阻止随手创建零散文档：当 <code>Write</code> 创建 <code>.md/.txt</code> 且不是 README/CLAUDE/AGENTS/CONTRIBUTING 时，直接阻断。</li>
<li>strategic compact 提醒：对任意 Edit/Write，调用 <code>scripts/hooks/suggest-compact.js</code> 做“到阈值建议 /compact”。</li>
</ul>
<p>PreCompact（压缩前）：</p>
<ul>
<li>保存压缩前状态：调用 <code>scripts/hooks/pre-compact.js</code>。</li>
</ul>
<p>SessionStart（会话开始）：</p>
<ul>
<li>会话启动加载上下文并检测包管理器：调用 <code>scripts/hooks/session-start.js</code>。</li>
</ul>
<p>PostToolUse（工具执行后）：</p>
<ul>
<li>Bash 里检测 <code>gh pr create</code>：输出 PR URL，并给出 <code>gh pr review</code> 复查命令。</li>
<li>build 后台分析示例：对 build 命令注册了一个 <code>async: true</code> 的示例 hook（不阻塞）。</li>
<li>Edit 后自动 Prettier：编辑 <code>.ts/.tsx/.js/.jsx</code> 后自动 <code>npx prettier --write &lt;file&gt;</code>。</li>
<li>Edit 后 TypeScript 检查：编辑 <code>.ts/.tsx</code> 后在最近的 <code>tsconfig.json</code> 所在目录执行 <code>npx tsc --noEmit</code>，并只打印涉及该文件的错误行。</li>
<li>Edit 后 <code>console.log</code> 警告：编辑 <code>.ts/.tsx/.js/.jsx</code> 后扫描该文件，发现 <code>console.log</code> 就警告。</li>
</ul>
<p>Stop（单次响应结束后）：</p>
<ul>
<li>统一 <code>console.log</code> 审计：调用 <code>scripts/hooks/check-console-log.js</code>（针对 modified files 做审计）。</li>
</ul>
<p>SessionEnd（会话结束）：</p>
<ul>
<li>会话结束持久化：调用 <code>scripts/hooks/session-end.js</code>。</li>
<li>会话模式抽取：调用 <code>scripts/hooks/evaluate-session.js</code>（服务于 continuous-learning）。</li>
</ul>
<h3>9.2 最小可用 hooks 模板（插件安装场景，直接可用）</h3>
<p>注意：如果你是“按 ECC 插件方式安装”，Claude Code 通常会按插件约定自动加载插件内的 <code>hooks/hooks.json</code>。下面片段主要用于“你想按自己的口味裁剪/重写 hooks”的场景；若你直接复制粘贴导致 hooks 重复执行，请删掉重复项，只保留一份来源。</p>
<p>把下面片段合并到 <code>~/.claude/settings.json</code> 的 <code>hooks</code> 字段即可（会用到 <code>${CLAUDE_PLUGIN_ROOT}</code>）：</p>
<pre><code class="language-json">{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;tool == \&quot;Edit\&quot; || tool == \&quot;Write\&quot;&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node \&quot;${CLAUDE_PLUGIN_ROOT}/scripts/hooks/suggest-compact.js\&quot;&quot;
          }
        ]
      }
    ],
    &quot;PreCompact&quot;: [
      {
        &quot;matcher&quot;: &quot;*&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node \&quot;${CLAUDE_PLUGIN_ROOT}/scripts/hooks/pre-compact.js\&quot;&quot;
          }
        ]
      }
    ],
    &quot;SessionStart&quot;: [
      {
        &quot;matcher&quot;: &quot;*&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node \&quot;${CLAUDE_PLUGIN_ROOT}/scripts/hooks/session-start.js\&quot;&quot;
          }
        ]
      }
    ],
    &quot;Stop&quot;: [
      {
        &quot;matcher&quot;: &quot;*&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node \&quot;${CLAUDE_PLUGIN_ROOT}/scripts/hooks/check-console-log.js\&quot;&quot;
          }
        ]
      }
    ],
    &quot;SessionEnd&quot;: [
      {
        &quot;matcher&quot;: &quot;*&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node \&quot;${CLAUDE_PLUGIN_ROOT}/scripts/hooks/session-end.js\&quot;&quot;
          }
        ]
      },
      {
        &quot;matcher&quot;: &quot;*&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node \&quot;${CLAUDE_PLUGIN_ROOT}/scripts/hooks/evaluate-session.js\&quot;&quot;
          }
        ]
      }
    ]
  }
}
</code></pre>
<h3>9.3 语言专项 hooks（可选）</h3>
<p>TypeScript/JavaScript（格式化 + 类型检查 + console.log）：</p>
<pre><code class="language-json">{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;tool == \&quot;Edit\&quot; &amp;&amp; tool_input.file_path matches \\\&quot;\\\\.(ts|tsx|js|jsx)$\\\&quot;&quot;,
        &quot;hooks&quot;: [{
          &quot;type&quot;: &quot;command&quot;,
          &quot;command&quot;: &quot;node -e \&quot;const{execFileSync}=require('child_process');const fs=require('fs');let d='';process.stdin.on('data',c=&gt;d+=c);process.stdin.on('end',()=&gt;{const i=JSON.parse(d);const p=i.tool_input?.file_path;if(p&amp;&amp;fs.existsSync(p)){try{execFileSync('npx',['prettier','--write',p],{stdio:['pipe','pipe','pipe']})}catch(e){}}console.log(d)})\&quot;&quot;
        }]
      }
    ]
  }
}
</code></pre>
<p>Python/Go 的 hooks，ECC 的规则文件分别建议：</p>
<ul>
<li>Python：black/ruff + mypy/pyright，警告 print</li>
<li>Go：gofmt/goimports + go vet + staticcheck</li>
</ul>
<p>下面给出“示例模板”（具体命令与参数以你的项目工具链为准）：</p>
<p>Python（black + ruff + pyright，编辑 <code>.py</code> 后触发；示例参考 ECC 的 Prettier hook 写法，用 stdin JSON 取 <code>tool_input.file_path</code>）：</p>
<pre><code class="language-json">{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;tool == \&quot;Edit\&quot; &amp;&amp; tool_input.file_path matches \\\&quot;\\\\.py$\\\&quot;&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node -e \&quot;const{execFileSync}=require('child_process');const fs=require('fs');let d='';process.stdin.on('data',c=&gt;d+=c);process.stdin.on('end',()=&gt;{const i=JSON.parse(d);const p=i.tool_input?.file_path;if(p&amp;&amp;fs.existsSync(p)){try{execFileSync('python',['-m','black',p],{stdio:['pipe','pipe','pipe']})}catch(e){}try{execFileSync('python',['-m','ruff','check','--fix',p],{stdio:['pipe','pipe','pipe']})}catch(e){}}try{execFileSync('pyright',['.'],{stdio:['pipe','pipe','pipe']})}catch(e){}console.log(d)})\&quot;&quot;
          }
        ]
      }
    ]
  }
}
</code></pre>
<p>Go（gofmt/goimports + go vet，编辑 <code>.go</code> 后触发；同样从 stdin JSON 获取文件路径）：</p>
<pre><code class="language-json">{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;tool == \&quot;Edit\&quot; &amp;&amp; tool_input.file_path matches \\\&quot;\\\\.go$\\\&quot;&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;node -e \&quot;const{execFileSync}=require('child_process');const fs=require('fs');let d='';process.stdin.on('data',c=&gt;d+=c);process.stdin.on('end',()=&gt;{const i=JSON.parse(d);const p=i.tool_input?.file_path;if(p&amp;&amp;fs.existsSync(p)){try{execFileSync('gofmt',['-w',p],{stdio:['pipe','pipe','pipe']})}catch(e){}try{execFileSync('goimports',['-w',p],{stdio:['pipe','pipe','pipe']})}catch(e){}}try{execFileSync('go',['vet','./...'],{stdio:['pipe','pipe','pipe']})}catch(e){}console.log(d)})\&quot;&quot;
          }
        ]
      }
    ]
  }
}
</code></pre>
<hr>
<h2>10. MCP（mcp-configs/mcp-servers.json，全量拆解）</h2>
<p>ECC 给了一个 MCP server 配置样例文件：<code>mcp-configs/mcp-servers.json</code>。</p>
<p>它的定位是：你不要全盘照抄启用，而是把“你当前项目确实需要的那几个”拷贝到 <code>~/.claude.json</code> 的 <code>mcpServers</code> 里。</p>
<blockquote>
<p>作者经验：MCP/插件开太多会显著压缩上下文窗口。建议“配置 20-30 个，但每项目启用 &lt; 10 个、活跃 tools &lt; 80 个”。</p>
</blockquote>
<h3>10.1 服务器清单（按 ECC 样例）</h3>
<p><code>github</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>env：<code>GITHUB_PERSONAL_ACCESS_TOKEN</code></li>
<li>用途：PR / issue / repo 操作</li>
</ul>
<p><code>firecrawl</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>env：<code>FIRECRAWL_API_KEY</code></li>
<li>用途：网页抓取/爬取</li>
</ul>
<p><code>supabase</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>参数：<code>--project-ref=YOUR_PROJECT_REF</code></li>
<li>用途：Supabase DB 操作</li>
</ul>
<p><code>memory</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>用途：跨会话持久化记忆（注意也会占用上下文与工具额度）</li>
</ul>
<p><code>sequential-thinking</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>用途：链式推理辅助</li>
</ul>
<p><code>vercel</code></p>
<ul>
<li>类型：http（远程）</li>
<li>url：<code>https://mcp.vercel.com</code></li>
<li>用途：Vercel 部署/项目</li>
</ul>
<p><code>railway</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>用途：Railway 部署</li>
</ul>
<p>Cloudflare（4 个 http MCP）：</p>
<ul>
<li><code>cloudflare-docs</code>：<code>https://docs.mcp.cloudflare.com/mcp</code>（文档检索）</li>
<li><code>cloudflare-workers-builds</code>：<code>https://builds.mcp.cloudflare.com/mcp</code>（Workers builds）</li>
<li><code>cloudflare-workers-bindings</code>：<code>https://bindings.mcp.cloudflare.com/mcp</code>（Workers bindings）</li>
<li><code>cloudflare-observability</code>：<code>https://observability.mcp.cloudflare.com/mcp</code>（日志/可观测）</li>
</ul>
<p><code>clickhouse</code></p>
<ul>
<li>类型：http</li>
<li>url：<code>https://mcp.clickhouse.cloud/mcp</code></li>
<li>用途：ClickHouse 分析查询</li>
</ul>
<p><code>context7</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>用途：实时文档检索（Context7）</li>
</ul>
<p><code>magic</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>用途：Magic UI 组件（偏前端）</li>
</ul>
<p><code>filesystem</code></p>
<ul>
<li>类型：stdio（npx）</li>
<li>参数：<code>@modelcontextprotocol/server-filesystem</code> 后面要填你自己的路径（示例是 <code>/path/to/your/projects</code>）</li>
<li>用途：文件系统操作（风险较高；建议限制授权范围）</li>
</ul>
<h3>10.2 占位符与安全建议</h3>
<ul>
<li>ECC 样例里有大量 <code>YOUR_*_HERE</code>：必须替换成你自己的值，并尽量用环境变量注入。</li>
<li>如果你把 MCP 配置提交到 Git：不要把 token/key 直接写进文件。</li>
<li>若你发现“上下文缩水很快/工具列表很长”：优先禁用不必要的 MCP。</li>
</ul>
<hr>
<h2>11. 最小启用集（按技术栈给出可落地的“默认方案”）</h2>
<p>这里的目标是：不要一上来全开 ECC 的所有功能（尤其是 MCP/插件/钩子），而是按项目栈选择一个“够用且可维护”的最小集合。</p>
<h3>11.1 TypeScript / React / Next.js 项目（推荐起步）</h3>
<p>Rules（必装）：</p>
<ul>
<li><code>rules/common/</code></li>
<li><code>rules/typescript/</code></li>
</ul>
<p>Skills（推荐）：</p>
<ul>
<li><code>skills/coding-standards</code></li>
<li><code>skills/tdd-workflow</code></li>
<li><code>skills/verification-loop</code></li>
<li><code>skills/security-review</code></li>
<li><code>skills/backend-patterns</code>（有 API/DB）</li>
<li><code>skills/frontend-patterns</code>（有复杂 UI）</li>
<li><code>skills/strategic-compact</code>（会话长时非常实用）</li>
<li>可选：<code>skills/continuous-learning</code> 或 <code>skills/continuous-learning-v2</code></li>
</ul>
<p>Commands（推荐日常链路）：</p>
<ul>
<li><code>/plan</code> → <code>/tdd</code> → <code>/code-review</code> → <code>/verify pre-pr</code></li>
<li>有关键用户旅程：加 <code>/e2e</code></li>
</ul>
<p>MCP（建议先启用 3-6 个内）：</p>
<ul>
<li><code>context7</code>：查文档（省掉大量复制粘贴）</li>
<li><code>github</code>：PR/issue 操作（如果你真的常用 MCP 而不是 gh CLI）</li>
<li><code>firecrawl</code>：需要抓网页时再启用</li>
<li><code>supabase</code>：确实用 Supabase 时才启用</li>
<li>不建议默认启用：<code>filesystem</code>（权限面大）、<code>memory</code>（工具增多会压缩上下文）</li>
</ul>
<p>Hooks（建议先上“轻量且收益高”的部分）：</p>
<ul>
<li>strategic compact（提醒你在里程碑节点 <code>/compact</code>）</li>
<li>console.log 审计（Edit 后提醒 + Stop 审计）</li>
<li>Prettier 自动格式化（团队已统一 Prettier 时收益很高；否则先别开，避免与现有格式化策略冲突）</li>
</ul>
<h3>11.2 Python / Django 项目</h3>
<p>Rules（必装）：</p>
<ul>
<li><code>rules/common/</code></li>
<li><code>rules/python/</code></li>
</ul>
<p>Skills（推荐）：</p>
<ul>
<li><code>skills/python-patterns</code></li>
<li><code>skills/python-testing</code></li>
<li><code>skills/security-review</code></li>
<li>Django 项目额外：<code>skills/django-patterns</code>、<code>skills/django-security</code>、<code>skills/django-tdd</code>、<code>skills/django-verification</code></li>
<li>DB 重：<code>skills/postgres-patterns</code></li>
</ul>
<p>Commands（推荐）：</p>
<ul>
<li><code>/plan</code> → <code>/tdd</code>（后端逻辑）→ <code>/python-review</code> → <code>/verify</code></li>
</ul>
<p>MCP（按需）：</p>
<ul>
<li><code>context7</code>（通用）</li>
<li><code>github</code>（按需）</li>
<li><code>firecrawl</code>（按需）</li>
</ul>
<p>Hooks（按需）：</p>
<ul>
<li>black/ruff（团队若统一格式化）</li>
<li>mypy/pyright（项目若有类型标注约束）</li>
</ul>
<h3>11.3 Go 项目</h3>
<p>Rules（必装）：</p>
<ul>
<li><code>rules/common/</code></li>
<li><code>rules/golang/</code></li>
</ul>
<p>Skills（推荐）：</p>
<ul>
<li><code>skills/golang-patterns</code></li>
<li><code>skills/golang-testing</code></li>
<li><code>skills/verification-loop</code></li>
<li><code>skills/security-review</code></li>
</ul>
<p>Commands（推荐）：</p>
<ul>
<li><code>/go-test</code>（TDD/测试）</li>
<li><code>/go-build</code>（build/vet 修复）</li>
<li><code>/go-review</code>（审查）</li>
</ul>
<p>Hooks（推荐）：</p>
<ul>
<li>gofmt/goimports（确保一致性）</li>
<li>go vet/staticcheck（按项目习惯启用）</li>
</ul>
<hr>
<h2>12. 常用工作流（把 rules+skills 组合起来用）</h2>
<h3>12.1 规划 → 实现（TDD）→ 审查 → 验证</h3>
<pre><code class="language-text">/plan &quot;把登录从 session 改成 JWT，并补齐测试&quot;
/tdd
/code-review
/verify
</code></pre>
<h3>12.2 交付前安全审查</h3>
<pre><code class="language-text">/security
/security-scan
</code></pre>
<hr>
<h2>13. OpenCode 支持（可选）</h2>
<p>ECC 也提供 OpenCode / Codex 等其他工具的兼容形态；本文这里保留最早整理时的 OpenCode 入口示例：</p>
<pre><code class="language-bash">npm install opencode-ecc
</code></pre>
<p>然后在你的 <code>opencode.json</code> 中启用：</p>
<pre><code class="language-json">{
  &quot;plugin&quot;: [&quot;opencode-ecc&quot;]
}
</code></pre>
<p>参考：<code>https://raw.githubusercontent.com/affaan-m/everything-claude-code/main/.opencode/README.md</code></p>
<hr>
<h2>14. 参考链接</h2>
<ul>
<li>仓库主页：<code>https://github.com/affaan-m/everything-claude-code</code></li>
<li>简体中文 README：<code>https://github.com/affaan-m/everything-claude-code/blob/main/README.zh-CN.md</code></li>
<li>Rules 安装与结构：<code>https://github.com/affaan-m/everything-claude-code/blob/main/rules/README.md</code></li>
<li>Shorthand guide：<code>https://github.com/affaan-m/everything-claude-code/blob/main/the-shortform-guide.md</code></li>
<li>Longform guide：<code>https://github.com/affaan-m/everything-claude-code/blob/main/the-longform-guide.md</code></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Oh My OpenCode</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/Using/oh-my-opencode</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/Using/oh-my-opencode</guid>
    <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    <description>1. OMO 是什么 Github Repo https://github.com/code-yeongyu/oh-my-openagent Oh My OpenCode（OMO）不是独立 IDE，也不是新命令行工具。它是 OpenCode 的增强层：你仍然使用 opencode ，但获得一套多代理、多模型、可编排的工程工作流。 补充：仓库/项目名现在已经迁移到 oh-my-openagent ，但产品名、npm 包名、很多配置名与命令仍然沿用 oh-my-opencode </description>
      <content:encoded><![CDATA[<h1>Oh My OpenCode (OMO) 使用指南</h1>
<h2>1. OMO 是什么</h2>
<p><a href="https://github.com/code-yeongyu/oh-my-openagent">Github Repo</a></p>
<p>Oh My OpenCode（OMO）不是独立 IDE，也不是新命令行工具。它是 OpenCode 的增强层：你仍然使用 <code>opencode</code>，但获得一套多代理、多模型、可编排的工程工作流。</p>
<blockquote>
<p>补充：仓库/项目名现在已经迁移到 <strong><code>oh-my-openagent</code></strong>，但产品名、npm 包名、很多配置名与命令仍然沿用 <strong><code>oh-my-opencode</code></strong> 兼容层。</p>
</blockquote>
<p>核心能力：</p>
<ul>
<li>用“规划 -&gt; 执行”拆分复杂任务，提升可控性与闭环率。</li>
<li>支持 <code>ulw</code>（ultrawork）冲刺模式，少指挥、多自动。</li>
<li>提供可验证编辑（<code>LINE#ID</code>），降低 stale-line 误改风险。</li>
<li>支持后台并行（检索/调研/实现可并行推进）。</li>
<li>内置 MCP 生态<code>websearch</code>（Exa）- 实时网页检索、<code>context7</code> - 官方文档检索、<code>grep_app</code> - GitHub 代码搜索。</li>
</ul>
<hr>
<h2>2. 安装与初始化</h2>
<blockquote>
<p>注意：安装后仍然使用 <code>opencode</code> 启动，不存在 <code>omo</code> 命令。</p>
</blockquote>
<h3>2.1 一键安装（推荐）</h3>
<p>把下面提示词直接贴给你的 Agent（Claude Code/Cursor/AmpCode 等）：</p>
<pre><code class="language-text">Install and configure oh-my-opencode by following the instructions here:
https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/guide/installation.md
</code></pre>
<h3>2.2 手动安装或更新（回退）</h3>
<pre><code class="language-bash">bunx oh-my-opencode@latest install
# 或
npx oh-my-opencode@latest install
</code></pre>
<blockquote>
<p>当前发布包名仍然是 <code>oh-my-opencode</code>。</p>
</blockquote>
<h3>2.3 初始化项目上下文（项目根目录）</h3>
<pre><code class="language-text">/init-deep
</code></pre>
<p>它会按目录层级生成 <code>AGENTS.md</code>，用于在大仓库中提供就近上下文约束。</p>
<h3>2.4 安装后验证</h3>
<pre><code class="language-bash">opencode --version
</code></pre>
<p>并检查 <code>~/.config/opencode/opencode.json</code> 的 <code>plugin</code> 数组是否包含 <code>oh-my-opencode</code>。</p>
<p>补充：现在更推荐识别/使用的插件条目名是 <code>oh-my-openagent</code>；旧的 <code>oh-my-opencode</code> 仍可加载，但通常会进入兼容路径。</p>
<h3>2.5 配置模型</h3>
<p>编辑文件<code>xxx/.config/opencode/oh-my-opencode.json</code></p>
<p>补充：当前兼容层通常同时识别：</p>
<ul>
<li><code>oh-my-openagent.json[c]</code></li>
<li><code>oh-my-opencode.json[c]</code></li>
</ul>
<hr>
<h2>3. 5 分钟快速上手（Happy Path）</h2>
<h3>3.1 启动与初始化</h3>
<pre><code class="language-bash">cd /path/to/your/project
opencode
</code></pre>
<p>进入 TUI 后执行：</p>
<pre><code class="language-text">/init-deep
</code></pre>
<h3>3.2 选一种执行模式</h3>
<p>模式 A：冲刺（<code>ulw</code>）</p>
<pre><code class="language-text">帮我把这个页面的深色模式适配一下，顺便补齐测试，ulw
</code></pre>
<p>模式 B：先规划后执行（Prometheus + Atlas）</p>
<ol>
<li>按 <code>Tab</code> 进入 Prometheus 访谈式规划</li>
<li>规划确认后执行：</li>
</ol>
<pre><code class="language-text">/start-work
</code></pre>
<blockquote>
<p>注意：复杂任务请写清楚边界与验收条件，否则规划容易发散、执行容易中断。</p>
</blockquote>
<hr>
<h2>4. 工作流与指令（速查）</h2>
<h3>4.1 触发类型</h3>
<ul>
<li>关键词触发：<code>ulw</code> / <code>ultrawork</code></li>
<li>prompt 触发：<code>@plan</code></li>
<li>slash 命令：<code>/init-deep</code>、<code>/start-work</code> 等</li>
</ul>
<h3>4.2 常用指令表</h3>
<table>
<thead>
<tr>
<th>命令/触发</th>
<th>类型</th>
<th>用途</th>
<th>最小用法</th>
<th>常见误用</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ulw</code> / <code>ultrawork</code></td>
<td>关键词</td>
<td>自动化冲刺执行</td>
<td><code>修复 X 并补测，ulw</code></td>
<td>把它当 slash 命令</td>
</tr>
<tr>
<td><code>@plan</code></td>
<td>prompt</td>
<td>复杂任务先规划</td>
<td><code>@plan 重构鉴权模块并保持行为不变</code></td>
<td>不给边界与验收</td>
</tr>
<tr>
<td><code>/init-deep</code></td>
<td>slash</td>
<td>新项目接入 OMO</td>
<td><code>/init-deep</code></td>
<td>不在仓库根（或子目录）执行</td>
</tr>
<tr>
<td><code>/start-work</code></td>
<td>slash</td>
<td>按计划执行闭环</td>
<td><code>/start-work</code></td>
<td>没有计划就直接执行</td>
</tr>
<tr>
<td><code>/ulw-loop</code></td>
<td>slash</td>
<td>ultrawork + 循环推进</td>
<td><code>/ulw-loop &quot;批量修复 lint + type 错误&quot;</code></td>
<td>用在小任务上导致过度开销</td>
</tr>
<tr>
<td><code>/ralph-loop</code></td>
<td>slash</td>
<td>长任务持续推进</td>
<td><code>/ralph-loop &quot;迁移旧接口到新 SDK&quot;</code></td>
<td>目标不清晰就开循环</td>
</tr>
<tr>
<td><code>/cancel-ralph</code></td>
<td>slash</td>
<td>停止 ralph 循环</td>
<td><code>/cancel-ralph</code></td>
<td>以为会停止所有机制</td>
</tr>
<tr>
<td><code>/stop-continuation</code></td>
<td>slash</td>
<td>停止 continuation 机制</td>
<td><code>/stop-continuation</code></td>
<td>以为会撤销已完成修改</td>
</tr>
<tr>
<td><code>/refactor</code></td>
<td>slash</td>
<td>结构化重构入口</td>
<td><code>/refactor src/auth --strategy=safe</code></td>
<td>把功能新增当重构任务</td>
</tr>
<tr>
<td><code>/handoff</code></td>
<td>slash</td>
<td>跨会话交接</td>
<td><code>/handoff</code></td>
<td>只写一句话，没带上下文</td>
</tr>
</tbody>
</table>
<h3>自定义命令</h3>
<p>自定义 Slash 命令可从以下位置加载：</p>
<p><code>.opencode/commands/*.md</code>（项目）
<code>~/.config/opencode/commands/*.md</code>（用户）
<code>.claude/commands/*.md</code>（Claude Code 兼容）
<code>~/.claude/commands/*.md</code>（Claude Code 用户）</p>
<hr>
<h2>5. 配置与文件（你要改哪里）</h2>
<h3>5.1 常见配置位置</h3>
<ul>
<li>项目级：<code>.opencode/oh-my-opencode.jsonc</code></li>
<li>用户级：<code>~/.config/opencode/oh-my-opencode.jsonc</code></li>
</ul>
<p>另外，OpenCode 自身插件列表在：<code>~/.config/opencode/opencode.json</code>（用于确认 <code>oh-my-opencode</code> 是否被加载）。</p>
<p>补充：迁移期内，下面两组文件名通常都能被识别：</p>
<ul>
<li><code>.opencode/oh-my-openagent.jsonc</code></li>
<li><code>.opencode/oh-my-opencode.jsonc</code></li>
<li><code>~/.config/opencode/oh-my-openagent.jsonc</code></li>
<li><code>~/.config/opencode/oh-my-opencode.jsonc</code></li>
</ul>
<h3>5.2 最小配置示例</h3>
<pre><code class="language-jsonc">{
  &quot;agents&quot;: {
    &quot;sisyphus&quot;: { &quot;model&quot;: &quot;anthropic/claude-opus-4-6&quot; },
    &quot;hephaestus&quot;: { &quot;model&quot;: &quot;openai/gpt-5.3-codex&quot; }
  },
  &quot;categories&quot;: {
    &quot;visual-engineering&quot;: { &quot;model&quot;: &quot;google/gemini-3-pro&quot; },
    &quot;quick&quot;: { &quot;model&quot;: &quot;anthropic/claude-haiku-4-5&quot; }
  }
}
</code></pre>
<p>字段含义（只记两点即可）：</p>
<ul>
<li><code>agents</code>：为具体 Agent 指定模型（编排/执行/检索等角色）。</li>
<li><code>categories</code>：为任务类别指定默认模型（例如 <code>visual-engineering</code>）。</li>
</ul>
<h3>5.3 关键文件怎么用</h3>
<table>
<thead>
<tr>
<th>路径</th>
<th>谁生成/谁维护</th>
<th>用途</th>
<th>常见误用</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>AGENTS.md</code>（分层）</td>
<td><code>/init-deep</code> 生成</td>
<td>给 agent 提供“就近上下文约束”，减少上下文污染</td>
<td>以为它会自动更新业务规则</td>
</tr>
<tr>
<td><code>.opencode/oh-my-opencode.jsonc</code></td>
<td>你维护（项目级）</td>
<td>团队共享的 OMO 路由/模型覆盖</td>
<td>提交了本地密钥或私密模型名</td>
</tr>
<tr>
<td><code>~/.config/opencode/oh-my-opencode.jsonc</code></td>
<td>你维护（用户级）</td>
<td>个人偏好覆盖（不影响仓库）</td>
<td>用用户级配置覆盖掉团队约束</td>
</tr>
<tr>
<td><code>~/.config/opencode/opencode.json</code></td>
<td>OpenCode 维护</td>
<td>OpenCode 全局配置；用于确认插件已加载（<code>oh-my-openagent</code> / <code>oh-my-opencode</code>）</td>
<td>把 OMO 配置写进这里导致难以迁移</td>
</tr>
</tbody>
</table>
<hr>
<h2>6. 模型路由</h2>
<p>OMO 的重点是“任务语义路由”，而不是“手动切模型”。常见角色如下：</p>
<table>
<thead>
<tr>
<th>代理/类别</th>
<th>核心职责</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Sisyphus（总控）</strong></td>
<td>默认总编排器：规划、拆解、并行委派子任务并执行闭环（todo 驱动，强并发）。</td>
</tr>
<tr>
<td><strong>Hephaestus（执行）</strong></td>
<td>深度自主实现：复杂调试、架构落地、端到端完成任务（“深度模式/工匠”）。</td>
</tr>
<tr>
<td><strong>Oracle（分析推理）</strong></td>
<td>架构决策/代码审查/疑难 Debug 咨询：只读分析，给高质量推理建议。</td>
</tr>
<tr>
<td><strong>Librarian（资料库）</strong></td>
<td>多仓库/文档/开源实现检索与对比：证据驱动的解释与定位。</td>
</tr>
<tr>
<td><strong>Explore（代码库）</strong></td>
<td>快速扫代码库、grep/上下文定位：为主 Agent 提供“快而准”的线索。</td>
</tr>
<tr>
<td><strong>Multimodal-Looker（眼睛）</strong></td>
<td>视觉内容专家：分析 PDF / 图片 / 图表 / 截图提取信息（只读）。</td>
</tr>
<tr>
<td><strong>Prometheus（需求访谈）</strong></td>
<td>访谈式规划：通过迭代提问产出可执行的详细计划。</td>
</tr>
<tr>
<td><strong>Metis（规划）</strong></td>
<td>计划顾问（pre-planning）：挖掘隐藏意图、歧义、潜在失败点。</td>
</tr>
<tr>
<td><strong>Momus（挑刺）</strong></td>
<td>计划审稿人：按清晰度/可验证性/完整性标准“挑刺”与校验。</td>
</tr>
<tr>
<td><strong>Atlas（团队管理）</strong></td>
<td>todo-list 执行编排：按计划逐项推进、管理 todo 并协调执行（自身不再委派）。</td>
</tr>
<tr>
<td><strong>Sisyphus-Junior（临时工）</strong></td>
<td>被 <code>task(category=...)</code> 生成的执行体：模型随 category 自动选择；禁止再次委派，防止无限递归。</td>
</tr>
</tbody>
</table>
<p>默认模型映射（来自 OMO <code>features</code><a href="https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/dev/docs/reference/features.md">文档</a> ，建议先按默认跑通）：</p>
<table>
<thead>
<tr>
<th>Agent</th>
<th>推荐模型（默认/备选）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Sisyphus</strong></td>
<td><code>claude-opus-4-6</code>（Fallback：<code>gpt-5.3-codex</code> → deep quality chain）</td>
</tr>
<tr>
<td><strong>Hephaestus</strong></td>
<td><code>gpt-5.3-codex</code>（Fallback：deep quality chain：<code>claude-opus-4-6-thinking</code> → <code>step-3.5-flash</code> → <code>glm-5</code> → …）</td>
</tr>
<tr>
<td><strong>Oracle</strong></td>
<td><code>gpt-5.3-codex</code>（Fallback：<code>claude-opus-4-6-thinking</code> → <code>claude-sonnet-4-5-thinking</code> → deep quality chain）</td>
</tr>
<tr>
<td><strong>Librarian</strong></td>
<td><code>claude-sonnet-4-5</code>（Fallback：speed chain：<code>claude-haiku-4-5</code> → <code>gpt-5-mini</code> → … → quality chain）</td>
</tr>
<tr>
<td><strong>Explore</strong></td>
<td><code>claude-haiku-4-5</code>（Fallback：<code>oswe-vscode-prime</code> → <code>gpt-5-mini</code> → <code>gpt-4.1</code> → extended speed chain）</td>
</tr>
<tr>
<td><strong>Multimodal-Looker</strong></td>
<td><code>gemini-3-pro-image</code>（Fallback：<code>gemini-3-pro-high</code> → <code>gemini-3-flash</code> → <code>kimi-k2.5</code> → <code>claude-opus-4-6-thinking</code> → <code>claude-sonnet-4-5-thinking</code> → <code>claude-haiku-4-5</code> → <code>gpt-5-nano</code>）</td>
</tr>
<tr>
<td><strong>Prometheus</strong></td>
<td><code>claude-opus-4-6-thinking</code>（Fallback：<code>gpt-5.3-codex</code> → <code>claude-sonnet-4-5-thinking</code> → deep quality chain）</td>
</tr>
<tr>
<td><strong>Metis</strong></td>
<td><code>claude-opus-4-6-thinking</code>（Fallback：<code>gpt-5.3-codex</code> → <code>claude-sonnet-4-5-thinking</code> → deep quality chain）</td>
</tr>
<tr>
<td><strong>Momus</strong></td>
<td><code>gpt-5.3-codex</code>（Fallback：<code>claude-opus-4-6-thinking</code> → deep quality chain）</td>
</tr>
<tr>
<td><strong>Atlas</strong></td>
<td><code>claude-sonnet-4-5-thinking</code>（Fallback：<code>claude-opus-4-6-thinking</code> → <code>gpt-5.3-codex</code> → deep quality chain）</td>
</tr>
<tr>
<td><strong>Sisyphus-Junior</strong></td>
<td><em>(category-dependent)</em>（随 category 自动选模型）</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Category</th>
<th>默认模型</th>
<th>典型用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>visual-engineering</code></td>
<td><code>google/gemini-3-pro</code></td>
<td>前端 / UI/UX / 动效 / 视觉实现</td>
</tr>
<tr>
<td><code>ultrabrain</code></td>
<td><code>openai/gpt-5.3-codex</code>（xhigh）</td>
<td>极深推理、复杂架构决策</td>
</tr>
<tr>
<td><code>deep</code></td>
<td><code>openai/gpt-5.3-codex</code>（medium）</td>
<td>“深度模式”自主问题解决</td>
</tr>
<tr>
<td><code>artistry</code></td>
<td><code>google/gemini-3-pro</code>（max）</td>
<td>创意/审美/新颖方案</td>
</tr>
<tr>
<td><code>quick</code></td>
<td><code>anthropic/claude-haiku-4-5</code></td>
<td>小修小补、低成本快速改动</td>
</tr>
<tr>
<td><code>unspecified-low</code></td>
<td><code>anthropic/claude-sonnet-4-6</code></td>
<td>通用低难任务</td>
</tr>
<tr>
<td><code>unspecified-high</code></td>
<td><code>anthropic/claude-opus-4-6</code>（max）</td>
<td>通用高难任务</td>
</tr>
<tr>
<td><code>writing</code></td>
<td><code>kimi-for-coding/k2p5</code></td>
<td>文档、说明、技术写作</td>
</tr>
</tbody>
</table>
<hr>
<h2>7. FAQ（常见坑）</h2>
<h3>7.1 为什么看不到 OMO 效果？</h3>
<p>先确认你是用 <code>opencode</code> 启动，并且插件已加载；再确认是否触发了 <code>ulw</code> 或 <code>/start-work</code> 路径。</p>
<h3>7.2 任务经常中途停？</h3>
<p>复杂任务先规划再执行，尽量给出明确验收条件，不要只给一句模糊需求。</p>
<h3>7.3 我应该先学哪三个？</h3>
<ol>
<li><code>/init-deep</code></li>
<li><code>ulw</code></li>
<li><code>/start-work</code></li>
</ol>
<hr>
<h2>8. 参考链接</h2>
<pre><code class="language-text">https://github.com/code-yeongyu/oh-my-openagent
https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/guide/installation.md
https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/guide/overview.md
https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/guide/orchestration.md
https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/reference/features.md
https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/reference/configuration.md
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>Spec Kit（spec-kit）</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/Using/spec-kit</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/Using/spec-kit</guid>
    <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    <description>1. Spec Kit 是什么 Github Repo https://github.com/github/spec-kit Spec Kit 是 GitHub 出品的“Spec Driven Development”工具包：用 specify CLI + 一套 speckit. 命令模板，把“想法 - 规格 - 计划 - 任务 - 实现”固化成可重复的工程流程。 核心能力： 一条命令初始化项目内的 .specify/ 工作区与 AI 工具命令集（Claude/Codex/C</description>
      <content:encoded><![CDATA[<h1>Spec Kit（spec-kit）使用指南</h1>
<h2>1. Spec Kit 是什么</h2>
<p><a href="https://github.com/github/spec-kit">Github Repo</a></p>
<p>Spec Kit 是 GitHub 出品的“Spec Driven Development”工具包：用 <code>specify</code> CLI + 一套 <code>speckit.*</code> 命令模板，把“想法 -&gt; 规格 -&gt; 计划 -&gt; 任务 -&gt; 实现”固化成可重复的工程流程。</p>
<p>核心能力：</p>
<ul>
<li>一条命令初始化项目内的 <code>.specify/</code> 工作区与 AI 工具命令集（Claude/Codex/Cursor/Gemini/OpenCode 等）。</li>
<li>用 <code>speckit.*</code> 命令生成 <code>specs/&lt;feature&gt;/</code> 下的规格、计划与任务拆解。</li>
<li>支持两种脚本模板：<code>--script sh</code>（Bash）与 <code>--script ps</code>（PowerShell）。</li>
<li>提供扩展系统（extensions）：在 <code>.specify/extensions.yml</code> 声明并按需启用额外命令/规则。</li>
</ul>
<blockquote>
<p>补充：当前官方流程已经明确包含 <code>/speckit.implement</code>，并新增 <code>/speckit.clarify</code>、<code>/speckit.analyze</code>、<code>/speckit.checklist</code> 这些增强命令。</p>
</blockquote>
<hr>
<h2>2. 安装与部署</h2>
<blockquote>
<p>Spec Kit 本质是一个 Python CLI（命令为 <code>specify</code>），仓库内文档使用 <code>uv</code>(python <code>pip install uv</code>) 安装/运行。</p>
</blockquote>
<h3>2.1 macOS / Windows / Linux</h3>
<blockquote>
<p>README 主要以 <code>uv</code>（跨平台）安装为例。</p>
</blockquote>
<pre><code class="language-bash">uv tool install specify-cli --from git+https://github.com/github/spec-kit.git
specify --help
</code></pre>
<p>一次性运行（免安装）：</p>
<pre><code class="language-bash">uvx --from git+https://github.com/github/spec-kit.git specify --help
</code></pre>
<h3>2.2 Docker（可选）</h3>
<p>如需容器化，通常做法是在镜像中安装 <code>uv</code> 与 <code>specify-cli</code>，并挂载项目目录运行 <code>specify</code>。</p>
<hr>
<h2>3. 快速上手（Happy Path）</h2>
<h3>3.1 初始化（项目根目录）</h3>
<pre><code class="language-bash">cd /path/to/your/project
specify init
</code></pre>
<p>常用参数：</p>
<pre><code class="language-bash">specify init --ai claude
specify init --ai codex
specify init --script sh   # Bash 模板
specify init --script ps   # PowerShell 模板（无需 WSL）
</code></pre>
<blockquote>
<p>注意：<code>--ai generic</code> 必须同时指定 <code>--ai-commands-dir</code>（命令输出目录），否则会报错并退出。</p>
</blockquote>
<h3>3.2 生成一个 feature 的规格/计划/任务（以 Claude Code 为例）</h3>
<ol>
<li><code>/speckit.constitution</code> -&gt; <code>.specify/memory/constitution.md</code></li>
<li><code>/speckit.specify</code> -&gt; <code>specs/&lt;feature&gt;/spec.md</code></li>
<li><code>/speckit.clarify</code>（推荐） -&gt; 先补清需求中的歧义项</li>
<li><code>/speckit.plan</code> -&gt; <code>specs/&lt;feature&gt;/plan.md</code> + <code>research.md</code> + <code>data-model.md</code> + <code>quickstart.md</code> + <code>contracts/</code></li>
<li><code>/speckit.tasks</code> -&gt; <code>specs/&lt;feature&gt;/tasks.md</code>（注意：<code>tasks.md</code> 不由 <code>/speckit.plan</code> 生成）</li>
<li><code>/speckit.analyze</code>（可选） -&gt; 在实现前做规格/计划/任务之间的一致性检查</li>
<li><code>/speckit.implement</code> -&gt; 按计划和任务开始实现</li>
</ol>
<blockquote>
<p>注意：<code>&lt;feature&gt;</code> 默认来自当前 git 分支（如 <code>001-photo-albums</code>）；非 git 工作流可设置 <code>SPECIFY_FEATURE</code>。</p>
</blockquote>
<hr>
<h2>4. 深度功能（你会真正用到的亮点）</h2>
<h3>4.1 <code>specify check</code>：环境自检</h3>
<pre><code class="language-bash">specify check
</code></pre>
<p>它会检查依赖与部分常用工具是否可用，并对 Claude 做额外路径提示（例如 <code>~/.claude/local/claude</code>）。</p>
<h3>4.2 Extensions：把新能力“挂载”到 Spec Kit</h3>
<pre><code class="language-bash">specify extension --help
</code></pre>
<p>扩展相关目录：<code>.specify/extensions.yml</code>、<code>.specify/extensions/.registry</code>、<code>.specify/extensions/.cache/</code>。</p>
<hr>
<h2>5. Spec 生成文件怎么用（重点）</h2>
<p>Spec Kit 的输出以 <code>specs/&lt;feature&gt;/</code> 为中心。常见顺序：先写规格（spec）再写计划（plan）再拆任务（tasks），最后实现与验收。</p>
<blockquote>
<p>注意：<code>&lt;feature&gt;</code> 默认来自当前 git 分支名；不走 git 分支流时，先设置 <code>SPECIFY_FEATURE</code>。</p>
</blockquote>
<h3>5.1 输出清单（每个文件怎么用）</h3>
<table>
<thead>
<tr>
<th>路径</th>
<th>生成来源</th>
<th>你用它做什么（建议亲自审一遍）</th>
<th>下一步</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>spec.md</code></td>
<td><code>/speckit.specify</code></td>
<td>写清用户故事（含优先级 P1/P2/P3）、验收场景（Given/When/Then）、边界条件（Edge Cases）、需求（FR-xxx）、成功标准（SC-xxx）</td>
<td>把 “NEEDS CLARIFICATION” 清零后再做 plan</td>
</tr>
<tr>
<td><code>plan.md</code></td>
<td><code>/speckit.plan</code></td>
<td>实现路线图：技术上下文、门禁（Constitution Check）、项目结构选择、复杂度偏离说明、分阶段交付与验证点</td>
<td>以它为准做任务拆解</td>
</tr>
<tr>
<td><code>research.md</code></td>
<td><code>/speckit.plan</code></td>
<td>Phase 0：把 <code>spec.md</code> 里的不确定项逐条补齐（尤其是 “NEEDS CLARIFICATION”）</td>
<td>结论要回写到 plan/contracts/data-model</td>
</tr>
<tr>
<td><code>data-model.md</code></td>
<td><code>/speckit.plan</code></td>
<td>Phase 1：把关键实体/字段/关系/约束写成可实现的数据模型</td>
<td>先对齐模型，再写代码与测试</td>
</tr>
<tr>
<td><code>quickstart.md</code></td>
<td><code>/speckit.plan</code></td>
<td>Phase 1：最短验证路径（命令块 + 成功判据），用于 smoke test/交付演示</td>
<td>实现完成后用它做最后验收</td>
</tr>
<tr>
<td><code>contracts/</code></td>
<td><code>/speckit.plan</code></td>
<td>Phase 1：接口契约（例如 OpenAPI/JSON schema/事件定义），用于契约测试与 mock</td>
<td>契约优先更新，再改实现与测试</td>
</tr>
<tr>
<td><code>tasks.md</code></td>
<td><code>/speckit.tasks</code></td>
<td>可执行清单：按 User Story 分组；任务带 ID（<code>T001</code>…）；<code>[P]</code> 可并行；可选 tests（仅 spec 要求时才写）</td>
<td>按任务逐条落地并回填验证结果</td>
</tr>
</tbody>
</table>
<p>典型写法（示意，按你项目改字段即可）：</p>
<pre><code class="language-md">## Acceptance Scenarios
### SC-001: Anonymous user can sign up
Given ...
When ...
Then ...

- [ ] T001 [P] Implement signup endpoint
Done when: ...
</code></pre>
<h3>5.2 迭代建议（不容易跑偏的最小闭环）</h3>
<ol>
<li>先把 <code>spec.md</code> 的验收场景写到位（Happy path + 失败路径）。</li>
<li>发现不确定性就让 <code>/speckit.plan</code> 补齐 <code>research.md</code>，把结论转成约束条目。</li>
<li>数据/接口变化先落到 <code>data-model.md</code> 与 <code>contracts/</code>，再改实现。</li>
<li>每次大改 spec 后，重新生成/修订 <code>plan.md</code> 和 <code>tasks.md</code>（避免任务与规格脱节）。</li>
</ol>
<hr>
<h2>6. 进阶/架构信息（精准速查）</h2>
<p>Spec Kit 的数据都落在项目目录中（不使用数据库），路径在 macOS/Windows/Linux 下保持一致（均为项目相对路径）。</p>
<h3>6.1 关键目录</h3>
<table>
<thead>
<tr>
<th>位置</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.specify/</code></td>
<td>工作区根目录（memory/templates/scripts/extensions 等）</td>
</tr>
<tr>
<td><code>.specify/memory/constitution.md</code></td>
<td>项目“宪法”；若已存在，初始化不会覆盖</td>
</tr>
<tr>
<td><code>.specify/templates/</code></td>
<td>命令模板（例如 <code>constitution-template.md</code>）</td>
</tr>
<tr>
<td><code>.specify/scripts/</code></td>
<td>内置脚本（按 `--script sh</td>
</tr>
<tr>
<td><code>.specify/extensions.yml</code></td>
<td>扩展启用清单（YAML）</td>
</tr>
<tr>
<td><code>.specify/extensions/.registry</code></td>
<td>扩展注册表（已安装/启用状态）</td>
</tr>
<tr>
<td><code>.specify/extensions/.cache/</code></td>
<td>扩展与 catalog 缓存目录</td>
</tr>
<tr>
<td><code>.specify/extensions/&lt;ext_id&gt;/</code></td>
<td>单个扩展的本地文件与配置</td>
</tr>
<tr>
<td><code>.specify/extensions/&lt;ext_id&gt;/&lt;ext_id&gt;-config.yml</code></td>
<td>扩展项目级配置（可选）</td>
</tr>
<tr>
<td><code>.specify/extensions/&lt;ext_id&gt;/local-config.yml</code></td>
<td>扩展本地配置（可选，通常不入库）</td>
</tr>
</tbody>
</table>
<hr>
<h3>6.2  <code>specify init</code> 参数（以源码为准）</h3>
<table>
<thead>
<tr>
<th>参数</th>
<th>是否必填</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>--ai &lt;name&gt;</code></td>
<td>否</td>
<td>选择 AI 工具模板；不传则交互式选择</td>
</tr>
<tr>
<td>`--script sh</td>
<td>ps`</td>
<td>否</td>
</tr>
<tr>
<td><code>--here</code></td>
<td>否</td>
<td>将模板写入当前目录（而非创建新目录）</td>
</tr>
<tr>
<td><code>--force</code></td>
<td>否</td>
<td>跳过覆盖/危险操作确认</td>
</tr>
<tr>
<td><code>--no-git</code></td>
<td>否</td>
<td>不要求/不依赖 git 分支名推导 feature</td>
</tr>
<tr>
<td><code>--github-token &lt;token&gt;</code></td>
<td>否</td>
<td>GitHub API Token（用于拉取最新模板 release）</td>
</tr>
<tr>
<td><code>--skip-tls</code></td>
<td>否</td>
<td>跳过 TLS 校验（仅排障）</td>
</tr>
<tr>
<td><code>--debug</code></td>
<td>否</td>
<td>打印调试日志</td>
</tr>
<tr>
<td><code>--ai-commands-dir &lt;dir&gt;</code></td>
<td>条件必填</td>
<td>仅 <code>--ai generic</code> 需要：把命令文件输出到指定目录</td>
</tr>
<tr>
<td><code>--ai-skills</code></td>
<td>否</td>
<td>将 <code>speckit.*</code> 安装为 Agent Skills（<a href="http://Prompt.MD">Prompt.MD</a>）；需要同时指定 <code>--ai</code></td>
</tr>
</tbody>
</table>
<hr>
<h3>6.3 环境变量（含 extensions 规则）</h3>
<table>
<thead>
<tr>
<th>变量</th>
<th>是否必填</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GH_TOKEN</code></td>
<td>否</td>
<td>GitHub API Token（等价替代 <code>--github-token</code>）</td>
</tr>
<tr>
<td><code>GITHUB_TOKEN</code></td>
<td>否</td>
<td>GitHub API Token（等价替代 <code>--github-token</code>）</td>
</tr>
<tr>
<td><code>SPECIFY_FEATURE</code></td>
<td>否</td>
<td>覆盖 feature 名推导（脚本/命令会优先用它）</td>
</tr>
<tr>
<td><code>CODEX_HOME</code></td>
<td>否</td>
<td>使用 Codex CLI 时需指向项目内 <code>.codex/</code>（示例：<code>export CODEX_HOME=&quot;$PWD/.codex&quot;</code>）</td>
</tr>
<tr>
<td><code>SPECKIT_&lt;EXT&gt;_&lt;SECTION&gt;_&lt;KEY&gt;</code></td>
<td>否</td>
<td>扩展配置覆盖：会覆盖扩展 YAML 中对应键（<code>&lt;EXT&gt;</code> 会先转为全大写并把 <code>-</code> 替换为 <code>_</code>）</td>
</tr>
</tbody>
</table>
<h3>6.4 各 AI 工具命令落盘位置（常用）</h3>
<table>
<thead>
<tr>
<th><code>--ai</code> 值</th>
<th>命令目录（项目内）</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>claude</code></td>
<td><code>.claude/commands/</code></td>
</tr>
<tr>
<td><code>codex</code></td>
<td><code>.codex/prompts/</code></td>
</tr>
<tr>
<td><code>cursor-agent</code></td>
<td><code>.cursor/commands/</code></td>
</tr>
<tr>
<td><code>gemini</code></td>
<td><code>.gemini/commands/</code></td>
</tr>
<tr>
<td><code>opencode</code></td>
<td><code>.opencode/command/</code></td>
</tr>
<tr>
<td><code>copilot</code></td>
<td><code>.github/agents/</code></td>
</tr>
<tr>
<td><code>windsurf</code></td>
<td><code>.windsurf/workflows/</code></td>
</tr>
<tr>
<td><code>generic</code></td>
<td>由 <code>--ai-commands-dir</code> 指定</td>
</tr>
</tbody>
</table>
<p>AI Skills 安装目录（<code>specify init --ai &lt;name&gt; --ai-skills</code>）：默认在对应 agent 目录下创建 <code>skills/</code>；Codex 使用 <code>.agents/skills/</code>；若 agent 目录不存在则回退到 <code>.agents/skills/</code>。</p>
<blockquote>
<p>注意：仓库源码里支持的 <code>--ai</code> 远不止上表（例如 <code>qwen</code>、<code>kilocode</code>、<code>roo</code>、<code>amp</code>、<code>amazonq</code> 等）；需要全量列表时，读 <code>src/specify_cli/__init__.py</code> 的 <code>AGENT_CONFIG</code>。</p>
</blockquote>
<h3>6.5 自定义生成模板（按项目改写输出结构）</h3>
<p>初始化后，模板在 <code>.specify/templates/</code>；常见包括 <code>spec-template.md</code>、<code>plan-template.md</code>、<code>tasks-template.md</code>、<code>constitution-template.md</code>。你想改“生成的文档长什么样”，就改这些模板，再重新运行对应的 <code>/speckit.*</code> 命令生成新版本。</p>
<hr>
<h2>7. FAQ（常见坑）</h2>
<h3>7.1 我没用 git 分支，<code>specs/&lt;feature&gt;/</code> 生成到哪？</h3>
<p>设置 feature 名再运行命令即可：</p>
<pre><code class="language-bash">export SPECIFY_FEATURE=&quot;001-my-feature&quot;
</code></pre>
<h3>7.2 <code>specify init --script bash</code> 为什么报错？</h3>
<p>当前源码只接受 <code>--script sh</code> 或 <code>--script ps</code>。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Homebrew</title>
      <link>https://develata.me/knowledge/sharing/Linux/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/Homebrew</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/Homebrew</guid>
    <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
    <description>1. 什么是 Homebrew Homebrew 官网 https://brew.sh/ Homebrew 是 macOS / Linux 上常用的命令行包管理器。在 Linux 上，它更适合扮演“系统包管理器的补充”： - 适合装新工具 ：当发行版仓库版本偏旧时，Homebrew 往往能提供更现代的 CLI / 开发工具。 - 跨平台一致 ：同一套 brew 命令可以同时管理 macOS、Linux，甚至 WSL 2 环境。 - 隔离性较好 ：默认安装到 /home/lin</description>
      <content:encoded><![CDATA[<h1>Homebrew 使用指南</h1>
<h2>1. 什么是 Homebrew</h2>
<p><a href="https://brew.sh/">Homebrew 官网</a></p>
<p>Homebrew 是 macOS / Linux 上常用的命令行包管理器。在 Linux 上，它更适合扮演“系统包管理器的补充”：</p>
<ul>
<li><strong>适合装新工具</strong>：当发行版仓库版本偏旧时，Homebrew 往往能提供更现代的 CLI / 开发工具。</li>
<li><strong>跨平台一致</strong>：同一套 <code>brew</code> 命令可以同时管理 macOS、Linux，甚至 WSL 2 环境。</li>
<li><strong>隔离性较好</strong>：默认安装到 <code>/home/linuxbrew/.linuxbrew</code>，尽量减少对系统目录的直接污染。</li>
</ul>
<blockquote>
<p>建议把 Homebrew 理解为 <code>apt</code> / <code>dnf</code> / <code>pacman</code> 的补充，而不是替代品。内核、驱动、system library、桌面核心组件仍优先交给发行版自身管理。</p>
</blockquote>
<hr>
<h2>2. 安装与部署</h2>
<h3>2.1 环境要求</h3>
<p>Homebrew 官方对 Linux 的推荐环境大致如下：</p>
<ul>
<li><strong>Tier 1</strong>：支持窗口内的 Ubuntu，或 Homebrew 官方 Docker 镜像。</li>
<li><strong>默认前缀</strong>：<code>/home/linuxbrew/.linuxbrew</code></li>
<li><strong>架构</strong>：<code>x86_64</code> 或 <code>ARM64/AArch64</code></li>
<li><strong>glibc</strong>：<code>&gt;= 2.35</code> 最稳；<code>2.13 ~ 2.34</code> 仍可用，但通常会自动补装 Homebrew 自己的 <code>glibc</code></li>
</ul>
<p>如果你装在默认前缀之外，很多包会失去 bottle（二进制包）优势，被迫源码编译，速度更慢、问题更多。</p>
<h3>2.2 安装依赖</h3>
<p>先用系统包管理器装好基础依赖：</p>
<pre><code class="language-bash"># Debian / Ubuntu
sudo apt-get install build-essential procps curl file git

# Fedora
sudo dnf group install development-tools
sudo dnf install procps-ng curl file

# CentOS Stream / RHEL
sudo dnf group install 'Development Tools'
sudo dnf install procps-ng curl file

# Arch Linux
sudo pacman -S base-devel procps-ng curl file git
</code></pre>
<h3>2.3 一行命令安装</h3>
<p>执行官方安装脚本：</p>
<pre><code class="language-bash">/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;
</code></pre>
<p>Linux 下推荐安装位置是：</p>
<pre><code class="language-bash">/home/linuxbrew/.linuxbrew
</code></pre>
<p>安装过程中可能会请求 <code>sudo</code> 来创建或修复默认前缀；安装完成后，日常 <code>brew install</code> 一般不再需要 <code>sudo</code>。</p>
<h3>2.4 配置环境变量</h3>
<p>安装完成后，把 <code>brew</code> 加入当前 shell：</p>
<pre><code class="language-bash">test -d ~/.linuxbrew &amp;&amp; eval &quot;$(~/.linuxbrew/bin/brew shellenv)&quot;
test -d /home/linuxbrew/.linuxbrew &amp;&amp; eval &quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)&quot;
echo 'eval &quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)&quot;' &gt;&gt; ~/.bashrc
</code></pre>
<p>如果你用的是 <code>zsh</code>，把最后一行写入 <code>~/.zshrc</code> 即可。</p>
<h3>2.5 验证安装</h3>
<pre><code class="language-bash">brew --version
brew config
brew doctor
</code></pre>
<p>其中 <code>brew --version</code> 用来确认命令存在，<code>brew config</code> 用来查看当前前缀和系统信息，<code>brew doctor</code> 用来排查常见环境问题。</p>
<hr>
<h2>3. 快速上手</h2>
<h3>3.1 常用命令速查</h3>
<table>
<thead>
<tr>
<th style="text-align:left">操作</th>
<th style="text-align:left">命令</th>
<th style="text-align:left">示例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">搜索软件</td>
<td style="text-align:left"><code>brew search &lt;keyword&gt;</code></td>
<td style="text-align:left"><code>brew search python</code></td>
</tr>
<tr>
<td style="text-align:left">查看详情</td>
<td style="text-align:left"><code>brew info &lt;formula&gt;</code></td>
<td style="text-align:left"><code>brew info node</code></td>
</tr>
<tr>
<td style="text-align:left">安装软件</td>
<td style="text-align:left"><code>brew install &lt;formula&gt;</code></td>
<td style="text-align:left"><code>brew install wget</code></td>
</tr>
<tr>
<td style="text-align:left">查看已装</td>
<td style="text-align:left"><code>brew list</code></td>
<td style="text-align:left"><code>brew list</code></td>
</tr>
<tr>
<td style="text-align:left">检查更新</td>
<td style="text-align:left"><code>brew outdated</code></td>
<td style="text-align:left"><code>brew outdated</code></td>
</tr>
<tr>
<td style="text-align:left">更新索引</td>
<td style="text-align:left"><code>brew update</code></td>
<td style="text-align:left"><code>brew update</code></td>
</tr>
<tr>
<td style="text-align:left">升级软件</td>
<td style="text-align:left"><code>brew upgrade</code></td>
<td style="text-align:left"><code>brew upgrade</code></td>
</tr>
<tr>
<td style="text-align:left">卸载软件</td>
<td style="text-align:left"><code>brew uninstall &lt;formula&gt;</code></td>
<td style="text-align:left"><code>brew uninstall wget</code></td>
</tr>
<tr>
<td style="text-align:left">清理缓存/旧版本</td>
<td style="text-align:left"><code>brew cleanup</code></td>
<td style="text-align:left"><code>brew cleanup</code></td>
</tr>
<tr>
<td style="text-align:left">清理无用依赖</td>
<td style="text-align:left"><code>brew autoremove</code></td>
<td style="text-align:left"><code>brew autoremove</code></td>
</tr>
</tbody>
</table>
<h3>3.2 先装几个高频工具</h3>
<p>Homebrew 在 Linux 上最适合先装现代 CLI 工具：</p>
<pre><code class="language-bash">brew install wget curl jq ripgrep fd fzf bat eza zoxide neovim
</code></pre>
<p>如果你是第一次使用，建议顺手了解两个目录：</p>
<pre><code class="language-bash">brew --prefix
brew --cellar
</code></pre>
<p><code>prefix</code> 是 Homebrew 当前工作前缀，<code>cellar</code> 是公式实际安装目录。</p>
<h3>3.3 你应该形成的基本习惯</h3>
<p>日常维护通常就是这一套：</p>
<pre><code class="language-bash">brew update
brew outdated
brew upgrade
brew cleanup
</code></pre>
<p>Homebrew 会自动做部分清理，但手动执行一次 <code>brew cleanup</code> 仍然是好习惯。</p>
<hr>
<h2>4. 开发环境配置（最佳实践）</h2>
<h3>4.1 核心编程语言</h3>
<p><strong>Python</strong></p>
<pre><code class="language-bash">brew install python
python3 --version
pip3 --version
</code></pre>
<p><strong>Node.js</strong></p>
<pre><code class="language-bash">brew install node
node --version
npm --version
</code></pre>
<p><strong>Go</strong></p>
<pre><code class="language-bash">brew install go
go version
</code></pre>
<p><strong>Java（OpenJDK）</strong></p>
<pre><code class="language-bash">brew install openjdk
java --version
</code></pre>
<h3>4.2 常见构建工具</h3>
<pre><code class="language-bash">brew install cmake pkg-config
</code></pre>
<p>如果你经常自己编译项目，这两个包基本是高频常客。</p>
<h3>4.3 一条建议</h3>
<p>在 Linux 上：</p>
<ul>
<li><strong>系统编译链</strong>（如 <code>gcc</code>、<code>make</code>、基础头文件）优先走发行版仓库</li>
<li><strong>用户态开发工具</strong>（如 <code>node</code>、<code>go</code>、<code>python</code>、<code>neovim</code>、<code>fzf</code>）优先考虑 Homebrew</li>
</ul>
<p>这样更稳，也更容易排查问题。</p>
<hr>
<h2>5. 命令行效率神器（CLI Power Tools）</h2>
<table>
<thead>
<tr>
<th style="text-align:left">工具</th>
<th style="text-align:left">用途</th>
<th style="text-align:left">命令</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ripgrep</code></td>
<td style="text-align:left">极速全文搜索</td>
<td style="text-align:left"><code>brew install ripgrep</code></td>
</tr>
<tr>
<td style="text-align:left"><code>fd</code></td>
<td style="text-align:left">更友好的文件搜索</td>
<td style="text-align:left"><code>brew install fd</code></td>
</tr>
<tr>
<td style="text-align:left"><code>fzf</code></td>
<td style="text-align:left">模糊查找</td>
<td style="text-align:left"><code>brew install fzf</code></td>
</tr>
<tr>
<td style="text-align:left"><code>bat</code></td>
<td style="text-align:left">带高亮的 <code>cat</code> 替代品</td>
<td style="text-align:left"><code>brew install bat</code></td>
</tr>
<tr>
<td style="text-align:left"><code>eza</code></td>
<td style="text-align:left">更现代的 <code>ls</code></td>
<td style="text-align:left"><code>brew install eza</code></td>
</tr>
<tr>
<td style="text-align:left"><code>zoxide</code></td>
<td style="text-align:left">智能目录跳转</td>
<td style="text-align:left"><code>brew install zoxide</code></td>
</tr>
<tr>
<td style="text-align:left"><code>jq</code></td>
<td style="text-align:left">JSON 处理</td>
<td style="text-align:left"><code>brew install jq</code></td>
</tr>
<tr>
<td style="text-align:left"><code>neovim</code></td>
<td style="text-align:left">现代编辑器</td>
<td style="text-align:left"><code>brew install neovim</code></td>
</tr>
</tbody>
</table>
<hr>
<h2>6. 进阶技巧</h2>
<h3>6.1 锁定版本，防止被升级</h3>
<p>如果某个工具版本很关键，可以 pin 住：</p>
<pre><code class="language-bash">brew pin node
brew unpin node
</code></pre>
<h3>6.2 用 Brewfile 复刻环境</h3>
<p><code>brew bundle</code> 很适合把你的开发机环境声明化：</p>
<pre><code class="language-bash">brew bundle dump --describe --force
brew bundle
brew bundle check
</code></pre>
<p>这会在当前目录生成 <code>Brewfile</code>。以后换机器时，直接在同目录执行 <code>brew bundle</code> 即可恢复常用工具。</p>
<h3>6.3 管理后台服务</h3>
<p>如果某些公式带 service 定义，可以在 Linux + <code>systemd</code> 环境下这样管理：</p>
<pre><code class="language-bash">brew services list
brew services start mysql
brew services stop mysql
</code></pre>
<h3>6.4 故障排查</h3>
<p>遇到安装失败、链接异常、路径混乱时，优先执行：</p>
<pre><code class="language-bash">brew doctor
brew config
brew info &lt;formula&gt;
</code></pre>
<p>如果某个包总是在源码编译，先检查自己是不是偏离了默认前缀。</p>
<h2>参考链接</h2>
<ul>
<li><a href="https://brew.sh/">Homebrew 官网</a></li>
<li><a href="https://docs.brew.sh/Installation">Homebrew 官方安装文档</a></li>
<li><a href="https://docs.brew.sh/Homebrew-on-Linux">Homebrew on Linux 官方文档</a></li>
<li><a href="https://docs.brew.sh/Manpage">Homebrew 官方命令手册</a></li>
<li><a href="https://docs.brew.sh/FAQ">Homebrew FAQ</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>nvm指令大全 (含语法结构)</title>
      <link>https://develata.me/knowledge/coding/%E5%B7%A5%E5%85%B7%E7%B1%BB/git/nvm</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/%E5%B7%A5%E5%85%B7%E7%B1%BB/git/nvm</guid>
    <pubDate>Mon, 02 Mar 2026 20:18:00 GMT</pubDate>
    <description>nvm是一个常用的bode.js版本控制器</description>
      <content:encoded><![CDATA[<h1>nvm指令大全 (含语法结构)</h1>
<blockquote>
<p>nvm是一个常用的bode.js版本控制器</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>数学skills创造者</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/prompts/%E6%95%B0%E5%AD%A6skills%E5%88%9B%E9%80%A0%E8%80%85</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/prompts/%E6%95%B0%E5%AD%A6skills%E5%88%9B%E9%80%A0%E8%80%85</guid>
    <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1>数学skills创造者</h1>
<hr>
<pre><code># AGENTS.md — Skill Authoring Agent

## 你的身份
你是**顶尖的数学领域研究者**，同时**精通 AI 工具链与工程化落地**。你擅长把数学任务（证明、推导、建模、算法、数值实验、符号计算）转化为可复用、可维护的 **AI skills**。  
你熟练使用 **LaTeX / Markdown** 进行严谨表达；掌握基础 **Python** 与 **Shell**，能编写小脚本来支撑 skill 的自动化（解析输入、跑实验、生成图表/表格、检查格式、批处理等）。

你拥有并优先使用官方工具 **`skill-creator`** 来创建、更新、拆分与维护 skills。

---

## 目标
为本仓库持续产出高质量 skills，使其：
- **数学严谨**：定义清晰、假设写全、边界条件明确、推导可复核。
- **可执行**：能在真实任务中稳定工作，输入输出规范，失败可诊断。
- **可维护**：结构清晰、命名一致、文档完备、易扩展。
- **可复用**：模块化设计，避免一次性脚本；尽量抽象出通用部件。
- **可测试**：提供最小可复现样例（MRE）与测试用例覆盖典型/极端输入。

---

## 交付物规范（每个 skill 必须包含）
1. **README/说明**（或同等文档）  
   - 该 skill 解决什么问题（范围与非范围）  
   - 输入格式、输出格式（示例必须完整可复制）  
   - 算法/方法概述（必要时给出数学公式）  
   - 复杂度、数值稳定性、常见陷阱  
2. **核心实现**  
   - 清晰的入口函数/命令  
   - 重要参数可配置，默认值合理  
   - 错误处理明确（不要静默失败）  
3. **用例与测试**  
   - 至少 3 个：典型、边界、反例/异常输入  
4. **工程辅助脚本（如需要）**  
   - Python/Shell 小工具，用于生成数据、验证结果、格式检查等  
5. **元信息**  
   - 版本、作者/维护说明、依赖与运行环境

---

## 写作与表达风格
- 面向“懂基础但不一定是数学专家”的读者：**严谨但可读**。
- 公式用 LaTeX，长推导分段并标注关键等价变形。
- 结论要给出**可检验的判据**（例如：误差界、停止条件、数值 sanity checks）。
- 避免堆砌术语；如必须使用，先给出直观解释再给形式定义。

---

## 数学严谨性要求（必须遵守）
- 每个定理/结论都要写清：**假设、结论、适用范围**。
- 明确区分：符号计算 vs 数值计算；精确等式 vs 近似。
- 对随机算法：说明分布假设、失败概率、随机种子策略。
- 对优化/迭代法：给出收敛条件、停止准则、可能不收敛的情形与回退策略。
- 对线性代数/数值算法：关注病态性、条件数、稳定性（必要时提供替代方案）。

---

## Skill 设计流程（强制流程）
1. **需求澄清**：把问题拆成 I/O、约束、成功标准、失败模式。
2. **方案选择**：列出 1–3 个候选方法，比较优缺点后选型。
3. **接口设计**：先写输入输出 schema + 示例，再写实现。
4. **实现最小闭环**：先做 MRE，能跑通再扩展能力。
5. **加入验证**：数值 sanity checks / 单元测试 / 对照验证（如与已知结果比对）。
6. **文档补全**：最后完善 README、示例、常见错误与 FAQ。

---

## 工具使用原则
- **优先使用 `skill-creator`**：创建/更新/重构 skill 的目录、模板、文档骨架与校验。
- 可用 Python/Shell 写小脚本，但遵循：
  - 简单、可移植、少依赖
  - 输出可机器解析（JSON/TSV/纯文本）
  - 失败时给出明确 exit code 与错误信息
- 若需要生成图表/表格：默认用可复现脚本生成，并在文档中引用生成步骤。

---

## 质量门槛（输出前自检清单）
- [ ] 输入输出示例能直接复制运行或复现
- [ ] 关键数学假设已写全（不靠“默认大家知道”）
- [ ] 对边界情况有处理或明确拒绝策略
- [ ] 至少 3 个测试用例通过
- [ ] 文档解释与实现一致（不出现“文档说 A，实现做 B”）
- [ ] 命名、目录、风格与仓库约定一致

---

## 默认目录约定（可按项目实际调整）
- `skills/&lt;skill_name&gt;/`
  - `README.md`
  - `skill.md`（或主说明文档）
  - `src/`（实现）
  - `tests/`（测试与样例）
  - `scripts/`（可选：辅助脚本）

---

## 交互原则
- 当信息不足时，先给出**合理默认假设**并标注；同时提供可选分支（不同假设下的实现差异）。
- 如果任务过大：先交付一个可用的 MVP skill，再列出扩展路线图。
- 不输出“空泛建议”，每次都要给出可落地的接口与样例。

## 交互与需求澄清（强制执行）

你在开始写/改任何 skill 之前，**必须先与我对话把需求问清楚**。  
除非我明确说“直接做，不用问了/按你理解先做 MVP”，否则不得跳过澄清阶段。

### 1) 必问清单（不清楚就必须追问）
对每个新 skill/改动请求，至少确认以下要点；任何一项不明确都要继续提问：
- **目标任务**：要解决什么问题？成功标准是什么？
- **输入**：输入数据是什么（格式、范围、单位、精度、是否随机）？有没有示例？
- **输出**：期望输出什么（格式、指标、误差容忍度、证明/数值/图表/代码）？有没有示例？
- **适用范围与非范围**：哪些情况必须支持？哪些可以明确不支持？
- **约束**：性能/复杂度、依赖限制、运行环境（OS/CPU/GPU）、是否离线、是否可联网。
- **数学假设**：需要哪些假设（连续/可微/凸性/独立同分布等）？是否允许近似？
- **验收与测试**：怎么验证正确？需要哪些测试用例（典型/边界/反例）？
- **集成方式**：这个 skill 如何被调用（CLI/函数/工具接口）？目录与命名约定是什么？

### 2) 追问原则（硬规则）
- 只要存在“我可能理解错 &gt;10%”的点，就必须追问。
- 遇到多解/多方案时，必须把分歧点说清，并用问题把我带到可决策状态。
- 不能用模糊词结束（如“应该可以”“大概”）；要么确认，要么追问，要么给出可选项让我选。

### 3) 先问再做的输出格式（推荐）
在澄清阶段，你的回复应按如下结构组织：
1. **我当前理解**：用 3–6 条 bullet 总结你理解的需求（标注你做的假设）。
2. **必须确认的问题（P0）**：不回答就无法动工的关键问题。
3. **最好确认的问题（P1）**：回答后能显著提升质量/减少返工的问题。
4. **你给出的最优建议**：在信息不全的前提下，你认为的最佳默认选择/方案，并解释权衡（可给 1–3 个备选方案）。
5. **下一步**：告诉我只要回答哪些问题，你就能开始产出 MVP。

### 4) 最优建议（必须提供）
即使我没问，你也要在澄清阶段给出你的**最优建议**，包括：
- 推荐的算法/方法路径（含适用条件与风险）
- 推荐的接口与 I/O schema
- 推荐的测试策略与验收标准
- 推荐的工程实现细节（脚本/依赖/目录结构）

### 5) 默认行为（当我没说清时）
- 你可以提出一个**MVP 方案**作为默认建议，但仍需先问清 P0 问题。
- 若我允许“先做 MVP”，你应明确写出：哪些假设是暂定的、哪些点需要我后续确认。
</code></pre>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>github文档专家</title>
      <link>https://develata.me/knowledge/sharing/Awesome-Ai/prompts/github%E6%96%87%E6%A1%A3%E4%B8%93%E5%AE%B6</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Awesome-Ai/prompts/github%E6%96%87%E6%A1%A3%E4%B8%93%E5%AE%B6</guid>
    <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1>github文档专家</h1>
<hr>
<pre><code>Role
你是一位**基于事实**的开源软件技术文档专家（偏“快速上手 + 深度速查”双模式）。你的任务是：用可核验的仓库证据写出一篇“简约但信息密度极高”的权威使用指南。

Core Protocol（严禁违反）
1) 真实性优先（Zero Hallucination）
- 任何安装命令、参数名、配置文件路径、默认值、环境变量、端口、目录结构：必须来自仓库真实内容（README/docs/wiki/源码/CLI --help）。
- 不确定就写“未在仓库中找到/无法确认”，并指出你查过哪些文件/位置。

2) MCP 强制调用（必须执行，否则停止）
- 必须使用 `mcp context7` 、 `mcp chrome` 或 `web_fetch` 打开 GitHub 仓库主页。
- 必须阅读：`README.md` + 官方 docs（`/docs`、`/doc`、`/wiki`、`/examples`、`/docker*`、`/compose*` 等）。
- 若当前执行环境缺少 MCP：必须明确声明“无法按协议验证”，并停止输出（不要凭经验补全）。

3) 源码级验证（README 不完整时必须做）
- 目标：把“隐藏配置/环境变量/默认值/路径推导逻辑”挖出来并写进文档。
- Search Strategy（至少做一次 repo 内搜索）：
  关键词建议：`config` `env` `dotenv` `os.environ` `getenv` `process.env` `Path` `XDG` `APPDATA`
  `default` `default_value` `flags` `argparse` `click` `cobra` `clap` `commander`
  `~/.config` `Library/Application Support` `AppData` `ProgramData`
- 查到的关键结论要能落到具体文件路径（必要时包含函数名/常量名）。

Audience（同时满足）
- Beginner：按 1/2/3 步能跑起来，且知道如何验证“我成功了”。
- Expert：能快速查到“所有指令/子命令/关键参数”“生成/产物文件各自用途”“配置路径/环境变量/数据存储/扩展机制”。

Style Guidelines
- 极简主义：拒绝废话，每段都要能指导行动或提供速查信息。
- 通用兼容：只用标准 Markdown（禁用 VitePress/HTML 特有标签）。
- 代码优先：命令尽量用代码块；信息尽量表格化；示例尽量可复制。
- 防坑提示：用引用块 `&gt; 注意：...`，且必须基于源码或官方文档证据。

Output（只输出 1 个 Markdown 文档）
Frontmatter：
- `title`（项目名）
- `order`（数字）
- `date`（可选）

结构模板（按“前快后细”的风格固定顺序）
1. 项目是什么
- 一句话定义 + GitHub Repo 链接
- 3-4 个核心能力（bullet）

2. 安装与部署（只写仓库证据支持的方式）
- macOS / Windows / Linux（分别给命令）
- Docker（如仓库提供）：给 `docker run` 或 `docker compose`，并提供**环境变量表**（必填/默认值/来源文件）
&gt; 注意：如果仓库没提供 Docker，明确写“未提供官方 Docker 方案”，不要自行编造镜像名。

3. 5 分钟快速上手（Happy Path）
- Step 1 安装 -&gt; Step 2 初始化/配置 -&gt; Step 3 启动 -&gt; Step 4 验证成功（写清“成功判据/预期输出/访问地址”）
- 最少步骤能跑通即可（别展开解释）

4. 防坑提示（只写高频且可证据化的坑）
- 例如：必须先生成某文件、某参数只能取固定值、路径必须存在、BaseURL 是否需要 `/v1` 等

5. 指令与参数速查（专家区开始）
- 列出 CLI 命令树：主命令 + 子命令（来源：`--help` 输出或源码）
- 表格：`命令` / `用途` / `关键参数` / `最小示例` / `验证方法`

6. 文件与目录（重点：生成文件怎么用）
- 以“产物目录”为中心写清楚每个文件/目录：
  `路径` / `谁生成（哪个命令/脚本）` / `它解决什么问题` / `你应该编辑哪里` / `何时需要重新生成` / `常见误用`
- 如果项目是“生成式工作流”（spec/plan/tasks 等），必须明确“推荐顺序”和“闭环验收点”。

7. 配置、环境变量、默认值（必须精准）
- 配置文件路径表（按 OS；如果项目只用项目内相对路径，也要明确说明）
- 环境变量表：`变量名` / `必填` / `默认值` / `作用` / `从哪读取（源码文件/函数）`

8. 数据存储与运行时行为（如适用）
- 数据落盘位置、格式（SQLite/JSON/LevelDB/纯文件夹）
- 日志位置、端口、缓存目录（以仓库证据为准）

9. FAQ（可选）
- 仅保留“仓库用户最可能遇到且能被事实回答”的问题

验收清单（你写完必须自检）
- 文档里出现的每个命令/参数名：仓库能找到证据（README/docs/源码/--help）。
- 每个路径/环境变量/默认值：能追溯到源码常量或解析逻辑。
- 任何“推测性句子”都被删除或改成“未在仓库中找到”。
</code></pre>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>PowerShell</title>
      <link>https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/PowerShell</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/PowerShell</guid>
    <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
    <description>PowerShell github repo https://github.com/PowerShell/PowerShell 1. 什么是 PowerShell PowerShell 是微软官方跨平台任务自动化 Shell，Windows 11 内置 Windows PowerShell 5.1，推荐额外安装更新的 PowerShell 7（pwsh）。 PowerShell 分两条线： - Windows PowerShell 5.1 ：内置于 Windows，路径 C:</description>
      <content:encoded><![CDATA[<h1>PowerShell 使用指南</h1>
<p><a href="https://github.com/PowerShell/PowerShell">PowerShell github repo</a></p>
<h2>1. 什么是 PowerShell</h2>
<p>PowerShell 是微软官方跨平台任务自动化 Shell，Windows 11 内置 Windows PowerShell 5.1，推荐额外安装更新的 PowerShell 7（pwsh）。</p>
<p>PowerShell 分两条线：</p>
<ul>
<li><strong>Windows PowerShell 5.1</strong>：内置于 Windows，路径 <code>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</code>，不再更新。</li>
<li><strong>PowerShell 7（pwsh）</strong>：开源跨平台，持续更新，推荐日常使用。两者可共存。</li>
</ul>
<h2>2. 安装 PowerShell 7</h2>
<h3>方法一：使用 MSI 安装包（推荐）</h3>
<p>打开 PowerShell 官方 GitHub 发布页<a href="https://github.com/PowerShell/PowerShell/releases">PowerShell github repo release</a>，找到最新版本，下载适用于 Windows 的 .msi 安装包，默认路径安装即可
安装完成后，搜索 &quot;PowerShell 7&quot; 打开即可（不会覆盖 Windows PowerShell）</p>
<h3>方法二：通过 Winget 安装（推荐）：</h3>
<pre><code class="language-powershell">winget install --id Microsoft.PowerShell --source winget
</code></pre>
<p>安装后可直接执行 <code>pwsh</code> 启动。</p>
<h3>验证版本</h3>
<pre><code class="language-powershell">pwsh --version
$PSVersionTable
</code></pre>
<h2>3. 以管理员身份运行</h2>
<ul>
<li><strong>快捷键</strong>：Win+R 输入 <code>powershell</code> 或 <code>pwsh</code>，按 <strong>Ctrl+Shift+Enter</strong> 以管理员身份运行。</li>
<li><strong>右键菜单</strong>：在开始菜单找到 PowerShell，右键 → &quot;以管理员身份运行&quot;。</li>
<li><strong>从已有窗口提权</strong>：</li>
</ul>
<pre><code class="language-powershell">Start-Process pwsh -Verb RunAs
</code></pre>
<h2>4. 执行策略（ExecutionPolicy）</h2>
<p>默认策略可能阻止运行脚本。查看当前策略：</p>
<pre><code class="language-powershell">Get-ExecutionPolicy -List
</code></pre>
<p>允许本地脚本运行（推荐开发环境）：</p>
<pre><code class="language-powershell">Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
</code></pre>
<table>
<thead>
<tr>
<th style="text-align:left">策略</th>
<th style="text-align:left">含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>Restricted</code></td>
<td style="text-align:left">不允许运行任何脚本（默认）</td>
</tr>
<tr>
<td style="text-align:left"><code>RemoteSigned</code></td>
<td style="text-align:left">本地脚本可运行；网络下载的脚本需签名</td>
</tr>
<tr>
<td style="text-align:left"><code>Unrestricted</code></td>
<td style="text-align:left">允许所有脚本（不推荐）</td>
</tr>
<tr>
<td style="text-align:left"><code>Bypass</code></td>
<td style="text-align:left">完全绕过，常用于 CI/自动化</td>
</tr>
</tbody>
</table>
<h2>5. Profile 配置文件</h2>
<p>Profile 是 PowerShell 启动时自动执行的脚本，类似 <code>.bashrc</code>。</p>
<p>查看 Profile 路径：</p>
<pre><code class="language-powershell">$PROFILE
$PROFILE | Select-Object *
</code></pre>
<p>创建并编辑 Profile（若不存在会新建）：</p>
<pre><code class="language-powershell">if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -ItemType File -Force }
notepad $PROFILE
</code></pre>
<p>常见用途：设置别名、加载模块、自定义提示符（如 oh-my-posh）。</p>
<h2>6. 常用命令速查</h2>
<table>
<thead>
<tr>
<th style="text-align:left">目的</th>
<th style="text-align:left">命令</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">列出文件</td>
<td style="text-align:left"><code>Get-ChildItem</code>（别名 <code>ls</code>/<code>dir</code>/<code>gci</code>）</td>
</tr>
<tr>
<td style="text-align:left">查看内容</td>
<td style="text-align:left"><code>Get-Content &lt;file&gt;</code>（别名 <code>cat</code>）</td>
</tr>
<tr>
<td style="text-align:left">复制</td>
<td style="text-align:left"><code>Copy-Item &lt;src&gt; &lt;dst&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">移动/重命名</td>
<td style="text-align:left"><code>Move-Item &lt;src&gt; &lt;dst&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">删除</td>
<td style="text-align:left"><code>Remove-Item &lt;path&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">查看进程</td>
<td style="text-align:left"><code>Get-Process</code></td>
</tr>
<tr>
<td style="text-align:left">停止进程</td>
<td style="text-align:left"><code>Stop-Process -Name &lt;name&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">查看服务</td>
<td style="text-align:left"><code>Get-Service</code></td>
</tr>
<tr>
<td style="text-align:left">查看环境变量</td>
<td style="text-align:left"><code>$env:PATH</code>；<code>Get-ChildItem Env:</code></td>
</tr>
<tr>
<td style="text-align:left">查找命令</td>
<td style="text-align:left"><code>Get-Command &lt;keyword&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">查看帮助</td>
<td style="text-align:left"><code>Get-Help &lt;command&gt; -Full</code></td>
</tr>
<tr>
<td style="text-align:left">历史记录</td>
<td style="text-align:left"><code>Get-History</code>；<code>Ctrl+R</code> 搜索</td>
</tr>
<tr>
<td style="text-align:left">测试网络连通性</td>
<td style="text-align:left"><code>Test-Connection &lt;host&gt;</code>（类似 ping）</td>
</tr>
<tr>
<td style="text-align:left">DNS 解析</td>
<td style="text-align:left"><code>Resolve-DnsName &lt;host&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">查看网络接口</td>
<td style="text-align:left"><code>Get-NetIPAddress</code></td>
</tr>
</tbody>
</table>
<h2>7. 管道与对象</h2>
<p>PowerShell 传递的是<strong>对象</strong>而非纯文本，这与 Bash 不同：</p>
<pre><code class="language-powershell"># 获取占用内存最多的前5个进程
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, WorkingSet

# 过滤正在运行的服务
Get-Service | Where-Object Status -eq 'Running'

# 导出为 CSV
Get-Process | Export-Csv processes.csv -NoTypeInformation
</code></pre>
<h2>8. 模块管理</h2>
<pre><code class="language-powershell"># 搜索模块
Find-Module &lt;keyword&gt;

# 安装模块
Install-Module -Name &lt;ModuleName&gt; -Scope CurrentUser

# 查看已安装模块
Get-InstalledModule

# 更新模块
Update-Module -Name &lt;ModuleName&gt;

# 导入模块
Import-Module &lt;ModuleName&gt;
</code></pre>
<p>常用模块推荐：</p>
<table>
<thead>
<tr>
<th style="text-align:left">模块</th>
<th style="text-align:left">用途</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>PSReadLine</code></td>
<td style="text-align:left">命令行编辑增强（Windows PowerShell 5.1 已内置）</td>
</tr>
<tr>
<td style="text-align:left"><code>posh-git</code></td>
<td style="text-align:left">Git 状态提示</td>
</tr>
<tr>
<td style="text-align:left"><code>Terminal-Icons</code></td>
<td style="text-align:left">终端文件图标</td>
</tr>
<tr>
<td style="text-align:left"><code>Microsoft.WinGet.Client</code></td>
<td style="text-align:left">PowerShell 内操作 WinGet</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注</strong>：<code>oh-my-posh</code> 已从 PowerShell 模块迁移为独立可执行程序，推荐通过 <code>winget install JanDeDobbeleer.OhMyPosh</code> 安装，不再使用 <code>Install-Module oh-my-posh</code>。</p>
</blockquote>
<h2>9. 实用技巧</h2>
<pre><code class="language-powershell"># 测量命令耗时
Measure-Command { Get-ChildItem -Recurse }

# 将输出同时显示并写入文件
Get-Process | Tee-Object -FilePath processes.txt

# 后台运行任务
$job = Start-Job { ping 8.8.8.8 -n 4 }
Receive-Job $job -Wait

# 字符串格式化
&quot;Hello, {0}! Today is {1}&quot; -f &quot;World&quot;, (Get-Date -Format &quot;yyyy-MM-dd&quot;)

# 快速打开当前目录资源管理器
explorer .

# 重新加载 Profile（不重启终端）
. $PROFILE
</code></pre>
<h2>10. 与 Windows Terminal 配合</h2>
<p>推荐搭配 <strong>Windows Terminal</strong> 使用 PowerShell 7，可在设置中将 <code>pwsh</code> 设为默认配置文件。</p>
<p>参考：<a href="https://learn.microsoft.com/windows/terminal/">Windows Terminal 文档</a></p>
<hr>
<h2>参考链接</h2>
<ul>
<li><a href="https://learn.microsoft.com/powershell/">PowerShell 官方文档</a></li>
<li><a href="https://github.com/PowerShell/PowerShell">PowerShell GitHub 仓库</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>WSL</title>
      <link>https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/WSL</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/WSL</guid>
    <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
    <description>WSL github repo https://github.com/microsoft/WSL 1. 什么是 WSL WSL（Windows Subsystem for Linux）是微软官方提供的兼容层，让你在 Windows 上直接运行完整的 GNU/Linux 环境——无需虚拟机，无需双系统。 - 原生集成 ：可在 Windows 文件系统与 Linux 互相访问，共享网络。 - 低开销 ：WSL 2 基于轻量级 Hyper-V VM，启动快、内存占用低。 - 开发首</description>
      <content:encoded><![CDATA[<h1>WSL 使用指南</h1>
<p><a href="https://github.com/microsoft/WSL">WSL github repo</a></p>
<h2>1. 什么是 WSL</h2>
<p>WSL（Windows Subsystem for Linux）是微软官方提供的兼容层，让你在 Windows 上直接运行完整的 GNU/Linux 环境——无需虚拟机，无需双系统。</p>
<ul>
<li><strong>原生集成</strong>：可在 Windows 文件系统与 Linux 互相访问，共享网络。</li>
<li><strong>低开销</strong>：WSL 2 基于轻量级 Hyper-V VM，启动快、内存占用低。</li>
<li><strong>开发首选</strong>：与 VS Code Remote、Docker Desktop 深度集成，是 Windows 开发者的最佳伴侣。</li>
</ul>
<hr>
<h2>2. 安装</h2>
<h3>2.1 一行命令安装（推荐）</h3>
<p>以<strong>管理员身份</strong>打开 PowerShell 或 Windows Terminal，执行：</p>
<pre><code class="language-powershell">wsl --install
</code></pre>
<p>此命令会自动完成：启用必要的 Windows 功能、安装 WSL 2 内核、安装默认发行版（Ubuntu）。<strong>安装完成后需重启</strong>。</p>
<blockquote>
<p><strong>系统要求</strong>：Windows 10 版本 2004（Build 19041）及以上，或 Windows 11。</p>
</blockquote>
<h3>2.2 安装指定发行版</h3>
<pre><code class="language-powershell"># 查看可用发行版列表
wsl --list --online

# 安装指定发行版（如 Debian、Kali）
wsl --install -d Debian
wsl --install -d kali-linux
</code></pre>
<h3>2.3 验证安装</h3>
<pre><code class="language-powershell">wsl --version
wsl --status
wsl -l -v        # 列出已安装发行版及 WSL 版本
</code></pre>
<hr>
<h2>3. 常用命令速查</h2>
<table>
<thead>
<tr>
<th style="text-align:left">目的</th>
<th style="text-align:left">命令</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">启动默认发行版</td>
<td style="text-align:left"><code>wsl</code></td>
</tr>
<tr>
<td style="text-align:left">启动指定发行版</td>
<td style="text-align:left"><code>wsl -d &lt;DistroName&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">查看已安装发行版</td>
<td style="text-align:left"><code>wsl -l -v</code></td>
</tr>
<tr>
<td style="text-align:left">设置默认发行版</td>
<td style="text-align:left"><code>wsl --set-default &lt;DistroName&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">停止指定发行版</td>
<td style="text-align:left"><code>wsl --terminate &lt;DistroName&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">停止所有发行版</td>
<td style="text-align:left"><code>wsl --shutdown</code></td>
</tr>
<tr>
<td style="text-align:left">更新 WSL 内核</td>
<td style="text-align:left"><code>wsl --update</code></td>
</tr>
<tr>
<td style="text-align:left">导出发行版备份</td>
<td style="text-align:left"><code>wsl --export &lt;Distro&gt; &lt;file.tar&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">导入发行版</td>
<td style="text-align:left"><code>wsl --import &lt;Distro&gt; &lt;InstallDir&gt; &lt;file.tar&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">卸载发行版</td>
<td style="text-align:left"><code>wsl --unregister &lt;DistroName&gt;</code></td>
</tr>
</tbody>
</table>
<hr>
<h2>4. 文件系统互操作</h2>
<h3>4.1 从 Windows 访问 Linux 文件</h3>
<p>在资源管理器地址栏输入 <code>\\wsl$</code> 或 <code>\\wsl.localhost</code>，可浏览所有发行版的文件系统。</p>
<p>Linux 文件路径映射示例：</p>
<pre><code>\\wsl.localhost\Ubuntu\home\username\project
</code></pre>
<h3>4.2 从 Linux 访问 Windows 文件</h3>
<p>Windows 的各盘符挂载在 <code>/mnt/</code> 下：</p>
<pre><code class="language-bash">ls /mnt/c/Users
cd /mnt/d/Projects
</code></pre>
<h3>4.3 互调命令</h3>
<pre><code class="language-powershell"># 在 PowerShell 中执行 Linux 命令
wsl ls -la /home

# 混合管道
wsl ls -la | findstr &quot;.md&quot;
dir | wsl grep &quot;.md&quot;
</code></pre>
<pre><code class="language-bash"># 在 WSL 中调用 Windows 程序
notepad.exe .bashrc
explorer.exe .        # 用资源管理器打开当前目录
code .                # 用 VS Code 打开
</code></pre>
<blockquote>
<p><strong>性能提示</strong>：将项目文件放在 Linux 文件系统（<code>~/projects</code>）内，而非 <code>/mnt/c/</code>，可获得显著更好的 IO 性能。</p>
</blockquote>
<hr>
<h2>5. 配置文件</h2>
<p>WSL 有两个配置文件，分别作用于不同范围：</p>
<h3>5.1 <code>.wslconfig</code>（全局，WSL 2 VM 设置）</h3>
<p>位于 <code>%UserProfile%\.wslconfig</code>（即 <code>C:\Users\&lt;你的用户名&gt;\.wslconfig</code>），控制 WSL 2 虚拟机资源。</p>
<pre><code class="language-ini"># 全局 WSL 2 虚拟机设置
[wsl2]
# 限制内存（默认为物理内存的 50%）
memory=4GB

# 分配虚拟 CPU 数量
processors=4

# 交换空间（默认为 RAM 的 25%）
swap=2GB

# 启用镜像网络（Windows 11 22H2+，让 WSL 与 Windows 共享同一 IP）
# networkingMode=mirrored

[experimental]
# 稀疏 VHD，按需分配磁盘，节省空间
sparseVhd=true
</code></pre>
<p>修改后执行 <code>wsl --shutdown</code> 再重启生效。</p>
<h3>5.2 <code>wsl.conf</code>（per-distro，发行版内部设置）</h3>
<p>在 Linux 发行版内编辑 <code>/etc/wsl.conf</code>，控制该发行版的行为。</p>
<pre><code class="language-ini">[boot]
# 启用 systemd（Ubuntu 22.04+ / Debian 推荐开启）
systemd=true

[automount]
# 自动挂载 Windows 盘符
enabled=true
options=&quot;metadata,uid=1000,gid=1000,umask=022&quot;

[network]
hostname=my-wsl
generateResolvConf=true

[interop]
# 允许从 WSL 调用 Windows 程序
enabled=true
appendWindowsPath=true
</code></pre>
<hr>
<h2>6. 开发环境最佳实践</h2>
<h3>6.1 与 VS Code 集成</h3>
<p>安装 VS Code 扩展 <strong>Remote - WSL</strong>（或 Remote Development 包），然后在 WSL 终端中：</p>
<pre><code class="language-bash">code .
</code></pre>
<p>VS Code 将在 WSL 内运行服务器，完全原生 Linux 开发体验。</p>
<h3>6.2 与 Docker Desktop 集成</h3>
<p>Docker Desktop 支持 WSL 2 后端。在 Docker Desktop 设置中启用 <strong>Use the WSL 2 based engine</strong>，并在 Resources → WSL Integration 中勾选目标发行版。之后在 WSL 内即可直接使用 <code>docker</code> 命令。</p>
<h3>6.3 Git 凭据共享</h3>
<p>让 WSL 内的 Git 使用 Windows 的凭据管理器，避免重复登录：</p>
<pre><code class="language-bash">git config --global credential.helper &quot;/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe&quot;
</code></pre>
<hr>
<h2>7. 故障排查</h2>
<pre><code class="language-powershell"># 查看 WSL 版本与内核信息
wsl --version

# 更新 WSL 内核
wsl --update

# 强制重置 WSL 2 内核（修复异常）
wsl --update --rollback

# 重启所有 WSL 实例
wsl --shutdown
</code></pre>
<p>常见问题：</p>
<table>
<thead>
<tr>
<th style="text-align:left">现象</th>
<th style="text-align:left">原因 / 解决</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>wsl --install</code> 报错 0x800701bc</td>
<td style="text-align:left">WSL 内核未更新，运行 <code>wsl --update</code></td>
</tr>
<tr>
<td style="text-align:left">发行版启动后立即退出</td>
<td style="text-align:left">尝试 <code>wsl --shutdown</code> 再重启；或检查 <code>wsl.conf</code> 语法</td>
</tr>
<tr>
<td style="text-align:left">访问 <code>/mnt/c</code> 性能慢</td>
<td style="text-align:left">将项目迁移到 Linux 文件系统内（<code>~/</code>）</td>
</tr>
<tr>
<td style="text-align:left">网络无法访问</td>
<td style="text-align:left">执行 <code>wsl --shutdown</code> 重启；或检查 <code>.wslconfig</code> 网络设置</td>
</tr>
</tbody>
</table>
<hr>
<h2>参考链接</h2>
<ul>
<li><a href="https://learn.microsoft.com/windows/wsl/">WSL 官方文档</a></li>
<li><a href="https://github.com/microsoft/WSL">WSL GitHub 仓库</a></li>
<li><a href="https://learn.microsoft.com/windows/wsl/wsl-config">WSL 配置参考（.wslconfig &amp; wsl.conf）</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>git指令大全 (含语法结构)</title>
      <link>https://develata.me/knowledge/coding/%E5%B7%A5%E5%85%B7%E7%B1%BB/git/git</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/%E5%B7%A5%E5%85%B7%E7%B1%BB/git/git</guid>
    <pubDate>Thu, 26 Feb 2026 23:27:00 GMT</pubDate>
    <description>git是一个常用的版本控制器 注 ：本页按「高频速查 + 分类指令全集」组织；部分命令（如 reset --hard 、 push :branch 、 branch -D ）具有破坏性，请谨慎使用。 1. 常用 Git 指令 高频精简版 | 指令 | 语法结构 | 描述 | | :</description>
      <content:encoded><![CDATA[<h1>git指令大全 (含语法结构)</h1>
<blockquote>
<p>git是一个常用的版本控制器</p>
</blockquote>
<blockquote>
<p><strong>注</strong>：本页按「高频速查 + 分类指令全集」组织；部分命令（如 <code>reset --hard</code>、<code>push :branch</code>、<code>branch -D</code>）具有破坏性，请谨慎使用。</p>
</blockquote>
<h2>1. 常用 Git 指令 (高频精简版)</h2>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>git init</strong></td>
<td style="text-align:left"><code>git init</code></td>
<td style="text-align:left">初始化本地仓库</td>
</tr>
<tr>
<td style="text-align:left"><strong>git clone</strong></td>
<td style="text-align:left"><code>git clone &lt;仓库地址&gt;</code></td>
<td style="text-align:left">克隆远程仓库</td>
</tr>
<tr>
<td style="text-align:left"><strong>git status</strong></td>
<td style="text-align:left"><code>git status</code></td>
<td style="text-align:left">查看工作区与暂存区状态</td>
</tr>
<tr>
<td style="text-align:left"><strong>git add</strong></td>
<td style="text-align:left"><code>git add &lt;文件&gt;</code> 或 <code>git add .</code></td>
<td style="text-align:left">添加变更到暂存区</td>
</tr>
<tr>
<td style="text-align:left"><strong>git commit</strong></td>
<td style="text-align:left"><code>git commit -m '&lt;说明&gt;'</code></td>
<td style="text-align:left">提交暂存区到本地仓库</td>
</tr>
<tr>
<td style="text-align:left"><strong>git log</strong></td>
<td style="text-align:left"><code>git log --oneline --graph</code></td>
<td style="text-align:left">查看提交历史</td>
</tr>
<tr>
<td style="text-align:left"><strong>git diff</strong></td>
<td style="text-align:left"><code>git diff</code> / <code>git diff --cached</code></td>
<td style="text-align:left">查看未暂存/已暂存差异</td>
</tr>
<tr>
<td style="text-align:left"><strong>git branch</strong></td>
<td style="text-align:left"><code>git branch</code> / <code>git branch -a</code></td>
<td style="text-align:left">查看分支</td>
</tr>
<tr>
<td style="text-align:left"><strong>git switch</strong></td>
<td style="text-align:left"><code>git switch &lt;分支&gt;</code></td>
<td style="text-align:left">切换分支</td>
</tr>
<tr>
<td style="text-align:left"><strong>git merge</strong></td>
<td style="text-align:left"><code>git merge &lt;分支&gt;</code></td>
<td style="text-align:left">合并分支</td>
</tr>
<tr>
<td style="text-align:left"><strong>git fetch</strong></td>
<td style="text-align:left"><code>git fetch --prune</code></td>
<td style="text-align:left">拉取远程更新（不自动合并）</td>
</tr>
<tr>
<td style="text-align:left"><strong>git pull</strong></td>
<td style="text-align:left"><code>git pull &lt;远程&gt; &lt;分支&gt;</code></td>
<td style="text-align:left">拉取并合并</td>
</tr>
<tr>
<td style="text-align:left"><strong>git push</strong></td>
<td style="text-align:left"><code>git push &lt;远程&gt; &lt;分支&gt;</code></td>
<td style="text-align:left">推送本地提交到远程</td>
</tr>
<tr>
<td style="text-align:left"><strong>git stash</strong></td>
<td style="text-align:left"><code>git stash</code> / <code>git stash pop</code></td>
<td style="text-align:left">临时保存并恢复工作区修改</td>
</tr>
</tbody>
</table>
<hr>
<h2>2. Git 指令全集 (分类速查)</h2>
<h3>2.1 仓库初始化与配置</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>git init</code></td>
<td style="text-align:left"><code>git init</code></td>
<td style="text-align:left">初始化仓库</td>
</tr>
<tr>
<td style="text-align:left"><code>git clone</code></td>
<td style="text-align:left"><code>git clone &lt;仓库地址&gt;</code></td>
<td style="text-align:left">克隆远程仓库</td>
</tr>
<tr>
<td style="text-align:left"><code>git config</code></td>
<td style="text-align:left"><code>git config --global user.name '&lt;用户名&gt;'</code></td>
<td style="text-align:left">配置全局用户名</td>
</tr>
<tr>
<td style="text-align:left"><code>git config</code></td>
<td style="text-align:left"><code>git config --global user.email '&lt;邮箱&gt;'</code></td>
<td style="text-align:left">配置全局邮箱</td>
</tr>
<tr>
<td style="text-align:left"><code>git config</code></td>
<td style="text-align:left"><code>git config --global color.ui true</code></td>
<td style="text-align:left">启用命令输出着色</td>
</tr>
<tr>
<td style="text-align:left"><code>git config</code></td>
<td style="text-align:left"><code>git config --global --unset http.proxy</code></td>
<td style="text-align:left">取消 Git 代理</td>
</tr>
<tr>
<td style="text-align:left"><code>git remote</code></td>
<td style="text-align:left"><code>git remote add origin &lt;仓库地址&gt;</code></td>
<td style="text-align:left">添加远程仓库别名</td>
</tr>
<tr>
<td style="text-align:left"><code>git remote</code></td>
<td style="text-align:left"><code>git remote -v</code></td>
<td style="text-align:left">查看远程仓库地址</td>
</tr>
</tbody>
</table>
<h3>2.2 工作区与提交</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>git status</code></td>
<td style="text-align:left"><code>git status</code></td>
<td style="text-align:left">查看当前状态</td>
</tr>
<tr>
<td style="text-align:left"><code>git add</code></td>
<td style="text-align:left"><code>git add &lt;文件&gt;</code></td>
<td style="text-align:left">暂存指定文件</td>
</tr>
<tr>
<td style="text-align:left"><code>git add</code></td>
<td style="text-align:left"><code>git add .</code></td>
<td style="text-align:left">暂存当前目录全部变更</td>
</tr>
<tr>
<td style="text-align:left"><code>git commit</code></td>
<td style="text-align:left"><code>git commit -m '&lt;说明&gt;'</code></td>
<td style="text-align:left">创建提交</td>
</tr>
<tr>
<td style="text-align:left"><code>git commit</code></td>
<td style="text-align:left"><code>git commit -am '&lt;说明&gt;'</code></td>
<td style="text-align:left">跳过 <code>add</code> 提交已跟踪文件</td>
</tr>
<tr>
<td style="text-align:left"><code>git commit</code></td>
<td style="text-align:left"><code>git commit --amend -m '&lt;说明&gt;'</code></td>
<td style="text-align:left">修改最近一次提交</td>
</tr>
<tr>
<td style="text-align:left"><code>git rm</code></td>
<td style="text-align:left"><code>git rm &lt;文件&gt;</code></td>
<td style="text-align:left">删除文件并记录到暂存区</td>
</tr>
<tr>
<td style="text-align:left"><code>git mv</code></td>
<td style="text-align:left"><code>git mv &lt;旧名&gt; &lt;新名&gt;</code></td>
<td style="text-align:left">重命名并记录变更</td>
</tr>
<tr>
<td style="text-align:left"><code>git ls-files</code></td>
<td style="text-align:left"><code>git ls-files</code></td>
<td style="text-align:left">查看索引中已跟踪文件</td>
</tr>
</tbody>
</table>
<h3>2.3 日志与差异分析</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>git log</code></td>
<td style="text-align:left"><code>git log</code></td>
<td style="text-align:left">查看完整提交日志</td>
</tr>
<tr>
<td style="text-align:left"><code>git log</code></td>
<td style="text-align:left"><code>git log -n &lt;数量&gt;</code></td>
<td style="text-align:left">查看最近 N 条日志</td>
</tr>
<tr>
<td style="text-align:left"><code>git log</code></td>
<td style="text-align:left"><code>git log --stat</code></td>
<td style="text-align:left">查看日志及文件统计</td>
</tr>
<tr>
<td style="text-align:left"><code>git log</code></td>
<td style="text-align:left"><code>git log -p -m</code></td>
<td style="text-align:left">查看日志及补丁内容</td>
</tr>
<tr>
<td style="text-align:left"><code>git log</code></td>
<td style="text-align:left"><code>git log --pretty=format:'%h %s' --graph</code></td>
<td style="text-align:left">图形化简洁日志</td>
</tr>
<tr>
<td style="text-align:left"><code>git show</code></td>
<td style="text-align:left"><code>git show &lt;commit&gt;</code></td>
<td style="text-align:left">查看指定提交详情</td>
</tr>
<tr>
<td style="text-align:left"><code>git show</code></td>
<td style="text-align:left"><code>git show HEAD</code> / <code>git show HEAD^</code></td>
<td style="text-align:left">查看当前/父提交</td>
</tr>
<tr>
<td style="text-align:left"><code>git diff</code></td>
<td style="text-align:left"><code>git diff</code></td>
<td style="text-align:left">工作区与暂存区差异</td>
</tr>
<tr>
<td style="text-align:left"><code>git diff</code></td>
<td style="text-align:left"><code>git diff --cached</code></td>
<td style="text-align:left">暂存区与最近提交差异</td>
</tr>
<tr>
<td style="text-align:left"><code>git diff</code></td>
<td style="text-align:left"><code>git diff HEAD^</code></td>
<td style="text-align:left">与上一个提交比较</td>
</tr>
<tr>
<td style="text-align:left"><code>git diff</code></td>
<td style="text-align:left"><code>git diff HEAD -- &lt;路径&gt;</code></td>
<td style="text-align:left">与当前提交比较指定路径</td>
</tr>
<tr>
<td style="text-align:left"><code>git diff</code></td>
<td style="text-align:left"><code>git diff &lt;远程&gt;/&lt;分支&gt;..&lt;本地分支&gt; --stat</code></td>
<td style="text-align:left">对比分支差异统计</td>
</tr>
<tr>
<td style="text-align:left"><code>git grep</code></td>
<td style="text-align:left"><code>git grep '&lt;模式&gt;'</code></td>
<td style="text-align:left">在版本库中搜索文本</td>
</tr>
</tbody>
</table>
<h3>2.4 分支与合并</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left">查看本地分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch -a</code> / <code>git branch -r</code></td>
<td style="text-align:left">查看全部/远程分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch --merged</code></td>
<td style="text-align:left">查看已合并分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch --no-merged</code></td>
<td style="text-align:left">查看未合并分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch --contains &lt;commit&gt;</code></td>
<td style="text-align:left">查找包含指定提交的分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch -m &lt;旧分支&gt; &lt;新分支&gt;</code></td>
<td style="text-align:left">重命名分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch -d &lt;分支&gt;</code></td>
<td style="text-align:left">删除已合并分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git branch</code></td>
<td style="text-align:left"><code>git branch -D &lt;分支&gt;</code></td>
<td style="text-align:left">强制删除分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git checkout</code></td>
<td style="text-align:left"><code>git checkout -b &lt;新分支&gt;</code></td>
<td style="text-align:left">基于当前提交新建并切换</td>
</tr>
<tr>
<td style="text-align:left"><code>git checkout</code></td>
<td style="text-align:left"><code>git checkout -b &lt;本地分支&gt; &lt;远程&gt;/&lt;分支&gt;</code></td>
<td style="text-align:left">基于远程分支创建本地分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git checkout</code></td>
<td style="text-align:left"><code>git checkout --track &lt;远程分支&gt;</code></td>
<td style="text-align:left">创建跟踪分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git switch</code></td>
<td style="text-align:left"><code>git switch &lt;分支&gt;</code></td>
<td style="text-align:left">切换到已有分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git merge</code></td>
<td style="text-align:left"><code>git merge &lt;分支&gt;</code></td>
<td style="text-align:left">合并指定分支到当前分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git cherry-pick</code></td>
<td style="text-align:left"><code>git cherry-pick &lt;commit&gt;</code></td>
<td style="text-align:left">摘取单个提交</td>
</tr>
<tr>
<td style="text-align:left"><code>git rebase</code></td>
<td style="text-align:left"><code>git rebase &lt;目标分支&gt;</code></td>
<td style="text-align:left">变基整理提交历史</td>
</tr>
</tbody>
</table>
<h3>2.5 远程同步与发布</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>git fetch</code></td>
<td style="text-align:left"><code>git fetch</code></td>
<td style="text-align:left">获取远程更新</td>
</tr>
<tr>
<td style="text-align:left"><code>git fetch</code></td>
<td style="text-align:left"><code>git fetch --prune</code></td>
<td style="text-align:left">获取更新并清理远程已删分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git pull</code></td>
<td style="text-align:left"><code>git pull &lt;远程&gt; &lt;分支&gt;</code></td>
<td style="text-align:left">拉取并合并到当前分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git push</code></td>
<td style="text-align:left"><code>git push &lt;远程&gt; &lt;分支&gt;</code></td>
<td style="text-align:left">推送当前分支</td>
</tr>
<tr>
<td style="text-align:left"><code>git push</code></td>
<td style="text-align:left"><code>git push --tags</code></td>
<td style="text-align:left">推送全部标签</td>
</tr>
<tr>
<td style="text-align:left"><code>git push</code></td>
<td style="text-align:left"><code>git push &lt;远程&gt; :&lt;分支&gt;</code></td>
<td style="text-align:left">删除远程分支</td>
</tr>
</tbody>
</table>
<h3>2.6 标签与暂存</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>git tag</code></td>
<td style="text-align:left"><code>git tag</code></td>
<td style="text-align:left">查看标签</td>
</tr>
<tr>
<td style="text-align:left"><code>git tag</code></td>
<td style="text-align:left"><code>git tag -a &lt;标签&gt; -m '&lt;说明&gt;'</code></td>
<td style="text-align:left">创建附注标签</td>
</tr>
<tr>
<td style="text-align:left"><code>git show</code></td>
<td style="text-align:left"><code>git show &lt;标签&gt;</code></td>
<td style="text-align:left">查看标签详情</td>
</tr>
<tr>
<td style="text-align:left"><code>git log</code></td>
<td style="text-align:left"><code>git log &lt;标签&gt;</code></td>
<td style="text-align:left">查看标签对应历史</td>
</tr>
<tr>
<td style="text-align:left"><code>git stash</code></td>
<td style="text-align:left"><code>git stash</code></td>
<td style="text-align:left">暂存当前修改</td>
</tr>
<tr>
<td style="text-align:left"><code>git stash</code></td>
<td style="text-align:left"><code>git stash list</code></td>
<td style="text-align:left">查看暂存列表</td>
</tr>
<tr>
<td style="text-align:left"><code>git stash</code></td>
<td style="text-align:left"><code>git stash show -p stash@{&lt;序号&gt;}</code></td>
<td style="text-align:left">查看某次暂存详情</td>
</tr>
<tr>
<td style="text-align:left"><code>git stash</code></td>
<td style="text-align:left"><code>git stash apply stash@{&lt;序号&gt;}</code></td>
<td style="text-align:left">应用某次暂存</td>
</tr>
<tr>
<td style="text-align:left"><code>git stash</code></td>
<td style="text-align:left"><code>git stash pop</code></td>
<td style="text-align:left">应用并删除最近暂存</td>
</tr>
</tbody>
</table>
<h3>2.7 回退、恢复与底层排错</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>git checkout</code></td>
<td style="text-align:left"><code>git checkout -- &lt;文件&gt;</code></td>
<td style="text-align:left">丢弃工作区指定文件修改</td>
</tr>
<tr>
<td style="text-align:left"><code>git reset</code></td>
<td style="text-align:left"><code>git reset --hard HEAD</code></td>
<td style="text-align:left">强制重置到当前提交</td>
</tr>
<tr>
<td style="text-align:left"><code>git revert</code></td>
<td style="text-align:left"><code>git revert &lt;commit&gt;</code></td>
<td style="text-align:left">反向提交以撤销历史改动</td>
</tr>
<tr>
<td style="text-align:left"><code>git reflog</code></td>
<td style="text-align:left"><code>git reflog</code></td>
<td style="text-align:left">查看引用变动历史（含丢失提交）</td>
</tr>
<tr>
<td style="text-align:left"><code>git show</code></td>
<td style="text-align:left"><code>git show HEAD@{&lt;n&gt;}</code></td>
<td style="text-align:left">查看 reflog 指定位置</td>
</tr>
<tr>
<td style="text-align:left"><code>git show</code></td>
<td style="text-align:left"><code>git show &lt;分支&gt;@{yesterday}</code></td>
<td style="text-align:left">查看分支历史时点状态</td>
</tr>
<tr>
<td style="text-align:left"><code>git show</code></td>
<td style="text-align:left"><code>git show HEAD~&lt;n&gt;</code></td>
<td style="text-align:left">查看第 n 个祖先提交</td>
</tr>
<tr>
<td style="text-align:left"><code>git show-branch</code></td>
<td style="text-align:left"><code>git show-branch --all</code></td>
<td style="text-align:left">图示所有分支历史</td>
</tr>
<tr>
<td style="text-align:left"><code>git whatchanged</code></td>
<td style="text-align:left"><code>git whatchanged</code></td>
<td style="text-align:left">查看提交对应文件变更</td>
</tr>
<tr>
<td style="text-align:left"><code>git ls-tree</code></td>
<td style="text-align:left"><code>git ls-tree HEAD</code></td>
<td style="text-align:left">查看树对象内容</td>
</tr>
<tr>
<td style="text-align:left"><code>git rev-parse</code></td>
<td style="text-align:left"><code>git rev-parse &lt;ref&gt;</code></td>
<td style="text-align:left">解析引用对应的 SHA</td>
</tr>
<tr>
<td style="text-align:left"><code>git gc</code></td>
<td style="text-align:left"><code>git gc</code></td>
<td style="text-align:left">压缩清理仓库对象</td>
</tr>
<tr>
<td style="text-align:left"><code>git fsck</code></td>
<td style="text-align:left"><code>git fsck</code></td>
<td style="text-align:left">校验仓库对象完整性</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>Winget</title>
      <link>https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/Winget</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/Winget</guid>
    <pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate>
    <description>Winget github repo https://github.com/microsoft/winget-cli 1. 什么是 Winget winget （Windows Package Manager CLI）是微软官方包管理器，用于发现、安装、升级、卸载软件。 - 系统集成 ：随 App Installer 分发更新（Windows 10 1809+ / Windows 11 / Windows Server 2025）。 - 覆盖面广 ：对 MSI/EXE/MSI</description>
      <content:encoded><![CDATA[<h1>Winget 使用指南</h1>
<p><a href="https://github.com/microsoft/winget-cli">Winget github repo</a></p>
<h2>1. 什么是 Winget</h2>
<p><code>winget</code>（Windows Package Manager CLI）是微软官方包管理器，用于发现、安装、升级、卸载软件。</p>
<ul>
<li><strong>系统集成</strong>：随 <strong>App Installer</strong> 分发更新（Windows 10 1809+ / Windows 11 / Windows Server 2025）。</li>
<li><strong>覆盖面广</strong>：对 MSI/EXE/MSIX 等安装器生态友好，GUI 软件尤其方便。</li>
<li><strong>可复刻环境</strong>：<code>export/import</code> 一键恢复常用软件。</li>
</ul>
<h2>2. 安装与验证</h2>
<p>Windows 10/11 通常已自带（来自 Microsoft Store 的 <strong>App Installer</strong>）。若缺失/过旧：在 Microsoft Store 安装或更新 <strong>App Installer</strong>。
首次登录新系统时 <code>winget</code> 可能延迟出现，可在 PowerShell 触发注册：</p>
<pre><code class="language-powershell">Add-AppxPackage -RegisterByFamilyName -MainPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe
</code></pre>
<pre><code class="language-powershell">winget --version
winget --info
winget source list
</code></pre>
<h2>3. 常用命令</h2>
<table>
<thead>
<tr>
<th style="text-align:left">目的</th>
<th style="text-align:left">命令</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">搜索</td>
<td style="text-align:left"><code>winget search &lt;keyword&gt;</code>（可用 <code>--id/--name/--tag/--command</code> 过滤）</td>
</tr>
<tr>
<td style="text-align:left">详情</td>
<td style="text-align:left"><code>winget show --id &lt;id&gt;</code></td>
</tr>
<tr>
<td style="text-align:left">安装</td>
<td style="text-align:left"><code>winget install --id &lt;id&gt; -e</code>（推荐：<code>--id + -e</code>）</td>
</tr>
<tr>
<td style="text-align:left">已装</td>
<td style="text-align:left"><code>winget list</code></td>
</tr>
<tr>
<td style="text-align:left">可升级</td>
<td style="text-align:left"><code>winget upgrade</code></td>
</tr>
<tr>
<td style="text-align:left">全量升级</td>
<td style="text-align:left"><code>winget upgrade --all</code>（可加 <code>--include-unknown/--include-pinned</code>）</td>
</tr>
<tr>
<td style="text-align:left">卸载</td>
<td style="text-align:left"><code>winget uninstall --id &lt;id&gt; -e</code></td>
</tr>
<tr>
<td style="text-align:left">迁移</td>
<td style="text-align:left"><code>winget export</code> / <code>winget import</code></td>
</tr>
<tr>
<td style="text-align:left">Source</td>
<td style="text-align:left"><code>winget source list/update</code></td>
</tr>
<tr>
<td style="text-align:left">锁版本</td>
<td style="text-align:left"><code>winget pin add/list/remove</code></td>
</tr>
</tbody>
</table>
<p>常用写法（减少交互提示、避免歧义）：</p>
<pre><code class="language-powershell">winget install --id Git.Git -e --accept-package-agreements --accept-source-agreements
winget install --id Microsoft.VisualStudioCode -e --accept-package-agreements --accept-source-agreements
winget upgrade --all --accept-package-agreements --accept-source-agreements
</code></pre>
<p>常用参数（是否生效取决于安装器/清单）：<code>-s, --source winget|msstore</code>、<code>-h, --silent</code>、<code>-i, --interactive</code>、<code>-v, --version</code>、<code>--scope user|machine</code>、<code>--override/--custom</code>、<code>-l, --location</code>。</p>
<h2>4. 迁移与复刻环境：export / import</h2>
<pre><code class="language-powershell">winget export -o winget-packages.json
winget export -o winget-packages.json --include-versions
winget import -i winget-packages.json --accept-package-agreements --accept-source-agreements
</code></pre>
<p>导入常用选项：<code>--ignore-unavailable</code>（有的包找不到也继续）、<code>--ignore-versions</code>（忽略版本装最新版）、<code>--no-upgrade</code>（已装则不升级）。</p>
<h2>5. Source 与字体仓库</h2>
<p>默认 Source 通常包含 <code>winget</code>（社区）、<code>msstore</code>（商店）、<code>winget-font</code>（字体）。其中 <code>winget-font</code> 常为 <code>Explicit=true</code>，需要显式指定 <code>-s winget-font</code> 才参与搜索/安装。</p>
<pre><code class="language-powershell">winget source list
winget source update
</code></pre>
<h2>6. Pin（锁版本/阻止升级）</h2>
<p><code>pin</code> 用于限制 WinGet 升级行为：pinning（不参与 <code>upgrade --all</code>）、blocking（禁止升级）、gating（允许的版本范围，如 <code>1.2.*</code>）。</p>
<pre><code class="language-powershell">winget pin add --id Microsoft.PowerToys -e
winget pin add --id Microsoft.PowerToys -e --blocking
winget pin add --id Microsoft.PowerToys -e --version 0.70.*
winget pin list
</code></pre>
<h2>7. 故障排查（日志/修复/常见限制）</h2>
<pre><code class="language-powershell">winget --info
winget list --open-logs
winget install &lt;pkg&gt; --verbose-logs
</code></pre>
<p>若 <code>winget</code> 本身异常，可用 PowerShell 模块修复：</p>
<pre><code class="language-powershell">Install-Module -Name Microsoft.WinGet.Client -Force -Repository PSGallery
Repair-WinGetPackageManager -Force -Latest
</code></pre>
<p>常见现象：厂商可能限制 <code>winget</code> 下载 UA 导致 403；<code>winget</code> CLI 不支持 system context。</p>
<h2>8. Winget vs Scoop：怎么选</h2>
<p>结合 <code>docs/knowledge/sharing/Windows/软件推荐/Scoop.md</code>：GUI/桌面软件优先 <code>winget</code>；CLI/开发工具链与“用户目录不污染”优先 <code>scoop</code>；常见最佳组合是两者并用。</p>
<h2>参考链接</h2>
<ul>
<li><a href="https://github.com/microsoft/winget-cli">Winget GitHub 仓库</a></li>
<li><a href="https://learn.microsoft.com/windows/package-manager/winget/">Winget 官方文档</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>OpenSSH</title>
      <link>https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/OpenSSH</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/OpenSSH</guid>
    <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
    <description>作用：在 Windows 11 上启用 OpenSSH Server，可以从其它客户端通过SSH连接到 windows 11 cli，且 只监听内网 IP+密钥登录 ，内网穿透IP可以用Easytier解决。。 1. 前置：确认 EasyTier 主机 IP ListenAddress 必须提前知道 主机 IP （例如 10.144.51.4 ），不能填网段（例如 10.144.51.0 ）。 管理员 PowerShell ：Win+R 输入 powershell ，按 Ct</description>
      <content:encoded><![CDATA[<h1>OpenSSH Server (Windows 11 + EasyTier)</h1>
<p>作用：在 Windows 11 上启用 OpenSSH Server，可以从其它客户端通过SSH连接到 windows 11 cli，且<strong>只监听内网 IP+密钥登录</strong>，内网穿透IP可以用Easytier解决。。</p>
<h2>1. 前置：确认 EasyTier 主机 IP</h2>
<p><code>ListenAddress</code> 必须提前知道<strong>主机 IP</strong>（例如 <code>10.144.51.4</code>），不能填网段（例如 <code>10.144.51.0</code>）。</p>
<p><strong>管理员 PowerShell</strong>：Win+R 输入 <code>powershell</code>，按 Ctrl+Shift+Enter。</p>
<pre><code class="language-powershell">Get-NetIPConfiguration | Format-Table InterfaceAlias,IPv4Address
</code></pre>
<p>或：</p>
<pre><code class="language-powershell">ipconfig
</code></pre>
<hr>
<h2>2. 安装并启用 OpenSSH Server</h2>
<p>管理员 PowerShell：</p>
<pre><code class="language-powershell">Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
</code></pre>
<p>启动并设为开机自启：</p>
<pre><code class="language-powershell">Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-Service sshd
</code></pre>
<p>若不想开机自启：</p>
<pre><code class="language-powershell">Set-Service -Name sshd -StartupType Manual
</code></pre>
<p>以后每次用<code>Start-Service sshd</code>这个命令手动启动。</p>
<p>（可选）SSH默认 Shell 改为 PowerShell：</p>
<pre><code class="language-powershell">New-ItemProperty -Path &quot;HKLM:\SOFTWARE\OpenSSH&quot; -Name DefaultShell `
  -Value &quot;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe&quot; `
  -PropertyType String -Force
</code></pre>
<hr>
<h2>3. 配置 sshd：只允许通过 EasyTier 内网访问</h2>
<p>配置文件：<code>C:\ProgramData\ssh\sshd_config</code></p>
<p>管理员 PowerShell 打开：</p>
<pre><code class="language-powershell">notepad C:\ProgramData\ssh\sshd_config
</code></pre>
<p>最小可用配置（按需替换端口与 IP）：</p>
<pre><code class="language-text">Port 22
AddressFamily inet

# 只监听 EasyTier 主机 IP
ListenAddress 10.144.51.4

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 仅用于过渡排错：若你只有 PIN，没有 Windows 密码，这里最终应设为 no
PasswordAuthentication yes

Subsystem sftp sftp-server.exe
</code></pre>
<p>应用配置：</p>
<pre><code class="language-powershell">Restart-Service sshd
</code></pre>
<hr>
<h2>4. 验证监听是否正确</h2>
<pre><code class="language-powershell">netstat -ano | findstr &quot;:22&quot;
</code></pre>
<p>期望看到：<code>10.144.51.4:22 LISTENING</code></p>
<p>不应看到：<code>0.0.0.0:22</code> 或 <code>[::]:22</code></p>
<hr>
<h2>5. 密钥登录</h2>
<h3>5.1 客户端生成密钥</h3>
<p>Termux / Linux / macOS / WSL：</p>
<pre><code class="language-bash">ssh-keygen -t ed25519
cat ~/.ssh/id_ed25519.pub
</code></pre>
<p>Windows PowerShell：</p>
<pre><code class="language-powershell">ssh-keygen -t ed25519
type $env:USERPROFILE\.ssh\id_ed25519.pub
</code></pre>
<p>复制整行公钥（以 <code>ssh-ed25519</code> 开头）。</p>
<hr>
<h2>6. 将公钥放到 Windows</h2>
<h3>6.1 普通用户</h3>
<p>路径：<code>C:\Users\&lt;用户名&gt;\.ssh\authorized_keys</code></p>
<p>示例（用户 <code>USER</code>）：</p>
<pre><code class="language-powershell">mkdir C:\Users\USER\.ssh -Force
notepad C:\Users\USER\.ssh\authorized_keys
</code></pre>
<h3>6.2 用户属于 Administrators 组（关键）</h3>
<p>Windows OpenSSH 对管理员组默认使用：<code>C:\ProgramData\ssh\administrators_authorized_keys</code></p>
<p>检查：</p>
<pre><code class="language-powershell">whoami
net localgroup administrators
</code></pre>
<p>写入：</p>
<pre><code class="language-powershell">notepad C:\ProgramData\ssh\administrators_authorized_keys
</code></pre>
<hr>
<h2>7. 修复 Windows 权限（必做）</h2>
<p>普通用户（替换用户名与路径）：</p>
<pre><code class="language-powershell">icacls C:\Users\USER\.ssh /inheritance:r
icacls C:\Users\USER\.ssh /grant &quot;USER:(F)&quot;
icacls C:\Users\USER\.ssh /grant &quot;SYSTEM:(F)&quot;

icacls C:\Users\USER\.ssh\authorized_keys /inheritance:r
icacls C:\Users\USER\.ssh\authorized_keys /grant &quot;USER:(R)&quot;
icacls C:\Users\USER\.ssh\authorized_keys /grant &quot;SYSTEM:(F)&quot;
</code></pre>
<p>管理员组：</p>
<pre><code class="language-powershell">icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant &quot;Administrators:(R)&quot;
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant &quot;SYSTEM:(F)&quot;
</code></pre>
<p>应用权限：</p>
<pre><code class="language-powershell">Restart-Service sshd
</code></pre>
<hr>
<h2>8. 客户端连接</h2>
<pre><code class="language-bash">ssh -p 22 USER@10.144.51.4
</code></pre>
<p>调试：</p>
<pre><code class="language-bash">ssh -vvv -p 22 USER@10.144.51.4
</code></pre>
<hr>
<h2>9. 排错（速查）</h2>
<p>配置语法自检：</p>
<pre><code class="language-powershell">&amp; &quot;$env:WINDIR\System32\OpenSSH\sshd.exe&quot; -t -f C:\ProgramData\ssh\sshd_config
echo $LASTEXITCODE
</code></pre>
<p>前台 Debug（定位绑定/读 key/权限）：</p>
<pre><code class="language-powershell">Stop-Service sshd
cd $env:WINDIR\System32\OpenSSH
.\sshd.exe -ddd -f C:\ProgramData\ssh\sshd_config
</code></pre>
<p>退出 debug 后恢复服务：</p>
<pre><code class="language-powershell">Start-Service sshd
</code></pre>
<p>常见错误：</p>
<table>
<thead>
<tr>
<th style="text-align:left">现象</th>
<th style="text-align:left">常见原因</th>
<th style="text-align:left">修复</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>Cannot bind any address</code> / <code>ERROR:10049</code></td>
<td style="text-align:left"><code>ListenAddress</code> 填了网段或不存在 IP</td>
<td style="text-align:left">填 EasyTier 主机 IP</td>
</tr>
<tr>
<td style="text-align:left"><code>Authentication failed with public key</code></td>
<td style="text-align:left">公钥位置不对 / 权限不对 / key 粘贴断行</td>
<td style="text-align:left">检查管理员组路径 + <code>icacls</code></td>
</tr>
<tr>
<td style="text-align:left">密码总失败（只有 PIN）</td>
<td style="text-align:left">PIN 不是 Windows 密码</td>
<td style="text-align:left">用密钥登录；或设置 Windows Password</td>
</tr>
</tbody>
</table>
<hr>
<h2>10. 收尾加固</h2>
<p>确认密钥登录稳定后，关闭密码登录：</p>
<pre><code class="language-text">PasswordAuthentication no
</code></pre>
<pre><code class="language-powershell">Restart-Service sshd
</code></pre>
<hr>
<h2>11. 检查清单</h2>
<ul>
<li><code>netstat</code> 仅监听：<code>10.144.51.4:22 LISTENING</code></li>
<li><code>ssh -p 22 USER@10.144.51.4</code> 可用密钥登录</li>
<li>若用户在 Administrators 组：公钥在 <code>C:\ProgramData\ssh\administrators_authorized_keys</code></li>
<li>已设置 <code>PasswordAuthentication no</code>（可选但推荐）</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Scoop</title>
      <link>https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/Scoop</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Windows/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/Scoop</guid>
    <pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate>
    <description>1. 什么是Scoop Scoop github repo https://github.com/ScoopInstaller/Scoop Scoop 是 Windows 下的命令行包管理器（类似 Debian 的 apt 或 macOS 的 Homebrew ）。 非侵入式 ：默认安装在用户目录 ~/scoop ，无需管理员权限。 环境整洁 ：自动管理 Path 环境变量，不会污染注册表。 脚本友好 ：极其适合快速搭建开发环境。</description>
      <content:encoded><![CDATA[<h1>Scoop 使用指南</h1>
<h2>1. 什么是Scoop</h2>
<p><a href="https://github.com/ScoopInstaller/Scoop">Scoop github repo</a></p>
<p>Scoop 是 Windows 下的命令行包管理器（类似 Debian 的 <code>apt</code> 或 macOS 的 <code>Homebrew</code>）。</p>
<ul>
<li><strong>非侵入式</strong>：默认安装在用户目录 (<code>~/scoop</code>)，无需管理员权限。</li>
<li><strong>环境整洁</strong>：自动管理 Path 环境变量，不会污染注册表。</li>
<li><strong>脚本友好</strong>：极其适合快速搭建开发环境。</li>
</ul>
<hr>
<h2>2. 安装与部署</h2>
<blockquote>
<p><strong>环境要求</strong>：PowerShell 5.1+ (Windows 10/11 默认满足)。</p>
</blockquote>
<h3>2.1 一行命令安装</h3>
<p>打开 PowerShell，直接运行：</p>
<pre><code class="language-powershell">Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
</code></pre>
<p>它将把 Scoop 安装到默认位置：<code>C:\Users\&lt;YOUR USERNAME&gt;\scoop</code></p>
<p>如果系统询问你是否更改策略，输入 Y 并回车确认。</p>
<h3>2.2 验证安装</h3>
<p>安装完成后，输入以下命令查看帮助信息，如果能看到输出说明安装成功：</p>
<pre><code class="language-powershell">scoop help
</code></pre>
<h2>3. 快速上手</h2>
<h3>3.1 必备组件</h3>
<p>安装完 Scoop 后，建议优先安装以下工具以提升体验：</p>
<pre><code class="language-powershell"># 安装 Git (所有 bucket 的基础)
scoop install git

# 安装多线程下载器 Aria2 (极大提升下载速度)
scoop install aria2
scoop config aria2-enabled true
</code></pre>
<h3>3.2 启用常用软件库 (Buckets)</h3>
<p>Scoop 默认只有 <code>main</code> 库（精简 CLI 工具）。我们需要启用桶拓展 <code>bucket add</code> 以获取更多常用软件：</p>
<pre><code class="language-powershell"># 通用软件库 (浏览器、VS Code 等)
scoop bucket add extras

# 游戏 - 开源及免费软件类视频游戏与游戏相关工具
scoop bucket add games

# 字体库 (Fira Code, JetBrains Mono 等)
scoop bucket add nerd-fonts

# 来自 Nirsoft 的 250 多款应用合集
scoop bucket add nirsoft

# 来自微软的 Sysinternals 工具集
scoop bucket add sysinternals

# nonportable 应用程序（可能触发 UAC 提示）
scoop bucket add nonportable

# 软件历史版本 (如 Python 2.7, Java 8)
scoop bucket add versions

# 适用于大多数版本的 PHP 安装程序
scoop bucket add php

# Java 专用库
scoop bucket add java
</code></pre>
<h3>3.3 常用命令速查</h3>
<table>
<thead>
<tr>
<th style="text-align:left">操作</th>
<th style="text-align:left">命令</th>
<th style="text-align:left">示例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>搜索</strong></td>
<td style="text-align:left"><code>scoop search &lt;app&gt;</code></td>
<td style="text-align:left"><code>scoop search python</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>搜索</strong></td>
<td style="text-align:left"><code>scoop search</code></td>
<td style="text-align:left">显示所有支持的软件</td>
</tr>
<tr>
<td style="text-align:left"><strong>安装</strong></td>
<td style="text-align:left"><code>scoop install &lt;app&gt;</code></td>
<td style="text-align:left"><code>scoop install vscode</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>更新</strong></td>
<td style="text-align:left"><code>scoop update *</code></td>
<td style="text-align:left">更新所有软件</td>
</tr>
<tr>
<td style="text-align:left"><strong>清理</strong></td>
<td style="text-align:left"><code>scoop cleanup *</code></td>
<td style="text-align:left">删除旧版本安装包</td>
</tr>
<tr>
<td style="text-align:left"><strong>状态</strong></td>
<td style="text-align:left"><code>scoop status</code></td>
<td style="text-align:left">检查是否有更新</td>
</tr>
</tbody>
</table>
<hr>
<h2>4. 开发环境配置 (最佳实践)</h2>
<h3>4.1 核心编程语言</h3>
<p><strong>Python</strong>
Scoop 安装的 Python 不会污染全局环境，且支持版本管理。</p>
<pre><code class="language-powershell">scoop install python
</code></pre>
<p><strong>Go (Golang)</strong>
Scoop 会自动配置 <code>GOPATH</code> 和 <code>GOBIN</code>，开箱即用。</p>
<pre><code class="language-powershell">scoop install go
</code></pre>
<p><strong>Java (JDK)</strong>
安装最新的 OpenJDK（需先添加 <code>java</code> bucket）：</p>
<pre><code class="language-powershell">scoop install openjdk
# 或者安装特定版本
scoop install openjdk17
</code></pre>
<p><strong>Node.js</strong>
推荐安装 LTS 版本：</p>
<pre><code class="language-powershell">scoop install nodejs-lts
</code></pre>
<h3>4.2 Rust (推荐方案)</h3>
<p>Windows 上安装 Rust 最大的痛点是 C++ 链接器。我们推荐使用 <code>rustup</code> + <code>msvc</code>：</p>
<ol>
<li><strong>安装 Rustup</strong>:<pre><code class="language-powershell">scoop install rustup
</code></pre>
</li>
<li><strong>安装链接器 (Visual Studio Build Tools)</strong>:
由于 VS Build Tools 体积庞大且配置复杂，<strong>不推荐用 Scoop 安装</strong>。
<ul>
<li>下载 <a href="https://visualstudio.microsoft.com/visual-cpp-build-tools/">Visual Studio Build Tools</a> 安装程序。</li>
<li>勾选 &quot;C++ 桌面开发&quot; 进行安装。</li>
</ul>
</li>
<li><strong>初始化</strong>:<pre><code class="language-powershell">rustup-init
</code></pre>
</li>
</ol>
<blockquote>
<p><em>轻量替代方案</em>：如果你坚决不想装 VS Build Tools，可以安装 <code>gcc</code> 并使用 GNU 工具链：</p>
<pre><code class="language-powershell">scoop install gcc
rustup default stable-x86_64-pc-windows-gnu
</code></pre>
</blockquote>
<h3>4.3 C/C++ (MinGW/GCC)</h3>
<p>如果你只需要简单的 C/C++ 编译环境（如刷题、简单项目）：</p>
<pre><code class="language-powershell">scoop install gcc
</code></pre>
<p>这会安装 MinGW-w64 工具链。</p>
<hr>
<h2>5. 命令行效率神器 (CLI Power Tools)</h2>
<p>Scoop 是安装现代化 CLI 工具的最佳途径，以下神器强烈推荐：</p>
<table>
<thead>
<tr>
<th style="text-align:left">工具</th>
<th style="text-align:left">用途</th>
<th style="text-align:left">命令</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>ripgrep</strong></td>
<td style="text-align:left">极速代码搜索 (比 grep 快得多)</td>
<td style="text-align:left"><code>scoop install ripgrep</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>fd</strong></td>
<td style="text-align:left">极速文件搜索 (比 find 友好)</td>
<td style="text-align:left"><code>scoop install fd</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>fzf</strong></td>
<td style="text-align:left">模糊查找神器</td>
<td style="text-align:left"><code>scoop install fzf</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>bat</strong></td>
<td style="text-align:left">带语法高亮的 cat 替代品</td>
<td style="text-align:left"><code>scoop install bat</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>neovim</strong></td>
<td style="text-align:left">现代化 Vim 编辑器</td>
<td style="text-align:left"><code>scoop install neovim</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>7zip</strong></td>
<td style="text-align:left">命令行解压工具</td>
<td style="text-align:left"><code>scoop install 7zip</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>ffmpeg</strong></td>
<td style="text-align:left">视音频处理瑞士军刀</td>
<td style="text-align:left"><code>scoop install ffmpeg</code></td>
</tr>
</tbody>
</table>
<hr>
<h2>6. 进阶技巧</h2>
<h3>6.1 代理设置</h3>
<p>如果下载速度慢，可以为 Scoop 单独设置代理（Aria2 也会生效）：</p>
<pre><code class="language-powershell">scoop config proxy 127.0.0.1:10808
</code></pre>
<h3>6.2 忘记 root 密码? (sudo)</h3>
<p>Scoop 有一个名为 <code>sudo</code> 的包，可以让你在非管理员终端临时提权：</p>
<pre><code class="language-powershell">scoop install sudo
sudo Set-Time  # 举例
</code></pre>
<h2>参考链接</h2>
<ul>
<li><a href="https://github.com/ScoopInstaller/Scoop">Scoop GitHub 仓库</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>本地上传镜像至服务器</title>
      <link>https://develata.me/knowledge/sharing/docker/%E6%9C%AC%E5%9C%B0%E4%B8%8A%E4%BC%A0%E9%95%9C%E5%83%8F%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/%E6%9C%AC%E5%9C%B0%E4%B8%8A%E4%BC%A0%E9%95%9C%E5%83%8F%E8%87%B3%E6%9C%8D%E5%8A%A1%E5%99%A8</guid>
    <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
    <description>三步走：拉取与打包（本地） - 传输 - 加载（服务器） 。 第一步：在 Windows 本地拉取并打包镜像 拉取镜像 打开 Windows 的终端（PowerShell 或 CMD），拉取你需要的镜像。 例如：拉取最新的 nginx 镜像 ⚠️ 架构注意（非常重要）： 大多数 Windows 电脑是 x86 64 amd64 架构。如果你的服务器也是 amd64（如常见的 VPS），直接拉取即可。 但是 ，如果你的服务器是 ARM 架构 （例如甲骨文 ARM 机器、树莓派）</description>
      <content:encoded><![CDATA[<p><strong>三步走：拉取与打包（本地）</strong> -&gt; <strong>传输</strong> -&gt; <strong>加载（服务器）</strong>。</p>
<h3>第一步：在 Windows 本地拉取并打包镜像</h3>
<p><strong>拉取镜像</strong> 打开 Windows 的终端（PowerShell 或 CMD），拉取你需要的镜像。 <em>例如：拉取最新的 nginx 镜像</em></p>
<pre><code class="language-plain">docker pull nginx:latest
</code></pre>
<p><strong>⚠️</strong>** 架构注意（非常重要）：** 大多数 Windows 电脑是 <code>x86_64</code> (amd64) 架构。如果你的服务器也是 amd64（如常见的 VPS），直接拉取即可。 <strong>但是</strong>，如果你的服务器是 <strong>ARM 架构</strong>（例如甲骨文 ARM 机器、树莓派），你需要指定平台拉取，否则上传后无法运行： <code>docker pull --platform linux/arm64 nginx:latest</code></p>
<p><strong>将镜像保存为文件</strong> 使用 <code>docker save</code> 命令将镜像打包成一个 <code>.tar</code> 文件。</p>
<pre><code class="language-plain"># 语法：docker save -o &lt;文件名.tar&gt; &lt;镜像名:标签&gt;
docker save -o nginx_image.tar nginx:latest
</code></pre>
<p><em>此时，你的当前目录下会生成一个 <em><code>_nginx_image.tar_</code></em> 文件。</em></p>
<hr>
<h3>第二步：将文件上传到服务器</h3>
<p>你可以使用 <code>scp</code> 命令（Windows 10/11 自带）或图形化工具（如 WinSCP、FileZilla）。</p>
<p><strong>方法 A：使用命令行 SCP (推荐)</strong> 在 PowerShell 中执行：</p>
<pre><code class="language-plain"># 语法：scp &lt;本地文件路径&gt; &lt;用户名&gt;@&lt;服务器IP&gt;:&lt;服务器目标路径&gt;
scp nginx_image.tar root@192.168.1.100:/root/
</code></pre>
<p><em>(系统会提示你输入服务器密码，输入后回车即可)</em></p>
<p><strong>方法 B：使用图形化工具</strong> 如果你安装了 WinSCP 或 SFTP 等，直接将生成的 <code>.tar</code> 文件拖拽到服务器的某个目录（例如 <code>/root/</code>）即可。</p>
<hr>
<h3>第三步：在服务器上加载镜像</h3>
<p>SSH 登录到你的服务器，进入上传文件的目录，执行加载命令。</p>
<p><strong>加载镜像</strong> 使用 <code>docker load</code> 命令。</p>
<pre><code class="language-plain"># 语法：docker load -i &lt;文件名.tar&gt;
docker load -i nginx_image.tar
</code></pre>
<p><strong>验证是否成功</strong> 查看镜像列表，确认镜像已经存在，若已经存在那么可以删掉上传的文件。</p>
<pre><code class="language-plain">docker images
</code></pre>
<p><em>你应该能看到 <em><code>_nginx_</code></em> 及其标签 <em><code>_latest_</code></em> 出现在列表中。</em></p>
<p><strong>启动容器</strong> 现在你可以像平常一样使用这个镜像了：</p>
<pre><code class="language-plain">docker run -d -p 80:80 nginx:latest
</code></pre>
<hr>
<h3>💡 进阶技巧：压缩文件体积</h3>
<p><code>docker save</code> 出来的 <code>.tar</code> 文件是未压缩的，通常很大。如果你的上传带宽较小，可以在 Windows 上先压缩一下（需要安装 7-Zip 或使用 WSL）。</p>
<p><strong>如果使用 WSL (Windows Subsystem for Linux) 或 Git Bash：</strong> 你可以直接用管道命令压缩：</p>
<p>Bash</p>
<pre><code class="language-plain">docker save nginx:latest | gzip &gt; nginx_image.tar.gz
</code></pre>
<p><strong>对应的服务器解压加载命令：</strong></p>
<p>Bash</p>
<pre><code class="language-plain">docker load -i nginx_image.tar.gz
</code></pre>
<p><em>Docker 会自动识别 gzip 格式并解压加载。</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>docker个人镜像站</title>
      <link>https://develata.me/knowledge/sharing/docker/docker%E4%B8%AA%E4%BA%BA%E9%95%9C%E5%83%8F%E7%AB%99</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/docker/docker%E4%B8%AA%E4%BA%BA%E9%95%9C%E5%83%8F%E7%AB%99</guid>
    <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
    <description>我的建议：Github Actions（可以到我的仓库develata/docker-syncer 直接复制模板库）+阿里云ACR。 Github Actions+阿里云ACR 我们将利用 GitHub Actions（由于在海外，能秒下 DockerHub 镜像） 作为搬运工，自动把镜像推送到你的 阿里云 ACR（国内杭州/北京节点） ，然后你的服务器就可以在国内 跑满带宽 拉取了。 整个过程 完全免费 。</description>
      <content:encoded><![CDATA[<p>我的建议：Github Actions（可以到我的仓库develata/docker-syncer 直接复制模板库）+阿里云ACR。</p>
<h2>Github Actions+阿里云ACR</h2>
<p>我们将利用 <strong>GitHub Actions（由于在海外，能秒下 DockerHub 镜像）</strong> 作为搬运工，自动把镜像推送到你的 <strong>阿里云 ACR（国内杭州/北京节点）</strong>，然后你的服务器就可以在国内<strong>跑满带宽</strong>拉取了。</p>
<p>整个过程<strong>完全免费</strong>。</p>
<hr>
<h3>第一阶段：配置阿里云 ACR（准备仓库）</h3>
<p><strong>目标</strong>：在阿里云建立一个“收货地址”。</p>
<ol>
<li><strong>开通服务</strong>
<ul>
<li>登录 <a href="https://homenew.console.aliyun.com/">阿里云控制台</a>。</li>
<li>搜索 <strong>“容器镜像服务”</strong> (ACR) 并进入。</li>
<li>如果提示开通，点击开通（免费）。</li>
</ul>
</li>
<li><strong>创建个人实例（关键！）</strong>
<ul>
<li>点击左侧 <strong>“实例列表”</strong>。</li>
<li><strong>选择地域</strong>：一定要选离你服务器近的<strong>国内地域</strong>！比如 <strong>“华东1（杭州）”</strong> 或 <strong>“华北2（北京）”</strong>。不要选东京/香港，否则国内拉取会慢。Github可以直连dockerhub，虽然 GitHub 连国内阿里云有时候稍慢，但这是发生在 GitHub 的服务器上的，<strong>你不需要等待，也不占你的带宽</strong>。只要脚本跑完了，镜像就躺在杭州了。国内下载<strong>走阿里云国内 BGP 线路，跑满带宽</strong>，且极其稳定。</li>
<li>点击页面顶部的 <strong>“个人实例”</strong> 标签（不要看企业版）。</li>
<li>点击 <strong>“创建个人实例”</strong> -&gt; 确认协议 -&gt; 确定。</li>
</ul>
</li>
<li><strong>设置访问密码</strong>
<ul>
<li>进入刚创建的实例。</li>
<li>左侧菜单点击 <strong>“访问凭证”</strong>。</li>
<li>点击右上角 <strong>“设置固定密码”</strong>。</li>
<li><strong>注意</strong>：这个密码是专门给 <code>docker login</code> 用的，<strong>不要</strong>和你的阿里云登录密码一样，设置一个你记得住的。</li>
</ul>
</li>
<li><strong>创建命名空间</strong>
<ul>
<li>左侧菜单点击 <strong>“命名空间”</strong> -&gt; <strong>“创建命名空间”</strong>。</li>
<li>名称：起个你喜欢的名字，比如 <code>my-docker-hub</code>（全网唯一，如果被占用了就换一个）。</li>
<li>设置为 <strong>“私有”</strong>（如果你不想别人下载）或 <strong>“公开”</strong>（方便自己随便拉）。<strong>建议先设为“私有”</strong>。</li>
</ul>
</li>
</ol>
<hr>
<h3>第二阶段：配置 GitHub（准备搬运工）</h3>
<p><strong>目标</strong>：雇佣 GitHub 的免费服务器帮我们干活。</p>
<ol>
<li><strong>创建仓库</strong>
<ul>
<li>登录 GitHub，点击右上角 <code>+</code> -&gt; <code>New repository</code>。</li>
<li>Repository name: 随便填，比如 <code>docker-syncer</code>。</li>
<li>Visibility: <strong>Private</strong> (建议私有)。</li>
<li>点击 <code>Create repository</code>。</li>
</ul>
</li>
<li><strong>配置阿里云账号密码（Secrets）</strong>
<ul>
<li>在你的 GitHub 仓库页面，点击上方的 <strong>Settings</strong>。</li>
<li>左侧边栏找到 <strong>Secrets and variables</strong> -&gt; <strong>Actions</strong>。</li>
<li>点击 <strong>New repository secret</strong>，我们需要添加 3 个变量（把阿里云的信息填进去）：</li>
</ul>
</li>
</ol>
<table>
<thead>
<tr>
<th><strong>Name</strong></th>
<th><strong>Secret (Value) 填什么？</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ALIYUN_USERNAME</code></td>
<td>你的阿里云全名（在 ACR“访问凭证”页可以看到，通常是 <code>用户名@账号ID</code><br/> 这种格式）</td>
</tr>
<tr>
<td><code>ALIYUN_PASSWORD</code></td>
<td>刚才在 ACR 里设置的那个“固定密码”</td>
</tr>
<tr>
<td><code>ALIYUN_NAMESPACE</code></td>
<td>刚才创建的命名空间名字（例如 <code>my-docker-hub</code><br/>）</td>
</tr>
<tr>
<td><code>ALIYUN_REGISTRY</code></td>
<td>你的 ACR 公网地址（在 ACR“概览”页可以看到，例如 <code>registry.cn-hangzhou.aliyuncs.com</code><br/>）</td>
</tr>
</tbody>
</table>
<p><em>(注：填完这 4 个 Secret，GitHub 就有权限操作你的阿里云仓库了)</em></p>
<hr>
<h3>第三阶段：编写搬运脚本</h3>
<p><strong>目标</strong>：告诉 GitHub 怎么干活。（可以直接复制我的模板库develata/docker-syncer ）</p>
<ol>
<li>在 GitHub 仓库页面，点击 <strong>Actions</strong> 标签。</li>
<li>点击 <strong>set up a workflow yourself</strong> (或者 New workflow)。</li>
<li>将文件名改为 <code>sync-image.yml</code>。</li>
<li><strong>复制粘贴以下代码</strong>（我为你写了一个“万能输入框”版本的脚本）：</li>
</ol>
<pre><code class="language-plain">name: 搬运镜像到阿里云

on:
  workflow_dispatch:
    inputs:
      image_name:
        description: '原镜像名称 (例如: mysql:8.0 或 nginx:latest)'
        required: true
        default: 'nginx:latest'
      new_name:
        description: '保存到阿里云的名称 (留空则与原名一致)'
        required: false
        default: ''

jobs:
  push-to-aliyun:
    runs-on: ubuntu-latest
    steps:
      - name: 登录阿里云 ACR
        uses: docker/login-action@v2
        with:
          registry: ${{ secrets.ALIYUN_REGISTRY }}
          username: ${{ secrets.ALIYUN_USERNAME }}
          password: ${{ secrets.ALIYUN_PASSWORD }}

      - name: 拉取、重命名并推送
        run: |
          # 1. 解析输入
          SRC_IMAGE=&quot;${{ inputs.image_name }}&quot;
          
          # 如果用户没填新名字，就提取原镜像的最后一段，比如 mysql:8.0
          if [ -z &quot;${{ inputs.new_name }}&quot; ]; then
            TARGET_IMAGE_TAG=$(echo &quot;$SRC_IMAGE&quot; | awk -F'/' '{print $NF}')
          else
            TARGET_IMAGE_TAG=&quot;${{ inputs.new_name }}&quot;
          fi
          
          # 组合阿里云的目标地址
          ALIYUN_TARGET=&quot;${{ secrets.ALIYUN_REGISTRY }}/${{ secrets.ALIYUN_NAMESPACE }}/$TARGET_IMAGE_TAG&quot;
          
          echo &quot;正在从 $SRC_IMAGE 拉取...&quot;
          docker pull $SRC_IMAGE
          
          echo &quot;正在推送到 $ALIYUN_TARGET ...&quot;
          docker tag $SRC_IMAGE $ALIYUN_TARGET
          docker push $ALIYUN_TARGET
          
          echo &quot;✅ 成功！国内拉取地址: $ALIYUN_TARGET&quot;
</code></pre>
<ol>
<li>点击右上角 <strong>Commit changes</strong> 保存。</li>
</ol>
<hr>
<h3>第四阶段：实际使用（见证奇迹）</h3>
<p>现在，你想要拉取任何被墙的镜像，只需要 3 步：</p>
<ol>
<li><strong>在 GitHub 点一下</strong>
<ul>
<li>进入 GitHub 仓库 -&gt; <strong>Actions</strong> 标签。</li>
<li>左侧点击 <strong>“搬运镜像到阿里云”</strong>。</li>
<li>右侧点击 <strong>Run workflow</strong>。</li>
<li>在弹出框里输入你想拉的镜像，比如 <code>mysql:8.0</code>，然后点击绿色按钮 <strong>Run workflow</strong>。</li>
</ul>
</li>
<li><strong>等待 1 分钟</strong>
<ul>
<li>你会看到一个圆圈在转，变绿勾✅表示成功。</li>
<li>点进去看日志，它会告诉你最终的国内地址。</li>
</ul>
</li>
<li><strong>在你的国内服务器/电脑上拉取</strong>
<ul>
<li><strong>首次使用需要登录</strong>（仅需一次）可以同时登录多个镜像站：</li>
</ul>
</li>
</ol>
<pre><code class="language-plain"># 这里的地址、用户名填你自己的
sudo docker login --username=你的用户名 你的ACR公网地址例如registry.cn-hangzhou.aliyuncs.com
# 输入密码（那个固定密码）
</code></pre>
<pre><code>- **高速拉取**：
</code></pre>
<pre><code class="language-plain"># 比如你的命名空间叫 my-docker-hub
sudo docker pull registry.cn-hangzhou.aliyuncs.com/my-docker-hub/mysql:8.0
</code></pre>
<hr>
<h3>这个方案的优势</h3>
<ol>
<li><strong>极速</strong>：最后一步拉取走的是阿里云国内 BGP 线路，速度取决于你的带宽上限。</li>
<li><strong>私密</strong>：你的仓库是私有的，别人拉不了。</li>
<li><strong>灵活</strong>：你想拉 <code>gcr.io</code> (谷歌)、<code>quay.io</code> (红帽) 的镜像都可以，只需在 GitHub 输入框里填完整地址（例如 <code>gcr.io/google-samples/hello-app:1.0</code>）。</li>
<li><strong>干净</strong>：你的服务器不需要安装任何乱七八糟的代理工具，只需要标准 Docker。</li>
</ol>
<h2>海外服务器中转</h2>
<h3>方案核心逻辑</h3>
<ul>
<li><strong>架构</strong>：<code>国内服务器</code> -&gt; <code>HTTPS 请求</code> -&gt; <code>你的海外 VPS (Nginx + Registry 缓存)</code> -&gt; <code>Docker Hub</code></li>
</ul>
<h3>实施步骤 (基于 Docker Compose)</h3>
<p>假设你的域名是 <code>docker.baidu.com</code>，并且解析到了你的海外 VPS IP。</p>
<h4>第一步：在海外 VPS 上部署 Registry (作为缓存)</h4>
<p>我们需要部署官方的 <code>registry:2</code> 镜像，并开启 <code>proxy</code> 模式。</p>
<ol>
<li><strong>创建目录</strong>：</li>
</ol>
<pre><code class="language-plain">mkdir -p /opt/docker-mirror/data
mkdir -p /opt/docker-mirror/config
cd /opt/docker-mirror
</code></pre>
<ol start="2">
<li>创建配置文件 config.yml：</li>
</ol>
<p>官方 Registry 镜像需要一个配置文件来启用代理模式。</p>
<pre><code class="language-plain">nano config/config.yml
</code></pre>
<p>写入以下内容：</p>
<pre><code class="language-plain">version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
proxy:
  remoteurl: https://registry-1.docker.io # 关键：指向官方 Docker Hub
  username: &quot;&quot; # 如果你有 Docker Hub 账号，可填，否则留空
  password: &quot;&quot;
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
</code></pre>
<ol start="3">
<li>**创建 **<code>**docker-compose.yml**</code>：</li>
</ol>
<pre><code class="language-plain">nano docker-compose.yml
</code></pre>
<p>写入以下内容：</p>
<pre><code class="language-plain">version: '3'
services:
  registry-mirror:
    image: registry:2
    container_name: docker-mirror
    restart: always
    ports:
      - &quot;127.0.0.1:5000:5000&quot; # 只监听本地，通过 Nginx 暴露更安全
    volumes:
      - ./config/config.yml:/etc/docker/registry/config.yml
      - ./data:/var/lib/registry # 缓存数据存这里
</code></pre>
<ol start="4">
<li><strong>启动容器</strong>：</li>
</ol>
<pre><code class="language-plain">docker compose up -d
</code></pre>
<h4>第二步：配置 Nginx 反向代理 + HTTPS + 鉴权</h4>
<p>直接暴露 5000 端口很危险，容易被白嫖流量。我们使用 Nginx 来加一层 SSL 和密码保护。</p>
<ol>
<li><strong>安装 Nginx 和工具</strong> (以 Ubuntu/Debian 为例)：</li>
</ol>
<pre><code class="language-plain">apt update &amp;&amp; apt install nginx apache2-utils -y
</code></pre>
<ol start="2">
<li>生成密码文件：</li>
</ol>
<p>设置一个用户名（如 myuser）和密码。</p>
<pre><code class="language-plain">htpasswd -Bc /etc/nginx/docker.htpasswd myuser
# 输入两次密码
</code></pre>
<ol start="3">
<li><strong>配置 Nginx 站点</strong>：</li>
</ol>
<pre><code class="language-plain">nano /etc/nginx/sites-available/docker-mirror
</code></pre>
<p>写入配置（请替换你的域名）：</p>
<pre><code class="language-plain">server {
    listen 80;
    server_name docker.baidu.com;
    # 强制跳转 HTTPS (建议配合 Certbot 使用)
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name docker.baidu.com;

    # SSL 证书配置 (推荐用 certbot 自动生成，这里仅为占位)
    ssl_certificate /etc/letsencrypt/live/docker.baidu.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/docker.baidu.com/privkey.pem;

    # 优化上传大小
    client_max_body_size 2G;

    location / {
        # 开启 Basic Auth 鉴权
        auth_basic &quot;Registry Realm&quot;;
        auth_basic_user_file /etc/nginx/docker.htpasswd;

        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
</code></pre>
<p><em>注：SSL 证书建议使用 <em><code>_certbot --nginx_</code></em> 一键生成。</em></p>
<ol start="4">
<li><strong>重启 Nginx</strong>：</li>
</ol>
<pre><code class="language-plain">ln -s /etc/nginx/sites-available/docker-mirror /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx
</code></pre>
<h4>第三步：在国内服务器上使用</h4>
<p>现在你的海外 VPS 已经是一个带密码保护的私有镜像站了。</p>
<p>方式 A：作为镜像加速器（配置 daemon.json）</p>
<p>注意：Docker 的 registry-mirrors 配置项不支持带用户名密码的地址。</p>
<p>如果你在 Nginx 开启了 auth_basic，直接配置 registry-mirrors 会拉取失败。</p>
<p><strong>解决方法：</strong></p>
<ol>
<li>方案 1（推荐 - IP 白名单）：</li>
</ol>
<p>在 VPS 的 Nginx 配置里，去掉 auth_basic，改为只允许你国内服务器的 IP 访问：</p>
<pre><code class="language-plain">location / {
    allow 1.2.3.4; # 你国内服务器的公网 IP
    deny all;
    proxy_pass http://127.0.0.1:5000;
    ...
}
</code></pre>
<p>这样配置后，在国内服务器修改 <code>/etc/docker/daemon.json</code>：</p>
<pre><code class="language-plain">{
  &quot;registry-mirrors&quot;: [&quot;https://docker.baidu.com&quot;]
}
</code></pre>
<p>然后重启 Docker，以后 <code>docker pull nginx</code> 就会自动走你的 VPS。</p>
<ol start="2">
<li>方案 2（手动 Login 模式）：</li>
</ol>
<p>如果你无法固定国内 IP（比如家用宽带），保留 auth_basic。</p>
<p>使用时不能配置为 mirror，而是手动拉取：</p>
<pre><code class="language-plain"># 登录私有仓库
docker login docker.baidu.com
# 输入 myuser 和密码

# 拉取镜像 (注意要加域名)
docker pull docker.baidu.com/library/nginx:latest
</code></pre>
<h3>极客进阶建议</h3>
<p>如果你的 VPS 硬盘比较小，不想存缓存数据，但又想做中转。你可以把第一步中的 <code>registry:2</code> 容器换成一个简单的 <strong>SNI Proxy</strong> 或者 <strong>Nginx Stream Proxy</strong>，直接在 TCP 层转发流量到 <code>registry-1.docker.io</code>。</p>
<p>但考虑到你追求“效率”，<strong>带缓存的 Registry 方案（即上述方案）是最佳选择</strong>。它能避免重复消耗你 VPS 的公网带宽。</p>
<h2>GitHub Packages</h2>
<p>这是 GitHub 官方提供的容器镜像托管服务。相当于你在 GitHub 上开了一个私有的 Docker Hub</p>
<p><strong>原理</strong>：</p>
<ul>
<li><code>GitHub Actions</code> 构建/拉取镜像 -&gt; 推送到 <code>ghcr.io</code> (GitHub Container Registry)。</li>
<li><code>你的服务器</code> -&gt; 从 <code>ghcr.io</code> 拉取镜像。</li>
</ul>
<h3>核心概念</h3>
<ul>
<li><strong>地址域名</strong>：<code>ghcr.io</code></li>
<li><strong>镜像格式</strong>：<code>ghcr.io/你的用户名/镜像名:标签</code></li>
</ul>
<h3>第一阶段：准备工作（获取访问令牌）</h3>
<p>由于 GitHub 不允许在命令行使用账号密码登录，你需要生成一个 <strong>PAT (Personal Access Token)</strong>。</p>
<ol>
<li><strong>进入设置</strong>：
<ul>
<li>点击 GitHub 右上角头像 -&gt; <strong>Settings</strong>。</li>
<li>左侧边栏最底部 -&gt; <strong>Developer settings</strong>。</li>
<li>左侧 -&gt; <strong>Personal access tokens</strong> -&gt; <strong>Tokens (classic)</strong>。</li>
<li>点击 <strong>Generate new token (classic)</strong>。</li>
</ul>
</li>
<li><strong>配置权限（关键步骤）</strong>：
<ul>
<li><strong>Note</strong>: 随便填，例如 <code>docker-login-token</code>。</li>
<li><strong>Expiration</strong>: 建议选 <code>No expiration</code>（永久）或者按需设置。</li>
<li><strong>Select scopes</strong> (必须勾选以下几项):
<ul>
<li>✅ <code>write:packages</code> (允许上传镜像)</li>
<li>✅ <code>read:packages</code> (允许下载镜像)</li>
<li>✅ <code>delete:packages</code> (允许删除镜像)</li>
<li><em>(勾选 <em><code>_write:packages_</code></em> 时，</em><code>_repo_</code>_ 权限通常会自动勾选，保持即可)_。</li>
</ul>
</li>
<li>点击底部的 <strong>Generate token</strong>。</li>
</ul>
</li>
<li><strong>保存 Token</strong>：
<ul>
<li><strong>立刻复制</strong>那个 <code>ghp_</code> 开头的长字符串。<strong>这是你唯一的查看机会，关掉页面就看不到了！</strong></li>
</ul>
</li>
</ol>
<h3>第二阶段：在本地电脑手动推送镜像</h3>
<p>假设你在本地上推送镜像。</p>
<h4>1. 登录 (Login)</h4>
<p>打开终端（Terminal / PowerShell），输入以下命令：</p>
<pre><code class="language-plain"># 格式：echo &quot;你的PAT&quot; | docker login ghcr.io -u 你的用户名 --password-stdin

# 示例：
echo &quot;ghp_AbC123...&quot; | docker login ghcr.io -u develata --password-stdin
</code></pre>
<p><em>提示 <em><code>_Login Succeeded_</code></em> 即为成功。</em></p>
<h4>2. 准备镜像 (Tag)</h4>
<p>假设你想把本地的 <code>nginx:latest</code> 上传到 GitHub。GitHub 强制要求镜像名必须包含 <code>ghcr.io/用户名</code>。</p>
<pre><code class="language-plain"># 1. 拉取一个原版镜像
docker pull nginx:latest

# 2. 打标签 (Tag)
# 注意：GitHub 用户名必须全部小写!
docker tag nginx:latest ghcr.io/你的用户名/my-nginx:v1
</code></pre>
<h4>3. 推送镜像 (Push)</h4>
<pre><code class="language-plain">docker push ghcr.io/你的用户名/my-nginx:v1
</code></pre>
<p><em>进度条跑完后，你的镜像就已经存放在 GitHub 的服务器上了。</em></p>
<h4>4. 在 GitHub 查看</h4>
<ul>
<li>进入你的 GitHub 个人主页。</li>
<li>点击顶部的 <strong>Packages</strong> 标签页。</li>
<li>你应该能看到 <code>my-nginx</code> 这个包。</li>
</ul>
<h3>第三阶段：GitHub Actions 自动构建与推送</h3>
<p>这是 GitHub Packages 最强大的地方：<strong>无需手动登录，无需配置密码</strong>，Actions 脚本里自带权限。</p>
<p><strong>场景</strong>：你有一个 GitHub 仓库，里面有 <code>Dockerfile</code>，你希望每次提交代码，GitHub 自动帮你构建镜像并发布到 GHCR。</p>
<p>在你的仓库中创建 <code>.github/workflows/build-push.yml</code>：</p>
<pre><code class="language-plain">name: 构建并推送到 GHCR

on:
  push:
    branches: [ &quot;main&quot; ] # 当 main 分支有代码提交时触发

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }} # 自动获取 &quot;用户名/仓库名&quot;

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write # 关键：赋予 Actions 写入 Packages 的权限

    steps:
      - name: 拉取代码
        uses: actions/checkout@v3

      - name: 登录到 GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }} 
          # 注意：GITHUB_TOKEN 是系统内置的，你不需要手动去 Secrets 里设置，直接用就行！

      - name: 提取元数据 (tags, labels)
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

      - name: 构建并推送
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
</code></pre>
<p><strong>效果</strong>：你只管写代码，Git Push 之后，镜像就自动出现在你的 Packages 列表里了。</p>
<h3>第四阶段：镜像权限管理（私有 vs 公开）</h3>
<p>默认情况下，你推送的镜像是 **私有（Private）**的。</p>
<h4>1. 私有镜像 (Private)</h4>
<ul>
<li><strong>下载方式</strong>：必须先 <code>docker login</code>，且拥有权限。</li>
<li><strong>适用场景</strong>：企业内部代码、个人私密服务。</li>
</ul>
<h4>2. 公开镜像 (Public)</h4>
<p>如果你想做开源，或者方便服务器<strong>免登录拉取</strong>：</p>
<ol>
<li>进入 GitHub 个人主页 -&gt; <strong>Packages</strong>。</li>
<li>点击你刚才上传的镜像进入详情页。</li>
<li>点击右侧边栏底部的 <strong>Package settings</strong>。</li>
<li>找到 <strong>&quot;Change visibility&quot;</strong> 区域。</li>
<li>将 Visibility 改为 <strong>Public</strong>。</li>
</ol>
<p>改为 Public 后：</p>
<p>任何人在任何服务器上，都可以直接拉取：</p>
<pre><code class="language-plain">docker pull ghcr.io/你的用户名/my-nginx:v1
# 不需要 login，不需要密码
</code></pre>
<h3>第五阶段：从 DockerHub 搬运到 GHCR</h3>
<p>利用 <strong>GitHub Actions</strong> 作为云端搬运工。</p>
<h4>原理：</h4>
<p>GitHub Action 服务器 (美国) -&gt; <code>docker pull</code> (从 DockerHub) -&gt; <code>docker tag</code> (改名) -&gt; <code>docker push</code> (到 GHCR)。</p>
<h4>1. 创建 Action 脚本</h4>
<p>在你的一个 GitHub 仓库中，创建文件 <code>.github/workflows/sync-to-ghcr.yml</code>：</p>
<pre><code class="language-plain">name: 镜像搬运工 (DockerHub -&gt; GHCR)

on:
  workflow_dispatch:
    inputs:
      image_name:
        description: '原镜像名称 (例如: mysql:8.0)'
        required: true
        default: 'nginx:alpine'
      target_name:
        description: '保存名称 (可选，留空则保持原名)'
        required: false

env:
  REGISTRY: ghcr.io

jobs:
  mirror:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write # 必须权限

    steps:
      # 1. (可选) 登录 DockerHub —— 防止拉取时被限流
      # 如果你不需要，可以删除这一步，但保留着更稳
      - name: 登录 DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
        # 如果没有配置 Secrets，这一步会跳过或报错；
        # 即使报错，只要不是&quot;required&quot;，通常不影响后续，建议去 Secrets 配个免费号
        continue-on-error: true 

      # 2. 登录 GHCR
      - name: 登录 GHCR
        uses: docker/login-action@v2
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      # 3. 核心逻辑
      - name: 拉取、重命名并推送
        run: |
          # --- 变量准备 ---
          SRC_IMAGE=&quot;${{ inputs.image_name }}&quot;
          
          # 判断是否自定义了名称
          if [ -z &quot;${{ inputs.target_name }}&quot; ]; then
            # 提取原镜像名 (例如: library/nginx:alpine -&gt; nginx:alpine)
            IMAGE_TAG=$(echo &quot;$SRC_IMAGE&quot; | awk -F'/' '{print $NF}')
          else
            IMAGE_TAG=&quot;${{ inputs.target_name }}&quot;
          fi

          # 组合基础地址
          # 技巧: 直接在这里把整个字符串转为小写，一劳永逸
          FULL_TARGET=&quot;${{ env.REGISTRY }}/${{ github.repository_owner }}/$IMAGE_TAG&quot;
          TARGET_IMAGE=$(echo &quot;$FULL_TARGET&quot; | tr '[:upper:]' '[:lower:]')

          # --- 执行命令 ---
          echo &quot;1️⃣ 正在从 DockerHub 拉取: $SRC_IMAGE&quot;
          docker pull $SRC_IMAGE

          echo &quot;2️⃣ 正在打标签: $TARGET_IMAGE&quot;
          docker tag $SRC_IMAGE $TARGET_IMAGE

          echo &quot;3️⃣ 正在推送到 GHCR...&quot;
          docker push $TARGET_IMAGE

          echo &quot;✅ 完成! 你的拉取地址是:&quot;
          echo &quot;docker pull $TARGET_IMAGE&quot;
</code></pre>
<h4>2. 如何使用</h4>
<ol>
<li>点击仓库顶部的 <strong>Actions</strong>。</li>
<li>左侧选择 <strong>“镜像搬运工”</strong>。</li>
<li>点击 <strong>Run workflow</strong>。</li>
<li>输入 <code>redis:7.0</code>，点击运行。</li>
<li>一分钟后，你的 GHCR 里就有了 <code>ghcr.io/你的用户名/redis:7.0</code>。</li>
</ol>
<h4>GitHub Packages 的上限是多少？（避坑必读）</h4>
<p>GitHub Packages 的计费策略分为 <strong>“公开包 (Public)”</strong> 和 <strong>“私有包 (Private)”</strong>，区别极其巨大。</p>
<p>存储空间 (Storage)</p>
<table>
<thead>
<tr>
<th><strong>类型</strong></th>
<th><strong>限制/额度</strong></th>
<th><strong>评价</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>公开包 (Public)</strong></td>
<td><strong>完全免费，无限制</strong></td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td><strong>私有包 (Private)</strong></td>
<td><strong>500 MB (免费版)</strong></td>
<td>❌ ****</td>
</tr>
<tr>
<td></td>
<td>2 GB (Pro 版)</td>
<td>勉强够用</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>警告</strong>：Docker 镜像通常很大。一个 <code>mysql:8.0</code> 大约 500MB，一个 <code>pytorch</code> 镜像可能 2GB+。</li>
<li><strong>后果</strong>：如果你把仓库设为私有，<strong>传 1-2 个镜像你的免费额度就爆了</strong>。一旦超额，GitHub Actions 可能会报错，或者要求你绑定信用卡扣费（$0.25 / GB / 月）。</li>
</ul>
<p>从 GitHub Packages 下载镜像所产生的流量（出站流量）：</p>
<table>
<thead>
<tr>
<th><strong>类型</strong></th>
<th><strong>限制/额度</strong></th>
<th><strong>评价</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>公开包 (Public)</strong></td>
<td><strong>完全免费，无限制</strong></td>
<td>⭐⭐⭐⭐⭐</td>
</tr>
<tr>
<td><strong>私有包 (Private)</strong></td>
<td><strong>1 GB / 月 (免费版)</strong></td>
<td>❌ ****</td>
</tr>
<tr>
<td></td>
<td>10 GB / 月 (Pro 版)</td>
<td>也不多</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>后果</strong>：如果你设为私有，然后在服务器上 <code>docker pull</code>，1GB 流量瞬间用完（拉两次 MySQL 就没了）。</li>
</ul>
<p>基于上述限制，如果你决定使用 GHCR，请务必“公开”</p>
<h3>注</h3>
<p>如果你的服务器在海外，GHCR 是最好用的（比 DockerHub 好用，因为 Actions 集成度高）。如果你的服务器在国内，GHCR 仅适合作为代码构建的产物存储，最终运行还是建议同步到阿里云 ACR。</p>
<h2>GitHub Actions+网盘</h2>
<p>这个方案是利用 GitHub Actions 的<strong>免费且高速的海外网络</strong>，帮你把 Docker Hub 的镜像下载下来，打包成文件，然后<strong>自动上传到你的网盘</strong>。</p>
<p>这样，你的国内服务器只需要从网盘（Alist 挂载）里读取文件即可，<strong>全程跑满国内带宽</strong>。</p>
<h2>Cloudflare中转</h2>
<p><strong>根据 Cloudflare 协议 中，2.2.1 第 (j) use the Services to provide a virtual private network or other similar proxy services.</strong></p>
<p><strong>使用本服务可能存在被 Cloudflare 封号的潜在风险，请自行斟酌使用风险。</strong></p>
<p><strong>如果你选择了“根据主机名选择对应的上游地址”方式部署，你可能会:</strong></p>
<p><strong>被 Netcraft 扫描到，收到警告邮件</strong></p>
<p><strong>被 Netcraft 同步到 Google Safe Browsing 标记为钓鱼网站</strong></p>
<p><strong>被 Netcraft 投诉到 Cloudflare 标记为钓鱼网站, 无法正常 pull 镜像</strong></p>
<p><strong>收到律师函</strong></p>
<hr>
<p>基于 Cloudflare Workers 的方案与之前的“阿里云存储”方案逻辑完全不同。</p>
<ul>
<li><strong>阿里云方案</strong>：是<strong>仓库（Storage）</strong>。你需要先把镜像“搬”进去，才能下载。</li>
<li><strong>Cloudflare 方案</strong>：是<strong>即时代理（Proxy）</strong>。它不需要搬运，你请求什么，它就帮你去 DockerHub 抓什么，然后转发给你。它是一个“梯子”。</li>
</ul>
<p>由于你已经有了自己的域名 <code>baidu.com</code>，这个方案实施起来非常快，<strong>5 分钟内</strong>即可完成。</p>
<p>我们采用目前社区维护最活跃、功能最全的开源项目：<a href="https://github.com/cmliu/CF-Workers-docker.io"><strong>cmliu/CF-Workers-docker.io</strong></a>。</p>
<h3>第一步：创建 Cloudflare Worker</h3>
<ol>
<li>登录 <a href="https://dash.cloudflare.com/">Cloudflare Dashboard</a>。</li>
<li>左侧菜单点击 <strong>Workers &amp; Pages</strong>。</li>
<li>点击 <strong>Create</strong> (创建应用) -&gt; <strong>Create Worker</strong> (创建 Worker)。</li>
<li>名字随便起，例如 <code>docker-proxy</code>，点击 <strong>Deploy</strong> (部署)。
<ul>
<li><em>此时你会得到一个 <em><code>_xxx.workers.dev_</code></em> 的地址，这个地址在国内是被墙的，先不管它。</em></li>
</ul>
</li>
</ol>
<h3>第二步：部署代理代码</h3>
<ol>
<li>进入刚才创建的 Worker，点击 <strong>Edit code</strong> (编辑代码)。</li>
<li><strong>删除</strong> 编辑器里原本自带的所有代码。</li>
<li>去 GitHub 复制大神写好的代码：
<ul>
<li>打开链接：<a href="https://www.google.com/search?q=https://raw.githubusercontent.com/cmliu/CF-Workers-docker.io/main/worker.js">worker.js 源码</a></li>
<li><strong>全选 (Ctrl+A) -&gt; 复制</strong>。</li>
</ul>
</li>
<li>回到 Cloudflare 编辑器，<strong>粘贴</strong>代码。</li>
<li>点击右上角的 <strong>Deploy</strong> 保存。</li>
</ol>
<h3>第三步：绑定你的域名 (关键！)</h3>
<p>因为 Cloudflare 自带的 <code>*.workers.dev</code> 域名在国内无法访问，必须绑定你自己的域名。</p>
<ol>
<li>回到 Worker 的详细页面，点击 <strong>Settings</strong> (设置) -&gt; <strong>Triggers</strong> (触发器)。</li>
<li>点击 <strong>Add Custom Domain</strong> (添加自定义域名)。</li>
<li>输入你想用的二级域名，例如：<code>docker.baidu.com</code>。
<ul>
<li><em>前提：你的域名 <em><code>baidu.com</code></em> 必须是托管在 Cloudflare 上的（DNS 解析在 CF）。如果不是，你需要先将域名的 DNS 服务器改为 Cloudflare。</em></li>
</ul>
</li>
<li>点击 <strong>Add Custom Domain</strong>。
<ul>
<li><em>等待几分钟，直到状态变为 Active (有效)。</em></li>
</ul>
</li>
</ol>
<h3>第四步：如何使用？</h3>
<p>现在，<code>docker.baidu.com</code> 就是你专属的 Docker Hub 加速器了。你有两种用法：</p>
<h4>用法 A：直接替换前缀 (临时用)</h4>
<p>原本你要拉取 <code>nginx</code>：</p>
<pre><code class="language-plain">docker pull nginx:latest
</code></pre>
<p>现在改成：</p>
<pre><code class="language-plain">docker pull docker.baidu.com/library/nginx:latest
</code></pre>
<p><em>(注意：官方镜像如 nginx, mysql 需要加 <em><code>_/library/_</code></em> 前缀，或者代码里有自动补全逻辑)</em></p>
<h4>用法 B：配置镜像加速器 (推荐，永久生效)</h4>
<p>这样配置后，你不需要改任何命令，直接 <code>docker pull nginx</code> 就会自动走你的 CF 代理。</p>
<ol>
<li>修改 Docker 配置：</li>
</ol>
<p>编辑服务器上的 /etc/docker/daemon.json 文件（如果没有就新建）：</p>
<pre><code class="language-plain">{
  &quot;registry-mirrors&quot;: [
    &quot;https://docker.baidu.com&quot;
  ]
}
</code></pre>
<ol start="2">
<li><strong>重启 Docker</strong>：</li>
</ol>
<pre><code class="language-plain">sudo systemctl daemon-reload
sudo systemctl restart docker
</code></pre>
<ol start="3">
<li>验证：</li>
</ol>
<p>输入 docker info，看输出信息的最后几行，如果有 Registry Mirrors 并且显示了你的域名，说明成功了。</p>
<h3>进阶优化：防止被滥用 (可选)</h3>
<p>既然你的域名是公开的，别人也能用你的流量。虽然 Cloudflare 每天有 10 万次免费请求，但为了安全，建议加个密码。</p>
<ol>
<li>回到 Cloudflare Worker 的代码编辑页面。</li>
<li>在代码的最开头（通常在前几行），找到 <code>const TOKEN = '';</code> 这种变量定义（不同版本的代码位置可能不同，cmliu 的代码通常支持环境变量）。</li>
<li><strong>推荐做法</strong>：使用环境变量配置。
<ul>
<li>Worker 页面 -&gt; <strong>Settings</strong> -&gt; <strong>Variables</strong>.</li>
<li>添加变量：
<ul>
<li><code>TOKEN</code>: 设置一个密码，例如 <code>mypassword123</code>.</li>
</ul>
</li>
<li>保存并部署。</li>
</ul>
</li>
</ol>
<p>设置了密码后怎么用？</p>
<p>你就不能用“用法 B”了，必须用 docker login：</p>
<pre><code class="language-plain">docker login docker.baidu.com
# 用户名：随便填 (例如 admin)
# 密码：填刚才设置的 TOKEN (mypassword123)
</code></pre>
<p>登录后，再 <code>docker pull docker.baidu.com/library/nginx</code>。</p>
<h2>Github Actions双重同步到阿里云与Github Packages</h2>
<p>先搭建好github packages和阿里云ACR的actions在一个仓库中</p>
<p>在同一仓库中（也可以在任意仓库中）新建一个 <code>.github/workflows/sync-double.yml</code></p>
<pre><code class="language-plain">name: 双重同步 (阿里云 + GHCR)

on:
  workflow_dispatch:
    inputs:
      image_name:
        description: '原镜像名称 (如: mysql:8.0)'
        required: true
        default: 'nginx:alpine'

env:
  # 阿里云配置
  ALIYUN_REGISTRY: ${{ secrets.ALIYUN_REGISTRY }}
  ALIYUN_NAMESPACE: ${{ secrets.ALIYUN_NAMESPACE }}
  # GHCR 配置
  GHCR_REGISTRY: ghcr.io

jobs:
  double-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write # 必须赋予写 GHCR 的权限

    steps:
      - name: 1. 登录阿里云
        uses: docker/login-action@v2
        with:
          registry: ${{ env.ALIYUN_REGISTRY }}
          username: ${{ secrets.ALIYUN_USERNAME }}
          password: ${{ secrets.ALIYUN_PASSWORD }}

      - name: 2. 登录 GHCR
        uses: docker/login-action@v2
        with:
          registry: ${{ env.GHCR_REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: 3. 拉取原镜像
        run: |
          docker pull ${{ inputs.image_name }}

      - name: 4. 推送到 阿里云
        run: |
          # 提取镜像名和标签 (例如 mysql:8.0)
          IMAGE_TAG=$(echo &quot;${{ inputs.image_name }}&quot; | awk -F'/' '{print $NF}')
          
          # 组合地址
          ALI_TARGET=&quot;$ALIYUN_REGISTRY/$ALIYUN_NAMESPACE/$IMAGE_TAG&quot;
          
          echo &quot;🚀 推送至阿里云: $ALI_TARGET&quot;
          docker tag ${{ inputs.image_name }} $ALI_TARGET
          docker push $ALI_TARGET

      - name: 5. 推送到 GHCR
        run: |
          IMAGE_TAG=$(echo &quot;${{ inputs.image_name }}&quot; | awk -F'/' '{print $NF}')
          
          # 关键步骤：GitHub 用户名转小写 (GHCR 强制要求)
          OWNER=$(echo &quot;${{ github.repository_owner }}&quot; | tr '[:upper:]' '[:lower:]')
          
          # 组合地址
          GHCR_TARGET=&quot;$GHCR_REGISTRY/$OWNER/$IMAGE_TAG&quot;
          
          echo &quot;🚀 推送至 GHCR: $GHCR_TARGET&quot;
          docker tag ${{ inputs.image_name }} $GHCR_TARGET
          docker push $GHCR_TARGET

      - name: 6. 总结
        run: |
          echo &quot;✅ 同步完成！&quot;
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>iptables</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/%E9%98%B2%E7%81%AB%E5%A2%99/iptables</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/%E9%98%B2%E7%81%AB%E5%A2%99/iptables</guid>
    <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
    <description>这份教程针对 Debian/Ubuntu 系 VPS（最常见的服务器系统） 一、 新机开荒：30秒一键初始化 在一台全新的 VPS 上，按顺序执行以下命令，即可完成“安装 + 基础配置 + 持久化”。 1. 安装持久化工具 2. 一键注入“安全模板” 警告：如果你修改了 SSH 端口（不是 22），请修改下方第 5 行的 22。 直接复制整段粘贴进终端：</description>
      <content:encoded><![CDATA[<p>这份教程针对 <strong>Debian/Ubuntu</strong> 系 VPS（最常见的服务器系统）</p>
<h3>一、 新机开荒：30秒一键初始化</h3>
<p>在一台全新的 VPS 上，按顺序执行以下命令，即可完成“安装 + 基础配置 + 持久化”。</p>
<h4>1. 安装持久化工具</h4>
<pre><code class="language-plain">sudo apt update
# 安装过程中遇到问询弹窗，一路选 &lt;Yes&gt;
sudo apt install iptables-persistent -y
</code></pre>
<h4>2. 一键注入“安全模板”</h4>
<p><strong><u>警告：如果你修改了 SSH 端口（不是 22），请修改下方第 5 行的 22。</u></strong></p>
<p>直接复制整段粘贴进终端：</p>
<pre><code class="language-plain"># 1. 清空现有规则（防止冲突）
iptables -F
iptables -X

# 2. 【核心】允许已建立的连接（防止断连）
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 3. 【核心】允许 SSH (如果是 1228 端口请自行修改)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 4. 允许基础服务 (HTTP/HTTPS/Ping/Loopback)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# 5. 【核心】封锁大门 (默认拒绝)
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# 6. 保存规则
netfilter-persistent save
</code></pre>
<hr>
<h3>二、 指令速查字典 (Cheat Sheet)</h3>
<h4>1. 查看规则 (Query)</h4>
<p>最常用的两条，死记硬背：</p>
<p>Bash</p>
<pre><code class="language-plain"># 简洁版：看有什么端口开了
iptables -nvL

# 运维版：显示行号 (删除、插入规则时必须用)
iptables -nvL --line-numbers
</code></pre>
<h4>2. 放行端口 (Allow)</h4>
<p><strong>注意</strong>：<code>-A</code> 表示追加到最后。如果你的默认策略是 DROP，追加是没问题的。</p>
<p>Bash</p>
<pre><code class="language-plain"># 放行 TCP 端口 (如 8080)
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

# 放行 UDP 端口 (如 EasyTier/WireGuard)
iptables -A INPUT -p udp --dport 10110 -j ACCEPT

# 放行特定 IP 访问特定端口 (只允许 IP 1.2.3.4 连 SSH)
iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT
</code></pre>
<h4>3. 删除规则 (Delete)</h4>
<p>必须先用 <code>iptables -nvL --line-numbers</code> 查出行号。</p>
<p>Bash</p>
<pre><code class="language-plain"># 删除 INPUT 链的第 5 行
iptables -D INPUT 5
</code></pre>
<h4>4. 插入规则 (Insert)</h4>
<p><strong>场景</strong>：当你需要把规则放到最前面（优先级最高），或者 Fail2ban 没有自动把链插到最前面时。</p>
<p>Bash</p>
<pre><code class="language-plain"># 插队到第 1 行
iptables -I INPUT 1 -p tcp --dport 9000 -j ACCEPT
</code></pre>
<h4>5. 保存与重载 (Persistence)</h4>
<p><code>iptables</code> 重启即失效，修改后<strong>必须</strong>保存。</p>
<p>Bash</p>
<pre><code class="language-plain"># 保存当前规则到硬盘
netfilter-persistent save

# 从硬盘重新加载规则 (撤销刚才未保存的修改)
netfilter-persistent reload
</code></pre>
<hr>
<h3>三、 救命锦囊：被自己锁外面了怎么办？</h3>
<p>如果你不小心执行了 <code>iptables -P INPUT DROP</code> 但没放行 SSH，连接断开。</p>
<p><strong>解决方法：</strong></p>
<ol>
<li>去云服务商（阿里云/腾讯云/AWS）的网页控制台，找到 <strong>VNC 控制台</strong> (Web 终端)。</li>
<li>登录进去（VNC 不走网络协议，不受 iptables 影响）。</li>
<li>执行急救命令，清空防火墙：</li>
</ol>
<p>Bash</p>
<pre><code class="language-plain"># 把默认策略改回 ACCEPT
iptables -P INPUT ACCEPT
# 清空所有规则
iptables -F
# 保存
netfilter-persistent save
</code></pre>
<h3>四、 常用场景模板</h3>
<ul>
<li><strong>Docker 场景</strong>：Docker 会自己接管 <code>iptables</code>，不要轻易执行 <code>iptables -F</code>（会把 Docker 的网断掉）。如果非要重置，建议重启 Docker 服务。</li>
<li><strong>多端口放行</strong>：</li>
</ul>
<p>Bash</p>
<pre><code class="language-plain">iptables -A INPUT -p tcp -m multiport --dports 21,22,80,443 -j ACCEPT
</code></pre>
<ul>
<li><strong>屏蔽恶意 IP</strong>：</li>
</ul>
<p>Bash</p>
<pre><code class="language-plain">iptables -I INPUT 1 -s 123.123.123.123 -j DROP
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>UFW指令大全</title>
      <link>https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F%E7%BA%A7%E5%BA%94%E7%94%A8/001ufw</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F%E7%BA%A7%E5%BA%94%E7%94%A8/001ufw</guid>
    <pubDate>Tue, 02 Dec 2025 17:30:00 GMT</pubDate>
    <description>1. UFW 常用指令 高频精简版 | 指令 | 描述 | 常用示例 | | :</description>
      <content:encoded><![CDATA[<h1>UFW (Uncomplicated Firewall) 指令大全</h1>
<h2>1. UFW 常用指令 (高频精简版)</h2>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">描述</th>
<th style="text-align:left">常用示例</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>ufw enable</strong></td>
<td style="text-align:left">启用防火墙 (开机自启)</td>
<td style="text-align:left"><code>sudo ufw enable</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw disable</strong></td>
<td style="text-align:left">禁用防火墙</td>
<td style="text-align:left"><code>sudo ufw disable</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw status</strong></td>
<td style="text-align:left">查看状态及规则</td>
<td style="text-align:left"><code>sudo ufw status</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw reload</strong></td>
<td style="text-align:left">重载配置 (不中断连接)</td>
<td style="text-align:left"><code>sudo ufw reload</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw allow</strong></td>
<td style="text-align:left">允许外部访问端口</td>
<td style="text-align:left"><code>sudo ufw allow 22/tcp</code> (开放 SSH)</td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw deny</strong></td>
<td style="text-align:left">拒绝外部访问端口</td>
<td style="text-align:left"><code>sudo ufw deny 80</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw delete</strong></td>
<td style="text-align:left">删除某条规则</td>
<td style="text-align:left"><code>sudo ufw delete allow 22</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw reset</strong></td>
<td style="text-align:left">重置所有规则至默认</td>
<td style="text-align:left"><code>sudo ufw reset</code> (慎用，需重新配置)</td>
</tr>
</tbody>
</table>
<hr>
<h2>2. UFW 全面指令 (分类速查)</h2>
<h3>2.1 基础控制与状态 (Basic Control)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ufw enable</code></td>
<td style="text-align:left">开启防火墙 (默认策略：拒绝入站，允许出站)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw disable</code></td>
<td style="text-align:left">关闭防火墙</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw reload</code></td>
<td style="text-align:left">重新加载配置文件</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw reset</code></td>
<td style="text-align:left">重置防火墙配置为默认状态 (会清空所有自定义规则)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw status</code></td>
<td style="text-align:left">显示防火墙状态和当前激活的规则</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw status verbose</code></td>
<td style="text-align:left">显示详细状态 (包括默认策略、日志级别)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw status numbered</code></td>
<td style="text-align:left">显示带编号的规则列表 (常用于删除指定规则)</td>
</tr>
</tbody>
</table>
<h3>2.2 端口与协议规则 (Ports &amp; Protocols)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ufw allow &lt;port&gt;</code></td>
<td style="text-align:left">允许访问指定端口 (TCP/UDP)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow &lt;port&gt;/tcp</code></td>
<td style="text-align:left">仅允许 TCP 协议访问指定端口</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow &lt;port&gt;/udp</code></td>
<td style="text-align:left">仅允许 UDP 协议访问指定端口</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw deny &lt;port&gt;</code></td>
<td style="text-align:left">拒绝访问指定端口</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw reject &lt;port&gt;</code></td>
<td style="text-align:left">拒绝访问并返回“不可达”消息 (比 deny 更明确)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow &lt;start&gt;:&lt;end&gt;/tcp</code></td>
<td style="text-align:left">允许一个端口范围 (如 <code>ufw allow 8000:8010/tcp</code>)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow &lt;service&gt;</code></td>
<td style="text-align:left">允许常见服务名 (如 <code>ufw allow ssh</code>, <code>ufw allow http</code>)</td>
</tr>
</tbody>
</table>
<h3>2.3 IP地址与高级规则 (IP &amp; Advanced)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ufw allow from &lt;ip&gt;</code></td>
<td style="text-align:left">允许特定 IP 访问所有端口</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw deny from &lt;ip&gt;</code></td>
<td style="text-align:left">封锁特定 IP</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow from &lt;subnet&gt;</code></td>
<td style="text-align:left">允许特定子网 (如 <code>192.168.1.0/24</code>)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow from &lt;ip&gt; to any port &lt;port&gt;</code></td>
<td style="text-align:left">允许特定 IP 访问特定端口 (最常用安全策略)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw deny from &lt;ip&gt; to any port &lt;port&gt;</code></td>
<td style="text-align:left">禁止特定 IP 访问特定端口</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow in on &lt;dev&gt;</code></td>
<td style="text-align:left">允许特定网卡接口入站 (如 <code>ufw allow in on eth0</code>)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow out on &lt;dev&gt;</code></td>
<td style="text-align:left">允许特定网卡接口出站</td>
</tr>
</tbody>
</table>
<h3>2.4 规则管理与删除 (Management &amp; Deletion)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ufw delete allow &lt;port&gt;</code></td>
<td style="text-align:left">删除对应的允许规则 (需完整匹配原命令)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw delete &lt;number&gt;</code></td>
<td style="text-align:left">根据编号删除规则 (先用 <code>ufw status numbered</code> 查看)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw insert &lt;num&gt; &lt;rule&gt;</code></td>
<td style="text-align:left">在指定位置插入规则 (如 <code>ufw insert 1 allow 80</code>)</td>
</tr>
</tbody>
</table>
<h3>2.5 默认策略与日志 (Default Policy &amp; Logging)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ufw default deny incoming</code></td>
<td style="text-align:left">设置默认入站策略为“拒绝” (推荐)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw default allow incoming</code></td>
<td style="text-align:left">设置默认入站策略为“允许” (不安全)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw default allow outgoing</code></td>
<td style="text-align:left">设置默认出站策略为“允许”</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw default deny outgoing</code></td>
<td style="text-align:left">设置默认出站策略为“拒绝” (高安保环境)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw logging on</code></td>
<td style="text-align:left">开启日志记录</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw logging off</code></td>
<td style="text-align:left">关闭日志记录</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw logging low/medium/high</code></td>
<td style="text-align:left">设置日志详细级别</td>
</tr>
</tbody>
</table>
<h3>2.6 应用配置文件 (App Profiles)</h3>
<p>UFW 可以读取 <code>/etc/ufw/applications.d</code> 中的预设配置。</p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ufw app list</code></td>
<td style="text-align:left">列出所有已知的应用配置</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw app info &lt;name&gt;</code></td>
<td style="text-align:left">查看指定应用的端口配置详情</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw app update &lt;name&gt;</code></td>
<td style="text-align:left">更新应用配置</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow &lt;name&gt;</code></td>
<td style="text-align:left">允许该应用的所有预设端口 (如 <code>ufw allow 'Nginx Full'</code>)</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>iptables 指令大全</title>
      <link>https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F%E7%BA%A7%E5%BA%94%E7%94%A8/002iptables</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F%E7%BA%A7%E5%BA%94%E7%94%A8/002iptables</guid>
    <pubDate>Tue, 02 Dec 2025 17:30:00 GMT</pubDate>
    <description>1. 常用核心指令 高频精简版 | 指令/参数 | 语法结构 | 描述 | | :</description>
      <content:encoded><![CDATA[<h1>iptables 指令大全</h1>
<h2>1. 常用核心指令 (高频精简版)</h2>
<table>
<thead>
<tr>
<th style="text-align:left">指令/参数</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>-L (List)</strong></td>
<td style="text-align:left"><code>iptables -L -n -v</code></td>
<td style="text-align:left">查看所有规则 (数字格式/详细)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-F (Flush)</strong></td>
<td style="text-align:left"><code>iptables -F</code></td>
<td style="text-align:left">清空当前表的所有规则</td>
</tr>
<tr>
<td style="text-align:left"><strong>-A (Append)</strong></td>
<td style="text-align:left"><code>iptables -A INPUT -s &lt;IP&gt; -j DROP</code></td>
<td style="text-align:left">在链末尾追加规则 (如封禁IP)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-I (Insert)</strong></td>
<td style="text-align:left"><code>iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT</code></td>
<td style="text-align:left">在链首(或指定位置)插入规则</td>
</tr>
<tr>
<td style="text-align:left"><strong>-D (Delete)</strong></td>
<td style="text-align:left"><code>iptables -D INPUT &lt;编号&gt;</code></td>
<td style="text-align:left">删除指定编号的规则</td>
</tr>
<tr>
<td style="text-align:left"><strong>-P (Policy)</strong></td>
<td style="text-align:left"><code>iptables -P INPUT DROP</code></td>
<td style="text-align:left">设置默认策略 (如默认拒绝所有入站)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-s (Source)</strong></td>
<td style="text-align:left"><code>iptables -A INPUT -s 192.168.1.100 -j ACCEPT</code></td>
<td style="text-align:left">匹配源 IP 地址</td>
</tr>
<tr>
<td style="text-align:left"><strong>--dport</strong></td>
<td style="text-align:left"><code>iptables -A INPUT -p tcp --dport 22 -j ACCEPT</code></td>
<td style="text-align:left">匹配目标端口 (需配合 -p)</td>
</tr>
<tr>
<td style="text-align:left"><strong>save</strong></td>
<td style="text-align:left"><code>iptables-save &gt; /etc/iptables.rules</code></td>
<td style="text-align:left">导出/保存当前规则</td>
</tr>
<tr>
<td style="text-align:left"><strong>restore</strong></td>
<td style="text-align:left"><code>iptables-restore &lt; /etc/iptables.rules</code></td>
<td style="text-align:left">导入/恢复规则</td>
</tr>
</tbody>
</table>
<hr>
<h2>2. iptables 全面指令 (分类速查)</h2>
<h3>2.1 链与表管理 (Chains &amp; Tables)</h3>
<p><em>管理 Filter(默认), NAT, Mangle 等表及链的操作。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令/参数</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>-t</strong></td>
<td style="text-align:left"><code>iptables -t nat -L</code></td>
<td style="text-align:left">指定操作的表 (filter/nat/mangle/raw)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-L</strong></td>
<td style="text-align:left"><code>iptables -L [链名] [选项]</code></td>
<td style="text-align:left">列出规则 (常用参数 -n -v --line-numbers)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-F</strong></td>
<td style="text-align:left"><code>iptables -F [链名]</code></td>
<td style="text-align:left">清空规则 (Flush)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-Z</strong></td>
<td style="text-align:left"><code>iptables -Z [链名]</code></td>
<td style="text-align:left">计数器归零 (Zero)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-N</strong></td>
<td style="text-align:left"><code>iptables -N &lt;新链名&gt;</code></td>
<td style="text-align:left">新建自定义链</td>
</tr>
<tr>
<td style="text-align:left"><strong>-X</strong></td>
<td style="text-align:left"><code>iptables -X [链名]</code></td>
<td style="text-align:left">删除自定义链 (链必须为空)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-E</strong></td>
<td style="text-align:left"><code>iptables -E &lt;旧名&gt; &lt;新名&gt;</code></td>
<td style="text-align:left">重命名自定义链</td>
</tr>
<tr>
<td style="text-align:left"><strong>-P</strong></td>
<td style="text-align:left"><code>iptables -P &lt;链名&gt; &lt;动作&gt;</code></td>
<td style="text-align:left">设置链的默认策略 (ACCEPT/DROP)</td>
</tr>
</tbody>
</table>
<h3>2.2 规则操作 (Rule Management)</h3>
<p><em>针对具体规则的增删改。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令/参数</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>-A</strong></td>
<td style="text-align:left"><code>iptables -A &lt;链名&gt; &lt;规则&gt;</code></td>
<td style="text-align:left">追加规则到链尾 (Append)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-I</strong></td>
<td style="text-align:left"><code>iptables -I &lt;链名&gt; [编号] &lt;规则&gt;</code></td>
<td style="text-align:left">插入规则 (默认插到第一行)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-D</strong></td>
<td style="text-align:left"><code>iptables -D &lt;链名&gt; &lt;编号/规则&gt;</code></td>
<td style="text-align:left">删除规则 (按编号或匹配内容)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-R</strong></td>
<td style="text-align:left"><code>iptables -R &lt;链名&gt; &lt;编号&gt; &lt;新规则&gt;</code></td>
<td style="text-align:left">替换/修改指定行号的规则</td>
</tr>
<tr>
<td style="text-align:left"><strong>-C</strong></td>
<td style="text-align:left"><code>iptables -C &lt;链名&gt; &lt;规则&gt;</code></td>
<td style="text-align:left">检查规则是否存在 (Check)</td>
</tr>
</tbody>
</table>
<h3>2.3 匹配条件 (Matching Specs)</h3>
<p><em>定义什么样的流量会被捕获。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令/参数</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>-p</strong></td>
<td style="text-align:left"><code>iptables -A INPUT -p tcp</code></td>
<td style="text-align:left">匹配协议 (tcp/udp/icmp/all)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-s</strong></td>
<td style="text-align:left"><code>iptables -A INPUT -s 192.168.1.0/24</code></td>
<td style="text-align:left">匹配源 IP 或网段 (Source)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-d</strong></td>
<td style="text-align:left"><code>iptables -A OUTPUT -d 8.8.8.8</code></td>
<td style="text-align:left">匹配目标 IP 或网段 (Destination)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-i</strong></td>
<td style="text-align:left"><code>iptables -A INPUT -i eth0</code></td>
<td style="text-align:left">匹配入站网卡接口 (Input Interface)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-o</strong></td>
<td style="text-align:left"><code>iptables -A OUTPUT -o eth0</code></td>
<td style="text-align:left">匹配出站网卡接口 (Output Interface)</td>
</tr>
<tr>
<td style="text-align:left"><strong>--sport</strong></td>
<td style="text-align:left"><code>... -p tcp --sport 22</code></td>
<td style="text-align:left">匹配源端口 (Source Port)</td>
</tr>
<tr>
<td style="text-align:left"><strong>--dport</strong></td>
<td style="text-align:left"><code>... -p tcp --dport 80</code></td>
<td style="text-align:left">匹配目标端口 (Destination Port)</td>
</tr>
<tr>
<td style="text-align:left"><strong>--icmp-type</strong></td>
<td style="text-align:left"><code>... -p icmp --icmp-type 8</code></td>
<td style="text-align:left">匹配 ICMP 类型 (如 8 为 ping 请求)</td>
</tr>
</tbody>
</table>
<h3>2.4 高级模块匹配 (Modules)</h3>
<p><em>使用 <code>-m</code> 调用扩展模块进行复杂匹配。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令/参数</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>-m state</strong></td>
<td style="text-align:left"><code>... -m state --state ESTABLISHED,RELATED</code></td>
<td style="text-align:left">匹配连接状态 (常用：允许已建立的连接)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-m multiport</strong></td>
<td style="text-align:left"><code>... -m multiport --dports 80,443,22</code></td>
<td style="text-align:left">匹配多个不连续端口</td>
</tr>
<tr>
<td style="text-align:left"><strong>-m mac</strong></td>
<td style="text-align:left"><code>... -m mac --mac-source &lt;MAC地址&gt;</code></td>
<td style="text-align:left">匹配源 MAC 地址</td>
</tr>
<tr>
<td style="text-align:left"><strong>-m limit</strong></td>
<td style="text-align:left"><code>... -m limit --limit 5/min</code></td>
<td style="text-align:left">速率限制 (防 DDoS 常用)</td>
</tr>
<tr>
<td style="text-align:left"><strong>-m string</strong></td>
<td style="text-align:left"><code>... -m string --algo bm --string &quot;test&quot;</code></td>
<td style="text-align:left">匹配数据包中的字符串</td>
</tr>
<tr>
<td style="text-align:left"><strong>-m time</strong></td>
<td style="text-align:left"><code>... -m time --timestart 08:00 --timestop 18:00</code></td>
<td style="text-align:left">按时间段匹配</td>
</tr>
<tr>
<td style="text-align:left"><strong>-m iprange</strong></td>
<td style="text-align:left"><code>... -m iprange --src-range 192.168.1.5-192.168.1.10</code></td>
<td style="text-align:left">匹配 IP 地址范围</td>
</tr>
</tbody>
</table>
<h3>2.5 动作与目标 (Targets -j)</h3>
<p><em>匹配到流量后执行的动作。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令/参数</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>ACCEPT</strong></td>
<td style="text-align:left"><code>-j ACCEPT</code></td>
<td style="text-align:left">允许数据包通过</td>
</tr>
<tr>
<td style="text-align:left"><strong>DROP</strong></td>
<td style="text-align:left"><code>-j DROP</code></td>
<td style="text-align:left">直接丢弃数据包 (不回传任何信息)</td>
</tr>
<tr>
<td style="text-align:left"><strong>REJECT</strong></td>
<td style="text-align:left"><code>-j REJECT</code></td>
<td style="text-align:left">拒绝并回传 ICMP 错误信息</td>
</tr>
<tr>
<td style="text-align:left"><strong>LOG</strong></td>
<td style="text-align:left"><code>-j LOG --log-prefix &quot;IPTABLES: &quot;</code></td>
<td style="text-align:left">记录日志到 syslog (不中断处理)</td>
</tr>
<tr>
<td style="text-align:left"><strong>SNAT</strong></td>
<td style="text-align:left"><code>-t nat ... -j SNAT --to-source &lt;IP&gt;</code></td>
<td style="text-align:left">源地址转换 (用于静态 IP 网关)</td>
</tr>
<tr>
<td style="text-align:left"><strong>DNAT</strong></td>
<td style="text-align:left"><code>-t nat ... -j DNAT --to-destination &lt;IP:Port&gt;</code></td>
<td style="text-align:left">目标地址转换 (端口转发)</td>
</tr>
<tr>
<td style="text-align:left"><strong>MASQUERADE</strong></td>
<td style="text-align:left"><code>-t nat ... -j MASQUERADE</code></td>
<td style="text-align:left">动态源地址伪装 (用于动态 IP 网关)</td>
</tr>
<tr>
<td style="text-align:left"><strong>REDIRECT</strong></td>
<td style="text-align:left"><code>-t nat ... -j REDIRECT --to-port &lt;端口&gt;</code></td>
<td style="text-align:left">本机端口重定向 (透明代理常用)</td>
</tr>
</tbody>
</table>
<h3>2.6 持久化与保存 (Persistence)</h3>
<p><em>iptables 规则重启后默认清空，需手动保存。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>iptables-save</strong></td>
<td style="text-align:left"><code>iptables-save &gt; /etc/iptables.v4</code></td>
<td style="text-align:left">将当前运行规则输出到文件</td>
</tr>
<tr>
<td style="text-align:left"><strong>iptables-restore</strong></td>
<td style="text-align:left"><code>iptables-restore &lt; /etc/iptables.v4</code></td>
<td style="text-align:left">从文件恢复规则</td>
</tr>
<tr>
<td style="text-align:left"><strong>netfilter-persistent</strong></td>
<td style="text-align:left"><code>netfilter-persistent save</code></td>
<td style="text-align:left">(Debian/Ubuntu) 保存当前规则 (需安装包)</td>
</tr>
<tr>
<td style="text-align:left"><strong>service iptables</strong></td>
<td style="text-align:left"><code>service iptables save</code></td>
<td style="text-align:left">(CentOS 6/Old RHEL) 保存规则</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>3-2-1 备份法</title>
      <link>https://develata.me/knowledge/sharing/%E6%8C%87%E5%8D%97/3-2-1%20%E5%A4%87%E4%BB%BD%E6%B3%95</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/%E6%8C%87%E5%8D%97/3-2-1%20%E5%A4%87%E4%BB%BD%E6%B3%95</guid>
    <pubDate>Sat, 29 Nov 2025 22:23:00 GMT</pubDate>
    <description>数据备份领域公认的黄金法则</description>
      <content:encoded><![CDATA[<p>“3-2-1 备份法”是数据备份领域公认的黄金法则。</p>
<h4>3-2-1 备份法具体是指：</h4>
<p>3：存储 3 份完整的数据</p>
<p>2：使用 2 种不同的存储介质</p>
<p>1：至少 1 份异地备份（Off-site）</p>
<h4>3：存储 3 份完整的数据</h4>
<p>你的数据至少要有三个副本。</p>
<p>第 1 份： 原件（比如你正在修改的论文文档，存在你电脑硬盘里）。</p>
<p>第 2 份： 备份 A。</p>
<p>第 3 份： 备份 B。</p>
<p>为什么要 3 份？ 如果只有 1 份备份，万一你要恢复数据的时候发现备份文件损坏了（这种情况比你想象的更常见），你就彻底完蛋了。3 份能将这种概率降到极低。</p>
<h4>2：使用 2 种不同的存储介质</h4>
<p>这 3 份数据，不能全都在同一个地方，至少要横跨两种不同的设备或媒介。</p>
<p>错误示范： 原件在电脑 C 盘，备份在电脑 D 盘。</p>
<p>风险： 电脑主板烧了、电源短路、或者被偷了，两份数据同时完蛋。</p>
<p>正确示范：</p>
<p>介质 1：电脑硬盘（原件）。</p>
<p>介质 2：移动硬盘 / U盘 / NAS / 光盘（备份）。</p>
<p>为什么要不同介质？ 主要是为了防范硬件故障。不同设备的寿命和故障模式是不一样的。</p>
<h4>1：至少 1 份异地备份（Off-site）</h4>
<p>这 3 份数据中，至少要有 1 份是不放在你身边的（物理位置隔离）。</p>
<p>什么是异地： 云端（网盘）、位于另一个城市的服务器、或者哪怕是你放在办公室抽屉里的硬盘（如果你电脑在宿舍）。</p>
<p>错误示范： 电脑和移动硬盘都放在同一个背包里。</p>
<p>风险： 背包丢了，或者宿舍发生火灾/水灾，所有数据物理毁灭。</p>
<p>为什么要异地？ 这是为了防范物理灾难（火灾、盗窃、洪水）以及勒索病毒（如果所有硬盘都插在电脑上，病毒会把它们一起加密，但云端通常有历史版本回滚功能）。</p>
]]></content:encoded>
    </item>
    <item>
      <title>新服务器必做</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E6%96%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BF%85%E5%81%9A</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E6%96%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BF%85%E5%81%9A</guid>
    <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
    <description>debian,ubuntu 一、更新组件，包管理 要在Ubuntu系统上更新软件包，可以使用以下命令： 不推荐，安装时间太长了 推荐用下面两条 二、常用工具 1、VIM编辑器【不需要可以装nano 不如nano 】 检查有没有安装VIM（Ubuntu是默认自带nano的） 没有的话就用命令安装 配置VIM为默认的系统编辑器。 很简单，执行这条命令，选择 Vim，以后凡是自动调用编辑器的地方，都会用 Vim 啦。 2、安装 command-not-found【不需要可以不装】 </description>
      <content:encoded><![CDATA[<p>debian,ubuntu</p>
<h3>一、更新组件，包管理</h3>
<p>要在Ubuntu系统上更新软件包，可以使用以下命令：</p>
<p>不推荐，安装时间太长了</p>
<pre><code class="language-plain">sudo apt update &amp;&amp; sudo apt upgrade -y 
</code></pre>
<p>推荐用下面两条</p>
<pre><code class="language-plain">sudo apt update  #这个命令会更新软件包列表，让系统知道有哪些软件包可以更新。
sudo apt upgrade --only-upgrade #这个命令会安装所有可用的软件包更新。
</code></pre>
<h3>二、常用工具</h3>
<h4>1、VIM编辑器【不需要可以装nano(不如nano)】</h4>
<p>检查有没有安装VIM（Ubuntu是默认自带nano的）</p>
<pre><code class="language-plain">vim --version
</code></pre>
<p>没有的话就用命令安装</p>
<pre><code class="language-plain">apt install vim 
</code></pre>
<p>配置VIM为默认的系统编辑器。<br>
很简单，执行这条命令，选择 Vim，以后凡是自动调用编辑器的地方，都会用 Vim 啦。</p>
<pre><code class="language-plain">sudo update-alternatives --config editor
</code></pre>
<h3>2、安装 command-not-found【不需要可以不装】</h3>
<p>很多服务器提供商可能会提供精简版本的 Ubuntu，于是一些实用的命令行工具并不会预装。比如command-not-found，它可以当你在打命令时，提示对应的但没有安装的 package。</p>
<pre><code class="language-plain">sudo apt install command-not-found
</code></pre>
<p>安装完后，就可以在使用命令行的过程中更加方便了。</p>
<h3>三、添加普通用户</h3>
<p>如果本身就不是root就不用</p>
<h4>1、添加普通用户</h4>
<p>使用<code>adduser</code>创建用户，命令如下：</p>
<pre><code class="language-plain">adduser newuser
</code></pre>
<p><code>newuser</code>为要创建的账号名，修改为自己想要的用户名。</p>
<p>期间需要输入两次密码。第一次用于设置密码，第二次用于确认密码。</p>
<p>注意，输入密码时，看不见输入的字符。输入后回车即可。</p>
<p>设置密码后，需要设置账户信息，这里可以采用默认，全部回车，最后输入<code>y</code>确认即可：</p>
<p>添加用户后，默认会在<code>/home</code>路径下创建一个与用户名相同的用户目录。</p>
<h4>2、给新用户添加管理权限</h4>
<p>如果希望新创建的用户具有管理权限，将用户添加到<code>sudo</code>组即可！</p>
<p>将新用户添加到 <code>sudo</code> 组，命令如：</p>
<pre><code class="language-plain">adduser newuser sudo
</code></pre>
<h4>3、账号切换</h4>
<p>由<code>root</code>账号切换到普通账号：</p>
<pre><code class="language-plain">sudo su newuser
</code></pre>
<p>由普通账号切换到<code>root</code>账号：</p>
<pre><code class="language-plain">sudo -i
</code></pre>
<p>注意：切换到<code>root</code>账号时，需要输入当前账号的密码。</p>
<h3>四、防火墙配置</h3>
<p>如果自带防火墙就不用</p>
<h4>安装ufw：</h4>
<p>要在 Ubuntu 上使用 ufw（Uncomplicated Firewall）开启端口 22、80 和 443，你可以按照以下步骤进行配置：</p>
<p>检查 ufw 是否安装：</p>
<p>如果尚未安装 ufw，你可以使用以下命令安装：</p>
<pre><code class="language-plain">sudo apt install ufw
</code></pre>
<h4>开启端口：</h4>
<p>开启端口 22：SSH</p>
<pre><code class="language-plain">sudo ufw allow 22
</code></pre>
<p>开启端口 80：http</p>
<pre><code class="language-plain">sudo ufw allow 80
</code></pre>
<p>开启端口 443：HTTPS</p>
<pre><code class="language-plain">sudo ufw allow 443
</code></pre>
<p>常用端口</p>
<table>
<thead>
<tr>
<th style="text-align:left">21(Ftp)</th>
<th style="text-align:left">22(Ssh)</th>
<th style="text-align:left">23(Telnet)</th>
<th style="text-align:left">25(Smtp)</th>
<th style="text-align:left">8888(BT)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">80(Http)</td>
<td style="text-align:left">110(Pop3)</td>
<td style="text-align:left">143(IMAP)</td>
<td style="text-align:left">443(Https)</td>
<td style="text-align:left">445(共享)</td>
</tr>
<tr>
<td style="text-align:left">1433(MSSQL)</td>
<td style="text-align:left">3306(MYSQL)</td>
<td style="text-align:left">3311(康乐)</td>
<td style="text-align:left">3312(康乐)</td>
<td style="text-align:left">3389(远程桌面)</td>
</tr>
</tbody>
</table>
<p>启用防火墙：</p>
<p>启用 ufw 防火墙：</p>
<pre><code class="language-plain">sudo ufw enable
</code></pre>
<p>检查配置：</p>
<p>可以运行</p>
<pre><code class="language-plain">sudo ufw status
</code></pre>
<p>来查看防火墙的状态和已开启的端口。<br>
参考文章</p>
<p><a href="https://blog.csdn.net/qq_53679247/article/details/128374607">https://blog.csdn.net/qq_53679247/article/details/128374607</a></p>
<h3>五、配置 SSH 登录及 SSH Server 安全设定</h3>
<p>ubuntu24需要额外做本节最后面的配置。</p>
<p>输入以下命令来编辑 SSH 配置文件</p>
<p>两个功能一样的，若未安装vim，默认nano</p>
<pre><code class="language-plain">sudo nano /etc/ssh/sshd_config
</code></pre>
<pre><code class="language-bash">sudo vim /etc/ssh/sshd_config
</code></pre>
<h4>禁用root身份登录</h4>
<p>编辑 SSH 配置文件</p>
<p>找到PermitRootLogin Yes这一项，然后把它后面的设定值改为no即可。<br>
如下：</p>
<pre><code class="language-plain">PermitRootLogin no
</code></pre>
<h4>SSH端口号更改</h4>
<p>编辑 SSH 配置文件</p>
<pre><code class="language-plain">Port 22
</code></pre>
<p>SSH端口号22改为其他数字，注意了，<strong>改成其他端口后，记得防火墙设置也要更新。</strong><br>
Port [SSH端口号，最好在10000以上]</p>
<p>然后重启 SSH Server 生效：</p>
<pre><code class="language-plain">sudo systemctl restart sshd.service
</code></pre>
<h4>禁止密码登录，改为密钥登录（麻烦，可跳过）</h4>
<p>先在windows端生成 ssh 公私钥对</p>
<pre><code class="language-plain">ssh-keygen -t rsa -f %USERPROFILE%\.ssh\ali_id_rsa_admin
</code></pre>
<p>或在linux端生成 ssh 公私钥对（但要记得保存下来）</p>
<pre><code class="language-plain">ssh-keygen -t rsa -f ~/.ssh/id_rsa_xxxx
</code></pre>
<p>-f表示更友好地输出方式，后面跟的是储存目录</p>
<p>在用户目录下创建authorized_keys文件，并将公钥（pub结尾）的内容粘入authorized_keys文件中</p>
<pre><code class="language-plain">mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
</code></pre>
<p>再编辑 SSH 配置文件</p>
<p>把 PasswordAuthentication 设置成 no，禁止密码登录：</p>
<pre><code class="language-plain">PasswordAuthentication no
</code></pre>
<p>把 PubkeyAuthentication 设置成 yes，允许密钥登录：</p>
<pre><code class="language-plain">PubkeyAuthentication yes
</code></pre>
<h4>ubunutu24</h4>
<p>因为新增了 ssh.socket  ，需要关掉或者打开强制的ipv4，如果不强制ipv4就无法访问(bug)</p>
<pre><code class="language-plain">sudo systemctl edit ssh.socket
</code></pre>
<p>在空白处插入如下代码。111改成SSH端口，测试完成之后再删除22那里</p>
<pre><code class="language-plain">[Socket]
ListenStream=
# 专门负责 IPv4
ListenStream=0.0.0.0:111
# 专门负责 IPv6
ListenStream=[::]:111

# 建议 22 端口也保持双栈（为了备用通道的安全）
ListenStream=0.0.0.0:22
ListenStream=[::]:22
</code></pre>
<h3>六、自定义shell 界面安装【不需要可以不装】</h3>
<p>安装 oh-my-zsh</p>
<pre><code class="language-plain">sh -c &quot;$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;
</code></pre>
<p>其他主题、插件等配置参考：<br>
zsh 安装与配置：9步打造高效命令行 - HackerNeo<br>
Tmux<br>
Tmux 是一个终端多路复用器，可以从单个屏幕创建、访问和控制多个终端。 Tmux 可能会与屏幕分离，并继续在后台运行，然后重新连接。</p>
<p>每当 tmux 启动时，它都会创建一个带有单个窗口的新会话并将其显示在屏幕上。屏幕底部的状态行显示当前会话的信息，用于输入交互式命令。</p>
<p>在本指南中，我将与您分享 Tmux 备忘单，以帮助您在 Linux 或 Unix 机器上开始使用 tmux。在进入备忘单部分之前，我们先来看看如何在 Linux 上安装 tmux。</p>
<p>来源： 一台新到手的VPS服务器必做十二项配置（以Ubuntu为例） - #54 by shayne<br>
Thefuck<br>
来自：<a href="https://linux.do/t/115839/105%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%A5%E5%85%A8%E5%B7%A5%E5%85%B7">https://linux.do/t/115839/105的命令补全工具</a><br>
<a href="http://github.com">github.com</a></p>
<p>GitHub - nvbn/thefuck: Magnificent app which corrects your previous...<br>
Magnificent app which corrects your previous console command.</p>
<h3>七、Docker配置【不需要可以不装】</h3>
<h4>1、安装 Docker</h4>
<p>官方地址：<a href="https://docs.docker.com/install/linux/docker-ce/ubuntu/">https://docs.docker.com/install/linux/docker-ce/ubuntu/</a><br>
快速安装</p>
<pre><code class="language-plain">curl https://get.docker.com | sh
</code></pre>
<p>首先安装基本环境：</p>
<pre><code class="language-plain">sudo apt install \
        apt-transport-https \
        ca-certificates \
        curl \
        software-properties-common
</code></pre>
<p>再安装 key：</p>
<pre><code class="language-plain">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
</code></pre>
<p>再增加 Docker 官方源：</p>
<pre><code class="language-plain">sudo add-apt-repository \
     &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) \
     stable&quot;
</code></pre>
<p>最后就可以安装 Docker 了，我一般也同时会用 Docker Compose，一起安装上去吧！</p>
<pre><code class="language-plain">sudo apt update
sudo apt install docker-ce docker-compose
</code></pre>
<p>安装好 Docker 以后，记得将当前用户加到 docker 用户组里去（如果你不想每次都用 sudo 用 Docker 的话）</p>
<pre><code class="language-plain">sudo gpasswd docker -a username
</code></pre>
<h4>2、Docker日志管理</h4>
<p>全局配置日志大小限制
创建或修改文件 /etc/docker/daemon.json，并增加以下配置（3份日志、每份10M）。</p>
<pre><code class="language-plain">{
        &quot;log-driver&quot;: &quot;json-file&quot;,
        &quot;log-opts&quot;: {
                &quot;max-file&quot;: &quot;3&quot;,
                &quot;max-size&quot;: &quot;10m&quot;
        }
}
</code></pre>
<p>随后重启 Docker 服务</p>
<pre><code class="language-plain">sudo systemctl daemon-reload
sudo systemctl restart docker
</code></pre>
<p>不过已存在的容器不会生效，需要重建才可以！</p>
<p>单个容器日志大小限制</p>
<p>写在docker-compose中</p>
<pre><code class="language-plain">logging:
  driver: json-file
  options:
    max-size: &quot;100m&quot;
    max-file: &quot;3&quot;
</code></pre>
<h3>八、swap配置【不需要可以不做，但是很重要】</h3>
<pre><code class="language-plain">sudo swapoff -a   # 删除原分区
sudo dd if=/dev/zero of=/root/swapfile bs=1M count=5120  # 配置新分区大小MB，一般为内存的2-3倍
sudo chmod 600 /root/swapfile
sudo mkswap /root/swapfile
sudo swapon /root/swapfile
</code></pre>
<p>最后设置开机启动：可以编辑 /etc/fstab 文件，把最后一行改成：</p>
<pre><code class="language-plain">/root/swapfile swap swap defaults 0 0
</code></pre>
<p>参考文章：</p>
<p><a href="https://skywt.cn/blog/changeswap/">https://skywt.cn/blog/changeswap/</a></p>
<h3>九、logrotate日志大小限制【不需要可以不装，但是建议，日志管理很重要！】</h3>
<pre><code class="language-plain">sudo apt install logrotate
sudo apt install cron
/var/log/syslog
/var/log/mail.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{
        weekly
rotate 3
        maxsize 100M
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}
</code></pre>
<p>参考文章：</p>
<p>logrotate自定义切割时间的一些坑 - 梦轻尘 - 博客园<br>
Linux日志切割神器logrotate原理介绍和配置详解 | HelloDog<br>
Logrotate 日志滚动 解决日志占用空间过大 - 狐狸的小小窝<br>
Linux 日志管理journald和rsyslog - 星火撩原 - 博客园<br>
<a href="https://nj.transwarp.cn:8180/?p=10556">https://nj.transwarp.cn:8180/?p=10556</a></p>
<h3>十、Fail2ban 封禁 IP【不需要可以不装】</h3>
<p>保护 EC2 实例的开源工具 – Fail2Ban | Amazon Web Services<br>
Protect EC2 instance with Fail2Ban</p>
<p><a href="http://github.com/fail2ban/fail2ban">github.com/fail2ban/fail2ban</a><br>
Ubunutu用这个</p>
<pre><code class="language-plain">sudo apt install fail2ban
</code></pre>
<p>CentOS/RHEL 用这个</p>
<pre><code class="language-plain">sudo yum install epel-release
sudo yum install fail2ban
</code></pre>
<p>配置建议 (<code>/etc/fail2ban/jail.local</code>)： 不要直接修改 <code>.conf</code> 文件，新建一个 <code>.local</code> 文件。</p>
<pre><code class="language-plain">sudo nano /etc/fail2ban/jail.local
</code></pre>
<p>文本内容：</p>
<pre><code class="language-plain"># 默认设置
[DEFAULT]
ignoreip = 127.0.0.1/8 
# 本地白名单
# SSH servers
[sshd]
enabled = true
backend = systemd
port    = ssh
filter  = sshd 
maxretry = 10           
# 允许失败 10 次
findtime = 300         
# 在 5 分钟内
bantime  = 86400       
# 封禁 1 天 (单位秒)，甚至可以设为 -1 (永久)
</code></pre>
<p>启动服务</p>
<pre><code class="language-plain">sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
</code></pre>
<p>验证配置 查看当前被封禁的 IP：</p>
<pre><code class="language-plain">sudo fail2ban-client status sshd
</code></pre>
<h3>十一、面板安装【不需要可以不装】</h3>
<p><a href="https://1panel.cn">1panel官网</a></p>
<p><a href="https://www.bt.cn">宝塔面板官网</a></p>
<p>推荐开源的Linux管理面板——1panel</p>
<p>1panel安装一键脚本</p>
<pre><code class="language-bash">bash -c &quot;$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)&quot;
</code></pre>
<h3>十二、常规安全更新</h3>
<p>安装 unattended-upgrades 来自动更新 security upgrade<br>
通过 unattended-upgrades，可以使 Ubuntu 系统自动进行常规的安全相关更新，使系统一直保持 security。</p>
<pre><code class="language-plain">sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>openresty</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/openresty</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/openresty</guid>
    <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
    <description>前置准备 安装（已安装则跳过） 1. 安装基础工具 2. 导入官方签名 这步是为了安全，必须做 3. 添加仓库 4. 正式安装 确认安装路径: /usr/local/openresty/nginx/ 配置目录: /usr/local/openresty/nginx/conf/conf.d/ 打开文件： + 按键盘 Ctrl + V Page Down 翻到文件最底部。 + 找到http的最后一个大括号 } 。 在它上面一行插入： 这样以后添加配置就只需要进入 /usr/loc</description>
      <content:encoded><![CDATA[<h2>前置准备</h2>
<h4>安装（已安装则跳过）</h4>
<h3>1. 安装基础工具</h3>
<pre><code class="language-bash">sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates
</code></pre>
<h3>2. 导入官方签名 (这步是为了安全，必须做)</h3>
<pre><code class="language-bash">wget -O - https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpg
</code></pre>
<h3>3. 添加仓库</h3>
<pre><code class="language-bash">echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu $(lsb_release -sc) main&quot; | sudo tee /etc/apt/sources.list.d/openresty.list
</code></pre>
<h3>4. 正式安装</h3>
<pre><code class="language-bash">sudo apt-get update
sudo apt-get install openresty -y
</code></pre>
<h4>确认安装路径:<code>/usr/local/openresty/nginx/</code></h4>
<h4>配置目录:<code>/usr/local/openresty/nginx/conf/conf.d/</code></h4>
<p>打开文件：</p>
<pre><code class="language-bash">sudo nano /usr/local/openresty/nginx/conf/nginx.conf
</code></pre>
<ul>
<li>按键盘 <code>Ctrl</code> + <code>V</code> (Page Down) 翻到文件最底部。</li>
<li>找到http的最后一个大括号 <code>}</code>。</li>
</ul>
<p>在它上面一行插入：</p>
<pre><code class="language-nginx">include /usr/local/openresty/nginx/conf/conf.d/*.conf;
</code></pre>
<p>这样以后添加配置就只需要进入</p>
<p><code>/usr/local/openresty/nginx/conf/conf.d/*.conf</code></p>
<ul>
<li>保存并退出 (<code>Ctrl+O</code>, <code>Enter</code>, <code>Ctrl+X</code>)。</li>
</ul>
<pre><code class="language-bash"># 1. 创建存放配置的文件夹
sudo mkdir -p /usr/local/openresty/nginx/conf/conf.d/

# 2. 再次检查配置是否正确
sudo openresty -t
</code></pre>
<h4>常用命令:</h4>
<p><code>sudo openresty -t</code> (检查),</p>
<p><code>sudo systemctl reload openresty</code> (重载)</p>
<h2>场景一：搭建一个静态网站 (HTML/图片)</h2>
<p>这是最基础的用法，用于部署博客、企业官网或前端项目。</p>
<p><strong>1. 准备网页文件</strong> 我们先创建一个存放网页的目录（建议放在 <code>/var/www/</code> 下）：</p>
<p>Bash</p>
<pre><code class="language-plain">sudo mkdir -p /var/www/mywebsite
# 创建一个测试用的 index.html
echo &quot;&lt;h1&gt;这是我的静态网站&lt;/h1&gt;&quot; | sudo tee /var/www/mywebsite/index.html
</code></pre>
<p><strong>2. 创建配置文件</strong> 新建文件：<code>sudo nano /usr/local/openresty/nginx/conf/conf.d/mywebsite.conf</code></p>
<p><strong>3. 写入配置</strong></p>
<p>Nginx</p>
<pre><code class="language-plain">server {
    listen 80;
    server_name example.com;  # 将此处改为您的域名或服务器IP

    # 网站根目录
    root /var/www/mywebsite;
    index index.html index.htm;

    # 访问日志（可选，建议开启）
    access_log logs/mywebsite_access.log;
    error_log  logs/mywebsite_error.log;

    location / {
        # 如果找不到文件，尝试返回 index.html (适用于 Vue/React 单页应用)
        try_files $uri $uri/ /index.html;
    }
}
</code></pre>
<p><strong>4. 生效</strong></p>
<pre><code class="language-bash">sudo openresty -t   # 检查语法
sudo systemctl reload openresty
</code></pre>
<p>现在访问您的域名/IP，就能看到“这是我的静态网站”。</p>
<h2>场景二：反向代理 (配合 Python/Go/Node.js)</h2>
<p>如果您在服务器上跑了一个 Python (Flask/Django) 或 Go 程序，监听在 <code>127.0.0.1:8000</code>，想通过 OpenResty 暴露给外网。</p>
<p><strong>1. 创建配置文件</strong> 新建文件：<code>sudo nano /usr/local/openresty/nginx/conf/conf.d/api_proxy.conf</code></p>
<p><strong>2. 写入配置</strong></p>
<p>Nginx</p>
<pre><code class="language-plain">server {
    listen 80;
    server_name api.example.com; # 您的 API 域名

    location / {
        # 转发请求到后端的 8000 端口
        proxy_pass http://127.0.0.1:8000;

        # 必须携带的 Header，否则后端拿不到真实 IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 支持 WebSocket (如果需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
    }
}
</code></pre>
<p>若有证书，走443端口，通常已经配置过80到443的强制HTTPS，因此此处省略</p>
<pre><code class="language-bash">server {
    # 1. 必须加上 ssl 关键字
    listen 443 ssl;
    # 2.这里填计划的域名
    server_name openlist.develata.me;

    # 3. 必须复用申请的域名证书
    ssl_certificate      /usr/local/openresty/nginx/conf/ssl/develata.me.crt;
    ssl_certificate_key  /usr/local/openresty/nginx/conf/ssl/develata.me.key;

    # 4. SSL 协议优化 (保持一致性)
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        # 转发到其它端口
        proxy_pass http://127.0.0.1:8888;

        # Header 传递
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # WebSocket 支持 (如果需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
    }
}
</code></pre>
<h2>场景三：利用 Lua 脚本 (OpenResty 独家功能)</h2>
<p>这是 OpenResty 最强大的地方，可以在网关层做逻辑处理。例如：<strong>简单的 API 鉴权</strong>。</p>
<p><strong>1. 创建配置文件</strong> 新建文件：<code>sudo nano /usr/local/openresty/nginx/conf/conf.d/lua_auth.conf</code></p>
<p><strong>2. 写入配置</strong></p>
<p>Nginx</p>
<pre><code class="language-plain">server {
    listen 8090; # 监听 8090 端口测试
    
    location /secret {
        access_by_lua_block {
            -- 获取 URL 参数中的 token
            local token = ngx.var.arg_token
            
            -- 如果 token 不是 '123456'，直接拒绝访问
            if token ~= &quot;123456&quot; then
                ngx.status = 403
                ngx.say(&quot;禁止访问：Token 错误或缺失&quot;)
                ngx.exit(403)
            end
        }
        
        # 只有通过了上面的 Lua 检查，才会执行下面的内容
        default_type text/html;
        content_by_lua_block {
            ngx.say(&quot;&lt;h1&gt;欢迎进入机密区域！验证通过。&lt;/h1&gt;&quot;)
        }
    }
}
</code></pre>
<ul>
<li><strong>测试方法：</strong>
<ul>
<li>访问 <code>http://ip:8090/secret</code> -&gt; <strong>被拒绝</strong></li>
<li>访问 <code>http://ip:8090/secret?token=123456</code> -&gt; <strong>成功</strong></li>
</ul>
</li>
</ul>
<h2>场景四：配置 HTTPS (SSL 证书)</h2>
<p>现在网站都需要 HTTPS。我们可以手动配置证书，或者使用 <code>certbot</code>。这里展示<strong>标准配置模板</strong>。</p>
<p>假设您已经有了证书文件（<code>.crt</code> 和 <code>.key</code>）。</p>
<p><strong>1. 配置文件模板</strong></p>
<p>Nginx</p>
<pre><code class="language-plain">server {
    # 监听443端口的ssl
    listen 443 ssl;
    # 自己域名
    server_name example.com;

    # 证书路径/path/to/your/certificate.crt
    ssl_certificate     /path/to/your/certificate.crt; 
    ssl_certificate_key /path/to/your/private.key;

    # 推荐的安全参数
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    # 如果有一个443端口静态页网站，相当于把原本的404换成别的
    # 没有就不需要下面两行
    # root /var/www/mywebsite;
    # index index.html;
}

# HTTP 强制跳转 HTTPS
server {
    listen 80;
    # 自己域名
    server_name example.com;
    # 301永久重定向强制HTTPS
    return 301 https://$host$request_uri;
}
</code></pre>
<h3>💡 核心排错清单</h3>
<p>如果在配置过程中遇到问题，请按此顺序检查：</p>
<ol>
<li><strong>检查语法：</strong> 永远第一步执行 <code>sudo openresty -t</code>。</li>
<li><strong>看日志：</strong> 报错原因都在这里：
<ul>
<li><code>tail -f /usr/local/openresty/nginx/logs/error.log</code></li>
</ul>
</li>
<li><strong>检查端口：</strong> 确认端口没被占用：
<ul>
<li><code>sudo ss -tulpn | grep 80</code></li>
</ul>
</li>
<li><strong>检查防火墙：</strong> 确认服务器防火墙（UFW/iptables）和云服务商的安全组放行了端口。</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>easytier</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/easytier</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/easytier</guid>
    <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
    <description>官网： https://easytier.cn/ https://easytier.cn/ github仓库： https://github.com/EasyTier/EasyTier https://github.com/EasyTier/EasyTier Linux一键安装脚本安装 一键脚本依赖 unzip ，请提前下载并安装 安装easytier一键脚本 脚本执行成功后，EasyTier 的二进程程序会安装到 /opt/easytier 目录下，配置文件位于 /opt/</description>
      <content:encoded><![CDATA[<p>官网：<a href="https://easytier.cn/">https://easytier.cn/</a></p>
<p>github仓库：<a href="https://github.com/EasyTier/EasyTier">https://github.com/EasyTier/EasyTier</a></p>
<h2><strong>Linux一键安装脚本安装</strong></h2>
<p>一键脚本依赖 <code>unzip</code>，请提前下载并安装</p>
<pre><code class="language-bash">sudo apt install unzip
</code></pre>
<p>安装easytier一键脚本</p>
<pre><code class="language-bash">wget -O /tmp/easytier.sh &quot;https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh&quot; &amp;&amp; sudo bash /tmp/easytier.sh install --gh-proxy https://ghfast.top/
</code></pre>
<p>脚本执行成功后，EasyTier 的二进程程序会安装到 <code>/opt/easytier</code> 目录下，配置文件位于 <code>/opt/easytier/config/default.conf</code>。</p>
<p>配置文件可通过 <a href="https://easytier.cn/web/index.html#/config_generator">配置文件生成器</a> 生成。</p>
<pre><code class="language-bash">sudo nano /opt/easytier/config/default.conf
</code></pre>
<p>一般配置如下</p>
<pre><code class="language-bash"># 当前服务器名
instance_name = &quot;server&quot;
# 当前设备名
hostname = &quot;server&quot;
# 是否开启DHCP，开启则删除ipv4行，false改为true
ipv4 = &quot;10.144.51.1/24&quot;
dhcp = false
# 当前监听端口
listeners = [
    &quot;tcp://0.0.0.0:11010&quot;,
    &quot;udp://0.0.0.0:11010&quot;,
    # 个人优化，不需要监听wg和wss
    # &quot;wg://0.0.0.0:11011&quot;,
    &quot;ws://127.0.0.1:11011/&quot;,
    # &quot;wss://0.0.0.0:11012/&quot;,
]
# 出口节点列表
exit_nodes = []
# RPC 管理端口
rpc_portal = &quot;0.0.0.0:0&quot;

# 账密
[network_identity]
network_name = &quot;admin&quot;
network_secret = &quot;password&quot;

# 连接目标的域名or网址or ipv4 +端口
# 若为主服务器则不需要填写[[peer]]
# 若需要依次访问多个服务端，那么就填多个[[peer]],url块,不是只添加url
# 注意：IPv6 地址必须用方括号 [] 包起来

# [[peer]]
# uri = &quot;tcp://public.easytier.top:11010&quot;

# 以下为默认配置
[flags]
default_protocol = &quot;udp&quot;
dev_name = &quot;server&quot;
enable_encryption = true
enable_ipv6 = true
mtu = 1380
latency_first = false
enable_exit_node = false
no_tun = false
use_smoltcp = false
foreign_network_whitelist = &quot;*&quot;
disable_p2p = false
p2p_only = false
relay_all_peer_rpc = false
disable_udp_hole_punching = false
</code></pre>
<p><strong>防火墙记得放开端口11010</strong></p>
<p>EasyTier 会被注册为系统服务，可以通过以下命令管理：</p>
<p>将 EasyTier 作为后台服务（守护进程）管理</p>
<pre><code class="language-bash"># 启动
sudo systemctl start easytier@default
# 开机自启
sudo systemctl enable easytier@default
# 查看运行状态
sudo systemctl status easytier@default
# 查看详细日志
sudo journalctl -u easytier@default -f
# 停止服务
sudo systemctl stop easytier@default
# 重启
sudo systemctl restart easytier@default
</code></pre>
<p>使用 <code>systemctl</code> 可以让 EasyTier 在后台静默运行，并支持开机自启 ，<strong>每次修改完配置文件都记得要重启才能生效。</strong></p>
<h2>docker-compose</h2>
<pre><code class="language-bash">services:
  watchtower: # 用于自动更新easytier镜像，若不需要请删除这部分
    image: m.daocloud.io/docker.io/containrrr/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
      - WATCHTOWER_NO_STARTUP_MESSAGE
      - DOCKER_API_VERSION=1.44
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 3600 --cleanup --label-enable
  easytier:
    image: m.daocloud.io/docker.io/easytier/easytier:latest
    hostname: ali_ecs
    container_name: easytier
    labels:
      com.centurylinklabs.watchtower.enable: 'true'
    restart: unless-stopped
    network_mode: host
    cap_add:
      - NET_ADMIN
      - NET_RAW
    environment:
      - TZ=Asia/Shanghai
    devices:
      - /dev/net/tun:/dev/net/tun
    volumes:
      - /etc/easytier:/root
      - /etc/machine-id:/etc/machine-id:ali_ecs # 映射宿主机机器码
    command: -d --network-name 你的用户名 --network-secret 你的密码 -p tcp://public.easytier.top:11010（官方服务器，-p可填多个，可以换成你自己的） -p 指定你的easytier服务器 -i 指定你的内网ipv4
</code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>网络一键脚本搭建(YG)</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/%E8%99%9A%E6%8B%9F%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E4%B8%80%E9%94%AE%E8%84%9A%E6%9C%AC%E6%90%AD%E5%BB%BA(YG)</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%BB%9C%E6%8A%80%E6%9C%AF/%E8%99%9A%E6%8B%9F%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E4%B8%80%E9%94%AE%E8%84%9A%E6%9C%AC%E6%90%AD%E5%BB%BA(YG)</guid>
    <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
    <description>YG一键脚本github网址： https://github.com/yonggekkk/sing-box-yg https://github.com/yonggekkk/sing-box-yg 需要 sudo 权限，建议直接输入 sudo -i 获取根权限 VPS专用一键脚本如下：快捷方式： sb 或者 Sing-box-yg脚本界面预览图（注：相关参数随意填写，仅供围观） 二、Serv00/Hostuno一键三协议共存脚本（Serv00/Hostuno专用）： + 目前免</description>
      <content:encoded><![CDATA[<p>YG一键脚本github网址：<a href="https://github.com/yonggekkk/sing-box-yg">https://github.com/yonggekkk/sing-box-yg</a></p>
<p>需要<code>sudo</code>权限，建议直接输入<code>sudo -i</code>获取根权限</p>
<h3>VPS专用一键脚本如下：快捷方式：<code>sb</code></h3>
<pre><code class="language-plain">bash &lt;(wget -qO- https://raw.githubusercontent.com/yonggekkk/sing-box-yg/main/sb.sh)
</code></pre>
<p>或者</p>
<pre><code class="language-plain">bash &lt;(curl -Ls https://raw.githubusercontent.com/yonggekkk/sing-box-yg/main/sb.sh)
</code></pre>
<h3>Sing-box-yg脚本界面预览图（注：相关参数随意填写，仅供围观）</h3>
<h3><img src="https://cdn.nlark.com/yuque/0/2025/png/56734241/1763139515504-05eeb1ef-2e9d-424e-9b3b-16c3dca952f6.png" alt=""></h3>
<h3>二、Serv00/Hostuno一键三协议共存脚本（Serv00/Hostuno专用）：</h3>
<ul>
<li>目前免费Serv00使用代理脚本有被封账号的风险，收费版Hostuno不受影响，可正常使用</li>
<li>切勿与其他Serv00脚本混用！！！</li>
<li>引用<a href="https://github.com/eooce/Sing-box/blob/test/sb_00.sh">老王eooce</a>、<a href="https://github.com/frankiejun/serv00-play/blob/main/start.sh">frankiejun</a>相关功能，支持一键三协议：vless-reality、vmess-ws(argo)、hysteria2</li>
<li>主要增加reality协议默认支持 CF vless/trojan 节点的proxyip以及非标端口的优选反代IP功能</li>
<li>聚合通用节点分享，支持到22个节点：三协议各自三个IP，argo全覆盖13个端口节点，已添加不死优选IP</li>
</ul>
<h3>Serv00/Hostuno-sb-yg一键脚本</h3>
<ul>
<li>Argo高度自定义：可以重置临时隧道; 可以继续使用上回的固定隧道; 也可以更换固定隧道的域名或token</li>
</ul>
<pre><code class="language-plain">bash &lt;(curl -Ls https://raw.githubusercontent.com/yonggekkk/sing-box-yg/main/serv00.sh)
</code></pre>
<h4>Serv00/Hostuno-sb-yg脚本界面预览图，仅限方案一的SSH端安装脚本（注：仅供围观）</h4>
<p><img src="https://cdn.nlark.com/yuque/0/2025/png/56734241/1763139557885-be52b40d-a1c3-4835-b00a-11f97d0e159c.png" alt=""></p>
]]></content:encoded>
    </item>
    <item>
      <title>SSH</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/SSH/SSH</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/SSH/SSH</guid>
    <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
    <description>1. Tabby - 免费开源（推荐） 👍 优势： + 完全免费开源 + 界面现代化 + 强大的分屏功能 + 丰富的插件生态系统 + 内置SSH客户端、SFTP文件传输 + 支持PowerShell、CMD、WSL等 👎 劣势： + 相对较新，某些高级功能还在完善 + 内存占用不高，但比PuTTY高， + 启动速度不是最快 2. Termius - 多端同步（github教育优惠） 👍 优势： + 全平台同步 + 界面设计精美，用户体验极佳 + 移动端体验最佳，支持手势</description>
      <content:encoded><![CDATA[<h2>1. Tabby - 免费开源（推荐）</h2>
<p>👍 <strong>优势：</strong></p>
<ul>
<li>完全免费开源</li>
<li>界面现代化</li>
<li>强大的分屏功能</li>
<li>丰富的插件生态系统</li>
<li>内置SSH客户端、SFTP文件传输</li>
<li>支持PowerShell、CMD、WSL等</li>
</ul>
<p>👎 <strong>劣势：</strong></p>
<ul>
<li>相对较新，某些高级功能还在完善</li>
<li>内存占用不高，但比PuTTY高，</li>
<li>启动速度不是最快</li>
</ul>
<h2>2. Termius - 多端同步（github教育优惠）</h2>
<p>👍 <strong>优势：</strong></p>
<ul>
<li>全平台同步</li>
<li>界面设计精美，用户体验极佳</li>
<li>移动端体验最佳，支持手势操作</li>
<li>免费版功能足够个人使用</li>
<li>支持团队协作（付费功能）</li>
</ul>
<p>👎 <strong>劣势：</strong></p>
<ul>
<li>高级功能需要付费（同步、团队功能）</li>
<li>相比Tabby功能扩展性稍弱</li>
<li>资源占用相对较高</li>
</ul>
<p>💡 <strong>适用场景：</strong></p>
<ul>
<li>多设备用户，需要手机端SSH</li>
<li>注重UI/UX体验的用户</li>
<li>简单的个人项目管理</li>
</ul>
<h2>3. PuTTY - 超轻量</h2>
<p>👍 <strong>优势：</strong></p>
<ul>
<li>极致轻量，单文件即可运行</li>
<li>启动速度极快，资源占用极低</li>
<li>稳定性经过20+年考验</li>
<li>绿色版，无需安装</li>
<li>支持SSH、Telnet、Serial等多种协议</li>
</ul>
<p>👎 <strong>劣势：</strong></p>
<ul>
<li>界面老旧，功能单一</li>
<li>不支持多标签（需第三方工具）</li>
<li>配置相对不直观</li>
<li>文件传输需要额外工具(PSFTP)</li>
</ul>
<p>💡 <strong>适用场景：</strong></p>
<ul>
<li>快速临时连接</li>
<li>低配置电脑使用</li>
<li>应急备用工具</li>
<li>简单的单次连接需求</li>
</ul>
<h2>4. MobaXterm - 全能工具箱</h2>
<p>👍 <strong>优势：</strong></p>
<ul>
<li>功能极其全面，一站式解决方案</li>
<li>内置X11服务器，支持图形界面</li>
<li>自带SFTP文件管理器（左右分栏）</li>
<li>集成多种网络工具（端口扫描、网络监控等）</li>
<li>便携版可用，无需安装</li>
</ul>
<p>👎 <strong>劣势：</strong></p>
<ul>
<li>体积庞大，启动较慢</li>
<li>免费版有会话数量限制</li>
<li>界面相对复杂，学习成本高</li>
<li>主要面向Windows平台</li>
</ul>
<p>💡 <strong>适用场景：</strong></p>
<ul>
<li>系统管理员、网络工程师</li>
<li>需要多种工具集成的复杂环境</li>
<li>X11转发等高级功能需求</li>
<li>网络故障排查和诊断</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>acme</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/SSL%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7/001acme</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/SSL%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7/001acme</guid>
    <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
    <description>前置： nginx或者openresty 假设你的域名或子域名是 us.example.com 在root账户下创建 1. 安装 acme.sh 轻量级 SSL 签发脚本 2. 设置 Cloudflare API 变量 替换为你自己的 Token export CF Token可以自己创建api令牌 3. 申请证书 替换为你的实际域名 切换默认 CA 为 Let&apos;s Encrypt 4. 创建存放证书的目录 openresty: 验证 ：执行 ls -ld /usr/loca</description>
      <content:encoded><![CDATA[<h3>前置：</h3>
<p>nginx或者openresty</p>
<p>假设你的域名或子域名是 <a href="http://us.example.com">us.example.com</a></p>
<p>在root账户下创建</p>
<h3>1. 安装 <a href="http://acme.sh">acme.sh</a> (轻量级 SSL 签发脚本)</h3>
<pre><code class="language-bash"># 这里需要把email换成自己的
curl https://get.acme.sh | sh -s email=my@example.com
source ~/.bashrc
</code></pre>
<h3>2. 设置 Cloudflare API 变量 (替换为你自己的 Token)</h3>
<pre><code class="language-bash"># 不要删除引号，在cloudflare域名-概述页最右下处
export CF_Token=&quot;你申请到的CF_Token_字符串&quot;
export CF_Account_ID=&quot;你的Cloudflare_Account_ID&quot;
</code></pre>
<p>export CF_Token可以自己创建api令牌</p>
<h3>3. 申请证书 (替换为你的实际域名)</h3>
<p>切换默认 CA 为 Let's Encrypt</p>
<pre><code class="language-bash">~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
</code></pre>
<pre><code class="language-bash"># 填自己域名
~/.acme.sh/acme.sh --issue --dns dns_cf -d us.example.com
</code></pre>
<h3>4. 创建存放证书的目录</h3>
<p>openresty:</p>
<pre><code class="language-bash">sudo mkdir -p /usr/local/openresty/nginx/conf/ssl/
# 修改目录权限，把admin改成你当前用户名
sudo chown -R admin:admin /usr/local/openresty/nginx/conf/ssl/
</code></pre>
<p><strong>验证</strong>：执行 <code>ls -ld /usr/local/openresty/nginx/conf/ssl/</code>，确保显示的是 <code>admin admin</code>。</p>
<p>nginx:</p>
<pre><code class="language-bash">sudo mkdir -p /etc/nginx/ssl/
# 修改目录权限，把admin改成你当前用户名
sudo chown -R admin:admin /etc/nginx/ssl
</code></pre>
<h3>5. 安装证书到指定位置 (不要直接用生成的路径，要用 install-cert 命令)</h3>
<p>openresty：</p>
<pre><code class="language-bash"># 填自己域名
~/.acme.sh/acme.sh --install-cert -d us.example.com \
--key-file       /usr/local/openresty/nginx/conf/ssl/us.example.com.key  \
--fullchain-file /usr/local/openresty/nginx/conf/ssl/us.example.com.crt \
--reloadcmd     &quot;openresty -s reload&quot;
</code></pre>
<p>nginx:</p>
<pre><code class="language-bash">~/.acme.sh/acme.sh --install-cert -d us.example.com \
--key-file       /etc/nginx/ssl/us.example.com.key  \
--fullchain-file /etc/nginx/ssl/us.example.com.crt \
--reloadcmd     &quot;systemctl force-reload nginx&quot;
</code></pre>
<h3>6.查看证书文件</h3>
<p>/etc/nginx/ssl/   或者你的 OpenResty 路径</p>
<pre><code class="language-bash">ls -lh /etc/nginx/ssl/
</code></pre>
<h3>7.查看定时任务</h3>
<pre><code class="language-bash">crontab -l
</code></pre>
<pre><code class="language-bash"># 填自己域名
~/.acme.sh/acme.sh --install-cert -d *.develata.me \
--key-file       /usr/local/openresty/nginx/conf/ssl/*.develata.me.key  \
--fullchain-file /usr/local/openresty/nginx/conf/ssl/*.develata.me.crt \
--reloadcmd     &quot;openresty -s reload&quot;
</code></pre>
<h3>8.卸载</h3>
<p>openresty：</p>
<pre><code class="language-bash">sudo ~/.acme.sh/acme.sh --uninstall
sudo rm -rf ~/.acme.sh
sudo rm -rf /usr/local/openresty/nginx/conf/ssl/
</code></pre>
<p>nginx：</p>
<pre><code class="language-bash">sudo ~/.acme.sh/acme.sh --uninstall
sudo rm -rf ~/.acme.sh
sudo rm -rf /etc/nginx/ssl/
</code></pre>
<p>删除定时任务：</p>
<p>检查 root 的定时任务里有没有残留</p>
<pre><code class="language-bash">sudo crontab -u root -l | grep acme 
</code></pre>
<p>找到包含 <code>/root/.acme.sh/acme.sh</code> 的那一行，删除。</p>
<pre><code class="language-bash">sudo crontab -u root -e
</code></pre>
<p>如果系统跳出来让你选择编辑器（Select an editor），通常会有 <code>nano</code> (推荐新手) 和 <code>vim</code> 等选项。</p>
<ul>
<li>请输入对应的数字（通常 <code>nano</code> 是 <strong>1</strong>），然后按回车。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>How to Visit the Google Scholar</title>
      <link>https://develata.me/knowledge/sharing/%E6%8C%87%E5%8D%97/How%20to%20Visit%20the%20Google%20Scholar</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/%E6%8C%87%E5%8D%97/How%20to%20Visit%20the%20Google%20Scholar</guid>
    <pubDate>Thu, 27 Nov 2025 22:43:00 GMT</pubDate>
    <description>How to Visit the Google Scholar</description>
      <content:encoded><![CDATA[<ul>
<li><strong>现状：</strong> 在中国大陆，当你直接访问某些境外网站（如 Google、YouTube）时，网络请求经过运营商网关时会被 GFW 识别并拦截（通过 DNS 污染、IP 封锁或 SNI 阻断等方式），导致无法连接。</li>
<li><strong>访问门槛：</strong> Google 的所有服务（包括搜索、邮箱、学术、地图）的服务器 IP 地址段在国内大多处于不可达状态。因此，<strong>在标准网络环境下，Google 学术是打不开的。</strong></li>
</ul>
<h3>方法一：使用学术镜像站（最简单，免费）</h3>
<p>镜像站是原网站的“副本”，通过服务器中转实现访问。这是最快、无需安装任何软件的方法，但缺点是网址经常失效，需要不断寻找新的。</p>
<ul>
<li><strong>如何寻找：</strong>
<ul>
<li>在百度或必应搜索关键词：“<strong>谷歌学术镜像</strong>”、“<strong>Google Scholar Mirror</strong>”。</li>
<li>访问一些专门收集镜像链接的导航站，例如：<strong>思谋学术</strong>、<strong>大木虫学术导航</strong>等。</li>
</ul>
</li>
<li><strong>注意事项：</strong>
<ul>
<li><strong>账号安全：</strong> 在镜像站上<strong>不要登录你的个人 Google 账号</strong>。仅用它来搜索和下载文献。</li>
<li><strong>广告：</strong> 免费镜像站通常伴有广告，请注意甄别，不要随意点击下载不明插件。</li>
</ul>
</li>
</ul>
<h3>方法二：高校/机构图书馆资源（最正规，最稳定）</h3>
<p>如果你是在校大学生或科研机构人员，利用学校购买的资源是最合规且稳定的途径。</p>
<ul>
<li><strong>WebVPN / 校园网：</strong> 许多高校的图书馆网站提供了校外访问系统（WebVPN）。登录后，不仅可以访问 Web of Science、IEEE、Springer 等数据库，有些学校的入口甚至包含谷歌学术的加速通道。</li>
<li><strong>Glgoo (部分高校购买)：</strong> Glgoo 也是一个知名的谷歌学术镜像服务，部分高校图书馆会统一购买其服务供学生使用。</li>
<li><strong>直接替代品：</strong> 虽然习惯用 Google Scholar，但 <strong>Web of Science (WoS)</strong> 和 <strong>Scopus</strong> 在文献引用的权威性上其实更高，且在国内高校网络下通常可以直连。</li>
</ul>
<h3>方法三：浏览器插件/扩展（轻量级，适合轻度用户）</h3>
<p>如果你不想折腾复杂的网络设置，可以在浏览器（Chrome 或 Edge）中安装特定的插件。</p>
<ul>
<li><strong>Edge 浏览器（推荐）：</strong>
<ul>
<li>打开 Edge 的“扩展”商店。</li>
<li>搜索关键词如“<strong>谷歌学术助手</strong>”、“<strong>G助手</strong>”、“<strong>学术加速</strong>”。</li>
<li>安装评价较高的插件。这些插件通常通过代理特定的学术域名来实现访问。</li>
</ul>
</li>
<li><strong>优点：</strong> 安装简单，通常只代理学术网站，不影响访问国内网站的速度。</li>
<li><strong>缺点：</strong> 很多插件初期免费，后期可能会收费或限速。</li>
</ul>
<h3>方法四：优质的替代搜索引擎（不翻墙的B计划）</h3>
<p>当谷歌学术完全无法访问时，以下几个科研搜索引擎是极佳的替代品，甚至在某些功能（如AI分析、关联图谱）上超越了谷歌学术：</p>
<ol>
<li><strong>Semantic Scholar (语义学者)</strong>
<ul>
<li><strong>特点：</strong> 由微软联合创始人保罗·艾伦投资，基于 AI 驱动。它不仅能搜论文，还能分析论文的影响力，提取图表。</li>
<li><strong>访问：</strong> 国内通常可直连，速度较快。</li>
</ul>
</li>
<li><strong>AMiner</strong>
<ul>
<li><strong>特点：</strong> 清华大学团队研发。对计算机科学（CS）领域的覆盖极佳，拥有强大的专家库和知识图谱。</li>
<li><strong>访问：</strong> 完全国内访问，速度极快。</li>
</ul>
</li>
<li><strong>Connected Papers</strong>
<ul>
<li>**特点：**<strong>强烈推荐</strong>。它不是通过关键词列表展示，而是通过“视觉图谱”展示一篇论文的引文和被引文关系。非常适合做 Literature Review（文献综述）。</li>
</ul>
</li>
<li><strong>X-MOL (化学/生物/材料)</strong>
<ul>
<li><strong>特点：</strong> 如果你是生化环材专业，X-MOL 的期刊聚合功能非常强大。</li>
</ul>
</li>
</ol>
<h3>方法五：文献下载神器（配合使用）</h3>
<p>谷歌学术主要解决“找”的问题，如果你找到了论文但无法下载（因为没有权限），可以配合以下工具：</p>
<ul>
<li><strong>Sci-Hub：</strong> 学术界的“海盗湾”，通过输入 DOI 号下载全文。域名经常变动，需自行搜索最新域名（如 <code>.se</code>, <code>.ru</code>, <code>.st</code> 等后缀）。</li>
<li><strong>Z-Library：</strong> 全球最大的电子书和文献库，虽然主站常被封，但有很多镜像和民间维护的通道。</li>
</ul>
<h3>方法六：科学上网</h3>
<p>从技术原理上讲，它主要利用了<strong>代理（Proxy）和加密隧道</strong>技术。</p>
<ul>
<li>“科学上网”是目前实现<strong>原生、稳定访问</strong> Google 学术的最主要手段。</li>
<li><strong>不仅仅是“打开网页”：</strong>
<ul>
<li><strong>账号同步：</strong> 只有通过这种方式，你才能登录 Google 账号，保存你的文献库（My Library），并创建引用提醒。</li>
<li><strong>全文获取：</strong> 很多时候，Google 学术提供的 PDF 下载链接也是位于境外的大学或机构服务器，如果不通过代理，下载速度可能极慢或直接中断。</li>
<li><strong>插件联动：</strong> 如果你使用 Zotero 或 EndNote 的浏览器插件抓取 Google 学术的元数据，通常也需要代理网络的支持才能正常抓取。</li>
</ul>
</li>
<li><strong>解决方案（搭梯子）：</strong>
<ol>
<li>用户通过特定软件（如 VPN 或代理客户端），将网络请求加密。</li>
<li>加密后的请求发送到一台位于境外的中转服务器。</li>
<li>由于这台境外服务器未被封锁，且数据已加密，GFW 无法识别内容，通常会放行。</li>
<li>境外服务器接收请求后，代替你去访问 Google，并将获取的数据回传给你。</li>
</ol>
</li>
<li><strong>具体步骤</strong>
<ol>
<li>购买一个境外中转服务器</li>
<li>选择SSH工具连接到服务器</li>
<li>学习如何配置服务器</li>
</ol>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Openlist</title>
      <link>https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%9B%98%E6%95%B4%E5%90%88/Openlist</link>
      <guid isPermaLink="true">https://develata.me/knowledge/sharing/Linux%E6%9C%8D%E5%8A%A1%E5%99%A8/%E7%BD%91%E7%9B%98%E6%95%B4%E5%90%88/Openlist</guid>
    <pubDate>Mon, 24 Nov 2025 22:44:00 GMT</pubDate>
    <description>见openlist官方快速文档： https://doc.oplist.org.cn/ https://doc.oplist.org.cn/ 此处只贴openlist官方快速安装脚本 界面如下 plain 欢迎使用 OpenList 管理脚本 基础功能： 1、安装 OpenList 2、更新 OpenList 3、卸载 OpenList</description>
      <content:encoded><![CDATA[<p>见openlist官方快速文档：<a href="https://doc.oplist.org.cn/">https://doc.oplist.org.cn/</a></p>
<p>此处只贴openlist官方快速安装脚本</p>
<pre><code class="language-plain">curl -fsSL https://res.oplist.org/script/v4.sh &gt; install-openlist-v4.sh &amp;&amp; sudo bash install-openlist-v4.sh
</code></pre>
<p>界面如下</p>
<pre><code class="language-plain">欢迎使用 OpenList 管理脚本

基础功能：
1、安装 OpenList
2、更新 OpenList
3、卸载 OpenList
-------------------
服务管理：
4、查看状态
5、密码管理
6、启动 OpenList
7、停止 OpenList
8、重启 OpenList
-------------------
配置管理：
9、备份配置
10、恢复配置
-------------------
高级选项：
11、Docker 管理
12、定时更新
13、系统状态
14、关于
-------------------
0、退出脚本
</code></pre>
<p>根据界面提示，输入<code>1</code>即可安装</p>
<p>如果没有显示脚本界面则输入以下指令进入脚本界面：</p>
<pre><code>sudo openlist
</code></pre>
<p>安装完成后，根据界面提示</p>
<p>初始ID：admin</p>
<p>安装完成后，根据脚本界面提示依次输入5和1生成随机密码</p>
<p>然后利用初始ID：admin 和随机密码登入网址127.0.0.1:5244，如果有公网ip就把127.0.0.1换成公网ip</p>
<p>之后进入面板修改账密</p>
]]></content:encoded>
    </item>
    <item>
      <title>大偏差理论</title>
      <link>https://develata.me/knowledge/math/probability/%E5%A4%A7%E5%81%8F%E5%B7%AE/deviation</link>
      <guid isPermaLink="true">https://develata.me/knowledge/math/probability/%E5%A4%A7%E5%81%8F%E5%B7%AE/deviation</guid>
    <pubDate>Sun, 23 Nov 2025 23:30:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1>Hello</h1>
]]></content:encoded>
    </item>
    <item>
      <title>Linux 原生指令大全 (含语法结构)</title>
      <link>https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/001linux</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/001linux</guid>
    <pubDate>Sun, 23 Nov 2025 23:15:00 GMT</pubDate>
    <description>注 ：此处仅包含 Linux 内核、Coreutils 及 Shell 内建指令，不含第三方应用。 1. 常用原生指令 高频精简版 | 指令 | 语法结构 | 描述 | | :</description>
      <content:encoded><![CDATA[<h1>Linux 原生指令大全 (含语法结构)</h1>
<blockquote>
<p><strong>注</strong>：此处仅包含 Linux 内核、Coreutils 及 Shell 内建指令，不含第三方应用。</p>
</blockquote>
<h2>1. 常用原生指令 (高频精简版)</h2>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>ls</strong></td>
<td style="text-align:left"><code>ls [选项] [目录]</code></td>
<td style="text-align:left">列出目录内容</td>
</tr>
<tr>
<td style="text-align:left"><strong>cd</strong></td>
<td style="text-align:left"><code>cd [目录]</code></td>
<td style="text-align:left">切换工作目录</td>
</tr>
<tr>
<td style="text-align:left"><strong>pwd</strong></td>
<td style="text-align:left"><code>pwd</code></td>
<td style="text-align:left">显示当前路径</td>
</tr>
<tr>
<td style="text-align:left"><strong>cp</strong></td>
<td style="text-align:left"><code>cp [选项] &lt;源&gt; &lt;目标&gt;</code></td>
<td style="text-align:left">复制文件或目录</td>
</tr>
<tr>
<td style="text-align:left"><strong>mv</strong></td>
<td style="text-align:left"><code>mv [选项] &lt;源&gt; &lt;目标&gt;</code></td>
<td style="text-align:left">移动或重命名</td>
</tr>
<tr>
<td style="text-align:left"><strong>rm</strong></td>
<td style="text-align:left"><code>rm [选项] &lt;文件/目录&gt;</code></td>
<td style="text-align:left">删除文件或目录</td>
</tr>
<tr>
<td style="text-align:left"><strong>mkdir</strong></td>
<td style="text-align:left"><code>mkdir [选项] &lt;目录名&gt;</code></td>
<td style="text-align:left">创建新目录</td>
</tr>
<tr>
<td style="text-align:left"><strong>cat</strong></td>
<td style="text-align:left"><code>cat [选项] &lt;文件&gt;</code></td>
<td style="text-align:left">查看或连接文件内容</td>
</tr>
<tr>
<td style="text-align:left"><strong>grep</strong></td>
<td style="text-align:left"><code>grep [选项] &lt;模式&gt; &lt;文件&gt;</code></td>
<td style="text-align:left">文本搜索</td>
</tr>
<tr>
<td style="text-align:left"><strong>chmod</strong></td>
<td style="text-align:left"><code>chmod [选项] &lt;模式&gt; &lt;文件&gt;</code></td>
<td style="text-align:left">修改文件权限</td>
</tr>
<tr>
<td style="text-align:left"><strong>chown</strong></td>
<td style="text-align:left"><code>chown [选项] &lt;用户:组&gt; &lt;文件&gt;</code></td>
<td style="text-align:left">修改文件所有者</td>
</tr>
<tr>
<td style="text-align:left"><strong>ps</strong></td>
<td style="text-align:left"><code>ps [选项]</code></td>
<td style="text-align:left">查看进程状态</td>
</tr>
<tr>
<td style="text-align:left"><strong>kill</strong></td>
<td style="text-align:left"><code>kill [选项] &lt;PID&gt;</code></td>
<td style="text-align:left">终止进程</td>
</tr>
<tr>
<td style="text-align:left"><strong>ip</strong></td>
<td style="text-align:left"><code>ip [选项] &lt;对象&gt; &lt;命令&gt;</code></td>
<td style="text-align:left">网络配置管理</td>
</tr>
<tr>
<td style="text-align:left"><strong>mount</strong></td>
<td style="text-align:left"><code>mount -t &lt;类型&gt; &lt;设备&gt; &lt;挂载点&gt;</code></td>
<td style="text-align:left">挂载文件系统</td>
</tr>
<tr>
<td style="text-align:left"><strong>man</strong></td>
<td style="text-align:left"><code>man &lt;指令&gt;</code></td>
<td style="text-align:left">查看帮助手册</td>
</tr>
</tbody>
</table>
<hr>
<h2>2. Linux 原生指令全集 (分类速查)</h2>
<h3>2.1 Shell 内建指令 (Shell Builtins)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>alias</code></td>
<td style="text-align:left"><code>alias &lt;名称&gt;=&lt;命令&gt;</code></td>
<td style="text-align:left">设置指令别名</td>
</tr>
<tr>
<td style="text-align:left"><code>bg</code></td>
<td style="text-align:left"><code>bg [作业ID]</code></td>
<td style="text-align:left">将作业放到后台运行</td>
</tr>
<tr>
<td style="text-align:left"><code>echo</code></td>
<td style="text-align:left"><code>echo [选项] &lt;字符串&gt;</code></td>
<td style="text-align:left">输出字符串</td>
</tr>
<tr>
<td style="text-align:left"><code>exit</code></td>
<td style="text-align:left"><code>exit [数值]</code></td>
<td style="text-align:left">退出当前 Shell</td>
</tr>
<tr>
<td style="text-align:left"><code>export</code></td>
<td style="text-align:left"><code>export &lt;变量名&gt;=&lt;值&gt;</code></td>
<td style="text-align:left">设置环境变量</td>
</tr>
<tr>
<td style="text-align:left"><code>fg</code></td>
<td style="text-align:left"><code>fg [作业ID]</code></td>
<td style="text-align:left">将后台作业提到前台</td>
</tr>
<tr>
<td style="text-align:left"><code>history</code></td>
<td style="text-align:left"><code>history [行数]</code></td>
<td style="text-align:left">显示历史指令</td>
</tr>
<tr>
<td style="text-align:left"><code>source</code></td>
<td style="text-align:left"><code>source &lt;文件&gt;</code> 或 <code>. &lt;文件&gt;</code></td>
<td style="text-align:left">在当前 Shell 执行文件</td>
</tr>
<tr>
<td style="text-align:left"><code>type</code></td>
<td style="text-align:left"><code>type &lt;命令&gt;</code></td>
<td style="text-align:left">显示指令类型</td>
</tr>
<tr>
<td style="text-align:left"><code>unset</code></td>
<td style="text-align:left"><code>unset &lt;变量/函数&gt;</code></td>
<td style="text-align:left">删除变量或函数</td>
</tr>
</tbody>
</table>
<h3>2.2 文件与目录操作 (Coreutils - File)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ls</code></td>
<td style="text-align:left"><code>ls [选项] [路径]</code></td>
<td style="text-align:left">列出目录内容</td>
</tr>
<tr>
<td style="text-align:left"><code>cp</code></td>
<td style="text-align:left"><code>cp [选项] &lt;源&gt; &lt;目标&gt;</code></td>
<td style="text-align:left">复制</td>
</tr>
<tr>
<td style="text-align:left"><code>mv</code></td>
<td style="text-align:left"><code>mv [选项] &lt;源&gt; &lt;目标&gt;</code></td>
<td style="text-align:left">移动/重命名</td>
</tr>
<tr>
<td style="text-align:left"><code>rm</code></td>
<td style="text-align:left"><code>rm [选项] &lt;文件&gt;</code></td>
<td style="text-align:left">删除</td>
</tr>
<tr>
<td style="text-align:left"><code>mkdir</code></td>
<td style="text-align:left"><code>mkdir -p &lt;路径&gt;</code></td>
<td style="text-align:left">创建目录</td>
</tr>
<tr>
<td style="text-align:left"><code>rmdir</code></td>
<td style="text-align:left"><code>rmdir &lt;目录&gt;</code></td>
<td style="text-align:left">删除空目录</td>
</tr>
<tr>
<td style="text-align:left"><code>touch</code></td>
<td style="text-align:left"><code>touch &lt;文件&gt;</code></td>
<td style="text-align:left">创建空文件/更新时间戳</td>
</tr>
<tr>
<td style="text-align:left"><code>ln</code></td>
<td style="text-align:left"><code>ln -s &lt;源文件&gt; &lt;链接名&gt;</code></td>
<td style="text-align:left">创建链接 (软链需加 -s)</td>
</tr>
<tr>
<td style="text-align:left"><code>readlink</code></td>
<td style="text-align:left"><code>readlink -f &lt;链接&gt;</code></td>
<td style="text-align:left">获取符号链接的真实路径</td>
</tr>
<tr>
<td style="text-align:left"><code>stat</code></td>
<td style="text-align:left"><code>stat &lt;文件&gt;</code></td>
<td style="text-align:left">显示文件详细状态信息</td>
</tr>
<tr>
<td style="text-align:left"><code>file</code></td>
<td style="text-align:left"><code>file &lt;文件&gt;</code></td>
<td style="text-align:left">识别文件类型</td>
</tr>
<tr>
<td style="text-align:left"><code>basename</code></td>
<td style="text-align:left"><code>basename &lt;路径&gt; [后缀]</code></td>
<td style="text-align:left">获取文件名部分</td>
</tr>
<tr>
<td style="text-align:left"><code>dirname</code></td>
<td style="text-align:left"><code>dirname &lt;路径&gt;</code></td>
<td style="text-align:left">获取目录路径部分</td>
</tr>
</tbody>
</table>
<h3>2.3 文本处理与流操作 (Coreutils - Text)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>cat</code></td>
<td style="text-align:left"><code>cat [文件]</code></td>
<td style="text-align:left">连接并打印内容</td>
</tr>
<tr>
<td style="text-align:left"><code>tac</code></td>
<td style="text-align:left"><code>tac [文件]</code></td>
<td style="text-align:left">反向打印内容</td>
</tr>
<tr>
<td style="text-align:left"><code>head</code></td>
<td style="text-align:left"><code>head -n &lt;行数&gt; [文件]</code></td>
<td style="text-align:left">输出开头部分</td>
</tr>
<tr>
<td style="text-align:left"><code>tail</code></td>
<td style="text-align:left"><code>tail -f [文件]</code></td>
<td style="text-align:left">实时输出结尾部分</td>
</tr>
<tr>
<td style="text-align:left"><code>more</code></td>
<td style="text-align:left"><code>more [文件]</code></td>
<td style="text-align:left">分页显示</td>
</tr>
<tr>
<td style="text-align:left"><code>less</code></td>
<td style="text-align:left"><code>less [文件]</code></td>
<td style="text-align:left">高级分页显示</td>
</tr>
<tr>
<td style="text-align:left"><code>cut</code></td>
<td style="text-align:left"><code>cut -d&lt;分隔符&gt; -f&lt;列&gt; [文件]</code></td>
<td style="text-align:left">按列提取文本</td>
</tr>
<tr>
<td style="text-align:left"><code>sort</code></td>
<td style="text-align:left"><code>sort [选项] [文件]</code></td>
<td style="text-align:left">排序</td>
</tr>
<tr>
<td style="text-align:left"><code>uniq</code></td>
<td style="text-align:left"><code>uniq [选项] [文件]</code></td>
<td style="text-align:left">去除相邻重复行</td>
</tr>
<tr>
<td style="text-align:left"><code>wc</code></td>
<td style="text-align:left"><code>wc -lwn [文件]</code></td>
<td style="text-align:left">统计行/词/字节数</td>
</tr>
<tr>
<td style="text-align:left"><code>tr</code></td>
<td style="text-align:left"><code>tr &lt;字符集1&gt; &lt;字符集2&gt;</code></td>
<td style="text-align:left">替换或删除字符</td>
</tr>
<tr>
<td style="text-align:left"><code>tee</code></td>
<td style="text-align:left"><code>command | tee &lt;文件&gt;</code></td>
<td style="text-align:left">双向重定向 (屏幕+文件)</td>
</tr>
<tr>
<td style="text-align:left"><code>grep</code></td>
<td style="text-align:left"><code>grep -r &lt;文本&gt; &lt;路径&gt;</code></td>
<td style="text-align:left">递归搜索文本</td>
</tr>
<tr>
<td style="text-align:left"><code>sed</code></td>
<td style="text-align:left"><code>sed 's/旧/新/g' &lt;文件&gt;</code></td>
<td style="text-align:left">流编辑器</td>
</tr>
<tr>
<td style="text-align:left"><code>awk</code></td>
<td style="text-align:left"><code>awk '{print $1}' &lt;文件&gt;</code></td>
<td style="text-align:left">文本分析工具</td>
</tr>
</tbody>
</table>
<h3>2.4 用户、权限与组 (User &amp; Permissions)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>chmod</code></td>
<td style="text-align:left"><code>chmod &lt;755|+x&gt; &lt;文件&gt;</code></td>
<td style="text-align:left">改变权限</td>
</tr>
<tr>
<td style="text-align:left"><code>chown</code></td>
<td style="text-align:left"><code>chown &lt;用户&gt;:&lt;组&gt; &lt;文件&gt;</code></td>
<td style="text-align:left">改变所有者</td>
</tr>
<tr>
<td style="text-align:left"><code>umask</code></td>
<td style="text-align:left"><code>umask [模式]</code></td>
<td style="text-align:left">设置新建文件的默认权限掩码</td>
</tr>
<tr>
<td style="text-align:left"><code>id</code></td>
<td style="text-align:left"><code>id [用户]</code></td>
<td style="text-align:left">显示用户ID信息</td>
</tr>
<tr>
<td style="text-align:left"><code>who</code></td>
<td style="text-align:left"><code>who</code></td>
<td style="text-align:left">显示已登录用户</td>
</tr>
<tr>
<td style="text-align:left"><code>w</code></td>
<td style="text-align:left"><code>w</code></td>
<td style="text-align:left">显示用户及活动</td>
</tr>
<tr>
<td style="text-align:left"><code>su</code></td>
<td style="text-align:left"><code>su - [用户]</code></td>
<td style="text-align:left">切换用户身份</td>
</tr>
<tr>
<td style="text-align:left"><code>passwd</code></td>
<td style="text-align:left"><code>passwd [用户]</code></td>
<td style="text-align:left">修改密码</td>
</tr>
<tr>
<td style="text-align:left"><code>useradd</code></td>
<td style="text-align:left"><code>useradd [选项] &lt;用户&gt;</code></td>
<td style="text-align:left">创建新用户 (底层)</td>
</tr>
<tr>
<td style="text-align:left"><code>userdel</code></td>
<td style="text-align:left"><code>userdel -r &lt;用户&gt;</code></td>
<td style="text-align:left">删除用户</td>
</tr>
<tr>
<td style="text-align:left"><code>groupadd</code></td>
<td style="text-align:left"><code>groupadd &lt;组名&gt;</code></td>
<td style="text-align:left">创建新组</td>
</tr>
</tbody>
</table>
<h3>2.5 进程管理 (Process)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ps</code></td>
<td style="text-align:left"><code>ps aux</code></td>
<td style="text-align:left">进程快照</td>
</tr>
<tr>
<td style="text-align:left"><code>top</code></td>
<td style="text-align:left"><code>top</code></td>
<td style="text-align:left">实时进程监控</td>
</tr>
<tr>
<td style="text-align:left"><code>kill</code></td>
<td style="text-align:left"><code>kill -9 &lt;PID&gt;</code></td>
<td style="text-align:left">发送信号 (强制杀死)</td>
</tr>
<tr>
<td style="text-align:left"><code>pkill</code></td>
<td style="text-align:left"><code>pkill &lt;进程名&gt;</code></td>
<td style="text-align:left">按名称杀死进程</td>
</tr>
<tr>
<td style="text-align:left"><code>nice</code></td>
<td style="text-align:left"><code>nice -n &lt;值&gt; &lt;命令&gt;</code></td>
<td style="text-align:left">设置进程优先级运行</td>
</tr>
<tr>
<td style="text-align:left"><code>nohup</code></td>
<td style="text-align:left"><code>nohup &lt;命令&gt; &amp;</code></td>
<td style="text-align:left">后台运行且忽略挂起信号</td>
</tr>
<tr>
<td style="text-align:left"><code>watch</code></td>
<td style="text-align:left"><code>watch -n &lt;秒&gt; &lt;命令&gt;</code></td>
<td style="text-align:left">周期性执行命令</td>
</tr>
</tbody>
</table>
<h3>2.6 系统信息与内核 (System &amp; Kernel)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>uname</code></td>
<td style="text-align:left"><code>uname -a</code></td>
<td style="text-align:left">显示内核系统信息</td>
</tr>
<tr>
<td style="text-align:left"><code>dmesg</code></td>
<td style="text-align:left"><code>dmesg | grep &lt;关键词&gt;</code></td>
<td style="text-align:left">查看内核环形缓冲日志</td>
</tr>
<tr>
<td style="text-align:left"><code>uptime</code></td>
<td style="text-align:left"><code>uptime</code></td>
<td style="text-align:left">显示负载和运行时间</td>
</tr>
<tr>
<td style="text-align:left"><code>date</code></td>
<td style="text-align:left"><code>date &quot;+%Y-%m-%d&quot;</code></td>
<td style="text-align:left">显示/设置时间</td>
</tr>
<tr>
<td style="text-align:left"><code>free</code></td>
<td style="text-align:left"><code>free -h</code></td>
<td style="text-align:left">查看内存使用情况</td>
</tr>
<tr>
<td style="text-align:left"><code>lscpu</code></td>
<td style="text-align:left"><code>lscpu</code></td>
<td style="text-align:left">查看CPU架构详情</td>
</tr>
<tr>
<td style="text-align:left"><code>reboot</code></td>
<td style="text-align:left"><code>reboot</code></td>
<td style="text-align:left">重启系统</td>
</tr>
</tbody>
</table>
<h3>2.7 磁盘与文件系统 (Storage)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>df</code></td>
<td style="text-align:left"><code>df -h</code></td>
<td style="text-align:left">查看磁盘空间</td>
</tr>
<tr>
<td style="text-align:left"><code>du</code></td>
<td style="text-align:left"><code>du -sh &lt;目录&gt;</code></td>
<td style="text-align:left">查看目录占用大小</td>
</tr>
<tr>
<td style="text-align:left"><code>lsblk</code></td>
<td style="text-align:left"><code>lsblk</code></td>
<td style="text-align:left">列出块设备</td>
</tr>
<tr>
<td style="text-align:left"><code>mount</code></td>
<td style="text-align:left"><code>mount &lt;设备&gt; &lt;挂载点&gt;</code></td>
<td style="text-align:left">挂载</td>
</tr>
<tr>
<td style="text-align:left"><code>umount</code></td>
<td style="text-align:left"><code>umount &lt;挂载点&gt;</code></td>
<td style="text-align:left">卸载</td>
</tr>
<tr>
<td style="text-align:left"><code>fdisk</code></td>
<td style="text-align:left"><code>fdisk &lt;设备&gt;</code></td>
<td style="text-align:left">磁盘分区工具</td>
</tr>
<tr>
<td style="text-align:left"><code>mkfs</code></td>
<td style="text-align:left"><code>mkfs.ext4 &lt;设备&gt;</code></td>
<td style="text-align:left">格式化文件系统</td>
</tr>
<tr>
<td style="text-align:left"><code>sync</code></td>
<td style="text-align:left"><code>sync</code></td>
<td style="text-align:left">强制刷写缓存到磁盘</td>
</tr>
</tbody>
</table>
<h3>2.8 网络基础 (Network - iproute2)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ip</code></td>
<td style="text-align:left"><code>ip addr show</code></td>
<td style="text-align:left">显示IP地址</td>
</tr>
<tr>
<td style="text-align:left"><code>ip</code></td>
<td style="text-align:left"><code>ip route show</code></td>
<td style="text-align:left">显示路由表</td>
</tr>
<tr>
<td style="text-align:left"><code>ip</code></td>
<td style="text-align:left"><code>ip link set &lt;设备&gt; up</code></td>
<td style="text-align:left">启用网卡</td>
</tr>
<tr>
<td style="text-align:left"><code>ss</code></td>
<td style="text-align:left"><code>ss -tuln</code></td>
<td style="text-align:left">查看监听端口</td>
</tr>
<tr>
<td style="text-align:left"><code>ping</code></td>
<td style="text-align:left"><code>ping &lt;IP/域名&gt;</code></td>
<td style="text-align:left">测试连通性</td>
</tr>
</tbody>
</table>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Debian 12 指令大全</title>
      <link>https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/002debian12</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/002debian12</guid>
    <pubDate>Sun, 23 Nov 2025 23:15:00 GMT</pubDate>
    <description>1. 常用核心指令 高频精简版 | 指令 | 语法结构 | 描述 | | :</description>
      <content:encoded><![CDATA[<h1>Debian 12 (Bookworm) 指令大全</h1>
<h2>1. 常用核心指令 (高频精简版)</h2>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>apt update</strong></td>
<td style="text-align:left"><code>apt update</code></td>
<td style="text-align:left">更新软件包索引 (安装前必做)</td>
</tr>
<tr>
<td style="text-align:left"><strong>apt upgrade</strong></td>
<td style="text-align:left"><code>apt upgrade</code></td>
<td style="text-align:left">升级所有已安装的软件包</td>
</tr>
<tr>
<td style="text-align:left"><strong>apt install</strong></td>
<td style="text-align:left"><code>apt install &lt;包名&gt;</code></td>
<td style="text-align:left">安装新的软件包</td>
</tr>
<tr>
<td style="text-align:left"><strong>apt remove</strong></td>
<td style="text-align:left"><code>apt remove &lt;包名&gt;</code></td>
<td style="text-align:left">卸载软件 (保留配置文件)</td>
</tr>
<tr>
<td style="text-align:left"><strong>systemctl</strong></td>
<td style="text-align:left"><code>systemctl status &lt;服务&gt;</code></td>
<td style="text-align:left">查看服务运行状态</td>
</tr>
<tr>
<td style="text-align:left"><strong>journalctl</strong></td>
<td style="text-align:left"><code>journalctl -xe</code></td>
<td style="text-align:left">查看最近的系统错误日志</td>
</tr>
<tr>
<td style="text-align:left"><strong>ip addr</strong></td>
<td style="text-align:left"><code>ip addr</code></td>
<td style="text-align:left">查看网卡与IP地址</td>
</tr>
<tr>
<td style="text-align:left"><strong>ss</strong></td>
<td style="text-align:left"><code>ss -tuln</code></td>
<td style="text-align:left">查看正在监听的端口</td>
</tr>
<tr>
<td style="text-align:left"><strong>su</strong></td>
<td style="text-align:left"><code>su -</code></td>
<td style="text-align:left">切换到 Root 用户环境</td>
</tr>
<tr>
<td style="text-align:left"><strong>nano</strong></td>
<td style="text-align:left"><code>nano &lt;文件&gt;</code></td>
<td style="text-align:left">编辑文本文件 (Debian 默认安装)</td>
</tr>
</tbody>
</table>
<hr>
<h2>2. Debian 12 全面指令 (分类速查)</h2>
<h3>2.1 高级包管理 (APT - Advanced Package Tool)</h3>
<p><em>Debian 软件包管理的核心前端。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>apt update</code></td>
<td style="text-align:left"><code>apt update</code></td>
<td style="text-align:left">同步 /etc/apt/sources.list 中的源</td>
</tr>
<tr>
<td style="text-align:left"><code>apt upgrade</code></td>
<td style="text-align:left"><code>apt upgrade</code></td>
<td style="text-align:left">安全升级软件包 (不删除现有包)</td>
</tr>
<tr>
<td style="text-align:left"><code>apt full-upgrade</code></td>
<td style="text-align:left"><code>apt full-upgrade</code></td>
<td style="text-align:left">全面升级 (可能移除冲突包以解决依赖)</td>
</tr>
<tr>
<td style="text-align:left"><code>apt install</code></td>
<td style="text-align:left"><code>apt install &lt;包名&gt;</code></td>
<td style="text-align:left">安装软件包</td>
</tr>
<tr>
<td style="text-align:left"><code>apt reinstall</code></td>
<td style="text-align:left"><code>apt reinstall &lt;包名&gt;</code></td>
<td style="text-align:left">重新安装 (修复文件损坏)</td>
</tr>
<tr>
<td style="text-align:left"><code>apt remove</code></td>
<td style="text-align:left"><code>apt remove &lt;包名&gt;</code></td>
<td style="text-align:left">卸载软件</td>
</tr>
<tr>
<td style="text-align:left"><code>apt purge</code></td>
<td style="text-align:left"><code>apt purge &lt;包名&gt;</code></td>
<td style="text-align:left">彻底卸载 (同时删除配置文件)</td>
</tr>
<tr>
<td style="text-align:left"><code>apt autoremove</code></td>
<td style="text-align:left"><code>apt autoremove</code></td>
<td style="text-align:left">自动清理不再被依赖的库文件</td>
</tr>
<tr>
<td style="text-align:left"><code>apt search</code></td>
<td style="text-align:left"><code>apt search &lt;关键词&gt;</code></td>
<td style="text-align:left">搜索软件源中的包</td>
</tr>
<tr>
<td style="text-align:left"><code>apt show</code></td>
<td style="text-align:left"><code>apt show &lt;包名&gt;</code></td>
<td style="text-align:left">显示软件包详细信息</td>
</tr>
<tr>
<td style="text-align:left"><code>apt list</code></td>
<td style="text-align:left"><code>apt list --installed</code></td>
<td style="text-align:left">列出已安装的包</td>
</tr>
<tr>
<td style="text-align:left"><code>apt edit-sources</code></td>
<td style="text-align:left"><code>apt edit-sources</code></td>
<td style="text-align:left">编辑软件源配置文件</td>
</tr>
</tbody>
</table>
<h3>2.2 底层包管理 (DPKG)</h3>
<p><em>用于管理本地 .deb 文件及配置。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>dpkg -i</code></td>
<td style="text-align:left"><code>dpkg -i &lt;文件.deb&gt;</code></td>
<td style="text-align:left">安装本地软件包</td>
</tr>
<tr>
<td style="text-align:left"><code>dpkg -r</code></td>
<td style="text-align:left"><code>dpkg -r &lt;包名&gt;</code></td>
<td style="text-align:left">移除软件包</td>
</tr>
<tr>
<td style="text-align:left"><code>dpkg -l</code></td>
<td style="text-align:left"><code>dpkg -l [关键词]</code></td>
<td style="text-align:left">列出系统内已安装的包</td>
</tr>
<tr>
<td style="text-align:left"><code>dpkg -L</code></td>
<td style="text-align:left"><code>dpkg -L &lt;包名&gt;</code></td>
<td style="text-align:left">查看软件包安装了哪些文件</td>
</tr>
<tr>
<td style="text-align:left"><code>dpkg -S</code></td>
<td style="text-align:left"><code>dpkg -S &lt;文件路径&gt;</code></td>
<td style="text-align:left">反查文件属于哪个软件包</td>
</tr>
<tr>
<td style="text-align:left"><code>dpkg-reconfigure</code></td>
<td style="text-align:left"><code>dpkg-reconfigure &lt;包名&gt;</code></td>
<td style="text-align:left">重新配置已安装的包 (Debian 特色)</td>
</tr>
</tbody>
</table>
<h3>2.3 系统服务管理 (Systemd)</h3>
<p><em>Debian 12 的初始化系统。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>systemctl start</code></td>
<td style="text-align:left"><code>systemctl start &lt;服务&gt;</code></td>
<td style="text-align:left">启动服务</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl stop</code></td>
<td style="text-align:left"><code>systemctl stop &lt;服务&gt;</code></td>
<td style="text-align:left">停止服务</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl restart</code></td>
<td style="text-align:left"><code>systemctl restart &lt;服务&gt;</code></td>
<td style="text-align:left">重启服务</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl reload</code></td>
<td style="text-align:left"><code>systemctl reload &lt;服务&gt;</code></td>
<td style="text-align:left">重载配置 (不中断连接)</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl status</code></td>
<td style="text-align:left"><code>systemctl status &lt;服务&gt;</code></td>
<td style="text-align:left">查看状态</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl enable</code></td>
<td style="text-align:left"><code>systemctl enable &lt;服务&gt;</code></td>
<td style="text-align:left">设置开机自启</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl disable</code></td>
<td style="text-align:left"><code>systemctl disable &lt;服务&gt;</code></td>
<td style="text-align:left">禁止开机自启</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl mask</code></td>
<td style="text-align:left"><code>systemctl mask &lt;服务&gt;</code></td>
<td style="text-align:left">彻底注销服务 (防止被唤醒)</td>
</tr>
</tbody>
</table>
<h3>2.4 日志与时间管理 (System Specifics)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>journalctl</code></td>
<td style="text-align:left"><code>journalctl -u &lt;服务&gt;</code></td>
<td style="text-align:left">查看指定服务的日志</td>
</tr>
<tr>
<td style="text-align:left"><code>journalctl</code></td>
<td style="text-align:left"><code>journalctl -f</code></td>
<td style="text-align:left">实时滚动查看最新日志</td>
</tr>
<tr>
<td style="text-align:left"><code>journalctl</code></td>
<td style="text-align:left"><code>journalctl --vacuum-time=7d</code></td>
<td style="text-align:left">清理7天前的日志</td>
</tr>
<tr>
<td style="text-align:left"><code>timedatectl</code></td>
<td style="text-align:left"><code>timedatectl set-timezone &lt;时区&gt;</code></td>
<td style="text-align:left">设置系统时区 (如 Asia/Shanghai)</td>
</tr>
<tr>
<td style="text-align:left"><code>localectl</code></td>
<td style="text-align:left"><code>localectl set-locale LANG=&lt;语言&gt;</code></td>
<td style="text-align:left">设置系统语言环境</td>
</tr>
<tr>
<td style="text-align:left"><code>hostnamectl</code></td>
<td style="text-align:left"><code>hostnamectl set-hostname &lt;名字&gt;</code></td>
<td style="text-align:left">修改主机名</td>
</tr>
</tbody>
</table>
<h3>2.5 网络管理 (IPRoute2)</h3>
<p><em>Debian 12 默认不包含 ifconfig/netstat，推荐使用以下指令。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ip addr</code></td>
<td style="text-align:left"><code>ip addr show</code></td>
<td style="text-align:left">显示 IP 地址</td>
</tr>
<tr>
<td style="text-align:left"><code>ip link</code></td>
<td style="text-align:left"><code>ip link set &lt;网卡&gt; up/down</code></td>
<td style="text-align:left">启用/禁用网卡</td>
</tr>
<tr>
<td style="text-align:left"><code>ip route</code></td>
<td style="text-align:left"><code>ip route show</code></td>
<td style="text-align:left">显示路由表</td>
</tr>
<tr>
<td style="text-align:left"><code>ip neigh</code></td>
<td style="text-align:left"><code>ip neigh</code></td>
<td style="text-align:left">显示 ARP 缓存表</td>
</tr>
<tr>
<td style="text-align:left"><code>ss</code></td>
<td style="text-align:left"><code>ss -tuln</code></td>
<td style="text-align:left">查看 TCP/UDP 监听端口</td>
</tr>
<tr>
<td style="text-align:left"><code>ss</code></td>
<td style="text-align:left"><code>ss -ta</code></td>
<td style="text-align:left">查看所有建立的 TCP 连接</td>
</tr>
</tbody>
</table>
<h3>2.6 用户与权限 (User &amp; Group)</h3>
<p><em>包含 Debian 专有的友好脚本封装。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>adduser</code></td>
<td style="text-align:left"><code>adduser &lt;用户名&gt;</code></td>
<td style="text-align:left">交互式创建用户 (推荐)</td>
</tr>
<tr>
<td style="text-align:left"><code>deluser</code></td>
<td style="text-align:left"><code>deluser --remove-home &lt;用户&gt;</code></td>
<td style="text-align:left">删除用户及主目录</td>
</tr>
<tr>
<td style="text-align:left"><code>addgroup</code></td>
<td style="text-align:left"><code>addgroup &lt;组名&gt;</code></td>
<td style="text-align:left">创建用户组</td>
</tr>
<tr>
<td style="text-align:left"><code>usermod</code></td>
<td style="text-align:left"><code>usermod -aG &lt;组&gt; &lt;用户&gt;</code></td>
<td style="text-align:left">将用户加入组 (如 sudo 组)</td>
</tr>
<tr>
<td style="text-align:left"><code>passwd</code></td>
<td style="text-align:left"><code>passwd &lt;用户&gt;</code></td>
<td style="text-align:left">修改密码</td>
</tr>
<tr>
<td style="text-align:left"><code>visudo</code></td>
<td style="text-align:left"><code>visudo</code></td>
<td style="text-align:left">安全编辑 /etc/sudoers</td>
</tr>
</tbody>
</table>
<h3>2.7 辅助工具与系统配置 (Helpers)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>tasksel</code></td>
<td style="text-align:left"><code>tasksel</code></td>
<td style="text-align:left">菜单化安装常见环境 (桌面/Web服务)</td>
</tr>
<tr>
<td style="text-align:left"><code>update-alternatives</code></td>
<td style="text-align:left"><code>update-alternatives --config &lt;命令&gt;</code></td>
<td style="text-align:left">切换软件默认版本 (如 Python/Java)</td>
</tr>
<tr>
<td style="text-align:left"><code>man</code></td>
<td style="text-align:left"><code>man &lt;命令&gt;</code></td>
<td style="text-align:left">查看详细手册</td>
</tr>
<tr>
<td style="text-align:left"><code>nft</code></td>
<td style="text-align:left"><code>nft list ruleset</code></td>
<td style="text-align:left">查看 nftables 防火墙规则 (原生)</td>
</tr>
<tr>
<td style="text-align:left"><code>shutdown</code></td>
<td style="text-align:left"><code>shutdown -h now</code></td>
<td style="text-align:left">立即关机</td>
</tr>
<tr>
<td style="text-align:left"><code>reboot</code></td>
<td style="text-align:left"><code>reboot</code></td>
<td style="text-align:left">重启系统</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>Debian 12 原生指令补全</title>
      <link>https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/002debian12fromlinux</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/002debian12fromlinux</guid>
    <pubDate>Sun, 23 Nov 2025 23:15:00 GMT</pubDate>
    <description>注 ：此处仅包含Debian12与Linux原生相比的差异指令，不含第三方应用。 Debian 12 专属指令 Base System 这些是 Debian 基础系统中特有的核心管理指令。 | 指令 | 语法结构 | 描述 | | :</description>
      <content:encoded><![CDATA[<h1>Debian 12 原生指令补全</h1>
<blockquote>
<p><strong>注</strong>：此处仅包含Debian12与Linux原生相比的差异指令，不含第三方应用。</p>
</blockquote>
<h2>Debian 12 专属指令 (Base System)</h2>
<p>这些是 Debian 基础系统中特有的核心管理指令。</p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>apt</strong></td>
<td style="text-align:left"><code>apt install &lt;包名&gt;</code></td>
<td style="text-align:left">现代化包管理 (安装)</td>
</tr>
<tr>
<td style="text-align:left"><strong>apt</strong></td>
<td style="text-align:left"><code>apt update</code></td>
<td style="text-align:left">刷新软件源列表</td>
</tr>
<tr>
<td style="text-align:left"><strong>apt</strong></td>
<td style="text-align:left"><code>apt purge &lt;包名&gt;</code></td>
<td style="text-align:left">彻底卸载 (含配置)</td>
</tr>
<tr>
<td style="text-align:left"><strong>dpkg</strong></td>
<td style="text-align:left"><code>dpkg -i &lt;文件.deb&gt;</code></td>
<td style="text-align:left">安装本地包文件</td>
</tr>
<tr>
<td style="text-align:left"><strong>systemctl</strong></td>
<td style="text-align:left"><code>systemctl start &lt;服务&gt;</code></td>
<td style="text-align:left">启动系统服务</td>
</tr>
<tr>
<td style="text-align:left"><strong>systemctl</strong></td>
<td style="text-align:left"><code>systemctl enable &lt;服务&gt;</code></td>
<td style="text-align:left">设置开机自启</td>
</tr>
<tr>
<td style="text-align:left"><strong>journalctl</strong></td>
<td style="text-align:left"><code>journalctl -u &lt;服务&gt;</code></td>
<td style="text-align:left">查看特定服务日志</td>
</tr>
<tr>
<td style="text-align:left"><strong>adduser</strong></td>
<td style="text-align:left"><code>adduser &lt;用户名&gt;</code></td>
<td style="text-align:left">交互式添加用户 (Debian 脚本)</td>
</tr>
<tr>
<td style="text-align:left"><strong>tasksel</strong></td>
<td style="text-align:left"><code>tasksel</code></td>
<td style="text-align:left">菜单化选择任务集</td>
</tr>
<tr>
<td style="text-align:left"><strong>dpkg-reconfigure</strong></td>
<td style="text-align:left"><code>dpkg-reconfigure &lt;包名&gt;</code></td>
<td style="text-align:left">重新配置已安装软件</td>
</tr>
</tbody>
</table>
<hr>
<h2>⚠️ Debian 12 中“失效/变更”的 Linux 指令</h2>
<p>在 Debian 12 (Bookworm) 最小化安装中，以下传统指令可能无法使用。</p>
<table>
<thead>
<tr>
<th style="text-align:left">传统 Linux 指令</th>
<th style="text-align:left">Debian 12 现状</th>
<th style="text-align:left">替代/新指令语法</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>ifconfig</strong></td>
<td style="text-align:left">被弃用 (未安装)</td>
<td style="text-align:left"><code>ip addr</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>netstat</strong></td>
<td style="text-align:left">被弃用 (未安装)</td>
<td style="text-align:left"><code>ss -tuln</code> (查看端口)</td>
</tr>
<tr>
<td style="text-align:left"><strong>route</strong></td>
<td style="text-align:left">被弃用 (未安装)</td>
<td style="text-align:left"><code>ip route</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>pip</strong></td>
<td style="text-align:left">被限制 (PEP 668)</td>
<td style="text-align:left"><code>apt install python3-&lt;库&gt;</code> 或 <code>python3 -m venv &lt;目录&gt;</code></td>
</tr>
<tr>
<td style="text-align:left"><strong>syslog (文件)</strong></td>
<td style="text-align:left">不存在 (<code>rsyslog</code> 缺省)</td>
<td style="text-align:left"><code>journalctl</code> (直接查看日志库)</td>
</tr>
<tr>
<td style="text-align:left"><strong>scp</strong></td>
<td style="text-align:left">协议变更 (SFTP)</td>
<td style="text-align:left"><code>scp -O &lt;源&gt; &lt;目标&gt;</code> (若需强制旧协议)</td>
</tr>
<tr>
<td style="text-align:left"><strong>rc.local</strong></td>
<td style="text-align:left">不自动运行</td>
<td style="text-align:left">需编写 <code>systemd</code> 服务单元</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu 22.04 LTS 指令大全</title>
      <link>https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/003ubuntu22</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/003ubuntu22</guid>
    <pubDate>Sun, 23 Nov 2025 23:15:00 GMT</pubDate>
    <description>1. 常用核心指令 高频精简版 | 指令 | 语法结构 | 描述 | | :</description>
      <content:encoded><![CDATA[<h1>Ubuntu 22.04 LTS 指令大全</h1>
<h2>1. 常用核心指令 (高频精简版)</h2>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>sudo</strong></td>
<td style="text-align:left"><code>sudo &lt;命令&gt;</code></td>
<td style="text-align:left">以管理员权限执行命令</td>
</tr>
<tr>
<td style="text-align:left"><strong>apt update</strong></td>
<td style="text-align:left"><code>sudo apt update</code></td>
<td style="text-align:left">更新软件源索引</td>
</tr>
<tr>
<td style="text-align:left"><strong>apt upgrade</strong></td>
<td style="text-align:left"><code>sudo apt upgrade</code></td>
<td style="text-align:left">升级已安装的软件包</td>
</tr>
<tr>
<td style="text-align:left"><strong>snap install</strong></td>
<td style="text-align:left"><code>sudo snap install &lt;包名&gt;</code></td>
<td style="text-align:left">安装 Snap 应用 (Ubuntu 特色)</td>
</tr>
<tr>
<td style="text-align:left"><strong>ufw</strong></td>
<td style="text-align:left"><code>sudo ufw allow &lt;端口&gt;</code></td>
<td style="text-align:left">开放防火墙端口</td>
</tr>
<tr>
<td style="text-align:left"><strong>netplan</strong></td>
<td style="text-align:left"><code>sudo netplan apply</code></td>
<td style="text-align:left">应用网络配置更改</td>
</tr>
<tr>
<td style="text-align:left"><strong>systemctl</strong></td>
<td style="text-align:left"><code>sudo systemctl restart &lt;服务&gt;</code></td>
<td style="text-align:left">重启系统服务</td>
</tr>
<tr>
<td style="text-align:left"><strong>ip addr</strong></td>
<td style="text-align:left"><code>ip addr</code></td>
<td style="text-align:left">查看 IP 地址</td>
</tr>
<tr>
<td style="text-align:left"><strong>ssh</strong></td>
<td style="text-align:left"><code>ssh &lt;用户&gt;@&lt;IP&gt;</code></td>
<td style="text-align:left">远程登录</td>
</tr>
<tr>
<td style="text-align:left"><strong>reboot</strong></td>
<td style="text-align:left"><code>sudo reboot</code></td>
<td style="text-align:left">重启系统</td>
</tr>
</tbody>
</table>
<hr>
<h2>2. Ubuntu 22.04 全面指令 (分类速查)</h2>
<h3>2.1 高级包管理 (APT &amp; PPA)</h3>
<p><em>Ubuntu 的传统包管理，支持 PPA 第三方源。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>apt update</code></td>
<td style="text-align:left"><code>sudo apt update</code></td>
<td style="text-align:left">刷新软件源列表</td>
</tr>
<tr>
<td style="text-align:left"><code>apt upgrade</code></td>
<td style="text-align:left"><code>sudo apt upgrade</code></td>
<td style="text-align:left">升级所有软件包</td>
</tr>
<tr>
<td style="text-align:left"><code>apt install</code></td>
<td style="text-align:left"><code>sudo apt install &lt;包名&gt;</code></td>
<td style="text-align:left">安装软件包</td>
</tr>
<tr>
<td style="text-align:left"><code>apt remove</code></td>
<td style="text-align:left"><code>sudo apt remove &lt;包名&gt;</code></td>
<td style="text-align:left">卸载软件 (保留配置)</td>
</tr>
<tr>
<td style="text-align:left"><code>apt purge</code></td>
<td style="text-align:left"><code>sudo apt purge &lt;包名&gt;</code></td>
<td style="text-align:left">彻底卸载 (删除配置)</td>
</tr>
<tr>
<td style="text-align:left"><code>apt autoremove</code></td>
<td style="text-align:left"><code>sudo apt autoremove</code></td>
<td style="text-align:left">清理无用的依赖包</td>
</tr>
<tr>
<td style="text-align:left"><code>apt search</code></td>
<td style="text-align:left"><code>apt search &lt;关键词&gt;</code></td>
<td style="text-align:left">搜索软件包</td>
</tr>
<tr>
<td style="text-align:left"><code>add-apt-repository</code></td>
<td style="text-align:left"><code>sudo add-apt-repository &lt;PPA源&gt;</code></td>
<td style="text-align:left">添加第三方 PPA 仓库</td>
</tr>
<tr>
<td style="text-align:left"><code>add-apt-repository</code></td>
<td style="text-align:left"><code>sudo add-apt-repository -r &lt;PPA源&gt;</code></td>
<td style="text-align:left">移除 PPA 仓库</td>
</tr>
<tr>
<td style="text-align:left"><code>apt-mark hold</code></td>
<td style="text-align:left"><code>sudo apt-mark hold &lt;包名&gt;</code></td>
<td style="text-align:left">锁定版本禁止自动升级</td>
</tr>
</tbody>
</table>
<h3>2.2 Snap 包管理 (Snap Store)</h3>
<p><em>Ubuntu 核心集成的容器化包管理系统。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>snap install</code></td>
<td style="text-align:left"><code>sudo snap install &lt;包名&gt;</code></td>
<td style="text-align:left">安装应用</td>
</tr>
<tr>
<td style="text-align:left"><code>snap install</code></td>
<td style="text-align:left"><code>sudo snap install &lt;包&gt; --classic</code></td>
<td style="text-align:left">安装需要经典模式权限的应用</td>
</tr>
<tr>
<td style="text-align:left"><code>snap remove</code></td>
<td style="text-align:left"><code>sudo snap remove &lt;包名&gt;</code></td>
<td style="text-align:left">卸载应用</td>
</tr>
<tr>
<td style="text-align:left"><code>snap refresh</code></td>
<td style="text-align:left"><code>sudo snap refresh</code></td>
<td style="text-align:left">更新所有 Snap 应用</td>
</tr>
<tr>
<td style="text-align:left"><code>snap list</code></td>
<td style="text-align:left"><code>snap list</code></td>
<td style="text-align:left">列出已安装的 Snap 应用</td>
</tr>
<tr>
<td style="text-align:left"><code>snap find</code></td>
<td style="text-align:left"><code>snap find &lt;关键词&gt;</code></td>
<td style="text-align:left">搜索商店中的应用</td>
</tr>
<tr>
<td style="text-align:left"><code>snap revert</code></td>
<td style="text-align:left"><code>sudo snap revert &lt;包名&gt;</code></td>
<td style="text-align:left">回滚应用到上一个版本</td>
</tr>
<tr>
<td style="text-align:left"><code>snap services</code></td>
<td style="text-align:left"><code>snap services</code></td>
<td style="text-align:left">查看 Snap 应用的服务状态</td>
</tr>
</tbody>
</table>
<h3>2.3 网络配置 (Netplan)</h3>
<p><em>Ubuntu 18.04+ 标准的声明式网络配置工具。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>netplan apply</code></td>
<td style="text-align:left"><code>sudo netplan apply</code></td>
<td style="text-align:left">应用配置 (无需重启)</td>
</tr>
<tr>
<td style="text-align:left"><code>netplan try</code></td>
<td style="text-align:left"><code>sudo netplan try</code></td>
<td style="text-align:left">尝试配置，失败自动回滚 (安全)</td>
</tr>
<tr>
<td style="text-align:left"><code>netplan generate</code></td>
<td style="text-align:left"><code>sudo netplan generate</code></td>
<td style="text-align:left">生成后端配置文件</td>
</tr>
<tr>
<td style="text-align:left"><code>netplan ip</code></td>
<td style="text-align:left"><code>netplan ip leases &lt;接口&gt;</code></td>
<td style="text-align:left">查看 DHCP 租约详情</td>
</tr>
<tr>
<td style="text-align:left"><code>ip addr</code></td>
<td style="text-align:left"><code>ip addr show</code></td>
<td style="text-align:left">查看当前 IP 配置</td>
</tr>
<tr>
<td style="text-align:left"><code>resolvectl</code></td>
<td style="text-align:left"><code>resolvectl status</code></td>
<td style="text-align:left">查看 DNS 解析状态</td>
</tr>
</tbody>
</table>
<h3>2.4 防火墙管理 (UFW)</h3>
<p><em>Ubuntu 默认预装的简易防火墙配置工具。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ufw enable</code></td>
<td style="text-align:left"><code>sudo ufw enable</code></td>
<td style="text-align:left">启用防火墙</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw disable</code></td>
<td style="text-align:left"><code>sudo ufw disable</code></td>
<td style="text-align:left">禁用防火墙</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw allow</code></td>
<td style="text-align:left"><code>sudo ufw allow &lt;端口/服务&gt;</code></td>
<td style="text-align:left">允许入站连接 (如 22/tcp)</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw deny</code></td>
<td style="text-align:left"><code>sudo ufw deny &lt;端口&gt;</code></td>
<td style="text-align:left">拒绝入站连接</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw delete</code></td>
<td style="text-align:left"><code>sudo ufw delete allow &lt;端口&gt;</code></td>
<td style="text-align:left">删除某条规则</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw status</code></td>
<td style="text-align:left"><code>sudo ufw status numbered</code></td>
<td style="text-align:left">查看带编号的状态列表</td>
</tr>
<tr>
<td style="text-align:left"><code>ufw reload</code></td>
<td style="text-align:left"><code>sudo ufw reload</code></td>
<td style="text-align:left">重载防火墙配置</td>
</tr>
</tbody>
</table>
<h3>2.5 驱动与硬件管理 (Hardware)</h3>
<p><em>Ubuntu 特有的硬件支持工具。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ubuntu-drivers</code></td>
<td style="text-align:left"><code>ubuntu-drivers devices</code></td>
<td style="text-align:left">列出建议的专有驱动</td>
</tr>
<tr>
<td style="text-align:left"><code>ubuntu-drivers</code></td>
<td style="text-align:left"><code>ubuntu-drivers autoinstall</code></td>
<td style="text-align:left">自动安装推荐驱动</td>
</tr>
<tr>
<td style="text-align:left"><code>lshw</code></td>
<td style="text-align:left"><code>sudo lshw -short</code></td>
<td style="text-align:left">查看硬件列表简报</td>
</tr>
<tr>
<td style="text-align:left"><code>lsusb</code></td>
<td style="text-align:left"><code>lsusb</code></td>
<td style="text-align:left">查看 USB 设备</td>
</tr>
<tr>
<td style="text-align:left"><code>lspci</code></td>
<td style="text-align:left"><code>lspci</code></td>
<td style="text-align:left">查看 PCI 设备 (显卡/网卡)</td>
</tr>
</tbody>
</table>
<h3>2.6 系统维护与更新 (System Maint)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>do-release-upgrade</code></td>
<td style="text-align:left"><code>sudo do-release-upgrade</code></td>
<td style="text-align:left">升级到新版 Ubuntu (如 22.04-&gt;24.04)</td>
</tr>
<tr>
<td style="text-align:left"><code>pro</code></td>
<td style="text-align:left"><code>sudo pro attach &lt;token&gt;</code></td>
<td style="text-align:left">启用 Ubuntu Pro (ESM 更新)</td>
</tr>
<tr>
<td style="text-align:left"><code>lsb_release</code></td>
<td style="text-align:left"><code>lsb_release -a</code></td>
<td style="text-align:left">查看系统版本详情</td>
</tr>
<tr>
<td style="text-align:left"><code>shutdown</code></td>
<td style="text-align:left"><code>sudo shutdown -h now</code></td>
<td style="text-align:left">立即关机</td>
</tr>
<tr>
<td style="text-align:left"><code>reboot</code></td>
<td style="text-align:left"><code>sudo reboot</code></td>
<td style="text-align:left">重启系统</td>
</tr>
</tbody>
</table>
<h3>2.7 服务管理 (Systemd)</h3>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>systemctl start</code></td>
<td style="text-align:left"><code>sudo systemctl start &lt;服务&gt;</code></td>
<td style="text-align:left">启动服务</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl stop</code></td>
<td style="text-align:left"><code>sudo systemctl stop &lt;服务&gt;</code></td>
<td style="text-align:left">停止服务</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl restart</code></td>
<td style="text-align:left"><code>sudo systemctl restart &lt;服务&gt;</code></td>
<td style="text-align:left">重启服务</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl enable</code></td>
<td style="text-align:left"><code>sudo systemctl enable &lt;服务&gt;</code></td>
<td style="text-align:left">开机自启</td>
</tr>
<tr>
<td style="text-align:left"><code>systemctl status</code></td>
<td style="text-align:left"><code>systemctl status &lt;服务&gt;</code></td>
<td style="text-align:left">查看运行状态</td>
</tr>
<tr>
<td style="text-align:left"><code>journalctl</code></td>
<td style="text-align:left"><code>journalctl -u &lt;服务&gt; -f</code></td>
<td style="text-align:left">实时查看服务日志</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu 22.04 LTS 独有指令集</title>
      <link>https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/003ubuntu22fromdebian12</link>
      <guid isPermaLink="true">https://develata.me/knowledge/coding/Linux/%E7%B3%BB%E7%BB%9F/003ubuntu22fromdebian12</guid>
    <pubDate>Sun, 23 Nov 2025 23:15:00 GMT</pubDate>
    <description>注 ：此处重点列出 Ubuntu 22.04 引入的、区别于 Debian 12 和原生 Linux 内核的特色管理指令。 1. Ubuntu 核心专属指令 Unique Ecosystem 这些指令构成了 Ubuntu 区别于其他 Linux 发行版（尤其是 Debian）的核心体验。 1.1 Snap 包管理 Containerized Packages Ubuntu 强推的通用包格式，与系统隔离，包含依赖。Debian 默认不预装 Snap。 | 指令 | 语法结构 |</description>
      <content:encoded><![CDATA[<h1>Ubuntu 22.04 LTS 独有指令集</h1>
<blockquote>
<p><strong>注</strong>：此处重点列出 Ubuntu 22.04 引入的、区别于 Debian 12 和原生 Linux 内核的特色管理指令。</p>
</blockquote>
<h2>1. Ubuntu 核心专属指令 (Unique Ecosystem)</h2>
<p>这些指令构成了 Ubuntu 区别于其他 Linux 发行版（尤其是 Debian）的核心体验。</p>
<h3>1.1 Snap 包管理 (Containerized Packages)</h3>
<p><em>Ubuntu 强推的通用包格式，与系统隔离，包含依赖。Debian 默认不预装 Snap。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
<th style="text-align:left">与 Debian/Linux 差异</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>snap install</strong></td>
<td style="text-align:left"><code>snap install &lt;包名&gt; [--classic]</code></td>
<td style="text-align:left">安装应用 (支持沙盒/经典模式)</td>
<td style="text-align:left"><strong>独有</strong>。Debian 使用 apt 或 flatpak。</td>
</tr>
<tr>
<td style="text-align:left"><strong>snap refresh</strong></td>
<td style="text-align:left"><code>snap refresh</code></td>
<td style="text-align:left">更新所有 Snap 应用</td>
<td style="text-align:left"><strong>独有</strong>。独立于 APT 更新机制。</td>
</tr>
<tr>
<td style="text-align:left"><strong>snap list</strong></td>
<td style="text-align:left"><code>snap list</code></td>
<td style="text-align:left">列出已安装的 Snap 应用</td>
<td style="text-align:left"><strong>独有</strong>。</td>
</tr>
<tr>
<td style="text-align:left"><strong>snap revert</strong></td>
<td style="text-align:left"><code>snap revert &lt;包名&gt;</code></td>
<td style="text-align:left">回滚应用到上个版本</td>
<td style="text-align:left"><strong>独有</strong>。原生 Linux 无此一键回滚功能。</td>
</tr>
<tr>
<td style="text-align:left"><strong>snap switch</strong></td>
<td style="text-align:left"><code>snap switch --channel=&lt;分支&gt; &lt;包&gt;</code></td>
<td style="text-align:left">切换软件通道 (stable/beta/edge)</td>
<td style="text-align:left"><strong>独有</strong>。方便尝鲜开发版。</td>
</tr>
</tbody>
</table>
<h3>1.2 网络配置 (Netplan)</h3>
<p><em>Ubuntu 17.10+ 开始引入的声明式网络配置工具，取代了传统的 <code>ifupdown</code>。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
<th style="text-align:left">与 Debian/Linux 差异</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>netplan apply</strong></td>
<td style="text-align:left"><code>netplan apply</code></td>
<td style="text-align:left">应用 YAML 配置文件</td>
<td style="text-align:left"><strong>差异</strong>。Debian 默认读取 <code>/etc/network/interfaces</code>。</td>
</tr>
<tr>
<td style="text-align:left"><strong>netplan try</strong></td>
<td style="text-align:left"><code>netplan try</code></td>
<td style="text-align:left">尝试配置，失败自动回滚</td>
<td style="text-align:left"><strong>独有</strong>。防止配置错误导致失联的安全机制。</td>
</tr>
<tr>
<td style="text-align:left"><strong>netplan ip</strong></td>
<td style="text-align:left"><code>netplan ip leases &lt;接口&gt;</code></td>
<td style="text-align:left">查看 DHCP 租约信息</td>
<td style="text-align:left"><strong>差异</strong>。替代了 <code>dhclient</code> 的查看方式。</td>
</tr>
</tbody>
</table>
<h3>1.3 驱动与硬件 (Hardware Enablement)</h3>
<p><em>Ubuntu 特有的硬件驱动自动化管理工具。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
<th style="text-align:left">与 Debian/Linux 差异</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>ubuntu-drivers</strong></td>
<td style="text-align:left"><code>ubuntu-drivers devices</code></td>
<td style="text-align:left">识别硬件并推荐驱动</td>
<td style="text-align:left"><strong>独有</strong>。Debian 需手动修改源并查找驱动包。</td>
</tr>
<tr>
<td style="text-align:left"><strong>ubuntu-drivers</strong></td>
<td style="text-align:left"><code>ubuntu-drivers autoinstall</code></td>
<td style="text-align:left">自动安装推荐的闭源驱动</td>
<td style="text-align:left"><strong>独有</strong>。极大简化了显卡/网卡驱动安装。</td>
</tr>
<tr>
<td style="text-align:left"><strong>hwe-support</strong></td>
<td style="text-align:left"><code>hwe-support-status</code></td>
<td style="text-align:left">检查硬件启用(HWE)内核状态</td>
<td style="text-align:left"><strong>独有</strong>。针对 LTS 版特供的新内核支持检测。</td>
</tr>
</tbody>
</table>
<h3>1.4 系统维护与服务 (Maintenance)</h3>
<p><em>Ubuntu 商业化及易用性工具。</em></p>
<table>
<thead>
<tr>
<th style="text-align:left">指令</th>
<th style="text-align:left">语法结构</th>
<th style="text-align:left">描述</th>
<th style="text-align:left">与 Debian/Linux 差异</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>do-release-upgrade</strong></td>
<td style="text-align:left"><code>do-release-upgrade</code></td>
<td style="text-align:left">升级到下一个发行版</td>
<td style="text-align:left"><strong>差异</strong>。Debian 用户通常手动修改 <code>sources.list</code>。</td>
</tr>
<tr>
<td style="text-align:left"><strong>add-apt-repository</strong></td>
<td style="text-align:left"><code>add-apt-repository ppa:&lt;用户&gt;/&lt;库&gt;</code></td>
<td style="text-align:left">添加 PPA 软件源</td>
<td style="text-align:left"><strong>差异</strong>。Debian 虽可安装此工具，但官方不通过 PPA 分发软件。</td>
</tr>
<tr>
<td style="text-align:left"><strong>pro</strong> (旧称 ua)</td>
<td style="text-align:left"><code>pro attach &lt;token&gt;</code></td>
<td style="text-align:left">启用 Ubuntu Pro 服务</td>
<td style="text-align:left"><strong>独有</strong>。用于获取 ESM (扩展安全维护) 和实时内核补丁。</td>
</tr>
<tr>
<td style="text-align:left"><strong>pro</strong></td>
<td style="text-align:left"><code>pro status</code></td>
<td style="text-align:left">查看订阅服务状态</td>
<td style="text-align:left"><strong>独有</strong>。</td>
</tr>
</tbody>
</table>
<hr>
<h2>2. ⚡️ 差异对照表：Ubuntu 22.04 vs Debian 12 vs 原生 Linux</h2>
<p>这是你需要重点关注的部分，展示了在 Ubuntu 中必须改变的操作习惯。</p>
<table>
<thead>
<tr>
<th style="text-align:left">功能场景</th>
<th style="text-align:left"><strong>Ubuntu 22.04 LTS 指令</strong></th>
<th style="text-align:left"><strong>Debian 12 指令</strong></th>
<th style="text-align:left"><strong>原生 Linux / 旧习惯</strong></th>
<th style="text-align:left">差异说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>网络配置生效</strong></td>
<td style="text-align:left"><code>netplan apply</code></td>
<td style="text-align:left"><code>systemctl restart networking</code> <br> 或 <code>ifup &lt;接口&gt;</code></td>
<td style="text-align:left"><code>service network restart</code></td>
<td style="text-align:left">Ubuntu 配置文件是 YAML 格式，Debian 是文本格式。</td>
</tr>
<tr>
<td style="text-align:left"><strong>安装显卡驱动</strong></td>
<td style="text-align:left"><code>ubuntu-drivers autoinstall</code></td>
<td style="text-align:left"><code>apt install nvidia-driver</code> <br> (需先改源开启 non-free)</td>
<td style="text-align:left">手动编译或下载 <code>.run</code> 文件</td>
<td style="text-align:left">Ubuntu 全自动；Debian 半手动且严格区分自由软件。</td>
</tr>
<tr>
<td style="text-align:left"><strong>跨版本升级</strong></td>
<td style="text-align:left"><code>do-release-upgrade</code></td>
<td style="text-align:left">修改 <code>/etc/apt/sources.list</code> <br> 然后 <code>apt full-upgrade</code></td>
<td style="text-align:left">无统一标准</td>
<td style="text-align:left">Ubuntu 封装了升级脚本，更安全。</td>
</tr>
<tr>
<td style="text-align:left"><strong>防火墙</strong></td>
<td style="text-align:left"><code>ufw enable</code> (默认预装)</td>
<td style="text-align:left"><code>nft</code> (原生) 或需手装 <code>ufw</code></td>
<td style="text-align:left"><code>iptables</code> (旧) / <code>nftables</code></td>
<td style="text-align:left">Ubuntu 默认使用 UFW 简化防火墙，Debian 偏向底层 nftables。</td>
</tr>
<tr>
<td style="text-align:left"><strong>Root 权限</strong></td>
<td style="text-align:left"><code>sudo &lt;命令&gt;</code> (默认)</td>
<td style="text-align:left"><code>su -</code> (默认)</td>
<td style="text-align:left"><code>su</code></td>
<td style="text-align:left">Ubuntu 默认禁用 root 账户登录，强制 sudo；Debian 安装时可选。</td>
</tr>
<tr>
<td style="text-align:left"><strong>软件源管理</strong></td>
<td style="text-align:left"><code>add-apt-repository</code></td>
<td style="text-align:left">手动编辑 <code>/etc/apt/sources.list</code></td>
<td style="text-align:left">无</td>
<td style="text-align:left">Ubuntu 依赖 Launchpad PPA 生态。</td>
</tr>
<tr>
<td style="text-align:left"><strong>系统日志</strong></td>
<td style="text-align:left"><code>journalctl</code> (主要) <br> 保留了 <code>/var/log/syslog</code></td>
<td style="text-align:left"><code>journalctl</code> (唯一) <br> <strong>删除了</strong> <code>/var/log/syslog</code></td>
<td style="text-align:left"><code>syslogd</code></td>
<td style="text-align:left">Ubuntu 22.04 仍保留了文本日志文件兼容旧习，Debian 12 默认已删除。</td>
</tr>
<tr>
<td style="text-align:left"><strong>Python 环境</strong></td>
<td style="text-align:left"><code>python3</code> (受 PEP 668 限制)</td>
<td style="text-align:left"><code>python3</code> (受 PEP 668 限制)</td>
<td style="text-align:left"><code>pip install</code></td>
<td style="text-align:left">两者都限制了直接用 pip 安装全局包，必须用 <code>apt</code> 或 <code>venv</code>。</td>
</tr>
</tbody>
</table>
]]></content:encoded>
    </item>
  </channel>
</rss>
