概述

图像代理(Image Proxy)服务是一个服务器端组件,用于获取并服务于 TinyMCE 编辑器的图像内容。该服务在主机基础设施内部署于本地环境,并为 图像编辑 插件提供后端功能。该服务仅检索图像内容;图像编辑在浏览器中执行,且该服务不解析媒体嵌入。

在本地环境运行图像代理服务的唯一要求是具备容器运行时或编排工具,例如 Docker、Kubernetes 或 Podman。

访问 Tiny Cloud Docker 仓库并拉取 Docker 镜像需要有效的访问令牌。请联系 Tiny 支持团队 申请访问令牌。

将此 Docker 镜像推送到公共容器存储库违反了 Tiny Self-Hosted 软件许可协议,包括:

需求

  • 已安装并正在运行 Docker Engine。

  • 用户拥有管理员或 Root 用户权限以运行 Docker 命令。

  • 用户需满足以下条件之一:

安装

从 Tiny Cloud Docker 仓库获取本地服务镜像时必须拥有有效的访问令牌。联系 Tiny 支持团队 申请访问令牌。

获取 Docker 镜像

  1. 登录 Tiny Cloud Docker 仓库:

    docker login -u tiny -p [access-token] registry.containers.tiny.cloud
  2. 从 Docker 仓库拉取 Docker 镜像:

    docker pull registry.containers.tiny.cloud/image-proxy-tiny:<VERSION>

    将 <VERSION> 替换为 latest 或特定版本号。

目前,Docker 镜像仅在 x86-64(也称为 AMD64)架构处理器上得到支持。=== 指定配置

完成上述步骤后,从拉取的镜像运行 Docker 容器:

docker run -p 19040:19040 registry.containers.tiny.cloud/image-proxy-tiny:<VERSION>

此命令触发 -p 19040:19040,将服务暴露在 localhost:19040。服务在 Docker 容器内运行于端口 19040,并将其映射到本地主机的相同端口。

如果设置正确,日志应显示类似以下内容的输出:

2025-09-22 00:04:26 [io-compute-8] INFO  emissary - emissary
...
2025-09-22 00:04:26 [io-compute-blocker-8] INFO  emissary - -> Raw Config assembled from various sources: ConfigOrigin(merge of /app/application.conf: 1,system properties,reference.conf @ jar:file:/app/emissary.jar!/reference.conf: 1)
2025-09-22 00:04:26 [io-compute-blocker-8] WARN  c.e.d.config.AllowedOriginsConfig$ - No allowed-origins specified in config!
2025-09-22 00:04:26 [io-compute-blocker-8] INFO  emissary - emissary config loaded successfully: EmissaryConfig(SdkHttpConfig(HttpConfig(100,10,10,3,HttpConfigTimeouts(10,10,10),JvmTrustModel()),None),OriginWhitelist(List(),OriginPrecision(true)),Some(10000000))
2025-09-22 00:04:27 [io-compute-7] INFO  o.h.b.c.nio1.NIO1SocketServerGroup - Service bound to address /[0:0:0:0:0:0:0:0]:19040
2025-09-22 00:04:27 [io-compute-7] INFO  o.h.blaze.server.BlazeServerBuilder -
  _   _   _        _ _
 | |_| |_| |_ _ __| | | ___
 | ' \  _|  _| '_ \_  _(_-<
 |_||_\__|\__| .__/ |_|/__/
             |_|
2025-09-22 00:04:27 [io-compute-7] INFO  o.h.blaze.server.BlazeServerBuilder - http4s v0.23.27 on blaze v0.23.16 started at http://[::]:19040/

运行此命令将生成关于未配置 allowed-origins 的日志警告。这是预期的行为,因为将在下一步中进行设置。

TinyMCE 服务器端组件需要一个配置文件才能正常运行。按照惯例,该文件名为 application.conf。更多信息,请参阅 服务器端组件所需配置。

此配置文件至少需要包含以下信息:

  • allowed-origins - 指定允许与服务器端编辑器功能通信的域名。这对于所有服务器端组件都是强制要求的。

以下针对高级服务器端组件的设置是可选的,并将适用于所有使用该配置文件发出 HTTP/HTTPS 请求的服务。

以下针对图像代理服务的高级服务器端组件的设置是可选的:

运行 Docker 容器

Docker 容器也可以使用 docker compose 运行。在此示例中,假设目录结构如下:

tiny-image-proxy/
└── docker-compose.yaml     # 用于定义和运行服务的 Docker Compose 文件
└── application.conf        # 用于允许的源和其他设置的配置文件

以下是具有基本配置的 application.conf 文件示例:

ephox {
  allowed-origins {
    origins = [
      "http://example.com",
      "http://good.com",
      "*.my.company.org"
    ]
  }
}

准备好应用程序配置文件后,请继续进行 Docker Compose 设置以配置和运行服务。

  1. 创建 docker-compose.yaml 文件:

    services:
      image-proxy-tiny:
        image: registry.containers.tiny.cloud/image-proxy-tiny:[version]
        ports:
          - "19040:19040"
        restart: always
        init: true
        volumes:
          - type: bind
            source: ./application.conf #更改为本地机器上的路径
            # 如果使用低于 2.111.12 的版本,请使用以下目标路径。
            # target: /ephox-image-proxy/ephox-image-proxy-docker-env.conf
            target: /app/application.conf
            read_only: true
    从版本 2.111.12 开始,volumes 选项中的 target 路径必须指向 /app/application.conf。
  2. 运行服务(在放置 docker-compose.yaml 的同一目录中):

    docker compose up

    如果设置正确,初始化日志应显示如下:

     ✔ Container image-proxy-tiny-image-proxy-tiny-1                                                                                                                         已创建0.2s
    Attaching to image-proxy-tiny-1
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-9] INFO  emissary - emissary
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-9] INFO  emissary - * 外部配置
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-9] INFO  emissary -   * 通过系统属性进行外部配置
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -     * parseConfigSources
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -       * 查找属性:ephox.config.url
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -         -> 未设置属性
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -       * 查找属性:config.url
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -         -> 未设置属性
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -     * parseConfigSources
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -       * 查找属性:ephox.config.file
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -         -> 找到属性值:/app/application.conf
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -       * 解析由 /app/application.conf (来自属性 ephox.config.file) 定义的配置
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -         -> 处理文件:/app/application.conf
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -   * 外部 application.conf => /opt/ephox/application.conf
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -     * 可选文件 (/opt/ephox/application.conf)。如果未找到文件,默认为空
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary - * 内部配置
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -   -> 未指定额外的内部配置 - 跳过
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary - * 默认(参考)配置
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary -   * 从类路径加载配置文件 (reference.conf 和 integration.conf)。两者均非必需。
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary - -> 原始配置由各种来源组装而成:ConfigOrigin(合并 /app/application.conf: 1,系统属性,reference.conf @ jar:file:/app/emissary.jar!/reference.conf: 1)
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  c.e.d.config.AllowedOriginsConfig$ - 读取 allowed-origins 配置 (忽略端口 = true),内容为:
    image-proxy-tiny-1  |  - localhost:8000
    image-proxy-tiny-1  |  - example.com
    image-proxy-tiny-1  |  - good.com
    image-proxy-tiny-1  |  - my.company.org
    image-proxy-tiny-1  | 2025-09-22 00:14:39 [io-compute-blocker-9] INFO  emissary - emissary config loaded successfully: EmissaryConfig(SdkHttpConfig(HttpConfig(100,10,10,3,HttpConfigTimeouts(10,10,10),JvmTrustModel()),None),OriginWhitelist(List(localhost:8000, example.com, good.com, my.company.org),OriginPrecision(true)),Some(10000000))
    image-proxy-tiny-1  | 2025-09-22 00:14:40 [io-compute-2] INFO  o.h.b.c.nio1.NIO1SocketServerGroup - 服务绑定到地址 /[0:0:0:0:0:0:0:0]:19040
    image-proxy-tiny-1  | 2025-09-22 00:14:40 [io-compute-2] INFO  o.h.blaze.server.BlazeServerBuilder -
    image-proxy-tiny-1  |   _   _   _        _ _
    image-proxy-tiny-1  |  | |_| |_| |_ _ __| | | ___
    image-proxy-tiny-1  |  | ' \  _|  _| '_ \_  _(_<
    image-proxy-tiny-1  |  |_||_\__|\__| .__/ |_|/__/
    image-proxy-tiny-1  |              |_|
    image-proxy-tiny-1  | 2025-09-22 00:14:40 [io-compute-2] INFO  o.h.blaze.server.BlazeServerBuilder - http4s v0.23.27 on blaze v0.23.16 started at http://[::]:19040/

后续步骤

  1. 通过 cURL 命令测试服务

    为了验证 Image Proxy 服务已在容器内正确设置并正常运行,请确保服务运行在端口 19040 上。一旦激活,它应准备好接收请求。以下预期输出确认了正确的配置,假设 http://good.com 在允许的源列表中而 http://bad.com 不在。

    检查服务是否正在运行的命令:

    curl http://localhost:19040/version

    示例输出为:2.111.1

    确认请求已发送至 Image Proxy 服务的命令:

    curl --location 'http://localhost:19040/2/image?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsrikomm%2FBMP-EDITING%2Frefs%2Fheads%2Fmaster%2Fsrc%2FInputs%2Ffish.bmp' \
    --header 'Origin: http://good.com'

    最后,验证请求是否因未经授权且源自错误的源而被拒绝的命令:

    curl --location 'http://localhost:19040/2/image?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsrikomm%2FBMP-EDITING%2Frefs%2Fheads%2Fmaster%2Fsrc%2FInputs%2Ffish.bmp' \
    --header 'Origin: http://bad.com'

    如果出现错误,预期的消息是:{ "message": "The supplied authentication is not authorized to access this resource" }。

  2. 在 TinyMCE 中直接测试

    在部署之前,建议在 TinyMCE 编辑器本身内测试此服务。

    为此,请在编辑器中配置 图像编辑 功能并通过 tinymce.init 调用它。如果在本地默认端口 19040 上运行,请使用以下设置:

    tinymce.init({
      selector: 'textarea',  // change this value according to your HTML
      toolbar: 'image',
      plugins: 'image editimage',
      editimage_cors_hosts: [ 'example.com', 'good.com' ],
      editimage_proxy_service_url: "http://localhost:19040"
    });