Logo

在现有Seafile 上追加 Azure Blob 磁盘

photo

2025年11月21日

  • 已有运行中的 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:通过管理界面分配

  1. 登录管理员账号
  2. 创建新资料库
  3. 选择存储后端: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: 现有数据走原路径,不受影响。新数据根据存储类型决定。

橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它
所有附件
该文章没有附件.
本文为原创文章,请注意保留出处!

留言板

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

热门文章

Sql Server 部署SSIS包完成远程数据传输 本篇介绍如何使用SSIS和作业完成自动更新目标数据任务。**温馨提示:如需转载本文,请注明...SqlServer部署SSIS包完成远程数据传输 作者:Pastore Antonio
1637 浏览量
EWS(Exchange Service)基本使用(获取个人会议,会议室会议内容,会议室列表,发送会议,修改会议,删除会议) 最近公司要求和exchange服务对接,所以稍微研究了一下官方文档,做出以下总结,欢迎大家补充。先...EWS(ExchangeService)基本使用(获取个人会议,会议室会议内容,会议室列表,发送会议,修改会议,删除会议) 作者:Pastore Antonio
1628 浏览量
SQL Server AG集群启动不起来的临时自救大招 背景前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群...SQLServerAG集群启动不起来的临时自救大招 作者:Pastore Antonio
1616 浏览量
SharePoint2010升级到SharePoint2013操作手册 SharePoint2010升级到SharePoint2013操作手册目录第一章...SharePoint2010升级到SharePoint2013操作手册 作者:Pastore Antonio
1615 浏览量
C# DataTable 某一列求和 列为数字类型doubletotal=Convert.ToDouble(datatable.Com...C#DataTable某一列求和 作者:Pastore Antonio
1606 浏览量