在 Cloudflare Workers 等边缘运行时构建应用程序时,开发者面临着严格的环境限制。Workers 以 V8 isolates 的形式运行——这是运行 JavaScript 和 WebAssembly 的沙盒环境,但缺乏传统的操作系统或执行任意原生二进制文件的能力。这为 LaTeX 等工具带来了重大障碍,因为 LaTeX 是原生机器代码程序。LaTeX 引擎(如 `pdflatex` 或 `xelatex`)旨在与完整的操作系统交互,读取和写入大量的临时文件,并调用其他程序。由于这些要求无法在 isolate 中满足,编译过程必须卸载到独立的服务中,通常是一个可以通过 HTTP 访问的容器。
为了管理这种卸载,作者选择了 Tectonic 作为底层引擎。与可能占用数 GB 磁盘空间的标准 TeX Live 安装不同,Tectonic 是一个自包含程序,它仅根据需要获取特定文档所需的特定软件包、字体和连字符模式。这使得容器镜像能够保持较小体积,同时仍支持复杂的文档。此外,Tectonic 还会自动处理 LaTeX 为解析交叉引用和参考文献所需的多次处理,从而简化了边缘应用的 API。为了确保安全性,该服务使用了 `--untrusted` 标志并禁用了“shell escape”功能,否则恶意 LaTeX 文档可能会在宿主机服务器上执行任意 shell 命令。
部署此服务涉及特定的安全和基础设施权衡。由于容器位于公共 URL 上,作者实施了“失败关闭”(fail closed)安全模型:除非在环境中提供有效的 `COMPILE_TOKEN`,否则服务拒绝启动。这防止了未经授权的用户将容器作为免费计算资源使用。此外,该服务通过使用 `mkdtemp` 为每个任务创建唯一的、原子性的临时目录来处理文件管理。这防止了共享同一容器实例的并发请求之间发生冲突。虽然作者考虑过使用平台特定的身份验证(如 Google Cloud 的签名身份令牌),但他们最终选择了共享密钥以保持不同容器主机之间的兼容性,这体现了在最大安全性与架构可移植性之间的刻意权衡。
