实验室内网部署本地overleaf-CEP
实验室最近有论文协作撰写需求,开台虚拟机配置一个内网版的overleaf,就不用在官网花80刀开会员了~部署基于yu-i-i开发并提供了Overleaf的社区增强版,提供了不少Server Pro才有的功能。https://github.com/yu-i-i/overleaf-cep
overleaf 配置
开台干净的ubuntu机子并安装好docker
获取sudo权限
1
sudo su
确认docker版本
1
2docker-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 | cd overleaf-toolkit |
在yml文件夹里写入以下内容:
1 | --- |

拉取/创建增强版镜像
从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里面选择拉取:

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 | --- |
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 | OVERLEAF_LISTEN_IP=0.0.0.0 # ip需要改成全局 |
variables.env
这里头可以对overleaf版本做一些微调,网上都有,附一下我的一些关键配置:
沙箱编译相关:我这里用的是
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模板相关:先把分类搭好,后面有好的模板可以直接内网共享。
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.剩下的邮箱和s3存储是必填项,都可以用cloudflare的免费方案,在此不表
千万别用outlook,outlook的smtp不支持密码登录了,overleaf配置outlook的单应用密码依然会报错,微软官方给的方案是现在通关单密码登陆的邮箱应用只能收邮件,不能发邮件
重启并执行
修改完配置之后需要先停止容器,再重启
1 | bin/stop |
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出口 → 本机项目

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

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

2281×500 14.1 KB
- 创建一条隧道(cf侧)

3.1 隧道类型选Cloudflared

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

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

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


- 服务器侧隧道设置
在第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 | version: '3' |
- 配置域名和部署项目的绑定
5.1 点击前面创建的隧道Configure

5.2 添加Public Hostname

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

5.4 配置完成后,尝试访问你的域名以确认是否设置成功
配置邮件白名单
参考链接:内网穿透新技能 - Cloudflare Zero Trust ► emperinter - emperinter
现在我们已经可以从外部访问内网里的设备了,即便我们为每个服务加上了强壮的密码,你可能还是会担心密码遭到了泄露或者暴力破解。这时,可以利用 Zero Trust 提供的 Access 功能,来为你的服务增加二次验证。
- 点击 Application 中的 Add an application,选择 Self-hosted。

- 设置好 Application name,subdomain,选择我们的 Domain,点击 Next。

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

然后在应用程序里头绑定做好的策略即可。

在应用程序里头的
登陆方法里,请确认勾选One-time PIN
最后点击保存(Save policy)就可以了。试试我们添加好的策略,会提示输入邮箱获取验证码。

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










