init-cloudpods.sh 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. #!/bin/bash
  2. # Cloudpods 统一初始化脚本
  3. # 用于全新部署时的完整初始化
  4. set -e
  5. RED='\033[0;31m'
  6. GREEN='\033[0;32m'
  7. YELLOW='\033[1;33m'
  8. BLUE='\033[0;34m'
  9. NC='\033[0m'
  10. # 初始化配置
  11. INIT_CONFIG_FILE="${INIT_CONFIG_FILE:-init-config.env}"
  12. # 加载配置文件
  13. load_config() {
  14. if [ -f "$INIT_CONFIG_FILE" ]; then
  15. echo -e "${BLUE}加载配置文件: $INIT_CONFIG_FILE${NC}"
  16. set -a
  17. source "$INIT_CONFIG_FILE"
  18. set +a
  19. fi
  20. # 加载 .env.local
  21. if [ -f "../.env.local" ]; then
  22. set -a
  23. source ../.env.local
  24. set +a
  25. fi
  26. }
  27. # 设置默认值
  28. setup_defaults() {
  29. # 数据库配置
  30. DB_HOST=${DB_HOST:-127.0.0.1}
  31. DB_PORT=${DB_PORT:-3306}
  32. DB_USER=${DB_USER:-root}
  33. DB_PASSWORD=${DB_PASSWORD:-}
  34. DB_NAME=${DB_NAME:-yunioncloud}
  35. # Keystone 配置
  36. KEYSTONE_HOST=${KEYSTONE_HOST:-127.0.0.1}
  37. KEYSTONE_PORT=${KEYSTONE_PORT:-30500}
  38. ADMIN_USER=${ADMIN_USER:-sysadmin}
  39. ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin@123}
  40. ADMIN_PROJECT=${ADMIN_PROJECT:-system}
  41. ADMIN_DOMAIN=${ADMIN_DOMAIN:-Default}
  42. REGION_NAME=${REGION_NAME:-region0}
  43. # 服务端口配置
  44. REGION_PORT=${REGION_PORT:-30889}
  45. GLANCE_PORT=${GLANCE_PORT:-9292}
  46. YUNIONCONF_PORT=${YUNIONCONF_PORT:-30888}
  47. MONITOR_PORT=${MONITOR_PORT:-30900}
  48. SCHEDULEDTASK_PORT=${SCHEDULEDTASK_PORT:-30950}
  49. APIGATEWAY_PORT=${APIGATEWAY_PORT:-3000}
  50. }
  51. # 打印配置信息
  52. print_config() {
  53. echo -e "${GREEN}=== Cloudpods 初始化配置 ===${NC}"
  54. echo ""
  55. echo -e "${BLUE}数据库配置:${NC}"
  56. echo " 主机: ${DB_HOST}:${DB_PORT}"
  57. echo " 数据库: ${DB_NAME}"
  58. echo " 用户: ${DB_USER}"
  59. echo ""
  60. echo -e "${BLUE}Keystone 配置:${NC}"
  61. echo " 地址: http://${KEYSTONE_HOST}:${KEYSTONE_PORT}/v3"
  62. echo " 管理员: ${ADMIN_USER}@${ADMIN_DOMAIN}"
  63. echo " 项目: ${ADMIN_PROJECT}"
  64. echo " Region: ${REGION_NAME}"
  65. echo ""
  66. echo -e "${BLUE}服务端口配置:${NC}"
  67. echo " Region: ${REGION_PORT}"
  68. echo " Glance: ${GLANCE_PORT}"
  69. echo " YunionConf: ${YUNIONCONF_PORT}"
  70. echo " Monitor: ${MONITOR_PORT}"
  71. echo " ScheduledTask: ${SCHEDULEDTASK_PORT}"
  72. echo " APIGateway: ${APIGATEWAY_PORT}"
  73. echo ""
  74. }
  75. # 初始化阶段 1: 数据库
  76. init_database() {
  77. echo -e "${GREEN}=== 阶段 1: 初始化数据库 ===${NC}"
  78. # 构建 mysql 命令
  79. if [ -z "$DB_PASSWORD" ]; then
  80. MYSQL_CMD="mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER}"
  81. else
  82. MYSQL_CMD="mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASSWORD}"
  83. fi
  84. # 检查 MySQL 连接
  85. echo -e "${YELLOW}检查 MySQL 连接...${NC}"
  86. if ! $MYSQL_CMD -e "SELECT 1" > /dev/null 2>&1; then
  87. echo -e "${RED}错误: 无法连接到 MySQL${NC}"
  88. exit 1
  89. fi
  90. echo -e "${GREEN}✓ MySQL 连接正常${NC}"
  91. # 删除已存在的数据库
  92. echo -e "${YELLOW}删除已存在的数据库 ${DB_NAME}...${NC}"
  93. $MYSQL_CMD -e "DROP DATABASE IF EXISTS ${DB_NAME};" 2>/dev/null || true
  94. # 创建新数据库
  95. echo -e "${YELLOW}创建数据库 ${DB_NAME}...${NC}"
  96. $MYSQL_CMD -e "CREATE DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  97. echo -e "${GREEN}✓ 数据库创建成功${NC}"
  98. # 创建用户(如果不存在)
  99. if [ -n "$DB_PASSWORD" ]; then
  100. echo -e "${YELLOW}创建数据库用户...${NC}"
  101. $MYSQL_CMD -e "CREATE USER IF NOT EXISTS '${DB_USER}'@'%' IDENTIFIED BY '${DB_PASSWORD}';" 2>/dev/null || true
  102. $MYSQL_CMD -e "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'%';" 2>/dev/null || true
  103. $MYSQL_CMD -e "FLUSH PRIVILEGES;" 2>/dev/null || true
  104. echo -e "${GREEN}✓ 数据库用户权限设置完成${NC}"
  105. fi
  106. }
  107. # 初始化阶段 2: 启动基础服务
  108. init_services() {
  109. echo -e "${GREEN}=== 阶段 2: 启动基础服务 ===${NC}"
  110. # 构建数据库连接字符串
  111. if [ -z "$DB_PASSWORD" ]; then
  112. SQL_CONNECTION="mysql+pymysql://${DB_USER}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  113. else
  114. SQL_CONNECTION="mysql+pymysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  115. fi
  116. # 创建日志目录
  117. mkdir -p logs
  118. # 启动 Keystone
  119. echo -e "${YELLOW}启动 Keystone...${NC}"
  120. if [ ! -f "_output/bin/keystone" ]; then
  121. echo -e "${YELLOW}编译 Keystone...${NC}"
  122. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/keystone yunion.io/x/onecloud/cmd/keystone
  123. fi
  124. ./_output/bin/keystone \
  125. --config /dev/null \
  126. --sql-connection "$SQL_CONNECTION" \
  127. --auto-sync-table \
  128. --port ${KEYSTONE_PORT} \
  129. --admin-port 35357 \
  130. --bootstrap-admin-user-password ${ADMIN_PASSWORD} \
  131. > logs/keystone.log 2>&1 &
  132. echo $! > logs/keystone.pid
  133. echo -e "${GREEN}✓ Keystone 已启动${NC}"
  134. # 等待 Keystone 就绪
  135. echo -e "${YELLOW}等待 Keystone 就绪...${NC}"
  136. for i in {1..30}; do
  137. if curl -s http://127.0.0.1:${KEYSTONE_PORT}/v3 > /dev/null 2>&1; then
  138. echo -e "${GREEN}✓ Keystone 已就绪${NC}"
  139. break
  140. fi
  141. sleep 1
  142. if [ $i -eq 30 ]; then
  143. echo -e "${RED}错误: Keystone 启动超时${NC}"
  144. exit 1
  145. fi
  146. done
  147. # 设置环境变量
  148. export OS_AUTH_URL=http://127.0.0.1:${KEYSTONE_PORT}/v3
  149. export OS_USERNAME=${ADMIN_USER}
  150. export OS_PASSWORD=${ADMIN_PASSWORD}
  151. export OS_DOMAIN_NAME=${ADMIN_DOMAIN}
  152. export OS_PROJECT_NAME=${ADMIN_PROJECT}
  153. export OS_REGION_NAME=${REGION_NAME}
  154. }
  155. # 初始化阶段 3: 注册服务和 Endpoint
  156. init_keystone() {
  157. echo -e "${GREEN}=== 阶段 3: 注册服务和 Endpoint ===${NC}"
  158. # 编译 climc
  159. if [ ! -f "_output/bin/climc" ]; then
  160. echo -e "${YELLOW}编译 climc...${NC}"
  161. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/climc yunion.io/x/onecloud/cmd/climc
  162. fi
  163. # 创建 Region
  164. echo -e "${YELLOW}创建 Region...${NC}"
  165. if ! ./_output/bin/climc region-list 2>/dev/null | grep -q "| ${REGION_NAME} "; then
  166. ./_output/bin/climc region-create ${REGION_NAME} 2>/dev/null
  167. echo -e "${GREEN}✓ Region ${REGION_NAME} 创建成功${NC}"
  168. else
  169. echo -e "${GREEN}✓ Region ${REGION_NAME} 已存在${NC}"
  170. fi
  171. # 创建 Zone
  172. echo -e "${YELLOW}创建 Zone...${NC}"
  173. if ! ./_output/bin/climc zone-list 2>/dev/null | grep -q "| zone0 "; then
  174. ./_output/bin/climc zone-create zone0 2>/dev/null
  175. echo -e "${GREEN}✓ Zone zone0 创建成功${NC}"
  176. else
  177. echo -e "${GREEN}✓ Zone zone0 已存在${NC}"
  178. fi
  179. # 定义服务和端口
  180. declare -A SERVICES=(
  181. ["region"]=${REGION_PORT}
  182. ["glance"]=${GLANCE_PORT}
  183. ["yunionconf"]=${YUNIONCONF_PORT}
  184. ["monitor"]=${MONITOR_PORT}
  185. ["scheduledtask"]=${SCHEDULEDTASK_PORT}
  186. ["compute_v2"]=${REGION_PORT}
  187. ["common"]=${REGION_PORT}
  188. ["yunionapi"]=${REGION_PORT}
  189. ["meter"]=${REGION_PORT}
  190. ["yunionagent"]=${REGION_PORT}
  191. )
  192. # 注册服务和 Endpoint
  193. for service_name in "${!SERVICES[@]}"; do
  194. port=${SERVICES[$service_name]}
  195. service_type=$service_name
  196. echo -e "${YELLOW}注册服务: ${service_name}${NC}"
  197. # 检查服务是否存在
  198. if ! ./_output/bin/climc service-list 2>/dev/null | grep -q "| ${service_name} "; then
  199. ./_output/bin/climc service-create ${service_type} ${service_name} 2>/dev/null
  200. echo -e "${GREEN} ✓ 服务 ${service_name} 创建成功${NC}"
  201. else
  202. echo -e "${GREEN} ✓ 服务 ${service_name} 已存在${NC}"
  203. fi
  204. # 获取服务 ID
  205. service_id=$(./_output/bin/climc service-show ${service_name} 2>/dev/null | grep "^| id" | awk '{print $4}')
  206. # 创建 Endpoints
  207. for interface in public internal admin; do
  208. endpoint_name="${service_name}-${interface}"
  209. if ! ./_output/bin/climc endpoint-list --service ${service_id} 2>/dev/null | grep -q "| ${endpoint_name} "; then
  210. ./_output/bin/climc endpoint-create ${service_id} ${REGION_NAME} ${interface} "http://127.0.0.1:${port}" 2>/dev/null
  211. echo -e "${GREEN} ✓ Endpoint ${interface} 创建成功${NC}"
  212. fi
  213. done
  214. done
  215. # 为 Keystone 创建 slave endpoint
  216. echo -e "${YELLOW}注册 Keystone slave endpoint...${NC}"
  217. keystone_id=$(./_output/bin/climc service-show keystone 2>/dev/null | grep "^| id" | awk '{print $4}')
  218. if [ -n "$keystone_id" ]; then
  219. if ! ./_output/bin/climc endpoint-list --service ${keystone_id} 2>/dev/null | grep -q "slave"; then
  220. ./_output/bin/climc endpoint-create ${keystone_id} ${REGION_NAME} slave "http://127.0.0.1:35357" 2>/dev/null
  221. echo -e "${GREEN}✓ Keystone slave endpoint 创建成功${NC}"
  222. fi
  223. fi
  224. }
  225. # 初始化阶段 4: 启动其他服务
  226. start_other_services() {
  227. echo -e "${GREEN}=== 阶段 4: 启动其他服务 ===${NC}"
  228. # 构建数据库连接字符串
  229. if [ -z "$DB_PASSWORD" ]; then
  230. SQL_CONNECTION="mysql+pymysql://${DB_USER}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  231. else
  232. SQL_CONNECTION="mysql+pymysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  233. fi
  234. # 通用服务启动参数
  235. COMMON_ARGS="--auth-url http://127.0.0.1:${KEYSTONE_PORT}/v3 --admin-user ${ADMIN_USER} --admin-password ${ADMIN_PASSWORD} --admin-project ${ADMIN_PROJECT} --admin-domain ${ADMIN_DOMAIN}"
  236. # 启动 Region
  237. echo -e "${YELLOW}启动 Region...${NC}"
  238. if [ ! -f "_output/bin/region" ]; then
  239. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/region yunion.io/x/onecloud/cmd/region
  240. fi
  241. ./_output/bin/region \
  242. --config /dev/null \
  243. --sql-connection "$SQL_CONNECTION" \
  244. --auto-sync-table \
  245. --port ${REGION_PORT} \
  246. ${COMMON_ARGS} \
  247. > logs/region.log 2>&1 &
  248. echo $! > logs/region.pid
  249. echo -e "${GREEN}✓ Region 已启动${NC}"
  250. # 创建 glance 数据目录
  251. mkdir -p /tmp/glance_data
  252. # 启动 Glance
  253. echo -e "${YELLOW}启动 Glance...${NC}"
  254. if [ ! -f "_output/bin/glance" ]; then
  255. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/glance yunion.io/x/onecloud/cmd/glance
  256. fi
  257. ./_output/bin/glance \
  258. --config /dev/null \
  259. --sql-connection "$SQL_CONNECTION" \
  260. --auto-sync-table \
  261. --port ${GLANCE_PORT} \
  262. --filesystem-store-datadir /tmp/glance_data \
  263. ${COMMON_ARGS} \
  264. > logs/glance.log 2>&1 &
  265. echo $! > logs/glance.pid
  266. echo -e "${GREEN}✓ Glance 已启动${NC}"
  267. # 启动 YunionConf
  268. echo -e "${YELLOW}启动 YunionConf...${NC}"
  269. if [ ! -f "_output/bin/yunionconf" ]; then
  270. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/yunionconf yunion.io/x/onecloud/cmd/yunionconf
  271. fi
  272. ./_output/bin/yunionconf \
  273. --config /dev/null \
  274. --sql-connection "$SQL_CONNECTION" \
  275. --auto-sync-table \
  276. --port ${YUNIONCONF_PORT} \
  277. ${COMMON_ARGS} \
  278. > logs/yunionconf.log 2>&1 &
  279. echo $! > logs/yunionconf.pid
  280. echo -e "${GREEN}✓ YunionConf 已启动${NC}"
  281. # 启动 ScheduledTask
  282. echo -e "${YELLOW}启动 ScheduledTask...${NC}"
  283. if [ ! -f "_output/bin/scheduledtask" ]; then
  284. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/scheduledtask yunion.io/x/onecloud/cmd/scheduledtask
  285. fi
  286. ./_output/bin/scheduledtask \
  287. --config /dev/null \
  288. --sql-connection "$SQL_CONNECTION" \
  289. --auto-sync-table \
  290. --port ${SCHEDULEDTASK_PORT} \
  291. ${COMMON_ARGS} \
  292. > logs/scheduledtask.log 2>&1 &
  293. echo $! > logs/scheduledtask.pid
  294. echo -e "${GREEN}✓ ScheduledTask 已启动${NC}"
  295. # 启动 APIGateway
  296. echo -e "${YELLOW}启动 APIGateway...${NC}"
  297. if [ ! -f "_output/bin/apigateway" ]; then
  298. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/apigateway yunion.io/x/onecloud/cmd/apigateway
  299. fi
  300. ./_output/bin/apigateway \
  301. --config /dev/null \
  302. --port ${APIGATEWAY_PORT} \
  303. ${COMMON_ARGS} \
  304. --default-region ${REGION_NAME} \
  305. > logs/apigateway.log 2>&1 &
  306. echo $! > logs/apigateway.pid
  307. echo -e "${GREEN}✓ APIGateway 已启动${NC}"
  308. # 等待所有服务就绪
  309. echo -e "${YELLOW}等待所有服务就绪...${NC}"
  310. sleep 5
  311. }
  312. # 初始化阶段 5: 初始化数据
  313. init_data() {
  314. echo -e "${GREEN}=== 阶段 5: 初始化基础数据 ===${NC}"
  315. # 等待服务完全就绪
  316. echo -e "${YELLOW}等待服务就绪...${NC}"
  317. for i in {1..30}; do
  318. if ./_output/bin/climc region-list > /dev/null 2>&1; then
  319. echo -e "${GREEN}✓ 服务已就绪${NC}"
  320. break
  321. fi
  322. sleep 2
  323. if [ $i -eq 30 ]; then
  324. echo -e "${RED}警告: 服务未完全就绪,继续初始化...${NC}"
  325. fi
  326. done
  327. # 创建参数
  328. echo -e "${YELLOW}创建系统参数...${NC}"
  329. # dashboard-system-default
  330. if ! ./_output/bin/climc parameter-show dashboard-system-default > /dev/null 2>&1; then
  331. ./_output/bin/climc parameter-create dashboard-system-default '[{"layout":{"component":"NumberCard","h":6,"w":20,"x":0,"y":0},"params":{"name":"虚拟机数量","regionAccountType":"region","usage_key":"all.servers"}},{"layout":{"component":"NumberCard","h":6,"w":20,"x":20,"y":0},"params":{"name":"宿主机数量","regionAccountType":"region","usage_key":"hosts"}},{"layout":{"component":"NumberCard","h":6,"w":20,"x":40,"y":0},"params":{"name":"物理机数量","regionAccountType":"region","usage_key":"baremetals"}},{"layout":{"component":"NumberCard","h":6,"w":20,"x":60,"y":0},"params":{"name":"存储桶数量","regionAccountType":"region","usage_key":"buckets"}}]' 2>/dev/null
  332. echo -e "${GREEN}✓ dashboard-system-default 创建成功${NC}"
  333. fi
  334. # global-settings
  335. if ! ./_output/bin/climc parameter-show global-settings > /dev/null 2>&1; then
  336. ./_output/bin/climc parameter-create global-settings '{"setupKeys":["zh-CN","en"]}' 2>/dev/null
  337. echo -e "${GREEN}✓ global-settings 创建成功${NC}"
  338. fi
  339. # widget-settings
  340. if ! ./_output/bin/climc parameter-show widget-settings > /dev/null 2>&1; then
  341. ./_output/bin/climc parameter-create widget-settings '{}' 2>/dev/null
  342. echo -e "${GREEN}✓ widget-settings 创建成功${NC}"
  343. fi
  344. # profile
  345. if ! ./_output/bin/climc parameter-show profile > /dev/null 2>&1; then
  346. ./_output/bin/climc parameter-create profile '{}' 2>/dev/null
  347. echo -e "${GREEN}✓ profile 创建成功${NC}"
  348. fi
  349. # 更新 sysadmin 用户
  350. echo -e "${YELLOW}更新 sysadmin 用户配置...${NC}"
  351. user_id=$(./_output/bin/climc user-show ${ADMIN_USER} 2>/dev/null | grep "^| id" | awk '{print $4}')
  352. if [ -n "$user_id" ]; then
  353. # 允许 Web 控制台登录
  354. ./_output/bin/climc user-update --allow-web-console ${ADMIN_USER} 2>/dev/null || true
  355. # 分配 admin 角色
  356. project_id=$(./_output/bin/climc project-show ${ADMIN_PROJECT} 2>/dev/null | grep "^| id" | awk '{print $4}')
  357. if [ -n "$project_id" ]; then
  358. ./_output/bin/climc project-add-user ${ADMIN_PROJECT} ${ADMIN_USER} admin 2>/dev/null || true
  359. fi
  360. echo -e "${GREEN}✓ sysadmin 用户配置更新成功${NC}"
  361. fi
  362. }
  363. # 初始化阶段 6: 初始化 RBAC 策略
  364. init_policies() {
  365. echo -e "${GREEN}=== 阶段 6: 初始化 RBAC 策略 ===${NC}"
  366. # 检查 policy 表是否为空
  367. policy_count=$(./_output/bin/climc policy-list 2>/dev/null | grep -c "^| " || echo "0")
  368. if [ "$policy_count" -gt "2" ]; then
  369. echo -e "${GREEN}✓ 策略已存在,跳过初始化${NC}"
  370. return
  371. fi
  372. echo -e "${YELLOW}创建默认策略...${NC}"
  373. # 创建系统管理员策略
  374. sysadmin_policy='{"policy":{"compute":{"servers":"allow","hosts":"allow","zones":"allow","cloudregions":"allow"},"identity":{"users":"allow","projects":"allow","roles":"allow","policies":"allow","domains":"allow"},"image":{"images":"allow"},"yunionconf":{"parameters":"allow"}}}'
  375. if ! ./_output/bin/climc policy-show sysadmin-system-policy > /dev/null 2>&1; then
  376. ./_output/bin/climc policy-create --type admin --scope system sysadmin-system-policy "${sysadmin_policy}" 2>/dev/null
  377. echo -e "${GREEN}✓ sysadmin-system-policy 创建成功${NC}"
  378. fi
  379. # 绑定策略到角色
  380. admin_role_id=$(./_output/bin/climc role-show admin 2>/dev/null | grep "^| id" | awk '{print $4}')
  381. if [ -n "$admin_role_id" ]; then
  382. # 检查是否已绑定
  383. if ! ./_output/bin/climc policy-binding-list --role ${admin_role_id} 2>/dev/null | grep -q "sysadmin-system-policy"; then
  384. ./_output/bin/climc policy-binding-create --role ${admin_role_id} sysadmin-system-policy 2>/dev/null || true
  385. echo -e "${GREEN}✓ 策略绑定成功${NC}"
  386. fi
  387. fi
  388. }
  389. # 打印完成信息
  390. print_completion() {
  391. echo ""
  392. echo -e "${GREEN}========================================${NC}"
  393. echo -e "${GREEN} Cloudpods 初始化完成!${NC}"
  394. echo -e "${GREEN}========================================${NC}"
  395. echo ""
  396. echo -e "${BLUE}服务地址:${NC}"
  397. echo " Keystone: http://127.0.0.1:${KEYSTONE_PORT}"
  398. echo " Region: http://127.0.0.1:${REGION_PORT}"
  399. echo " Glance: http://127.0.0.1:${GLANCE_PORT}"
  400. echo " YunionConf: http://127.0.0.1:${YUNIONCONF_PORT}"
  401. echo " ScheduledTask:http://127.0.0.1:${SCHEDULEDTASK_PORT}"
  402. echo " APIGateway: http://127.0.0.1:${APIGATEWAY_PORT}"
  403. echo ""
  404. echo -e "${BLUE}管理信息:${NC}"
  405. echo " 管理员账号: ${ADMIN_USER}"
  406. echo " 管理员密码: ${ADMIN_PASSWORD}"
  407. echo " 项目: ${ADMIN_PROJECT}"
  408. echo " Domain: ${ADMIN_DOMAIN}"
  409. echo ""
  410. echo -e "${BLUE}前端访问:${NC}"
  411. echo " http://localhost:8080"
  412. echo ""
  413. echo -e "${BLUE}常用命令:${NC}"
  414. echo " 查看日志: tail -f backend/logs/*.log"
  415. echo " 停止服务: ./backend/stop-backend.sh"
  416. echo " 服务状态: ps aux | grep -E 'keystone|region|glance|yunionconf|scheduledtask|apigateway'"
  417. echo ""
  418. }
  419. # 主流程
  420. main() {
  421. echo -e "${GREEN}========================================${NC}"
  422. echo -e "${GREEN} Cloudpods 统一初始化脚本${NC}"
  423. echo -e "${GREEN}========================================${NC}"
  424. echo ""
  425. # 加载配置
  426. load_config
  427. setup_defaults
  428. print_config
  429. # 确认初始化
  430. if [ "$SKIP_CONFIRM" != "true" ]; then
  431. echo -e "${YELLOW}警告: 这将删除现有的数据库并重新初始化所有数据!${NC}"
  432. read -p "是否继续? (y/N): " confirm
  433. if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
  434. echo -e "${YELLOW}已取消初始化${NC}"
  435. exit 0
  436. fi
  437. fi
  438. # 执行初始化阶段
  439. init_database
  440. init_services
  441. init_keystone
  442. start_other_services
  443. init_data
  444. init_policies
  445. # 打印完成信息
  446. print_completion
  447. }
  448. # 处理命令行参数
  449. while [[ $# -gt 0 ]]; do
  450. case $1 in
  451. --config)
  452. INIT_CONFIG_FILE="$2"
  453. shift 2
  454. ;;
  455. --skip-confirm)
  456. SKIP_CONFIRM="true"
  457. shift
  458. ;;
  459. --help)
  460. echo "Cloudpods 统一初始化脚本"
  461. echo ""
  462. echo "用法: $0 [选项]"
  463. echo ""
  464. echo "选项:"
  465. echo " --config <文件> 指定配置文件 (默认: init-config.env)"
  466. echo " --skip-confirm 跳过确认提示"
  467. echo " --help 显示帮助信息"
  468. echo ""
  469. echo "环境变量:"
  470. echo " DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME"
  471. echo " ADMIN_USER, ADMIN_PASSWORD, ADMIN_PROJECT, ADMIN_DOMAIN"
  472. echo " REGION_NAME, KEYSTONE_PORT, etc."
  473. echo ""
  474. exit 0
  475. ;;
  476. *)
  477. echo "未知选项: $1"
  478. echo "使用 --help 查看帮助"
  479. exit 1
  480. ;;
  481. esac
  482. done
  483. # 运行主流程
  484. main