window部署
資源下載
下載docker-compose.yml文件部署
overleaf/docker-compose.yml at main · overleaf/overleaf · GitHub
下載docker desktop軟件
下載window版本
安裝dockerb desktop軟件後下載鏡像文件
查看下載的鏡像文件
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
- 這裏是配置兩個mongo節點的副本集,默認兩者是同樣優先級,mongo-node2依賴於mongo-node1,因為後面要設置mongo-node1為主節點,mongo-node2為從節點
- command: mongod --replSet rs_overleaf --bind_ip 0.0.0.0
- 這段命令是:在mongo容器創建後,執行此命令,設置副本集replSet rs_overleaf
- --bind_ip 0.0.0.0:允許所有ip訪問此節點
- networks:
- overleaf-network
- 這段代碼是:配置節點到同一網絡,不然的話會默認各個容器直接獨立通信
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
- networks:
- overleaf-network
- 這段代碼是:配置節點到同一網絡,不然的話會默認各個容器直接獨立通信
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
- 將所有的sharelatex,全部替換為overleaf,大小寫和原來的sharelatex保持一致,(原因:sharelatex版權已經全部歸overleaf,對應配置文件也全改成了overleaf,所以要替換)
- mongodb的配置:OVERLEAF_MONGO_URL: mongodb://mongo-node1:27017,mongo-node2:27017/overleaf?replicaSet=rs_overleaf&w=majority&readPreference=primary
- 因為sharelatex要求副本集羣部署,所以必須要至少配置兩個節點,如果sharelatex是4.xx版本好像可以配置mongo為單副本集也可以用
- mongo-node1:27017,mongo-node2:27017,端口號一致,是因為docker容器內部訪問,通過名稱和默認端口號就可以訪問,而mongo-node1:27017,mongo-node2:27018是對外訪問端口(通過瀏覽器之類的應用訪問)
- 郵箱配置
- OVERLEAF_EMAIL_SMTP_PORT: 465
OVERLEAF_EMAIL_SMTP_SECURE: true - 465端口號是SSL加密協議,OVERLEAF_EMAIL_SMTP_SECURE必須為true (比較舊的加密協議)
- 587端口號是TSL加密協議,OVERLEAF_EMAIL_SMTP_SECURE必須為false (比較新的協議)
- 本人嘗試了587端口號,發送郵件後不能被接受,故選擇了更通用的465端口號
- networks:
- overleaf-network
- 這段代碼是:配置節點到同一網絡,不然的話會默認各個容器直接獨立通信
網絡設置
networks:
overleaf-network:
driver: bridge
- 配置服務的公共網絡,不然無法進行內容通信連接
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
- 這個命令會啓動以上docker-compose.yml文件中配置的3個文件
- 暫停,關閉,刪除可以通過docker desktop軟件管理
進入mongo容器中檢查mongo是否成功
- mongosh:進入數據庫shell
- show dbs:查看數據庫
- 配置mongo兩個節點為主副關係(若主副節點已經選擇則跳過)
- (一般是節點比較多自動會選擇主副節點,但是實際可能會選擇失敗)進入的mongo節點(任意一個節點)的exec中,執行下面命令可以配置主副節點
mongosh --eval "
cfg = rs.conf();
cfg.members[0].priority = 2; # 節點1優先級更高
cfg.members[1].priority = 1; # 節點2優先級較低
rs.reconfig(cfg);
"
- 執行成功會返回如下結果
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1764561551, i: 1 }),
signature: {
hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
keyId: Long('0')
}
},
operationTime: Timestamp({ t: 1764561551, i: 1 })
}
- 分別在不同的節點中驗證是否正確
mongosh --eval "
db.isMaster().ismaster ? '✓ 我是主節點 (PRIMARY)' : '✗ 我是從節點 (SECONDARY)'
"
overleaf啓動連接mongo問題(MongoTransactionError: Read preference in a transaction must be primary, not: primaryPreferred)
primaryPreferred: 優先從主節點讀取,但允許從從節點讀取- 事務要求: MongoDB 事務必須在主節點上執行
- 衝突: 事務中不能使用非主節點的讀取偏好
主要修改:
- 從連接字符串中移除
&readPreference=primaryPreferred - 或者改為
&readPreference=primary - 重啓 Overleaf 服務
重啓overleaf
- 在docker desktop中,刪除所以的容器
- 重新運行腳本(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
訪問驗證&管理員賬號
- 在瀏覽器輸入:ip:端口號,回車訪問
- 初始化管理員賬號
- 進入overleaf的容器(sharelatex鏡像啓動的容器)
- 執行下面命令創建管理員賬號
grunt user:create-admin --email="admin@example.com" --password="Admin@123456"
- 瀏覽器輸入郵箱密碼,即可登錄
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才能用