
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
XELOS Worker是一个无状态Docker容器,用于处理XELOS系统发出的任务。基础容器基于PHP CLI镜像构建,集成OpenSwoole服务器和API控制器,通过HTTP调用进行任务处理。
php:*-cli基础镜像,并安装OpenSwooleno-new-privileges、权限丢弃等)适用于需要处理以下任务的Web环境,特别是作为XELOS系统的组成部分:
XELOS当前使用LibreOffice Worker、Video Worker和Image Worker作为系统工作器库的一部分。以下是在docker-compose.yml中配置这些工作器服务的说明:
LibreOffice Worker用于将办公文档转换为PDF格式,便于文档预览。
yamllibreoffice: image: docker.xuanyuan.run/xelos/xelos-worker:libreoffice restart: unless-stopped healthcheck: test: [ "CMD", "curl","-fk", "https://localhost:9501" ] timeout: 20s retries: 10 networks: - internal-network
Video Worker使用ffmpeg将视频转换为MP4格式,并可提取缩略图、字幕,适用于Web环境。
yamlvideo: image: docker.xuanyuan.run/xelos/xelos-worker:video restart: unless-stopped healthcheck: test: [ "CMD", "curl","-fk", "https://localhost:9501" ] timeout: 20s retries: 10 networks: - internal-network
Image Worker使用libvips进行图像转换和大小调整。
yamlimage: image: docker.xuanyuan.run/xelos/xelos-worker:image restart: unless-stopped healthcheck: test: [ "CMD", "curl","-fk", "https://localhost:9501" ] timeout: 20s retries: 10 networks: - internal-network
可在docker-compose.yml中添加以下高级选项以提升安全性和性能。使用视频工作器时,若使用tmpfs请确保有足够内存;也可使用卷或设置read_only: false。
yamlimage: ... security_opt: - no-new-privileges:true cap_drop: - ALL read_only: true tmpfs: - /tmp - /server/certs
建议在内部网络中运行工作器容器。LibreOffice在处理特制文档时可能尝试加载外部资源。
yamlnetworks: internal: driver: bridge internal: true
docker-compose.yml、Docker Swarm或K8S部署配置,包含所需的工作器容器yamlservices: info: image: docker.xuanyuan.run/xelos/xelos-worker:base-alpine restart: unless-stopped networks: - backend
从XELOS Web容器内测试Echo服务:
bashcurl -X 'POST' 'http://worker:9501/info/echo' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"Hello World"}'
每个工作器通常包含从环境读取的预定义设置,默认适用于其设计任务。如有需要,可修改以下环境变量:
| 变量 | 默认值 | 描述 |
|---|---|---|
| WORKER_THREAD_NUM | 5 | 单个容器中使用的工作线程数 |
| WORKER_PACKAGE_MAX_LENGTH_MB | 32 | 最大包长度(如文件上传大小) |
| WORKER_DEBUG | 0 | 启用调试模式以防止临时文件自动清理 |
| WORKER_DISABLE_SSL | 0 | 工作器默认使用SSL,设为1禁用 |
| WORKER_SSL_CERT_FILE | undefined | 自定义SSL/TLS证书(PEM格式)路径 |
| WORKER_SSL_KEY_FILE | undefined | 自定义SSL/TLS密钥(PEM格式)路径 |
| WORKER_SSL_VERIFYPEER | 0 | 使用回调时验证SSL/TLS连接 |
使用工作器服务容器的最佳方式是通过相应的Composer客户端。该依赖目前仅在私有Composer镜像中可用。更新composer.json以引用镜像:
json{ "repositories": [ { "type": "composer", "url": "https://repo.xelos.net/composer/", "canonical": false } ], "require": { "xelos-worker/php-clients": "*" } }
php<?php $sourceFile = '/tmp/myWord.docx'; $targetFile = '/tmp/myWordAsPDF.pdf'; (new \XELOSWorker\Client\Libreoffice('https://libreoffice:9501'))->convert($sourceFile, $targetFile);
php<?php $pathToVideoFile = '/tmp/myVideo.mov'; $pathToConvertedVideoFile = '/tmp/myVideo.mp4'; try { $videoWorker = (new \XELOSWorker\Client\Video('https://video:9501')); // 可选:检查支持的格式 // $videoWorker->getSupportedFileExtensions(); // 步骤1:上传视频到工作器 $fileInfo = $videoWorker->uploadVideoFile($pathToVideoFile); // 步骤2:生成预览缩略图 $previewImages = $videoWorker->generatePreviewImages(); foreach ($previewImages as $previewImage) { $thumbCount = \basename(\substr($previewImage['downloadFileId'], \strpos($previewImage['downloadFileId'], ':')+1)); $saveTargetFile = $destinationFolder.$thumbCount; $videoWorker->downloadFile($saveTargetFile, $previewImage['downloadFileId']); } // 步骤3:将视频编码为特定质量 $videoWorker->encodeVideo($quality = 'sd'); // 步骤4:从工作器下载编码后的视频 $videoWorker->downloadFile($pathToConvertedVideoFile, $fileInfo['fileId'].':sd'); } catch(Exception $exception){ // 错误处理 }
php<?php $pathToPDF = '/tmp/myWordAsPDF.pdf'; $imgFile = '/tmp/preview.png'; $resizedImgFile = '/tmp/preview-resized.png'; try { $imageWorker = (new \XELOSWorker\Client\Image('https://image:9501')); $imageWorker->pdfToImage($pathToPDF, $imgFile, $page = 0, $dpi = 300); $imageWorker->thumbnail($imgFile, $resizedImgFile, $width = 800, $height = 600, $crop = true); } catch (Exception $exception) { // 错误处理 }
容器在首次启动时会创建自签名证书,如未通过环境变量指定,将在以下位置检查公钥/私钥证书:
有关TLS实现的更多信息,请参阅OpenSwoole文档:[***]
本地挂载此仓库代码:
yamlservices: worker: image: docker.xuanyuan.run/xelos/xelos-worker:base-alpine restart: unless-stopped ports: - 9501:9501 volumes: - ../xelos-worker:/server/xelos-worker networks: - backend
如计划重建或合并工作器容器,以下信息可能有用:
php /server/xelos-worker/startup.phpCMD ["--service=libreoffice"]CMD ["--service=libreoffice,video"],或省略--service参数运行所有可用服务CMD ["--service=libreoffice","--dev-mode=true"]也可使用提供的docker/docker-compose.yml快速启动服务进行测试。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务