
该项目自动化并提供管理界面,用于生成传统的 Variance 发布文件。编辑可上传文本版本、生成 Medite 比对结果、管理摹本,并使用源自 _lignes 文件的分页标记组装发布资产包。具体功能包括:
_lignes 文件、摹本和比对清单项目分为以下组件:
http://localhost:8080),可通过单个端口访问 Laravel(/admin)、传统 Variance(/)和 Medite 端点详细文档:
descr/architecture.md、descr/workflow.md、descr/facsimiles.md、descr/queues_jobs.md、descr/api_endpoints.md、descr/deployment_notes.md。最近更新:
descr/updates_2026-02-04.md。
bashgit clone https://github.com/unil-lettres/variance-input.git cd variance-input docker compose up -d --build
这将启动:
laravel(管理 Web 应用,通过代理访问 http://localhost:8080/admin)medite(Flask API,运行于 http://localhost:5000)laravel-queue(用于分页和摹本任务的队列 worker)laravel/example.env 到 laravel/.env,根据需要调整数据库/队列设置/admin/health 暴露运行中的提交 SHA,在创建/重建 laravel 和 laravel-queue 容器前设置 APP_GIT_SHA=$(git rev-parse HEAD)/admin),设置 ADMIN_BASE_PATH=admin 使生成的 URL 包含前缀MEDITE_STATUS_URL 控制"Medite 任务"菜单链接,默认值 /medite/(通过 variance-proxy 代理),确保本地和 staging 主机无需硬编码 localhost 即可使用laravel-queue 服务运行 laravel/scripts/run-queue-workers.sh,为 facsimiles 和 page-markers 队列生成多个 worker(QUEUE_WORKERS,默认 5 个)bashdocker compose exec laravel php artisan migrate docker compose exec laravel php artisan db:seed # 可选:加载测试数据
storage/app/public/uploads/versions/ 下生成 TEI 容器_lignes) – 上传 _lignes 文本文件,队列将在 storage/app/private/pagination/{version}.json 生成描述所有分页标记的辅助文件storage/app/public/uploads/{author}/{work}/comparisons/{id}_lignes 标记合并到 Medite XHTML 文件中| 用途 | 命令 |
|---|---|
| 查看 Laravel 队列日志 | docker compose logs -f laravel-queue |
| 手动运行队列 worker | docker compose exec laravel php artisan queue:work --queue=page-markers --stop-when-empty |
| Artisan 交互 shell | docker compose exec laravel php artisan tinker |
| Laravel 依赖安装 | docker compose exec laravel composer install |
| NPM 构建(如需) | docker compose exec laravel npm run build |
├── docker-compose.yml ├── descr/ # 开发者文档 ├── laravel/ # 管理应用(PHP/Laravel) │ ├── app/ │ ├── routes/ │ └── ... ├── medite/ # Flask + Celery Medite 运行器 │ └── app/variance/... ├── variance/ # 传统 PHP 前端(开发环境下只读) └── variance_data/ # 运行时上传文件和生成输出
.txt 文件(≤ 8 MB,text/plain)original_encoding(UTF‑8 / Windows‑1252 / ISO‑8859‑1)VersionController::store 将原始 TXT 写入 storage/app/public/uploads/versions/{base}.txt,标准化文本(UTF‑8 LF,空白折叠),保留内嵌 <pb> 标签,插入 <lb/>,并将 TEI 保存到 storage/app/public/uploads/versions/{base}.xmlstorage/app/public/uploads/versions 读取 TEI,若不存在则回退到 public/uploads/versions 或 variance/uploads/versions(传统/导入数据)versions 记录_lignes 文件storage/app/private/lignes/{version_id}.txtApplyLignesJob 解析 _lignes 条目,与 TEI 文本匹配,并在 storage/app/private/pagination/{version_id}.json 存储分页辅助 JSON,包含 { char_index, page, image_code, phrase, context }storage/app/tmp/pager/{version_id}.json,供 UI 显示辅助文件就绪状态_lignes 上传限制为 4 MB<pb> 标签,可使用 POST /api/versions/{version}/pagination/from-pb 直接构建辅助文件img_*)并生成缩略图storage/app/public/uploads/{author}/{work}/{version}/images_{role}_{author--work--comparison}.json,并立即反映在比对表格("JSON"状态)中MediteController::runMedite 调用 Flask 服务执行 Celery 任务/app/uploads/{author}/{work}/comparisons/{comparison_id},Laravel 将其镜像到 storage/app/public/uploads/{author}/{work}/comparisons/{id}ComparisonController::applyPageMarkers 确保两个版本都有辅助文件,标记比对为排队状态,并调度 InjectComparisonPaginationJobstorage/app/private/pagination/{version}.json,在记录的偏移位置将 <span class="page-marker"> 标签注入 source.xhtml / target.xhtml,并保存更新后的文件storage/app/tmp/pager/comparisons/{comparison_id}.json;UI 轮询此端点显示每个角色(源/目标)的状态(排队→运行中→完成)POST /api/comparisons/{comparison}/pagination/from-xhtml 可从 source.xhtml / target.xhtml 中已有的 <pb> 标签重建辅助文件storage/app/public/uploads/{author}/{work}/{comparison_folder},并镜像到 variance/uploads/{author}/{work}/{comparison_folder} 供传统站点使用后台任务
ApplyLignesJob、InjectComparisonPaginationJob)在 page-markers 队列运行;摹本处理使用 facsimiles 队列laravel-queue 容器运行 laravel/scripts/run-queue-workers.sh,为 facsimiles,page-markers 生成多个 queue:work 进程docker compose exec laravel php artisan queue:work --queue=page-markers --stop-when-empty健康状态(顶部横幅点)
可配置健康阈值:
HEALTHCHECK_DISK_WARN_GB(默认 10)HEALTHCHECK_DISK_CRIT_GB(默认 5)HEALTHCHECK_MEDITE_WARN_MS(默认 2500)HEALTHCHECK_FAILED_JOBS_WARN(默认 1)HEALTHCHECK_FAILED_JOBS_CRIT(默认 10)制品速查表
| 制品 | 位置 |
|---|---|
| 上传的 TXT 文件 | storage/app/public/uploads/versions/{folder}.txt |
| TEI 版本文件 | storage/app/public/uploads/versions/{folder}.xml |
_lignes 原始文件 | storage/app/private/lignes/{version_id}.txt |
| 分页辅助文件 | storage/app/private/pagination/{version_id}.json |
| 摹本清单 JSON | storage/app/public/uploads/{author}/{work}/{version}/images_{role}_{author--work--comparison}.json |
| 版本进度文件 | storage/app/tmp/pager/{version_id}.json |
| 比对进度文件 | storage/app/tmp/pager/comparisons/{comparison_id}.json |
| Medite 输出(XHTML/TEI) | storage/app/public/uploads/{author}/{work}/comparisons/{id} |
| 已发布比对(可选) | storage/app/public/uploads/{author}/{work}/{comparison_folder} + 镜像到 variance/uploads/... |
| 摹本图像(草稿) | storage/app/public/uploads/{author}/{work}/{version}/ |
| 导出的传统 zip 包 | 通过 /comparisons/{id}/export 按需下载 |
| 作品封面图像 | public/uploads_images/{hash}.{ext} + 镜像到 variance/uploads_images/ |
| 作品 PDF 文件 | public/uploads/pdf/{work_id}.pdf + 镜像到 variance/uploads/pdf/ |
深入了解可查看:
laravel/app/Services/PageMarkerService.phplaravel/app/Jobs/ApplyLignesJob.phplaravel/app/Jobs/InjectComparisonPaginationJob.phpmedite/app/flask_app.pyVariance 与 Medite 集成由SIER(教学与研究基础设施服务) 开发,隶属于洛桑大学文学院(<[***]>)。许可目前正在内部审核中;本仓库为私有,现阶段不授予任何再分发权利。
祝您比对愉快! :)
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。





探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务