Overleaf 自建服务器搭建

2022-11-28 coding web overleaf

实验室同学最近越来越多地使用 Overleaf 来撰写论文,由此我也产生了这种想法,要不要试试 Overleaf 呢?正好最近我也有两篇论文开始进入撰写阶段,就决定来尝尝鲜。 但是官网价格还是挺高的,特别是共享编辑、历史记录这些比较使用的功能,同时我又非常不愿意将论文源文件共享给网站,很让人纠结。

很快,我就发现,Overleaf 提供了一个开源的版本,可以用于免费安装。因此开始了私有搭建的过程。安装过程中还是有很多坑的,所以我想着来简单做一个记录。其中主要参考了这一篇博客 https://blog.skywt.cn/posts/self-host-overleaf ,让我避开了很多坑。

第一步:按照官网安装

我们主要是利用了 overleaf 的 toolkit 套件 来安装,流程可以查阅其官方 安装文档

安装需要的依赖包括 bashdocker 以及 docker-compose。我们首先 clone toolkit 工具:

git clone https://github.com/overleaf/toolkit.git ./overleaf-toolkit
cd ./overleaf-toolkit

使用如下的命令来初始化配置文件:

bin/init

配置文件需要有针对性的修改,我修改了 config/overleaf.rc 文件中的端口号:

SHARELATEX_PORT=8003

以及在 config/variables.env 文件中配置了项目名称、主机名和邮箱:

SHARELATEX_APP_NAME=<app 名称>
SHARELATEX_SITE_URL=<url>
SHARELATEX_NAV_TITLE=<app 名称>

SHARELATEX_EMAIL_FROM_ADDRESS=<发送邮箱名>


SHARELATEX_EMAIL_SMTP_HOST=<SMTP服务器地址>
SHARELATEX_EMAIL_SMTP_PORT=<SMTP服务器端口>
SHARELATEX_EMAIL_SMTP_SECURE=<是否使用 TLS/StartTLS>
SHARELATEX_EMAIL_SMTP_USER=<发送邮箱名>
SHARELATEX_EMAIL_SMTP_PASS=<邮箱密码>
SHARELATEX_EMAIL_SMTP_NAME=<发送邮箱名>
SHARELATEX_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
SHARELATEX_EMAIL_SMTP_IGNORE_TLS=<设置为true为TLS,否则为StartTLS>

如果需要使用 Nginx 反向代理,那么还需要修改如下两个配置:

SHARELATEX_BEHIND_PROXY=true
SHARELATEX_SECURE_COOKIE=true

配置工作结束,使用 bin/up 命令来启动 Overleaf 的 Docker 容器。这个过程中还会自动下载所需要的镜像。

第二步:配置 Nginx 反向代理

我们没有使用 toolkit 自带的 Nginx 服务器来做反向代理,这是因为我们本机已经存在了一个 Nginx 服务器冰承载了其他业务。 考虑到 Overleaf 需要使用 websocket, 我们的 Nginx 配置文件也需要做对应修改,下面给出一个例子:

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name <域名>;
        ssl_certificate <TLS 证书>;
        ssl_certificate_key <TLS 密钥文件>;

        location / {
                proxy_pass <本地Overleaf的监听地址,注意和 overleaf.rc 中保持一致>;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-Host $server_name;

                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_read_timeout 3m;
                proxy_send_timeout 3m;
                client_max_body_size 0;
        }
}

之后可以使用 nginx -sreload 载入对应配置文件。

第三步:配置 Latex 和解决 Bug

3.1 安装 TexLive 套件

首先,我们使用命令 bin/docker-compose exec sharelatex bash 进入容器内部。由于 Overleaf 镜像默认没有安装 Texlive 的全部套件,因此需要此时进行安装:

tlmgr option repository https://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet/ 
tlmgr update --self 
tlmgr install scheme-full

如果不安装,那么会发现编译 Latex 文件的时候缺少依赖。

3.2 解决环境变量 Bug

我们还发现了一个 Bug, 我们发现当前版本(3.3.2)的 Overleaf 即便是使用了 XeLaTex 也无法编译中文 Latex 文件, 根据这些 Issue #1055#1044,我们发现是当前版本的 Docker 容器缺少了一个环境变量:/usr/local/texlive/2022/bin/x86_64-linux

这里给出两种解决办法,一种是修改 docker-compose 文件,但是这要重新构建容器(也以为着要重新下载 TexLive 套件),所以我选择了第二种解决办法。 我发现 sharelatex 容器是通过脚本 /sbin/my_init.py 启动的,因此,我在这个脚本中添加了一行代码来添加对应的环境变量:

bash os.environ['PATH'] = os.pathsep.join( ["/usr/local/texlive/2022/bin/x86_64-linux", os.environ['PATH'] ] ) 注意,环境变量和具体的发行版本相关,要根据实际情况修改。

3.3 配置代码高亮

第三步,安装 minted 包。使用如下命令来安装 pyments:

apt update
apt install python-pygments python3-pygments

然后修改 /usr/local/texlive/2022/texmf.cnf (注意版本号要根据实际情况决定),并添加:

shell_escape = t

3.4 安装微软字体

我们还可以安装某些特定的微软字体,防止编译 PDF 文件的时候字体缺失:

apt-get install ttf-mscorefonts-installer
fc-cache

总结

至此,我们就可以开心的玩耍了。目前,没有发现什么明显的 Bug。但是我还在思考 Overleaf 的数据应该如何备份呢?感觉并不是很好处理。

本人保留对侵权者及其全家发动因果律武器的权利

版权提醒

如无特殊申明,本站所有文章均是本人原创。转载请务必附上原文链接:https://www.elliot98.top/post/tech/overleaf/

如有其它需要,请邮件联系!版权所有,违者必究!