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 ARG SYNC_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= ARG SYNC_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/taler-exchange*.tar.gz /vendor/exchange*.tar.gz >/dev/null 2>&1; then \ LOCAL_TARBALL="$(ls /vendor/taler-exchange*.tar.gz /vendor/exchange*.tar.gz 2>/dev/null | 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 taler-exchange-* exchange-* 2>/dev/null | 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 taler-exchange-* exchange-* 2>/dev/null | 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; \ echo "Using EXCHANGE_DIR=${EXCHANGE_DIR} (tar=${EXCHANGE_TAR})"; \ 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/taler-merchant*.tar.gz /vendor/merchant*.tar.gz >/dev/null 2>&1; then \ LOCAL_TARBALL="$(ls /vendor/taler-merchant*.tar.gz /vendor/merchant*.tar.gz 2>/dev/null | 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 taler-merchant-* merchant-* 2>/dev/null | 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 # Taler Sync (optional wallet backup service) RUN set -e; \ SYNC_DIR=""; SYNC_TAR=0; \ if ls /vendor/sync*.tar.gz >/dev/null 2>&1; then \ LOCAL_TARBALL="$(ls /vendor/sync*.tar.gz | head -1)"; \ echo "Using local Sync tarball from ${LOCAL_TARBALL}"; \ mkdir -p /src && cd /src; \ cp "${LOCAL_TARBALL}" sync.tar.gz; \ tar xzf sync.tar.gz; \ SYNC_DIR="$(ls -d sync-* | head -1)"; \ SYNC_TAR=1; \ elif [ -n "${SYNC_TARBALL_URL}" ]; then \ echo "Fetching Sync tarball ${SYNC_TARBALL_URL}"; \ mkdir -p /src && cd /src; \ curl -L "${SYNC_TARBALL_URL}" -o sync.tar.gz; \ tar xzf sync.tar.gz; \ SYNC_DIR="$(ls -d sync-* | head -1)"; \ SYNC_TAR=1; \ else \ git clone --depth 1 --branch "${SYNC_REF}" https://git.taler.net/sync.git /src/sync; \ SYNC_DIR="/src/sync"; \ fi; \ if [ "${SYNC_TAR}" = "1" ]; then \ if [ -f "${SYNC_DIR}/configure" ]; then \ echo "Using existing configure for Sync tarball"; \ else \ set +e; \ (cd "${SYNC_DIR}" && autoreconf -fi); \ rc=$?; \ set -e; \ if [ $rc -ne 0 ]; then \ echo "Autoreconf failed for Sync tarball; falling back to git clone ${SYNC_REF}"; \ rm -rf "${SYNC_DIR}"; \ git clone --depth 1 --branch "${SYNC_REF}" https://git.taler.net/sync.git /src/sync; \ SYNC_DIR="/src/sync"; \ cd "${SYNC_DIR}" && env GNUNET_PREFIX=/usr ./bootstrap; \ fi; \ fi; \ else \ if [ ! -f "${SYNC_DIR}/configure" ]; then \ cd "${SYNC_DIR}" && env GNUNET_PREFIX=/usr ./bootstrap; \ else \ echo "Skipping bootstrap for Sync (configure present)"; \ fi; \ fi; \ cd "${SYNC_DIR}" && env GNUNET_PREFIX=/usr GIT_CONFIG_NOSYSTEM=1 GIT_DIR= GIT_WORK_TREE=. ./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