187 lines
7.9 KiB
Docker
187 lines
7.9 KiB
Docker
FROM debian:sid
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
# Pin refs (branch/tag/commit) for shallow clones; adjust as needed.
|
|
ARG GNUNET_REF=v0.26.1
|
|
ARG EXCHANGE_REF=master
|
|
ARG MERCHANT_REF=master
|
|
ARG LIBEUFIN_REF=master
|
|
# Optional tarball URLs (when set, git clone is skipped)
|
|
ARG GNUNET_TARBALL_URL=
|
|
ARG EXCHANGE_TARBALL_URL=
|
|
ARG MERCHANT_TARBALL_URL=
|
|
ARG LIBEUFIN_TARBALL_URL=
|
|
|
|
RUN apt-get update && apt-get install -y \
|
|
build-essential git automake autoconf autopoint libtool pkg-config \
|
|
libgnutls28-dev libjansson-dev libsqlite3-dev libunistring-dev \
|
|
libcurl4-openssl-dev libmicrohttpd-dev libgcrypt20-dev libsodium-dev \
|
|
postgresql-client curl gnupg gettext gettext-base \
|
|
openjdk-17-jdk maven \
|
|
meson ninja-build \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Provide optional vendor tarballs (e.g., GNUnet) to the build
|
|
COPY vendor/ /vendor/
|
|
|
|
# GNUnet (falls nicht schon systemweit neu genug)
|
|
RUN set -e; \
|
|
mkdir -p /src && cd /src; \
|
|
GNUNET_DIR=""; \
|
|
if ls /vendor/gnunet*.tar.gz >/dev/null 2>&1; then \
|
|
LOCAL_TARBALL="$(ls /vendor/gnunet*.tar.gz | head -1)"; \
|
|
echo "Using local GNUnet tarball from ${LOCAL_TARBALL}"; \
|
|
cp "${LOCAL_TARBALL}" gnunet.tar.gz; \
|
|
tar xzf gnunet.tar.gz; \
|
|
GNUNET_DIR="$(ls -d gnunet-* | head -1)"; \
|
|
if [ ! -f "${GNUNET_DIR}/meson.build" ]; then \
|
|
echo "Local tarball seems incomplete; falling back to git clone ${GNUNET_REF}"; \
|
|
rm -rf "${GNUNET_DIR}"; \
|
|
git clone --depth 1 --branch "${GNUNET_REF}" https://git.taler.net/gnunet.git gnunet; \
|
|
GNUNET_DIR="gnunet"; \
|
|
fi; \
|
|
elif [ -n "${GNUNET_TARBALL_URL}" ]; then \
|
|
echo "Fetching GNUnet tarball ${GNUNET_TARBALL_URL}"; \
|
|
curl -L "${GNUNET_TARBALL_URL}" -o gnunet.tar.gz; \
|
|
tar xzf gnunet.tar.gz; \
|
|
GNUNET_DIR="$(ls -d gnunet-* | head -1)"; \
|
|
if [ ! -f "${GNUNET_DIR}/meson.build" ]; then \
|
|
echo "Tarball seems incomplete; falling back to git clone ${GNUNET_REF}"; \
|
|
rm -rf "${GNUNET_DIR}"; \
|
|
git clone --depth 1 --branch "${GNUNET_REF}" https://git.taler.net/gnunet.git gnunet; \
|
|
GNUNET_DIR="gnunet"; \
|
|
fi; \
|
|
else \
|
|
git clone --depth 1 --branch "${GNUNET_REF}" https://git.taler.net/gnunet.git gnunet; \
|
|
GNUNET_DIR="gnunet"; \
|
|
fi; \
|
|
if [ ! -f "${GNUNET_DIR}/doc/handbook/meson.build" ]; then \
|
|
echo "Creating stub doc/handbook/meson.build to satisfy Meson"; \
|
|
mkdir -p "${GNUNET_DIR}/doc/handbook"; \
|
|
printf "# auto-generated stub to skip handbook build\nsubdir_done()\n" > "${GNUNET_DIR}/doc/handbook/meson.build"; \
|
|
fi; \
|
|
cd "${GNUNET_DIR}" && ./bootstrap && \
|
|
./configure --prefix=/usr && make -j$(nproc) && make install
|
|
|
|
# Taler Exchange + Merchant
|
|
RUN set -e; \
|
|
# Exchange
|
|
EXCHANGE_DIR=""; \
|
|
EXCHANGE_TAR=0; \
|
|
if ls /vendor/exchange*.tar.gz >/dev/null 2>&1; then \
|
|
LOCAL_TARBALL="$(ls /vendor/exchange*.tar.gz | head -1)"; \
|
|
echo "Using local Exchange tarball from ${LOCAL_TARBALL}"; \
|
|
mkdir -p /src && cd /src; \
|
|
cp "${LOCAL_TARBALL}" exchange.tar.gz; \
|
|
tar xzf exchange.tar.gz; \
|
|
EXCHANGE_DIR="$(ls -d exchange-* | head -1)"; \
|
|
EXCHANGE_TAR=1; \
|
|
elif [ -n "${EXCHANGE_TARBALL_URL}" ]; then \
|
|
echo "Fetching Exchange tarball ${EXCHANGE_TARBALL_URL}"; \
|
|
mkdir -p /src && cd /src; \
|
|
curl -L "${EXCHANGE_TARBALL_URL}" -o exchange.tar.gz; \
|
|
tar xzf exchange.tar.gz; \
|
|
EXCHANGE_DIR="$(ls -d exchange-* | head -1)"; \
|
|
EXCHANGE_TAR=1; \
|
|
else \
|
|
git clone --depth 1 --branch "${EXCHANGE_REF}" https://git.taler.net/exchange.git /src/exchange; \
|
|
EXCHANGE_DIR="/src/exchange"; \
|
|
fi; \
|
|
if [ "${EXCHANGE_TAR}" = "1" ]; then \
|
|
if [ -f "${EXCHANGE_DIR}/configure" ]; then \
|
|
echo "Using existing configure for Exchange tarball"; \
|
|
else \
|
|
set +e; \
|
|
(cd "${EXCHANGE_DIR}" && autoreconf -fi); \
|
|
rc=$?; \
|
|
set -e; \
|
|
if [ $rc -ne 0 ]; then \
|
|
echo "Autoreconf failed for Exchange tarball; falling back to git clone ${EXCHANGE_REF}"; \
|
|
rm -rf "${EXCHANGE_DIR}"; \
|
|
git clone --depth 1 --branch "${EXCHANGE_REF}" https://git.taler.net/exchange.git /src/exchange; \
|
|
EXCHANGE_DIR="/src/exchange"; \
|
|
cd "${EXCHANGE_DIR}" && env GNUNET_PREFIX=/usr ./bootstrap; \
|
|
fi; \
|
|
fi; \
|
|
else \
|
|
if [ ! -f "${EXCHANGE_DIR}/configure" ]; then \
|
|
cd "${EXCHANGE_DIR}" && env GNUNET_PREFIX=/usr ./bootstrap; \
|
|
else \
|
|
echo "Skipping bootstrap for Exchange (configure present)"; \
|
|
fi; \
|
|
fi; \
|
|
cd "${EXCHANGE_DIR}" && env GNUNET_PREFIX=/usr GIT_CONFIG_NOSYSTEM=1 GIT_DIR= GIT_WORK_TREE=. ./configure --prefix=/usr && make -j$(nproc) && make install; \
|
|
# Merchant
|
|
MERCHANT_DIR=""; MERCHANT_TAR=0; \
|
|
if ls /vendor/merchant*.tar.gz >/dev/null 2>&1; then \
|
|
LOCAL_TARBALL="$(ls /vendor/merchant*.tar.gz | head -1)"; \
|
|
echo "Using local Merchant tarball from ${LOCAL_TARBALL}"; \
|
|
mkdir -p /src && cd /src; \
|
|
cp "${LOCAL_TARBALL}" merchant.tar.gz; \
|
|
tar xzf merchant.tar.gz; \
|
|
MERCHANT_DIR="$(ls -d merchant-* | head -1)"; \
|
|
MERCHANT_TAR=1; \
|
|
elif [ -n "${MERCHANT_TARBALL_URL}" ]; then \
|
|
echo "Fetching Merchant tarball ${MERCHANT_TARBALL_URL}"; \
|
|
mkdir -p /src && cd /src; \
|
|
curl -L "${MERCHANT_TARBALL_URL}" -o merchant.tar.gz; \
|
|
tar xzf merchant.tar.gz; \
|
|
MERCHANT_DIR="$(ls -d merchant-* | head -1)"; \
|
|
MERCHANT_TAR=1; \
|
|
else \
|
|
git clone --depth 1 --branch "${MERCHANT_REF}" https://git.taler.net/merchant.git /src/merchant; \
|
|
MERCHANT_DIR="/src/merchant"; \
|
|
fi; \
|
|
if [ "${MERCHANT_TAR}" = "1" ]; then \
|
|
if [ -f "${MERCHANT_DIR}/configure" ]; then \
|
|
echo "Using existing configure for Merchant tarball"; \
|
|
else \
|
|
set +e; \
|
|
(cd "${MERCHANT_DIR}" && autoreconf -fi); \
|
|
rc=$?; \
|
|
set -e; \
|
|
if [ $rc -ne 0 ]; then \
|
|
echo "Autoreconf failed for Merchant tarball; falling back to git clone ${MERCHANT_REF}"; \
|
|
rm -rf "${MERCHANT_DIR}"; \
|
|
git clone --depth 1 --branch "${MERCHANT_REF}" https://git.taler.net/merchant.git /src/merchant; \
|
|
MERCHANT_DIR="/src/merchant"; \
|
|
cd "${MERCHANT_DIR}" && env GNUNET_PREFIX=/usr ./bootstrap; \
|
|
fi; \
|
|
fi; \
|
|
else \
|
|
if [ ! -f "${MERCHANT_DIR}/configure" ]; then \
|
|
cd "${MERCHANT_DIR}" && env GNUNET_PREFIX=/usr ./bootstrap; \
|
|
else \
|
|
echo "Skipping bootstrap for Merchant (configure present)"; \
|
|
fi; \
|
|
fi; \
|
|
cd "${MERCHANT_DIR}" && env GNUNET_PREFIX=/usr GIT_CONFIG_NOSYSTEM=1 GIT_DIR= GIT_WORK_TREE=. ./configure --prefix=/usr && make -j$(nproc) && make install
|
|
|
|
# LibEuFin (Bank)
|
|
RUN set -e; \
|
|
LIBEUFIN_DIR=""; \
|
|
if ls /vendor/libeufin*.tar.gz >/dev/null 2>&1; then \
|
|
LOCAL_TARBALL="$(ls /vendor/libeufin*.tar.gz | head -1)"; \
|
|
echo "Using local LibEuFin tarball from ${LOCAL_TARBALL}"; \
|
|
mkdir -p /src && cd /src; \
|
|
cp "${LOCAL_TARBALL}" libeufin.tar.gz; \
|
|
tar xzf libeufin.tar.gz; \
|
|
LIBEUFIN_DIR="$(ls -d libeufin-* | head -1)"; \
|
|
elif [ -n "${LIBEUFIN_TARBALL_URL}" ]; then \
|
|
echo "Fetching LibEuFin tarball ${LIBEUFIN_TARBALL_URL}"; \
|
|
mkdir -p /src && cd /src; \
|
|
curl -L "${LIBEUFIN_TARBALL_URL}" -o libeufin.tar.gz; \
|
|
tar xzf libeufin.tar.gz; \
|
|
LIBEUFIN_DIR="$(ls -d libeufin-* | head -1)"; \
|
|
else \
|
|
git clone --depth 1 --branch "${LIBEUFIN_REF}" https://git.taler.net/libeufin.git /src/libeufin; \
|
|
LIBEUFIN_DIR="/src/libeufin"; \
|
|
fi; \
|
|
cd "${LIBEUFIN_DIR}" && ./bootstrap && \
|
|
./configure --prefix=/usr && make -j$(nproc) && make install
|
|
|
|
# Shared entrypoint for dbinit + service start
|
|
COPY entrypoints/with-dbinit.sh /usr/local/bin/with-dbinit.sh
|
|
COPY scripts/enable-exchange-account.sh /usr/local/bin/enable-exchange-account.sh
|
|
RUN chmod +x /usr/local/bin/with-dbinit.sh /usr/local/bin/enable-exchange-account.sh
|