This commit is contained in:
vet
2026-04-13 01:27:34 +07:00
commit c7c3c02bc3
18 changed files with 2730 additions and 0 deletions

125
restart.sh Executable file
View File

@@ -0,0 +1,125 @@
#!/usr/bin/env bash
# =============================================================================
# restart.sh — 重启指定服务
#
# 用法:
# ./restart.sh <service> # 重启后端服务(使用已有二进制)
# ./restart.sh <service> --build # 先重新编译再重启
# ./restart.sh <docker-service> # 重启 Docker 容器redis/kafka/etcd
#
# 示例:
# ./restart.sh chat-api
# ./restart.sh chat-api --build
# ./restart.sh redis
# =============================================================================
set -euo pipefail
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh"
load_env
init_script_log # ← 脚本执行日志
SVC="${1:-}"
OPT="${2:-}"
[[ -z "$SVC" ]] && { error "用法: $0 <service> [--build]"; exit 1; }
# ── 服务配置(与 05-start.sh 保持一致)───────────────────────────────────────
declare -A svc_workdir=(
[openim-server]="$ROOT_DIR/open-im-server"
[chat-rpc]="$ROOT_DIR/chat"
[admin-rpc]="$ROOT_DIR/chat"
[chat-api]="$ROOT_DIR/chat"
[admin-api]="$ROOT_DIR/chat"
[meetingmsg]="$ROOT_DIR/meetingmsg"
[livecloud]="$ROOT_DIR/livecloud"
[livestream]="$ROOT_DIR/livestream"
)
declare -A svc_args=(
[openim-server]="-c $ROOT_DIR/open-im-server/config"
[chat-rpc]="-c $ROOT_DIR/chat/config"
[admin-rpc]="-c $ROOT_DIR/chat/config"
[chat-api]="-c $ROOT_DIR/chat/config"
[admin-api]="-c $ROOT_DIR/chat/config"
[meetingmsg]=""
[livecloud]=""
[livestream]=""
)
declare -A svc_src_dir=(
[openim-server]="open-im-server"
[chat-rpc]="chat"
[admin-rpc]="chat"
[chat-api]="chat"
[admin-api]="chat"
[meetingmsg]="meetingmsg"
[livecloud]="livecloud"
[livestream]="livestream"
)
declare -A svc_src_pkg=(
[openim-server]="./cmd/main.go"
[chat-rpc]="./cmd/rpc/chat-rpc/"
[admin-rpc]="./cmd/rpc/admin-rpc/"
[chat-api]="./cmd/api/chat-api/"
[admin-api]="./cmd/api/admin-api/"
[meetingmsg]="."
[livecloud]="."
[livestream]="."
)
# ── Docker 容器重启 ───────────────────────────────────────────────────────────
_restart_docker() {
local label="$1" cname="$2"
require_docker_running
if docker ps -a --format '{{.Names}}' | grep -q "^${cname}$"; then
info "重启容器 $cname ..."
docker restart "$cname" > /dev/null
sleep 2
if docker ps --format '{{.Names}}' | grep -q "^${cname}$"; then
success "$label 容器已重启 (container=$cname)"
else
error "$label 重启失败"
fi
else
warn "容器 $cname 不存在,请先执行 03-start-infra.sh"
fi
}
# ── 处理 Docker 容器 ──────────────────────────────────────────────────────────
case "$SVC" in
redis) _restart_docker "Redis" "dev-redis"; exit 0 ;;
kafka) _restart_docker "Kafka" "dev-kafka"; exit 0 ;;
etcd) _restart_docker "Etcd" "dev-etcd"; exit 0 ;;
esac
# ── 处理后端服务 ──────────────────────────────────────────────────────────────
if [[ -z "${svc_workdir[$SVC]:-}" ]]; then
error "未知服务: $SVC"
echo "后端服务: ${!svc_workdir[*]}"
echo "Docker: redis, kafka, etcd"
exit 1
fi
step "重启服务: $SVC"
# 是否先重新编译
if [[ "$OPT" == "--build" ]]; then
info "重新编译 $SVC ..."
dir="$ROOT_DIR/${svc_src_dir[$SVC]}"
pkg="${svc_src_pkg[$SVC]}"
(cd "$dir" && go build -o "$BUILD_DIR/$SVC" "$pkg") && \
success "编译完成" || { error "编译失败"; exit 1; }
fi
# 停止旧进程
stop_svc "$SVC"
sleep 1
# 启动新进程
start_svc "$SVC" \
"$BUILD_DIR/$SVC" \
"${svc_args[$SVC]}" \
"${svc_workdir[$SVC]}"
echo ""
echo -e "查看日志: ${CYAN}./deploy-test/logs.sh $SVC${NC}"