- Reads /opt/usr/canvas_record_info.json over SSH (pinned host key, restricted key), decodes Spoolman spool ids from the tag weight - Mirrors spools into CC2 Control's spool library and assigns slots, keeps its own slot mapping, sets Spoolman locations - Books the drop of CC2 Control's measured remaining weight to Spoolman after each print, idempotent across restarts and interrupted bookings - Dry-run by default; web UI for settings, SSH key, status and log - Tag generator for NFC Tools command chains (NTAG213/215/216) - Tests, mock environment, Dockerfile, Gitea Actions CI Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014GcEk5tkfFSYD6NTF66NkC
26 lines
865 B
Docker
26 lines
865 B
Docker
# syntax=docker/dockerfile:1
|
|
FROM python:3.12-slim AS base
|
|
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 PIP_NO_CACHE_DIR=1 PIP_DISABLE_PIP_VERSION_CHECK=1
|
|
WORKDIR /app
|
|
COPY requirements.txt .
|
|
RUN pip install -r requirements.txt
|
|
|
|
FROM base AS test
|
|
COPY requirements-dev.txt pytest.ini ./
|
|
RUN pip install -r requirements-dev.txt
|
|
COPY app ./app
|
|
COPY tests ./tests
|
|
RUN python -m pytest
|
|
|
|
FROM base AS runtime
|
|
ARG APP_VERSION=dev
|
|
ENV APP_VERSION=${APP_VERSION} DATA_DIR=/data PORT=5066
|
|
COPY app ./app
|
|
RUN useradd --uid 1000 --create-home bridge && mkdir -p /data && chown bridge:bridge /data
|
|
USER bridge
|
|
VOLUME ["/data"]
|
|
EXPOSE 5066
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s \
|
|
CMD python -c "import os,urllib.request; urllib.request.urlopen('http://127.0.0.1:%s/healthz' % os.environ.get('PORT','5066'), timeout=4)"
|
|
CMD ["python", "-m", "app.web"]
|