From a9e1555fe17cced9d2c90b6dfc2dfd47292a3cc9 Mon Sep 17 00:00:00 2001 From: dekun Date: Sat, 27 Jun 2026 11:13:30 +0800 Subject: [PATCH] Add uninstall.sh for one-click removal Co-authored-by: Cursor --- DEPLOY.md | 28 +++++++++++++--- README.md | 2 ++ deploy.sh | 1 + uninstall.sh | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 uninstall.sh diff --git a/DEPLOY.md b/DEPLOY.md index ff85aeb..289f57e 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -254,11 +254,29 @@ docker compose up -d --- -## 九、卸载 +## 九、一键卸载 ```bash -cd /opt/cloud-browser -docker compose down -cd / -rm -rf /opt/cloud-browser +bash /opt/cloud-browser/uninstall.sh +``` + +按提示输入 `yes` 确认。将自动: + +1. 停止并删除 Docker 容器 +2. 删除本地构建的镜像 +3. 删除 `/opt/cloud-browser` 目录(含账号数据) + +跳过确认直接删除: + +```bash +bash /opt/cloud-browser/uninstall.sh -y +``` + +若目录已被删,可从仓库单独下载脚本执行(需指定安装路径时手动删除 `/opt/cloud-browser`)。 + +重新安装: + +```bash +git clone https://git.bz121.com/dekun/cloud-browser.git /opt/cloud-browser +bash /opt/cloud-browser/deploy.sh ``` diff --git a/README.md b/README.md index 9bc097b..724594b 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ cloud-browser/ ├── app/ # 后端(FastAPI + Playwright) ├── static/ # 前端页面 ├── deploy.sh # 一键部署脚本 +├── uninstall.sh # 一键卸载脚本 ├── docker-compose.yml ├── Dockerfile └── DEPLOY.md # 部署文档 @@ -51,6 +52,7 @@ docker compose logs -f app # 查看日志 docker compose restart # 重启 docker compose down # 停止 bash deploy.sh # 更新并重新部署 +bash uninstall.sh # 一键卸载 ``` ## 安全说明 diff --git a/deploy.sh b/deploy.sh index d7099a3..6d06f08 100644 --- a/deploy.sh +++ b/deploy.sh @@ -108,6 +108,7 @@ print_summary() { echo " 重启服务: cd ${INSTALL_DIR} && docker compose restart" echo " 停止服务: cd ${INSTALL_DIR} && docker compose down" echo " 更新部署: bash ${INSTALL_DIR}/deploy.sh" + echo " 一键卸载: bash ${INSTALL_DIR}/uninstall.sh" echo "==========================================" } diff --git a/uninstall.sh b/uninstall.sh new file mode 100644 index 0000000..0e61d1a --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +# +# 云端浏览器一键卸载脚本 +# 安装路径: /opt/cloud-browser +# 运行用户: root +# +set -eu + +INSTALL_DIR="/opt/cloud-browser" +FORCE=0 + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +log() { echo -e "${GREEN}[INFO]${NC} $*"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } +err() { echo -e "${RED}[ERROR]${NC} $*" >&2; } + +usage() { + echo "用法: bash uninstall.sh [-y]" + echo " -y 跳过确认,直接删除" +} + +while getopts ":yh" opt; do + case "$opt" in + y) FORCE=1 ;; + h) usage; exit 0 ;; + *) usage; exit 1 ;; + esac +done + +if [ "$(id -u)" -ne 0 ]; then + err "请使用 root 用户运行此脚本" + exit 1 +fi + +if [ ! -d "${INSTALL_DIR}" ]; then + warn "目录不存在: ${INSTALL_DIR},无需卸载" + exit 0 +fi + +echo "" +echo "即将卸载云端浏览器:" +echo " - 停止并删除 Docker 容器" +echo " - 删除本地构建的镜像" +echo " - 删除目录 ${INSTALL_DIR}(含 data 账号数据)" +echo "" + +if [ "$FORCE" -ne 1 ]; then + printf "确认删除?输入 yes 继续: " + read -r confirm + if [ "$confirm" != "yes" ]; then + log "已取消" + exit 0 + fi +fi + +stop_containers() { + if ! command -v docker >/dev/null 2>&1; then + warn "未检测到 Docker,跳过容器停止" + return + fi + if [ ! -f "${INSTALL_DIR}/docker-compose.yml" ]; then + warn "未找到 docker-compose.yml,跳过容器停止" + return + fi + log "停止并删除容器..." + (cd "${INSTALL_DIR}" && docker compose down -v --rmi local 2>/dev/null) \ + || (cd "${INSTALL_DIR}" && docker compose down -v) \ + || warn "容器停止失败,将继续删除文件" +} + +remove_directory() { + log "删除安装目录 ${INSTALL_DIR} ..." + rm -rf "${INSTALL_DIR}" +} + +main() { + log "开始卸载云端浏览器..." + stop_containers + remove_directory + echo "" + echo "==========================================" + echo " 云端浏览器已卸载" + echo "==========================================" + echo " 如需重新安装:" + echo " git clone https://git.bz121.com/dekun/cloud-browser.git ${INSTALL_DIR}" + echo " bash ${INSTALL_DIR}/deploy.sh" + echo "==========================================" +} + +main "$@"