Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Development #369

Merged
merged 8 commits into from
Jan 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
################################################
Expand Down
173 changes: 63 additions & 110 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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"]
2 changes: 1 addition & 1 deletion examples/docker-compose.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading