用Docker配置各类服务型的东西最简单快捷了,所以准备Overleaf时,我优选选择了Docker形式。
但实际上docker有很多坑,那就是数据安全。容器只要一重建,原来里面的内容全部丢失,祈祷着服务(器)不重启是不现实的,所以使用docker的第一要务就是把自己可能保存的内容,都通过映射的形式,直接存在主机上。具体如何做映射,后面有实例,如果你已经领会了,后面可以全都不用看了。
但是我还是记录一下我的安装过程,给大家避坑。
网上的方案很多,但大同小异,时间不同,也有一些变化。我这里不是手把手的教程,但是要点都在,如果真的不动需要咨询的,那就只能想办法请我喝咖啡了。
方法1,直接使用别人提供的单文件镜像,只通过docker启动。docker的安装自己解决,各个版本的linux多少都有点不一样。我是在我的网站服务器上,直接通过宝塔页面安装的docker管理器,但只在命令行终端下使用docker指令。

docker pull kingsleyluoxin/sharelatex:full
# OR 
# docker pull kingsleyluoxin/sharelatex:latest
docker run -p 8080:80 -d kingsleyluoxin/sharelatex:full

这样访问自己服务器ip的8080即可使用了。其中full支持中文,latest不支持中文。
原始出处在这里,但比较可惜的是,几个很核心的地方都没有讲,就是文件连接,然后管理员账号创建也失效了,launchpad 页面并不能提示注册管理员。然后邮件服务器是否正常不详,一些修饰性参数是否可以引入不详。
而我没有使用这个镜像的主要原因是没安装Adobe字体,我还是要进去安装,不如从头折腾一下,以免有什么隐患。
推荐使用该镜像的人群,单人,内网,不会忘记密码,有定期下载自己工程另外保存的习惯,或者一次性使用完结束。
如果希望长期使用,还是自己走以便比较好。
在开展第二种方法之前,说一下管理员创建的问题。
如果你也遇到了和我一样,不管是哪个条件下,网页没提示注册管理员,那么,就需要登录到docker中进行创建。
进入指定docker的命令行

docker exec -it sharelatex bash

然后切换目录,执行创建指令

cd /var/www/sharelatex
grunt user:create-admin --email=admin@university.edu

这里网上大多数的页面都写错或者复制错了,--email后面是等号=连接地址,而非空格。
执行后,会提示一个网址让自己重设密码,只复制其路径部分,贴在自己实际网址含端口都后面,设置完密码,你就有管理员,可以正常使用了。

下面开始第二种方法,docker-compose,在此之前,还要明确几个问题,容器被重建时,原来内部的数据一定会被清空,这点各位消息。而何时会重建,1. pull的镜像有更新,一般不pull应该无所谓。2. docker build很危险,docker-compose up也是,有配置变更就重建。 3. docker rm 之后。
所以呢,我每次更新部分内容后,都commit一次,生成本机私有的镜像。
下载官方的yml文件,放到一个存放本项目数据的目录里。然后创建三个目录。

mkdir sharelatex
cd sharelatex
mkdir sharelatex_data
mkdir mongo_data
mkdir redis_data

然后编辑yml文件里关于文件映射的部分,建议写绝对路径。

volumes:
 - /data/sharelatex/sharelatex_data:/var/lib/sharelatex

三处,显然sharelatex_data和mongo_data是必须的,而Redis因为不怎么存盘,所以无所谓。
有了这个链接,至少保证你的用户和用户数据在容器外,容器更新,原则上不伤害数据。

然后是yum里面其他关于修饰性的调整,email设置等。感觉sharelatex的功能很精简,用户管理能力极差,所以最好邮件配置成功,以便自己找回密码。

然后,在该目录下运行docker-compose up, 不要加-d的选项,这样报错能看到,好解决。等没有错误后,想用-d也是可以。
这是3个容器都创建了,而且之后数据库和Redis基本不会重建,而sharelate,每次调整描述性的变量,邮箱配置等,都会重建,所以特别小心。

如果你不需要中文,只用pdflatex,现在就结束了。如果还需要中文,和Xelatex,请继续。
进入指定docker的命令行

docker exec -it sharelatex bash

然后更新texlive

# 更换texlive的下载源,例如国内的清华源
$ tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/
# 安装完整版texlive(漫长的等待,不要让shell断开)
$ tlmgr install scheme-full

那个等待真的挺长,我的服务器小带宽,大概搞了半小时。这个时候可以commit一次。

docker commit a404c6c174a2 sharelatex-liang:scheme-full 

id用docker ps查看找一下。
然后就是复制中文字体到docker中,弄到主机上的过程自己解决。

# 把压缩文件传到sharelatex容器的root目录下
$ docker cp winfonts.tar.gz sharelatex:/root

然后在进入容器,执行下面操作

# 通过安装wqy字体同时安装xfont工具,这个操作之前可能需要apt-get update一下,更新下源的缓冲,要不然找不到wqy字体
$ apt-get install xfonts-wqy

# 进入root目录,解压winfonts.tar.gz,并剪切到系统字体目录下
$ cd ~
$ tar -zxvf winfonts.tar.gz
$ mv winfonts /usr/share/fonts/

# 进入字体目录安装字体
$ cd /usr/share/fonts/winfonts
$ mkfontscale
$ mkfontdir
$ fc-cache -fv

# 检查确认中文字体安装成功
$ fc-list :lang=zh-cn

这个时候再commit一次,

docker commit a404c6c174a2 sharelatex-liang:full 

这样你专属的镜像就出来了,之后吧yml中的镜像改为上面的版本。

image: sharelatex-liang:full

这样,在本机docker-compose up基本不会丢失东西了。

但实际上经过上面这么一圈折腾,很可能编译任何一个文件都包服务器错误。这个时候,我也没找到明确原因。停止服务,清空此前在主机上建立的三个目录里面的内容,然后docker-compose start,在进入主机或网页,创建一次管理员。

万事大吉。

最后,我已经把自己的容器推到hub.docker.com上了,所以,并且试装测试都成功。
你只要修改自己的yml文件即可。
将镜像改为:

image: ftliang/slatex:full

即可, 当然,综合打包之后,还是挺大的,未压缩显示有7.8G

Last modification:April 29, 2022
送杯咖啡,做个交流,谢谢!