部署自己的overleaf服务

Xial 发布于 2023-09-14 138 次阅读


安装 overleaf

可以使用 overleaf-toolkit 来安装 overleaf (简单)

或者使用 overleaf 的 docker compose 来安装 overleaf (复杂)

overleaf-toolkit

十分简单,可以参考 Windows 本地部署 overleaf 服务.md

docker compose

官方提到了需要对 docker compose 进行的修改

Manually setting up MongoDB as a replica set

The following instructions are not necessary if you use the Overleaf Toolkit or if you use an external Mongo database already configured as a replica set.

If you run MongoDB with docker-compose, add the following command to the mongo container configuration:

mongo:
    command: "--replSet overleaf"

Restart the mongo container then start a mongo shell with docker-compose exec -it mongo mongo. In that shell, run the following command to initiate the replica set:

rs.initiate({ _id: "overleaf", members: [ { _id: 0, host: "mongo:27017" } ] })

安装完整的 Tex Live

社区版 Overleaf 中的 Tex Live 镜像并不完整,需要自己手动安装。

参考 Harry 的做法

先把构建好的镜像中的 /usr/local/texlive, /usr/share/fonts, /var/cache/fontconfig,拷贝出来,然后用 docker compose 的 volume 挂载到容器中。

之后重新构建 docker compose up --force-recreate -d

# 进入容器的命令行(sharelatex容器本质上是一个Ubuntu)
$ docker exec -it sharelatex bash

# 进入texlive默认安装目录
$ cd /usr/local/texlive

# 下载并运行升级脚本
$ wget http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh
$ sh update-tlmgr-latest.sh -- --upgrade

# 更换texlive的下载源,例如tuna源
$ tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/

# 升级tlmgr
$ tlmgr update --self --all

# 安装完整版texlive(漫长的等待,不要让shell断开)
$ tlmgr install scheme-full

# 安装Noto字体(可选)
$ apt install fonts-noto-cjk

# 推出sharelatex的命令行界面,并重启sharelatex容器
$ exit
$ docker restart sharelatex

配置中文写作环境

参考 ArchLinux 部署 ShareLaTex 并且配置中文支持

  • 将Windows字体库(即目录 C:\windows\fonts)上传到 host 机
  • 在 host 机下把 fonts 目录打包并传到 sharelatex 容器中

    # 进入fonts目录
    $ cd fonts/
    
    # 删除其中的.fon字体文件(该种格式文件在后面建立字体目录时会报错),只保留TrueType和OpenType字体,即.ttf和.otf
    # 一般地,如果只需要其中特定的中文字体,只需要上传需要的字体即可
    $ rm -r *.fon
    
    # 返回上层目录并打包
    $ cd ..
    $ tar -zcvf winfonts.tar.gz fonts/
    
    # 把压缩文件传到sharelatex容器的root目录下
    $ docker cp winfonts.tar.gz sharelatex:/root
  • 在容器中安装Windows字体

    # 进入容器的命令行界面
    $ docker exec -it sharelatex bash
    
    # 通过安装wqy字体同时安装xfont工具
    $ 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
  • 回到 ShareLaTeX 网站,创建一个新项目,使用 CTEX 宏集和 XeLaTeX 编译器,即可生成中文 pdf。(详见 CTEX 宏集手册)
  • 因为学校论文的需要,有时需要其他中文字体,例如Adobe宋体,其安装流程与上述基本一致。(PS:在GitHub上可以找到公开的Adobe Song Std字体,涉及版权这里不放链接)

代码高亮(Minted 包)支持

# 进入容器的命令行
$ docker exec -it sharelatex bash

安装 Python 和 pygments

# 安装 Python 和 pygments
$ apt install python3
$ apt-get install python-pygments

配置 Shell Escape

修改 /usr/local/texlive/2020/texmf.cnf,在最底下添加一行 shell_escape = t

% (Public domain.)
% This texmf.cnf file should contain only your personal changes from the
% original texmf.cnf (for example, as chosen in the installer).
%
% That is, if you need to make changes to texmf.cnf, put your custom
% settings in this file, which is .../texlive/YYYY/texmf.cnf, rather than
% the distributed file (which is .../texlive/YYYY/texmf-dist/web2c/texmf.cnf).
% And include *only* your changed values, not a copy of the whole thing!
%
shell_escape = t

配置完成后重启容器。

注册管理员用户

根据官方教程,创建管理员用户只需执行以下步骤:

$ docker exec sharelatex /bin/bash -c "cd /var/www/sharelatex; grunt user:create-admin --email=joe@example.com"

joe@example.com 可以替换成自己的邮箱。

附修改后的 docker-compose.yml 文件:

version: '3'
services:
    sharelatex:
        restart: always
        # Server Pro users:
        # image: quay.io/sharelatex/sharelatex-pro
        image: sharelatex/sharelatex
        container_name: sharelatex
        depends_on:
            mongo:
                condition: service_healthy
            redis:
                condition: service_started
        ports:
            - "127.0.0.1:9000:80"
        links:
            - mongo
            - redis
        stop_grace_period: 60s
        # command: apt-get update && apt-get install python3-pygments
        volumes:
            - ../data/sharelatex_data:/var/lib/sharelatex
            - ../data/usr/local/texlive/:/usr/local/texlive
            - ../data/usr/share/fonts:/usr/share/fonts
            - ../data/var/cache/fontconfig:/var/cache/fontconfig
            ########################################################################
            ####  Server Pro: Uncomment the following line to mount the docker  ####
            ####             socket, required for Sibling Containers to work    ####
            ########################################################################
            # - /var/run/docker.sock:/var/run/docker.sock
        environment:

            SHARELATEX_APP_NAME: Xial Overleaf

            SHARELATEX_MONGO_URL: mongodb://mongo/sharelatex

            # Same property, unfortunately with different names in
            # different locations
            SHARELATEX_REDIS_HOST: redis
            REDIS_HOST: redis

            ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'

            # Enables Thumbnail generation using ImageMagick
            ENABLE_CONVERSIONS: 'true'

            # Disables email confirmation requirement
            EMAIL_CONFIRMATION_DISABLED: 'true'

            # temporary fix for LuaLaTex compiles
            # see https://github.com/overleaf/overleaf/issues/695
            TEXMFVAR: /var/lib/sharelatex/tmp/texmf-var

            ## Set for SSL via nginx-proxy
            #VIRTUAL_HOST: 103.112.212.22

            # SHARELATEX_SITE_URL: http://sharelatex.mydomain.com
            # SHARELATEX_NAV_TITLE: Our ShareLaTeX Instance
            # SHARELATEX_HEADER_IMAGE_URL: http://somewhere.com/mylogo.png
            # SHARELATEX_ADMIN_EMAIL: support@it.com

            # SHARELATEX_LEFT_FOOTER: '[{"text": "Powered by ShareLaTeX 2016"},{"text": "Another page I want to link to can be found here"} ]'
            # SHARELATEX_RIGHT_FOOTER: '[{"text": "Hello I am on the Right"} ]'

            # SHARELATEX_EMAIL_FROM_ADDRESS: "team@sharelatex.com"

            # SHARELATEX_EMAIL_AWS_SES_ACCESS_KEY_ID:
            # SHARELATEX_EMAIL_AWS_SES_SECRET_KEY:

            # SHARELATEX_EMAIL_SMTP_HOST: smtp.mydomain.com
            # SHARELATEX_EMAIL_SMTP_PORT: 587
            # SHARELATEX_EMAIL_SMTP_SECURE: false
            # SHARELATEX_EMAIL_SMTP_USER:
            # SHARELATEX_EMAIL_SMTP_PASS:
            # SHARELATEX_EMAIL_SMTP_TLS_REJECT_UNAUTH: true
            # SHARELATEX_EMAIL_SMTP_IGNORE_TLS: false
            # SHARELATEX_EMAIL_SMTP_NAME: '127.0.0.1'
            # SHARELATEX_EMAIL_SMTP_LOGGER: true
            # SHARELATEX_CUSTOM_EMAIL_FOOTER: "This system is run by department x"

            # ENABLE_CRON_RESOURCE_DELETION: true

            ################
            ## Server Pro ##
            ################

            # SANDBOXED_COMPILES: 'true'

            # SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
            # SANDBOXED_COMPILES_HOST_DIR: '/var/sharelatex_data/data/compiles'

            # DOCKER_RUNNER: 'false'

            ## Works with test LDAP server shown at bottom of docker compose
            # SHARELATEX_LDAP_URL: 'ldap://ldap:389'
            # SHARELATEX_LDAP_SEARCH_BASE: 'ou=people,dc=planetexpress,dc=com'
            # SHARELATEX_LDAP_SEARCH_FILTER: '(uid={{username}})'
            # SHARELATEX_LDAP_BIND_DN: 'cn=admin,dc=planetexpress,dc=com'
            # SHARELATEX_LDAP_BIND_CREDENTIALS: 'GoodNewsEveryone'
            # SHARELATEX_LDAP_EMAIL_ATT: 'mail'
            # SHARELATEX_LDAP_NAME_ATT: 'cn'
            # SHARELATEX_LDAP_LAST_NAME_ATT: 'sn'
            # SHARELATEX_LDAP_UPDATE_USER_DETAILS_ON_LOGIN: 'true'

            # SHARELATEX_TEMPLATES_USER_ID: "578773160210479700917ee5"
            # SHARELATEX_NEW_PROJECT_TEMPLATE_LINKS: '[ {"name":"All Templates","url":"/templates/all"}]'

            # SHARELATEX_PROXY_LEARN: "true"

    mongo:
        command: "--replSet overleaf"
        restart: always
        image: mongo:4.4
        container_name: mongo
        expose:
            - 27017
        volumes:
            - ../data/mongo_data:/data/db
        healthcheck:
            test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5

    redis:
        restart: always
        image: redis:6.2
        container_name: redis
        expose:
            - 6379
        volumes:
            - ../data/redis_data:/data

    # ldap:
    #    restart: always
    #    image: rroemhild/test-openldap
    #    container_name: ldap
    #    expose:
    #        - 389

    # See https://github.com/jwilder/nginx-proxy for documentation on how to configure the nginx-proxy container,
    # and https://github.com/overleaf/overleaf/wiki/HTTPS-reverse-proxy-using-Nginx for an example of some recommended
    # settings. We recommend using a properly managed nginx instance outside of the Overleaf Server Pro setup,
    # but the example here can be used if you'd prefer to run everything with docker-compose

    # nginx-proxy:
    #     image: jwilder/nginx-proxy
    #     container_name: nginx-proxy
    #     ports:
    #       #- "80:80"
    #       - "443:443"
    #     volumes:
    #       - /var/run/docker.sock:/tmp/docker.sock:ro
    #       - /home/sharelatex/tmp:/etc/nginx/certs
最后更新于 2025-01-21