#!/bin/bash # ============================================================ # OpenDance Studio Web 服务端 —— 卸载(Linux 原生站点) # # 默认**保留**上传文件与数据库数据;只有显式加 --purge 才删除程序目录与上传目录。 # 数据库从来不由本脚本管理,永不删除。 # # 用法: # bash deploy/uninstall.sh # 停服务、禁用站点,保留数据(需 root) # bash deploy/uninstall.sh --purge # 同时删除程序目录与上传文件 # ============================================================ set -euo pipefail APP_DIR="${APP_DIR:-/opt/opendance}" STORAGE_DIR="${STORAGE_DIR:-/var/lib/opendance/storage}" SERVICE_USER="${SERVICE_USER:-opendance}" PURGE=0 [ "${1:-}" = "--purge" ] && PURGE=1 log() { printf '\033[1;34m[uninstall]\033[0m %s\n' "$*"; } warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*"; } die() { printf '\033[1;31m[error]\033[0m %s\n' "$*" >&2; exit 1; } [ "$(id -u)" -eq 0 ] || die "需要 root 权限。请以 root 身份执行,例如: su -c 'bash deploy/uninstall.sh' 或 sudo bash deploy/uninstall.sh" log "停止并移除 opendance-api 服务" # 与 install.sh 的四层降级一一对应,避免在非 systemd 系统上留下仍在运行的进程 if [ -d /run/systemd/system ] && command -v systemctl >/dev/null 2>&1; then systemctl stop opendance-api 2>/dev/null || true systemctl disable opendance-api 2>/dev/null || true rm -f /etc/systemd/system/opendance-api.service systemctl daemon-reload elif command -v rc-service >/dev/null 2>&1 && [ -f /etc/init.d/opendance-api ]; then rc-service opendance-api stop 2>/dev/null || true rc-update del opendance-api default 2>/dev/null || true rm -f /etc/init.d/opendance-api elif [ -f /etc/init.d/opendance-api ]; then /etc/init.d/opendance-api stop 2>/dev/null || true command -v update-rc.d >/dev/null 2>&1 && update-rc.d -f opendance-api remove 2>/dev/null || true command -v chkconfig >/dev/null 2>&1 && chkconfig --del opendance-api 2>/dev/null || true rm -f /etc/init.d/opendance-api fi # 降级模式(nohup 后台进程)的停止与开机自启清理 if [ -f "$APP_DIR/deploy/ctl.sh" ]; then APP_DIR="$APP_DIR" SERVICE_USER="$SERVICE_USER" bash "$APP_DIR/deploy/ctl.sh" stop 2>/dev/null || true fi if command -v crontab >/dev/null 2>&1; then if crontab -l 2>/dev/null | grep -qF "$APP_DIR/deploy/ctl.sh start"; then crontab -l 2>/dev/null | grep -vF "$APP_DIR/deploy/ctl.sh start" | crontab - log "已移除 crontab 开机自启" fi fi # 说明:反向代理不属于本项目交付物,install.sh 从未安装/配置过任何反代, # 因此卸载时也不需要(且不应该)改动 nginx / IIS 的任何配置。 # 若运维侧曾按 deploy/proxy/ 自行加过站点,请由运维侧自行清理。 if [ "$PURGE" -eq 1 ]; then warn "删除程序目录 $APP_DIR 与上传目录 $STORAGE_DIR" rm -rf "$APP_DIR" "$STORAGE_DIR" if id -u "$SERVICE_USER" >/dev/null 2>&1; then userdel "$SERVICE_USER" 2>/dev/null || true log "已删除系统用户 $SERVICE_USER" fi log "完成(数据库未做任何改动)" else log "完成。已保留:" echo " 程序目录:$APP_DIR" echo " 上传目录:$STORAGE_DIR" echo " 如需一并删除(root 身份):bash deploy/uninstall.sh --purge" fi echo " 数据库:始终由部署方自行管理,本脚本不做任何改动"