From a6a7d1bf806a2c237748bbff5038564ede1ee161 Mon Sep 17 00:00:00 2001 From: klemek Date: Sat, 11 Apr 2026 19:20:40 +0200 Subject: [PATCH] feat: env vars --- Dockerfile | 7 ++++++- Makefile | 3 ++- README.md | 13 +++++++------ src/params.py | 39 ++++++++++++++++++++++++++++++++------- 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index 60eabe5..06d3a43 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,12 @@ FROM python:3.14-alpine WORKDIR /app -VOLUME [ "/app/data" ] +VOLUME [ "/data" ] + +ENV HOST=localhost +ENV PORT=8080 +ENV BIND=0.0.0.0 +ENV DATA_DIR=/data RUN PIP_ROOT_USER_ACTION=ignore python3 -m pip install uv diff --git a/Makefile b/Makefile index 374e52f..7a11207 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ RUFF ?= $(UV) run ruff TY ?= $(UV) run ty DOCKER ?= docker DOCKER_TAG ?= localhost/stapler:latest +TOKEN ?= secret # DOCS @@ -60,7 +61,7 @@ docker-build: ## docker build .PHONY: docker-run docker-run: docker-build ## docker run - @$(DOCKER) run -it -p 8080:8080 -v ./data:/app/data $(DOCKER_TAG) + @$(DOCKER) run -it -p 8080:8080 -v ./data:/data $(DOCKER_TAG) --token $(TOKEN) # ACTIONS diff --git a/README.md b/README.md index e4d901a..8161628 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,25 @@ # Stapler ```txt -usage: stapler [-h] [-p PORT] [--host HOST] [-d DATA_DIR] [-b BIND] +usage: stapler [-h] [-p PORT] [--host HOST] [-d DATA_DIR] [-b BIND] [-t TOKEN] Static pages as simple as a gzip file options: -h, --help show this help message and exit - -p, --port PORT server port (default: 8080) - --host HOST server default host (default: localhost) + -p, --port PORT server port (default: 8080) (env var: PORT) + --host HOST server default host (default: localhost) (env var: HOST) -d, --data-dir DATA_DIR - directory where files are/will be stored - -b, --bind BIND server bind address (default: 0.0.0.0) + directory where files are/will be stored (default: ./data) (env var: DATA_DIR) + -b, --bind BIND server bind address (default: 0.0.0.0) (env var: BIND) + -t, --token TOKEN secret token for update requests (env var: TOKEN) ``` ## TODO - [x] basic http server - [x] docker container -- [ ] env instead of args when available +- [x] env instead of args when available - [ ] POST gzip data into /data/xxx - [ ] DELETE request - [ ] CNAME in /data/xxx can be translated as host in GET / diff --git a/src/params.py b/src/params.py index 792c3b5..f40a253 100644 --- a/src/params.py +++ b/src/params.py @@ -12,35 +12,60 @@ class Parameters: host: str data_dir: str bind: str + token: str @classmethod def from_namespace(cls, args: argparse.Namespace) -> "Parameters": return Parameters(**vars(args)) +def __get_env_str(var: str, default: str) -> str: + if (result := os.getenv(var)) is None: + return default + return result + + +def __get_env_int(var: str, default: int) -> int: + value = __get_env_str(var, str(default)) + if value.isnumeric(): + return int(value) + return default + + def parse_parameters() -> Parameters: parser = argparse.ArgumentParser( project.get_name(), description=project.get_description() ) parser.add_argument( - "-p", "--port", type=int, default=8080, help="server port (default: 8080)" + "-p", + "--port", + type=int, + default=__get_env_int("PORT", 8080), + help="server port (default: 8080) (env var: PORT)", ) parser.add_argument( "--host", - default="localhost", - help="server default host (default: localhost)", + default=__get_env_str("HOST", "localhost"), + help="server default host (default: localhost) (env var: HOST)", ) parser.add_argument( "-d", "--data-dir", - help="directory where files are/will be stored", - default=os.path.join(os.getcwd(), "data"), + default=__get_env_str("DATA_DIR", os.path.join(os.getcwd(), "data")), + help="directory where files are/will be stored (default: ./data) (env var: DATA_DIR)", ) parser.add_argument( "-b", "--bind", - default="0.0.0.0", - help="server bind address (default: 0.0.0.0)", + default=__get_env_str("BIND", "0.0.0.0"), + help="server bind address (default: 0.0.0.0) (env var: BIND)", + ) + parser.add_argument( + "-t", + "--token", + required=os.getenv("TOKEN") is None, + default=os.getenv("TOKEN"), + help="secret token for update requests (env var: TOKEN)", ) args = parser.parse_args() return Parameters.from_namespace(args)