guide升级 Docker 安装

我们每 6 周发布一个新的协作服务器本地部署版本。它包含新功能、错误修复和安全更新。一些新的 CKEditor 5 功能可能与较旧版本的协作服务器本地部署不兼容。出于这些原因,**强烈建议您将协作服务器本地部署服务器保持最新**。

使用 Docker 容器极大地简化了协作服务器本地部署版本升级过程。升级过程可能因所使用的部署工具和平台而异。请参考以下步骤以了解正确的操作顺序。

如果可能,您应该首先尝试使用生产数据的副本升级协作服务器本地部署的非生产实例。

所有重要更改都已添加到协作服务器本地部署的 变更日志 中。您可以在 CKEditor 生态系统客户仪表板 中找到它。

# 快速升级到新版本

此处描述的方法需要将协作服务器升级到 4.14.0 或更高版本。如果您计划升级到旧版本,请按照 零停机时间 方法操作。

如果您能够接受协作服务器本地部署的临时停机,建议您使用此方法。此方法的优点是升级时间更快,因为您可以比 零停机时间 方法更快地从非常旧的版本升级。此方法的缺点是,我们建议在升级期间禁用协作服务器本地部署。在使用此方法升级期间对协作服务器本地部署进行操作会导致数据不一致或应用程序错误的风险。

  1. **备份您的数据库** - 这将确保在升级后出现任何问题时,您可以恢复数据库并回滚到以前使用的协作服务器本地部署版本。
  2. 停止所有协作服务器本地部署服务器实例。
  3. 使用最新的可用版本运行协作服务器本地部署服务器的新实例。
  4. 验证协作服务器本地部署服务器是否已启动并正在运行。

# 零停机时间升级到新版本

在协作服务器本地部署服务无法接受任何停机时间的场合使用此方法。此方法的缺点是更新时间更长。如果您计划迁移到 4.13.0 或更旧版本的协作服务器,也建议您使用此方法。该方法基于蓝绿部署方法,可以轻松引入到基于 Kubernetes 的解决方案或专门服务(例如 AWS ECS)。

  1. 配置您的基础架构,使其仅将所有流量代理到正常的协作服务器本地部署实例。配置可以依赖于 /health 端点的结果。
  2. **备份您的数据库** - 这将确保在升级后出现任何问题时,您可以恢复数据库并回滚到以前使用的协作服务器本地部署版本。在每次升级后备份您的 DB 将允许您仅回滚一个次要版本,以防某些升级出现问题。
  3. 在当前运行的应用程序旁边,使用更高的次要版本启动协作服务器本地部署服务器 - **升级时不应跳过任何次要版本**。例如,如果您当前运行的是 3.12 版本的协作服务器本地部署,并且您希望将其升级到最新版本,您应该先升级到 v3.13 版本。在该实例正常运行之前,不应将流量代理到该实例。
  4. 一旦新的协作服务器本地部署容器启动并运行(/health 端点返回正确状态),请禁用流量并停止旧版本的协作服务器本地部署容器。
  5. 重复步骤 2、3 和 4,直到您运行所需的版本的协作服务器本地部署。

# 仅迁移模式

MIGRATE_ONLY 环境变量允许您将升级协作服务器本地部署与升级数据库结构分开。一旦该变量的值设置为 true,该容器将在数据库迁移完成后停止。这将允许您通过在 MIGRATE_ONLY 模式下禁用容器的运行状况检查并仅为使用已迁移数据库的实际应用程序容器重新启用运行状况检查来提高可观察性。由于从非常旧的版本迁移可能需要一些时间,尤其是当您的数据库很大时,应用程序可能在所需超时时间内无法使用,这可能会导致运行状况检查失败。将迁移与应用程序启动分开可以防止上述情况发生。MIGRATE_ONLY 环境变量适用于 4.15.0 或更高版本的协作服务器本地部署。

# 用于分离迁移过程的示例容器配置 - Docker Compose

version: "2.2"
  services:
    mysql-database:
      image: mysql:8.0.34
      platform: linux/amd64
      environment:
        MYSQL_ROOT_PASSWORD: password
      volumes:
        - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
      healthcheck: # Define healthcheck to be able to use the `service_healthy` condition.
        test: ["CMD-SHELL", "exit | mysql -h localhost -P 3306 -u root -p$$MYSQL_ROOT_PASSWORD" ]
        interval: 10s
        timeout: 30s
        retries: 5
    redis:
      image: redis:6.2.7
    ckeditor-cs-migrator:
      image: docker.cke-cs.com/cs:[version]
      depends_on:
        redis:
          condition: service_started
        mysql-database:
          condition: service_healthy # Make sure your database is ready for migration.
      restart: "no" # Migrator should NOT restart when migration is done.
      init: "true"
      environment:
        MIGRATE_ONLY: "true"
        DATABASE_HOST: mysql-database
        DATABASE_USER: root
        DATABASE_PASSWORD: password
        REDIS_HOST: redis
        ENVIRONMENTS_MANAGEMENT_SECRET_KEY: secret
        LICENSE_KEY: your_license_key
        STORAGE_DRIVER: filesystem
        STORAGE_LOCATION: /var/cs/easyimage
        LOG_LEVEL: 30
      volumes:
        - ~/easyimage_files:/var/cs/easyimage
    ckeditor-cs:
      image: docker.cke-cs.com/cs:[version]
      depends_on:
        redis:
          condition: service_started
        mysql-database:
          condition: service_healthy
        ckeditor-cs-migrator:
          condition: service_completed_successfully
      ports:
        - "8000:8000"
      restart: always
      init: "true"
      environment:
        DATABASE_HOST: mysql-database
        DATABASE_USER: root
        DATABASE_PASSWORD: password
        REDIS_HOST: redis
        ENVIRONMENTS_MANAGEMENT_SECRET_KEY: secret
        LICENSE_KEY: your_license_key
        STORAGE_DRIVER: filesystem
        STORAGE_LOCATION: /var/cs/easyimage
      volumes:
        - ~/easyimage_files:/var/cs/easyimage

# 用于分离迁移过程的示例容器配置 - AWS ECS

对于 AWS ECS,您可以使用 dependsOn 设置来确保正确的容器启动顺序

ckeditor_cs_container_definition = {
    name              = "ckeditor_cs"
    image             = local.docker_image
    essential         = true
    environment       = local.environment_variables
    dependsOn = [
      {
        containerName = "${local.service_name}-migrator",
        condition     = "SUCCESS"
      }
    ]
    // The rest of container definition
  }
  ckeditor_cs_migrator_container_definition = {
    name         = "${local.ckeditor_cs_container_definition.name}-migrator"
    image        = local.ckeditor_cs_container_definition.image
    essential    = false
    healthCheck  = null
    environment  = concat(
      local.ckeditor_cs_container_definition.environment,
      [
        {
          name  = "MIGRATE_ONLY",
          value = "true"
        }
      ]
    )
    // The rest of container definition
  }

确保 ckeditor_cs_migrator_container_definitionhealthCheck 参数设置为 null。在 MIGRATE_ONLY 模式下的容器不会公开任何 HTTP 端点,对于较大的数据库,运行时间可能很长。