From 90e745f1600e114dee4a00c63c77f0e724c84866 Mon Sep 17 00:00:00 2001 From: satoshi Date: Mon, 13 Apr 2026 18:10:17 +0300 Subject: [PATCH] Align Dockerfile and entrypoint with upstream KamadoPool build Previous scaffold referenced a non-existent 'make ckpool-src' target. Rewritten to inline the real build steps from the upstream KamadoPool repo: clone ckpool at CKPOOL_COMMIT, apply patches/*.patch, build with the same portable CFLAGS the ckpool Dockerfile uses. The ui and api stages now match api/Dockerfile exactly. Entrypoint now uses the same env-var interface as the upstream ckpool entrypoint (POOL_BTCADDRESS, BITCOIN_RPC_*, STRATUM_PORT, etc.) and renders ckpool.conf from the bundled template via sed. kamado-api env vars corrected to match config.FromEnv (BITCOIN_RPC_URL, CKPOOL_SOCKDIR, CKPOOL_LOGFILE, LISTEN_ADDR). --- Dockerfile | 60 +++++++++++++++-------- docker_entrypoint.sh | 110 +++++++++++++++++++++++-------------------- 2 files changed, 98 insertions(+), 72 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8ba8c34..3fde11d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,19 +2,22 @@ # # Kamado Pool StartOS package image. # -# Clones KamadoPool at a pinned SHA, builds the patched ckpool-solo -# binary, builds the Go api binary with embedded Svelte UI, then -# assembles a small runtime image that supervises both processes. +# Clones the KamadoPool repo at a pinned SHA, then inlines the ckpool, +# ui, and api build stages (mirroring ckpool/Dockerfile and api/Dockerfile +# in the upstream repo). Final runtime image has both binaries plus the +# StartOS entrypoint that supervises them. # -# TODO: set KAMADO_REPO + KAMADO_SHA to a pushed commit before -# running `make` — the defaults below are placeholders and the build -# WILL fail until the KamadoPool source repo is pushed to GitHub. +# TODO: set KAMADO_SHA to a real pushed commit before running `make`. +# The placeholder below is a valid 40-char hex string to keep tooling +# happy but the clone checkout will fail until this is updated. ARG KAMADO_REPO=https://github.com/Relaxo143/KamadoPool.git ARG KAMADO_SHA=0000000000000000000000000000000000000000 +ARG CKPOOL_REPO=https://bitbucket.org/ckolivas/ckpool.git +ARG CKPOOL_COMMIT=cfb0f83b70d7b382b85d2bd0710cf4cb2dda4007 ARG ARCH -# ---------- stage 1: fetch source ---------- +# ---------- stage 1: fetch Kamado source ---------- FROM debian:bookworm-slim AS source ARG KAMADO_REPO ARG KAMADO_SHA @@ -25,22 +28,34 @@ WORKDIR /src RUN git clone "${KAMADO_REPO}" kamado \ && cd kamado && git checkout "${KAMADO_SHA}" -# ---------- stage 2: build ckpool ---------- +# ---------- stage 2: build patched ckpool ---------- +# Mirrors KamadoPool/ckpool/Dockerfile: clones upstream ckpool at the +# pinned commit, applies Kamado patches, builds with portable CFLAGS. FROM debian:bookworm-slim AS ckpool-build +ARG CKPOOL_REPO +ARG CKPOOL_COMMIT RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential autoconf automake libtool pkg-config \ - yasm libzmq3-dev git ca-certificates \ + libzmq3-dev ca-certificates git \ && rm -rf /var/lib/apt/lists/* -COPY --from=source /src/kamado /src/kamado -WORKDIR /src/kamado -RUN make ckpool-src \ - && cd ckpool/src \ +WORKDIR /build +RUN git clone "${CKPOOL_REPO}" ckpool \ + && cd ckpool && git checkout "${CKPOOL_COMMIT}" +COPY --from=source /src/kamado/ckpool/patches/ /tmp/kamado-patches/ +RUN set -eux; cd /build/ckpool; \ + for p in /tmp/kamado-patches/*.patch; do \ + [ -f "$p" ] || continue; \ + echo "Applying $(basename "$p")"; \ + git apply --verbose "$p"; \ + done +RUN cd /build/ckpool \ && ./autogen.sh \ - && ./configure --without-ckdb --prefix=/usr/local \ - && make -j"$(nproc)" \ - && install -Dm755 src/ckpool /out/usr/local/bin/ckpool + && CFLAGS="-O2 -Wall -pipe" ./configure --prefix=/usr/local \ + && make -j"$(nproc)" +RUN install -Dm755 /build/ckpool/src/ckpool /out/usr/local/bin/ckpool \ + && install -Dm755 /build/ckpool/src/ckpmsg /out/usr/local/bin/ckpmsg -# ---------- stage 3: build UI ---------- +# ---------- stage 3: build the Svelte UI ---------- FROM node:22-bookworm-slim AS ui-build WORKDIR /ui COPY --from=source /src/kamado/ui/package.json ./ @@ -48,9 +63,11 @@ RUN npm install --no-audit --no-fund COPY --from=source /src/kamado/ui/ ./ RUN npm run build -# ---------- stage 4: build Go api with embedded UI ---------- +# ---------- stage 4: build the Go api with embedded UI ---------- FROM golang:1.22-bookworm AS api-build WORKDIR /src +COPY --from=source /src/kamado/api/go.mod ./ +RUN go mod download 2>/dev/null || true COPY --from=source /src/kamado/api/ ./ RUN rm -rf internal/webui/dist && mkdir -p internal/webui/dist COPY --from=ui-build /ui/dist/ internal/webui/dist/ @@ -66,7 +83,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ tini ca-certificates curl libzmq5 \ && rm -rf /var/lib/apt/lists/* -# yq for parsing StartOS config.yaml inside the entrypoint +# yq for reading StartOS config.yaml in the entrypoint RUN set -eu; \ case "${ARCH}" in \ x86_64|amd64) YQ_ARCH=amd64 ;; \ @@ -78,9 +95,12 @@ RUN set -eu; \ chmod +x /usr/local/bin/yq COPY --from=ckpool-build /out/usr/local/bin/ckpool /usr/local/bin/ckpool +COPY --from=ckpool-build /out/usr/local/bin/ckpmsg /usr/local/bin/ckpmsg COPY --from=api-build /out/kamado-api /usr/local/bin/kamado-api +COPY --from=source /src/kamado/ckpool/config/ckpool.conf.template /etc/ckpool/ckpool.conf.template COPY docker_entrypoint.sh /usr/local/bin/docker_entrypoint.sh -RUN chmod +x /usr/local/bin/docker_entrypoint.sh +RUN chmod +x /usr/local/bin/docker_entrypoint.sh \ + && mkdir -p /run/ckpool /var/log/ckpool /var/lib/kamado EXPOSE 3333 8080 WORKDIR /root diff --git a/docker_entrypoint.sh b/docker_entrypoint.sh index 620b6ef..cf42899 100755 --- a/docker_entrypoint.sh +++ b/docker_entrypoint.sh @@ -1,18 +1,14 @@ #!/bin/bash # Kamado Pool StartOS entrypoint. # -# Renders ckpool.conf from /root/.kamado/start9/config.yaml, resolves -# which bitcoind variant the user picked (mainnet vs testnet4), then -# supervises ckpool and kamado-api as a pair — if either exits, tear -# the container down so StartOS restarts the service cleanly. +# Reads /root/.kamado/start9/config.yaml via yq, resolves the chosen +# bitcoind variant (mainnet vs testnet4), exports the env vars the +# upstream ckpool entrypoint expects, renders ckpool.conf from the +# template shipped alongside this script, and then supervises +# ckpool-solo + kamado-api as a pair. set -euo pipefail CONFIG_FILE="/root/.kamado/start9/config.yaml" -CKPOOL_DIR="/root/.ckpool" -CKPOOL_CONF="${CKPOOL_DIR}/ckpool.conf" -CKPOOL_LOG_DIR="${CKPOOL_DIR}/logs" -mkdir -p "${CKPOOL_DIR}" "${CKPOOL_LOG_DIR}" - if [[ ! -f "${CONFIG_FILE}" ]]; then echo "kamado-entrypoint: config file missing: ${CONFIG_FILE}" >&2 exit 1 @@ -23,12 +19,12 @@ q() { yq -r "$1" "${CONFIG_FILE}"; } BITCOIND_VARIANT=$(q '.bitcoind.type') case "${BITCOIND_VARIANT}" in bitcoind) - BITCOIN_HOST="bitcoind.embassy" - BITCOIN_PORT=8332 + export BITCOIN_RPC_HOST="bitcoind.embassy" + export BITCOIN_RPC_PORT=8332 ;; bitcoind-testnet) - BITCOIN_HOST="bitcoind-testnet.embassy" - BITCOIN_PORT=48332 + export BITCOIN_RPC_HOST="bitcoind-testnet.embassy" + export BITCOIN_RPC_PORT=48332 ;; *) echo "kamado-entrypoint: unknown bitcoind variant: ${BITCOIND_VARIANT}" >&2 @@ -36,53 +32,63 @@ case "${BITCOIND_VARIANT}" in ;; esac -BITCOIN_USER=$(q '.bitcoind.user') -BITCOIN_PASS=$(q '.bitcoind.password') -POOL_BTCADDRESS=$(q '.pool-address') -POOL_IDENTIFIER=$(q '.pool-identifier') -STRATUM_PORT=$(q '.stratum-port // 3333') -DROPIDLE=$(q '.dropidle // 0') -STARTDIFF=$(q '.startdiff // 16384') -MINDIFF=$(q '.mindiff // 1000') -MAXDIFF=$(q '.maxdiff // 0') +export BITCOIN_RPC_USER=$(q '.bitcoind.user') +export BITCOIN_RPC_PASSWORD=$(q '.bitcoind.password') +export POOL_BTCADDRESS=$(q '.pool-address') +export POOL_BTCSIG=$(q '.pool-identifier') +export STRATUM_PORT=$(q '.stratum-port // 3333') +export STARTDIFF=$(q '.startdiff // 16384') +export MINDIFF=$(q '.mindiff // 1000') +export MAXDIFF=$(q '.maxdiff // 0') +export DROPIDLE=$(q '.dropidle // 0') LOG_LEVEL=$(q '.log-level // "info"') -cat > "${CKPOOL_CONF}" < "${CONF}" +sed -i '/"zmqblock":/d' "${CONF}" + +echo "kamado-entrypoint: starting ckpool (solo, ${BITCOIND_VARIANT}) on port ${STRATUM_PORT}" +/usr/local/bin/ckpool --btcsolo --config "${CONF}" --sockdir "${SOCKET_DIR}" --log-shares & CKPOOL_PID=$! -export KAMADO_CKPOOL_SOCKET="${CKPOOL_DIR}/solo/listener" -export KAMADO_CKPOOL_LOGFILE="${CKPOOL_LOG_DIR}/ckpool.log" -export KAMADO_BITCOIND_URL="http://${BITCOIN_HOST}:${BITCOIN_PORT}" -export KAMADO_BITCOIND_USER="${BITCOIN_USER}" -export KAMADO_BITCOIND_PASS="${BITCOIN_PASS}" -export KAMADO_HTTP_ADDR=":8080" +export LISTEN_ADDR=":8080" +export CKPOOL_SOCKDIR="${SOCKET_DIR}" +export CKPOOL_LOGFILE="${LOGDIR}/ckpool.log" +export BITCOIN_RPC_URL="http://${BITCOIN_RPC_HOST}:${BITCOIN_RPC_PORT}" +export POLL_INTERVAL=5s export KAMADO_LOG_LEVEL="${LOG_LEVEL}" echo "kamado-entrypoint: starting kamado-api" -kamado-api & +/usr/local/bin/kamado-api & API_PID=$! term() {