up
This commit is contained in:
Executable
+84
@@ -0,0 +1,84 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user