85 lines
2.7 KiB
Bash
Executable File
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
|