window部署

資源下載

下載docker-compose.yml文件部署

overleaf/docker-compose.yml at main · overleaf/overleaf · GitHub

下載docker desktop軟件

下載window版本

如何在windows下部署leaf服務器_nginx

安裝dockerb desktop軟件後下載鏡像文件

如何在windows下部署leaf服務器_nginx_02

查看下載的鏡像文件

如何在windows下部署leaf服務器_redis_03

overleaf部署

注意:直接運行下載docker-compose.yml,會報version問題,把第一行的version註釋即可

編寫配置文件docker-compose.yml (總的)

services:

    # MongoDB 主節點(node1)
    mongo-node1:
        image: mongo:latest  # 版本按需改4.4
        container_name: mongo-node1
        ports:
            - "27017:27017"
        volumes:
            - D:/docker/volumes/mongo/data/node1:/data/db
            - D:/docker/volumes/mongo/logs/node1:/var/log/mongodb
        command: mongod --replSet rs_overleaf --bind_ip 0.0.0.0
        networks:
            - overleaf-network
        restart: always
        healthcheck:
            test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5
            start_period: 30s

    # MongoDB 從節點(node2)
    mongo-node2:
        image: mongo:latest
        container_name: mongo-node2
        ports:
            - "27018:27017"
        volumes:
            - D:/docker/volumes/mongo/data/node2:/data/db
            - D:/docker/volumes/mongo/logs/node2:/var/log/mongodb
        command: mongod --replSet rs_overleaf --bind_ip 0.0.0.0
        networks:
            - overleaf-network
        restart: always
        depends_on:
            - mongo-node1
        healthcheck:
            test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5
            start_period: 30s
redis:
     restart: always
     image: redis:latest
     container_name: redis
     expose:
         - 6379
     volumes:
         - D:/docker/volumes/redis:/data
     command: redis-server --appendonly yes
     networks:
         - overleaf-network
     healthcheck:
         test: ["CMD", "redis-cli", "ping"]
         interval: 10s
         timeout: 5s
         retries: 5


 overleaf:
     restart: always
     # Server Pro users:
     # image: quay.io/overleaf/overleaf-pro
     image: sharelatex/sharelatex:5.0-with-texlive-full
     # image: sharelatex/sharelatex:5
     container_name: overleaf
     depends_on:
         mongo-node1:
             condition: service_healthy
         mongo-node2:
             condition: service_healthy
         redis:
             condition: service_started
     ports:
         - 9500:80
     links:
         - mongo-node1
         - mongo-node2
         - redis
     volumes:
         - D:/docker/volumes/overleaf:/var/lib/overleaf
         ########################################################################
         ####  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:

         OVERLEAF_APP_NAME: Overleaf Community Edition

         #OVERLEAF_MONGO_URL: mongodb://mongo/overleaf?replicaSet=rs0
         OVERLEAF_MONGO_URL: mongodb://mongo-node1:27017,mongo-node2:27017/overleaf?replicaSet=rs_overleaf&w=majority&readPreference=primary

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

         ENABLED_LINKED_FILE_TYPES: 'url,project_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/overleaf/tmp/texmf-var

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

         # OVERLEAF_SITE_URL: http://overleaf.mydomain.com
         OVERLEAF_NAV_TITLE: Our OVERLEAF Instance
         # OVERLEAF_HEADER_IMAGE_URL: http://somewhere.com/mylogo.png
         OVERLEAF_ADMIN_EMAIL: cccc@qq.com

         # OVERLEAF_LEFT_FOOTER: '[{"text": "Powered by <a href=\"https://www.overleaf.com\">Overleaf</a> 2016"},{"text": "Another page I want to link to can be found <a href=\"here\">here</a>"} ]'
         # OVERLEAF_RIGHT_FOOTER: '[{"text": "Hello I am on the Right"} ]'

         OVERLEAF_EMAIL_FROM_ADDRESS: "cccc@qq.com"

         # OVERLEAF_EMAIL_AWS_SES_ACCESS_KEY_ID:
         # OVERLEAF_EMAIL_AWS_SES_SECRET_KEY:

         OVERLEAF_EMAIL_SMTP_HOST: smtp.qq.com
         OVERLEAF_EMAIL_SMTP_PORT: 465
         OVERLEAF_EMAIL_SMTP_SECURE: true
         OVERLEAF_EMAIL_SMTP_USER: cccc@qq.com
         OVERLEAF_EMAIL_SMTP_PASS: xxxxx
         OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH: true
         OVERLEAF_EMAIL_SMTP_IGNORE_TLS: false
         OVERLEAF_EMAIL_SMTP_NAME: 'My Overleaf 服務'
         OVERLEAF_EMAIL_SMTP_LOGGER: true
         OVERLEAF_CUSTOM_EMAIL_FOOTER: "This system is run by department 林星"

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

         # SANDBOXED_COMPILES: 'true'

         # SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
         # SANDBOXED_COMPILES_HOST_DIR: '/var/overleaf_data/data/compiles'
         # SYNCTEX_BIN_HOST_PATH: '/var/overleaf_data/bin/synctex'

         # DOCKER_RUNNER: 'false'

         ## Works with test LDAP server shown at bottom of docker compose
         # OVERLEAF_LDAP_URL: 'ldap://ldap:389'
         # OVERLEAF_LDAP_SEARCH_BASE: 'ou=people,dc=planetexpress,dc=com'
         # OVERLEAF_LDAP_SEARCH_FILTER: '(uid={{username}})'
         # OVERLEAF_LDAP_BIND_DN: 'cn=admin,dc=planetexpress,dc=com'
         # OVERLEAF_LDAP_BIND_CREDENTIALS: 'GoodNewsEveryone'
         # OVERLEAF_LDAP_EMAIL_ATT: 'mail'
         # OVERLEAF_LDAP_NAME_ATT: 'cn'
         # OVERLEAF_LDAP_LAST_NAME_ATT: 'sn'
         # OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN: 'true'

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


         # OVERLEAF_PROXY_LEARN: "true"
     networks:
         - overleaf-network

 # mongo:
 #     restart: always
 #     image: mongo:latest
 #     container_name: mongo
 #     expose:
 #         - 27017
 #     volumes:
 #         - D:/docker/volumes/mongo:/data/db
 #     healthcheck:
 #         test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
 #         interval: 10s
 #         timeout: 10s
 #         retries: 5
 #     command: >
 #         mongod
 #         --bind_ip_all
 #         --replSet rs0
 #         --keyFile /data/replica.key
 #     networks:
 #         - overleaf

 # redis:
 #     restart: always
 #     image: redis:latest
 #     container_name: redis
 #     expose:
 #         - 6379
 #     volumes:
 #         - D:/docker/volumes/redis:/data
 #     command: redis-server --appendonly yes
 #     networks:
 #         - overleaf-network
 #     healthcheck:
 #         test: ["CMD", "redis-cli", "ping"]
 #         interval: 10s
 #         timeout: 5s
 #         retries: 5

networks:
overleaf-network:
driver: bridge

# 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/overleaf/tmp:/etc/nginx/certs

mongodocker運行配置

# MongoDB 主節點(node1)
    mongo-node1:
        image: mongo:latest  # 版本按需改4.4
        container_name: mongo-node1
        ports:
            - "27017:27017"
        volumes:
            - D:/docker/volumes/mongo/data/node1:/data/db
            - D:/docker/volumes/mongo/logs/node1:/var/log/mongodb
        command: mongod --replSet rs_overleaf --bind_ip 0.0.0.0
        networks:
            - overleaf-network
        restart: always
        healthcheck:
            test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5
            start_period: 30s

    # MongoDB 從節點(node2)
    mongo-node2:
        image: mongo:latest
        container_name: mongo-node2
        ports:
            - "27018:27017"
        volumes:
            - D:/docker/volumes/mongo/data/node2:/data/db
            - D:/docker/volumes/mongo/logs/node2:/var/log/mongodb
        command: mongod --replSet rs_overleaf --bind_ip 0.0.0.0
        networks:
            - overleaf-network
        restart: always
        depends_on:
            - mongo-node1
        healthcheck:
            test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5
            start_period: 30s
  1. 這裏是配置兩個mongo節點的副本集,默認兩者是同樣優先級,mongo-node2依賴於mongo-node1,因為後面要設置mongo-node1為主節點,mongo-node2為從節點
  2. command: mongod --replSet rs_overleaf --bind_ip 0.0.0.0
  1. 這段命令是:在mongo容器創建後,執行此命令,設置副本集replSet rs_overleaf
  2. --bind_ip 0.0.0.0:允許所有ip訪問此節點
  1. networks:
    - overleaf-network
  1. 這段代碼是:配置節點到同一網絡,不然的話會默認各個容器直接獨立通信

redis運行配置

redis:
        restart: always
        image: redis:latest
        container_name: redis
        expose:
            - 6379
        volumes:
            - D:/docker/volumes/redis:/data
        command: redis-server --appendonly yes
        networks:
            - overleaf-network
        healthcheck:
            test: ["CMD", "redis-cli", "ping"]
            interval: 10s
            timeout: 5s
            retries: 5
  1. networks:
    - overleaf-network
  1. 這段代碼是:配置節點到同一網絡,不然的話會默認各個容器直接獨立通信

overleaf運行配置

overleaf:
        restart: always
        # Server Pro users:
        # image: quay.io/overleaf/overleaf-pro
        image: sharelatex/sharelatex:5.0-with-texlive-full
        # image: sharelatex/sharelatex:5
        container_name: overleaf
        depends_on:
            mongo-node1:
                condition: service_healthy
            mongo-node2:
                condition: service_healthy
            redis:
                condition: service_started
        ports:
            - 9500:80
        links:
            - mongo-node1
            - mongo-node2
            - redis
        volumes:
            - D:/docker/volumes/overleaf:/var/lib/overleaf
            ########################################################################
            ####  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:

            OVERLEAF_APP_NAME: Overleaf Community Edition

            #OVERLEAF_MONGO_URL: mongodb://mongo/overleaf?replicaSet=rs0
            OVERLEAF_MONGO_URL: mongodb://mongo-node1:27017,mongo-node2:27017/overleaf?replicaSet=rs_overleaf&w=majority&readPreference=primary

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

            ENABLED_LINKED_FILE_TYPES: 'url,project_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/overleaf/tmp/texmf-var

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

            # OVERLEAF_SITE_URL: http://overleaf.mydomain.com
            OVERLEAF_NAV_TITLE: Our OVERLEAF Instance
            # OVERLEAF_HEADER_IMAGE_URL: http://somewhere.com/mylogo.png
            OVERLEAF_ADMIN_EMAIL: ccccc@qq.com

            # OVERLEAF_LEFT_FOOTER: '[{"text": "Powered by <a href=\"https://www.overleaf.com\">Overleaf</a> 2016"},{"text": "Another page I want to link to can be found <a href=\"here\">here</a>"} ]'
            # OVERLEAF_RIGHT_FOOTER: '[{"text": "Hello I am on the Right"} ]'

			# 需要和OVERLEAF_EMAIL_SMTP_USER保持一致才能發送郵件
            OVERLEAF_EMAIL_FROM_ADDRESS: "ccccc@qq.com"   

            # OVERLEAF_EMAIL_AWS_SES_ACCESS_KEY_ID:
            # OVERLEAF_EMAIL_AWS_SES_SECRET_KEY:

            OVERLEAF_EMAIL_SMTP_HOST: smtp.qq.com
            OVERLEAF_EMAIL_SMTP_PORT: 465
            OVERLEAF_EMAIL_SMTP_SECURE: true
            OVERLEAF_EMAIL_SMTP_USER: ccccc@qq.com
            OVERLEAF_EMAIL_SMTP_PASS: xxxxxx
            OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH: true
            OVERLEAF_EMAIL_SMTP_IGNORE_TLS: false
            OVERLEAF_EMAIL_SMTP_NAME: 'My Overleaf 服務'
            OVERLEAF_EMAIL_SMTP_LOGGER: true
            OVERLEAF_CUSTOM_EMAIL_FOOTER: "This system is run by department 林星"

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

            # SANDBOXED_COMPILES: 'true'

            # SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
            # SANDBOXED_COMPILES_HOST_DIR: '/var/overleaf_data/data/compiles'
            # SYNCTEX_BIN_HOST_PATH: '/var/overleaf_data/bin/synctex'

            # DOCKER_RUNNER: 'false'

            ## Works with test LDAP server shown at bottom of docker compose
            # OVERLEAF_LDAP_URL: 'ldap://ldap:389'
            # OVERLEAF_LDAP_SEARCH_BASE: 'ou=people,dc=planetexpress,dc=com'
            # OVERLEAF_LDAP_SEARCH_FILTER: '(uid={{username}})'
            # OVERLEAF_LDAP_BIND_DN: 'cn=admin,dc=planetexpress,dc=com'
            # OVERLEAF_LDAP_BIND_CREDENTIALS: 'GoodNewsEveryone'
            # OVERLEAF_LDAP_EMAIL_ATT: 'mail'
            # OVERLEAF_LDAP_NAME_ATT: 'cn'
            # OVERLEAF_LDAP_LAST_NAME_ATT: 'sn'
            # OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN: 'true'

            # OVERLEAF_TEMPLATES_USER_ID: "578773160210479700917ee5"
            # OVERLEAF_NEW_PROJECT_TEMPLATE_LINKS: '[ {"name":"All Templates","url":"/templates/all"}]'
# OVERLEAF_PROXY_LEARN: "true"
      networks:
          - overleaf-network
  1. 將所有的sharelatex,全部替換為overleaf,大小寫和原來的sharelatex保持一致,(原因:sharelatex版權已經全部歸overleaf,對應配置文件也全改成了overleaf,所以要替換)
  2. mongodb的配置:OVERLEAF_MONGO_URL: mongodb://mongo-node1:27017,mongo-node2:27017/overleaf?replicaSet=rs_overleaf&w=majority&readPreference=primary
  1. 因為sharelatex要求副本集羣部署,所以必須要至少配置兩個節點,如果sharelatex是4.xx版本好像可以配置mongo為單副本集也可以用
  2. mongo-node1:27017,mongo-node2:27017,端口號一致,是因為docker容器內部訪問,通過名稱和默認端口號就可以訪問,而mongo-node1:27017,mongo-node2:27018是對外訪問端口(通過瀏覽器之類的應用訪問)
  1. 郵箱配置
  1. OVERLEAF_EMAIL_SMTP_PORT: 465
    OVERLEAF_EMAIL_SMTP_SECURE: true
  2. 465端口號是SSL加密協議,OVERLEAF_EMAIL_SMTP_SECURE必須為true (比較舊的加密協議)
  3. 587端口號是TSL加密協議,OVERLEAF_EMAIL_SMTP_SECURE必須為false (比較新的協議)
  4. 本人嘗試了587端口號,發送郵件後不能被接受,故選擇了更通用的465端口號
  1. networks:
    - overleaf-network
  1. 這段代碼是:配置節點到同一網絡,不然的話會默認各個容器直接獨立通信

網絡設置

networks:
    overleaf-network:
        driver: bridge
  1. 配置服務的公共網絡,不然無法進行內容通信連接

overleaf運行

運行docker-compose.yml文件,啓動mongo,redis,overleaf文件

# 指定項目名為 overleaf-production,不在當前目錄,則docker-compose.yml替換為:自己的路徑/docker-compose.yml
docker-compose -p overleaf-production -f docker-compose.yml up -d

# 簡化寫法(如果就在當前目錄)
docker-compose -p overleaf-production up -d
  1. 這個命令會啓動以上docker-compose.yml文件中配置的3個文件
  2. 暫停,關閉,刪除可以通過docker desktop軟件管理

進入mongo容器中檢查mongo是否成功

  1. mongosh:進入數據庫shell
  2. show dbs:查看數據庫
  3. 配置mongo兩個節點為主副關係(若主副節點已經選擇則跳過)
  1. (一般是節點比較多自動會選擇主副節點,但是實際可能會選擇失敗)進入的mongo節點(任意一個節點)的exec中,執行下面命令可以配置主副節點
mongosh --eval "
cfg = rs.conf();
cfg.members[0].priority = 2;  # 節點1優先級更高
cfg.members[1].priority = 1;  # 節點2優先級較低
rs.reconfig(cfg);
"
  1. 執行成功會返回如下結果
{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1764561551, i: 1 }),
    signature: {
      hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
      keyId: Long('0')
    }
  },
  operationTime: Timestamp({ t: 1764561551, i: 1 })
}
  1. 分別在不同的節點中驗證是否正確
mongosh --eval "
db.isMaster().ismaster ? '✓ 我是主節點 (PRIMARY)' : '✗ 我是從節點 (SECONDARY)'
"

overleaf啓動連接mongo問題(MongoTransactionError: Read preference in a transaction must be primary, not: primaryPreferred)

  • primaryPreferred: 優先從主節點讀取,但允許從從節點讀取
  • 事務要求: MongoDB 事務必須在主節點上執行
  • 衝突: 事務中不能使用非主節點的讀取偏好

主要修改:

  1. 從連接字符串中移除 &readPreference=primaryPreferred
  2. 或者改為 &readPreference=primary
  3. 重啓 Overleaf 服務

重啓overleaf

  1. 在docker desktop中,刪除所以的容器
  2. 重新運行腳本(c重複第一步驟)
# 指定項目名為 overleaf-production,不在當前目錄,則docker-compose.yml替換為:自己的路徑/docker-compose.yml
docker-compose -p overleaf-production -f docker-compose.yml up -d

# 簡化寫法(如果就在當前目錄)
docker-compose -p overleaf-production up -d

訪問驗證&管理員賬號

  1. 在瀏覽器輸入:ip:端口號,回車訪問
  2. 初始化管理員賬號
  1. 進入overleaf的容器(sharelatex鏡像啓動的容器)
  2. 執行下面命令創建管理員賬號
grunt user:create-admin --email="admin@example.com" --password="Admin@123456"
  1. 瀏覽器輸入郵箱密碼,即可登錄

overleaf更新texlive

官網鏈接:toolkit/doc/ce-upgrading-texlive.md at master · overleaf/toolkit · GitHub

檢查tlmgr&更新

# tlmgr --version
tlmgr revision 59291 (2021-05-21 05:14:40 +0200)
tlmgr using installation: /usr/local/texlive/2021
TeX Live (https://tug.org/texlive) version 2021

// 更新tlmgr命令
# tlmgr update --self

下載全量texlive

# tlmgr install scheme-full

查看tlmgr命令幫助

# tlmgr help

注意: tlmgr為texlive的命令,沒有的話,需要按照texlive才能用