关于 linode
用于通过 linode-cli 创建和验证 Linode 基础设施的技能,面向运维人员,涵盖服务器与防火墙配置、SSH、清理以及 LKE 自动扩缩说明。
主要功能
- 01先收集部署参数
- 02检查 CLI、API 令牌和 SSH 配置
- 03创建 Linode 实例与防火墙
- 04验证 SSH 连接
- 05提供 LKE 自动扩缩说明
- 06说明删除与清理步骤
适用场景
- 01为后续服务部署 Linode 实例
- 02选择区域和服务器配置
- 03规划 LKE 集群节点自动扩缩
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ evolv3-ai/ vibe-skills --skill linode安装后在 Claude Code 中输入/linode确认已加载。
附带文件assets/env-templatereferences/OPERATIONS.md
详细介绍
Linode 基础设施
严重:密钥和 .env
- 切勿将有效的
.env文件或凭据存放在任何技能文件夹中。 .env.template文件只能放在技能中的assets/目录内。- 将有效密钥存放在
~/.admin/.env中,并从那里引用。
状态:可用于生产环境 | 依赖项:linode-cli、SSH 密钥对
导航
- 操作、故障排查、配置和成本概览:
references/OPERATIONS.md
步骤 0:收集所需信息(必须)
停下。在执行任何部署命令之前,向用户收集所有参数。
复制此清单并逐项确认:
Required Parameters:
- [ ] SERVER_NAME - Unique name for this server
- [ ] LINODE_REGION - Region (us-east, us-central, us-west, eu-west, ap-south, etc.)
- [ ] LINODE_TYPE - Linode type (see profiles below)
- [ ] SSH_KEY_LABEL - Label of SSH key in Linode
- [ ] SSH_KEY_PATH - Path to local SSH private key (default: ~/.ssh/id_rsa)
Deployment Purpose (determines recommended profile):
- [ ] Purpose: coolify / kasm / both / custom
coolify → g6-standard-2 ($36/mo)
kasm → g6-standard-4 ($72/mo)
both → g6-standard-8 ($144/mo)
custom → Ask for specific type
按用途推荐的配置:
| 用途 | 类型 | vCPU | RAM | 月费 |
|---|---|---|---|---|
| coolify | g6-standard-2 | 2 | 4GB | $36 |
| kasm | g6-standard-4 | 4 | 8GB | $72 |
| 两者 | g6-standard-8 | 8 | 16GB | $144 |
在确认所有参数之前,不要继续进行先决条件检查。
先决条件
使用此技能之前,请确认以下事项:
1. 已安装 Linode CLI
linode-cli --version
如果尚未安装,请使用以下命令安装:
# Python (pip) - Recommended
pip3 install linode-cli
# macOS (Homebrew)
brew install linode-cli
# Linux (pipx)
pipx install linode-cli
2. Linode 账户和 API 令牌
如果你没有 Linode 账户:
在此注册:https://www.linode.com/?r=YOUR_REFERRAL_CODE
披露:这是一个推荐链接。你将在 60 天内获得 $100 额度;技能作者在你消费 $25 后会获得 $25 账户额度。使用此链接有助于支持这些技能的开发。
获取 API 令牌:https://cloud.linode.com/profile/tokens
创建一个对 Linodes、Firewalls、NodeBalancers 等具有读取/写入权限的 Personal Access Token。
3. 已配置 linode-cli
linode-cli account view
如果出现错误,请使用以下命令进行配置:
# Interactive setup
linode-cli configure
# Or via environment variable
export LINODE_CLI_TOKEN="your_token_here"
linode-cli account view
4. SSH 密钥对
ls ~/.ssh/id_rsa.pub
如果尚未生成,请使用以下命令生成:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
5. 已将 SSH 密钥上传到 Linode
linode-cli sshkeys list
如果为空,请使用以下命令上传:
linode-cli sshkeys create --label "my-key" --ssh_key "$(cat ~/.ssh/id_rsa.pub)"
6. 测试身份验证
linode-cli regions list
如果失败:令牌可能无效或已过期。请创建新令牌。
服务配置
Coolify/Kasm 部署
| 配置 | Linode 类型 | vCPU | RAM | 磁盘 | 月费 |
|---|---|---|---|---|---|
coolify | g6-standard-2 | 2 | 4GB | 80GB | $36 |
kasm | g6-standard-4 | 4 | 8GB | 160GB | $72 |
both | g6-standard-8 | 8 | 16GB | 320GB | $144 |
专用 CPU(性能最佳)
| 配置 | Linode 类型 | vCPU | RAM | 磁盘 | 月费 |
|---|---|---|---|---|---|
dedicated-small | g6-dedicated-2 | 2 | 4GB | 80GB | $36 |
dedicated-medium | g6-dedicated-4 | 4 | 8GB | 160GB | $72 |
dedicated-large | g6-dedicated-8 | 8 | 16GB | 320GB | $144 |
高级套餐(更高性能)
| Linode 类型 | vCPU | RAM | 磁盘 | 月费 |
|---|---|---|---|---|
| g7-premium-2 | 2 | 4GB | 100GB | $43 |
| g7-premium-4 | 4 | 8GB | 200GB | $86 |
| g7-premium-8 | 8 | 16GB | 400GB | $172 |
部署步骤
步骤 1:设置环境变量
export LINODE_REGION="us-east" # See regions below
export LINODE_TYPE="g6-standard-2" # See profiles above
export LINODE_IMAGE="linode/ubuntu22.04"
export SERVER_NAME="my-server"
export SSH_KEY_LABEL="my-key"
区域选项
| 代码 | 位置 | 区域 |
|---|---|---|
us-east | Newark, NJ | 美国东部 |
us-central | Dallas, TX | 美国中部 |
us-west | Fremont, CA | 美国西部 |
us-southeast | Atlanta, GA | 美国东南部 |
us-ord | Chicago, IL | 美国中部 |
us-lax | Los Angeles, CA | 美国西部 |
us-mia | Miami, FL | 美国东南部 |
us-sea | Seattle, WA | 美国西北部 |
ca-central | Toronto, Canada | 加拿大 |
eu-west | London, UK | 英国 |
eu-central | Frankfurt, Germany | 德国 |
ap-south | Singapore | 亚洲 |
ap-northeast | Tokyo, Japan | 日本 |
ap-west | Mumbai, India | 印度 |
ap-southeast | Sydney, Australia | 澳大利亚 |
运行 linode-cli regions list 查看完整列表。
步骤 2:获取 SSH 密钥 ID
SSH_KEY_ID=$(linode-cli sshkeys list --label "$SSH_KEY_LABEL" --format id --text --no-headers)
echo "SSH Key ID: $SSH_KEY_ID"
# Verify
if [ -z "$SSH_KEY_ID" ]; then
echo "ERROR: SSH key '$SSH_KEY_LABEL' not found. Upload it first."
exit 1
fi
步骤 3:创建防火墙
# Create firewall
FIREWALL_ID=$(linode-cli firewalls create \
--label "my-firewall" \
--rules.inbound_policy DROP \
--rules.outbound_policy ACCEPT \
--format id --text --no-headers)
echo "Firewall ID: $FIREWALL_ID"
# Allow SSH
linode-cli firewalls rules-update "$FIREWALL_ID" \
--inbound '[
{"protocol":"TCP","ports":"22","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"80","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"443","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"8000","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"6001-6002","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"8443","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"3389","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"3000-4000","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"}
]' \
--inbound_policy DROP \
--outbound_policy ACCEPT
步骤 4:创建 Linode
LINODE_ID=$(linode-cli linodes create \
--region "$LINODE_REGION" \
--type "$LINODE_TYPE" \
--image "$LINODE_IMAGE" \
--label "$SERVER_NAME" \
--authorized_keys "$(cat ~/.ssh/id_rsa.pub)" \
--root_pass "$(openssl rand -base64 32)" \
--format id --text --no-headers)
echo "Linode ID: $LINODE_ID"
步骤 5:将防火墙应用到 Linode
linode-cli firewalls device-create "$FIREWALL_ID" \
--type linode \
--id "$LINODE_ID"
步骤 6:等待并获取 Linode IP
# Wait for Linode to be running
echo "Waiting for Linode to be running..."
while [ "$(linode-cli linodes view "$LINODE_ID" --format status --text --no-headers)" != "running" ]; do
sleep 5
done
# Get IP address
SERVER_IP=$(linode-cli linodes view "$LINODE_ID" --format ipv4 --text --no-headers | head -1)
echo "SERVER_IP=$SERVER_IP"
步骤 7:等待服务就绪
# Wait for SSH to be available (typically 60-90 seconds)
echo "Waiting for server to be ready..."
until ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@$SERVER_IP "echo connected" 2>/dev/null; do
sleep 5
done
echo "Server is ready!"
步骤 8:验证连接
ssh root@$SERVER_IP "uname -a && free -h && df -h /"
步骤 9:为下游技能输出
# Linode only offers x86 architecture
SERVER_ARCH="amd64"
# Save to .env.local for downstream skills
echo "SERVER_IP=$SERVER_IP" >> .env.local
echo "SSH_USER=root" >> .env.local
echo "SSH_KEY_PATH=~/.ssh/id_rsa" >> .env.local
echo "SERVER_ARCH=$SERVER_ARCH" >> .env.local
echo "COOLIFY_SERVER_IP=$SERVER_IP" >> .env.local
echo "KASM_SERVER_IP=$SERVER_IP" >> .env.local
echo ""
echo "Linode deployed successfully!"
echo " IP: $SERVER_IP"
echo " Arch: $SERVER_ARCH"
echo " SSH: ssh root@$SERVER_IP"
验证部署
ssh root@$SERVER_IP "echo 'Linode connected successfully'"
Kubernetes 自动扩缩
Linode Kubernetes Engine(LKE)支持 Cluster Autoscaler,可自动扩缩节点。
创建 LKE 集群
# Create cluster (via API - CLI doesn't support all options)
linode-cli lke cluster-create \
--label "my-lke" \
--region "$LINODE_REGION" \
--k8s_version "1.28"
启用 Cluster Autoscaler
Cluster Autoscaler 在管理集群中运行,并根据工作负载进行扩缩:
- 在集群中安装 Cluster Autoscaler 插件
- 使用 Linode API 令牌进行配置
- 设置每个节点池的节点数上下限
参见:https://linode.github.io/cluster-api-provider-linode/topics/autoscaling.html
清理
警告:此操作具有破坏性,且无法撤销。
# Delete Linode
linode-cli linodes delete "$LINODE_ID"
# Delete firewall
linode-cli firewalls delete "$FIREWALL_ID"
# Optionally delete SSH key
# linode-cli sshkeys delete "$SSH_KEY_ID"
运维
故障排查、最佳实践、配置变量和成本快照见 references/OPERATIONS.md。
日志集成
执行基础设施操作时,请将日志记录到集中式系统:
# After provisioning
log_admin "SUCCESS" "operation" "Provisioned Linode" "id=$LINODE_ID provider=Linode"
# After destroying
log_admin "SUCCESS" "operation" "Deleted Linode" "id=$LINODE_ID"
# On error
log_admin "ERROR" "operation" "Linode deployment failed" "error=$ERROR_MSG"
完整的日志记录文档见 admin 技能的 references/logging.md。