多云资源聚合与运维控制台。
Cloudaril 将云服务器、域名、DNS 和 AI 模型统一到一个控制面,并通过 REST API 与 MCP Server 对外提供自动化能力。
这个方式只需要 Docker,不需要额外启动 PostgreSQL 或 Redis,适合快速体验和个人使用:
export CLOUDARIL_MASTER_KEY="$(openssl rand -base64 32)"
docker pull ghcr.io/deershark/cloudaril:latest
docker run -d \
--name cloudaril \
--restart unless-stopped \
-p 8080:8080 \
-e CLOUDARIL_DB_DRIVER=sqlite \
-e CLOUDARIL_ADMIN_USERNAME=admin \
-e CLOUDARIL_ADMIN_PASSWORD=change-me-now \
-e CLOUDARIL_MASTER_KEY="$CLOUDARIL_MASTER_KEY" \
-v cloudaril-data:/data \
ghcr.io/deershark/cloudaril:latest打开 http://localhost:8080,使用 admin / change-me-now 登录控制台。首次启动会将管理员账号和密码初始化到数据库;后续重启不会用环境变量覆盖数据库中的凭据。
生产环境请将
CLOUDARIL_ADMIN_PASSWORD改成强密码,并固定保存CLOUDARIL_MASTER_KEY。不要在容器重建后更换主密钥,否则历史云凭据无法解密。
从仓库运行完整依赖栈:
git clone https://github.com/deershark/cloudaril.git
cd cloudaril
export CLOUDARIL_MASTER_KEY="$(openssl rand -base64 32)"
export CLOUDARIL_ADMIN_USERNAME='admin'
export CLOUDARIL_ADMIN_PASSWORD='change-me-now'
docker compose pull
docker compose up -d仓库中的 docker-compose.yml 默认使用 ghcr.io/deershark/cloudaril:latest,并启动 PostgreSQL、Redis 和 Cloudaril 服务,数据保存在 Docker volumes 中。默认访问地址仍为 http://localhost:8080。
如果要从当前源码构建而不是使用 GHCR 镜像:
docker build -t cloudaril:local .
CLOUDARIL_IMAGE=cloudaril:local docker compose up -d查看日志或停止服务:
docker compose logs -f cloudaril
docker compose stop发布镜像地址:
ghcr.io/deershark/cloudaril:latest
ghcr.io/deershark/cloudaril:<version>
docker pull ghcr.io/deershark/cloudaril:latest
docker stop cloudaril
docker rm cloudaril然后使用上面的 docker run 命令重新创建容器。只要保留 cloudaril-data volume,SQLite 数据不会丢失。
docker compose pull
docker compose up -d默认 Compose 配置使用 GHCR 发布镜像;从源码部署时设置 CLOUDARIL_IMAGE=cloudaril:local 即可切换到本地构建的镜像。
- 云服务器:跨账号实例聚合、详情、启动、停止、重启和 CPU / 内存 / 带宽监控。
- 域名与 DNS:域名列表、DNS 记录增删改查、Cloudflare 代理状态、DNSPod 启停状态。
- RDAP:查询注册信息和到期时间,临近到期时在控制台提示。
- AI 模型:聚合各云账号可用模型和模型 Key。
- REST API:JWT 与 API Key 双认证,适合脚本和 CI。
- 控制台安全:管理员账号和 bcrypt 密码哈希存储在数据库,支持 TOTP 2FA;未启用时控制台会持续提醒。
- MCP Server:让 Claude、Cursor 等 AI 客户端直接操作云资源。
- Provider:当前支持腾讯云、UCloud、Cloudflare,并保留扩展其他云厂商的适配器接口。
- 打开控制台并登录。
- 进入「云账号」页面。
- 选择 Provider,填写云厂商凭据。
- 保存前执行凭据连通性校验。
- 返回总览、实例、域名或模型页面查看资源。
不想配置真实凭据时,可以选择 演示(fake) Provider 体验内置数据。
| 环境变量 | 说明 | 默认值 |
|---|---|---|
CLOUDARIL_ADDR |
服务监听地址 | :8080 |
CLOUDARIL_DATA_DIR |
数据目录 | ./data |
CLOUDARIL_WEB_DIR |
前端构建产物目录 | ./web/dist |
CLOUDARIL_ADMIN_USERNAME |
控制台管理员账号(仅首次初始化使用) | admin |
CLOUDARIL_ADMIN_PASSWORD |
控制台管理密码(仅首次初始化使用,至少 8 位) | admin123 |
CLOUDARIL_MASTER_KEY |
Base64 编码的 32 字节凭据加密主密钥 | 开发密钥 |
CLOUDARIL_DB_DRIVER |
postgres 或 sqlite |
postgres |
CLOUDARIL_PG_DSN |
PostgreSQL 连接串 | postgres://cloudaril:cloudaril@localhost:5432/cloudaril?sslmode=disable |
CLOUDARIL_SQLITE_PATH |
SQLite 文件路径 | <DATA_DIR>/cloudaril.db |
CLOUDARIL_REDIS_ADDR |
Redis 地址 | localhost:6379 |
CLOUDARIL_REDIS_PASSWORD |
Redis 密码 | 空 |
CLOUDARIL_REDIS_DB |
Redis 逻辑库编号 | 0 |
CLOUDARIL_CACHE |
是否启用资源缓存 | 开启 |
CLOUDARIL_CACHE_INTERVAL |
缓存刷新间隔 | 5m |
CLOUDARIL_MODEL_KEY_EDIT |
是否允许在线编辑模型 Key 可访问模型 | 关闭 |
未设置 CLOUDARIL_MASTER_KEY 时,开发环境会使用内置密钥并打印告警;生产环境必须显式设置。
管理员首次启动时由 CLOUDARIL_ADMIN_USERNAME 和 CLOUDARIL_ADMIN_PASSWORD 创建数据库用户,密码只以 bcrypt 哈希保存。登录控制台后进入「系统设置 → 安全设置」,按提示扫描本地生成的 TOTP 二维码并确认 6 位验证码即可启用 2FA;页面同时保留备用密钥和 URI。启用后登录必须同时提供密码和动态验证码;如果没有启用,控制台会显示安全提醒。账号或密码也可以在该页面修改,已启用 2FA 时修改操作还需要当前动态码。
认证方式:
- 登录后使用
Authorization: Bearer <JWT>。 - 自动化脚本使用
X-API-Key: oc_...。
常用接口:
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/v1/auth/login |
登录获取 JWT |
GET |
/api/v1/settings/public |
获取登录页所需的公开站点配置 |
GET |
/api/v1/settings |
获取系统设置(仅 JWT) |
PUT |
/api/v1/settings |
更新系统设置(仅 JWT,Logo/Favicon 仅支持 HTTPS) |
GET |
/api/v1/auth/security |
查看管理员安全状态(仅 JWT) |
PUT |
/api/v1/auth/credentials |
修改管理员账号/密码(仅 JWT,需当前密码;已启用 2FA 时还需动态码) |
POST |
/api/v1/auth/2fa/setup |
生成 2FA 配置(仅 JWT) |
POST |
/api/v1/auth/2fa/enable |
使用 6 位验证码启用 2FA(仅 JWT) |
DELETE |
/api/v1/auth/2fa |
使用 6 位验证码关闭 2FA(仅 JWT) |
GET |
/api/v1/providers |
查看已注册 Provider |
GET / POST |
/api/v1/accounts |
查询 / 创建云账号 |
GET |
/api/v1/instances |
聚合实例列表 |
POST |
/api/v1/instances/action |
实例启动、停止、重启 |
GET |
/api/v1/domains |
查询域名列表 |
GET / POST |
/api/v1/domains/{domain}/records |
查询 / 创建 DNS 记录 |
PUT / DELETE |
/api/v1/domains/{domain}/records/{recordId} |
修改 / 删除 DNS 记录 |
GET |
/api/v1/models |
查询模型目录 |
GET |
/api/v1/modelkeys |
查询模型 Key |
GET / POST / DELETE |
/api/v1/apikeys[/{id}] |
管理 API Key |
示例:
cloudaril-server -create-apikey my-ci
curl -H "X-API-Key: oc_xxxxxxxx" \
http://localhost:8080/api/v1/instances构建 MCP Server:
cd backend
go build -o cloudaril-mcp ./cmd/mcpClaude Desktop / Cursor 配置:
{
"mcpServers": {
"cloudaril": {
"command": "/path/to/cloudaril-mcp",
"env": {
"CLOUDARIL_DATA_DIR": "/path/to/data",
"CLOUDARIL_MASTER_KEY": "与 REST Server 一致的主密钥"
}
}
}
}MCP 工具覆盖账号、实例、实例操作、域名、DNS 记录、模型和模型 Key 管理。关机、删除 DNS 记录等危险操作会带有 destructiveHint 标记。
- Docker Engine 与 Docker Compose
- Go 1.25+
- Node.js 22+
先启动 PostgreSQL 与 Redis:
docker compose -f docker-compose.dev.yml up -d启动后端:
cd backend
CLOUDARIL_PG_DSN='postgres://cloudaril:cloudaril@localhost:5432/cloudaril?sslmode=disable' \
CLOUDARIL_REDIS_ADDR=localhost:6379 \
go run ./cmd/server另开终端启动前端:
cd web
npm install
npm run dev前端地址为 http://localhost:5173,Vite 会将 API 请求代理到后端 :8080。本地也可以使用 SQLite:
cd backend
CLOUDARIL_DB_DRIVER=sqlite go run ./cmd/server验证代码:
cd backend && go test ./...
cd ../web && npm run typecheck && npm run buildcloudaril/
├── Dockerfile
├── docker-compose.yml
├── docker-compose.dev.yml
├── backend/
│ ├── cmd/server/ # REST API 与 SPA 托管
│ ├── cmd/mcp/ # MCP Server
│ └── internal/
│ ├── provider/ # 云厂商适配器
│ ├── service/ # 跨账号聚合业务
│ ├── api/ # REST 路由与中间件
│ ├── mcp/ # MCP 协议实现
│ ├── store/ # PostgreSQL / SQLite 持久化
│ └── config/ # 环境变量配置
└── web/ # React + Vite 控制台
- 生产环境使用随机且固定的
CLOUDARIL_MASTER_KEY,不要提交到 Git。 - 设置强
CLOUDARIL_ADMIN_PASSWORD,并将服务放在 TLS 反向代理之后。 - 限制 PostgreSQL、Redis 端口只监听内网或回环地址。
- API Key 只在创建时展示一次,请使用 Secret Manager 或 CI Secret 保存。
- 备份数据库和数据目录,并定期轮换云厂商凭据。
欢迎提交 Issue、PR 和新的 Provider 适配器。提交 PR 前请运行后端测试以及前端 typecheck / build,并确保不提交密钥、账号凭据或本地数据目录。更多协作约定见 CONTRIBUTING.md。
本项目使用 MIT License。
