跳转至

升级

从 1.6.X 升级

步骤

Docker

  1. 备份数据库

    • 在进行数据库升级之前,请确保对数据库的当前状态进行完整备份。
    • 使用适当的工具备份整个数据库,包括数据、模式和配置。
    docker exec -it -e BACKUP_DIRECTORY=/path/to/backup/directory <scheduler_container> bwcli plugin backup save
    
    docker cp <scheduler_container>:/path/to/backup/directory /path/to/backup/directory
    
  2. 升级 BunkerWeb

    • 将 BunkerWeb 升级到最新版本。

      1. 更新 Docker Compose 文件:更新 Docker Compose 文件以使用新版本的 BunkerWeb 镜像。

        services:
            bunkerweb:
                image: bunkerity/bunkerweb:testing
                ...
            bw-scheduler:
                image: bunkerity/bunkerweb-scheduler:testing
                ...
            bw-autoconf:
                image: bunkerity/bunkerweb-autoconf:testing
                ...
            bw-ui:
                image: bunkerity/bunkerweb-ui:testing
                ...
        

      2. 重启容器:重启容器以应用更改。

        docker compose down
        docker compose up -d
        

  3. 检查日志:检查调度器服务的日志以确保迁移成功。

    docker compose logs <scheduler_container>
    
  4. 验证数据库:通过检查新数据库容器中的数据和配置来验证数据库升级是否成功。

Linux

  • 快速开始

    要开始使用,请下载安装脚本及其校验和,然后在运行前验证脚本的完整性。

    LATEST_VERSION=$(curl -s https://api.github.com/repos/bunkerity/bunkerweb/releases/latest | jq -r .tag_name)
    
    # 下载脚本及其校验和
    wget https://github.com/bunkerity/bunkerweb/releases/download/${LATEST_VERSION}/install-bunkerweb.sh
    wget https://github.com/bunkerity/bunkerweb/releases/download/${LATEST_VERSION}/install-bunkerweb.sh.sha256
    
    # 验证校验和
    sha256sum -c install-bunkerweb.sh.sha256
    
    # 如果检查成功,则运行脚本
    chmod +x install-bunkerweb.sh
    sudo ./install-bunkerweb.sh
    

    安全提示

    在运行安装脚本之前,请务必验证其完整性。

    下载校验和文件,并使用像 sha256sum 这样的工具来确认脚本没有被更改或篡改。

    如果校验和验证失败,请不要执行该脚本——它可能不安全。

  • 工作原理

    用于全新安装的多功能安装脚本也可以执行原地升级。当它检测到现有安装和不同的目标版本时,它会切换到升级模式并应用以下工作流程:

    1. 检测与验证
      • 检测操作系统/版本并确认支持矩阵。
      • /usr/share/bunkerweb/VERSION 读取当前安装的 BunkerWeb 版本。
    2. 升级场景决策
      • 如果请求的版本与已安装的版本相同,则中止(除非您明确重新运行以获取状态)。
      • 如果版本不同,则标记为升级。
    3. (可选)自动升级前备份
      • 如果 bwcli 和调度器可用且启用了自动备份,它会通过内置的备份插件创建一个备份。
      • 目的地:您使用 --backup-dir 提供的目录或生成的路径,如 /var/tmp/bunkerweb-backup-YYYYmmdd-HHMMSS
      • 您可以使用 --no-auto-backup 禁用此功能(然后手动备份就成了您的责任)。
    4. 服务静默
      • 停止 bunkerwebbunkerweb-uibunkerweb-scheduler 以确保一致的升级(与手动过程建议相符)。
    5. 移除软件包锁定
      • 临时移除 bunkerwebnginx 上的 apt-mark hold / dnf versionlock,以便可以安装目标版本。
    6. 执行升级
      • 仅安装新的 BunkerWeb 软件包版本(在升级模式下,除非 NGINX 缺失,否则不会重新安装——这避免了触及正确固定的 NGINX)。
      • 重新应用锁定/版本锁定以冻结升级后的版本。
    7. 完成与状态
      • 显示核心服务的 systemd 状态和后续步骤。
      • 保留您的配置和数据库不变——只更新应用程序代码和受管理的文件。

    关键行为/说明:

    • 该脚本不会修改您的 /etc/bunkerweb/variables.env 或数据库内容。
    • 如果自动备份失败(或被禁用),您仍然可以使用下面的回滚部分进行手动恢复。
    • 升级模式有意避免在已存在的受支持固定版本之外重新安装或降级 NGINX。
    • 用于故障排除的日志保留在 /var/log/bunkerweb/ 中。

    回滚摘要:

    • 使用生成的备份目录(或您的手动备份)+ 回滚部分中的步骤来恢复数据库,然后重新安装以前的镜像/软件包版本并重新锁定软件包。
  • 命令行选项

    您可以使用与安装相同的标志来驱动无人值守升级。与升级最相关的选项:

    选项 目的
    -v, --version <X.Y.Z> 要升级到的目标 BunkerWeb 版本。
    -y, --yes 非交互式(假定升级确认并启用自动备份,除非使用 --no-auto-backup)。
    --backup-dir <PATH> 自动升级前备份的目的地。如果不存在则创建。
    --no-auto-backup 跳过自动备份(不推荐)。您必须有手动备份。
    -q, --quiet 抑制输出(与日志记录/监控结合使用)。
    -f, --force 在不受支持的操作系统版本上继续。
    --dry-run 显示检测到的环境、预期的操作,然后退出而不做任何更改。

    示例:

    # 交互式升级到 testing(会提示备份)
    sudo ./install-bunkerweb.sh --version testing
    
    # 使用自动备份到自定义目录的非交互式升级
    sudo ./install-bunkerweb.sh -v testing --backup-dir /var/backups/bw-2025-01 -y
    
    # 静默无人值守升级(抑制日志)– 依赖默认的自动备份
    sudo ./install-bunkerweb.sh -v testing -y -q
    
    # 执行一次空运行(计划)而不应用更改
    sudo ./install-bunkerweb.sh -v testing --dry-run
    
    # 跳过自动备份进行升级(不推荐)
    sudo ./install-bunkerweb.sh -v testing --no-auto-backup -y
    

    跳过备份

    使用 --no-auto-backup 而没有经过验证的手动备份,可能会在升级遇到问题时导致不可逆转的数据丢失。请始终保留至少一个最近的、经过测试的备份。

  1. 备份数据库

    • 在进行数据库升级之前,请确保对数据库的当前状态进行完整备份。
    • 使用适当的工具备份整个数据库,包括数据、模式和配置。
    给红帽企业 Linux (RHEL) 8.10 用户的信息

    如果您正在使用 RHEL 8.10 并计划使用外部数据库,您需要安装 mysql-community-client 包以确保 mysqldump 命令可用。您可以通过执行以下命令来安装该包:

    1. 安装 MySQL 仓库配置包

      sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
      
    2. 启用 MySQL 仓库

      sudo dnf config-manager --enable mysql80-community
      
    3. 安装 MySQL 客户端

      sudo dnf install mysql-community-client
      
    1. 安装 PostgreSQL 仓库配置包

      dnf install "https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-$(uname -m)/pgdg-redhat-repo-latest.noarch.rpm"
      
    2. 安装 PostgreSQL 客户端

      dnf install postgresql<version>
      
    BACKUP_DIRECTORY=/path/to/backup/directory bwcli plugin backup save
    
  2. 升级 BunkerWeb

    • 将 BunkerWeb 升级到最新版本。

      1. 停止服务

        sudo systemctl stop bunkerweb
        sudo systemctl stop bunkerweb-ui
        sudo systemctl stop bunkerweb-scheduler
        

      2. 更新 BunkerWeb

        首先,如果您之前锁定了 BunkerWeb 软件包,请解锁它:

        您可以使用 apt-mark showhold 打印锁定的软件包列表

        sudo apt-mark unhold bunkerweb nginx
        

        然后,您可以更新 BunkerWeb 软件包:

        sudo apt update && \
        sudo apt install -y --allow-downgrades bunkerweb=testing
        

        为了防止在执行 apt upgrade 时升级 BunkerWeb 软件包,您可以使用以下命令:

        sudo apt-mark hold bunkerweb nginx
        

        更多详细信息请参阅Linux 集成页面

        首先,如果您之前锁定了 BunkerWeb 软件包,请解锁它:

        您可以使用 dnf versionlock list 打印锁定的软件包列表

        sudo dnf versionlock delete package bunkerweb && \
        sudo dnf versionlock delete package nginx
        

        然后,您可以更新 BunkerWeb 软件包:

        sudo dnf makecache && \
        sudo dnf install -y --allowerasing bunkerweb-testing
        

        为了防止在执行 dnf upgrade 时升级 BunkerWeb 软件包,您可以使用以下命令:

        sudo dnf versionlock add bunkerweb && \
        sudo dnf versionlock add nginx
        

        更多详细信息请参阅Linux 集成页面

      3. 启动服务

        sudo systemctl start bunkerweb
        sudo systemctl start bunkerweb-ui
        sudo systemctl start bunkerweb-scheduler
        
        或者重启系统:
        sudo reboot
        

  3. 检查日志:检查调度器服务的日志以确保迁移成功。

    journalctl -u bunkerweb --no-pager
    
  4. 验证数据库:通过检查新数据库容器中的数据和配置来验证数据库升级是否成功。

回滚

如果出现问题

如果您在升级过程中遇到任何问题,您可以通过恢复在步骤 1中创建的备份来回滚到数据库的先前版本。

获取支持和更多信息:

  1. 如果备份是 zip 文件,请先解压

    首先解压备份 zip 文件:

    unzip /path/to/backup/directory/backup.zip -d /path/to/backup/directory/
    
  2. 恢复备份

    1. 删除现有的数据库文件。

      docker exec -u 0 -i <scheduler_container> rm -f /var/lib/bunkerweb/db.sqlite3
      
    2. 恢复备份。

      docker exec -i <scheduler_container> sqlite3 /var/lib/bunkerweb/db.sqlite3 < /path/to/backup/directory/backup.sql
      
    3. 修复权限。

      docker exec -u 0 -i <scheduler_container> chown root:nginx /var/lib/bunkerweb/db.sqlite3
      docker exec -u 0 -i <scheduler_container> chmod 770 /var/lib/bunkerweb/db.sqlite3
      
    4. 停止堆栈。

      docker compose down
      
    1. 恢复备份。

      docker exec -e MYSQL_PWD=<your_password> -i <database_container> mysql -u <username> <database_name> < /path/to/backup/directory/backup.sql
      
    2. 停止堆栈。

      docker compose down
      
    1. 删除现有的数据库。

      docker exec -i <database_container> dropdb -U <username> --force <database_name>
      
    2. 重新创建数据库。

      docker exec -i <database_container> createdb -U <username> <database_name>
      
    3. 恢复备份。

      docker exec -i <database_container> psql -U <username> -d <database_name> < /path/to/backup/directory/backup.sql
      
    4. 停止堆栈。

      docker compose down
      
  3. 降级 BunkerWeb

    services:
        bunkerweb:
            image: bunkerity/bunkerweb:<old_version>
            ...
        bw-scheduler:
            image: bunkerity/bunkerweb-scheduler:<old_version>
            ...
        bw-autoconf:
            image: bunkerity/bunkerweb-autoconf:<old_version>
            ...
        bw-ui:
            image: bunkerity/bunkerweb-ui:<old_version>
            ...
    
  4. 启动容器

    docker compose up -d
    
  1. 如果备份是 zip 文件,请先解压

    首先解压备份 zip 文件:

    unzip /path/to/backup/directory/backup.zip -d /path/to/backup/directory/
    
  2. 停止服务

    sudo systemctl stop bunkerweb bunkerweb-ui bunkerweb-scheduler
    
  3. 恢复备份

    sudo rm -f /var/lib/bunkerweb/db.sqlite3
    sudo sqlite3 /var/lib/bunkerweb/db.sqlite3 < /path/to/backup/directory/backup.sql
    sudo chown root:nginx /var/lib/bunkerweb/db.sqlite3
    sudo chmod 770 /var/lib/bunkerweb/db.sqlite3
    
    mysql -u <username> -p <database_name> < /path/to/backup/directory/backup.sql
    
    1. 删除现有的数据库。

      dropdb -U <username> --force <database_name>
      
    2. 重新创建数据库。

      createdb -U <username> <database_name>
      
    3. 恢复备份。

      psql -U <username> -d <database_name> < /path/to/backup/directory/backup.sql
      
  4. 启动服务

    sudo systemctl start bunkerweb bunkerweb-ui bunkerweb-scheduler
    
  5. 降级 BunkerWeb

    • 按照Linux 集成页面中升级 BunkerWeb 的相同步骤,将 BunkerWeb 降级到以前的版本。

从 1.5.X 升级

有什么变化?

调度器

与 1.5.X 版本不同,调度器服务不再使用docker 套接字代理来获取 BunkerWeb 的实例。相反,它使用了新的 BUNKERWEB_INSTANCES 环境变量。

关于 BUNKERWEB_INSTANCES 环境变量

这个新变量是一个以空格分隔的 BunkerWeb 实例列表,格式如下:http://bunkerweb:5000 bunkerweb1:5000 bunkerweb2:5000 ...。然后调度器将使用此列表来获取实例的配置并将配置发送给它们。

  • http:// 前缀是可选的。
  • 端口是可选的,默认为 API_HTTP_PORT 环境变量的值。
  • BUNKERWEB_INSTANCES 环境变量的默认值是 127.0.0.1

换句话说,新系统是完全不可知和通用的:调度器负责管理一个 BunkerWeb 实例列表,并且不需要关心环境。

Autoconf/Kubernetes/Swarm 集成

如果您正在使用 AutoconfKubernetesSwarm 集成,您可以将 BUNKERWEB_INSTANCES 环境变量设置为空字符串(这样它就不会尝试将配置发送到默认的 127.0.0.1)。

实例将由控制器自动获取。您还可以向列表中添加自定义实例,这些实例可能不会被控制器选中。

1.6 版本起,调度器还拥有一个新的内置健康检查系统,它将检查实例的健康状况。如果一个实例变得不健康,调度器将停止向其发送配置。如果该实例恢复健康,调度器将再次开始向其发送配置。

BunkerWeb 容器

另一个重要的变化是,以前在 BunkerWeb 容器上声明的设置现在在调度器上声明。这意味着您必须将您的设置从 BunkerWeb 容器移动到调度器容器。

虽然设置现在在调度器容器上声明,但您仍然需要在 BunkerWeb 容器上声明与 API 相关的强制性设置,例如 API_WHITELIST_IP 设置,它用于将调度器的 IP 地址列入白名单,以便它可以将配置发送到实例。如果您使用 API_TOKEN,您还必须在 BunkerWeb 容器上设置它(并在调度器上镜像它)以允许经过身份验证的 API 调用。

BunkerWeb 的容器设置

您在 BunkerWeb 容器上声明的每个与 API 相关的设置都必须在调度器容器上镜像,以便它能继续工作,因为配置将被调度器生成的配置覆盖。

默认值和新设置

我们尽力不更改默认值,但我们添加了许多其他设置。强烈建议阅读文档的安全调整设置部分。

模板

我们添加了一个名为模板的新功能。模板提供了一种结构化和标准化的方法来定义设置和自定义配置,有关更多信息,请查看概念/模板部分。

Autoconf 命名空间

我们向自动配置集成添加了命名空间功能。命名空间允许您对实例进行分组,并仅对它们应用设置。根据您的集成,查看以下部分以获取更多信息:

步骤

  1. 备份数据库

    • 在进行数据库升级之前,请确保对数据库的当前状态进行完整备份。
    • 使用适当的工具备份整个数据库,包括数据、模式和配置。
    docker exec -it -e BACKUP_DIRECTORY=/path/to/backup/directory <scheduler_container> bwcli plugin backup save
    
    docker cp <scheduler_container>:/path/to/backup/directory /path/to/backup/directory
    
    给红帽企业 Linux (RHEL) 8.10 用户的信息

    如果您正在使用 RHEL 8.10 并计划使用外部数据库,您需要安装 mysql-community-client 包以确保 mysqldump 命令可用。您可以通过执行以下命令来安装该包:

    1. 安装 MySQL 仓库配置包

      sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
      
    2. 启用 MySQL 仓库

      sudo dnf config-manager --enable mysql80-community
      
    3. 安装 MySQL 客户端

      sudo dnf install mysql-community-client
      
    1. 安装 PostgreSQL 仓库配置包

      dnf install "https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-$(uname -m)/pgdg-redhat-repo-latest.noarch.rpm"
      
    2. 安装 PostgreSQL 客户端

      dnf install postgresql<version>
      
    BACKUP_DIRECTORY=/path/to/backup/directory bwcli plugin backup save
    

    我们首先需要在容器中安装 sqlite 包。

    docker exec -u 0 -it <scheduler_container> apk add sqlite
    

    然后,备份数据库。

    docker exec -it <scheduler_container> sqlite3 /var/lib/bunkerweb/db.sqlite3 ".dump" > /path/to/backup/directory/backup.sql
    
    sqlite3 /var/lib/bunkerweb/db.sqlite3 ".dump" > /path/to/backup/directory/backup.sql
    
    docker exec -it -e MYSQL_PWD=<database_password> <database_container> mariadb-dump -u <username> <database_name> > /path/to/backup/directory/backup.sql
    
    MYSQL_PWD=<database_password> mariadb-dump -u <username> <database_name> > /path/to/backup/directory/backup.sql
    
    docker exec -it -e MYSQL_PWD=<database_password> <database_container> mysqldump -u <username> <database_name> > /path/to/backup/directory/backup.sql
    
    MYSQL_PWD=<database_password> mysqldump -u <username> <database_name> > /path/to/backup/directory/backup.sql
    
    docker exec -it -e PGPASSWORD=<database_password> <database_container> pg_dump -U <username> -d <database_name> > /path/to/backup/directory/backup.sql
    
    PGPASSWORD=<database_password> pg_dump -U <username> -d <database_name> > /path/to/backup/directory/backup.sql
    
  2. 升级 BunkerWeb

    • 将 BunkerWeb 升级到最新版本。

      1. 更新 Docker Compose 文件:更新 Docker Compose 文件以使用新版本的 BunkerWeb 镜像。

        services:
            bunkerweb:
                image: bunkerity/bunkerweb:testing
                ...
            bw-scheduler:
                image: bunkerity/bunkerweb-scheduler:testing
                ...
            bw-autoconf:
                image: bunkerity/bunkerweb-autoconf:testing
                ...
            bw-ui:
                image: bunkerity/bunkerweb-ui:testing
                ...
        

      2. 重启容器:重启容器以应用更改。

        docker compose down
        docker compose up -d
        

      1. 停止服务

        sudo systemctl stop bunkerweb
        sudo systemctl stop bunkerweb-ui
        sudo systemctl stop bunkerweb-scheduler
        

      2. 更新 BunkerWeb

        首先,如果您之前锁定了 BunkerWeb 软件包,请解锁它:

        您可以使用 apt-mark showhold 打印锁定的软件包列表

        sudo apt-mark unhold bunkerweb nginx
        

        然后,您可以更新 BunkerWeb 软件包:

        sudo apt update && \
        sudo apt install -y --allow-downgrades bunkerweb=testing
        

        为了防止在执行 apt upgrade 时升级 BunkerWeb 软件包,您可以使用以下命令:

        sudo apt-mark hold bunkerweb nginx
        

        更多详细信息请参阅Linux 集成页面

        首先,如果您之前锁定了 BunkerWeb 软件包,请解锁它:

        您可以使用 dnf versionlock list 打印锁定的软件包列表

        sudo dnf versionlock delete package bunkerweb && \
        sudo dnf versionlock delete package nginx
        

        然后,您可以更新 BunkerWeb 软件包:

        sudo dnf makecache && \
        sudo dnf install -y --allowerasing bunkerweb-testing
        

        为了防止在执行 dnf upgrade 时升级 BunkerWeb 软件包,您可以使用以下命令:

        sudo dnf versionlock add bunkerweb && \
        sudo dnf versionlock add nginx
        

        更多详细信息请参阅Linux 集成页面

      3. 启动服务

        sudo systemctl start bunkerweb
        sudo systemctl start bunkerweb-ui
        sudo systemctl start bunkerweb-scheduler
        
        或者重启系统:
        sudo reboot
        

  3. 检查日志:检查调度器服务的日志以确保迁移成功。

    docker compose logs <scheduler_container>
    
    journalctl -u bunkerweb --no-pager
    
  4. 验证数据库:通过检查新数据库容器中的数据和配置来验证数据库升级是否成功。

回滚

如果出现问题

如果您在升级过程中遇到任何问题,您可以通过恢复在步骤 1中创建的备份来回滚到数据库的先前版本。

获取支持和更多信息:

  1. 如果备份是 zip 文件,请先解压

    首先解压备份 zip 文件:

    unzip /path/to/backup/directory/backup.zip -d /path/to/backup/directory/
    
  2. 恢复备份

    1. 删除现有的数据库文件。

      docker exec -u 0 -i <scheduler_container> rm -f /var/lib/bunkerweb/db.sqlite3
      
    2. 恢复备份。

      docker exec -i <scheduler_container> sqlite3 /var/lib/bunkerweb/db.sqlite3 < /path/to/backup/directory/backup.sql
      
    3. 修复权限。

      docker exec -u 0 -i <scheduler_container> chown root:nginx /var/lib/bunkerweb/db.sqlite3
      docker exec -u 0 -i <scheduler_container> chmod 770 /var/lib/bunkerweb/db.sqlite3
      
    4. 停止堆栈。

      docker compose down
      
    1. 恢复备份。

      docker exec -e MYSQL_PWD=<your_password> -i <database_container> mysql -u <username> <database_name> < /path/to/backup/directory/backup.sql
      
    2. 停止堆栈。

      docker compose down
      
    1. 删除现有的数据库。

      docker exec -i <database_container> dropdb -U <username> --force <database_name>
      
    2. 重新创建数据库。

      docker exec -i <database_container> createdb -U <username> <database_name>
      
    3. 恢复备份。

      docker exec -i <database_container> psql -U <username> -d <database_name> < /path/to/backup/directory/backup.sql
      
    4. 停止堆栈。

      docker compose down
      
  3. 降级 BunkerWeb

    services:
        bunkerweb:
            image: bunkerity/bunkerweb:<old_version>
            ...
        bw-scheduler:
            image: bunkerity/bunkerweb-scheduler:<old_version>
            ...
        bw-autoconf:
            image: bunkerity/bunkerweb-autoconf:<old_version>
            ...
        bw-ui:
            image: bunkerity/bunkerweb-ui:<old_version>
            ...
    
  4. 启动容器

    docker compose up -d
    
  1. 如果备份是 zip 文件,请先解压

    首先解压备份 zip 文件:

    unzip /path/to/backup/directory/backup.zip -d /path/to/backup/directory/
    
  2. 停止服务

    sudo systemctl stop bunkerweb bunkerweb-ui bunkerweb-scheduler
    
  3. 恢复备份

    sudo rm -f /var/lib/bunkerweb/db.sqlite3
    sudo sqlite3 /var/lib/bunkerweb/db.sqlite3 < /path/to/backup/directory/backup.sql
    sudo chown root:nginx /var/lib/bunkerweb/db.sqlite3
    sudo chmod 770 /var/lib/bunkerweb/db.sqlite3
    
    mysql -u <username> -p <database_name> < /path/to/backup/directory/backup.sql
    
    1. 删除现有的数据库。

      dropdb -U <username> --force <database_name>
      
    2. 重新创建数据库。

      createdb -U <username> <database_name>
      
    3. 恢复备份。

      psql -U <username> -d <database_name> < /path/to/backup/directory/backup.sql
      
  4. 启动服务

    sudo systemctl start bunkerweb bunkerweb-ui bunkerweb-scheduler
    
  5. 降级 BunkerWeb

    • 按照Linux 集成页面中升级 BunkerWeb 的相同步骤,将 BunkerWeb 降级到以前的版本。