Files
server-deploy/gitea/uninstall.sh

187 lines
6.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
# ============================================
# Gitea 卸载脚本
# 停止容器 → 备份数据 → 清理容器/镜像/配置/数据
# ============================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
log() { echo -e "${GREEN}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
# ===== 检查 root =====
if [ "$(id -u)" -ne 0 ]; then
error "请使用 root 用户运行: sudo bash uninstall.sh"
exit 1
fi
# ===== 加载配置 =====
if [ -f .env ]; then
sed -i 's/\r$//' .env
set -a
source .env
set +a
fi
GITEA_DATA_DIR="${GITEA_DATA_DIR:-/var/lib/gitea}"
MYSQL_DATA_DIR="${MYSQL_DATA_DIR:-/var/lib/mysql/gitea}"
BACKUP_DIR="${BACKUP_DIR:-/var/backups/gitea}"
GITEA_DOMAIN="${GITEA_DOMAIN:-}"
SSH_PORT="${SSH_PORT:-2222}"
# ===== 确认操作 =====
echo ""
echo -e "${RED}╔══════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║ ⚠ 即将卸载 Gitea 及所有数据 ⚠ ║${NC}"
echo -e "${RED}╚══════════════════════════════════════════════════╝${NC}"
echo ""
echo "将执行以下操作:"
echo " 1. 停止并删除 Gitea + MySQL 容器"
echo " 2. 删除 Docker 镜像"
echo " 3. 删除 Nginx 站点配置"
echo " 4. 删除 SSL 证书"
echo " 5. 关闭防火墙端口 ${SSH_PORT}"
echo " 6. 删除 Certbot 自动续期定时任务"
echo ""
echo "涉及的数据目录:"
echo " Gitea 数据: ${GITEA_DATA_DIR}"
echo " MySQL 数据: ${MYSQL_DATA_DIR}"
echo " 备份目录: ${BACKUP_DIR}"
echo " 部署目录: ${SCRIPT_DIR}"
echo ""
echo -e "${YELLOW}备份目录将保留,不会被删除。${NC}"
echo ""
read -r -p "确定要继续卸载吗?输入 YES 确认: " confirm
if [ "$confirm" != "YES" ]; then
log "已取消卸载"
exit 0
fi
# ===== 卸载前备份 =====
echo ""
read -r -p "是否在卸载前执行一次备份?(y/N): " do_backup
if [[ "$do_backup" =~ ^[Yy]$ ]]; then
if [ -f backup.sh ]; then
# 确保容器在运行backup.sh 需要连接 MySQL
if ! docker compose ps --quiet db 2>/dev/null | grep -q .; then
log "容器未运行,先启动容器以执行备份..."
docker compose up -d
log "等待 MySQL 就绪..."
for i in $(seq 1 30); do
if docker compose exec -T db mysqladmin ping -h localhost -u root -p"${DB_ROOT_PASSWORD:-}" --silent &>/dev/null; then
break
fi
sleep 2
done
fi
log "正在执行备份..."
bash backup.sh
log "备份完成"
else
warn "backup.sh 不存在,跳过备份"
fi
fi
# ===== 1. 停止并删除容器 =====
echo ""
log "正在停止并删除容器..."
if docker compose ps --quiet 2>/dev/null | grep -q .; then
docker compose down -v
log "容器已停止并删除"
else
log "没有运行中的容器"
fi
# ===== 2. 删除 Docker 镜像 =====
log "正在删除 Docker 镜像..."
GITEA_IMAGE="${GITEA_IMAGE:-gitea/gitea:1.25}"
docker image rm "$GITEA_IMAGE" 2>/dev/null && log "已删除镜像: $GITEA_IMAGE" || true
docker image rm mysql:8.4 2>/dev/null && log "已删除镜像: mysql:8.4" || true
# ===== 3. 删除 Nginx 配置 =====
log "正在清理 Nginx 配置..."
rm -f /etc/nginx/sites-enabled/gitea
rm -f /etc/nginx/sites-available/gitea
if command -v nginx &>/dev/null && nginx -t 2>/dev/null; then
systemctl reload nginx 2>/dev/null || true
log "Nginx 已重载"
fi
# ===== 4. 删除 SSL 证书 =====
if [ -n "$GITEA_DOMAIN" ] && [ -d "/etc/letsencrypt/live/${GITEA_DOMAIN}" ]; then
log "正在删除 SSL 证书: ${GITEA_DOMAIN}..."
certbot delete --cert-name "${GITEA_DOMAIN}" --non-interactive 2>/dev/null || true
log "SSL 证书已删除"
fi
# ===== 5. 关闭防火墙端口 =====
log "正在关闭防火墙端口 ${SSH_PORT}..."
if command -v ufw &>/dev/null; then
ufw delete allow "${SSH_PORT}/tcp" 2>/dev/null || true
ufw reload 2>/dev/null || true
elif command -v firewall-cmd &>/dev/null; then
firewall-cmd --permanent --remove-port="${SSH_PORT}/tcp" 2>/dev/null || true
firewall-cmd --reload 2>/dev/null || true
fi
log "防火墙端口已关闭"
# ===== 6. 清理 Certbot 定时任务中的 Gitea 相关条目 =====
# 注意certbot renew 是共享的,只有当没有其他证书时才移除
remaining_certs=$(certbot certificates 2>/dev/null | grep -c "Certificate Name" || true)
if [ "$remaining_certs" -eq 0 ]; then
crontab -l 2>/dev/null | grep -v "certbot renew" | crontab - 2>/dev/null || true
log "已移除 Certbot 自动续期定时任务(无剩余证书)"
else
log "保留 Certbot 定时任务(还有 ${remaining_certs} 个其他证书)"
fi
# ===== 7. 删除数据目录 =====
echo ""
echo -e "${RED}以下目录将被永久删除:${NC}"
echo " ${GITEA_DATA_DIR}"
echo " ${MYSQL_DATA_DIR}"
echo ""
echo -e "${YELLOW}备份目录 ${BACKUP_DIR} 不会被删除。${NC}"
echo ""
read -r -p "确认删除数据目录?输入 DELETE 确认: " confirm_delete
if [ "$confirm_delete" = "DELETE" ]; then
rm -rf "$GITEA_DATA_DIR"
log "已删除: ${GITEA_DATA_DIR}"
rm -rf "$MYSQL_DATA_DIR"
log "已删除: ${MYSQL_DATA_DIR}"
else
warn "跳过数据目录删除"
fi
# ===== 8. 删除部署目录 =====
echo ""
read -r -p "是否删除部署目录 ${SCRIPT_DIR}(y/N): " del_deploy
if [[ "$del_deploy" =~ ^[Yy]$ ]]; then
cd /opt
rm -rf "$SCRIPT_DIR"
log "已删除部署目录"
else
warn "保留部署目录: ${SCRIPT_DIR}"
fi
# ===== 完成 =====
echo ""
log "Gitea 卸载完成"
echo ""
echo "保留的内容:"
echo " 备份目录: ${BACKUP_DIR}"
[ "$confirm_delete" != "DELETE" ] && echo " 数据目录: ${GITEA_DATA_DIR}, ${MYSQL_DATA_DIR}"
[[ ! "$del_deploy" =~ ^[Yy]$ ]] && echo " 部署目录: ${SCRIPT_DIR}"
echo ""
echo "如需恢复,请参考 README.md 中的「恢复备份」章节。"