#!/bin/bash # 启动etcd服务 set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKEND_DIR="$(dirname "$SCRIPT_DIR")" # 检测操作系统 OS_TYPE="$(uname -s)" case "$OS_TYPE" in Darwin*) PLATFORM="darwin" ;; Linux*) PLATFORM="linux" ;; CYGWIN*|MINGW*|MSYS*) PLATFORM="windows" ;; *) echo "不支持的操作系统: $OS_TYPE"; exit 1 ;; esac # 根据平台选择 etcd 二进制文件 ETCD_BIN="$BACKEND_DIR/bin/$PLATFORM/etcd" if [ "$PLATFORM" = "windows" ]; then ETCD_BIN="$BACKEND_DIR/bin/$PLATFORM/etcd.exe" fi ETCD_DATA_DIR="$BACKEND_DIR/data/etcd" ETCD_LOG="$BACKEND_DIR/logs/etcd.log" ETCD_PID="$BACKEND_DIR/logs/etcd.pid" # 检查 etcd 是否已安装 if [ ! -f "$ETCD_BIN" ]; then echo "错误: 找不到 $PLATFORM 平台的 etcd 二进制文件" echo "路径: $ETCD_BIN" echo "" echo "请下载对应平台的 etcd 并放置到正确位置:" echo " macOS: backend/bin/darwin/etcd" echo " Linux: backend/bin/linux/etcd" echo " Windows: backend/bin/windows/etcd.exe" echo "" echo "下载地址: https://github.com/etcd-io/etcd/releases/tag/v3.6.10" exit 1 fi # 检查etcd是否已运行 if [ -f "$ETCD_PID" ]; then PID=$(cat "$ETCD_PID") if ps -p "$PID" > /dev/null 2>&1; then echo "✓ etcd 已在运行 (PID: $PID)" exit 0 fi fi # 创建数据目录 mkdir -p "$ETCD_DATA_DIR" mkdir -p "$(dirname "$ETCD_LOG")" echo "启动 etcd..." # 启动etcd nohup "$ETCD_BIN" \ --name cloudpods-etcd \ --data-dir "$ETCD_DATA_DIR" \ --listen-client-urls http://localhost:2379 \ --advertise-client-urls http://localhost:2379 \ --listen-peer-urls http://localhost:2380 \ --initial-advertise-peer-urls http://localhost:2380 \ --initial-cluster cloudpods-etcd=http://localhost:2380 \ > "$ETCD_LOG" 2>&1 & PID=$! echo $PID > "$ETCD_PID" # 等待etcd启动 sleep 2 if ps -p "$PID" > /dev/null 2>&1; then echo "✓ etcd 启动成功 (PID: $PID)" echo " - Client URL: http://localhost:2379" echo " - Data Dir: $ETCD_DATA_DIR" else echo "✗ etcd 启动失败" tail -10 "$ETCD_LOG" exit 1 fi