telegabber/staging.Dockerfile
2026-08-02 02:53:26 -04:00

79 lines
3 KiB
Docker

FROM golang:1.24-bullseye AS base
RUN apt-get update
RUN apt-get install -y libssl-dev cmake build-essential gperf libz-dev make git php libsignal-protocol-c-dev
FROM base AS tdlib
ARG TD_COMMIT
ARG MAKEOPTS
RUN git clone https://github.com/tdlib/td /src/
RUN git -C /src/ checkout "${TD_COMMIT}"
RUN mkdir build
WORKDIR /build/
RUN cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/compiled/ /src/
RUN cmake --build . --target prepare_cross_compiling ${MAKEOPTS}
WORKDIR /src/
RUN php SplitSource.php
WORKDIR /build/
RUN cmake --build . ${MAKEOPTS}
RUN make install
FROM base AS ntgcalls-build
ARG MAKEOPTS
# CMake >= 3.27 required; bookworm ships 3.25
ARG CMAKE_VERSION=3.31.6
RUN curl -fsSL https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-$(uname -m).tar.gz \
| tar xz -C /usr/local --strip-components=1
RUN apt-get install -y libasound2-dev libpulse-dev
COPY ntgcalls/ /ntgcalls-src/
WORKDIR /ntgcalls-build/
RUN cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=/ntgcalls-src/cmake/Toolchain.cmake \
-DPython_EXECUTABLE=$(which python3) \
-DSTATIC_BUILD=ON \
/ntgcalls-src/
RUN cmake --build . ${MAKEOPTS}
FROM base AS deps
COPY --from=tdlib /compiled/ /usr/local/
COPY --from=ntgcalls-build /ntgcalls-src/static-output/lib/libntgcalls.a /usr/local/lib/
COPY --from=ntgcalls-build /ntgcalls-src/static-output/include/ /usr/local/include/
COPY docker/resolv_shim.c /tmp/resolv_shim.c
RUN gcc -c -o /tmp/resolv_shim.o /tmp/resolv_shim.c && \
ar rcs /usr/local/lib/libresolv_shim.a /tmp/resolv_shim.o
# Needed by gopkg.in/hraban/opus.v2 (cgo pkg-config).
# Installed here (not in `base`) to keep tdlib/ntgcalls layers cached.
RUN apt-get install -y libopus-dev libopusfile-dev
# Isolate libntgcalls.a's bundled BoringSSL so its symbols don't displace
# system OpenSSL at link time (TDLib was built against the latter).
COPY docker/isolate_ntgcalls_crypto.sh /tmp/isolate_ntgcalls_crypto.sh
RUN SYS_CRYPTO=/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 \
SYS_SSL=/usr/lib/x86_64-linux-gnu/libssl.so.1.1 \
bash /tmp/isolate_ntgcalls_crypto.sh
FROM deps AS cache
COPY ./ /src
RUN git -C /src submodule update --init
WORKDIR /src
RUN --mount=type=cache,target=/go/pkg/mod go get
FROM cache AS build
ARG MAKEOPTS
ENV CGO_ENABLED=1
ENV CGO_CFLAGS="-I/usr/local/include"
ENV CGO_LDFLAGS="-L/usr/local/lib -lntgcalls -lresolv_shim -lstdc++ -lm -ldl -lrt -lpthread -lz -lresolv"
WORKDIR /src
# Bullseye only has the pre-fork libsignal-protocol-c packaged (libomemo-c
# is bookworm+) - GOTAGS=signal_legacy builds telegabber's OMEMO bindings
# against it, which only supports legacy/siacs OMEMO, not modern OMEMO 1/2.
RUN --mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg/mod \
make ${MAKEOPTS} GOTAGS=signal_legacy NO_MOLD=1
FROM scratch AS telegabber
COPY --from=build /src/release/telegabber /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/telegabber"]
FROM scratch AS binaries
COPY --from=telegabber /usr/local/bin/telegabber /