你的 VPS 每月花多少钱?5 刀?20 刀?还是上百刀?
对于独立开发者和小型团队来说,每一分钱都来之不易。但随着业务增长,服务器数量增加、资源需求波动、忘记关停的测试环境……账单会悄悄膨胀。等你发现的时候,可能已经超支了。
本文要做的,就是用 AI 帮你管钱——让本地 LLM 自动分析你的 VPS 花费、识别浪费、预测趋势,并在预算即将耗尽时主动预警。
为什么 AI 来做成本优化?
传统成本管理靠的是"月底看账单"——等账单来了才知道花了多少,一切都晚了。
| 方法 | 发现时机 | 能做什么 |
|---|---|---|
| 月底看账单 | 已经花完了 | 只能下次省钱 |
| 手动设置告警 | 接近阈值时 | 需要自己算阈值 |
| AI 实时监控 | 实时发现异常 | 分析原因 + 给出建议 + 自动修复 |
| AI 趋势预测 | 超支前 3-7 天 | 预测何时超支,提前规划 |
AI 的核心价值在于不只是告诉你花了多少,而是告诉你为什么花、怎么省、未来会怎样。
系统架构
┌─────────────────────────────────────────────────────────────┐
│ VPS 成本管理系统 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ 数据采集层 │ │ AI 分析引擎 │ │ 预警与行动层 │ │
│ │ │ │ │ │ │ │
│ │ • 账单数据 │ │ • 浪费检测 │ │ • Telegram 告警 │ │
│ │ • 资源用量 │ │ • 趋势预测 │ │ • 自动降配建议 │ │
│ │ • 价格对比 │ │ • 优化建议 │ │ • 一键关停脚本 │ │
│ │ • 标签分类 │ │ • 根因分析 │ │ • Web 看板 │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
│ ↓ ↓ ↓ │
│ cron 每小时 Ollama 本地 多渠道推送 │
└─────────────────────────────────────────────────────────────┘
三个核心模块
- 数据采集层:汇聚账单 API、云厂商 API、本地资源监控数据
- AI 分析引擎:本地 LLM 分析花费模式、识别异常、给出优化建议
- 预警与行动层:多渠道推送告警,支持自动执行优化措施
第一步:安装 Ollama 和轻量模型
# 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 拉取适合成本分析的轻量模型(不需要太强的推理能力)
ollama pull qwen2.5:3b
# 验证
ollama list
为什么选 3B 模型? 成本分析是结构化数据分析,不需要复杂的逻辑推理。3B 模型在 2GB 内存 VPS 上就能流畅运行,每次分析只需 5-10 秒。
第二步:采集成本数据
2.1 云厂商 API 采集
以 DigitalOcean 为例,通过 API 获取当前账单和用量:
#!/bin/bash
# /usr/local/bin/fetch-cost-data.sh
# 采集各云厂商的成本数据
COST_DIR="/var/cost-monitor/$(date +%Y%m%d)"
mkdir -p "$COST_DIR"
# --- DigitalOcean ---
if [ -n "$DO_API_TOKEN" ]; then
curl -s -H "Authorization: Bearer $DO_API_TOKEN" \
"https://api.digitalocean.com/v2/account" \
-o "$COST_DIR/do-account.json"
# 获取本月花费(需要订阅 Billing Usage API)
curl -s -H "Authorization: Bearer $DO_API_TOKEN" \
"https://api.digitalocean.com/v2/billing/history" \
-o "$COST_DIR/do-billing-history.json"
fi
# --- AWS ---
if [ -n "$AWS_ACCESS_KEY_ID" ]; then
aws ce get-cost-and-usage \
--time-period Start=$(date -d "first day of this month" +%Y-%m-%d),End=$(date +%Y-%m-%d) \
--granularity MONTHLY \
--metrics "UnblendedCost" \
--query 'ResultsByTime[0].Total' \
--output json > "$COST_DIR/aws-cost.json" 2>/dev/null
fi
# --- 本地资源用量 ---
# 当前 VPS 资源使用情况(用于识别闲置资源)
free -m > "$COST_DIR/local-memory.txt"
df -h > "$COST_DIR/local-disk.txt"
uptime > "$COST_DIR/local-load.txt"
ps aux --sort=-%mem | head -20 > "$COST_DIR/local-top-processes.txt"
# Docker 资源统计
docker stats --no-stream --format "{{.Name}},{{.CPUPerc}},{{.MemPerc}},{{.MemUsage}}" \
> "$COST_DIR/docker-stats.csv" 2>/dev/null
# 运行中的容器数量
docker ps -q | wc -l > "$COST_DIR/container-count.txt"
# 停止的容器(潜在浪费)
docker ps -aq --filter "status=exited" | wc -l > "$COST_DIR/stopped-containers.txt"
# 未挂载的卷(潜在浪费)
docker volume ls -qf dangling=true | wc -l > "$COST_DIR/dangling-volumes.txt"
echo "✅ Cost data collected: $COST_DIR"
2.2 自定义账单追踪
对于没有 API 的云厂商,或者自建服务器,可以用 CSV 手动录入:
日期,云厂商,实例类型,月费,用途,状态
2026-07-01,DigitalOcean,droplet-1gb,5.0,生产API,running
2026-07-01,DigitalOcean,droplet-2gb,12.0,数据库,running
2026-07-01,AWS,t2.micro,7.5,开发测试,running
2026-07-01,自定义,VPS-2C4G,15.0,网站托管,running
2026-07-01,DigitalOcean,snapshot-monthly,2.0,备份,active
#!/bin/bash
# /usr/local/bin/track-budget.sh
# 手动录入月度账单
COST_FILE="$HOME/.cost-monitor/budget.csv"
mkdir -p "$(dirname "$COST_FILE")"
echo "请输入新项目(格式:日期,厂商,实例,月费,用途,状态),输入空行结束:"
while true; do
read -r line
[ -z "$line" ] && break
echo "$line" >> "$COST_FILE"
done
# 计算总月费
TOTAL=$(awk -F',' '{sum += $4} END {printf "%.1f", sum}' "$COST_FILE")
echo "💰 当前总月费: \$${TOTAL}"
第三步:AI 成本分析引擎
这是整个系统的核心——让 LLM 分析采集到的数据,找出浪费和机会:
#!/bin/bash
# /usr/local/bin/analyze-costs.sh
# AI 成本分析引擎
COST_DIR="/var/cost-monitor/$(date +%Y%m%d)"
MODEL="qwen2.5:3b"
BUDGET=${1:-50} # 默认月预算 $50
# 构建分析 Prompt
PROMPT="你是一位 FinOps(云财务运营)专家。请分析以下 VPS 成本数据,找出不必要的开支和优化机会。
## 本月预算上限: \$${BUDGET}
## 当前资源使用情况
### 内存使用
$(cat "$COST_DIR/local-memory.txt" 2>/dev/null)
### 磁盘使用
$(cat "$COST_DIR/local-disk.txt" 2>/dev/null)
### 系统负载
$(cat "$COST_DIR/local-load.txt" 2>/dev/null)
### Top 进程(按内存排序)
$(cat "$COST_DIR/local-top-processes.txt" 2>/dev/null)
### Docker 容器状态
$(cat "$COST_DIR/docker-stats.csv" 2>/dev/null || echo "无 Docker 数据")
### 容器统计
运行中: $(cat "$COST_DIR/container-count.txt" 2>/dev/null || echo 0) 个
已停止: $(cat "$COST_DIR/stopped-containers.txt" 2>/dev/null || echo 0) 个
悬空卷: $(cat "$COST_DIR/dangling-volumes.txt" 2>/dev/null || echo 0) 个
## 请分析以下内容并以 JSON 格式返回:
{
"total_monthly_cost": 数字,
"budget_limit": 数字,
"budget_usage_percent": 百分比数值,
"status": "within_budget" | "approaching_limit" | "over_budget",
"waste_items": [
{
"item": "浪费项描述",
"estimated_savings": 预估节省金额,
"confidence": "high" | "medium" | "low",
"action": "建议的操作"
}
],
"optimization_suggestions": [
{
"priority": 1-3 (1最高),
"action": "优化建议",
"potential_savings": 预估节省,
"effort": "low" | "medium" | "high"
}
],
"trend_forecast": "未来趋势描述",
"days_until_budget_exceeded": 数字或null
}
请用中文回复分析过程,但 JSON 部分保持英文。
"""
# 调用 Ollama
RESPONSE=$(curl -s http://localhost:11434/api/generate \
-d "{\"model\": \"$MODEL\", \"prompt\": \"$PROMPT\", \"stream\": false}" \
| jq -r '.response')
# 提取 JSON 部分
JSON_PART=$(echo "$RESPONSE" | grep -A 1000 '{' | head -n -1 | tail -n +1)
echo "$JSON_PART" > "$COST_DIR/analysis.json"
echo "✅ AI 成本分析完成: $COST_DIR/analysis.json"
echo ""
echo "=== 分析摘要 ==="
echo "$JSON_PART" | jq -r '"状态: \(.status) | 预算使用: \(.budget_usage_percent)% | 浪费项: \(.waste_items | length) | 优化建议: \(.optimization_suggestions | length)"' 2>/dev/null
第四步:预算预警系统
AI 分析后,根据结果推送不同级别的告警:
#!/bin/bash
# /usr/local/bin/alert-budget.sh
# 基于 AI 分析结果发送预警
ANALYSIS_FILE="/var/cost-monitor/$(date +%Y%m%d)/analysis.json"
if [ ! -f "$ANALYSIS_FILE" ]; then
echo "⚠️ 没有找到分析结果,请先运行 analyze-costs.sh"
exit 1
fi
STATUS=$(jq -r '.status' "$ANALYSIS_FILE")
USAGE=$(jq -r '.budget_usage_percent' "$ANALYSIS_FILE")
DAYS_LEFT=$(jq -r '.days_until_budget_exceeded // "unknown"' "$ANALYSIS_FILE")
BOT_TOKEN="${TELEGRAM_BOT_TOKEN}"
CHAT_ID="${TELEGRAM_CHAT_ID}"
# 确定告警级别
case "$STATUS" in
"over_budget")
EMOJI="🔴"
LEVEL="严重"
MSG="🔴 **VPS 预算已超支!**
当前使用: ${USAGE}%
预计超出天数: $DAYS_LEFT
**紧急优化建议:**
$(jq -r '.optimization_suggestions[] | "- \(.action) (预计节省: \(.potential_savings))"' "$ANALYSIS_FILE" 2>/dev/null)
请立即采取行动!"
;;
"approaching_limit")
EMOJI="🟡"
LEVEL="警告"
MSG="🟡 **VPS 预算预警**
当前使用: ${USAGE}%
剩余预算约: $DAYS_LEFT 天
**优化建议:**
$(jq -r '.optimization_suggestions[] | "- \(.action) (预计节省: \(.potential_savings))"' "$ANALYSIS_FILE" 2>/dev/null)
建议开始优化资源使用。"
;;
"within_budget")
EMOJI="🟢"
LEVEL="正常"
MSG="🟢 **VPS 成本周报 - 正常**
当前使用: ${USAGE}%
预算状态: 正常
**本月节省机会:**
$(jq -r '.waste_items[] | "- \(.item): 可省 \(.estimated_savings) (置信度: \(.confidence))"' "$ANALYSIS_FILE" 2>/dev/null || echo "暂无明显浪费")
继续保持良好的资源管理习惯!"
;;
esac
# 发送 Telegram 消息
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID&text=${MSG}&parse_mode=Markdown&disable_web_page_preview=true" 2>/dev/null
echo "${EMOJI} 告警已发送 [${LEVEL}]: ${USAGE}% 预算使用率"
第五步:自动优化脚本
对于低风险操作,可以让 AI 生成并执行优化命令:
#!/bin/bash
# /usr/local/bin/auto-optimize.sh
# AI 驱动的自动成本优化
COST_DIR="/var/cost-monitor/$(date +%Y%m%d)"
MODEL="qwen2.5:3b"
# 获取停止的容器列表
STOPPED=$(docker ps -aq --filter "status=exited" 2>/dev/null)
STOPPED_COUNT=$(echo "$STOPPED" | grep -c . 2>/dev/null || echo 0)
# 获取悬空卷列表
DANGLING=$(docker volume ls -qf dangling=true 2>/dev/null)
DANGLING_COUNT=$(echo "$DANGLING" | grep -c . 2>/dev/null || echo 0)
# 构建优化 Prompt
PROMPT="你是一位 VPS 成本优化工程师。请分析以下资源状况,给出安全的自动优化建议。
## 当前状况
- 已停止的 Docker 容器数: $STOPPED_COUNT
- 悬空 Docker 卷数: $DANGLING_COUNT
- 内存使用: $(free -m | awk '/^Mem:/{printf "%.0f%%", $3/$2*100}')
- 磁盘使用: $(df -h / | awk 'NR==2{print $5}')
- 系统负载: $(uptime | awk -F'load avg:' '{print $2}')
## 请输出 JSON 格式的安全优化指令:
{
"safe_auto_actions": [
{
"action": "操作描述",
"command": "可执行的安全命令",
"risk_level": "low",
"estimated_savings": "预估节省(如适用)"
}
],
"manual_review_needed": [
{
"action": "需要人工确认的操作",
"reason": "原因说明"
}
]
}
只建议低风险的自动操作。不要建议删除重要数据或关闭生产服务。
"""
RESPONSE=$(curl -s http://localhost:11434/api/generate \
-d "{\"model\": \"$MODEL\", \"prompt\": \"$PROMPT\", \"stream\": false}" \
| jq -r '.response')
# 提取并执行安全操作
echo "$RESPONSE" | jq -r '.safe_auto_actions[] | "\(.action): \(.command)"' 2>/dev/null | while read -r line; do
ACTION=$(echo "$line" | cut -d: -f1)
CMD=$(echo "$line" | cut -d: -f2-)
echo "🔧 执行: $ACTION"
eval "$CMD" 2>/dev/null
done
echo "✅ 自动优化完成"
安全优化清单
以下是 AI 通常会建议的低风险自动优化操作:
| 优化项 | 操作 | 预期节省 |
|---|---|---|
| 清理停止容器 | docker container prune -f | 释放磁盘空间 |
| 清理悬空卷 | docker volume prune -f | 释放磁盘空间 |
| 清理未使用镜像 | docker image prune -af | 释放磁盘空间 |
| 日志轮转 | 压缩/删除旧日志文件 | 减少磁盘占用 |
| 关闭空闲服务 | 停止无流量的 Nginx 容器 | 释放 CPU/内存 |
| 降级实例规格 | 建议降配低负载实例 | 直接减少月费 |
第六步:定时任务配置
将所有组件整合到 crontab:
# 每小时采集成本数据
0 * * * * /usr/local/bin/fetch-cost-data.sh
# 每天凌晨 2 点运行 AI 分析
0 2 * * * /usr/local/bin/analyze-costs.sh 50
# 每天凌晨 2:05 发送预警
5 2 * * * /usr/local/bin/alert-budget.sh
# 每周日凌晨 3 点执行自动优化
0 3 * * 0 /usr/local/bin/auto-optimize.sh
# 每月 1 号生成月度成本报告
0 6 1 * * /usr/local/bin/fetch-cost-data.sh && /usr/local/bin/analyze-costs.sh 50 && /usr/local/bin/alert-budget.sh
实战案例:从 $120/月降到 $45/月
让我用一个真实场景来展示这套系统的效果。
初始状态
某独立开发者有 4 台 VPS:
| 实例 | 云厂商 | 配置 | 月费 | 实际利用率 |
|---|---|---|---|---|
| prod-api | DigitalOcean | 2C4G | $18 | 85% ✅ |
| prod-db | DigitalOcean | 4C8G | $48 | 23% ⚠️ |
| dev-test | AWS | t2.micro | $7.5 | 5% 💀 |
| staging | DigitalOcean | 2C4G | $18 | 0% 💀 |
| snapshot | 备份 | - | $2 | - |
| 合计 | $93.5 |
AI 分析结果
运行 analyze-costs.sh 后,AI 发现了以下问题:
🔴 高优先级浪费:
1. staging 环境连续 30 天零流量 → 建议暂停或删除,节省 $18/月
2. dev-test 容器内存使用率仅 5% → 建议降配到 $3.5 实例,节省 $4/月
3. prod-db 实例 4C8G 但 CPU 平均 12% → 建议降到 2C4G,节省 $30/月
4. 12 个停止的 Docker 容器占用 8GB 磁盘 → 清理后释放空间
🟡 中优先级优化:
5. 快照策略过于激进 → 改为每周一次而非每日,节省 $1.5/月
6. 未使用 Cloudflare Argo → 取消高级路由,节省 $10/月
执行优化后
| 实例 | 调整后 | 新月费 | 节省 |
|---|---|---|---|
| prod-api | 不变 | $18 | - |
| prod-db | 降配 2C4G | $18 | $30 |
| dev-test | 降配 t2.small | $3.5 | $4 |
| staging | 暂停 | $0 | $18 |
| snapshot | 每周一次 | $0.5 | $1.5 |
| 合计 | $40 | $53.5/月 |
成果:月费降低 57%,从 $93.5 降至 $40,年省 $642。
扩展:多云成本对比
如果你有多个云厂商的服务,AI 还可以帮你做跨平台对比:
#!/bin/bash
# /usr/local/bin/cloud-price-comparison.sh
# 同一规格在不同云厂商的价格对比
SPEC="2C4G"
echo "=== ${SPEC} 实例价格对比 ==="
echo ""
# DigitalOcean
DO_PRICE=$(curl -s -H "Authorization: Bearer $DO_API_TOKEN" \
"https://api.digitalocean.com/v2/droplets" | \
jq '[.droplets[] | select(.memory >= 4096 and .vcpus >= 2)][0].size_price_monthly // "N/A"')
# Vultr
VULTR_PRICE="14.00" # 固定价格,可通过 API 获取
# Linode
LINODE_PRICE="24.00"
# Hetzner
HETZNER_PRICE="4.51"
echo "DigitalOcean: \$$DO_PRICE/月"
echo "Vultr: \$$VULTR_PRICE/月"
echo "Linode: \$$LINODE_PRICE/月"
echo "Hetzner: \$$HETZNER_PRICE/月"
echo ""
# 让 AI 给出迁移建议
PROMPT="比较以下 ${SPEC} 规格实例的价格:
- DigitalOcean: $$DO_PRICE/月
- Vultr: $$VULTR_PRICE/月
- Linode: $$LINODE_PRICE/月
- Hetzner: $$HETZNER_PRICE/月
请分析:
1. 最便宜的选项
2. 性价比最高的选项(考虑网络质量、稳定性)
3. 迁移成本和风险评估
4. 是否值得迁移
用中文回答。"
curl -s http://localhost:11434/api/generate \
-d "{\"model\": \"qwen2.5:3b\", \"prompt\": \"$PROMPT\", \"stream\": false}" \
| jq -r '.response'
预算看板(Web 版)
最后,你可以生成一个简单的 HTML 看板,在浏览器中查看成本趋势:
#!/bin/bash
# /usr/local/bin/gen-cost-dashboard.sh
# 生成本月成本看板
COST_DIR="/var/cost-monitor/$(date +%Y%m%d)"
ANALYSIS=$(cat "$COST_DIR/analysis.json" 2>/dev/null)
DATE=$(date '+%Y-%m-%d')
cat > "$COST_DIR/dashboard.html" << 'HTMLEOF'
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>VPS 成本看板 - selfvps.net</title>
<style>
body { font-family: 'Segoe UI', sans-serif; max-width: 900px; margin: 40px auto; padding: 20px; background: #0d1117; color: #c9d1d9; }
h1 { color: #58a6ff; }
.card { background: #161b22; border-radius: 8px; padding: 20px; margin: 15px 0; border-left: 4px solid #58a6ff; }
.danger { border-left-color: #f85149; }
.warning { border-left-color: #d29922; }
.success { border-left-color: #3fb950; }
.stat { font-size: 2em; font-weight: bold; }
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { padding: 8px 12px; text-align: left; border-bottom: 1px solid #30363d; }
th { color: #8b949e; }
</style>
</head>
<body>
<h1>📊 VPS 成本看板</h1>
<p>生成时间: DATE_PLACEHOLDER | selfvps.net</p>
<div id="dashboard-content">
<!-- 由脚本动态填充 -->
</div>
</body>
</html>
HTMLEOF
# 替换日期并注入数据
sed -i "s/DATE_PLACEHOLDER/$DATE/" "$COST_DIR/dashboard.html"
echo "✅ Dashboard: $COST_DIR/dashboard.html"
资源消耗
这套系统本身几乎不花钱:
| 组件 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| 数据采集脚本 | < 1 秒 | — | ~50KB/次 |
| AI 分析(3B 模型) | ~10 秒 | ~2GB | — |
| 预警推送 | < 1 秒 | — | — |
| 总计开销 | ~10 秒/天 | ~2GB | ~50KB/天 |
即使是最便宜的 1GB 内存 VPS 也能运行这套系统。如果内存紧张,可以将分析频率调整为每周一次。
总结
用 AI 管理 VPS 成本的核心思想是:把事后算账变成事前预防。
这套系统的价值不在于节省那几美元,而在于让你始终知道自己在花什么钱、有没有浪费、未来趋势如何。当你不再需要每个月打开云厂商控制台查账单,而是让 AI 主动告诉你"你的 staging 环境在烧钱"时,你就真正实现了 FinOps 的自动化。
从今天开始,让你的 VPS 自己管自己的钱包。
