From 237481da6b8c736e742b28a0dd9860c859ef3133 Mon Sep 17 00:00:00 2001 From: Nikola Jovanovic Date: Mon, 13 Jul 2026 19:35:50 +0200 Subject: [PATCH 1/2] #9 - Build xberg PHP extension alongside kreuzberg in 8.5 image --- 8.5/Dockerfile | 73 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/8.5/Dockerfile b/8.5/Dockerfile index df8c8e3..0289200 100644 --- a/8.5/Dockerfile +++ b/8.5/Dockerfile @@ -40,7 +40,8 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" ARG KREUZBERG_VERSION=v4.9.8 -RUN git clone --depth 1 --branch ${KREUZBERG_VERSION} https://github.com/kreuzberg-dev/kreuzberg.git /tmp/kreuzberg \ +# v4 LTS moved to kreuzberg-lts; the old repo redirects to xberg-io/xberg which has no v4 tags +RUN git clone --depth 1 --branch ${KREUZBERG_VERSION} https://github.com/kreuzberg-dev/kreuzberg-lts.git /tmp/kreuzberg \ && cd /tmp/kreuzberg/crates/kreuzberg-php \ && for i in 1 2 3 4 5; do \ cargo build --release && break || { \ @@ -50,6 +51,62 @@ RUN git clone --depth 1 --branch ${KREUZBERG_VERSION} https://github.com/kreuzbe done \ && test -f /tmp/kreuzberg/target/release/libkreuzberg_php.so +# ----------------------------------------------------- +# Build xberg PHP extension from Rust source +# (successor to kreuzberg, see kreuzberg migration docs) +# ----------------------------------------------------- +FROM php:$PHP_VERSION-fpm AS xberg-builder + +# Install build dependencies (tesseract is vendored/statically built by xberg) +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + cmake \ + g++ \ + pkg-config \ + libssl-dev \ + libmagic-dev \ + libuv1-dev \ + libde265-dev \ + libaom-dev \ + libx265-dev \ + libdav1d-dev \ + libnuma-dev \ + clang \ + curl \ + file \ + git \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# xberg's heic feature links system libheif >= 1.21; trixie ships 1.19 +ARG LIBHEIF_VERSION=1.23.0 +RUN curl -fsSL "https://github.com/strukturag/libheif/releases/download/v${LIBHEIF_VERSION}/libheif-${LIBHEIF_VERSION}.tar.gz" | tar xz -C /tmp \ + && cmake -S /tmp/libheif-${LIBHEIF_VERSION} -B /tmp/libheif-build \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DWITH_EXAMPLES=OFF \ + -DWITH_GDK_PIXBUF=OFF \ + -DBUILD_TESTING=OFF \ + && cmake --build /tmp/libheif-build -j"$(nproc)" \ + && cmake --install /tmp/libheif-build \ + && rm -rf /tmp/libheif-* + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" + +ARG XBERG_VERSION=v1.0.0-rc.28 +RUN git clone --depth 1 --recurse-submodules --shallow-submodules --branch ${XBERG_VERSION} https://github.com/xberg-io/xberg.git /tmp/xberg \ + && cd /tmp/xberg/crates/xberg-php \ + && for i in 1 2 3 4 5; do \ + cargo build --release && break || { \ + echo "cargo build failed (attempt $i), retrying in $((i*30))s..."; \ + sleep $((i*30)); \ + }; \ + done \ + && test -f /tmp/xberg/target/release/libxberg_php.so + # ----------------------------------------------------- # App Itself # ----------------------------------------------------- @@ -96,6 +153,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD_DEPS} \ jpegoptim \ optipng \ pngquant \ + # libheif codec runtimes for ext-xberg + libde265-0 \ + libaom3 \ + libx265-215 \ + libdav1d7 \ + libnuma1 \ && rm -rf /var/lib/apt/lists/* @@ -104,6 +167,14 @@ COPY --from=kreuzberg-builder /tmp/kreuzberg/target/release/libkreuzberg_php.so RUN mv /tmp/kreuzberg.so $(php -r "echo ini_get('extension_dir');")/kreuzberg.so \ && echo "#extension=kreuzberg" > $PHP_INI_DIR/conf.d/kreuzberg.ini +# Xberg PHP extension (built from Rust source), successor to kreuzberg +COPY --from=xberg-builder /tmp/xberg/target/release/libxberg_php.so /tmp/xberg.so +RUN mv /tmp/xberg.so $(php -r "echo ini_get('extension_dir');")/xberg.so \ + && echo "#extension=xberg" > $PHP_INI_DIR/conf.d/xberg.ini + +# libheif >= 1.21 runtime for ext-xberg (apt ships older); resolved via LD_LIBRARY_PATH=/usr/local/lib +COPY --from=xberg-builder /usr/local/lib/libheif.so.1* /usr/local/lib/ + # Install latest libvips # @see https://github.com/dooman87/imagemagick-docker/blob/main/Dockerfile.bookworm ARG VIPS_VERSION=8.18.2 From ddf68f4cbaae6e3d613c03cffdab85452b15aaeb Mon Sep 17 00:00:00 2001 From: Nikola Jovanovic Date: Tue, 14 Jul 2026 13:42:12 +0200 Subject: [PATCH 2/2] #9 - Remove kreuzberg extension, keep only xberg --- 8.5/Dockerfile | 44 +------------------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/8.5/Dockerfile b/8.5/Dockerfile index 0289200..04ae98f 100644 --- a/8.5/Dockerfile +++ b/8.5/Dockerfile @@ -14,46 +14,9 @@ RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH xcaddy build \ --with github.com/ueffel/caddy-brotli \ --with github.com/ggicci/caddy-jwt@28e0de3db362a787564352ec22e97aa743a371f3 #1.2.0 -# ----------------------------------------------------- -# Build kreuzberg PHP extension from Rust source -# ----------------------------------------------------- -FROM php:$PHP_VERSION-fpm AS kreuzberg-builder - -# Install build dependencies -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - cmake \ - g++ \ - pkg-config \ - libssl-dev \ - libleptonica-dev \ - libtesseract-dev \ - clang \ - curl \ - file \ - git \ - && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y -ENV PATH="/root/.cargo/bin:${PATH}" - -ARG KREUZBERG_VERSION=v4.9.8 -# v4 LTS moved to kreuzberg-lts; the old repo redirects to xberg-io/xberg which has no v4 tags -RUN git clone --depth 1 --branch ${KREUZBERG_VERSION} https://github.com/kreuzberg-dev/kreuzberg-lts.git /tmp/kreuzberg \ - && cd /tmp/kreuzberg/crates/kreuzberg-php \ - && for i in 1 2 3 4 5; do \ - cargo build --release && break || { \ - echo "cargo build failed (attempt $i), retrying in $((i*30))s..."; \ - sleep $((i*30)); \ - }; \ - done \ - && test -f /tmp/kreuzberg/target/release/libkreuzberg_php.so - # ----------------------------------------------------- # Build xberg PHP extension from Rust source -# (successor to kreuzberg, see kreuzberg migration docs) +# (successor to kreuzberg) # ----------------------------------------------------- FROM php:$PHP_VERSION-fpm AS xberg-builder @@ -162,11 +125,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends ${BUILD_DEPS} \ && rm -rf /var/lib/apt/lists/* -# Kreuzberg PHP extension (built from Rust source) -COPY --from=kreuzberg-builder /tmp/kreuzberg/target/release/libkreuzberg_php.so /tmp/kreuzberg.so -RUN mv /tmp/kreuzberg.so $(php -r "echo ini_get('extension_dir');")/kreuzberg.so \ - && echo "#extension=kreuzberg" > $PHP_INI_DIR/conf.d/kreuzberg.ini - # Xberg PHP extension (built from Rust source), successor to kreuzberg COPY --from=xberg-builder /tmp/xberg/target/release/libxberg_php.so /tmp/xberg.so RUN mv /tmp/xberg.so $(php -r "echo ini_get('extension_dir');")/xberg.so \