Docs/ 基础设施/ 存储与卷

存储与卷

为容器提供持久化存储,支持本地磁盘、S3 和 Cloudflare R2 作为存储后端。

什么是卷

默认情况下,容器文件系统是临时的——容器重启或重新部署时,容器内写入的所有数据都会丢失。卷通过提供能够在容器生命周期事件中持久存在的存储来解决这个问题。

卷的常见用例包括:

  • 数据库数据目录(PostgreSQL、MySQL、MongoDB)
  • 用户上传的文件和媒体
  • 需要持久化的应用日志
  • 容器间的共享配置
  • 需要在重启后保留的缓存目录
Note
sh0 会自动为数据库服务(PostgreSQL、MySQL、Redis、MongoDB)创建卷。你只需为自定义应用存储手动创建卷。

创建持久卷

你可以通过控制台或 API 创建卷。

通过控制台:

  1. 导航到应用的 设置 → 存储 选项卡。
  2. 点击 添加卷
  3. 输入卷名称(例如 uploads)和容器挂载路径。
  4. 可选地设置大小限制。
  5. 点击 创建
Creating a new persistent volume in the dashboard

通过 API:

Terminal
curl -X POST https://your-server:9000/api/apps/my-app/mounts \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "uploads",
    "mount_path": "/app/uploads",
    "size_limit_mb": 5120
  }'

将卷挂载到容器

创建卷时,你需要指定容器内的挂载路径。卷数据存储在宿主机文件系统上,并绑定挂载到容器的指定路径。

docker-compose.yml
services:
  web:
    image: my-app:latest
    volumes:
      - uploads:/app/uploads
      - logs:/var/log/app

volumes:
  uploads:
  logs:

通过 Docker Compose 部署时,sh0 自动创建和管理 compose 文件中定义的命名卷。

Volume mount configuration showing container path mapping
Warning
避免将卷挂载到包含应用代码的路径(例如 /app)。这会用卷上的内容覆盖已部署的代码。请将卷挂载到子目录,如 /app/data/app/uploads

卷路径与权限

sh0 将卷数据存储在宿主机的以下位置:

Host Path
/var/lib/sh0/volumes/{stack_id}/{volume_name}

权限设置为与容器用户匹配。如果你的应用以非 root 用户运行(sh0 默认强制执行),卷目录归该用户的 UID/GID 所有。

Tip
如果遇到权限错误,请使用 id 检查容器内应用的 UID,并确保卷目录具有匹配的所有权。你可以从 sh0 终端修复权限。

存储提供商

除了本地卷外,sh0 还支持外部存储提供商用于备份和对象存储。

本地磁盘

默认的存储后端。卷直接存储在服务器的文件系统上。这是最简单的选项,对大多数工作负载提供最佳性能。

Amazon S3

为备份和大文件存储配置 S3 存储桶。导航到 设置 → 存储提供商 添加 S3 凭据。

Terminal
curl -X POST https://your-server:9000/api/storage-providers \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "production-backups",
    "type": "s3",
    "bucket": "my-backups",
    "region": "us-east-1",
    "access_key_id": "AKIA...",
    "secret_access_key": "..."
  }'
S3 storage provider configuration form

Cloudflare R2

Cloudflare R2 是一个零出站费用的 S3 兼容对象存储。sh0 原生支持 R2——配置方式与 S3 相同,使用你的 R2 端点:

Terminal
curl -X POST https://your-server:9000/api/storage-providers \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "r2-backups",
    "type": "s3",
    "bucket": "my-backups",
    "endpoint": "https://ACCOUNT_ID.r2.cloudflarestorage.com",
    "access_key_id": "...",
    "secret_access_key": "..."
  }'
Cloudflare R2 storage provider setup

管理存储

控制台中的存储面板显示堆栈的所有卷、大小以及挂载到的容器。在这里你可以:

  • 浏览文件:使用内置文件管理器查看卷内容。
  • 下载文件:导出单个文件或整个目录。
  • 调整大小:增加卷的大小限制。
  • 删除:移除卷及其所有数据(需确认)。
  • 备份:触发到已配置存储提供商的手动备份。
Storage management panel showing volumes and their usage
Danger
删除卷会永久销毁其包含的所有数据。此操作不可撤销。删除前请务必创建备份。