Learning
VOL. XIII · NO. 02 · Elixir · 25 JUL 2026

Concepts Vultr Glossary

Elixir 编程 · 25 JUL 2026 · 12 min read · 2,080 words
· · ·

Vultr 概念词典

速查 Vultr(vultr.com)所有专有名词,按”是什么 / 跟谁类似 / 怎么用”三段式。

适用场景:把 Elixir 应用部署到 Vultr + Cloudflare 实现”按需起 VM”架构(详见 extensions-serverless-architecture.md)。


基础概念

Instance(实例 = VM)

Vultr 的”一台虚拟机”。类比 AWS EC2 Instance / DigitalOcean Droplet / Hetzner Cloud Server

关键字段:

字段含义
id实例 ID(创建后唯一)cb6760b6-1bd9-4abc-91d9-34d4d3a8c123
label实例名(你自己取)pipeline-prod-01
region数据中心地域(见 Region)sgp (Singapore)
plan配置套餐(见 Plan)vc2-2c-4gb
os操作系统 ID1743 (Custom snapshot)
main_ip主 IPv4149.28.x.x
status当前状态active / pending / off
power_status电源状态running / stopped
# 列出所有实例
curl -H "Authorization: Bearer $VULTR_API_KEY" https://api.vultr.com/v2/instances

# 创建实例
curl -X POST -H "Authorization: Bearer $VULTR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"region":"sgp","plan":"vc2-2c-4gb","label":"myapp-01","os_id":1743,"snapshot_id":"abc-123"}' \
  https://api.vultr.com/v2/instances

Plan(套餐 = 规格)

Vultr 卖的不是裸金属,是预打包的规格。命名规则 vc2-Xc-Ygb

套餐vCPURAM月费时费带宽
vc2-1c-1gb11 GB$5$0.007/h1 TB
vc2-1c-2gb12 GB$10$0.014/h2 TB
vc2-2c-4gb24 GB$20$0.027/h4 TB
vc2-4c-8gb48 GB$40$0.055/h5 TB
vc2-8c-16gb816 GB$80$0.110/h6 TB
vhf-8c-16gb816 GB$128$0.176/h8 TB

前缀含义

  • vc2- = Intel/AMD Cloud Compute(最常见,性价比高)
  • vhf- = High Frequency(3.8GHz+,适合 CPU 密集型)
  • vdc- = Dedicated Cloud(CPU 不共享,适合生产)
  • bare- = Bare Metal(独享硬件,不虚拟化)
  • vbm- = Bare Metal + GPU

类比:AWS EC2 instance type(如 t3.medium)/ DigitalOcean droplet size(如 s-2vcpu-4gb)。

Elixir 选型建议

  • 1-2 GB = dev / 轻量 worker / 间歇 cron
  • 4 GB = 标准 Phoenix 应用(500-2000 WebSocket)
  • 8 GB = 高并发 / 内存密集(ETS 大表 / 大 NIF)

Region(地域 = 数据中心)

Vultr 在全球 32+ 城市有数据中心。注意:vultr 没有”中国”地域(出口受 GFW 影响)。

亚洲常用

Code城市备注
sgpSingapore中国大陆延迟 30-60ms,离得最近
nrtTokyo东亚低延迟
hndTokyo (Haneda)同上,新节点
icnSeoul韩国
laxLos Angeles太平洋光缆好,到中国大陆 130-180ms
seaSeattle备用

选择策略

  • 中国大陆用户 → sgp(最近的境外节点)
  • 全球用户 → lax / nrt(节点多)
  • 多 Region 集群 → 一个 Region 一个 VM,靠 libcluster gossip 跨 Region 通信

类比:AWS Region(如 ap-southeast-1)/ GCP Zone。


镜像 / 快照

Snapshot(快照 = VM 状态保存)

关键术语,跟 Docker image 类似但不同

  • 包含整个 OS 磁盘(含你的代码、依赖、配置)
  • 只能从自己的 VM 拍(不能跨账号)
  • 大小 = 已用磁盘空间(不是 VM 配额)
  • 可以”restore”出一个新 VM(cold start 15-30s)

类比:AWS AMI / GCP Image / DigitalOcean Snapshot。

# 拍快照
curl -X POST -H "Authorization: Bearer $VULTR_API_KEY" \
  -d '{"instance_id":"cb6760b6-...","description":"prod-ready v0.1.0"}' \
  https://api.vultr.com/v2/snapshots

# 列出快照
curl -H "Authorization: Bearer $VULTR_API_KEY" https://api.vultr.com/v2/snapshots

# 用快照创建 VM(os_id=1743 表示 "from snapshot")
curl -X POST ... -d '{"region":"sgp","plan":"vc2-2c-4gb","os_id":1743,"snapshot_id":"<snap_id>"}' ...

为什么是”按需起 VM”的关键:第一次起 VM 慢(30-60s),从 snapshot 起 15-30s。


ISO(自定义 ISO 镜像上传)

高级功能,不常用——一般用 snapshot 就够了。ISO 用于:

  • 上传自己的 OS 镜像(如定制 Linux)
  • 装非 Vultr 官方支持的系统(FreeBSD、OpenBSD、自定义内核)

Elixir 场景:通常不需要。


Application Catalog(一键应用)

Vultr 提供 100+ 预装应用(WordPress、cPanel、GitLab、Mastodon 等)。点一下就装好。

Elixir 场景:❌ 用不上——选 OS: Ubuntu 22.04 裸装,自己跑 mix release


网络 / IP

Bandwidth Allowance(带宽配额)

每台 VM 每月有固定流量配额:

  • vc2-2c-4gb = 4 TB/月
  • 超出部分按 $0.01/GB 计费
  • 进出都算(双向)

类比:AWS 数据传出(egress)单独计费,Vultr 包含双向(更便宜)。

Elixir 场景:4 TB 对中等 WebSocket 应用够用。爆量用户加 CDN(Cloudflare)缓存静态资源。


Reserved IP(保留 IP = 弹性公网 IP)

Vultr 的”弹性 IP”——可以从一台 VM detachattach 到另一台。

类比:AWS Elastic IP / GCP Static IP。

Elixir 场景

  • 不用(因为我们用 Cloudflare Tunnel,VM 无需公网 IP)
  • 但要保留 1 个 Reserved IP 给”管理节点”(autoscaler、CI runner)用
# 创建保留 IP
curl -X POST ... -d '{"region":"sgp","label":"mgmt-01","ip_type":"v4"}' \
  https://api.vultr.com/v2/reserved-ips

# 附加到实例
curl -POST ... -d '{"ip_address":"149.28.x.x","instance_id":"cb6760b6-..."}' \
  https://api.vultr.com/v2/reserved-ips/149.28.x.x/attach

IPv6

Vultr 默认开启 IPv6(每 VM 1 个 /64 子网)。大多数 Elixir 应用可以忽略(Cloudflare 会自动处理)。

关闭 IPv6POST /v2/instancesfeatures: []enable_ipv6: false


Firewall Group(防火墙组)

关键概念:Vultr 防火墙是default-deny——新建 VM 所有端口都封!必须显式开端口。

# 创建防火墙组
curl -X POST -H "Authorization: Bearer $VULTR_API_KEY" \
  -d '{"description":"allow SSH + Tunnel"}' \
  https://api.vultr.com/v2/firewall-groups

# 加规则:允许 SSH(22)
curl -X POST ... \
  -d '{"ip_type":"v4","protocol":"tcp","port":"22","subnet":"0.0.0.0","subnet_size":0}' \
  https://api.vultr.com/v2/firewall-groups/<group_id>/rules

# 加规则:允许 Cloudflare IP 段(必须限制来源 IP)
curl -X POST ... \
  -d '{"ip_type":"v4","protocol":"tcp","port":"8002","subnet":"173.245.48.0","subnet_size":20}' \
  ...

⚠️ 关键:用 Cloudflare Tunnel 时,绝对不要开 8002 给 0.0.0.0/0——只允许 Cloudflare IP 段(完整列表)。

类比:AWS Security Group / GCP Firewall Rule。


启动 / 自动化

Cloud-init(首次启动脚本)

Vultr 创建 VM 时支持 user_data(cloud-config YAML),VM 第一次启动时跑一次。

Elixir 场景核心:把整个”装 OS 依赖 + 拉代码 + 跑 mix release + 起服务”塞进 cloud-init。

# cloud-config
#cloud-config
packages:
  - curl
  - git
  - postgresql-client
write_files:
  - path: /opt/pipeline.env
    permissions: '0600'
    content: |
      DATABASE_URL=postgres://user:pass@db.example.com/pipeline
      LLM_URL=https://api.openai.com/v1
      LLM_KEY=sk-xxx
      SECRET_KEY_BASE=$(openssl rand -hex 64)
runcmd:
  - curl -L https://github.com/your/repo/releases/download/v0.1.0/pipeline.tgz -o /tmp/pipeline.tgz
  - tar xzf /tmp/pipeline.tgz -C /opt
  - useradd -r -s /bin/false pipeline
  - chown -R pipeline:pipeline /opt/pipeline
  - systemctl enable /opt/pipeline/_build/prod/rel/pipeline/bin/pipeline
  - systemctl start pipeline
  - curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared -o /usr/local/bin/cloudflared
  - chmod +x /usr/local/bin/cloudflared
  - cloudflared service install --token=$CLOUDFLARE_TUNNEL_TOKEN
  - systemctl enable cloudflared
  - systemctl start cloudflared
final_message: "Pipeline VM ready after $UPTIME seconds"  # cloud-init 完成

3 个注意点

  1. cloud-init 只能跑一次——VM 重建时才会重跑,reboot 不重跑
  2. 敏感信息不要写 cloud-init(会进 snapshot 镜像)——走 write_files + 外部 secret store。
  3. cloud-init 默认 30 分钟超时——如果你的脚本慢,要 cloud_init_no_timeout: true(Vultr API 参数)。

Startup Scripts(启动脚本 ≠ Cloud-init)

Vultr 还有个单独的 Startup Scripts 功能——保存为模板,可以挂到任意 VM 的 user_data 字段。

类比:AWS Launch Template / user-data 模板化。

什么时候用:同一套”起 VM 流程”反复用(比如 pipeline-prod-01、pipeline-prod-02 都跑同样脚本)。


存储

Block Storage(块存储 = 可挂载的额外磁盘)

Vultr 支持单独购买块存储(类似 AWS EBS),挂载到 VM。

类比:AWS EBS Volume / GCP Persistent Disk。

Elixir 场景

  • 一般不需要(OS 盘够用)
  • 如果 ETS 表特别大(GB 级)→ 挂块存储,把 ETS 放那里(注意:ETS 重启会丢,要做持久化用 :mnesia:disk_log
规格月费
100 GB$10
250 GB$25
500 GB$50
1 TB$100

Snapshots vs Backups

功能何时用频率价格
Snapshot(手动)发版本前打”金本”手动$0.05/GB/月(按存储大小)
Auto Backups(自动)防误删每天/每周30% of plan price(2c-4gb = $6/月)

Elixir 场景

  • Snapshot:发版本前打一个,写进 cloud-init 的 snapshot_id
  • ❌ Auto Backups:没必要(按需起 VM 模式,需要时新建一个就行)

弹性 / 自动化 API

Vultr API

REST API + OpenAPI spec。

# 鉴权
Authorization: Bearer $VULTR_API_KEY

# base URL
https://api.vultr.com/v2/

# 速率限制
# 30 requests/秒(Vultr 官方说法;实际更高)

Elixir 调用示例

defmodule Vultr do
  defp req(method, path, body \\ nil) do
    headers = [
      {"authorization", "Bearer #{System.fetch_env!("VULTR_API_KEY")}"},
      {"content-type", "application/json"}
    ]
    body_json = if body, do: Jason.encode!(body), else: ""

    case HTTPoison.request(method, "https://api.vultr.com/v2#{path}", body_json, headers) do
      {:ok, %{status: 200, body: body}} -> {:ok, Jason.decode!(body)}
      {:ok, %{status: code, body: body}} -> {:error, {code, Jason.decode!(body)}}
      {:error, reason} -> {:error, reason}
    end
  end

  def list_instances, do: req(:get, "/instances")
  def spin_up(attrs), do: req(:post, "/instances", attrs)
  def destroy(id), do: req(:delete, "/instances/#{id}")
  def list_snapshots, do: req(:get, "/snapshots")
  def list_firewall_groups, do: req(:get, "/firewall-groups")
end

关键端点(你的 autoscaler 用得上):

端点方法用途
/instancesGET/POST列/创建 VM
/instances/:idGET/DELETE/PATCH单个 VM 详情/删除/改 label
/snapshotsGET/POST列/拍快照
/reserved-ipsGET/POST/DELETE保留 IP
/firewall-groupsGET/POST防火墙组
/firewall-groups/:id/rulesGET/POST/DELETE规则
/startup-scriptsGET/POST启动脚本模板
/applicationsGET应用市场
/plansGET所有套餐
/regionsGET所有地域

完整 API 文档vultr.com/api


Tags(标签)

VM 上可以打标签(key-value 字符串),用于:

  • 按环境分组(env=prodenv=staging
  • 按团队分组(team=tradingteam=ml
  • 按角色分组(role=workerrole=mgmt
# 打 tag
curl -X POST ... -d '{"tags":["env:prod","role:worker"]}' \
  https://api.vultr.com/v2/instances/<id>/tags

# 按 tag 筛选
curl -H "Authorization: Bearer $VULTR_API_KEY" \
  "https://api.vultr.com/v2/instances?tag=env:prod"

Elixir 场景:autoscaler 用 tag=role:worker 找所有 worker VM,scale 时只操作这一组。


高可用 / 集群

Load Balancer(Vultr LB)

Vultr 自家的 L4/L7 负载均衡。

规格月费后端 VM 数SSL 终止
基本 LB$10最多 100

类比:AWS ALB / GCP Load Balancer。

Elixir 场景

  • 如果不用 Cloudflare Tunnel → 用 Vultr LB 做 L7 负载均衡
  • 用 CF Tunnel → 不需要 LB(CF 本身就是边缘 LB)

进阶

Object Storage(S3 兼容)

Vultr 自家 S3 兼容对象存储。

类比:AWS S3 / Cloudflare R2 / DigitalOcean Spaces。

Elixir 场景

  • 可以用来存 release 产物(mix release 出来的 tarball)
  • 也可以做 R2 的廉价备份($5/TB/月,比 S3 便宜)
# 创建 bucket
aws s3 --endpoint-url https://sgp1.vultrobjects.com mb s3://my-releases

# 上传 release
aws s3 --endpoint-url https://sgp1.vultrobjects.com \
  cp pipeline.tgz s3://my-releases/pipeline-v0.1.0.tgz

Kubernetes Engine(VKE)

Vultr 自家 K8s(托管)。

Elixir 场景

  • ❌ 用不上——我们走 libcluster gossip + cloud-init,K8s 太重
  • 如果你已经有 K8s 经验,VKE 比 EKS 便宜 50%,可以选

DNS(Vultr DNS)

免费的 authoritative DNS 服务。

类比:Route 53 / Cloudflare DNS。

Elixir 场景

  • 用 Cloudflare 即可(CF 的 DNS 一站式)
  • 不用 Vultr DNS

计费 / 财务

Hourly Billing(按小时计费)

Vultr 的核心计费模式——关掉(halt)不收费,删除(destroy)不收费,只按实际开机时间按小时计费

# 关机(不计费,但 snapshot / IP 仍计费)
curl -X POST ... https://api.vultr.com/v2/instances/<id>/halt

# 开机(重新计费)
curl -X POST ... https://api.vultr.com/v2/instances/<id>/start

关键haltdestroy。halt 保留磁盘数据,destroy 全删。

Elixir 按需起 VM 的核心halt 而不是 destroy——下次起来 5-10s(halt 状态恢复快)而不是 15-30s(destroy + 新建 + snapshot restore)。

Monthly Cap(月度上限)

Vultr 对每台 VM 设月度费用上限(plan 的月费)。超出按小时计费但不会超月费。这是 Vultr 跟 AWS / GCP 不同的”福利”

例:vc2-2c-4gb = $20/月 = 730 小时。超过 730 小时的部分不额外收费


Invoice / 计费明细

每张 Vultr 发票列出:

  • 每月费用按 VM 拆分
  • Snapshot / Backup / Reserved IP 单独算
  • 超出 bandwidth allowance 部分

Elixir 场景:autoscaler 在 spin up 前必须检查当月费用,避免超预算。

defmodule BillingGuard do
  def safe_to_spin_up? do
    current = get_current_month_spend()
    cap = Application.get_env(:pipeline, :monthly_cap, 50)
    current < cap
  end
end

Vultr vs 其他云

维度VultrAWS EC2DigitalOceanHetzner
按小时计费✅ 原生❌(月费)✅(部分)
Cold start15-30s60-120s60s30-60s
小时单价$0.007/h$0.0042/h (t3.nano)N/A€0.0045/h
最小月费$5$0$6€4.35
Snapshot 成本$0.05/GB/月$0.05/GB/月$1/GB/月€0.01/GB/月
Bandwidth4TB+单计费1TB+20TB
API 质量优秀 (v2)复杂 (300+ 服务)简单简单
CF 兼容
中文支持
稳定性极高极高

为什么选 Vultr

  • ✅ 原生按小时计费(DO 不行)
  • ✅ Snapshot 廉价(DO 贵 20x)
  • ✅ API 质量好(V2 设计干净)
  • ✅ Cloudflare 兼容好

自检清单

  • 知道 vc2-2c-4gb = 2 vCPU + 4GB + 4TB 带宽 + $20/月
  • 知道 sgp = Singapore,nrt = Tokyo,lax = LA
  • 知道 Snapshot 是整个 VM 状态、cold start 关键
  • 知道 Firewall Group 是 default-deny,必须显式开端口
  • 知道 cloud-init 只能跑一次(VM 重建才重跑)
  • 知道 haltdestroy(halt 保留数据、destroy 全删)
  • 知道按小时计费——halt 不计费,destroy 不计费
  • 知道 Vultr 没中国节点
  • 知道 Reserved IP 是不绑定 VM 的弹性 IP

相关资源