From 07c6e32149d843fd7cfd331ed27752e013c5b5b4 Mon Sep 17 00:00:00 2001 From: Bram van Dartel Date: Thu, 2 Jan 2025 08:48:58 +0100 Subject: [PATCH] Development (#369) --- .github/workflows/build_release.yml | 2 +- Dockerfile | 173 ++++++++++----------------- examples/docker-compose.example.yaml | 2 +- 3 files changed, 65 insertions(+), 112 deletions(-) diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index deafc51..d297ede 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -24,7 +24,7 @@ concurrency: env: DOCKER_TARGET_REPO: xirixiz/dsmr-reader-docker DOCKERFILE: Dockerfile - DOCKER_TARGET_RELEASE: 2024.12.01 + DOCKER_TARGET_RELEASE: 2025.01.01 jobs: ################################################ diff --git a/Dockerfile b/Dockerfile index f548ed7..041bc9d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,128 +1,84 @@ #--------------------------------------------------------------------------------------------------------------------------- # STAGING STEP #--------------------------------------------------------------------------------------------------------------------------- - -FROM --platform=$BUILDPLATFORM python:3.12-alpine3.21 as staging +FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21 as staging WORKDIR /app ARG DSMR_VERSION ENV DSMR_VERSION=${DSMR_VERSION:-5.0.0} -RUN echo "**** Download DSMR ****" \ - && apk add --no-cache curl \ - && curl -SskLf "https://github.com/dsmrreader/dsmr-reader/archive/refs/tags/v${DSMR_VERSION}.tar.gz" | tar xvzf - --strip-components=1 -C /app \ - && curl -SskLf "https://raw.githubusercontent.com/dsmrreader/dsmr-reader/v5/dsmr_datalogger/scripts/dsmr_datalogger_api_client.py" -o /app/dsmr_datalogger_api_client.py +RUN apk add --no-cache curl \ + && echo "**** Download DSMR ****" \ + && curl -SskLf "https://github.com/dsmrreader/dsmr-reader/archive/refs/tags/v${DSMR_VERSION}.tar.gz" | tar xvzf - --strip-components=1 -C /app \ + && curl -SskLf "https://raw.githubusercontent.com/dsmrreader/dsmr-reader/v${DSMR_VERSION}/dsmr_datalogger/scripts/dsmr_datalogger_api_client.py" -o /app/dsmr_datalogger_api_client.py #--------------------------------------------------------------------------------------------------------------------------- -# BUILD STEP +# BASE STEP #--------------------------------------------------------------------------------------------------------------------------- -FROM python:3.12-alpine3.21 as base - -# Build the binary according to the TARGET platform variables -ARG TARGETARCH -ARG TARGETVARIANT +FROM python:3.11-alpine3.21 as base -ARG QEMU_ARCH -ARG S6_VERSION="3.1.6.2" -ARG DOCKER_TARGET_RELEASE +# Build arguments ARG DSMR_VERSION +ENV DSMR_VERSION=${DSMR_VERSION} +# Algemene omgevingsvariabelen ENV PS1="$(whoami)@dsmr_reader_docker:$(pwd)\\$ " \ - TERM="xterm" - -ENV QEMU_ARCH=${QEMU_ARCH:-x86_64} \ - DSMR_VERSION=${DSMR_VERSION} \ - DOCKER_TARGET_RELEASE=${DOCKER_TARGET_RELEASE} \ - PIP_NO_CACHE_DIR=1 \ - S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 + TERM="xterm" \ + PIP_NO_CACHE_DIR=1 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 +# DSMR Reader-specifieke omgevingsvariabelen ENV DJANGO_SECRET_KEY=dsmrreader \ - DJANGO_DATABASE_ENGINE=django.db.backends.postgresql \ - DSMRREADER_SUPPRESS_STORAGE_SIZE_WARNINGS=True \ - DJANGO_DATABASE_NAME=dsmrreader \ - DJANGO_DATABASE_USER=dsmrreader \ - DJANGO_DATABASE_PASSWORD=dsmrreader \ - DJANGO_DATABASE_HOST=dsmrdb \ - DJANGO_DATABASE_PORT=5432 \ - DSMRREADER_ADMIN_USER=admin \ - DSMRREADER_ADMIN_PASSWORD=admin \ - DSMRREADER_OPERATION_MODE=standalone \ - VACUUM_DB_ON_STARTUP=false \ - DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD=serial \ - DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT=/dev/ttyUSB0 \ - DSMRREADER_REMOTE_DATALOGGER_SERIAL_BAUDRATE=115200 \ - DSMRREADER_REMOTE_DATALOGGER_SERIAL_BYTESIZE=8 \ - DSMRREADER_REMOTE_DATALOGGER_SERIAL_PARITY=N \ - DSMRREADER_REMOTE_DATALOGGER_NETWORK_HOST=127.0.0.1 \ - DSMRREADER_REMOTE_DATALOGGER_NETWORK_PORT=23 - -# copy local files + DJANGO_DATABASE_ENGINE=django.db.backends.postgresql \ + DJANGO_DATABASE_NAME=dsmrreader \ + DJANGO_DATABASE_USER=dsmrreader \ + DJANGO_DATABASE_PASSWORD=dsmrreader \ + DJANGO_DATABASE_HOST=dsmrdb \ + DJANGO_DATABASE_PORT=5432 \ + DSMRREADER_ADMIN_USER=admin \ + DSMRREADER_ADMIN_PASSWORD=admin \ + DSMRREADER_OPERATION_MODE=standalone \ + VACUUM_DB_ON_STARTUP=false \ + DSMRREADER_SUPPRESS_STORAGE_SIZE_WARNINGS=True \ + DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD=serial \ + DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT=/dev/ttyUSB0 \ + DSMRREADER_REMOTE_DATALOGGER_SERIAL_BAUDRATE=115200 \ + DSMRREADER_REMOTE_DATALOGGER_SERIAL_BYTESIZE=8 \ + DSMRREADER_REMOTE_DATALOGGER_SERIAL_PARITY=N \ + DSMRREADER_REMOTE_DATALOGGER_NETWORK_HOST=127.0.0.1 \ + DSMRREADER_REMOTE_DATALOGGER_NETWORK_PORT=23 + +# Kopieer bestanden uit staging COPY --from=staging /app /app -RUN echo "**** install runtime packages ****" \ - && rm -rf /var/cache/apk/* \ - && rm -rf /tmp/* \ - && apk --update add --no-cache \ - bash \ - curl \ - coreutils \ - ca-certificates \ - shadow \ - dpkg \ - jq \ - nginx \ - openssl \ - netcat-openbsd \ - postgresql17-client \ - mariadb-connector-c-dev \ - mariadb-client \ - libjpeg-turbo \ - tzdata - -RUN echo "**** install s6 overlay ****" \ - && case "${TARGETARCH}/${TARGETVARIANT}" in \ - "amd64/") S6_ARCH=x86_64 ;; \ - "arm64/") S6_ARCH=aarch64 ;; \ - "arm/v7") S6_ARCH=arm ;; \ - "arm/v6") S6_ARCH=armhf ;; \ - esac \ - && wget -P /tmp https://github.com/just-containers/s6-overlay/releases/download/v"${S6_VERSION}"/s6-overlay-noarch.tar.xz \ - && wget -P /tmp https://github.com/just-containers/s6-overlay/releases/download/v"${S6_VERSION}"/s6-overlay-"${S6_ARCH}".tar.xz \ - && tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz \ - && tar -C / -Jxpf /tmp/s6-overlay-"${S6_ARCH}".tar.xz \ - && wget -P /tmp https://github.com/just-containers/s6-overlay/releases/download/v"${S6_VERSION}"/s6-overlay-symlinks-noarch.tar.xz \ - && tar -C / -Jxpf /tmp/s6-overlay-symlinks-noarch.tar.xz \ - && wget -P /tmp https://github.com/just-containers/s6-overlay/releases/download/v"${S6_VERSION}"/s6-overlay-symlinks-arch.tar.xz \ - && tar -C / -Jxpf /tmp/s6-overlay-symlinks-arch.tar.xz \ - && rm -rf /tmp/s6-overlay-*.tar.xz - -RUN echo "**** install build packages ****" \ - && apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev postgresql17-dev build-base mariadb-dev libpq-dev libffi-dev jpeg-dev cargo rust \ - && echo "**** install pip packages ****" \ - && python3 -m pip install -r /app/dsmrreader/provisioning/requirements/base.txt --no-cache-dir \ - && python3 -m pip install mysqlclient --no-cache-dir \ - && python3 -m pip install tzupdate --no-cache-dir \ - && echo "**** create app user and make base folders ****" \ - && groupmod -g 1000 users \ - && useradd -u 803 -U -d /config -s /bin/false app \ - && usermod -G users,dialout,audio app \ - && mkdir -vp /app /config /defaults \ - && echo "**** copy default settings dsmr reader ****" \ - && cp -f /app/dsmrreader/provisioning/django/settings.py.template /app/dsmrreader/settings.py \ - && echo "**** cleanup package leftovers ****" \ - && apk --purge del .build-deps \ - && apk --purge del \ - && rm -rf /var/cache/apk/* \ - && rm -rf /tmp/* - -RUN echo "**** configure nginx package ****" \ - && mkdir -vp /run/nginx/ \ - && mkdir -vp /etc/nginx/http.d \ - && ln -sf /dev/stdout /var/log/nginx/access.log \ - && ln -sf /dev/stderr /var/log/nginx/error.log \ - && rm -f /etc/nginx/http.d/default.conf \ - && mkdir -vp /var/www/dsmrreader/static \ - && cp -f /app/dsmrreader/provisioning/nginx/dsmr-webinterface /etc/nginx/http.d/dsmr-webinterface.conf +RUN apk add --no-cache \ + bash curl coreutils ca-certificates shadow jq nginx \ + openssl postgresql17-client libjpeg-turbo tzdata s6-overlay \ + && echo "**** install build dependencies and pip packages ****" \ + && apk add --no-cache --virtual .build-deps \ + gcc python3-dev musl-dev postgresql17-dev build-base \ + libffi-dev jpeg-dev rust cargo mariadb-dev \ + && python3 -m pip install --no-cache-dir -r /app/dsmrreader/provisioning/requirements/base.txt \ + && python3 -m pip install --no-cache-dir mysqlclient tzupdate \ + && echo "**** cleanup ****" \ + && apk del .build-deps \ + && rm -rf /var/cache/apk/* /tmp/* /root/.cache + +# Setup nginx +RUN mkdir -p /run/nginx /etc/nginx/http.d /var/www/dsmrreader/static \ + && ln -sf /dev/stdout /var/log/nginx/access.log \ + && ln -sf /dev/stderr /var/log/nginx/error.log \ + && rm -f /etc/nginx/http.d/default.conf \ + && cp /app/dsmrreader/provisioning/nginx/dsmr-webinterface /etc/nginx/http.d/dsmr-webinterface.conf + +# Create app user +RUN groupmod -g 1000 users \ + && useradd -u 803 -U -d /config -s /bin/false app \ + && usermod -G users,dialout,audio app \ + && mkdir -p /config /defaults + +# Copy settings template +RUN cp /app/dsmrreader/provisioning/django/settings.py.template /app/dsmrreader/settings.py #--------------------------------------------------------------------------------------------------------------------------- # FINAL STEP @@ -131,10 +87,7 @@ FROM base as final COPY rootfs / -# TODO: Improve healtcheck to respond on 200 only -# TODO: Improve healtcheck so it's only valid for containers with the webinterface enabled -HEALTHCHECK --interval=15s --timeout=3s --retries=10 CMD curl -Lsf http://127.0.0.1/about -o /dev/null -w "HTTP_%{http_code}" || exit 1 +HEALTHCHECK --interval=15s --timeout=3s --retries=10 CMD curl -Lsf http://127.0.0.1/about -o /dev/null || exit 1 WORKDIR /app - ENTRYPOINT ["/init"] diff --git a/examples/docker-compose.example.yaml b/examples/docker-compose.example.yaml index 4d58e08..36db9f8 100755 --- a/examples/docker-compose.example.yaml +++ b/examples/docker-compose.example.yaml @@ -2,7 +2,7 @@ version: '3' services: dsmrdb: - # When using Postgres, release 13.x, 14.x, 15.x, and 16.x are supported only + # When using Postgres, release 14.x, 15.x, 16.x and 17.x are supported only # due to the limited availability of client packages, especially for arm32v7 image: postgres:16-alpine container_name: dsmrdb