- 已有运行中的 Seafile(Docker)
- 现有数据保持不变
- 新增几个 Azure Blob 作为额外存储
- 新文件可以选择存储到 Azure
方案:零停机追加磁盘
步骤 1:在宿主机挂载新的 Azure Blob
mount -t aznfs -o sec=sys,vers=3,nolock,proto=tcp <storage-account-name>.blob.core.windows.net:/<storage-account-name>/<container-name> /nfsdata
参考:使用 NFS 3.0 协议装载 Azure Blob 存储 – Azure Storage | Microsoft Learn
# 1. 安装 blobfuse2(如果还没装)
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
echo "deb [signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/$(lsb_release -rs)/prod $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/microsoft-prod.list
sudo apt update && sudo apt install -y blobfuse2
# 2. 创建挂载点(假设追加 3 个盘)
sudo mkdir -p /mnt/azure-blob1
sudo mkdir -p /mnt/azure-blob2
sudo mkdir -p /mnt/azure-blob3
# 3. 创建缓存目录
sudo mkdir -p /mnt/blobfuse-cache
sudo chmod 777 /mnt/blobfuse-cache
# 4. 挂载第 1 个盘(热存储)
sudo blobfuse2 mount /mnt/azure-blob1
--tmp-path=/mnt/blobfuse-cache/blob1
--container-name=seafile-hot
--account-name=你的账户名
--account-key=你的密钥
--allow-other
# 5. 挂载第 2 个盘(标准存储)
sudo blobfuse2 mount /mnt/azure-blob2
--tmp-path=/mnt/blobfuse-cache/blob2
--container-name=seafile-standard
--account-name=你的账户名
--account-key=你的密钥
--allow-other
# 6. 挂载第 3 个盘(冷存储)
sudo blobfuse2 mount /mnt/azure-blob3
--tmp-path=/mnt/blobfuse-cache/blob3
--container-name=seafile-cold
--account-name=你的账户名
--account-key=你的密钥
--allow-other
# 7. 验证挂载
df -h | grep azure-blob
ls -la /mnt/azure-blob1步骤 2:修改 Docker Compose 添加新磁盘
备份现有配置:
cp docker-compose.yml docker-compose.yml.backup编辑 docker-compose.yml,在 volumes 部分追加新磁盘:
version: '3.8'
services:
seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "80:80"
- "443:443"
volumes:
# === 现有的卷(保持不变)===
- /opt/seafile-data:/shared
# ... 你的其他现有卷 ...
# === 新增的 Azure Blob 磁盘 ===
- /mnt/azure-blob1:/azure/hot:rw
- /mnt/azure-blob2:/azure/standard:rw
- /mnt/azure-blob3:/azure/cold:rw
environment:
- SEAFILE_ADMIN_EMAIL=admin@example.com
- SEAFILE_ADMIN_PASSWORD=yourpassword
restart: unless-stopped步骤 3:重启容器加载新磁盘
# 重新创建容器(不会丢失数据)
docker-compose up -d
# 验证容器内可以看到新磁盘
docker exec -it seafile ls -la /azure步骤 4:配置 Seafile 添加新存储类
进入容器:
docker exec -it seafile bash备份配置:
cp /shared/seafile/conf/seafile.conf /shared/seafile/conf/seafile.conf.backup编辑配置文件:
vim /shared/seafile/conf/seafile.conf在文件末尾追加(不要动现有配置):
# ========== 新增 Azure 存储类 ==========
[storage]
enable_storage_classes = true
# Azure 热存储 - 高频访问文件
[storage_class_azure_hot]
name = azure_hot
storage_id = azure_hot
block_backend = fs
dir = /azure/hot/blocks
# 对应的 commit 和 fs 对象
[storage_class_azure_hot_commits]
name = azure_hot_commits
storage_id = azure_hot_commits
commit_object_backend = fs
dir = /azure/hot/commits
[storage_class_azure_hot_fs]
name = azure_hot_fs
storage_id = azure_hot_fs
fs_object_backend = fs
dir = /azure/hot/fs
# Azure 标准存储 - 常规文件
[storage_class_azure_standard]
name = azure_standard
storage_id = azure_standard
block_backend = fs
dir = /azure/standard/blocks
# Azure 冷存储 - 归档文件
[storage_class_azure_cold]
name = azure_cold
storage_id = azure_cold
block_backend = fs
dir = /azure/cold/blocks
# 注意:不设置 default_storage_class,保持现有存储为默认步骤 5:创建存储目录结构
在容器内:
# 创建目录
mkdir -p /azure/hot/blocks /azure/hot/commits /azure/hot/fs
mkdir -p /azure/standard/blocks /azure/standard/commits /azure/standard/fs
mkdir -p /azure/cold/blocks /azure/cold/commits /azure/cold/fs
# 设置权限
chmod -R 755 /azure步骤 6:重启 Seafile 服务
# 在容器内
/opt/seafile/seafile-server-latest/seafile.sh restart
/opt/seafile/seafile-server-latest/seahub.sh restart
# 或者在宿主机
exit
docker restart seafile步骤 7:验证新存储类
# 查看日志确认加载成功
docker logs seafile | grep -i storage
# 登录 Seafile 管理界面
# 系统管理 → 设置 → 存储后端
# 应该能看到新的存储类使用新增的存储
方法 1:创建新资料库时指定存储
通过 Seafile API 创建:
curl -X POST "http://your-seafile/api2/repos/"
-H "Authorization: Token your-token"
-d "name=New Project"
-d "storage_id=azure_hot"方法 2:通过管理界面分配
- 登录管理员账号
- 创建新资料库
- 选择存储后端:
azure_hot/azure_standard/azure_cold
方法 3:按规则自动分配(高级)
在 seafile.conf 中添加:
# 自动存储分配规则
[library_storage_rules]
# 大于 500MB 的资料库使用冷存储
rule_1_size_threshold = 500MB
rule_1_storage_id = azure_cold
# 频繁访问的使用热存储
rule_2_access_frequency = high
rule_2_storage_id = azure_hot
# 其他使用标准存储
default_storage_id = azure_standard设置开机自动挂载
创建 systemd 服务:
# Azure Blob 1
sudo tee /etc/systemd/system/azure-blob1.service <<'EOF'
[Unit]
Description=Mount Azure Blob 1 (Hot Storage)
After=network-online.target
Wants=network-online.target
Before=docker.service
[Service]
Type=forking
ExecStartPre=/bin/mkdir -p /mnt/azure-blob1 /mnt/blobfuse-cache/blob1
ExecStart=/usr/bin/blobfuse2 mount /mnt/azure-blob1
--tmp-path=/mnt/blobfuse-cache/blob1
--container-name=seafile-hot
--account-name=你的账户名
--account-key=你的密钥
--allow-other
ExecStop=/bin/fusermount -uz /mnt/azure-blob1
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Azure Blob 2
sudo tee /etc/systemd/system/azure-blob2.service <<'EOF'
[Unit]
Description=Mount Azure Blob 2 (Standard Storage)
After=network-online.target
Wants=network-online.target
Before=docker.service
[Service]
Type=forking
ExecStartPre=/bin/mkdir -p /mnt/azure-blob2 /mnt/blobfuse-cache/blob2
ExecStart=/usr/bin/blobfuse2 mount /mnt/azure-blob2
--tmp-path=/mnt/blobfuse-cache/blob2
--container-name=seafile-standard
--account-name=你的账户名
--account-key=你的密钥
--allow-other
ExecStop=/bin/fusermount -uz /mnt/azure-blob2
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Azure Blob 3
sudo tee /etc/systemd/system/azure-blob3.service <<'EOF'
[Unit]
Description=Mount Azure Blob 3 (Cold Storage)
After=network-online.target
Wants=network-online.target
Before=docker.service
[Service]
Type=forking
ExecStartPre=/bin/mkdir -p /mnt/azure-blob3 /mnt/blobfuse-cache/blob3
ExecStart=/usr/bin/blobfuse2 mount /mnt/azure-blob3
--tmp-path=/mnt/blobfuse-cache/blob3
--container-name=seafile-cold
--account-name=你的账户名
--account-key=你的密钥
--allow-other
ExecStop=/bin/fusermount -uz /mnt/azure-blob3
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# 启用所有服务
sudo systemctl daemon-reload
sudo systemctl enable azure-blob1.service azure-blob2.service azure-blob3.service
sudo systemctl start azure-blob1.service azure-blob2.service azure-blob3.service
# 检查状态
sudo systemctl status azure-blob1.service
sudo systemctl status azure-blob2.service
sudo systemctl status azure-blob3.service一键追加脚本
保存为 add-azure-storage.sh:
#!/bin/bash
set -e
# ===== 配置区域 =====
AZURE_ACCOUNT="你的存储账户名"
AZURE_KEY="你的访问密钥"
# 要追加的磁盘配置
declare -A DISKS=(
["blob1"]="seafile-hot"
["blob2"]="seafile-standard"
["blob3"]="seafile-cold"
)
echo "====== 追加 Azure Blob 存储到现有 Seafile ======"
# 检查 Seafile 是否运行
if ! docker ps | grep -q seafile; then
echo "错误:Seafile 容器未运行"
exit 1
fi
# 1. 安装 blobfuse2(如果未安装)
if ! command -v blobfuse2 &> /dev/null; then
echo "[1/6] 安装 blobfuse2..."
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
echo "deb [signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/$(lsb_release -rs)/prod $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/microsoft-prod.list
sudo apt update && sudo apt install -y blobfuse2
else
echo "[1/6] blobfuse2 已安装,跳过"
fi
# 2. 创建目录
echo "[2/6] 创建挂载点和缓存目录..."
sudo mkdir -p /mnt/blobfuse-cache
sudo chmod 777 /mnt/blobfuse-cache
# 3. 挂载所有磁盘
echo "[3/6] 挂载 Azure Blob..."
for disk_id in "${!DISKS[@]}"; do
container="${DISKS[$disk_id]}"
mount_point="/mnt/azure-$disk_id"
cache_dir="/mnt/blobfuse-cache/$disk_id"
sudo mkdir -p "$mount_point" "$cache_dir"
echo " 挂载 $container 到 $mount_point"
sudo blobfuse2 mount "$mount_point"
--tmp-path="$cache_dir"
--container-name="$container"
--account-name="$AZURE_ACCOUNT"
--account-key="$AZURE_KEY"
--allow-other
# 创建 systemd 服务
sudo tee "/etc/systemd/system/azure-$disk_id.service" > /dev/null <<EOF
[Unit]
Description=Mount Azure $disk_id ($container)
After=network-online.target
Wants=network-online.target
Before=docker.service
[Service]
Type=forking
ExecStartPre=/bin/mkdir -p $mount_point $cache_dir
ExecStart=/usr/bin/blobfuse2 mount $mount_point \
--tmp-path=$cache_dir \
--container-name=$container \
--account-name=$AZURE_ACCOUNT \
--account-key=$AZURE_KEY \
--allow-other
ExecStop=/bin/fusermount -uz $mount_point
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable "azure-$disk_id.service"
done
# 4. 备份 docker-compose.yml
echo "[4/6] 备份 Docker Compose 配置..."
if [ -f docker-compose.yml ]; then
cp docker-compose.yml docker-compose.yml.backup.$(date +%Y%m%d_%H%M%S)
echo " 备份完成"
else
echo " 警告:未找到 docker-compose.yml"
fi
# 5. 添加卷映射(需要手动编辑)
echo "[5/6] 请手动编辑 docker-compose.yml 添加以下卷:"
echo ""
for disk_id in "${!DISKS[@]}"; do
mount_point="/mnt/azure-$disk_id"
container_path="/azure/$disk_id"
echo " - $mount_point:$container_path:rw"
done
echo ""
read -p "编辑完成后按 Enter 继续..."
# 6. 重启容器
echo "[6/6] 重启 Seafile 容器..."
docker-compose up -d
echo ""
echo "====== 挂载完成 ======"
echo ""
echo "挂载点状态:"
df -h | grep azure
echo ""
echo "下一步:"
echo "1. docker exec -it seafile bash"
echo "2. vim /shared/seafile/conf/seafile.conf"
echo "3. 添加存储类配置(参考文档)"
echo "4. 重启 Seafile 服务"使用方法:
chmod +x add-azure-storage.sh
sudo ./add-azure-storage.sh迁移现有资料库到 Azure(可选)
如果想把某些现有资料库迁移到 Azure:
# 进入容器
docker exec -it seafile bash
# 查看所有资料库
cd /opt/seafile/seafile-server-latest
./seaf-fsck.sh --list
# 迁移指定资料库到 Azure 热存储
./seaf-migrate.sh --repo-id <library-id> --dest-storage-id azure_hot
# 批量迁移大于 500MB 的资料库到冷存储
for repo in $(./seaf-fsck.sh --list | awk '$4 > 500 {print $1}'); do
echo "迁移 $repo 到冷存储"
./seaf-migrate.sh --repo-id $repo --dest-storage-id azure_cold
done监控脚本
#!/bin/bash
# monitor-azure-expansion.sh
echo "====== Seafile Azure 扩展存储监控 ======"
date
echo ""
echo "=== 挂载状态 ==="
for disk in /mnt/azure-blob*; do
if [ -d "$disk" ]; then
if mountpoint -q "$disk"; then
size=$(du -sh "$disk" 2>/dev/null | cut -f1)
echo "✓ $disk 已挂载 (使用: $size)"
else
echo "✗ $disk 未挂载"
fi
fi
done
echo ""
echo "=== 存储使用情况 ==="
docker exec seafile du -sh /azure/* 2>/dev/null || echo "容器内路径不存在"
echo ""
echo "=== Seafile 服务状态 ==="
docker exec seafile /opt/seafile/seafile-server-latest/seafile.sh status验证清单
- [ ] Azure Blob 容器已创建
- [ ] 宿主机成功挂载所有 Azure Blob
- [ ] Docker Compose 已添加新卷映射
- [ ] 容器重启成功,可以访问 /azure 目录
- [ ] seafile.conf 已添加新存储类配置
- [ ] Seafile 服务重启成功
- [ ] 管理界面可以看到新存储类
- [ ] 测试创建新资料库到 Azure 存储
- [ ] systemd 服务已启用,开机自动挂载
- [ ] 监控脚本运行正常
常见问题
Q1: 会影响现有数据吗?
A: 不会!现有存储完全独立,新磁盘只是额外选项。
Q2: 需要停机吗?
A: 不需要!只需重启容器,几秒钟完成。
Q3: 如果不想用了怎么办?
A: 删除 docker-compose.yml 中的卷映射,重启容器即可。
Q4: 多少个磁盘合适?
A: 建议 2-5 个,按用途分:热/标准/冷/归档/备份。
Q5: 性能会受影响吗?
A: 现有数据走原路径,不受影响。新数据根据存储类型决定。