init-cloudpods.sh 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  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. )
  191. # 注册服务和 Endpoint
  192. for service_name in "${!SERVICES[@]}"; do
  193. port=${SERVICES[$service_name]}
  194. service_type=$service_name
  195. echo -e "${YELLOW}注册服务: ${service_name}${NC}"
  196. # 检查服务是否存在
  197. if ! ./_output/bin/climc service-list 2>/dev/null | grep -q "| ${service_name} "; then
  198. ./_output/bin/climc service-create ${service_type} ${service_name} 2>/dev/null
  199. echo -e "${GREEN} ✓ 服务 ${service_name} 创建成功${NC}"
  200. else
  201. echo -e "${GREEN} ✓ 服务 ${service_name} 已存在${NC}"
  202. fi
  203. # 获取服务 ID
  204. service_id=$(./_output/bin/climc service-show ${service_name} 2>/dev/null | grep "^| id" | awk '{print $4}')
  205. # 创建 Endpoints
  206. for interface in public internal admin; do
  207. endpoint_name="${service_name}-${interface}"
  208. if ! ./_output/bin/climc endpoint-list --service ${service_id} 2>/dev/null | grep -q "| ${endpoint_name} "; then
  209. ./_output/bin/climc endpoint-create ${service_id} ${REGION_NAME} ${interface} "http://127.0.0.1:${port}" 2>/dev/null
  210. echo -e "${GREEN} ✓ Endpoint ${interface} 创建成功${NC}"
  211. fi
  212. done
  213. done
  214. # 为 Keystone 创建 slave endpoint
  215. echo -e "${YELLOW}注册 Keystone slave endpoint...${NC}"
  216. keystone_id=$(./_output/bin/climc service-show keystone 2>/dev/null | grep "^| id" | awk '{print $4}')
  217. if [ -n "$keystone_id" ]; then
  218. if ! ./_output/bin/climc endpoint-list --service ${keystone_id} 2>/dev/null | grep -q "slave"; then
  219. ./_output/bin/climc endpoint-create ${keystone_id} ${REGION_NAME} slave "http://127.0.0.1:35357" 2>/dev/null
  220. echo -e "${GREEN}✓ Keystone slave endpoint 创建成功${NC}"
  221. fi
  222. fi
  223. }
  224. # 初始化阶段 4: 启动其他服务
  225. start_other_services() {
  226. echo -e "${GREEN}=== 阶段 4: 启动其他服务 ===${NC}"
  227. # 构建数据库连接字符串
  228. if [ -z "$DB_PASSWORD" ]; then
  229. SQL_CONNECTION="mysql+pymysql://${DB_USER}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  230. else
  231. SQL_CONNECTION="mysql+pymysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  232. fi
  233. # 通用服务启动参数
  234. 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}"
  235. # 启动 Region
  236. echo -e "${YELLOW}启动 Region...${NC}"
  237. if [ ! -f "_output/bin/region" ]; then
  238. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/region yunion.io/x/onecloud/cmd/region
  239. fi
  240. ./_output/bin/region \
  241. --config /dev/null \
  242. --sql-connection "$SQL_CONNECTION" \
  243. --auto-sync-table \
  244. --port ${REGION_PORT} \
  245. ${COMMON_ARGS} \
  246. > logs/region.log 2>&1 &
  247. echo $! > logs/region.pid
  248. echo -e "${GREEN}✓ Region 已启动${NC}"
  249. # 创建 glance 数据目录
  250. mkdir -p /tmp/glance_data
  251. # 启动 Glance
  252. echo -e "${YELLOW}启动 Glance...${NC}"
  253. if [ ! -f "_output/bin/glance" ]; then
  254. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/glance yunion.io/x/onecloud/cmd/glance
  255. fi
  256. ./_output/bin/glance \
  257. --config /dev/null \
  258. --sql-connection "$SQL_CONNECTION" \
  259. --auto-sync-table \
  260. --port ${GLANCE_PORT} \
  261. --filesystem-store-datadir /tmp/glance_data \
  262. ${COMMON_ARGS} \
  263. > logs/glance.log 2>&1 &
  264. echo $! > logs/glance.pid
  265. echo -e "${GREEN}✓ Glance 已启动${NC}"
  266. # 启动 YunionConf
  267. echo -e "${YELLOW}启动 YunionConf...${NC}"
  268. if [ ! -f "_output/bin/yunionconf" ]; then
  269. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/yunionconf yunion.io/x/onecloud/cmd/yunionconf
  270. fi
  271. ./_output/bin/yunionconf \
  272. --config /dev/null \
  273. --sql-connection "$SQL_CONNECTION" \
  274. --auto-sync-table \
  275. --port ${YUNIONCONF_PORT} \
  276. ${COMMON_ARGS} \
  277. > logs/yunionconf.log 2>&1 &
  278. echo $! > logs/yunionconf.pid
  279. echo -e "${GREEN}✓ YunionConf 已启动${NC}"
  280. # 启动 ScheduledTask
  281. echo -e "${YELLOW}启动 ScheduledTask...${NC}"
  282. if [ ! -f "_output/bin/scheduledtask" ]; then
  283. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/scheduledtask yunion.io/x/onecloud/cmd/scheduledtask
  284. fi
  285. ./_output/bin/scheduledtask \
  286. --config /dev/null \
  287. --sql-connection "$SQL_CONNECTION" \
  288. --auto-sync-table \
  289. --port ${SCHEDULEDTASK_PORT} \
  290. ${COMMON_ARGS} \
  291. > logs/scheduledtask.log 2>&1 &
  292. echo $! > logs/scheduledtask.pid
  293. echo -e "${GREEN}✓ ScheduledTask 已启动${NC}"
  294. # 启动 APIGateway
  295. echo -e "${YELLOW}启动 APIGateway...${NC}"
  296. if [ ! -f "_output/bin/apigateway" ]; then
  297. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o _output/bin/apigateway yunion.io/x/onecloud/cmd/apigateway
  298. fi
  299. ./_output/bin/apigateway \
  300. --config /dev/null \
  301. --port ${APIGATEWAY_PORT} \
  302. ${COMMON_ARGS} \
  303. --default-region ${REGION_NAME} \
  304. > logs/apigateway.log 2>&1 &
  305. echo $! > logs/apigateway.pid
  306. echo -e "${GREEN}✓ APIGateway 已启动${NC}"
  307. # 等待所有服务就绪
  308. echo -e "${YELLOW}等待所有服务就绪...${NC}"
  309. sleep 5
  310. }
  311. # 初始化阶段 5: 初始化数据
  312. init_data() {
  313. echo -e "${GREEN}=== 阶段 5: 初始化基础数据 ===${NC}"
  314. # 等待服务完全就绪
  315. echo -e "${YELLOW}等待服务就绪...${NC}"
  316. for i in {1..30}; do
  317. if ./_output/bin/climc region-list > /dev/null 2>&1; then
  318. echo -e "${GREEN}✓ 服务已就绪${NC}"
  319. break
  320. fi
  321. sleep 2
  322. if [ $i -eq 30 ]; then
  323. echo -e "${RED}警告: 服务未完全就绪,继续初始化...${NC}"
  324. fi
  325. done
  326. # 创建参数
  327. echo -e "${YELLOW}创建系统参数...${NC}"
  328. # dashboard-system-default
  329. if ! ./_output/bin/climc parameter-show dashboard-system-default > /dev/null 2>&1; then
  330. ./_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
  331. echo -e "${GREEN}✓ dashboard-system-default 创建成功${NC}"
  332. fi
  333. # global-settings
  334. if ! ./_output/bin/climc parameter-show global-settings > /dev/null 2>&1; then
  335. ./_output/bin/climc parameter-create global-settings '{"setupKeys":["zh-CN","en"]}' 2>/dev/null
  336. echo -e "${GREEN}✓ global-settings 创建成功${NC}"
  337. fi
  338. # widget-settings
  339. if ! ./_output/bin/climc parameter-show widget-settings > /dev/null 2>&1; then
  340. ./_output/bin/climc parameter-create widget-settings '{}' 2>/dev/null
  341. echo -e "${GREEN}✓ widget-settings 创建成功${NC}"
  342. fi
  343. # profile
  344. if ! ./_output/bin/climc parameter-show profile > /dev/null 2>&1; then
  345. ./_output/bin/climc parameter-create profile '{}' 2>/dev/null
  346. echo -e "${GREEN}✓ profile 创建成功${NC}"
  347. fi
  348. # 更新 sysadmin 用户
  349. echo -e "${YELLOW}更新 sysadmin 用户配置...${NC}"
  350. user_id=$(./_output/bin/climc user-show ${ADMIN_USER} 2>/dev/null | grep "^| id" | awk '{print $4}')
  351. if [ -n "$user_id" ]; then
  352. # 允许 Web 控制台登录
  353. ./_output/bin/climc user-update --allow-web-console ${ADMIN_USER} 2>/dev/null || true
  354. # 分配 admin 角色
  355. project_id=$(./_output/bin/climc project-show ${ADMIN_PROJECT} 2>/dev/null | grep "^| id" | awk '{print $4}')
  356. if [ -n "$project_id" ]; then
  357. ./_output/bin/climc project-add-user ${ADMIN_PROJECT} ${ADMIN_USER} admin 2>/dev/null || true
  358. fi
  359. echo -e "${GREEN}✓ sysadmin 用户配置更新成功${NC}"
  360. fi
  361. }
  362. # 初始化阶段 6: 初始化 RBAC 策略
  363. init_policies() {
  364. echo -e "${GREEN}=== 阶段 6: 初始化 RBAC 策略 ===${NC}"
  365. # 检查 policy 表是否为空
  366. policy_count=$(./_output/bin/climc policy-list 2>/dev/null | grep -c "^| " || echo "0")
  367. if [ "$policy_count" -gt "2" ]; then
  368. echo -e "${GREEN}✓ 策略已存在,跳过初始化${NC}"
  369. return
  370. fi
  371. echo -e "${YELLOW}创建默认策略...${NC}"
  372. # 创建系统管理员策略
  373. 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"}}}'
  374. if ! ./_output/bin/climc policy-show sysadmin-system-policy > /dev/null 2>&1; then
  375. ./_output/bin/climc policy-create --type admin --scope system sysadmin-system-policy "${sysadmin_policy}" 2>/dev/null
  376. echo -e "${GREEN}✓ sysadmin-system-policy 创建成功${NC}"
  377. fi
  378. # 绑定策略到角色
  379. admin_role_id=$(./_output/bin/climc role-show admin 2>/dev/null | grep "^| id" | awk '{print $4}')
  380. if [ -n "$admin_role_id" ]; then
  381. # 检查是否已绑定
  382. if ! ./_output/bin/climc policy-binding-list --role ${admin_role_id} 2>/dev/null | grep -q "sysadmin-system-policy"; then
  383. ./_output/bin/climc policy-binding-create --role ${admin_role_id} sysadmin-system-policy 2>/dev/null || true
  384. echo -e "${GREEN}✓ 策略绑定成功${NC}"
  385. fi
  386. fi
  387. }
  388. # 打印完成信息
  389. print_completion() {
  390. echo ""
  391. echo -e "${GREEN}========================================${NC}"
  392. echo -e "${GREEN} Cloudpods 初始化完成!${NC}"
  393. echo -e "${GREEN}========================================${NC}"
  394. echo ""
  395. echo -e "${BLUE}服务地址:${NC}"
  396. echo " Keystone: http://127.0.0.1:${KEYSTONE_PORT}"
  397. echo " Region: http://127.0.0.1:${REGION_PORT}"
  398. echo " Glance: http://127.0.0.1:${GLANCE_PORT}"
  399. echo " YunionConf: http://127.0.0.1:${YUNIONCONF_PORT}"
  400. echo " ScheduledTask:http://127.0.0.1:${SCHEDULEDTASK_PORT}"
  401. echo " APIGateway: http://127.0.0.1:${APIGATEWAY_PORT}"
  402. echo ""
  403. echo -e "${BLUE}管理信息:${NC}"
  404. echo " 管理员账号: ${ADMIN_USER}"
  405. echo " 管理员密码: ${ADMIN_PASSWORD}"
  406. echo " 项目: ${ADMIN_PROJECT}"
  407. echo " Domain: ${ADMIN_DOMAIN}"
  408. echo ""
  409. echo -e "${BLUE}前端访问:${NC}"
  410. echo " http://localhost:8080"
  411. echo ""
  412. echo -e "${BLUE}常用命令:${NC}"
  413. echo " 查看日志: tail -f backend/logs/*.log"
  414. echo " 停止服务: ./backend/stop-backend.sh"
  415. echo " 服务状态: ps aux | grep -E 'keystone|region|glance|yunionconf|scheduledtask|apigateway'"
  416. echo ""
  417. }
  418. # 主流程
  419. main() {
  420. echo -e "${GREEN}========================================${NC}"
  421. echo -e "${GREEN} Cloudpods 统一初始化脚本${NC}"
  422. echo -e "${GREEN}========================================${NC}"
  423. echo ""
  424. # 加载配置
  425. load_config
  426. setup_defaults
  427. print_config
  428. # 确认初始化
  429. if [ "$SKIP_CONFIRM" != "true" ]; then
  430. echo -e "${YELLOW}警告: 这将删除现有的数据库并重新初始化所有数据!${NC}"
  431. read -p "是否继续? (y/N): " confirm
  432. if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
  433. echo -e "${YELLOW}已取消初始化${NC}"
  434. exit 0
  435. fi
  436. fi
  437. # 执行初始化阶段
  438. init_database
  439. init_services
  440. init_keystone
  441. start_other_services
  442. init_data
  443. init_policies
  444. # 打印完成信息
  445. print_completion
  446. }
  447. # 处理命令行参数
  448. while [[ $# -gt 0 ]]; do
  449. case $1 in
  450. --config)
  451. INIT_CONFIG_FILE="$2"
  452. shift 2
  453. ;;
  454. --skip-confirm)
  455. SKIP_CONFIRM="true"
  456. shift
  457. ;;
  458. --help)
  459. echo "Cloudpods 统一初始化脚本"
  460. echo ""
  461. echo "用法: $0 [选项]"
  462. echo ""
  463. echo "选项:"
  464. echo " --config <文件> 指定配置文件 (默认: init-config.env)"
  465. echo " --skip-confirm 跳过确认提示"
  466. echo " --help 显示帮助信息"
  467. echo ""
  468. echo "环境变量:"
  469. echo " DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME"
  470. echo " ADMIN_USER, ADMIN_PASSWORD, ADMIN_PROJECT, ADMIN_DOMAIN"
  471. echo " REGION_NAME, KEYSTONE_PORT, etc."
  472. echo ""
  473. exit 0
  474. ;;
  475. *)
  476. echo "未知选项: $1"
  477. echo "使用 --help 查看帮助"
  478. exit 1
  479. ;;
  480. esac
  481. done
  482. # 运行主流程
  483. main