From 9cb0311544b11508e65bd0d3ed2d59ea79293895 Mon Sep 17 00:00:00 2001 From: tyler Date: Wed, 24 Jun 2026 18:20:22 -0600 Subject: [PATCH] fix(docker): install [sftp] extra so paramiko is in the runtime image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The backend Dockerfile only installed the [sqlcipher] extra, so paramiko wasn't on the path inside the container. SP25 + SP26's real-mode SFTP client needs paramiko to connect to the Gainwell MFT — the scheduler tick surfaced this as 'No module named paramiko' on the very first /api/admin/scheduler/tick against the dzinesco clearhouse with stub=false. Install both extras ([sqlcipher,sftp]) in builder and runtime stages. --- backend/Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 686b037..65179d3 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -35,7 +35,10 @@ COPY pyproject.toml ./ # the cached wheel metadata when the name+version matches. See git # history on this file for the long version. COPY src/ ./src/ -RUN pip wheel --no-cache-dir --wheel-dir /wheels '.[sqlcipher]' +# Install the sftp extra alongside sqlcipher so the real-mode SFTP +# client (paramiko) is available inside the container — required by +# SP25 + SP26 for live Gainwell MFT polling. +RUN pip wheel --no-cache-dir --wheel-dir /wheels '.[sqlcipher,sftp]' # ---------- runtime ---------- FROM python:3.11-slim-bookworm @@ -53,7 +56,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /app COPY --from=builder /wheels /wheels -RUN pip install --no-cache-dir --no-index --find-links /wheels 'cyclone[sqlcipher]' \ +RUN pip install --no-cache-dir --no-index --find-links /wheels 'cyclone[sqlcipher,sftp]' \ && rm -rf /wheels # NOTE: we deliberately do NOT drop privileges to the `cyclone` user.