#!/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 write_policy_json() { local prefix="$1" out="$2" cat > "${out}" </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 < 全局管理 ${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 "$@"