| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- #!/usr/bin/env bash
- # =============================================================================
- # FranklinWH Toolbox - MinIO 业务账号与策略配置脚本
- # =============================================================================
- # 作用(使用 root 管理员账户,通过 mc admin 完成):
- # 1. 创建业务 bucket:fwh-toolbox、fwh-toolbox-ai-file
- # 2. 创建两条自定义策略(基于桶名前缀通配):
- # - fwh-toolbox-rw :对 fwh-toolbox* 前缀桶可读写(含删),其余桶只读
- # - fwh-toolbox-ai-rw :对 fwh-toolbox-ai* 前缀桶可读写(含删),其余桶只读
- # 3. 创建两个业务用户并绑定对应策略:
- # - fwh-toolbox (后端主业务,用 MINIO_ACCESS_KEY/MINIO_SECRET_KEY)
- # - fwh-toolbox-ai (AI 文件,用 MINIO_AI_ACCESS_KEY/MINIO_AI_SECRET_KEY)
- #
- # 账号职责:
- # root 管理员 -> 建桶/建用户/设策略(全局管理)
- # fwh-toolbox -> 写 fwh-toolbox* 桶,读其余所有桶
- # fwh-toolbox-ai-> 写 fwh-toolbox-ai* 桶,读其余所有桶
- # 注意:fwh-toolbox-ai-file 同时匹配 fwh-toolbox* 与 fwh-toolbox-ai*,
- # 因此两个用户对该桶均有写权限(前缀通配的必然结果)。
- #
- # 前置条件:
- # - MinIO 已运行;mc(MinIO Client)已安装(见 install_deps.sh)
- #
- # 用法:
- # MINIO_ROOT_USER='admin' MINIO_ROOT_PASSWORD='强密码' \
- # MINIO_ACCESS_KEY='fwh-toolbox' MINIO_SECRET_KEY='强密码' \
- # MINIO_AI_ACCESS_KEY='fwh-toolbox-ai' MINIO_AI_SECRET_KEY='强密码' \
- # ./provision_minio.sh
- #
- # 可用环境变量(均有默认值):
- # MINIO_ALIAS mc alias 名 (默认 fwhlocal)
- # MINIO_ENDPOINT MinIO S3 API 地址 (默认 http://localhost:9198)
- # MINIO_ROOT_USER MinIO 管理员用户 (默认 jerry)
- # MINIO_ROOT_PASSWORD MinIO 管理员密码 (默认 minioadmin)
- # MINIO_ACCESS_KEY 业务用户 AK (默认 fwh-toolbox)
- # MINIO_SECRET_KEY 业务用户 SK (默认 fwh-toolbox)
- # MINIO_AI_ACCESS_KEY AI 用户 AK (默认 fwh-toolbox-ai)
- # MINIO_AI_SECRET_KEY AI 用户 SK (默认 fwh-toolbox-ai)
- # MINIO_BUCKET 主业务 bucket 名 (默认 fwh-toolbox)
- # MINIO_AI_BUCKET AI 文件 bucket 名 (默认 fwh-toolbox-ai-file)
- # =============================================================================
- set -euo pipefail
- MINIO_ALIAS="${MINIO_ALIAS:-fwhlocal}"
- # TODO: [确认] MinIO S3 API 地址
- MINIO_ENDPOINT="${MINIO_ENDPOINT:-http://localhost:9198}"
- # TODO: [必填] MinIO 管理员账户——传入真实强口令,勿用默认 minioadmin
- MINIO_ROOT_USER="${MINIO_ROOT_USER:-jerry}"
- MINIO_ROOT_PASSWORD="${MINIO_ROOT_PASSWORD:-minioadmin}"
- # TODO: [必填] 业务用户 AK/SK——须与 config.env 的 MINIO_ACCESS_KEY/MINIO_SECRET_KEY 一致
- MINIO_ACCESS_KEY="${MINIO_ACCESS_KEY:-fwh-toolbox}"
- MINIO_SECRET_KEY="${MINIO_SECRET_KEY:-fwh-toolbox}"
- # TODO: [必填] AI 用户 AK/SK
- MINIO_AI_ACCESS_KEY="${MINIO_AI_ACCESS_KEY:-fwh-toolbox-ai}"
- MINIO_AI_SECRET_KEY="${MINIO_AI_SECRET_KEY:-fwh-toolbox-ai}"
- MINIO_BUCKET="${MINIO_BUCKET:-fwh-toolbox}"
- MINIO_AI_BUCKET="${MINIO_AI_BUCKET:-fwh-toolbox-ai-file}"
- # 策略名与前缀(如需改动桶前缀在此调整)
- POLICY_BIZ="fwh-toolbox-rw"
- POLICY_AI="fwh-toolbox-ai-rw"
- PREFIX_BIZ="fwh-toolbox" # 写权限前缀:fwh-toolbox*
- PREFIX_AI="fwh-toolbox-ai" # 写权限前缀:fwh-toolbox-ai*
- c_reset='\033[0m'; c_blue='\033[1;34m'; c_green='\033[1;32m'; c_yellow='\033[1;33m'; c_red='\033[1;31m'
- info() { echo -e "${c_blue}[INFO]${c_reset} $*"; }
- ok() { echo -e "${c_green}[ OK ]${c_reset} $*"; }
- warn() { echo -e "${c_yellow}[WARN]${c_reset} $*"; }
- err() { echo -e "${c_red}[FAIL]${c_reset} $*" >&2; }
- TMP_DIR="$(mktemp -d)"
- cleanup() { rm -rf "${TMP_DIR}"; }
- trap cleanup EXIT
- # ---------------------------------------------------------------------------
- # 0. 预检
- # ---------------------------------------------------------------------------
- precheck() {
- command -v mc >/dev/null 2>&1 || { err "未找到 mc(MinIO Client),请先安装(install_deps.sh mc)"; exit 1; }
- for kv in \
- "MINIO_ROOT_PASSWORD:${MINIO_ROOT_PASSWORD}:minioadmin" \
- "MINIO_SECRET_KEY:${MINIO_SECRET_KEY}:fwh-toolbox" \
- "MINIO_AI_SECRET_KEY:${MINIO_AI_SECRET_KEY}:fwh-toolbox-ai"; do
- local name="${kv%%:*}"; local rest="${kv#*:}"; local val="${rest%%:*}"; local def="${rest##*:}"
- if [[ "${val}" == "${def}" ]]; then
- warn "${name} 仍为默认弱口令(${def}),生产环境请通过环境变量传入强口令。"
- fi
- done
- }
- # ---------------------------------------------------------------------------
- # 1. 设置 root alias
- # ---------------------------------------------------------------------------
- set_alias() {
- info "配置 mc alias(root): ${MINIO_ALIAS} -> ${MINIO_ENDPOINT}"
- mc alias set "${MINIO_ALIAS}" "${MINIO_ENDPOINT}" "${MINIO_ROOT_USER}" "${MINIO_ROOT_PASSWORD}" >/dev/null
- ok "alias 已配置"
- }
- # ---------------------------------------------------------------------------
- # 2. 建桶(幂等)
- # ---------------------------------------------------------------------------
- ensure_buckets() {
- local b
- for b in "${MINIO_BUCKET}" "${MINIO_AI_BUCKET}"; do
- if mc ls "${MINIO_ALIAS}/${b}" >/dev/null 2>&1; then
- ok "bucket 已存在:${b}"
- else
- mc mb "${MINIO_ALIAS}/${b}"
- ok "bucket 已创建:${b}"
- fi
- done
- }
- # 生成一条策略 JSON:$1=写前缀 -> 该前缀桶可读写(含删),其余所有桶只读
- # 用法:write_policy_json <prefix> <out_file>
- write_policy_json() {
- local prefix="$1" out="$2"
- cat > "${out}" <<JSON
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Sid": "ReadAllBuckets",
- "Effect": "Allow",
- "Action": ["s3:GetObject", "s3:ListBucket", "s3:GetBucketLocation"],
- "Resource": ["arn:aws:s3:::*"]
- },
- {
- "Sid": "WriteOwnPrefixBuckets",
- "Effect": "Allow",
- "Action": [
- "s3:PutObject",
- "s3:DeleteObject",
- "s3:AbortMultipartUpload",
- "s3:ListMultipartUploadParts"
- ],
- "Resource": ["arn:aws:s3:::${prefix}*/*"]
- },
- {
- "Sid": "ManageOwnPrefixBuckets",
- "Effect": "Allow",
- "Action": ["s3:ListBucketMultipartUploads"],
- "Resource": ["arn:aws:s3:::${prefix}*"]
- }
- ]
- }
- JSON
- }
- # ---------------------------------------------------------------------------
- # 3. 创建/更新策略(幂等:先尝试 create,已存在则用最新文件覆盖)
- # ---------------------------------------------------------------------------
- ensure_policy() {
- local name="$1" file="$2"
- if mc admin policy info "${MINIO_ALIAS}" "${name}" >/dev/null 2>&1; then
- info "策略已存在,更新:${name}"
- # 不同 mc 版本子命令略有差异:优先 create(覆盖),回退 add
- mc admin policy create "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null 2>&1 \
- || mc admin policy add "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null
- else
- info "创建策略:${name}"
- mc admin policy create "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null 2>&1 \
- || mc admin policy add "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null
- fi
- ok "策略就绪:${name}"
- }
- # ---------------------------------------------------------------------------
- # 4. 创建用户(幂等)并绑定策略
- # ---------------------------------------------------------------------------
- ensure_user() {
- local ak="$1" sk="$2" policy="$3"
- if mc admin user info "${MINIO_ALIAS}" "${ak}" >/dev/null 2>&1; then
- ok "用户已存在:${ak}"
- else
- mc admin user add "${MINIO_ALIAS}" "${ak}" "${sk}" >/dev/null
- ok "用户已创建:${ak}"
- fi
- # 绑定策略(幂等:attach 已绑定会报错,忽略即可)
- mc admin policy attach "${MINIO_ALIAS}" "${policy}" --user "${ak}" >/dev/null 2>&1 \
- || mc admin policy set "${MINIO_ALIAS}" "${policy}" "user=${ak}" >/dev/null 2>&1 \
- || true
- ok "已绑定策略 ${policy} -> 用户 ${ak}"
- }
- main() {
- echo "===== FranklinWH Toolbox MinIO 账号与策略配置 ====="
- precheck
- set_alias
- ensure_buckets
- write_policy_json "${PREFIX_BIZ}" "${TMP_DIR}/${POLICY_BIZ}.json"
- write_policy_json "${PREFIX_AI}" "${TMP_DIR}/${POLICY_AI}.json"
- ensure_policy "${POLICY_BIZ}" "${TMP_DIR}/${POLICY_BIZ}.json"
- ensure_policy "${POLICY_AI}" "${TMP_DIR}/${POLICY_AI}.json"
- ensure_user "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" "${POLICY_BIZ}"
- ensure_user "${MINIO_AI_ACCESS_KEY}" "${MINIO_AI_SECRET_KEY}" "${POLICY_AI}"
- cat <<EOF
- ${c_green}MinIO 配置完成${c_reset}
- Endpoint : ${MINIO_ENDPOINT}
- Buckets : ${MINIO_BUCKET}, ${MINIO_AI_BUCKET}
- 账号与权限:
- root(${MINIO_ROOT_USER}) -> 全局管理
- ${MINIO_ACCESS_KEY} -> 策略 ${POLICY_BIZ}:写 ${PREFIX_BIZ}* 桶(含删),读其余所有桶
- ${MINIO_AI_ACCESS_KEY} -> 策略 ${POLICY_AI}:写 ${PREFIX_AI}* 桶(含删),读其余所有桶
- ${c_yellow}提示${c_reset}:${MINIO_AI_BUCKET} 同时匹配 ${PREFIX_BIZ}* 与 ${PREFIX_AI}*,
- 故 ${MINIO_ACCESS_KEY} 与 ${MINIO_AI_ACCESS_KEY} 对该桶均可写。
- 请确保 config.env 中 MINIO_ACCESS_KEY/MINIO_SECRET_KEY 与此处业务用户一致。
- EOF
- }
- main "$@"
|