provision_minio.sh 9.0 KB

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