Skip to content

Commit

Permalink
Development (#369)
Browse files Browse the repository at this point in the history
  • Loading branch information
xirixiz authored Jan 2, 2025
1 parent 5773fae commit 07c6e32
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 112 deletions.
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

0 comments on commit 07c6e32

Please sign in to comment.