#!/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