用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/10CG/aether-plugin --skill aether-deploy命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Aether 集群集成规范速查 —— 四域 investigation-first hub。消费方项目在 **Aether 集群**上 手写 dev env / 测试配置 / 连接串时的规范速查点 (#185→#186→#241 同根因三次复发的知识层加固)。 **适用前提: 问题落在 Aether 集群 / Nomad / Consul / 内网 192.168.69.x 语境内。** 回答: "集群内服务连接该用 consul 名还是 IP"、"集群里的 postgres / redis / 内网服务怎么连"、 "集群内服务的 DATABASE_URL / REDIS_URL 该怎么写"、"连集群里的库该用 IP 还是 consul 名"、 "host volume 该注册几个节点 / volume 规范"、"Nomad 上 stateful 服务该怎么配 / 有状态服务 模板规范"、"集群里应用的 DB 密码 / 连接串密码该存哪"、"应用 secret 该存哪"、 "连接串密码能不能硬编码进 HCL"。 **不适用 (缺少集群语境就让位, 不要触发本 skill)**: 与 Aether 集群无关的通用数据库 / 连接串问题 —— 本地或第三方托管 DB 的驱动与客户端用法、连接参数排错、SQL 调优、ORM 配置。 这类问句里出现 "数据库怎么连" / "连接串" / "DATABASE_URL" 等字样**不构成触发条件**: 本 skill 的触发靠的是集群语境, 不是这些裸词。
Forgejo PAT (Personal Access Token) 凭据轮换工具 (Tier 1 / Aether #45)。 自动化 list / rotate / resume / cleanup 完整闭环, 含 atomic rollback + journal-based interrupt recovery + 24h grace + token fingerprint guard。 使用场景: "轮换 PAT", "rotate token", "PAT 即将过期", "doctor pat_age 报警", "registry-auth", "Forgejo token 过期", "凭据轮换", "renew PAT", "credential rotation", "rotation drill", "cleanup _OLD"
Aether 环境下 Forgejo 凭据的决策 / 诊断 / 轮换指南。回答"该用哪个 token"、 拆解人机两账号模型 (simonfish 人 / 10cg-ci-bot 机)、辨别 CF Access 与 forgejo PAT 两个凭据平面、诊断误导性 403 ("Only signed in user")、安全轮换 (先枚举全部 store)、 凭据卫生红线。深度内容指向 docs/guides/forgejo-token-map.md + .aether/pat-inventory.yaml。 使用场景: "该用哪个 forgejo token"、"which forgejo token"、"forgejo 401"、 "forgejo 403"、"Only signed in user"、"docker login forgejo"、"CF Access 403"、 "token rotation"、"凭据轮换"、"FORGEJO_TOKEN"、"forgejo credential"、 "人机账号"、"registry pull 401"、"docker push unauthorized"
基于 SOC 职业分类
正在显示 SKILL.md
| name | aether-deploy |
| description | 生产环境受控部署。从 dev 提升或部署指定版本到生产。 包含镜像验证、配置差异对比、部署确认、健康检查等步骤。 使用场景:"部署到生产"、"发布新版本"、"从 dev 提升到 prod" |
| argument-hint | <service> <version> |
| disable-model-invocation | false |
| user-invocable | true |
| allowed-tools | Bash, AskUserQuestion |
| dependencies | {"cli":{"required":true,"min_version":"0.7.0"}} |
版本: 0.4.0 | 更新: 2026-03-19 | 优先级: P1
⚠️ 此 Skill 需要 aether CLI
# 使用共享检测脚本
source "${CLAUDE_PLUGIN_ROOT}/scripts/cli-functions.sh"
require_aether_cli || exit 1
# 获取 CLI 路径
CLI=$(get_aether_cli)
/aether:rollback/aether:deploy my-project v1.2.3
提取:
my-projectv1.2.3镜像验证是部署安全门控,不可跳过。提供两种验证方式,按优先级尝试:
Primary: docker CLI
IMAGE="forgejo.10cg.pub/org/my-project:v1.2.3"
docker manifest inspect ${IMAGE}
Fallback: Registry v2 API (docker CLI 不可用时)
REGISTRY="forgejo.10cg.pub"
REPO="org/my-project"
TAG="v1.2.3"
curl -sf "https://${REGISTRY}/v2/${REPO}/manifests/${TAG}" \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json"
如需认证,先获取 token:
TOKEN=$(curl -sf "https://${REGISTRY}/v2/token?scope=repository:${REPO}:pull" | jq -r '.token')
curl -sf "https://${REGISTRY}/v2/${REPO}/manifests/${TAG}" \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
-H "Authorization: Bearer ${TOKEN}"
两种方式都失败时,必须 BLOCK 部署,不允许跳过。
当镜像验证失败时,不要仅报错终止 — 引导用户排查根因:
CI Pipeline 状态: 构建是否成功完成?
# 检查最近的 CI 构建状态 (Forgejo Actions)
curl -sf "https://${REGISTRY}/api/v1/repos/${REPO}/actions/runs?limit=5" \
-H "Authorization: token ${FORGEJO_TOKEN}" | jq '.[0] | {status, conclusion, created_at}'
Registry 认证: Token/凭据是否有效?
# 验证 registry 连通性
curl -sf "https://${REGISTRY}/v2/" && echo "Registry reachable" || echo "Registry unreachable"
网络问题: Cloudflare Access、代理、防火墙是否阻断?
诊断完成后,向用户报告根因并建议修复方案,不要跳过验证直接部署。
# 当前运行版本
curl -s "${NOMAD_ADDR}/v1/job/my-project" | jq -r '.TaskGroups[0].Tasks[0].Config.image'
输出:
部署确认
========
服务: my-project
当前版本: v1.2.2 (abc123)
目标版本: v1.2.3 (def456)
变更内容:
- 镜像: forgejo.10cg.pub/org/my-project:v1.2.2 → v1.2.3
确认部署到生产环境? [y/N]
使用 AskUserQuestion 获取确认。
# 更新 Job 镜像
# 方式 1: 修改 Job spec 并提交
# 方式 2: 使用 Nomad API 直接更新
curl -s -X POST "${NOMAD_ADDR}/v1/jobs" \
-d @<(cat deploy/nomad.hcl | sed "s|__IMAGE__|${IMAGE}|g" | nomad job run -output -)
# 轮询检查部署状态
while true; do
STATUS=$(curl -s "${NOMAD_ADDR}/v1/job/my-project/allocations" | jq '[.[] | select(.ClientStatus == "running")] | length')
if [ "$STATUS" -eq "$REPLICAS" ]; then
break
fi
sleep 5
done
# 检查 Consul 健康
curl -s "${CONSUL_HTTP_ADDR}/v1/health/service/my-project?passing" | jq 'length'
部署成功
========
服务: my-project
版本: v1.2.3
实例: 2/2 running
健康检查: all passing
Consul DNS: my-project.service.consul
latest 标签/aether:rollback执行前需要配置 Aether 集群入口,参考 /aether:setup。
# 1. 检查项目配置
if [ -f ".aether/config.yaml" ]; then
NOMAD_ADDR=$(yq '.cluster.nomad_addr' .aether/config.yaml)
CONSUL_HTTP_ADDR=$(yq '.cluster.consul_addr' .aether/config.yaml)
AETHER_REGISTRY=$(yq '.cluster.registry' .aether/config.yaml)
fi
# 2. 检查全局配置 (项目配置优先)
if [ -z "$NOMAD_ADDR" ] && [ -f "$HOME/.aether/config.yaml" ]; then
NOMAD_ADDR=$(yq '.cluster.nomad_addr' ~/.aether/config.yaml)
CONSUL_HTTP_ADDR=$(yq '.cluster.consul_addr' ~/.aether/config.yaml)
AETHER_REGISTRY=$(yq '.cluster.registry' ~/.aether/config.yaml)
fi
# 3. 未配置则提示
if [ -z "$NOMAD_ADDR" ]; then
echo "请先运行 /aether:setup 配置集群"
exit 1
fi