实验室最近有论文协作撰写需求,开台虚拟机配置一个内网版的overleaf,就不用在官网花80刀开会员了~部署基于yu-i-i开发并提供了Overleaf的社区增强版,提供了不少Server Pro才有的功能。https://github.com/yu-i-i/overleaf-cep

overleaf 配置

开台干净的ubuntu机子并安装好docker

  1. 获取sudo权限

    1
    sudo su
  2. 确认docker版本

    1
    2
    docker-compose --version
    docker --version

获取安装工具

增强版Overleaf的部署仍推荐使用官方的Overleaf工具包(Overleaf-toolkit),因为这样可以利用已有的许多Overleaf-toolkit教程对Overleaf的服务进行配置。

增强版的不同之处在于,它通过编辑docker-compose的yml文件,使得toolkit启动容器时使用修改过的sharelatex:ext-ce镜像而不是官方提供的sharelatex镜像,进而实现增强版功能。

官方的Overleaf-toolkit可参考官方文档进行拉取(在linux命令行中输入):

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

设置配置文件

进入路径~/overleaf-toolkit/中,初始化并查看config文件,并在~/overleaf-toolkit/config/中,添加一个名为 docker-compose.override.yml 的新配置文件。具体为以下步骤:

1
2
3
4
5
cd overleaf-toolkit
bin/init
ls config
cd config
vi docker-compose.override.yml

在yml文件夹里写入以下内容:

1
2
3
4
---
services:
sharelatex:
image: overleafcep/sharelatex:6.0.1-ext-v3.3

image-20260108171621186

拉取/创建增强版镜像

docker hub里直接拉取镜像,在终端输入以下代码(目前最新版是6.0.1-ext-v3.3):

1
docker pull overleafcep/sharelatex:6.0.1-ext-v3.3

如果想要其他版本,拉取相应的版本即可:

1
docker pull overleafcep/sharelatex:5.5.4-ext-v3.1

有docker desktop的,可以直接在hub里面选择拉取:

image-20260108171756480

docker pull如果报错,说明也要配置代理,执行命令查看 docker.service 信息,得知配置文件位置 /lib/systemd/system/docker.service

1
2
3
4
5
6
7
8
9
10
11
~$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-06-13 00:52:54 CST; 22h ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 387690 (dockerd)
Tasks: 139
Memory: 89.6M
CPU: 1min 26.512s
CGroup: /system.slice/docker.service

docker.service[Service] 模块添加:

1
2
3
Environment=HTTP_PROXY=http://192.168.6.25:10808
Environment=HTTPS_PROXY=http://192.168.6.25:10808
Environment=NO_PROXY=localhost,127.0.0.1

重新加载配置文件并重启服务:

1
2
systemctl daemon-reload
systemctl restart docker.service

修改 dockerd 配置文件

还可以修改 dockerd 配置文件,添加:

1
export http_proxy="http://proxyAddress:port"

然后重启 docker daemon 即可。

国内的镜像仓库在绝大多数时候都可以满足条件,但是存在个别镜像同步不及时的情况,如果使用 latest 标签拉取到的镜像并非近期的镜像,因此有时候需要直接从官方镜像仓库拉取镜像。

修改配置文件

docker-compose.override.yml

这个文件内容如下:

1
2
3
4
---
services:
sharelatex:
image: overleafcep/sharelatex:6.0.1-ext-v3.3

image可以替换成最新版本,但是一定要跟sharelatex/sharelatex版本一致,如果你的社区基础版本是6.0.1,那这里一定要填overleafcep/sharelatex:6.0.1-ext-v3.3,其中6.0.1要和社区基础版本保持一致,ext-v3.3可以去dockerhub看最新的版本。

6.0.1这个版本号必须一致!

overleaf.rc

这个文件里头有几个地方需要注意:

1
2
3
4
OVERLEAF_LISTEN_IP=0.0.0.0	# ip需要改成全局
OVERLEAF_PORT=80
SERVER_PRO=true # 一定要开启这个,因为要用到沙盒编译
SIBLING_CONTAINERS_ENABLED=true # 这个是需要手动填入的,开启沙盒编译功能

variables.env

这里头可以对overleaf版本做一些微调,网上都有,附一下我的一些关键配置:

  1. 沙箱编译相关:我这里用的是ghcr.io/ayaka-notes/texlive-full镜像,仓库地址在ayaka-notes/texlive-full: 🐳 Docker Image of TeXLive (For Overleaf Server Pro),这个镜像包含:

    • Google Fonts
    • Microsoft msttcorefonts
    • Overleaf supported fonts
    • 和Overleaf官网一样的latexmk编译流
    • 软件包系列:fontconfig、inkscape、pandoc、python3-pygments、wget、python3
    • 软件包系列:gnupg、gnuplot、perl-modules、perl、ca-certificates、git
    • 软件包系列:ghostscript、qpdf、r-base-core、tar

    很全,当然该作者还开发了overleaf pro,只不过有点年久失修,不然体验会比overleaf-CEP好很多。

    另外需要注意的是这里头不能有空格,尤其是逗号两边都不能有,否则会有bug

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ########################
    ## Sandboxed Compiles ##
    ########################

    # TEX_LIVE_DOCKER_IMAGE=quay.io/sharelatex/texlive-full:2022.1
    # ALL_TEX_LIVE_DOCKER_IMAGES=quay.io/sharelatex/texlive-full:2022.1,quay.io/sharelatex/texlive-full:2021.1,quay.io/sharelatex/texlive-full:2020.1
    ALL_TEX_LIVE_DOCKER_IMAGES=ghcr.io/ayaka-notes/texlive-full:2025.1,texlive/texlive:TL2024-historic
    ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLive2025,TeXLive2024
    TEX_LIVE_DOCKER_IMAGE=ghcr.io/ayaka-notes/texlive-full:2025.1
    TEX_COMPILER_EXTRA_FLAGS=-shell-escape
  2. 模板相关:先把分类搭好,后面有好的模板可以直接内网共享。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #################
    # TEMPLATES #
    #################

    ENABLE_CONVERSIONS=true

    OVERLEAF_TEMPLATE_GALLERY=true
    OVERLEAF_NON_ADMIN_CAN_PUBLISH_TEMPLATES=true
    OVERLEAF_TEMPLATE_CATEGORIES=academic-journal book presentation poster cv homework bibliography calendar formal-letter report thesis newsletter

    TEMPLATE_ACADEMIC_JOURNAL_NAME=Journal articles
    TEMPLATE_ACADEMIC_JOURNAL_DESCRIPTION=Templates for academic journal submissions, including formats for major publishers and preprint servers.

    TEMPLATE_BIBLIOGRAPHY_NAME=Bibliographies
    TEMPLATE_BIBLIOGRAPHY_DESCRIPTION=Styles for creating and managing bibliographies with BibTeX or BibLaTeX. Suitable for use in academic papers, theses, and reports.

    TEMPLATE_BOOK_NAME=Books
    TEMPLATE_BOOK_DESCRIPTION=Templates for writing books or long-form documents, including chapter structuring, front matter, and indexing.

    TEMPLATE_CALENDAR_NAME=Calendars
    TEMPLATE_CALENDAR_DESCRIPTION=Templates to create yearly, monthly, or weekly calendars. Useful for personal planners or event scheduling.

    TEMPLATE_CV_NAME=CVs and résumés
    TEMPLATE_CV_DESCRIPTION=Templates for CVs and résumés with various formats for academic, industry, and creative positions.

    TEMPLATE_FORMAL_LETTER_NAME=Formal letters
    TEMPLATE_FORMAL_LETTER_DESCRIPTION=Templates for professional letters, such as cover letters, recommendation letters, and official correspondence.

    TEMPLATE_HOMEWORK_NAME=Assignments
    TEMPLATE_HOMEWORK_DESCRIPTION=Templates for homework, coursework, and problem sets. Designed to be clean and well-structured for students and educators.

    TEMPLATE_NEWSLETTER_NAME=Newsletters
    TEMPLATE_NEWSLETTER_DESCRIPTION=Templates for creating newsletters with formats for academic, corporate, or community communications.

    TEMPLATE_POSTER_NAME=Posters
    TEMPLATE_POSTER_DESCRIPTION=Templates for scientific and academic posters, typically used in conferences and research presentations.

    TEMPLATE_PRESENTATION_NAME=Presentations
    TEMPLATE_PRESENTATION_DESCRIPTION=Templates for Beamer and other presentation formats, tailored for academic talks and lectures.

    TEMPLATE_REPORT_NAME=Reports
    TEMPLATE_REPORT_DESCRIPTION=Templates for technical, lab, or project reports. Includes sections for figures, tables, and references.

    TEMPLATE_THESIS_NAME=Theses
    TEMPLATE_THESIS_DESCRIPTION=Templates for writing theses and dissertations, following institutional formatting and citation guidelines.

    TEMPLATE_ALL_NAME=All templates
    TEMPLATE_ALL_DESCRIPTION=Browse a collection of all available LaTeX templates, categorized by document type, style, and purpose.

  3. 剩下的邮箱和s3存储是必填项,都可以用cloudflare的免费方案,在此不表

    千万别用outlook,outlook的smtp不支持密码登录了,overleaf配置outlook的单应用密码依然会报错,微软官方给的方案是现在通关单密码登陆的邮箱应用只能收邮件,不能发邮件

重启并执行

修改完配置之后需要先停止容器,再重启

1
2
3
bin/stop
bin/docker-compose down
sudo bin/up -d

Overleaf备份

数据无价,除了s3同步之外可靠备份也很重要,这里直接用github.com/xuhe2/olsync

配置内网穿透

论文协作可能需要校外访问,所以可以进一步配置内网穿透,这里选择cloudflare Tunnel,并配置邮箱白名单访问权限。

配置cloudflare Tunnel

参考链接:Cloudflare Zero Trust:Cloudflare Tunnel使用教程 - 资源荟萃 - LINUX DO

cf tunnel 是什么?

Cloudflare Tunnel为您提供了一种安全的方式,将您的资源连接到Cloudflare,而无需公共可路由的IP地址。使用Tunnel,您不会将流量发送到外部IP地址,而是在您的基础设施中创建一个轻量级的守护程序,仅向Cloudflare的全球网络创建出站连接。Cloudflare Tunnel可以安全地将HTTP Web服务器、SSH服务器、远程桌面和其他协议连接到Cloudflare。这样,您的源站可以通过Cloudflare提供流量,而不会容易受到绕过Cloudflare的攻击。

(摘自官方文档)

有什么用?

tunnel字面意思一根加密隧道直接从Cloudflare网络插到你的服务器,提供webui页面方便管理域名与服务器上部署的项目之间的绑定。

  • 项目部署上线更简单,只需建立好隧道,然后设置域名指向项目暴露的本地地址和端口即可。
  • 无需编写任何 Nginx 配置,非常适合像我这样的懒人或小白用户。
  • 无需配置证书,使用加密隧道,项目不会直接暴露到公网上,从而增强了安全性。(ps: 需开启防火墙)

如何工作的?

大致流程为:

用户 —> cf服务器 —> cf侧tunnel设置入口 —(加密)–> 服务器侧的tunnel出口 → 本机项目

image-20260109210014143

开始搭建

  1. 在Cloudflare的侧边栏中,找到并点击Zero Trust 菜单。如果是首次使用,需要进行订阅,选择免费套餐进行开通。

ed995e3d-3924-40f7-8da2-0d2c7f5a939a

  1. 在进入Zero Trust面板后,从侧边栏中找到并点击Tunnel 菜单。

2

2281×500 14.1 KB

  1. 创建一条隧道(cf侧)

88b3a824-fb54-420d-ae52-c67eb961cb82

​ 3.1 隧道类型选Cloudflared

f5df19c1-3f4c-47bf-b181-ff3f7dfe5125

​ 3.2 设置隧道名,名字随便取,我个人习惯于取能够辨识服务器的名称。

1160bc76-c70f-459b-b7e8-ce28a9682a8c

​ 3.3 安装环境选Docker,记得复制docker的安装命令以备后用。

3b346934-a6f3-4a3a-ab64-bcf30f4a74ad

​ 3.4 不用点下一步,直接在左上角点击返回,即可确认隧道已成功创建。

f0d94135-3d3b-40c0-a39e-96d56a86699f

8b456ec2-e7dc-47b6-bce0-cab75560cb7e

  1. 服务器侧隧道设置

在第3.3节中,我们获得了一个类似于以下的docker命令:

1
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhIjoiMjQ4MmIzM2Y3Njc3YWE5OWE5NThiZjcxNTdkMzU1ZmYiLCJ0IjoiOTFmYzdhOWQtYThiZC00MmY2LThlOTEtMDMwYWZjNDA3MjRmIiwicyI6IlkyRm1OamM0TXpZdE1qVTBaaTAwTTJZNUxUZ3hOV1V0TXpOaE9XVmpNV1F4Wm1ZeCJ9

先别着急用,需要添加几个docker参数,注意network需要设置为host。讲一下我之前遇到的坑,docker启动容器默认会使用桥接模式(bridge),在后面域名绑定时,127.0.0.1:port是cloudflared这个容器内部的地址,如果你的项目也是使用docker的桥接模式启动的,那么就无法找到对应的服务。当然也可以用172.17.0.1:port这个地址进行绑定,但还是建议让cloudflared容器以host模式启动。

docker启动命令

1
docker run -d --restart always --network host --name cloudflared cloudflare/cloudflared tunnel --no-autoupdate run --token eyJhIjoiMjQ4MmIzM2Y3Njc3YWE5OWE5NThiZjcxNTdkMzU1ZmYiLCJ0IjoiOTFmYzdhOWQtYThiZC00MmY2LThlOTEtMDMwYWZjNDA3MjRmIiwicyI6IlkyRm1OamM0TXpZdE1qVTBaaTAwTTJZNUxUZ3hOV1V0TXpOaE9XVmpNV1F4Wm1ZeCJ9

or

docker-compose配置

1
2
3
4
5
6
7
8
9
version: '3'

services:
cloudflared:
image: cloudflare/cloudflared
container_name: cloudflared
restart: always
network_mode: host
command: tunnel --no-autoupdate run --token eyJhIjoiMjQ4MmIzM2Y3Njc3YWE5OWE5NThiZjcxNTdkMzU1ZmYiLCJ0IjoiOTFmYzdhOWQtYThiZC00MmY2LThlOTEtMDMwYWZjNDA3MjRmIiwicyI6IlkyRm1OamM0TXpZdE1qVTBaaTAwTTJZNUxUZ3hOV1V0TXpOaE9XVmpNV1F4Wm1ZeCJ9
  1. 配置域名和部署项目的绑定

​ 5.1 点击前面创建的隧道Configure

ed563914-9b7e-4cf6-a833-7b838a3ce7c6

​ 5.2 添加Public Hostname

b219f066-cd90-475a-ab6f-66f54f87cae7

​ 5.3 配置域名与服务器上的项目端口,类型有很多可选的,选http即可。

1457b68a-52bb-4904-bbb0-a8190b1c5a7d

​ 5.4 配置完成后,尝试访问你的域名以确认是否设置成功

配置邮件白名单

参考链接:内网穿透新技能 - Cloudflare Zero Trust ► emperinter - emperinter

现在我们已经可以从外部访问内网里的设备了,即便我们为每个服务加上了强壮的密码,你可能还是会担心密码遭到了泄露或者暴力破解。这时,可以利用 Zero Trust 提供的 Access 功能,来为你的服务增加二次验证。

  1. 点击 Application 中的 Add an application,选择 Self-hosted。
    img
  1. 设置好 Application name,subdomain,选择我们的 Domain,点击 Next。
    img
  2. 然后新建个策略并在你创建的应用程序里头选择这个策略,首先设置策略名称(Policy name),配置规则(Configure rules)这里我们设置的是Emails,Value 填写自己常用的邮箱。意思就是,访问的时候需要输入自己的邮箱来获取一个一次性的验证码,验证通过之后才允许访问我们的内网服务。这个功能可以很好的保护我们的内网的一些服务。比如我们希望将内网的测速服务映射到公网,但是只允许特定的人员访问,就可以添加特定的邮箱以及验证码来进行访问控制。
    image-20260109223223728
  1. 然后在应用程序里头绑定做好的策略即可。
    image-20260109223333812

  2. 在应用程序里头的登陆方法里,请确认勾选One-time PIN

    image-20260109223500131

  1. 最后点击保存(Save policy)就可以了。试试我们添加好的策略,会提示输入邮箱获取验证码。
    img

  2. 这里随便输入邮箱是获取不到验证码的,只有输入我们设置好的邮箱才可以。利用这个访问控制策略,就为我们暴露在公网上的服务添加了二次验证。

    访问的有效期可以在应用程序里面的Session duration 中设置。
    img