Skip to main content

部署 File v2 接入 S3 对象存储

单节点部署

部署 File 文件服务

  1. 下载镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
  2. 创建数据目录

    mkdir -p /data/file/volume/{cache,data,fetchtmp,multitmp,tmp}
  3. 创建配置文件存放目录

    mkdir -p /usr/local/MDPrivateDeployment/clusterMode/config
  4. 创建对接存储的 s3-config.json 文件 ,模板如下

    cat > /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json << EOF
    {
    "mode": 1,
    "accessKeyID": "your_accessKey",
    "secretAccessKey": "your_secretKey",
    "bucketEndPoint": "http://192.168.0.11:9011",
    "bucketName": {
    "mdmedia": "mdmedia",
    "mdpic": "mdpic",
    "mdpub": "mdpub",
    "mdoc": "mdoc"
    },
    "region": "1",
    "addressingModel": 1
    }
    EOF
    • 针对自建 MinIO 对象存储,accessKeyIDsecretAccessKey 替换成 MinIO 服务的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 变量值即可
    • 针对自建 MinIO 对象存储默认没有 region 定义,这里值随机填写个 1 就可以
    • 针对自建 MinIO 对象存储通常通过 IP 访问,"addressingModel": 1 参数 这里就需要加上,避免 bucket 自动加在 IP 前拼接成错误的 endpoint 地址
  5. 创建 file.yaml 文件

    cat > /usr/local/MDPrivateDeployment/clusterMode/file.yaml <<EOF
    version: '3'
    services:
    file:
    image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
    volumes:
    - /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime
    - /data/file/volume:/data/storage
    - /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.json
    ports:
    - "9000:9000"
    environment:
    ENV_ACCESS_KEY_FILE: storage
    ENV_SECRET_KEY_FILE: 12345678910
    ENV_MINGDAO_PROTO: "http"
    ENV_MINGDAO_HOST: "mdy.domain.com"
    ENV_MINGDAO_PORT: "80"
    # Redis 主从模式
    ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"
    # Redis 哨兵模式
    #ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"
    #ENV_REDIS_SENTINEL_MASTER: "mymaster"
    #ENV_REDIS_SENTINEL_PASSWORD: "password"
    ENV_FILECACHE_EXPIRE: "false"
    ENV_FILE_ID: "file1"
    ENV_FILE_DOMAIN: "http://file:9000"
    command: ["./main", "server", "/data/storage/data"]
    EOF
    • 变量中指定的访问地址,在部署中注意替换为实际的系统主地址
    • redis 连接信息在实际部署中注意替换为实际的密码与IP
    • 如多节点部署,ENV_FILE_ID 每个实例的此变量值需要不同,如 file1file2file3
    • 注意,在 file v2 版本中,MINIO_ACCESS_KEYMINIO_SECRET_KEY 变量已废弃,改为 ENV_ACCESS_KEY_FILEENV_SECRET_KEY_FILE 替代,来验证微服务到 file 服务之间的认证
    • ENV_FILE_DOMAIN 变量值与微服务配置文件中的 ENV_FILE_ENDPOINTS 内容一致,但需要增加 http://
  6. 创建启停脚本

    cat > /usr/local/MDPrivateDeployment/clusterMode/start.sh <<EOF
    docker stack deploy -c /usr/local/MDPrivateDeployment/clusterMode/file.yaml file
    EOF

    cat > /usr/local/MDPrivateDeployment/clusterMode/stop.sh <<EOF
    docker stack rm file
    EOF

    chmod +x /usr/local/MDPrivateDeployment/clusterMode/start.sh
    chmod +x /usr/local/MDPrivateDeployment/clusterMode/stop.sh
  7. 初始化 swarm(如此节点已初始化过可忽略)

    docker swarm init
  8. 启动服务

    bash /usr/local/MDPrivateDeployment/clusterMode/start.sh
  9. 加入开机自启动

    echo "bash /usr/local/MDPrivateDeployment/clusterMode/start.sh" >> /etc/rc.local
    chmod +x /etc/rc.local

初始化预制文件

预制文件包 中的内容(mdmediamdpicmdpubmdoc 4个文件夹下的数据)根据 bucketName 映射关系上传到对象存储对应的 bucket 中。

针对常见云对象存储服务,初始化时可参考文档:明道云私有部署阿里云OSS初始化说明,不同云对象存储上传文件方式基本相似。

针对本地自建 minio 对象存储,可参考下面示例步骤:

  1. 下载预制文件包

    wget https://pdpublic.mingdao.com/private-deployment/source/1.7.0/file_init.tar.gz
  2. 解压预制文件包

    tar xf file_init.tar.gz
  3. 拷贝解压出的 data 目录到 minio 容器内(如是 minio 集群环境,只拷贝到任意一个容器内即可)

    docker cp data xxx:/tmp
  4. 进入此 minio 容器

    docker exec -it xxx bash
  5. 添加 minio 服务别名

    mc alias set myminio http://127.0.0.1:9000 mingdao 123456789
  6. 创建 bucket

    mc mb myminio/mdmedia
    mc mb myminio/mdoc
    mc mb myminio/mdpic
    mc mb myminio/mdpub
  7. 上传本地预制文件到 minio 对象存储对应的 bucket 中

    mc cp -r /tmp/data/mdmedia/* myminio/mdmedia
    mc cp -r /tmp/data/mdoc/* myminio/mdoc
    mc cp -r /tmp/data/mdpic/* myminio/mdpic
    mc cp -r /tmp/data/mdpub/* myminio/mdpub

多节点部署

初始化 Docker Swarm 集群

  1. 在第一台节点上执行 swarm 初始化命令

    docker swarm init

    # 初始化命令执行后会输出 join 命令,后面需要在其他三节点上运行
    # 当服务器上有多个IP地址时,可以使用 --advertise-addr 参数指定其他节点用来连接到当前管理节点的IP和端口
    # docker swarm init --advertise-addr 192.168.1.11
  2. 分别在其他节点上运行 join 命令,加入 swarm 集群

    docker swarm join --token xxxxxxxx

    # 如遗忘 token ,可在第一台 init 的服务器上通过以下命令查看:
    # docker swarm join-token worker
  3. 查看节点并记录下来各节点ID

    docker node ls

部署 File 文件服务

以下步骤各服务器都需要操作

  1. 下载镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
  2. 创建数据目录

    mkdir -p /data/file/volume/{cache,data,fetchtmp,multitmp,tmp}
  3. 创建配置文件存放目录

    mkdir -p /usr/local/MDPrivateDeployment/clusterMode/config
  4. 创建对接存储的 s3-config.json 文件 ,模板如下

    cat > /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json << EOF
    {
    "mode": 1,
    "accessKeyID": "your_accessKey",
    "secretAccessKey": "your_secretKey",
    "bucketEndPoint": "http://192.168.0.11:9011",
    "bucketName": {
    "mdmedia": "mdmedia",
    "mdpic": "mdpic",
    "mdpub": "mdpub",
    "mdoc": "mdoc"
    },
    "region": "1",
    "addressingModel": 1
    }
    EOF
    • 针对自建 MinIO 对象存储,accessKeyID 与 secretAccessKey替换成 MinIO 服务的MINIO_ROOT_USERMINIO_ROOT_PASSWORD` 变量值即可
    • 针对自建 MinIO 对象存储默认没有 region 定义,这里值随机填写个 1 就可以
    • 针对自建 MinIO 对象存储通常通过 IP 访问,"addressingModel": 1 参数 这里就需要加上,避免 bucket 自动加在 IP 前拼接成错误的 endpoint 地址
    • 针对自建 MinIO 对象存储集群环境,各 file 节点 s3-config.json 文件中 bucketEndPoint 的值,可以写不同 minio 的节点地址

以下步骤仅在第一台节点上操作

  1. 创建配置文件存放目录

    mkdir -p /usr/local/MDPrivateDeployment/clusterMode
  2. 创建 file.yaml

    cat > /usr/local/MDPrivateDeployment/clusterMode/file.yaml <<EOF
    version: '3'
    services:
    file1:
    hostname: file1
    image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
    volumes:
    - /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime
    - /data/file/volume:/data/storage
    - /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.json
    ports:
    - "9001:9000"
    environment:
    ENV_ACCESS_KEY_FILE: storage
    ENV_SECRET_KEY_FILE: 12345678910
    ENV_MINGDAO_PROTO: "http"
    ENV_MINGDAO_HOST: "mdy.domain.com"
    ENV_MINGDAO_PORT: "80"
    # Redis 主从模式
    ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"
    # Redis 哨兵模式
    #ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"
    #ENV_REDIS_SENTINEL_MASTER: "mymaster"
    #ENV_REDIS_SENTINEL_PASSWORD: "password"
    ENV_FILECACHE_EXPIRE: "false"
    ENV_FILE_ID: "file1"
    ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"
    command: ["./main", "server", "/data/storage/data"]
    deploy:
    placement:
    constraints:
    - node.id == xxxxxxxxxxxxxxxx # File Node01的 node.id 值

    file2:
    hostname: file2
    image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
    volumes:
    - /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime
    - /data/file/volume:/data/storage
    - /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.json
    ports:
    - "9002:9000"
    environment:
    ENV_ACCESS_KEY_FILE: storage
    ENV_SECRET_KEY_FILE: 12345678910
    ENV_MINGDAO_PROTO: "http"
    ENV_MINGDAO_HOST: "mdy.domain.com"
    ENV_MINGDAO_PORT: "80"
    # Redis 主从模式
    ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"
    # Redis 哨兵模式
    #ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"
    #ENV_REDIS_SENTINEL_MASTER: "mymaster"
    #ENV_REDIS_SENTINEL_PASSWORD: "password"
    ENV_FILECACHE_EXPIRE: "false"
    ENV_FILE_ID: "file2"
    ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"
    command: ["./main", "server", "/data/storage/data"]
    deploy:
    placement:
    constraints:
    - node.id == xxxxxxxxxxxxxxxx # File Node02的 node.id 值

    file3:
    hostname: file3
    image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
    volumes:
    - /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime
    - /data/file/volume:/data/storage
    - /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.json
    ports:
    - "9003:9000"
    environment:
    ENV_ACCESS_KEY_FILE: storage
    ENV_SECRET_KEY_FILE: 12345678910
    ENV_MINGDAO_PROTO: "http"
    ENV_MINGDAO_HOST: "mdy.domain.com"
    ENV_MINGDAO_PORT: "80"
    # Redis 主从模式
    ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"
    # Redis 哨兵模式
    #ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"
    #ENV_REDIS_SENTINEL_MASTER: "mymaster"
    #ENV_REDIS_SENTINEL_PASSWORD: "password"
    ENV_FILECACHE_EXPIRE: "false"
    ENV_FILE_ID: "file3"
    ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"
    command: ["./main", "server", "/data/storage/data"]
    deploy:
    placement:
    constraints:
    - node.id == xxxxxxxxxxxxxxxx # File Node03的 node.id 值

    file4:
    hostname: file4
    image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
    volumes:
    - /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime
    - /data/file/volume:/data/storage
    - /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.json
    ports:
    - "9004:9000"
    environment:
    ENV_ACCESS_KEY_FILE: storage
    ENV_SECRET_KEY_FILE: 12345678910
    ENV_MINGDAO_PROTO: "http"
    ENV_MINGDAO_HOST: "mdy.domain.com"
    ENV_MINGDAO_PORT: "80"
    # Redis 主从模式
    ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"
    # Redis 哨兵模式
    #ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"
    #ENV_REDIS_SENTINEL_MASTER: "mymaster"
    #ENV_REDIS_SENTINEL_PASSWORD: "password"
    ENV_FILECACHE_EXPIRE: "false"
    ENV_FILE_ID: "file4"
    ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"
    command: ["./main", "server", "/data/storage/data"]
    deploy:
    placement:
    constraints:
    - node.id == xxxxxxxxxxxxxxxx # File Node04的 node.id 值
    EOF
    • 变量中指定的访问地址,在部署中注意替换为实际的系统主地址
    • redis 连接信息在实际部署中注意替换为实际的密码与IP
    • 如多节点部署,ENV_FILE_ID 每个实例的此变量值需要不同,如 file1file2file3
    • 注意,在 file v2 版本中,MINIO_ACCESS_KEYMINIO_SECRET_KEY 变量已废弃,改为 ENV_ACCESS_KEY_FILEENV_SECRET_KEY_FILE 替代,来验证微服务到 file 服务之间的认证
    • ENV_FILE_DOMAIN 变量值与微服务配置文件中的 ENV_FILE_ENDPOINTS 内容一致,但需要增加 http://
  3. 创建启停脚本

    cat > /usr/local/MDPrivateDeployment/clusterMode/start.sh <<EOF
    docker stack deploy -c /usr/local/MDPrivateDeployment/clusterMode/file.yaml file
    EOF

    cat > /usr/local/MDPrivateDeployment/clusterMode/stop.sh <<EOF
    docker stack rm file
    EOF

    chmod +x /usr/local/MDPrivateDeployment/clusterMode/start.sh
    chmod +x /usr/local/MDPrivateDeployment/clusterMode/stop.sh
  4. 启动服务

    bash /usr/local/MDPrivateDeployment/clusterMode/start.sh
  5. 加入开机自启动

    echo "bash /usr/local/MDPrivateDeployment/clusterMode/start.sh" >> /etc/rc.local
    chmod +x /etc/rc.local

初始化预制文件

预制文件包 中的内容(mdmediamdpicmdpubmdoc 4个文件夹下的数据)根据 bucketName 映射关系上传到对象存储对应的 bucket 中。

针对常见云对象存储服务,初始化时可参考文档:明道云私有部署阿里云OSS初始化说明,不同云对象存储上传文件方式基本相似。

针对本地自建 minio 对象存储,可参考下面示例步骤:

  1. 下载预制文件包

    wget https://pdpublic.mingdao.com/private-deployment/source/1.7.0/file_init.tar.gz
  2. 解压预制文件包

    tar xf file_init.tar.gz
  3. 拷贝解压出的 data 目录到 minio 容器内(如是 minio 集群环境,只拷贝到任意一个容器内即可)

    docker cp data xxx:/tmp
  4. 进入此 minio 容器

    docker exec -it xxx bash
  5. 添加 minio 服务别名

    mc alias set myminio http://127.0.0.1:9000 mingdao 123456789
  6. 创建 bucket

    mc mb myminio/mdmedia
    mc mb myminio/mdoc
    mc mb myminio/mdpic
    mc mb myminio/mdpub
  7. 上传本地预制文件到 minio 对象存储对应的 bucket 中

    mc cp -r /tmp/data/mdmedia/* myminio/mdmedia
    mc cp -r /tmp/data/mdoc/* myminio/mdoc
    mc cp -r /tmp/data/mdpic/* myminio/mdpic
    mc cp -r /tmp/data/mdpub/* myminio/mdpub