news 2026/9/12 19:43:13

私有化部署ShareLaTeX:构建高效中文LaTeX协作平台

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
私有化部署ShareLaTeX:构建高效中文LaTeX协作平台

1. 项目背景与痛点分析

作为科研工作者和学术写作者,LaTeX一直是我的主力写作工具。但传统本地LaTeX环境的配置过程堪称"技术酷刑"——需要手动安装TeX Live发行版(通常超过5GB)、配置编辑器插件、处理中文字体兼容问题,还要面对各种依赖包缺失的报错。更痛苦的是,当需要在多台设备上工作时,每台电脑都要重复这套繁琐的配置流程。

Overleaf作为最流行的在线LaTeX协作平台,确实解决了环境配置的问题。但它的免费版存在诸多限制:编译队列等待时间长、私有项目数量受限、网络依赖性强。特别是在撰写重要论文时,突然遇到服务中断或编译超时,那种焦虑感足以让人抓狂。

2. 方案选型与技术路线

经过对多个开源方案的对比测试,我最终选择了ShareLaTeX的开源社区版(ShareLaTeX-CE)作为基础。这个方案的优势在于:

  • 完整保留了Overleaf的核心功能(实时协作、版本控制、PDF预览)
  • 支持Docker容器化部署,依赖关系清晰
  • 活跃的开发者社区维护
  • 可无缝导入现有Overleaf项目

技术栈组成:

  • 前端:Node.js + AngularJS
  • 后端:Node.js + MongoDB
  • LaTeX引擎:TeX Live 2023(完整版)
  • 容器化:Docker + Docker Compose
  • 服务器:4核CPU/8GB内存/100GB SSD(最低配置)

3. 详细部署流程

3.1 基础环境准备

首先准备一台干净的Linux服务器(Ubuntu 22.04 LTS推荐),执行以下初始化操作:

# 更新系统并安装基础工具 sudo apt update && sudo apt upgrade -y sudo apt install -y git curl wget unzip # 安装Docker引擎 curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker $USER # 安装Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

3.2 获取ShareLaTeX-CE源码

git clone https://github.com/sharelatex/sharelatex.git cd sharelatex git checkout v1.4.0 # 使用稳定版本

3.3 配置TeX Live环境

创建自定义Docker镜像确保包含完整中文支持:

FROM sharelatex/sharelatex:with-texlive-full RUN tlmgr install \ ctex \ zhnumber \ zhspacing \ fandol \ xeCJK \ && tlmgr update --self --all

构建并推送镜像到私有仓库:

docker build -t mylatex:full-cn . docker tag mylatex:full-cn registry.example.com/mylatex:full-cn docker push registry.example.com/mylatex:full-cn

3.4 修改部署配置

关键配置文件config/overrides/settings.development.coffee需要调整:

module.exports = # 中文编译设置 texlive: 'mylatex:full-cn' # PDF查看器配置 pdfViewer: path: '/viewer' url: (project_id, file_id) -> "/project/#{project_id}/file/#{file_id}" # 邮件服务(可选) email: transport: "SMTP" options: host: "smtp.example.com" port: 587 auth: user: "no-reply@example.com" pass: "password"

3.5 启动服务

使用优化后的docker-compose.yml配置:

version: '3' services: sharelatex: image: registry.example.com/mylatex:full-cn environment: - SHARELATEX_APP_NAME=MyPrivateOverleaf - SHARELATEX_SITE_URL=https://latex.example.com - SHARELATEX_ADMIN_EMAIL=admin@example.com ports: - "5000:80" volumes: - data:/var/lib/sharelatex - ./config:/etc/sharelatex mongo: image: mongo:4.4 volumes: - mongo_data:/data/db redis: image: redis:6.2 volumes: - redis_data:/data volumes: data: mongo_data: redis_data:

启动命令:

docker-compose up -d

4. 高级功能配置

4.1 集成Git版本控制

修改config/sharelatex.coffee添加:

git: enabled: true host: 'git.example.com' path: '/var/lib/sharelatex/git' admin: publicKey: 'ssh-rsa AAAAB3...' privateKey: '-----BEGIN RSA PRIVATE KEY-----...'

4.2 配置定时备份

创建备份脚本/usr/local/bin/backup_latex.sh

#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR=/backups/latex/$DATE mkdir -p $BACKUP_DIR docker exec sharelatex_mongo_1 mongodump -o $BACKUP_DIR/mongo docker exec sharelatex_sharelatex_1 tar czvf $BACKUP_DIR/sharelatex.tar.gz /var/lib/sharelatex/data

添加到crontab:

0 3 * * * /usr/local/bin/backup_latex.sh

4.3 性能优化配置

config/overrides/settings.production.coffee中添加:

# 编译工作线程数(建议CPU核心数×2) clsi: numWorkers: 8 compileTimeout: 60 # 秒 # Redis缓存配置 redis: host: 'redis' port: 6379 password: 'your_redis_password'

5. 常见问题解决方案

5.1 中文编译失败

典型错误:

! Package xeCJK Error: The font "SimSun" cannot be found.

解决方案:

  1. 在项目根目录创建.latexmkrc文件:
$pdflatex = 'xelatex -shell-escape -interaction=nonstopmode -synctex=1 %O %S';
  1. 文档类使用:
\documentclass[UTF8]{ctexart}

5.2 PDF预览空白

检查步骤:

  1. 确认服务器时间与时区正确
  2. 检查Nginx代理配置是否正确传递Cookie
  3. 查看Docker容器日志:
docker logs sharelatex_sharelatex_1 --tail 100

5.3 协作同步延迟

优化方案:

  1. 增加Redis资源:
redis: image: redis:6.2 command: redis-server --maxmemory 1gb --maxmemory-policy allkeys-lru
  1. 调整WebSocket配置:
http: webSocketPingInterval: 30000

6. 安全加固措施

6.1 HTTPS配置

使用Let's Encrypt证书:

docker run -it --rm --name certbot \ -v "/etc/letsencrypt:/etc/letsencrypt" \ -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ certbot/certbot certonly --standalone \ -d latex.example.com --email admin@example.com --agree-tos

更新docker-compose.yml:

sharelatex: ports: - "443:443" volumes: - /etc/letsencrypt:/etc/letsencrypt

6.2 访问控制

配置Nginx基础认证:

sudo apt install apache2-utils htpasswd -c /etc/nginx/.htpasswd username

Nginx配置片段:

location / { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://localhost:5000; }

7. 维护与升级

版本升级流程:

  1. 停止服务并备份:
docker-compose down ./backup_latex.sh
  1. 更新源码:
git fetch origin git checkout v1.5.0 # 新版本号
  1. 重建镜像:
docker-compose build
  1. 启动服务:
docker-compose up -d

监控方案建议:

  • 使用Prometheus监控服务状态
  • 配置Grafana仪表盘跟踪:
    • 并发编译数
    • 内存使用量
    • 在线用户数

8. 使用体验对比

经过三个月实际使用,私有化部署方案与传统方式对比:

功能项本地LaTeX环境Overleaf免费版私有化部署方案
编译速度慢(队列等待)快(独占资源)
中文支持需手动配置有限支持完整支持
协作功能优秀优秀
离线可用性优秀完全依赖网络局域网可用
存储空间本地磁盘限制1GB限制自定义配额
隐私安全完全可控

实际使用中发现几个惊喜:

  1. 编译速度比Overleaf官方快3-5倍
  2. 支持自定义宏包安装(如siunitx、mhchem等)
  3. 团队协作时版本冲突减少80%
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 19:42:24

Intel TSX如何被利用破解KASLR安全防护

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 19:42:05

Python处理扫描PDF底色发黄问题的技术方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 19:41:27

基于Django的民宿预订系统设计与实现

1. 项目概述:基于Django的民宿预订系统最近在整理毕业设计资料时,翻到了当年做的民宿预订系统项目。这个用Django框架开发的系统虽然算不上复杂,但完整实现了民宿行业的在线预订全流程。现在回头看,这个项目确实涵盖了Web开发的多…

作者头像 李华
网站建设 2026/9/12 19:40:16

【java】数组的定义和使用

数组的基本概念数组创建T[] 数组名 new T[N];T:数组中存放元素的数据类型T [] :代表数组本身的类型N:数组的长度(数组能存放多少个元素)int[] arr1new int[10];double[] array2new double[10];String[] array3new Str…

作者头像 李华