init_databases.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/env bash
  2. # =============================================================================
  3. # FranklinWH Toolbox - 数据库从零初始化脚本
  4. # =============================================================================
  5. # 作用:在一台全新的 Ubuntu 服务器上,完成本项目依赖的本地数据库初始化:
  6. # 1. PostgreSQL:创建角色 / 数据库 / schema / alarm_snapshot 表
  7. # 2. MongoDB :无需建表(集合首次写入自动创建),此处仅做连通性检查
  8. # 3. Redis :仅做连通性检查
  9. # 4. MinIO :创建业务 bucket(需要 mc 客户端)
  10. #
  11. # 前置条件:相关服务已安装并运行(见 docs/DEPLOYMENT.md 第 3 章)。
  12. # 本脚本只做“建库建表建桶”,不负责安装数据库软件。
  13. #
  14. # 用法:
  15. # ./init_databases.sh # 使用默认值
  16. # PG_FWH_PASSWORD='强密码' ./init_databases.sh
  17. #
  18. # 可用环境变量(均有默认值):
  19. # PG_FWH_PASSWORD PostgreSQL 业务角色 fwh_toolbox 的密码 (默认 fwh_toolbox)
  20. # MINIO_ALIAS mc 的 alias 名 (默认 fwhlocal)
  21. # MINIO_ENDPOINT MinIO S3 API 地址 (默认 http://localhost:9198)
  22. # MINIO_ROOT_USER MinIO 管理员用户 (默认 minioadmin)
  23. # MINIO_ROOT_PASSWORD MinIO 管理员密码 (默认 minioadmin)
  24. # MINIO_BUCKET 业务 bucket 名 (默认 fwh-toolbox)
  25. # MONGO_URI Mongo 连接串 (默认 mongodb://127.0.0.1:27017)
  26. # REDIS_HOST/PORT Redis 地址 (默认 127.0.0.1:6379)
  27. # =============================================================================
  28. set -euo pipefail
  29. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  30. SQL_FILE="${SCRIPT_DIR}/../sql/init_pgsql.sql"
  31. # TODO: [必填] PostgreSQL 业务角色 fwh_toolbox 的密码——请传入强口令,勿用默认 fwh_toolbox
  32. # (必须与 config.env 里 POSTGRES_DSN 的 password 一致)
  33. PG_FWH_PASSWORD="${PG_FWH_PASSWORD:-fwh_toolbox}"
  34. MINIO_ALIAS="${MINIO_ALIAS:-fwhlocal}"
  35. # TODO: [确认] MinIO S3 API 地址
  36. MINIO_ENDPOINT="${MINIO_ENDPOINT:-http://localhost:9198}"
  37. # TODO: [必填] MinIO 管理员账户(建桶用)——传入真实强口令,勿用默认 minioadmin
  38. MINIO_ROOT_USER="${MINIO_ROOT_USER:-minioadmin}"
  39. MINIO_ROOT_PASSWORD="${MINIO_ROOT_PASSWORD:-minioadmin}"
  40. # TODO: [确认] 业务 bucket 名(须与 config.env 的 MINIO_BUCKET_NAME 一致)
  41. MINIO_BUCKET="${MINIO_BUCKET:-fwh-toolbox}"
  42. MONGO_URI="${MONGO_URI:-mongodb://127.0.0.1:27017}"
  43. REDIS_HOST="${REDIS_HOST:-127.0.0.1}"
  44. REDIS_PORT="${REDIS_PORT:-6379}"
  45. info() { echo -e "\033[1;34m[INFO]\033[0m $*"; }
  46. ok() { echo -e "\033[1;32m[ OK ]\033[0m $*"; }
  47. warn() { echo -e "\033[1;33m[WARN]\033[0m $*"; }
  48. err() { echo -e "\033[1;31m[FAIL]\033[0m $*" >&2; }
  49. # ---------------------------------------------------------------------------
  50. # 1. PostgreSQL
  51. # ---------------------------------------------------------------------------
  52. init_postgres() {
  53. info "初始化 PostgreSQL ..."
  54. if ! command -v psql >/dev/null 2>&1; then
  55. err "未找到 psql,请先安装 PostgreSQL。"
  56. return 1
  57. fi
  58. if [[ ! -f "${SQL_FILE}" ]]; then
  59. err "找不到 SQL 文件:${SQL_FILE}"
  60. return 1
  61. fi
  62. # 以 postgres 超级用户执行;密码作为 psql 变量传入(脚本内部用 %L 转义)
  63. sudo -u postgres psql -v ON_ERROR_STOP=1 \
  64. -v fwh_pwd="${PG_FWH_PASSWORD}" \
  65. -f "${SQL_FILE}"
  66. ok "PostgreSQL 初始化完成"
  67. }
  68. # ---------------------------------------------------------------------------
  69. # 2. MongoDB(连通性检查)
  70. # ---------------------------------------------------------------------------
  71. check_mongo() {
  72. info "检查 MongoDB 连通性 ..."
  73. if command -v mongosh >/dev/null 2>&1; then
  74. mongosh --quiet "${MONGO_URI}" --eval 'db.runCommand({ ping: 1 }).ok' >/dev/null \
  75. && ok "MongoDB 可连接(集合会在首次写入时自动创建)" \
  76. || warn "MongoDB 连接失败,请检查 mongod 是否运行"
  77. else
  78. warn "未找到 mongosh,跳过 MongoDB 连通性检查"
  79. fi
  80. }
  81. # ---------------------------------------------------------------------------
  82. # 3. Redis(连通性检查)
  83. # ---------------------------------------------------------------------------
  84. check_redis() {
  85. info "检查 Redis 连通性 ..."
  86. if command -v redis-cli >/dev/null 2>&1; then
  87. [[ "$(redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" ping 2>/dev/null)" == "PONG" ]] \
  88. && ok "Redis 可连接" \
  89. || warn "Redis 连接失败,请检查 redis-server 是否运行"
  90. else
  91. warn "未找到 redis-cli,跳过 Redis 连通性检查"
  92. fi
  93. }
  94. # ---------------------------------------------------------------------------
  95. # 4. MinIO bucket
  96. # ---------------------------------------------------------------------------
  97. init_minio() {
  98. info "初始化 MinIO bucket ..."
  99. if ! command -v mc >/dev/null 2>&1; then
  100. warn "未找到 mc(MinIO Client),跳过 bucket 创建。"
  101. warn "可在 MinIO 控制台(默认 :9199)手动创建 bucket:${MINIO_BUCKET}"
  102. return 0
  103. fi
  104. mc alias set "${MINIO_ALIAS}" "${MINIO_ENDPOINT}" "${MINIO_ROOT_USER}" "${MINIO_ROOT_PASSWORD}" >/dev/null
  105. if mc ls "${MINIO_ALIAS}/${MINIO_BUCKET}" >/dev/null 2>&1; then
  106. ok "MinIO bucket 已存在:${MINIO_BUCKET}"
  107. else
  108. mc mb "${MINIO_ALIAS}/${MINIO_BUCKET}"
  109. ok "MinIO bucket 已创建:${MINIO_BUCKET}"
  110. fi
  111. }
  112. main() {
  113. echo "===== FranklinWH Toolbox 数据库初始化 ====="
  114. init_postgres
  115. check_mongo
  116. check_redis
  117. init_minio
  118. echo "===== 全部完成 ====="
  119. }
  120. main "$@"