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小时起步,耐心等待安装完成
最后运行成功结果如图:
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即可。