start-dev.sh 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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. echo -e "${GREEN}========================================${NC}"
  11. echo -e "${GREEN} Cloudpods 开发环境启动脚本${NC}"
  12. echo -e "${GREEN}========================================${NC}"
  13. echo ""
  14. # 加载环境变量
  15. if [ -f "../.env.local" ]; then
  16. echo -e "${BLUE}加载 .env.local 配置...${NC}"
  17. set -a
  18. source ../.env.local
  19. set +a
  20. fi
  21. # 设置默认值
  22. DB_HOST=${DB_HOST:-127.0.0.1}
  23. DB_PORT=${DB_PORT:-3306}
  24. DB_USER=${DB_USER:-root}
  25. DB_PASSWORD=${DB_PASSWORD:-}
  26. DB_NAME=${DB_NAME:-yunioncloud}
  27. KEYSTONE_PORT=${KEYSTONE_PORT:-30500}
  28. ADMIN_USER=${ADMIN_USER:-sysadmin}
  29. ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin@123}
  30. ADMIN_PROJECT=${ADMIN_PROJECT:-system}
  31. ADMIN_DOMAIN=${ADMIN_DOMAIN:-Default}
  32. REGION_NAME=${REGION_NAME:-region0}
  33. REGION_PORT=${REGION_PORT:-30889}
  34. GLANCE_PORT=${GLANCE_PORT:-9292}
  35. YUNIONCONF_PORT=${YUNIONCONF_PORT:-30888}
  36. SCHEDULEDTASK_PORT=${SCHEDULEDTASK_PORT:-30950}
  37. APIGATEWAY_PORT=${APIGATEWAY_PORT:-3000}
  38. # 构建数据库连接字符串
  39. if [ -z "$DB_PASSWORD" ]; then
  40. SQL_CONNECTION="mysql+pymysql://${DB_USER}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  41. else
  42. SQL_CONNECTION="mysql+pymysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?charset=utf8mb4"
  43. fi
  44. # 通用服务启动参数
  45. 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}"
  46. # 创建日志目录
  47. mkdir -p logs
  48. # 检查并编译服务
  49. check_binary() {
  50. local service=$1
  51. if [ ! -f "_output/bin/${service}" ]; then
  52. echo -e "${YELLOW}编译 ${service}...${NC}"
  53. GOOS=darwin CGO_ENABLED=0 go build -mod vendor -o "_output/bin/${service}" "yunion.io/x/onecloud/cmd/${service}"
  54. fi
  55. }
  56. # 停止已运行的服务
  57. stop_existing() {
  58. echo -e "${YELLOW}检查并停止已运行的服务...${NC}"
  59. for service in apigateway scheduledtask yunionconf glance region keystone; do
  60. if [ -f "logs/${service}.pid" ]; then
  61. pid=$(cat logs/${service}.pid)
  62. if ps -p $pid > /dev/null 2>&1; then
  63. echo " 停止 ${service} (PID: ${pid})"
  64. kill $pid 2>/dev/null || true
  65. fi
  66. rm -f logs/${service}.pid
  67. fi
  68. done
  69. sleep 1
  70. }
  71. # 启动服务
  72. start_service() {
  73. local service=$1
  74. local port=$2
  75. local extra_args=$3
  76. echo -e "${YELLOW}启动 ${service} (端口 ${port})...${NC}"
  77. local port_args=""
  78. if [ "${service}" = "keystone" ]; then
  79. port_args="--port ${KEYSTONE_PORT} --admin-port 35357 --bootstrap-admin-user-password ${ADMIN_PASSWORD}"
  80. else
  81. port_args="--port ${port}"
  82. fi
  83. local sql_args=""
  84. if [ "${service}" != "apigateway" ]; then
  85. sql_args="--sql-connection \"${SQL_CONNECTION}\" --auto-sync-table"
  86. fi
  87. eval "_output/bin/${service} \
  88. --config /dev/null \
  89. ${sql_args} \
  90. ${port_args} \
  91. ${extra_args} \
  92. > logs/${service}.log 2>&1 &"
  93. echo $! > logs/${service}.pid
  94. echo -e "${GREEN} ✓ ${service} 已启动 (PID: $!)${NC}"
  95. }
  96. # 等待服务就绪
  97. wait_for_service() {
  98. local service=$1
  99. local url=$2
  100. local max_wait=${3:-30}
  101. echo -e "${YELLOW}等待 ${service} 就绪...${NC}"
  102. for i in $(seq 1 $max_wait); do
  103. if curl -s "$url" > /dev/null 2>&1; then
  104. echo -e "${GREEN} ✓ ${service} 已就绪${NC}"
  105. return 0
  106. fi
  107. sleep 1
  108. done
  109. echo -e "${RED} ✗ ${service} 启动超时${NC}"
  110. return 1
  111. }
  112. # 主流程
  113. main() {
  114. # 停止已运行的服务
  115. stop_existing
  116. # 检查并编译所有服务
  117. echo -e "${BLUE}检查服务二进制文件...${NC}"
  118. check_binary keystone
  119. check_binary region
  120. check_binary glance
  121. check_binary yunionconf
  122. check_binary scheduledtask
  123. check_binary apigateway
  124. # 启动 Keystone
  125. start_service keystone ${KEYSTONE_PORT} ""
  126. wait_for_service "Keystone" "http://127.0.0.1:${KEYSTONE_PORT}/v3" 30
  127. # 创建 glance 数据目录
  128. mkdir -p /tmp/glance_data
  129. # 启动其他服务
  130. start_service region ${REGION_PORT} "${COMMON_ARGS}"
  131. start_service glance ${GLANCE_PORT} "${COMMON_ARGS} --filesystem-store-datadir /tmp/glance_data"
  132. start_service yunionconf ${YUNIONCONF_PORT} "${COMMON_ARGS}"
  133. start_service scheduledtask ${SCHEDULEDTASK_PORT} "${COMMON_ARGS}"
  134. # APIGateway 特殊处理
  135. echo -e "${YELLOW}启动 APIGateway (端口 ${APIGATEWAY_PORT})...${NC}"
  136. _output/bin/apigateway \
  137. --config /dev/null \
  138. --port ${APIGATEWAY_PORT} \
  139. ${COMMON_ARGS} \
  140. --default-region ${REGION_NAME} \
  141. > logs/apigateway.log 2>&1 &
  142. echo $! > logs/apigateway.pid
  143. echo -e "${GREEN} ✓ APIGateway 已启动 (PID: $!)${NC}"
  144. # 等待所有服务就绪
  145. echo ""
  146. echo -e "${YELLOW}等待所有服务就绪...${NC}"
  147. sleep 3
  148. # 打印状态
  149. echo ""
  150. echo -e "${GREEN}========================================${NC}"
  151. echo -e "${GREEN} 服务启动完成!${NC}"
  152. echo -e "${GREEN}========================================${NC}"
  153. echo ""
  154. echo -e "${BLUE}服务状态:${NC}"
  155. for service in keystone region glance yunionconf scheduledtask apigateway; do
  156. if [ -f "logs/${service}.pid" ]; then
  157. pid=$(cat logs/${service}.pid)
  158. if ps -p $pid > /dev/null 2>&1; then
  159. echo -e " ${GREEN}✓${NC} ${service} (PID: ${pid})"
  160. else
  161. echo -e " ${RED}✗${NC} ${service} (已停止)"
  162. fi
  163. fi
  164. done
  165. echo ""
  166. echo -e "${BLUE}访问地址:${NC}"
  167. echo " APIGateway: http://127.0.0.1:${APIGATEWAY_PORT}"
  168. echo " Frontend: http://localhost:8080"
  169. echo ""
  170. echo -e "${BLUE}常用命令:${NC}"
  171. echo " 查看日志: tail -f logs/*.log"
  172. echo " 停止服务: ./stop-backend.sh"
  173. echo ""
  174. }
  175. # 处理命令行参数
  176. while [[ $# -gt 0 ]]; do
  177. case $1 in
  178. --help)
  179. echo "Cloudpods 开发环境启动脚本"
  180. echo ""
  181. echo "用法: $0 [选项]"
  182. echo ""
  183. echo "选项:"
  184. echo " --help 显示帮助信息"
  185. echo ""
  186. echo "说明:"
  187. echo " 此脚本用于日常开发,不重置数据库,只启动服务。"
  188. echo " 如果是全新部署,请使用 init-cloudpods.sh"
  189. echo ""
  190. exit 0
  191. ;;
  192. *)
  193. echo "未知选项: $1"
  194. exit 1
  195. ;;
  196. esac
  197. done
  198. main