关于 digital-ocean
digital-ocean 是通过 doctl 命令行创建和管理 DigitalOcean Droplet 的技能。内容涵盖部署前参数确认、SSH 与防火墙设置、连接验证及资源清理。
主要功能
- 01部署前参数清单
- 02使用 doctl 创建 Droplet
- 03SSH 密钥与防火墙设置
- 04服务器就绪及连接检查
- 05清理 Droplet 和防火墙
适用场景
- 01创建 DigitalOcean 服务器
- 02为 Coolify 或 Kasm 准备基础设施
- 03验证 Droplet 的 SSH 访问
- 04删除 Droplet 和防火墙
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ evolv3-ai/ vibe-skills --skill digital-ocean安装后在 Claude Code 中输入/digital-ocean确认已加载。
附带文件assets/env-templatereferences/OPERATIONS.md
详细介绍
DigitalOcean 基础设施
关键:密钥与 .env
- 切勿在任何 skill 文件夹中存储有效的
.env文件或凭据。 .env.template文件只能放在 skill 中的assets/目录下。- 将有效密钥存储在
~/.admin/.env中,并从该文件中引用。
状态:可用于生产环境 | 依赖项:doctl CLI、SSH 密钥对
导航
- 操作、故障排除、配置和费用概览:
references/OPERATIONS.md
步骤 0:收集所需信息(必须)
暂停。在执行任何部署命令之前,向用户收集所有参数。
复制此清单并确认每一项:
Required Parameters:
- [ ] SERVER_NAME - Unique name for this server
- [ ] DO_REGION - Region (nyc1, sfo3, lon1, fra1, sgp1, etc.)
- [ ] DO_SIZE - Droplet size (see profiles below)
- [ ] SSH_KEY_NAME - Name of SSH key in DigitalOcean
- [ ] SSH_KEY_PATH - Path to local SSH private key (default: ~/.ssh/id_rsa)
Deployment Purpose (determines recommended profile):
- [ ] Purpose: coolify / kasm / both / custom
coolify → s-2vcpu-4gb ($24/mo)
kasm → s-4vcpu-8gb ($48/mo)
both → s-8vcpu-16gb ($96/mo)
custom → Ask for specific size
按用途推荐的配置:
| 用途 | 规格 | vCPU | RAM | 月费 |
|---|---|---|---|---|
| coolify | s-2vcpu-4gb | 2 | 4GB | $24 |
| kasm | s-4vcpu-8gb | 4 | 8GB | $48 |
| both | s-8vcpu-16gb | 8 | 16GB | $96 |
在确认所有参数之前,请勿继续执行先决条件步骤。
先决条件
使用此 skill 前,请确认以下事项:
1. 已安装 DigitalOcean CLI
doctl version
如果未安装,请使用以下命令安装:
# macOS
brew install doctl
# Linux (snap)
sudo snap install doctl
# Linux (download binary)
cd ~
wget https://github.com/digitalocean/doctl/releases/download/v1.104.0/doctl-1.104.0-linux-amd64.tar.gz
tar xf doctl-1.104.0-linux-amd64.tar.gz
sudo mv doctl /usr/local/bin
# Windows (scoop)
scoop install doctl
2. DigitalOcean 账户和 API 令牌
如果你没有 DigitalOcean 账户:
注册:https://m.do.co/c/YOUR_REFERRAL_CODE
披露:这是一个推荐链接。你将在 60 天内获得 $200 额度,skill 作者也会获得账户额度。使用此链接有助于支持这些 skill 的开发。
获取 API 令牌:https://cloud.digitalocean.com/account/api/tokens
创建具有 Read & Write 权限范围的令牌。
3. 已配置 doctl CLI
doctl account get
如果显示错误,请使用以下命令进行身份验证:
doctl auth init
# Paste your API token when prompted
或者通过环境变量设置:
export DIGITALOCEAN_ACCESS_TOKEN="your_token_here"
doctl account get
4. SSH 密钥对
ls ~/.ssh/id_rsa.pub
如果没有,请使用以下命令生成:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
5. 已将 SSH 密钥上传到 DigitalOcean
doctl compute ssh-key list
如果为空,请使用以下命令上传:
doctl compute ssh-key import my-key --public-key-file ~/.ssh/id_rsa.pub
6. 测试身份验证
doctl compute region list
如果失败:令牌可能无效或已过期。请创建新令牌。
服务配置
Coolify/Kasm 部署
| 配置 | Droplet 类型 | vCPU | RAM | 磁盘 | 月费 |
|---|---|---|---|---|---|
coolify | s-2vcpu-4gb | 2 | 4GB | 80GB | $24 |
kasm | s-4vcpu-8gb | 4 | 8GB | 160GB | $48 |
both | s-8vcpu-16gb | 8 | 16GB | 320GB | $96 |
高级 CPU(性能更高)
| 配置 | Droplet 类型 | vCPU | RAM | 磁盘 | 月费 |
|---|---|---|---|---|---|
premium-small | c-4-8gib | 4 | 8GB | 50GB | $84 |
premium-medium | c-8-16gib | 8 | 16GB | 100GB | $168 |
premium-large | c-16-32gib | 16 | 32GB | 200GB | $336 |
通用型(最适合混合工作负载)
| Droplet 类型 | vCPU | RAM | 磁盘 | 月费 |
|---|---|---|---|---|
| g-2vcpu-8gb | 2 | 8GB | 25GB | $63 |
| g-4vcpu-16gb | 4 | 16GB | 50GB | $126 |
| g-8vcpu-32gb | 8 | 32GB | 100GB | $252 |
部署步骤
步骤 1:设置环境变量
export DO_REGION="nyc1" # See regions below
export DO_SIZE="s-2vcpu-4gb" # See profiles above
export DO_IMAGE="ubuntu-22-04-x64"
export SERVER_NAME="my-server"
export SSH_KEY_NAME="my-key"
区域选项
| 代码 | 位置 | 区域 |
|---|---|---|
nyc1 | 纽约 1 | 美国东部 |
nyc3 | 纽约 3 | 美国东部 |
sfo2 | 旧金山 2 | 美国西部 |
sfo3 | 旧金山 3 | 美国西部 |
tor1 | 多伦多 | 加拿大 |
lon1 | 伦敦 | 英国 |
ams3 | 阿姆斯特丹 | 荷兰 |
fra1 | 法兰克福 | 德国 |
blr1 | 班加罗尔 | 印度 |
sgp1 | 新加坡 | 亚洲 |
syd1 | 悉尼 | 澳大利亚 |
步骤 2:获取 SSH 密钥 ID
SSH_KEY_ID=$(doctl compute ssh-key list --format ID,Name --no-header | grep "$SSH_KEY_NAME" | awk '{print $1}')
echo "SSH Key ID: $SSH_KEY_ID"
# Verify
if [ -z "$SSH_KEY_ID" ]; then
echo "ERROR: SSH key '$SSH_KEY_NAME' not found. Upload it first."
exit 1
fi
步骤 3:创建防火墙
# Create firewall
doctl compute firewall create \
--name my-firewall \
--inbound-rules "protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0" \
--inbound-rules "protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0" \
--inbound-rules "protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \
--inbound-rules "protocol:tcp,ports:8000,address:0.0.0.0/0,address:::/0" \
--inbound-rules "protocol:tcp,ports:6001-6002,address:0.0.0.0/0,address:::/0" \
--inbound-rules "protocol:tcp,ports:8443,address:0.0.0.0/0,address:::/0" \
--inbound-rules "protocol:tcp,ports:3389,address:0.0.0.0/0,address:::/0" \
--inbound-rules "protocol:tcp,ports:3000-4000,address:0.0.0.0/0,address:::/0" \
--outbound-rules "protocol:tcp,ports:all,address:0.0.0.0/0,address:::/0" \
--outbound-rules "protocol:udp,ports:all,address:0.0.0.0/0,address:::/0" \
--outbound-rules "protocol:icmp,address:0.0.0.0/0,address:::/0"
步骤 4:创建 Droplet
doctl compute droplet create "$SERVER_NAME" \
--region "$DO_REGION" \
--size "$DO_SIZE" \
--image "$DO_IMAGE" \
--ssh-keys "$SSH_KEY_ID" \
--tag-names "myproject" \
--wait
步骤 5:获取 Droplet IP
SERVER_IP=$(doctl compute droplet get "$SERVER_NAME" --format PublicIPv4 --no-header)
echo "SERVER_IP=$SERVER_IP"
步骤 6:将防火墙应用到 Droplet
FIREWALL_ID=$(doctl compute firewall list --format ID,Name --no-header | grep "my-firewall" | awk '{print $1}')
DROPLET_ID=$(doctl compute droplet get "$SERVER_NAME" --format ID --no-header)
doctl compute firewall add-droplets "$FIREWALL_ID" --droplet-ids "$DROPLET_ID"
步骤 7:等待服务就绪
# Wait for SSH to be available (typically 30-60 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:输出供下游 skill 使用
# DigitalOcean 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 "Droplet deployed successfully!"
echo " IP: $SERVER_IP"
echo " Arch: $SERVER_ARCH"
echo " SSH: ssh root@$SERVER_IP"
验证部署
ssh root@$SERVER_IP "echo 'DigitalOcean Droplet connected successfully'"
Kasm Workspaces 自动扩缩容
DigitalOcean 与 Kasm Workspaces 原生集成,可自动配置 Agent。
在 Kasm 管理后台启用
- 前往 基础设施 → 资源池 → 编辑资源池
- 启用 Digital Ocean Scaling Enabled
- 配置:
- DO API Key:你的 DigitalOcean API 令牌
- DO Region:新 Agent 所在的区域
- DO Droplet Size:自动配置的 Droplet 规格
- DO SSH Key ID:你的 SSH 密钥 ID
工作原理
- 用户需求增加时,Kasm 会自动配置新的 Droplet
- 不再需要时会销毁 Droplet
- 确保资源利用率和成本效益
清理
警告:此操作具有破坏性,且无法撤销。
# Delete droplet
doctl compute droplet delete "$SERVER_NAME" --force
# Delete firewall
FIREWALL_ID=$(doctl compute firewall list --format ID,Name --no-header | grep "my-firewall" | awk '{print $1}')
doctl compute firewall delete "$FIREWALL_ID" --force
# Optionally delete SSH key
# doctl compute ssh-key delete "$SSH_KEY_ID" --force
运维
故障排查、最佳实践、配置变量和成本快照见 references/OPERATIONS.md。
日志集成
执行基础设施操作时,请将日志写入集中式系统:
# After provisioning
log_admin "SUCCESS" "operation" "Provisioned DigitalOcean droplet" "id=$DROPLET_ID provider=DigitalOcean"
# After destroying
log_admin "SUCCESS" "operation" "Deleted DigitalOcean droplet" "id=$DROPLET_ID"
# On error
log_admin "ERROR" "operation" "DigitalOcean deployment failed" "error=$ERROR_MSG"
完整的日志文档请参见 admin 技能的 references/logging.md。