本地部署overleaf(服务器和WSL2两种方式)

overleaf提供了开源的社区版本供用户本地部署,可以不受官方在线版本的编译时长限制,overleaf提供了一组toolkit来简化本地部署的流程,下面我们从先决条件出发,介绍在Linux服务器和Windows系统部署的流程。

常见问题和解决方案附在文章末尾

Windows部署的先决条件

  • Docker Desktop(依赖于WSL2环境,安装后可以集成到所有WSL2发行版中)
  • WSL2 Ubuntu(提供bash工具以运行toolkit脚本、运行docker命令)

确保安装好Docker Desktop和WSL2 Ubuntu发行版后,在Docker Desktop的设置->Resources->WSL integration中打开Ubuntu发行版的集成开关,这样可以在WSL2中使用Windows系统中的docker。如下图所示:

部署过程

打开WSL2 Ubuntu终端(Windows环境)/使用SSH连接到Linux服务器(服务器环境),在用户的home目录下(任意自定义位置也可)执行如下命令拉取overleaf-toolkit代码:

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

进入 .\overleaf-toolkit文件夹:

$ cd ./overleaf-toolkit

执行 $ ls -l 来检查文件夹的目录结构,正常情况下,文件夹内容如下所示:

    bin
    CHANGELOG.md
    config
    data
    doc
    lib
    LICENSE
    README.md

运行如下命令来初始化配置文件,会在 config 文件夹中创建默认的配置文件:

$ bin/init

打开config文件夹中的overleaf.rc文件,按照需要修改如下行:

# 如果只在本机器上使用而不与局域网中的其他用户共享,保持 127.0.0.1即可
# 如果局域网中的其它用户需要访问该机器上的overleaf,则将其修改为机器在局域网中的ip,如192.168.1.3
OVERLEAF_LISTEN_IP=127.0.0.1
# 默认端口为 80,即http协议的默认端口,如该端口已经被其它进程占用,可以修改成其它端口,在访问时通过ip:端口的格式访问,如 192.168.1.3:23456
OVERLEAF_PORT=80

打开config文件夹中的variables.env文件,按照需要修改如下行(该文件不做任何修改也可以使用):

# 删除开头的#和空格以启用该行的配置
# 该部分为显示在overleaf首页的信息
# OVERLEAF_SITE_URL=http://overleaf.example.com
# OVERLEAF_NAV_TITLE=Our Overleaf Instance
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
# OVERLEAF_ADMIN_EMAIL=support@example.com

# OVERLEAF_LEFT_FOOTER='[{"text": "Contact your support team", "url": "mailto:support@example.com"}]'
# OVERLEAF_RIGHT_FOOTER='[{"text": "Hello, I am on the Right"}]'

# OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com

# OVERLEAF_EMAIL_AWS_SES_ACCESS_KEY_ID=
# OVERLEAF_EMAIL_AWS_SES_SECRET_KEY=

# 按需求配置邮箱服务,可以在注册新用户时自动发送邮件到用户邮箱
# OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
# OVERLEAF_EMAIL_SMTP_PORT=587
# OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
# OVERLEAF_EMAIL_SMTP_LOGGER=false
# OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
# OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
# OVERLEAF_CUSTOM_EMAIL_FOOTER=This system is run by department x

执行如下命令初始化并启动docker服务

$ bin/up

此时会启动docker容器组,终端中会不断输出日志,当只有mongo的日志不断输出时,在浏览器中输入 ip:端口 来访问overleaf(如果端口为80,则只输入ip即可),此时能看到overleaf的登录页面就算基本搭建成功啦!

在浏览器中输入http://[ip]/launchpad(如:192.268.1.3/launchpad)后可以进入管理员账户的注册页面,输入邮箱和密码后即可登录并管理站点和用户,恭喜搭建完成!

在终端中按下 Ctrl+C 来结束当前的docker服务,然后重新执行 bin/start 在后台运行overleaf的docker容器

$ bin/start

安装完整的texlive镜像

由于overleaf-toolkit默认拉取的sharelatex镜像中只包含了部分latex宏包,为了有更好的使用体验,我们需要手动安装完整的镜像。命令如下:

# 修改为清华源(可选,也可以使用代理在官方源下载)
tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet
# 拉取完整latex
docker exec sharelatex tlmgr install scheme-full

常见问题与解决方案

docker无法正常拉取镜像

    绝大多数情况都是由于网络原因,可以通过两种方式来解决,第一更换docker源为国内镜像,第二是为docker配置代理(推荐)。在Windows中,Docker Desktop默认使用系统代理;在Linux中,docker作为守护进程运行,无法直接使用用户的代理变量,需要通过下面的方式进行:

    创建并编辑代理配置,创建一个名为 http-proxy.conf 的配置文件,用于定义代理环境变量。

    创建配置文件

    sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

    将以下内容粘贴到文件中,并替换为您实际的代理IP和端口:

    # HTTP 代理
    
    Environment="HTTP_PROXY=http://192.168.1.5:8888"
    
    # HTTPS 代理(如果代理支持 HTTPS,请配置)
    
    Environment="HTTPS PROXY=http://192.168.1.5:8888"
    
    # 无需走代理的地址(通常是 Docker 内部网络、本地地址、局域网段)
    Environment="No_PRoxY=localhost,127.0.0.1 ::1,192.168.0.0/16,10.0.0.0/8"
    
    # 注意: NO PROXY 配置非常重要,它确保 Docker 容器之间的通信以及对本地 Docker 注册表的访问不会通过代理。

    添加完配置文件后执行如下命令重启docker服务:

    sudo systemctl daemon-reload
    
    sudo systemctl restart docker

    sharelatex容器中无法正常下载texlive的包

    仍然是网络问题,要么换源要么在容器内部配置代理

    Mongo无法正常连接/Mongo容器状态为Unhealthy/Sharelatex容器无法正常启动

    极有可能与”./overleaf-toolkit/lib/docker-compose.mongo.yml”中的healthycheck的test脚本有关,将该文件的内容修改如下:

    ---
    services:
    
        mongo:
            restart: always
            image: "${MONGO_DOCKER_IMAGE}"
            command: "${MONGO_ARGS}"
            container_name: mongo
            volumes:
                - "${MONGO_DATA_PATH}:/data/db"
            expose:
                - 27017
            healthcheck:
                test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping').ok"]
                interval: 10s
                timeout: 10s
                retries: 5
    
        sharelatex:
          depends_on:
            mongo:
              condition: service_healthy
          links:
            - mongo
    
    暂无评论

    发送评论 编辑评论

    
    				
    上一篇