From bb8a646de7231e6803f1b227590522fc0a637163 Mon Sep 17 00:00:00 2001 From: MengMengCode <227010654+MengMengCode@users.noreply.github.com> Date: Fri, 5 Jun 2026 20:12:36 +0800 Subject: [PATCH] Make uninstall remove all CLICD data --- README.md | 39 ++---------------------- backend/internal/cli/cli.go | 43 +++++++++++--------------- install.sh | 61 ++++++++++--------------------------- 3 files changed, 35 insertions(+), 108 deletions(-) diff --git a/README.md b/README.md index c0bd0d0..16bdf60 100644 --- a/README.md +++ b/README.md @@ -37,53 +37,18 @@ CLICD 是一个面向 LXC 的轻量容器管理面板,提供 Web 控制台、C ## 安装 -推荐使用最新 Release 一键安装。在目标服务器上执行: +一键安装: ```bash curl -fsSL https://raw.githubusercontent.com/MengMengCode/CLICD/main/install.sh | sudo sh ``` -也可以下载 GitHub Actions 构建出的 Release 产物 `clicd-linux-amd64.tar.gz` 后手动安装: - -```bash -tar -xzf clicd-linux-amd64.tar.gz -cd clicd-linux-amd64 -sudo ./install.sh -``` - -安装完成后访问: - -```text -http://YOUR_SERVER_IP:8999 -``` - -首次启动时会自动初始化管理员账号: - -```text -Username: admin -Password: 随机 16 位密码 -``` - -安装脚本会尝试从 systemd 日志中输出初始账号密码。如果机器上已经存在 `/root/.clicd/config.json`,则不会重新生成密码。 - -查看初始密码日志: - -```bash -journalctl -u clicd --no-pager -n 80 | grep -E "Username:|Password:" -``` - -卸载 CLICD: +一键卸载: ```bash curl -fsSL https://raw.githubusercontent.com/MengMengCode/CLICD/main/install.sh | sudo sh -s -- uninstall ``` -默认只删除 CLICD 服务和 `/usr/local/bin/clicd`,保留 `/root/.clicd` 配置数据和 `/var/lib/lxc` 容器。需要同时删除配置数据时: - -```bash -curl -fsSL https://raw.githubusercontent.com/MengMengCode/CLICD/main/install.sh | sudo sh -s -- uninstall --purge-data -``` - ![alt text](/img/image.png) ![alt text](/img/image-1.png) ![alt text](/img/image-2.png) diff --git a/backend/internal/cli/cli.go b/backend/internal/cli/cli.go index f74c7db..5dcbdaf 100644 --- a/backend/internal/cli/cli.go +++ b/backend/internal/cli/cli.go @@ -354,7 +354,7 @@ func cliImportExistingContainers() { func cliUninstall(reader *bufio.Reader) { fmt.Println("\n--- Uninstall CLICD ---") fmt.Println("This removes the CLICD service and /usr/local/bin/clicd.") - fmt.Println("LXC containers and /root/.clicd are kept unless you explicitly choose to delete them.") + fmt.Println("This also deletes /root/.clicd, all LXC containers under /var/lib/lxc, and LXC image cache under /var/cache/lxc.") if os.Geteuid() != 0 { fmt.Println("Uninstall must be run as root.") @@ -368,47 +368,38 @@ func cliUninstall(reader *bufio.Reader) { return } - removeData := strings.ToLower(promptString(reader, "Delete /root/.clicd config/data? Type delete-data", "no")) == "delete-data" - removeContainers := strings.ToLower(promptString(reader, "Destroy CLICD-managed LXC containers? Type delete-containers", "no")) == "delete-containers" - - if removeContainers { - destroyManagedContainers() - } - + destroyAllLXCContainers() stopAndRemoveService() removePath("/usr/local/bin/clicd") removePath("/etc/sysctl.d/99-clicd.conf") removePath("/var/log/clicd.log") removePath("/var/log/clicd.err") - - if removeData { - removePath("/root/.clicd") - } + removePath("/root/.clicd") + removePath("/var/lib/lxc") + removePath("/var/cache/lxc") reloadSysctl() fmt.Println() fmt.Println("CLICD has been uninstalled.") - if !removeData { - fmt.Println("Kept data: /root/.clicd") - } - if !removeContainers { - fmt.Println("Kept LXC containers under /var/lib/lxc") - } + fmt.Println("Removed service, binary, config, containers, and LXC image cache.") } -func destroyManagedContainers() { - containers := append([]config.Container(nil), config.AppConfig.Containers...) - if len(containers) == 0 { - fmt.Println("No CLICD-managed containers found in config.") +func destroyAllLXCContainers() { + entries, err := os.ReadDir("/var/lib/lxc") + if err != nil { return } - for _, c := range containers { - fmt.Printf("Destroying container %s...\n", c.Name) - if err := manager.DestroyContainer(c.ID); err != nil { - fmt.Printf("Failed to destroy %s: %v\n", c.Name, err) + for _, entry := range entries { + if !entry.IsDir() { + continue } + name := entry.Name() + fmt.Printf("Destroying LXC container %s...\n", name) + runQuiet("lxc-stop", "-n", name, "-k") + runQuiet("lxc-destroy", "-n", name, "-f") + removePath("/var/lib/lxc/" + name) } } diff --git a/install.sh b/install.sh index 3337979..38f2f87 100644 --- a/install.sh +++ b/install.sh @@ -50,7 +50,7 @@ usage() { cat << EOF Usage: ./install.sh - ./install.sh uninstall [--purge-data] [--delete-containers] + ./install.sh uninstall Environment: CLICD_REPO=owner/repo @@ -72,29 +72,6 @@ remove_path() { } uninstall_clicd() { - purge_data=0 - delete_containers=0 - - shift || true - while [ "$#" -gt 0 ]; do - case "$1" in - --purge-data) - purge_data=1 - ;; - --delete-containers) - delete_containers=1 - ;; - -h|--help) - usage - exit 0 - ;; - *) - die "Unknown uninstall option: $1" - ;; - esac - shift - done - log "Uninstalling CLICD..." if has_cmd systemctl; then @@ -109,16 +86,18 @@ uninstall_clicd() { rc-update del clicd default >/dev/null 2>&1 || true fi - if [ "$delete_containers" -eq 1 ]; then - log "Destroying CLICD-style LXC containers named ct-*..." - for container_dir in /var/lib/lxc/ct-*; do - [ -d "$container_dir" ] || continue - container_name="$(basename "$container_dir")" + log "Destroying LXC containers under /var/lib/lxc..." + for container_dir in /var/lib/lxc/*; do + [ -d "$container_dir" ] || continue + container_name="$(basename "$container_dir")" + if has_cmd lxc-stop; then lxc-stop -n "$container_name" -k >/dev/null 2>&1 || true + fi + if has_cmd lxc-destroy; then lxc-destroy -n "$container_name" -f >/dev/null 2>&1 || true - remove_path "$container_dir" - done - fi + fi + remove_path "$container_dir" + done remove_path /etc/systemd/system/clicd.service remove_path /etc/init.d/clicd @@ -126,10 +105,9 @@ uninstall_clicd() { remove_path /etc/sysctl.d/99-clicd.conf remove_path /var/log/clicd.log remove_path /var/log/clicd.err - - if [ "$purge_data" -eq 1 ]; then - remove_path /root/.clicd - fi + remove_path /root/.clicd + remove_path /var/lib/lxc + remove_path /var/cache/lxc if has_cmd systemctl; then systemctl daemon-reload >/dev/null 2>&1 || true @@ -143,14 +121,7 @@ uninstall_clicd() { echo "=====================================" echo " CLICD Uninstalled" echo "=====================================" - if [ "$purge_data" -eq 0 ]; then - echo " Kept data: /root/.clicd" - fi - if [ "$delete_containers" -eq 0 ]; then - echo " Kept LXC containers: /var/lib/lxc" - echo " To delete CLICD-style ct-* containers too:" - echo " ./install.sh uninstall --delete-containers" - fi + echo " Removed service, binary, config, containers, and LXC image cache." echo "=====================================" } @@ -158,7 +129,7 @@ case "$ACTION" in install|"") ;; uninstall|remove) - uninstall_clicd "$@" + uninstall_clicd exit 0 ;; -h|--help|help)