缘起
之前在和别人合作写作业或者论文时,一直使用Overleaf来协作编写LaTeX文档。虽然不如在本地编辑器(如VS Code)上可定制性强,但跟别人协作起来还是挺方便的。在写博士论文时,为了使用Git同步功能,我购买了一年的学生订阅。由于毕业后使用频率降低,我就没有续费了。最近我需要重新编译一下之前的博士论文,才发现Overleaf免费用户的编译时间是有限制的,由于博士论文比较大,编译时间超过了限制,导致我无法编译成功。
我之前也尝试过使用Overleaf的开源社区版搭建在线LaTeX服务,但搭好后还是使用Overleaf的官方服务较多,就没有维护自己搭建的服务。这次由于需要重新编译博士论文,我就试着在自己搭建的Overleaf上编译,但发现缺少了很多宏包,导致无法编译。于是我决定重新搭建一个Overleaf开源社区版服务,并安装完整版的TeX Live,以便能够编译所有的LaTeX文档。
Overleaf简介
Overleaf是一个在线的LaTeX编辑器,支持多人协作编辑,提供了丰富的模板和宏包,可以在线编译LaTeX文档。Overleaf有免费版和付费版,免费版有一些限制,如编译时间限制、项目数限制等。Overleaf的付费版提供了更多的功能,如无限编译时间、无限项目数、Git同步等。
Overleaf的开源社区版是Overleaf的开源版本,可以在自己的服务器上搭建一个类似Overleaf的在线LaTeX编辑器。Overleaf开源社区版提供了与Overleaf官方服务相似的功能,如在线编译LaTeX文档、多人协作编辑、模板和宏包支持等。但是遗憾的是,Overleaf社区版也不支持集成Git同步功能。如果想要使用Git同步以及一些其他功能,需要购买Overleaf Server Pro版。这里我只需要Overleaf社区版就够了。
前提
- Docker和Docker Compose
- 域名(二级域名即可)
Overleaf社区版安装
我们可以使用Docker来方便快捷地搭建Overleaf社区版服务。这里有两种安装方式:一种是直接使用Overleaf社区版仓库里提供的docker-compose.yml
文件,另一种是使用Overleaf官方提供的工具箱。Overleaf官方推荐使用第二种方式,但这里两种方式都介绍一下。
方法一:使用docker-compose.yml
文件安装
可以在Overleaf社区版仓库中找到docker-compose.yml
文件,下载到本地,然后使用Docker Compose启动服务。
这里可能需要根据自己的实际情况修改docker-compose.yml
文件,如修改端口、数据卷路径等。修改完成后,使用以下命令启动服务:
|
|
方法二:使用Overleaf工具箱安装
Overleaf官方提供了一个工具箱,包装了一些常用的docker命令,可以初始化、启动、停止、诊断、升级Overleaf服务。虽然我觉得相比直接使用docker-compose.yml
,这个工具箱使部署docker的流程更复杂了,但这个工具箱的确提供了更多更灵活的定制选项。
使用这个工具箱部署Overleaf社区版服务,可以参考Overleaf社区版工具箱文档。简单来讲,有以下几步:
-
下载工具箱:
1
git clone https://github.com/overleaf/toolkit.git
-
进入工具箱目录:
1
cd toolkit
-
初始化安装配置:
1
bin/init
运行此命令,将在当前目录下生成一个
config
文件夹,里面包含了三个配置文件:overleaf.rc
:Overleaf配置文件。用户可以在这个文件中配置Overleaf的一些参数,如端口、数据卷路径等。variables.env
:环境变量配置文件version
:选择Overleaf版本。注意在5.0.0版本之后,Overleaf将原来的ShareLaTeX商标替换为Overleaf商标,所以如果环境变量配置文件中如果使用OVERLEAF
前缀的变量,需要选择5.0.0之后的版本。
-
在修改完配置文件后,运行以下命令启动服务(可能需要
sudo
提升权限):1
bin/up
这个命令会以命令行debug模式启动服务,在运行后可以看到服务的输出日志。如果想要停止服务,可以按
Ctrl+C
。如果想要以后台模式启动服务,可以使用以下命令(可能需要
sudo
提升权限):1
bin/up -d
-
如果想要停止服务,可以使用以下命令(可能需要
sudo
提升权限):1
bin/stop
配置Nginx反向代理
Overleaf社区版的docker-compose.yml
文件中有一个nginx
容器,如果使用Overleaf工具箱,在overleaf.rc
配置文件中也可以配置Nginx。如果需要TSL/SSL加密,可以使用在初始化时使用bin/init --tls
命令。这样会在config
目录中生成一个nginx
文件夹,里面包含了Nginx的配置文件和作为示例的SSL证书。
但是由于我之前在服务器上已经部署了单独的Nginx服务来管理所有的网站,所以我选择使用单独的Nginx服务来反向代理Overleaf服务。具体过程可参见个人网站的建立过程(二):使用Hugo框架搭建个人网站。
升级TeX Live
Overleaf的docker镜像中自带了一个基础版本的TeX Live,但是这个版本可能不包含所有的宏包。如果需要编译一些特殊的LaTeX文档,可能需要安装完整版的TeX Live。可参考Overleaf工具箱文档中升级Tex Live的文档。主要步骤如下:
安装完整版TeX Live
-
使用如下命令进入Overleaf容器:
1
docker exec -it sharelatex bash
-
查看当前TeX Live版本:
1
tlmgr --version
-
更新TeX Live:
1
tlmgr install scheme-full
我在执行这个命令时遇到了如下问题:
1 2 3 4
tlmgr: Local TeX Live (2023) is older than remote repository (2024). Cross release updates are only supported with update-tlmgr-latest(.sh/.exe) --update See https://tug.org/texlive/upgrade.html for details.
这是因为TeX Live的版本不同,可以使用如下命令为Tex Live指定合适的版本:
1
tlmgr option repository https://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2023/tlnet-final
关于TeX Live的历史版本仓库,可以参考这里。
在指定了合适的版本后,再次执行更新命令:
1
tlmgr install scheme-full
不出意外的话,这个命令会下载并安装完整版的TeX Live。这将会安装超过4000个宏包,可能需要一段时间。
-
添加路径:
在安装完成后,需要使用如下命令添加路径:
1
tlmgr path add
如果不执行这个命令,在Overleaf中编译LaTeX文档时,可能会出现无法编译EPS图片等问题。
保存更改到镜像
做完上述更改后,升级的TeX Live只会保存在当前的容器中,如果容器被删除,这些更改也会丢失。如果想要将这些更改保存到镜像中并在之后创建容器时使用,可以执行下面的操作:
-
使用如下命令(可能需要
sudo
提升权限)更新镜像:1
docker commit sharelatex sharelatex/sharelatex:with-texlive-full
-
然后可以在
config
目录中添加一个docker-compose.override.yml
文件,在之后创建容器时指定使用新的镜像:1 2 3 4 5
--- version: '2.2' services: sharelatex: image: sharelatex/sharelatex:with-texlive-full
-
停止并删除之前的容器,然后重新创建容器(可能需要
sudo
提升权限):1 2 3
bin/stop bin/docker-compose rm -f sharelatex bin/up -d