131 lines
4.0 KiB
Bash
131 lines
4.0 KiB
Bash
#!/usr/bin/env bash
|
|
# datahub 卸载脚本
|
|
#
|
|
# 默认行为:停服务 + 移除 Quadlet + 删 secrets,保留数据目录和镜像
|
|
#
|
|
# 用法:bash uninstall.sh [选项]
|
|
# --purge-images 同时删除 3 个本地镜像
|
|
# --purge-data 同时删除 /var/container/data/datahub/ 数据目录(危险)
|
|
# -y, --yes 不询问确认(用于自动化)
|
|
|
|
set -euo pipefail
|
|
|
|
B='\033[34m'; G='\033[32m'; Y='\033[33m'; R='\033[31m'; N='\033[0m'
|
|
ok() { echo -e "${G}[OK]${N} $*"; }
|
|
warn() { echo -e "${Y}[!]${N} $*"; }
|
|
|
|
PURGE_IMAGES=false
|
|
PURGE_DATA=false
|
|
ASSUME_YES=false
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--purge-images) PURGE_IMAGES=true ;;
|
|
--purge-data) PURGE_DATA=true ;;
|
|
-y|--yes) ASSUME_YES=true ;;
|
|
-h|--help)
|
|
sed -n '2,11p' "$0"
|
|
exit 0
|
|
;;
|
|
*) echo "未知参数: $arg" >&2; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
QUADLET_DIR="$HOME/.config/containers/systemd"
|
|
DATA_DIR=/var/container/data/datahub
|
|
SERVICES=(datahub-frontend datahub-backend datahub-rabbitmq datahub-postgres)
|
|
QUADLET_FILES=(
|
|
datahub-frontend.container
|
|
datahub-backend.container
|
|
datahub-rabbitmq.container
|
|
datahub-postgres.container
|
|
datahub.network
|
|
)
|
|
SECRETS=(datahub-pg-password datahub-rabbitmq-password datahub-jwt-secret datahub-tools-token)
|
|
IMAGES=(localhost/datahub-postgres:latest localhost/datahub-backend:latest localhost/datahub-frontend:latest)
|
|
|
|
echo -e "${B}=== datahub 卸载脚本 ===${N}"
|
|
echo
|
|
echo "将执行以下操作:"
|
|
echo " - 停止 4 个 systemd 服务"
|
|
echo " - 移除 ${#QUADLET_FILES[@]} 个 Quadlet 单元"
|
|
echo " - 删除 ${#SECRETS[@]} 个 podman secrets"
|
|
echo -n " - 镜像: "
|
|
[ "$PURGE_IMAGES" = true ] && echo -e "${R}删除${N}" || echo "保留"
|
|
echo -n " - 数据目录 $DATA_DIR: "
|
|
[ "$PURGE_DATA" = true ] && echo -e "${R}删除(数据将丢失)${N}" || echo "保留"
|
|
echo
|
|
|
|
if [ "$ASSUME_YES" = false ]; then
|
|
read -rp "确认继续?(y/N): " ans
|
|
[[ "${ans,,}" == "y" ]] || { echo "已取消"; exit 0; }
|
|
fi
|
|
|
|
# 1. 停服务
|
|
echo -e "\n${B}-> 停止服务${N}"
|
|
for svc in "${SERVICES[@]}"; do
|
|
if systemctl --user is-active --quiet "$svc.service" 2>/dev/null; then
|
|
systemctl --user stop "$svc.service" || true
|
|
echo " 停止 $svc"
|
|
fi
|
|
done
|
|
|
|
# 2. 移除 Quadlet 文件
|
|
echo -e "\n${B}-> 移除 Quadlet 单元${N}"
|
|
for f in "${QUADLET_FILES[@]}"; do
|
|
if [ -f "$QUADLET_DIR/$f" ]; then
|
|
rm -f "$QUADLET_DIR/$f"
|
|
echo " 删除 $f"
|
|
fi
|
|
done
|
|
systemctl --user daemon-reload
|
|
|
|
# 3. 清理残留容器(保险起见)
|
|
for c in datahub-postgres datahub-rabbitmq datahub-backend datahub-frontend; do
|
|
if podman container exists "$c" 2>/dev/null; then
|
|
podman rm -f "$c" >/dev/null
|
|
echo " 删除残留容器 $c"
|
|
fi
|
|
done
|
|
|
|
# 4. 删 secrets
|
|
echo -e "\n${B}-> 删除 secrets${N}"
|
|
for s in "${SECRETS[@]}"; do
|
|
if podman secret exists "$s" 2>/dev/null; then
|
|
podman secret rm "$s" >/dev/null
|
|
echo " 删除 $s"
|
|
fi
|
|
done
|
|
|
|
# 5. 删镜像(可选)
|
|
if [ "$PURGE_IMAGES" = true ]; then
|
|
echo -e "\n${B}-> 删除镜像${N}"
|
|
for img in "${IMAGES[@]}"; do
|
|
if podman image exists "$img" 2>/dev/null; then
|
|
podman rmi "$img" >/dev/null && echo " 删除 $img"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# 6. 删数据目录(危险,双重确认)
|
|
if [ "$PURGE_DATA" = true ]; then
|
|
echo -e "\n${R}-> 删除数据目录${N}"
|
|
if [ "$ASSUME_YES" = false ]; then
|
|
echo -e "${R}警告:将永久删除 $DATA_DIR 及全部数据${N}"
|
|
read -rp "请输入完整的 'yes' 以确认: " ans
|
|
if [ "$ans" != "yes" ]; then
|
|
echo "数据目录保留"
|
|
ASSUME_YES=skip_data
|
|
fi
|
|
fi
|
|
if [ "$ASSUME_YES" != "skip_data" ]; then
|
|
sudo rm -rf "$DATA_DIR"
|
|
echo " 数据目录已删除"
|
|
fi
|
|
fi
|
|
|
|
echo
|
|
ok "卸载完成"
|
|
[ "$PURGE_DATA" = false ] && warn "数据保留在 $DATA_DIR(重新部署可直接恢复)"
|
|
[ "$PURGE_IMAGES" = false ] && warn "镜像保留(podman images | grep datahub 可见)"
|