Files
J-Board-Lite/scripts/uninstall-jetboard-standalone.sh
2026-05-01 01:50:37 +10:00

159 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
CONFIG_FILE="${JETBOARD_CONFIG:-/etc/jetboard.conf}"
APP_DIR="${JBOARD_APP_DIR:-${APP_DIR:-}}"
SERVICE_NAME="${JBOARD_SERVICE_NAME:-jetboard}"
SERVICE_USER="${JBOARD_SERVICE_USER:-jetboard}"
BACKUP_ROOT="${BACKUP_ROOT:-/root}"
UNINSTALL_CONFIRM="${UNINSTALL_CONFIRM:-}"
if [ -z "$APP_DIR" ] && [ -r "$CONFIG_FILE" ]; then
# shellcheck disable=SC1090
. "$CONFIG_FILE"
APP_DIR="${JBOARD_APP_DIR:-${APP_DIR:-}}"
SERVICE_NAME="${JBOARD_SERVICE_NAME:-${SERVICE_NAME:-jetboard}}"
SERVICE_USER="${JBOARD_SERVICE_USER:-${SERVICE_USER:-jetboard}}"
fi
APP_DIR="${APP_DIR:-/opt/jboard}"
is_interactive() {
[ -r /dev/tty ] && [ -w /dev/tty ]
}
prompt_print() {
if is_interactive; then
printf '%b' "$*" > /dev/tty
else
printf '%b' "$*" >&2
fi
}
prompt_read() {
local __var="$1"
if is_interactive; then
IFS= read -r "$__var" < /dev/tty || true
else
return 1
fi
}
run_as_root() {
if [ "$(id -u)" -eq 0 ]; then
"$@"
elif command -v sudo >/dev/null 2>&1; then
sudo "$@"
else
echo "需要 root 权限。请使用 root 用户运行,或先安装 sudo。" >&2
exit 1
fi
}
line() {
printf '%s\n' "------------------------------------------------------------"
}
section() {
echo
line
printf '%s\n' "$1"
line
}
confirm_uninstall() {
if [ "$UNINSTALL_CONFIRM" = "YES" ]; then
return
fi
if ! is_interactive; then
echo "非交互卸载请设置 UNINSTALL_CONFIRM=YES。" >&2
exit 1
fi
section "确认卸载 J-Board Lite standalone"
printf '将停止并删除服务:%s\n' "$SERVICE_NAME"
printf '将删除安装目录:%s\n' "$APP_DIR"
printf '将删除命令:/usr/local/bin/jetboard、/usr/local/bin/JetBoard\n'
printf '将删除配置:%s\n' "$CONFIG_FILE"
echo "卸载前会尝试备份 .env 和 storage 到 ${BACKUP_ROOT}"
echo
prompt_print "请输入 YES 确认卸载: "
local answer=""
prompt_read answer || true
if [ "$answer" != "YES" ]; then
echo "已取消卸载。"
exit 0
fi
}
backup_before_remove() {
if [ ! -d "$APP_DIR" ]; then
echo "安装目录不存在,跳过备份:$APP_DIR"
return
fi
local backup_dir backup_file
backup_dir="${BACKUP_ROOT%/}/jboard-uninstall-backup-$(date +%F-%H%M%S)"
backup_file="${backup_dir}.tar.gz"
run_as_root mkdir -p "$backup_dir"
if [ -f "$APP_DIR/.env" ]; then
run_as_root cp "$APP_DIR/.env" "$backup_dir/.env"
fi
if [ -d "$APP_DIR/storage" ]; then
run_as_root cp -R "$APP_DIR/storage" "$backup_dir/storage"
fi
if [ -d "$APP_DIR/backups" ]; then
run_as_root cp -R "$APP_DIR/backups" "$backup_dir/backups"
fi
run_as_root tar -C "$(dirname "$backup_dir")" -czf "$backup_file" "$(basename "$backup_dir")"
run_as_root rm -rf "$backup_dir"
echo "卸载备份已保存:$backup_file"
}
remove_service() {
section "删除 systemd 服务"
if command -v systemctl >/dev/null 2>&1; then
run_as_root systemctl stop "$SERVICE_NAME" >/dev/null 2>&1 || true
run_as_root systemctl disable "$SERVICE_NAME" >/dev/null 2>&1 || true
fi
run_as_root rm -f "/etc/systemd/system/${SERVICE_NAME}.service"
if command -v systemctl >/dev/null 2>&1; then
run_as_root systemctl daemon-reload || true
run_as_root systemctl reset-failed "$SERVICE_NAME" >/dev/null 2>&1 || true
fi
}
remove_files() {
section "删除文件"
run_as_root rm -f /usr/local/bin/jetboard /usr/local/bin/JetBoard
run_as_root rm -f "$CONFIG_FILE"
run_as_root rm -rf "$APP_DIR"
}
remove_user() {
section "删除运行用户"
if id "$SERVICE_USER" >/dev/null 2>&1; then
if command -v userdel >/dev/null 2>&1; then
run_as_root userdel "$SERVICE_USER" >/dev/null 2>&1 || true
elif command -v deluser >/dev/null 2>&1; then
run_as_root deluser "$SERVICE_USER" >/dev/null 2>&1 || true
fi
fi
}
main() {
confirm_uninstall
backup_before_remove
remove_service
remove_files
remove_user
echo
echo "J-Board Lite standalone 已卸载。"
}
main "$@"