index

Overleaf与AI

前言

Overleaf是一款协作式的云端LaTeX编辑工具。以前上学的时候,软件工程课的老师要求我们使用该工具和小组组员协作写报告。刚接触时,一头雾水,觉得它比word麻烦。不过随着写报告过程中的使用与熟悉,发现了它的便利与强大。先让AI总结下它的优缺点:

优点缺点
在线协作依赖网络(国内最好代理连接)
跨平台与便捷性编译速度与稳定性
模板丰富学习曲线
集成化功能(PDF,Zotero,Git)自定义性受限
免费基础功能够用高级功能需付费
云存储与分享隐私与数据安全

说下我自己的看法:

  1. 命令确实繁多,对新手不友善。但实际使用中,最常用的命令只有图片、表格和引文这关键三项。附上官方教程

  2. 从零构建项目费点事,但模板实在是太多了。大学或机构(特别是国外)格式要求严格的各种形式的文档、报告、论文模板等等几乎都有人上传,而且一般都带有使用说明。附上模板市场

  3. 云端编辑,实时保存,所以几乎不会丢失最新进度。

所以后面不少课程的报告,包括最后61页的毕业论文,我都是用Overleaf完成的。工作后有些文书工作,我还在继续使用Overleaf

自部署Overleaf的想法,始于官方端免费账户的限制(编译时间限制已经缩短到20s)以及国内网络连接的稳定性。20s编译时限这一刀砍得太厉害,对于小报告来说,没啥影响。但对于稍大些的项目,编译时长很容易超限,导致编译失败。另外,部署在国内VPS上,能保证网络连接的稳定性。

部署

官方推荐使用Overleaf Toolkit部署和管理,不过也支持Docker部署。个人更习惯于使用Docker搭建。

构建镜像包

Overleaf只提供了amd64架构的镜像包,而我的VPS是arm64架构,因此需要依照官方所说,利用Dockerfile-baseDockerfile分别构建arm64架构的sharelatex/sharelatex-basesharelatex/sharelatex

Fork源仓库后,编写自动化文档,完成自动追随上游代码更新和自动生成最新的基于arm64架构的镜像包发布到GitHub上,代码详见ypxun/overleaf
耗时1h30min+后,镜像包构建完成,地址:ypxun/overleaf_packages

搭建容器

官方的compose文档,按需修改,并注释Pro用户相关参数。

services:
  sharelatex:
    restart: always
    # Server Pro users:
    # image: quay.io/sharelatex/sharelatex-pro
    image: ghcr.io/ypxun/sharelatex:arm64-latest
    container_name: sharelatex
    depends_on:
      mongo:
        condition: service_healthy
      redis:
        condition: service_started
    ports:
        - 80:80
    stop_grace_period: 60s
    volumes:
            - ~/sharelatex_data:/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/sharelatex
      # Same property, unfortunately with different names in
      # different locations
      OVERLEAF_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"
      ## Set for SSL via nginx-proxy
      #VIRTUAL_HOST: 103.112.212.22

      OVERLEAF_SECURE_COOKIE: true
      OVERLEAF_BEHIND_PROXY: true
      # OVERLEAF_SITE_URL: http://overleaf.example.com
      # OVERLEAF_NAV_TITLE: Overleaf Community Edition
      # OVERLEAF_HEADER_IMAGE_URL: http://example.com/mylogo.png
      # OVERLEAF_ADMIN_EMAIL: support@it.com

      # OVERLEAF_LEFT_FOOTER: '[{"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: "hello@example.com"

      # OVERLEAF_EMAIL_AWS_SES_ACCESS_KEY_ID:
      # OVERLEAF_EMAIL_AWS_SES_SECRET_KEY:

      # OVERLEAF_EMAIL_SMTP_HOST: smtp.example.com
      # OVERLEAF_EMAIL_SMTP_PORT: 587
      # OVERLEAF_EMAIL_SMTP_SECURE: false
      # OVERLEAF_EMAIL_SMTP_USER:
      # OVERLEAF_EMAIL_SMTP_PASS:
      # OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH: true
      # OVERLEAF_EMAIL_SMTP_IGNORE_TLS: false
      # OVERLEAF_EMAIL_SMTP_NAME: '127.0.0.1'
      # OVERLEAF_EMAIL_SMTP_LOGGER: true
      # OVERLEAF_CUSTOM_EMAIL_FOOTER: "This system is run by department x"

      # ENABLE_CRON_RESOURCE_DELETION: true

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

      ## Sandboxed Compiles: https://github.com/overleaf/overleaf/wiki/Server-Pro:-Sandboxed-Compiles
      # SANDBOXED_COMPILES: 'true'
      # SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
      ### Bind-mount source for /var/lib/overleaf/data/compiles inside the container.
      # SANDBOXED_COMPILES_HOST_DIR_COMPILES: '/home/user/sharelatex_data/data/compiles'
      ### Bind-mount source for /var/lib/overleaf/data/output inside the container.
      # SANDBOXED_COMPILES_HOST_DIR_OUTPUT: '/home/user/sharelatex_data/data/output'

      ## 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"

  mongo:
    restart: always
    image: mongo:6.0
    container_name: sharelatex-mongo
    command: --replSet overleaf
    volumes:
        - ~/mongo_data:/data/db
        - ./bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
    environment:
      MONGO_INITDB_DATABASE: sharelatex
    extra_hosts:
      # Required when using the automatic database setup for initializing the replica set.
      # This override is not needed when running the setup after starting up mongo.
      - mongo:127.0.0.1
    healthcheck:
      test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet
      interval: 10s
      timeout: 10s
      retries: 5
  redis:
    restart: always
    image: redis:6.2
    container_name: sharelatex-redis
    volumes:
        - ~/redis_data:/data  
#   ldap:
  #    restart: always
  #    image: rroemhild/test-openldap
  #    container_name: ldap

  # 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

Nginx反代

官方反代文档,虽然标记为已过时,但实际可用。

至此,Overleaf搭建完成,网页前端设置Admin账户后,就可以开始使用了。

感想

标题说的AI,似乎并没有提及,其实就在最关键的构建镜像包那一步。平常我也有用ChatGPT、Claude和DeepSeek,只是没想到现在的AI强到这个地步。最惊讶到我的是我仅仅使用一段不长的普通的人类语句询问Claude 3.7 Sonnet,就一步成型自动化配置文档,文档中的代码一句不用改,完美运行。AI现在的实力真是恐怖如斯,也难怪现在的通用智能体如火如荼。