c38e2b8b49
Build and Deploy Verso / deploy (push) Failing after 24m2s
In RevealJS mode the download button becomes a 2-choice menu:
- Standalone HTML: a one-off compile with embed-resources (chalkboard and other
runtime-only plugins are dropped, since they don't survive self-containment),
yielding a single portable .html.
- Slide PDF: render the deck, then print it with decktape (headless Chromium)
to a faithful one-slide-per-page PDF.
Implementation:
- Dockerfile-base: install decktape + headless Chromium (open-source; deps via
playwright install-deps for Ubuntu-Noble correctness). Base-only change.
- QuartoRunner honours options.exportMode ('html-standalone' | 'pdf-slides');
exportMode is threaded web ClsiManager -> CLSI RequestParser -> CompileManager
-> runner.
- New GET /project/:id/presentation-export/:format compiles in the matching
export mode and streams the result as a download (PresentationExportController,
reusing ClsiManager.getOutputFileStream).
- pdf-hybrid-download-button shows the dropdown when the output is output.html;
PDF/LaTeX projects keep the single download button.
- i18n: download_as_standalone_html / download_as_pdf_slides (en + fr +
extracted-translations.json).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
137 lines
6.7 KiB
Plaintext
137 lines
6.7 KiB
Plaintext
# --------------------------------------------------
|
|
# Overleaf Base Image (sharelatex/sharelatex-base)
|
|
# --------------------------------------------------
|
|
|
|
FROM phusion/baseimage:noble-1.0.3
|
|
|
|
# Makes sure LuaTeX cache is writable
|
|
# -----------------------------------
|
|
ENV TEXMFVAR=/var/lib/overleaf/tmp/texmf-var
|
|
|
|
# Update to ensure dependencies are updated
|
|
# ------------------------------------------
|
|
ENV REBUILT_AFTER="2026-05-21"
|
|
|
|
# Install dependencies
|
|
# --------------------
|
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
# Technically, we are using potentially stale package-lists with the below line.
|
|
# Practically, apt refreshes the lists as needed and release builds run in fresh CI VMs without the cache.
|
|
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked true \
|
|
# Enable caching: https://docs.docker.com/reference/dockerfile/#example-cache-apt-packages
|
|
&& rm -f /etc/apt/apt.conf.d/docker-clean && echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache \
|
|
&& apt-get update \
|
|
&& apt-get install -y \
|
|
unattended-upgrades \
|
|
build-essential wget net-tools unzip time poppler-utils optipng strace nginx git python3 python-is-python3 zlib1g-dev libpcre3-dev gettext-base libwww-perl ca-certificates curl gnupg \
|
|
qpdf \
|
|
# upgrade base-image, batch all the upgrades together, rather than installing them on-by-one (which is slow!)
|
|
&& unattended-upgrade --verbose --no-minimal-upgrade-steps \
|
|
# install Node.js https://github.com/nodesource/distributions#nodejs
|
|
&& mkdir -p /etc/apt/keyrings \
|
|
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
|
|
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
|
|
&& apt-get update \
|
|
&& apt-get install -y nodejs \
|
|
\
|
|
&& rm -rf \
|
|
# We are adding a custom nginx config in the main Dockerfile.
|
|
/etc/nginx/nginx.conf \
|
|
/etc/nginx/sites-enabled/default
|
|
|
|
# Install Quarto (bundles Typst for PDF rendering — no LaTeX needed)
|
|
# ------------------------------------------------------------------
|
|
ARG QUARTO_VERSION=1.6.39
|
|
RUN curl -fsSL "https://github.com/quarto-dev/quarto-cli/releases/download/v${QUARTO_VERSION}/quarto-${QUARTO_VERSION}-linux-amd64.deb" -o /tmp/quarto.deb \
|
|
&& dpkg -i /tmp/quarto.deb \
|
|
&& rm /tmp/quarto.deb \
|
|
&& mkdir -p /var/www/.cache/quarto \
|
|
&& chown -R www-data:www-data /var/www/.cache
|
|
|
|
# Pre-install popular Quarto extensions
|
|
# -----------------------------------------------------------------------
|
|
# Extensions land in /opt/quarto-extensions/_extensions/<author>/<name>/.
|
|
# QuartoRunner copies them into each project's compile dir (no-clobber,
|
|
# so user-uploaded extensions in their project always take precedence).
|
|
# To add more: append another line: && quarto add --no-prompt <author>/<repo>
|
|
# -----------------------------------------------------------------------
|
|
RUN mkdir -p /opt/quarto-extensions \
|
|
&& cd /opt/quarto-extensions \
|
|
\
|
|
# Typst document formats
|
|
&& quarto add --no-prompt igorlima/charged-ieee \
|
|
\
|
|
# RevealJS presentation plugins (official Quarto extensions)
|
|
&& quarto add --no-prompt quarto-ext/fontawesome \
|
|
&& quarto add --no-prompt quarto-ext/attribution \
|
|
&& quarto add --no-prompt quarto-ext/pointer \
|
|
&& quarto add --no-prompt quarto-ext/drop \
|
|
\
|
|
&& chown -R www-data:www-data /opt/quarto-extensions
|
|
|
|
# Install decktape + headless Chromium (for exporting RevealJS decks to PDF)
|
|
# -----------------------------------------------------------------------
|
|
# decktape drives a headless Chromium (via Puppeteer) to print the rendered
|
|
# reveal.js slides to a faithful, one-slide-per-page PDF. Chromium is the
|
|
# open-source engine (BSD); decktape is MIT, Puppeteer Apache-2.0 — all
|
|
# permissive and AGPL-compatible. They are invoked as a separate process
|
|
# (QuartoRunner runs `decktape ...`), never linked into the app.
|
|
#
|
|
# Puppeteer downloads its Chromium into PUPPETEER_CACHE_DIR during the global
|
|
# install; we put it in a world-readable /opt path so the www-data runtime user
|
|
# can launch it. Playwright is used only as a robust, distro-aware installer for
|
|
# Chromium's system libraries (handles Ubuntu Noble's t64 package renames).
|
|
ENV PUPPETEER_CACHE_DIR=/opt/puppeteer
|
|
RUN npm install -g decktape \
|
|
&& npx --yes playwright@latest install-deps chromium \
|
|
&& chmod -R a+rX /opt/puppeteer \
|
|
&& rm -rf /root/.npm /root/.cache
|
|
|
|
# Install TeX Live (for compiling .tex projects with latexmk)
|
|
# -----------------------------------------------------------------------
|
|
# Verso compiles .qmd with Quarto and .tex with latexmk; both engines live
|
|
# side by side.
|
|
#
|
|
# MINIMAL install (current): the upstream-Overleaf approach — scheme-basic
|
|
# (~300 MB) plus a few essential packages via tlmgr. Fast to build and small.
|
|
# Many documents that need extra packages (tikz, beamer, siunitx, extra
|
|
# fonts, ...) will NOT compile out of the box; users can be told to keep
|
|
# those projects in Quarto/Typst for now.
|
|
#
|
|
# TO GO FULL LATER (when the project is mature): change
|
|
# selected_scheme scheme-basic -> scheme-full
|
|
# and optionally drop the explicit `tlmgr install` line. That single change
|
|
# restores a complete LaTeX toolchain at the cost of size/build time.
|
|
# Alternatively add individual packages to the `tlmgr install` list below.
|
|
# -----------------------------------------------------------------------
|
|
ARG TEXLIVE_MIRROR=https://mirror.ox.ac.uk/sites/ctan.org/systems/texlive/tlnet
|
|
ENV PATH="${PATH}:/usr/local/texlive/bin/x86_64-linux"
|
|
|
|
RUN mkdir /install-tl-unx \
|
|
&& curl -sSL ${TEXLIVE_MIRROR}/install-tl-unx.tar.gz \
|
|
| tar -xzC /install-tl-unx --strip-components=1 \
|
|
&& echo "tlpdbopt_autobackup 0" >> /install-tl-unx/texlive.profile \
|
|
&& echo "tlpdbopt_install_docfiles 0" >> /install-tl-unx/texlive.profile \
|
|
&& echo "tlpdbopt_install_srcfiles 0" >> /install-tl-unx/texlive.profile \
|
|
&& echo "selected_scheme scheme-basic" >> /install-tl-unx/texlive.profile \
|
|
&& echo "TEXDIR /usr/local/texlive" >> /install-tl-unx/texlive.profile \
|
|
&& /install-tl-unx/install-tl \
|
|
-profile /install-tl-unx/texlive.profile \
|
|
-repository ${TEXLIVE_MIRROR} \
|
|
&& /usr/local/texlive/bin/x86_64-linux/tlmgr install \
|
|
--repository ${TEXLIVE_MIRROR} \
|
|
latexmk \
|
|
texcount \
|
|
&& rm -rf /install-tl-unx
|
|
|
|
|
|
# Set up overleaf user and home directory
|
|
# -----------------------------------------
|
|
RUN adduser --system --group --home /overleaf --no-create-home overleaf && \
|
|
mkdir -p /var/lib/overleaf && \
|
|
chown www-data:www-data /var/lib/overleaf && \
|
|
mkdir -p /var/log/overleaf && \
|
|
chown www-data:www-data /var/log/overleaf && \
|
|
mkdir -p /var/lib/overleaf/data/template_files && \
|
|
chown www-data:www-data /var/lib/overleaf/data/template_files
|