Files
video/project-ctl.sh
2026-10-18 21:08:54 +08:00

85 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# ============================================================================
# 视频项目一键启停脚本
# 管理范围:video-api.service(后端) + Docker 容器 mysql8 / my-redis
# 不含 nginx(系统组件,可能服务其他站点;项目停止后接口 502 属正常)
# 用法:bash project-ctl.sh {start|stop|restart|status}
# ============================================================================
set -uo pipefail
SERVICE="video-api.service"
CONTAINERS=("mysql8" "my-redis")
wait_mysql() {
echo -n " 等待 MySQL 就绪..."
for i in $(seq 1 30); do
if docker exec mysql8 mysqladmin ping -h 127.0.0.1 -uroot -p256kb.cn >/dev/null 2>&1; then
echo " OK"; return 0
fi
sleep 1
done
echo " 超时(30s),请检查容器日志"; return 1
}
wait_redis() {
echo -n " 等待 Redis 就绪..."
for i in $(seq 1 15); do
if [ "$(docker exec my-redis redis-cli ping 2>/dev/null)" = "PONG" ]; then
echo " OK"; return 0
fi
sleep 1
done
echo " 超时(15s)"; return 1
}
do_start() {
echo "▶ 启动 Docker 容器: ${CONTAINERS[*]}"
docker start "${CONTAINERS[@]}" >/dev/null
wait_mysql && wait_redis || return 1
echo "▶ 启动后端服务 $SERVICE(并恢复开机自启)"
systemctl enable --now "$SERVICE"
sleep 2
local code
code=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8000/api/v1/app/version || true)
if [ "$code" = "200" ]; then
echo "✅ 项目已启动(接口健康检查 200)"
else
echo "⚠️ 服务已启动但健康检查返回 $code,请查看: journalctl -u $SERVICE -n 50"
fi
}
do_stop() {
echo "▶ 停止后端服务 $SERVICE(并取消开机自启,防止重启后自动拉起)"
systemctl disable --now "$SERVICE" 2>/dev/null || true
echo "▶ 停止 Docker 容器: ${CONTAINERS[*]}"
docker stop "${CONTAINERS[@]}" >/dev/null
echo " (容器策略为 unless-stopped,手动停止后服务器重启也不会自动恢复)"
echo "✅ 项目已停止"
}
do_status() {
echo "── 后端服务 ──"
systemctl status "$SERVICE" --no-pager -l | head -4
echo
echo "── Docker 容器 ──"
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "NAMES|mysql8|my-redis"
echo
echo "── 接口探测 ──"
local code
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 3 http://127.0.0.1:8000/api/v1/app/version || true)
echo " /api/v1/app/version → HTTP $code"
}
case "${1:-}" in
start) do_start ;;
stop) do_stop ;;
restart) do_stop; echo; do_start ;;
status) do_status ;;
*)
echo "用法: bash $0 {start|stop|restart|status}"
exit 1
;;
esac