1 前言

overleaf是一个多人协作写作平台,但其免费版限制颇多,特别是文章图片质量大了后非常之卡顿,90%概率编译不出来,于是笔者开始研究如何在甲骨云的服务器上安装一个属于自己的overleaf服务。

2 安装步骤

2.1 amd架构安装overleaf

2.1.1 amd架构的比较好安装,直接根据官网的几条命令即可,如下所示

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

2.1.2 进入文件夹

cd ./overleaf-toolkit && bin/init

2.1.3 编辑该文件修改端口,假设修改为6000端口

vi config/overleaf.rc

2.1.4 启动(注意如果没有docker和docker-compose请先通过包管理器安装

bin/up

2.1.5 然后看到正常的日志输出就可以按下Ctrl+C了,然后需要安装完整的texlive,否则IEEE等包是用不了的。

先进入docker的shell环境:

docker exec -it sharelatex bash

2.1.6 执行安装完整的texlive:

tlmgr update --self
tlmgr install scheme-full
exit

2.1.7 这一步会耗时很久,amd免费服务器估计得1小时起步,耐心等待安装完成后运行:

bin/up -d

2.1.8 然后在你的nginx反代(详见下文的arm安装步骤)里配置成功后访问根路径下的该路径(如:yourdomain.com/launchpad)即可配置管理员账户:

/launchpad

2.2 arm架构安装overleaf

有甲骨云的读者都知道,arm架构的服务器性能更佳,amd免费的基本是带不动overleaf的,所以笔者强烈推荐在arm架构上进行安装!

2.2.1 设置docker命令执行默认架构

export DOCKER_DEFAULT_PLATFORM=linux/arm64/v8

2.2.2 创建目录存储文件

mkdir overleaf_local
cd overleaf_local

2.2.3 克隆官方仓库

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

2.2.4 构建docker镜像

cd server-ce
make build-base
make build-community

2.2.5 设置并标记初始设置

cd ../../overleaf-toolkit
bin/init
docker tag sharelatex/sharelatex:main sharelatex/sharelatex:$(cat config/version)

2.2.6 编辑该文件修改端口,假设修改为6000端口

vi config/overleaf.rc

2.2.7 启动(注意如果没有docker和docker-compose请先通过包管理器安装

bin/up

2.2.8 然后看到正常的日志输出就可以按下Ctrl+C了,然后需要安装完整的texlive,否则IEEE等包是用不了的。

先进入docker的shell环境:

docker exec -it sharelatex bash

2.2.9 执行安装完整的texlive:

tlmgr update --self
tlmgr install scheme-full
exit

2.2.10 这一步会耗时很久,amd免费服务器估计得1小时起步,耐心等待安装完成

最后运行成功结果如图:

2025-02-27T09:36:15.png

2.2.11 保存标签

docker commit sharelatex sharelatex/sharelatex:[tag-name]

2.2.12 在overleaf-toolkit/config下新建文件 docker-compose.override.yml 写入如下内容:

---
services:
    sharelatex:
        image: sharelatex/sharelatex:[tag-name]

2.2.13 nginx反代配置根据官网配置后,目前发现还需要加入一个设置来避免编译完分段请求pdf导致页面加载很慢,见如下配置,( docker exec -it sharelatex bash 里也可以找到对应的nginx配置,然后自行加入其他功能,如记录真实ip等等):

add_header X-Frame-Options SAMEORIGIN;

add_header X-Content-Type-Options nosniff;

client_max_body_size 50M;

location / {
    proxy_pass http://localhost:6000; # change to whatever host/port the docker container is listening on.
    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-Real-Ip $remote_addr;  # 传递真实ip
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 3m;
    proxy_send_timeout 3m;

    # 加入这行提升速度,暂时解决编译后pdf加载慢的问题
    add_header Accept-Ranges bytes; 

}

2.2.14 最后启动即可,访问 yourdomain.com/launchpad 即可配置管理员账户

~/overleaf_local/overleaf-toolkit/bin/up -d

3 数据备份与恢复

3.1 备份到服务器本地

编辑 $HOME/overleaf_bak.sh

#!/bin/bash

date +"%F %T"

source_dir="$HOME/overleaf_local/overleaf-toolkit/data"

target_dir="/var/opt/overleaf_bak/data"

mkdir -p $target_dir

cd $source_dir

if ! command -v rsync >/dev/null 2>&1; then
        sudo apt install rsync -y
fi

if [[ "$1" == bak ]]; then
        rsync -av --exclude="/mongo/journal" $source_dir/* $target_dir/
elif [[ "$1"  == "res" ]]; then
        ../bin/stop
        rsync -av --exclude="/mongo/journal" $target_dir/* ./
        ../bin/up -d && echo done
else
        echo "usage: bash overleaf_bak.sh [bak | res]"
        exit 1
fi


date +"%F %T"
echo

然后给执行权限:

chmod +x $HOME/overleaf_bak.sh

加入 cron 任务,周期请自行修改:

# 每小时备份overleaf数据
0 * * * * $HOME/overleaf_bak.sh bak >>$HOME/overleaf_bak.log 2>&1

3.2 不同服务器间同步数据

编辑 $HOME/overleaf_bak.sh

#!/bin/bash

date +"%F %T"

remote_host="root@server_ip"

source_dir="$remote_host:/var/opt/overleaf_bak"

target_dir="/var/opt/overleaf_bak"

mkdir -p $target_dir

#cd $source_dir

if ! command -v rsync >/dev/null 2>&1; then
        sudo apt install rsync -y
fi

if [[ "$1" == bak ]]; then
        rsync -av --exclude="/mongo/journal" $source_dir/data $target_dir/
elif [[ "$1"  == "res" ]]; then
        rsync -av --exclude="/mongo/journal" $target_dir/data $source_dir/
else
        echo "usage: bash overleaf_bak.sh [bak | res]"
        exit 1
fi

date +"%F %T"

echo

然后给执行权限:

chmod +x $HOME/overleaf_bak.sh

加入 cron 任务:

5 * * * * $HOME/overleaf_bak.sh bak >>$HOME/overleaf_bak.log 2>&1

4 保存镜像到docker hub

去官网注册个用户,创建一个仓库,然后执行:

docker login

给本地的image打标签,格式不能错,否则不能正常推送 (这里sharelatex/sharelatex:arm64-with-texlive-full是本地之前保存的标签名,2act/sharelatex-arm64为用户名/仓库名,v25.3.2为版本号) :

docker tag sharelatex/sharelatex:arm64-with-texlive-full 2act/sharelatex-arm64:v25.3.2

然后运行push即可推送到远程仓库:

docker push 2act/sharelatex-arm64:v25.3.2

从远程仓库拉取镜像:

docker pull 2act/sharelatex-arm64:v25.3.2

然后给这个镜像重新打个标签,比如前面提到的 overleaf-toolkit/config/docker-compose.override.yml 里配置的tag-name即可。

5 参考链接

最后修改:2025 年 03 月 03 日
如果觉得我的文章对你有用,请随意赞赏