概述
图像代理(Image Proxy)服务是一个服务器端组件,用于获取并服务于 TinyMCE 编辑器的图像内容。该服务在主机基础设施内部署于本地环境,并为 图像编辑 插件提供后端功能。该服务仅检索图像内容;图像编辑在浏览器中执行,且该服务不解析媒体嵌入。
在本地环境运行图像代理服务的唯一要求是具备容器运行时或编排工具,例如 Docker、Kubernetes 或 Podman。
访问 Tiny Cloud Docker 仓库并拉取 Docker 镜像需要有效的访问令牌。请联系 Tiny 支持团队 申请访问令牌。
将此 Docker 镜像推送到公共容器存储库违反了 Tiny Self-Hosted 软件许可协议,包括:
需求
已安装并正在运行 Docker Engine。
用户拥有管理员或 Root 用户权限以运行 Docker 命令。
用户需满足以下条件之一:
使用类 Unix 操作系统,例如 Linux 或 macOS。
使用 Windows 并通过 Git for Windows、Cygwin 或 Windows 子系统 for Linux 访问 Unix 命令行工具。
安装
从 Tiny Cloud Docker 仓库获取本地服务镜像时必须拥有有效的访问令牌。联系 Tiny 支持团队 申请访问令牌。
获取 Docker 镜像
登录 Tiny Cloud Docker 仓库:
docker login -u tiny -p [access-token] registry.containers.tiny.cloud
从 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 设置以配置和运行服务。
创建
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。运行服务(在放置
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/
后续步骤
通过 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" }。在 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" });