Skip to content

seaweedfs 3.94

Master + Volume 是完整的存储核心;Filer 是文件系统元数据扩展层;SeaweedFS-S3 是建立在 Filer 之上的 S3 协议适配层。
Master(元数据)
Volume(文件存储)
Filer(S3/文件系统接口)

sh
mkdir master volume filer
yml
services:
  seaweedfs-master:
    image: chrislusf/seaweedfs:3.94
    container_name: seaweedfs-master
    restart: unless-stopped
    command: >
      master
      -ip=seaweedfs-master
      -mdir=/data
      -defaultReplication=000
    expose:
      - "9333"
    volumes:
      - ./master:/data
    networks:
      - seaweedfs-net

  seaweedfs-volume:
    image: chrislusf/seaweedfs:3.94
    container_name: seaweedfs-volume
    restart: unless-stopped
    depends_on:
      - seaweedfs-master
    command: >
      volume
      -mserver=seaweedfs-master:9333
      -ip=seaweedfs-volume
      -dir=/data
      -max=0
    expose:
      - "8080"
      - "18080"
    volumes:
      - ./volume:/data
    networks:
      - seaweedfs-net

  seaweedfs-filer:
    image: chrislusf/seaweedfs:3.94
    container_name: seaweedfs-filer
    restart: unless-stopped
    depends_on:
      - seaweedfs-master
      - seaweedfs-volume
    command: >
      filer
      -master=seaweedfs-master:9333
      -ip=seaweedfs-filer
      -port=8888
    expose:
      - "8888"
    volumes:
      - ./filer:/data
    networks:
      - seaweedfs-net

  seaweedfs-s3:
    image: chrislusf/seaweedfs:3.94
    container_name: seaweedfs-s3
    restart: unless-stopped
    depends_on:
      - seaweedfs-filer
    command: >
      s3
      -filer=seaweedfs-filer:8888
      -port=8333
      -ip.bind=0.0.0.0
    ports:
      - "8333:8333"
    networks:
      - seaweedfs-net

networks:
  seaweedfs-net:
    external: true
    name: seaweedfs-net

创建账号

sh
docker exec -it seaweedfs-s3 sh

# 生成配置
weed shell -master=seaweedfs-master:9333 -filer=seaweedfs-filer:8888

# 创建账号
s3.configure -user=app -actions=Read,Write,List,Tagging,Admin -apply -access_key=app_access_key -secret_key=app_secret_key_123456

然后会得到

access_key = xxxxxxxxx

secret_key = xxxxxxxxx

安装 MinIO Client

sh
curl -L https://dl.min.io/client/mc/release/linux-amd64/mc -o mc
sh
chmod +x mc

sudo mv mc /usr/local/bin/

sh
docker run --rm -it --network seaweedfs-net minio/mc sh

mc alias set seaweed http://seaweedfs-s3:8333 app_access_key app_secret_key_123456

mc ls seaweed

mc mb seaweed/wanx

mc ls seaweed

关于线上 key

js
import crypto from "node:crypto"
import { customAlphabet } from "nanoid"

// AWS Access Key 使用的字符集(不包含容易混淆的字符)
const nanoid = customAlphabet(
  "ABCDEFGHJKLMNPQRSTUVWXYZ23456789",
  16,
)

/**
 * 生成 S3 凭证
 */
export function generateS3Credential() {
  const accessKeyId = `AKIA${nanoid()}`
  const secretAccessKey = crypto
    .randomBytes(32)
    .toString("base64url")

  return {
    accessKeyId,
    secretAccessKey,
  }
}

// 示例
const credential = generateS3Credential()

console.log("Access Key ID:    ", credential.accessKeyId)
console.log("Secret Access Key:", credential.secretAccessKey)

js
import crypto from "node:crypto"

const ACCESS_KEY_CHARS =
  "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"

function randomString(length: number): string {
  const bytes = crypto.randomBytes(length)
  let result = ""

  for (let i = 0; i < length; i++) {
    result += ACCESS_KEY_CHARS[
      bytes[i] % ACCESS_KEY_CHARS.length
    ]
  }

  return result
}

export function generateS3Credential() {
  return {
    accessKeyId: `AKIA${randomString(16)}`,
    secretAccessKey: crypto
      .randomBytes(32)
      .toString("base64url"),
  }
}