provision_minio.sh 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #!/usr/bin/env bash
  2. # =============================================================================
  3. # FranklinWH Toolbox - MinIO 业务账号与策略配置脚本
  4. # =============================================================================
  5. # 作用(使用 root 管理员账户,通过 mc admin 完成):
  6. # 1. 创建业务 bucket:fwh-toolbox、fwh-toolbox-ai-file
  7. # 2. 创建两条自定义策略(基于桶名前缀通配):
  8. # - fwh-toolbox-rw :对 fwh-toolbox* 前缀桶可读写(含删),其余桶只读
  9. # - fwh-toolbox-ai-rw :对 fwh-toolbox-ai* 前缀桶可读写(含删),其余桶只读
  10. # 3. 创建两个业务用户并绑定对应策略:
  11. # - fwh-toolbox (后端主业务,用 MINIO_ACCESS_KEY/MINIO_SECRET_KEY)
  12. # - fwh-toolbox-ai (AI 文件,用 MINIO_AI_ACCESS_KEY/MINIO_AI_SECRET_KEY)
  13. #
  14. # 账号职责:
  15. # root 管理员 -> 建桶/建用户/设策略(全局管理)
  16. # fwh-toolbox -> 写 fwh-toolbox* 桶,读其余所有桶
  17. # fwh-toolbox-ai-> 写 fwh-toolbox-ai* 桶,读其余所有桶
  18. # 注意:fwh-toolbox-ai-file 同时匹配 fwh-toolbox* 与 fwh-toolbox-ai*,
  19. # 因此两个用户对该桶均有写权限(前缀通配的必然结果)。
  20. #
  21. # 前置条件:
  22. # - MinIO 已运行;mc(MinIO Client)已安装(见 install_deps.sh)
  23. #
  24. # 用法:
  25. # MINIO_ROOT_USER='admin' MINIO_ROOT_PASSWORD='强密码' \
  26. # MINIO_ACCESS_KEY='fwh-toolbox' MINIO_SECRET_KEY='强密码' \
  27. # MINIO_AI_ACCESS_KEY='fwh-toolbox-ai' MINIO_AI_SECRET_KEY='强密码' \
  28. # ./provision_minio.sh
  29. #
  30. # 可用环境变量(均有默认值):
  31. # MINIO_ALIAS mc alias 名 (默认 fwhlocal)
  32. # MINIO_ENDPOINT MinIO S3 API 地址 (默认 http://localhost:9198)
  33. # MINIO_ROOT_USER MinIO 管理员用户 (默认 jerry)
  34. # MINIO_ROOT_PASSWORD MinIO 管理员密码 (默认 minioadmin)
  35. # MINIO_ACCESS_KEY 业务用户 AK (默认 fwh-toolbox)
  36. # MINIO_SECRET_KEY 业务用户 SK (默认 fwh-toolbox)
  37. # MINIO_AI_ACCESS_KEY AI 用户 AK (默认 fwh-toolbox-ai)
  38. # MINIO_AI_SECRET_KEY AI 用户 SK (默认 fwh-toolbox-ai)
  39. # MINIO_BUCKET 主业务 bucket 名 (默认 fwh-toolbox)
  40. # MINIO_AI_BUCKET AI 文件 bucket 名 (默认 fwh-toolbox-ai-file)
  41. # =============================================================================
  42. set -euo pipefail
  43. MINIO_ALIAS="${MINIO_ALIAS:-fwhlocal}"
  44. # TODO: [确认] MinIO S3 API 地址
  45. MINIO_ENDPOINT="${MINIO_ENDPOINT:-http://localhost:9198}"
  46. # TODO: [必填] MinIO 管理员账户——传入真实强口令,勿用默认 minioadmin
  47. MINIO_ROOT_USER="${MINIO_ROOT_USER:-jerry}"
  48. MINIO_ROOT_PASSWORD="${MINIO_ROOT_PASSWORD:-minioadmin}"
  49. # TODO: [必填] 业务用户 AK/SK——须与 config.env 的 MINIO_ACCESS_KEY/MINIO_SECRET_KEY 一致
  50. MINIO_ACCESS_KEY="${MINIO_ACCESS_KEY:-fwh-toolbox}"
  51. MINIO_SECRET_KEY="${MINIO_SECRET_KEY:-fwh-toolbox}"
  52. # TODO: [必填] AI 用户 AK/SK
  53. MINIO_AI_ACCESS_KEY="${MINIO_AI_ACCESS_KEY:-fwh-toolbox-ai}"
  54. MINIO_AI_SECRET_KEY="${MINIO_AI_SECRET_KEY:-fwh-toolbox-ai}"
  55. MINIO_BUCKET="${MINIO_BUCKET:-fwh-toolbox}"
  56. MINIO_AI_BUCKET="${MINIO_AI_BUCKET:-fwh-toolbox-ai-file}"
  57. # 策略名与前缀(如需改动桶前缀在此调整)
  58. POLICY_BIZ="fwh-toolbox-rw"
  59. POLICY_AI="fwh-toolbox-ai-rw"
  60. PREFIX_BIZ="fwh-toolbox" # 写权限前缀:fwh-toolbox*
  61. PREFIX_AI="fwh-toolbox-ai" # 写权限前缀:fwh-toolbox-ai*
  62. c_reset='\033[0m'; c_blue='\033[1;34m'; c_green='\033[1;32m'; c_yellow='\033[1;33m'; c_red='\033[1;31m'
  63. info() { echo -e "${c_blue}[INFO]${c_reset} $*"; }
  64. ok() { echo -e "${c_green}[ OK ]${c_reset} $*"; }
  65. warn() { echo -e "${c_yellow}[WARN]${c_reset} $*"; }
  66. err() { echo -e "${c_red}[FAIL]${c_reset} $*" >&2; }
  67. TMP_DIR="$(mktemp -d)"
  68. cleanup() { rm -rf "${TMP_DIR}"; }
  69. trap cleanup EXIT
  70. # ---------------------------------------------------------------------------
  71. # 0. 预检
  72. # ---------------------------------------------------------------------------
  73. precheck() {
  74. command -v mc >/dev/null 2>&1 || { err "未找到 mc(MinIO Client),请先安装(install_deps.sh mc)"; exit 1; }
  75. for kv in \
  76. "MINIO_ROOT_PASSWORD:${MINIO_ROOT_PASSWORD}:minioadmin" \
  77. "MINIO_SECRET_KEY:${MINIO_SECRET_KEY}:fwh-toolbox" \
  78. "MINIO_AI_SECRET_KEY:${MINIO_AI_SECRET_KEY}:fwh-toolbox-ai"; do
  79. local name="${kv%%:*}"; local rest="${kv#*:}"; local val="${rest%%:*}"; local def="${rest##*:}"
  80. if [[ "${val}" == "${def}" ]]; then
  81. warn "${name} 仍为默认弱口令(${def}),生产环境请通过环境变量传入强口令。"
  82. fi
  83. done
  84. }
  85. # ---------------------------------------------------------------------------
  86. # 1. 设置 root alias
  87. # ---------------------------------------------------------------------------
  88. set_alias() {
  89. info "配置 mc alias(root): ${MINIO_ALIAS} -> ${MINIO_ENDPOINT}"
  90. mc alias set "${MINIO_ALIAS}" "${MINIO_ENDPOINT}" "${MINIO_ROOT_USER}" "${MINIO_ROOT_PASSWORD}" >/dev/null
  91. ok "alias 已配置"
  92. }
  93. # ---------------------------------------------------------------------------
  94. # 2. 建桶(幂等)
  95. # ---------------------------------------------------------------------------
  96. ensure_buckets() {
  97. local b
  98. for b in "${MINIO_BUCKET}" "${MINIO_AI_BUCKET}"; do
  99. if mc ls "${MINIO_ALIAS}/${b}" >/dev/null 2>&1; then
  100. ok "bucket 已存在:${b}"
  101. else
  102. mc mb "${MINIO_ALIAS}/${b}"
  103. ok "bucket 已创建:${b}"
  104. fi
  105. done
  106. }
  107. # 生成一条策略 JSON:$1=写前缀 -> 该前缀桶可读写(含删),其余所有桶只读
  108. # 用法:write_policy_json <prefix> <out_file>
  109. write_policy_json() {
  110. local prefix="$1" out="$2"
  111. cat > "${out}" <<JSON
  112. {
  113. "Version": "2012-10-17",
  114. "Statement": [
  115. {
  116. "Sid": "ReadAllBuckets",
  117. "Effect": "Allow",
  118. "Action": ["s3:GetObject", "s3:ListBucket", "s3:GetBucketLocation"],
  119. "Resource": ["arn:aws:s3:::*"]
  120. },
  121. {
  122. "Sid": "WriteOwnPrefixBuckets",
  123. "Effect": "Allow",
  124. "Action": [
  125. "s3:PutObject",
  126. "s3:DeleteObject",
  127. "s3:AbortMultipartUpload",
  128. "s3:ListMultipartUploadParts"
  129. ],
  130. "Resource": ["arn:aws:s3:::${prefix}*/*"]
  131. },
  132. {
  133. "Sid": "ManageOwnPrefixBuckets",
  134. "Effect": "Allow",
  135. "Action": ["s3:ListBucketMultipartUploads"],
  136. "Resource": ["arn:aws:s3:::${prefix}*"]
  137. }
  138. ]
  139. }
  140. JSON
  141. }
  142. # ---------------------------------------------------------------------------
  143. # 3. 创建/更新策略(幂等:先尝试 create,已存在则用最新文件覆盖)
  144. # ---------------------------------------------------------------------------
  145. ensure_policy() {
  146. local name="$1" file="$2"
  147. if mc admin policy info "${MINIO_ALIAS}" "${name}" >/dev/null 2>&1; then
  148. info "策略已存在,更新:${name}"
  149. # 不同 mc 版本子命令略有差异:优先 create(覆盖),回退 add
  150. mc admin policy create "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null 2>&1 \
  151. || mc admin policy add "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null
  152. else
  153. info "创建策略:${name}"
  154. mc admin policy create "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null 2>&1 \
  155. || mc admin policy add "${MINIO_ALIAS}" "${name}" "${file}" >/dev/null
  156. fi
  157. ok "策略就绪:${name}"
  158. }
  159. # ---------------------------------------------------------------------------
  160. # 4. 创建用户(幂等)并绑定策略
  161. # ---------------------------------------------------------------------------
  162. ensure_user() {
  163. local ak="$1" sk="$2" policy="$3"
  164. if mc admin user info "${MINIO_ALIAS}" "${ak}" >/dev/null 2>&1; then
  165. ok "用户已存在:${ak}"
  166. else
  167. mc admin user add "${MINIO_ALIAS}" "${ak}" "${sk}" >/dev/null
  168. ok "用户已创建:${ak}"
  169. fi
  170. # 绑定策略(幂等:attach 已绑定会报错,忽略即可)
  171. mc admin policy attach "${MINIO_ALIAS}" "${policy}" --user "${ak}" >/dev/null 2>&1 \
  172. || mc admin policy set "${MINIO_ALIAS}" "${policy}" "user=${ak}" >/dev/null 2>&1 \
  173. || true
  174. ok "已绑定策略 ${policy} -> 用户 ${ak}"
  175. }
  176. main() {
  177. echo "===== FranklinWH Toolbox MinIO 账号与策略配置 ====="
  178. precheck
  179. set_alias
  180. ensure_buckets
  181. write_policy_json "${PREFIX_BIZ}" "${TMP_DIR}/${POLICY_BIZ}.json"
  182. write_policy_json "${PREFIX_AI}" "${TMP_DIR}/${POLICY_AI}.json"
  183. ensure_policy "${POLICY_BIZ}" "${TMP_DIR}/${POLICY_BIZ}.json"
  184. ensure_policy "${POLICY_AI}" "${TMP_DIR}/${POLICY_AI}.json"
  185. ensure_user "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" "${POLICY_BIZ}"
  186. ensure_user "${MINIO_AI_ACCESS_KEY}" "${MINIO_AI_SECRET_KEY}" "${POLICY_AI}"
  187. cat <<EOF
  188. ${c_green}MinIO 配置完成${c_reset}
  189. Endpoint : ${MINIO_ENDPOINT}
  190. Buckets : ${MINIO_BUCKET}, ${MINIO_AI_BUCKET}
  191. 账号与权限:
  192. root(${MINIO_ROOT_USER}) -> 全局管理
  193. ${MINIO_ACCESS_KEY} -> 策略 ${POLICY_BIZ}:写 ${PREFIX_BIZ}* 桶(含删),读其余所有桶
  194. ${MINIO_AI_ACCESS_KEY} -> 策略 ${POLICY_AI}:写 ${PREFIX_AI}* 桶(含删),读其余所有桶
  195. ${c_yellow}提示${c_reset}:${MINIO_AI_BUCKET} 同时匹配 ${PREFIX_BIZ}* 与 ${PREFIX_AI}*,
  196. 故 ${MINIO_ACCESS_KEY} 与 ${MINIO_AI_ACCESS_KEY} 对该桶均可写。
  197. 请确保 config.env 中 MINIO_ACCESS_KEY/MINIO_SECRET_KEY 与此处业务用户一致。
  198. EOF
  199. }
  200. main "$@"