From 2121a7763ab5987385096d7124f98370bda69e27 Mon Sep 17 00:00:00 2001 From: nocci Date: Fri, 12 Dec 2025 12:38:53 +0000 Subject: [PATCH] Add sync service and fix tarball detection for taler-exchange/merchant --- .env.example | 10 +++++++ Dockerfile | 57 ++++++++++++++++++++++++++++++++++++--- compose.yml | 21 ++++++++++++++- scripts/fetch-tarballs.sh | 3 +++ sync/conf/taler-sync.conf | 11 ++++++++ 5 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 sync/conf/taler-sync.conf diff --git a/.env.example b/.env.example index 662bc36..1025436 100644 --- a/.env.example +++ b/.env.example @@ -25,6 +25,16 @@ LIBEUFIN_USER=demogeld LIBEUFIN_USER_PASSWORD= LIBEUFIN_DEBIT_THRESHOLD=DEMOGELD:1000000 +# Sync service +TALER_SYNC_DB=talersync +TALER_SYNC_DB_USER=talersync +TALER_SYNC_DB_PASSWORD=talersync +SYNC_BASE_URL=https://sync.domain.tld/ +SYNC_HOST=sync.domain.tld +SYNC_PORT=8087 +SYNC_TARBALL_URL= +SYNC_REF=master + # Exchange offline account enablement ENABLE_EXCHANGE_ACCOUNT=0 PAYTO_URI=payto://x-taler-bank/yourbank.domain.tld/demogeld?receiver-name=demogeld diff --git a/Dockerfile b/Dockerfile index 2842ee6..ff19724 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,11 +7,13 @@ 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 \ @@ -69,8 +71,8 @@ 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)"; \ + 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; \ @@ -114,8 +116,8 @@ RUN set -e; \ 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)"; \ + 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; \ @@ -181,6 +183,53 @@ RUN set -e; \ 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 diff --git a/compose.yml b/compose.yml index 8326276..82a9bea 100644 --- a/compose.yml +++ b/compose.yml @@ -93,9 +93,27 @@ services: ports: - "8080:8080" + sync: + image: taler-stack:build + entrypoint: ["/usr/local/bin/with-dbinit.sh"] + command: ["taler-sync-httpd", "-c", "/etc/taler-sync/taler-sync.conf"] + environment: + DB_NAME: ${TALER_SYNC_DB:-talersync} + INIT_CMD: taler-sync-dbinit -c /etc/taler-sync/taler-sync.conf + PGHOST: ${POSTGRES_HOST:-postgres} + PGUSER: ${POSTGRES_ADMIN_USER:-postgres} + PGPASSWORD: ${POSTGRES_PASSWORD:-taler} + SYNC_BASE_URL: ${SYNC_BASE_URL:-https://sync.domain.tld/} + SYNC_HOST: ${SYNC_HOST:-sync.domain.tld} + depends_on: [postgres] + volumes: + - ./sync/conf:/etc/taler-sync + ports: + - "8087:8087" + caddy: image: caddy:2 - depends_on: [exchange, merchant, bank] + depends_on: [exchange, merchant, bank, sync] ports: - "80:80" - "443:443" @@ -108,6 +126,7 @@ services: BANK_HOST: ${BANK_HOST:-ob.antifa.ltd} EXCHANGE_HOST: ${EXCHANGE_HOST:-exchange.antifa.ltd} MERCHANT_HOST: ${MERCHANT_HOST:-merchant.antifa.ltd} + SYNC_HOST: ${SYNC_HOST:-sync.domain.tld} WORDPRESS_HOST: ${WORDPRESS_HOST:-wordpress.domain.tld} mariadb: diff --git a/scripts/fetch-tarballs.sh b/scripts/fetch-tarballs.sh index 527aeec..0a3338a 100755 --- a/scripts/fetch-tarballs.sh +++ b/scripts/fetch-tarballs.sh @@ -23,12 +23,14 @@ GNUNET_VERSION="${GNUNET_VERSION:-0.21.2}" EXCHANGE_VERSION="${EXCHANGE_VERSION:-1.0.0}" MERCHANT_VERSION="${MERCHANT_VERSION:-1.1.3}" LIBEUFIN_VERSION="${LIBEUFIN_VERSION:-1.2.0}" +SYNC_VERSION="${SYNC_VERSION:-1.1.0}" # GNUnet tarball is hosted under the GNUnet mirror, Taler components under the Taler mirror. GNUNET_URL="${GNUNET_TARBALL_URL:-https://ftp.gnu.org/gnu/gnunet/gnunet-${GNUNET_VERSION}.tar.gz}" EXCHANGE_URL="${EXCHANGE_TARBALL_URL:-https://ftp.fau.de/gnu/taler/taler-exchange-${EXCHANGE_VERSION}.tar.gz}" MERCHANT_URL="${MERCHANT_TARBALL_URL:-https://ftp.fau.de/gnu/taler/taler-merchant-${MERCHANT_VERSION}.tar.gz}" LIBEUFIN_URL="${LIBEUFIN_TARBALL_URL:-https://ftp.fau.de/gnu/taler/libeufin-${LIBEUFIN_VERSION}.tar.gz}" +SYNC_URL="${SYNC_TARBALL_URL:-https://ftp.fau.de/gnu/taler/sync-${SYNC_VERSION}.tar.gz}" fetch() { local url="$1" @@ -49,5 +51,6 @@ fetch "$GNUNET_URL" fetch "$EXCHANGE_URL" fetch "$MERCHANT_URL" fetch "$LIBEUFIN_URL" +fetch "$SYNC_URL" echo "Done. Tarballs are in ${VENDOR_DIR}" diff --git a/sync/conf/taler-sync.conf b/sync/conf/taler-sync.conf new file mode 100644 index 0000000..4948e52 --- /dev/null +++ b/sync/conf/taler-sync.conf @@ -0,0 +1,11 @@ +[sync] +# Public URL where the sync service is reachable +BASE_URL = https://sync.domain.tld/ +SERVE = tcp +PORT = 8087 +BIND_TO = 0.0.0.0 +DB = postgres + +[syncdb-postgres] +# Adjust credentials/host in .env and ensure they match this URL +CONFIG = postgres://talersync:talersync@postgres:5432/talersync