From b4fb50ebf2127aff85d30871fd4b13af1edd52c7 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Sat, 25 Mar 2023 20:04:43 +0100 Subject: add an initial Dockerfile --- Dockerfile | 17 ++++++++++++++ container/entrypoint | 56 ++++++++++++++++++++++++++++++++++++++++++++++ container/gunicorn.conf.py | 1 + 3 files changed, 74 insertions(+) create mode 100644 Dockerfile create mode 100644 container/entrypoint create mode 100644 container/gunicorn.conf.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..22e0717 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.11 +RUN pip install gunicorn + +RUN mkdir /package +WORKDIR /package/ +COPY ["fietsboek", "fietsboek"] +COPY ["pyproject.toml", "README.md", "LICENSE.txt", "CHANGELOG.rst", "production.ini", "."] +RUN pip install . + +COPY --chmod=755 ["container/entrypoint", "/bin/entrypoint"] +COPY ["container/gunicorn.conf.py", "/fietsboek/gunicorn.conf.py"] + +VOLUME /fietsboek/data /fietsboek/database /fietsboek/pages +WORKDIR /fietsboek + +ENTRYPOINT ["/bin/entrypoint"] +CMD ["gunicorn", "--paste", "/fietsboek/fietsboek.ini"] diff --git a/container/entrypoint b/container/entrypoint new file mode 100644 index 0000000..0d404d6 --- /dev/null +++ b/container/entrypoint @@ -0,0 +1,56 @@ +#!/bin/bash +set -euo pipefail + +error() { + >&2 echo "[ERROR] $1" +} + +CONFIG="/fietsboek/fietsboek.ini" +if [[ ! -f "$CONFIG" ]] ; then + # Copy the default config over + cp /package/production.ini "$CONFIG" + # Change default settings + : ${SQLALCHEMY_URL:=sqlite:////fietsboek/database/fietsboek.sqlite} + sed -i '/^sqlalchemy\.url = /c sqlalchemy.url = '"$SQLALCHEMY_URL" "$CONFIG" + + if [[ ! -v REDIS_URL ]] ; then + error "need REDIS_URL set" + exit 1 + fi + sed -i '/^\[app:main\]/a redis.url = '"$REDIS_URL" "$CONFIG" + + : ${DATA_DIR:=/fietsboek/data} + mkdir -p "$DATA_DIR" + sed -i '/^\[app:main\]/a fietsboek.data_dir = '"$DATA_DIR" "$CONFIG" + + : ${SESSION_KEY:=$(openssl rand -hex 20)} + sed -i '/^session_key = /c session_key = '"$SESSION_KEY" "$CONFIG" + + sed -i '/^\[app:main\]/a fietsboek.pages = /fietsboek/pages' "$CONFIG" + + : ${ENABLE_ACCOUNT_REGISTRATION:=true} + sed -i '/^enable_account_registration =/c enable_account_registration = '"$ENABLE_ACCOUNT_REGISTRATION" "$CONFIG" + + if [[ -v DEFAULT_LOCALE_NAME ]] ; then + sed -i '/^pyramid\.default_locale_name =/c pyramid.default_locale_name = '"$DEFAULT_LOCALE_NAME" "$CONFIG" + fi + + if [[ -v EMAIL_FROM ]] ; then + sed -i '/^email\.from =/c email.from = '"$EMAIL_FROM" "$CONFIG" + fi + if [[ -v EMAIL_SMTP_URL ]] ; then + sed -i '/^email\.smtp_url =/c email.smtp_url = '"$EMAIL_SMTP_URL" "$CONFIG" + fi + if [[ -v EMAIL_USERNAME ]] ; then + sed -i '/^email\.username =/c email.username = '"$EMAIL_USERNAME" "$CONFIG" + fi + if [[ -v EMAIL_PASSWORD ]] ; then + sed -i '/^email\.password =/c email.password = '"$EMAIL_PASSWORD" "$CONFIG" + fi +fi + +# Make sure the data schema is up to date, or rather initialize it if this is +# the first time +(cd /package && fietsupdate update -fc "$CONFIG") + +exec "$@" diff --git a/container/gunicorn.conf.py b/container/gunicorn.conf.py new file mode 100644 index 0000000..dc574f2 --- /dev/null +++ b/container/gunicorn.conf.py @@ -0,0 +1 @@ +bind = "0.0.0.0:8000" -- cgit v1.2.3