uninstall_debian.sh 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. timestamp() {
  4. date '+%Y-%m-%d %H:%M:%S'
  5. }
  6. log() {
  7. printf '[%s] %s\n' "$(timestamp)" "$*"
  8. }
  9. log_err() {
  10. printf '[%s] %s\n' "$(timestamp)" "$*" >&2
  11. }
  12. SERVICE_NAME="vmess-domain-rotator"
  13. REMOVE_AUTH_FILES="1"
  14. usage() {
  15. cat <<'EOF'
  16. Usage: sudo bash scripts/server/uninstall_debian.sh
  17. This script will:
  18. - Stop and disable the systemd timer and service
  19. - Remove systemd unit files
  20. - Remove environment/auth files created by installer (default)
  21. - Keep your git repository and all files intact
  22. Options:
  23. --service-name <name> Service base name (default: vmess-domain-rotator)
  24. --keep-auth-files Keep /etc/<service>.env and /var/lib/<service>
  25. -h, --help Show help
  26. Examples:
  27. sudo bash scripts/server/uninstall_debian.sh
  28. sudo bash scripts/server/uninstall_debian.sh --keep-auth-files
  29. EOF
  30. }
  31. while [[ $# -gt 0 ]]; do
  32. case "$1" in
  33. --service-name)
  34. SERVICE_NAME="$2"
  35. shift 2
  36. ;;
  37. --keep-auth-files)
  38. REMOVE_AUTH_FILES="0"
  39. shift
  40. ;;
  41. -h|--help)
  42. usage
  43. exit 0
  44. ;;
  45. *)
  46. log_err "Unknown option: $1"
  47. usage
  48. exit 1
  49. ;;
  50. esac
  51. done
  52. if [[ "$(id -u)" -ne 0 ]]; then
  53. log_err "Please run as root (use sudo)."
  54. exit 1
  55. fi
  56. if [[ -z "${SERVICE_NAME:-}" || ! "$SERVICE_NAME" =~ ^[a-zA-Z0-9_-]+$ ]]; then
  57. log_err "Invalid or empty --service-name: '${SERVICE_NAME:-}'"
  58. exit 1
  59. fi
  60. ENV_FILE="/etc/${SERVICE_NAME}.env"
  61. STATE_DIR="/var/lib/${SERVICE_NAME}"
  62. # Stop and disable timer
  63. if systemctl list-unit-files | grep -q "^${SERVICE_NAME}.timer"; then
  64. log "Stopping and disabling ${SERVICE_NAME}.timer..."
  65. systemctl disable --now "${SERVICE_NAME}.timer" || true
  66. fi
  67. # Stop service if running
  68. if systemctl list-unit-files | grep -q "^${SERVICE_NAME}.service"; then
  69. log "Stopping ${SERVICE_NAME}.service..."
  70. systemctl stop "${SERVICE_NAME}.service" || true
  71. fi
  72. # Remove systemd unit files
  73. SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
  74. SVC_USER=""
  75. SVC_APP_DIR=""
  76. if [[ -f "$SERVICE_FILE" ]]; then
  77. SVC_USER="$(grep '^User=' "$SERVICE_FILE" | head -1 | cut -d= -f2)"
  78. SVC_APP_DIR="$(grep '^WorkingDirectory=' "$SERVICE_FILE" | head -1 | cut -d= -f2)"
  79. fi
  80. log "Removing systemd unit files..."
  81. rm -f "/etc/systemd/system/${SERVICE_NAME}.service"
  82. rm -f "/etc/systemd/system/${SERVICE_NAME}.timer"
  83. if [[ -n "$SVC_USER" ]] && [[ -n "$SVC_APP_DIR" ]]; then
  84. log "Cleaning git safe.directory for user ${SVC_USER}..."
  85. runuser -u "$SVC_USER" -- git config --global --unset-all safe.directory "$SVC_APP_DIR" 2>/dev/null || true
  86. fi
  87. if [[ "$REMOVE_AUTH_FILES" == "1" ]]; then
  88. log "Removing auth/env files..."
  89. rm -f "$ENV_FILE"
  90. case "$STATE_DIR" in
  91. /var/lib/?*) rm -rf "$STATE_DIR" ;;
  92. *) log_err "Refusing to remove unsafe STATE_DIR: $STATE_DIR"; exit 1 ;;
  93. esac
  94. fi
  95. systemctl daemon-reload
  96. systemctl reset-failed
  97. log ""
  98. log "✓ Uninstall complete!"
  99. log ""
  100. if [[ "$REMOVE_AUTH_FILES" == "1" ]]; then
  101. log "Note: Service env/auth files have been removed."
  102. else
  103. log "Note: Service env/auth files were kept."
  104. fi
  105. log " Your git repository and project files have been preserved."
  106. log ""