feat: env vars
This commit is contained in:
+6
-1
@@ -2,7 +2,12 @@ FROM python:3.14-alpine
|
|||||||
|
|
||||||
WORKDIR /app
|
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
|
RUN PIP_ROOT_USER_ACTION=ignore python3 -m pip install uv
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ RUFF ?= $(UV) run ruff
|
|||||||
TY ?= $(UV) run ty
|
TY ?= $(UV) run ty
|
||||||
DOCKER ?= docker
|
DOCKER ?= docker
|
||||||
DOCKER_TAG ?= localhost/stapler:latest
|
DOCKER_TAG ?= localhost/stapler:latest
|
||||||
|
TOKEN ?= secret
|
||||||
|
|
||||||
# DOCS
|
# DOCS
|
||||||
|
|
||||||
@@ -60,7 +61,7 @@ docker-build: ## docker build
|
|||||||
|
|
||||||
.PHONY: docker-run
|
.PHONY: docker-run
|
||||||
docker-run: docker-build ## 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
|
# ACTIONS
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,25 @@
|
|||||||
# Stapler
|
# Stapler
|
||||||
|
|
||||||
```txt
|
```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
|
Static pages as simple as a gzip file
|
||||||
|
|
||||||
options:
|
options:
|
||||||
-h, --help show this help message and exit
|
-h, --help show this help message and exit
|
||||||
-p, --port PORT server port (default: 8080)
|
-p, --port PORT server port (default: 8080) (env var: PORT)
|
||||||
--host HOST server default host (default: localhost)
|
--host HOST server default host (default: localhost) (env var: HOST)
|
||||||
-d, --data-dir DATA_DIR
|
-d, --data-dir DATA_DIR
|
||||||
directory where files are/will be stored
|
directory where files are/will be stored (default: ./data) (env var: DATA_DIR)
|
||||||
-b, --bind BIND server bind address (default: 0.0.0.0)
|
-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
|
## TODO
|
||||||
|
|
||||||
- [x] basic http server
|
- [x] basic http server
|
||||||
- [x] docker container
|
- [x] docker container
|
||||||
- [ ] env instead of args when available
|
- [x] env instead of args when available
|
||||||
- [ ] POST gzip data into /data/xxx
|
- [ ] POST gzip data into /data/xxx
|
||||||
- [ ] DELETE request
|
- [ ] DELETE request
|
||||||
- [ ] CNAME in /data/xxx can be translated as host in GET /
|
- [ ] CNAME in /data/xxx can be translated as host in GET /
|
||||||
|
|||||||
+32
-7
@@ -12,35 +12,60 @@ class Parameters:
|
|||||||
host: str
|
host: str
|
||||||
data_dir: str
|
data_dir: str
|
||||||
bind: str
|
bind: str
|
||||||
|
token: str
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_namespace(cls, args: argparse.Namespace) -> "Parameters":
|
def from_namespace(cls, args: argparse.Namespace) -> "Parameters":
|
||||||
return Parameters(**vars(args))
|
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:
|
def parse_parameters() -> Parameters:
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
project.get_name(), description=project.get_description()
|
project.get_name(), description=project.get_description()
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
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(
|
parser.add_argument(
|
||||||
"--host",
|
"--host",
|
||||||
default="localhost",
|
default=__get_env_str("HOST", "localhost"),
|
||||||
help="server default host (default: localhost)",
|
help="server default host (default: localhost) (env var: HOST)",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-d",
|
"-d",
|
||||||
"--data-dir",
|
"--data-dir",
|
||||||
help="directory where files are/will be stored",
|
default=__get_env_str("DATA_DIR", os.path.join(os.getcwd(), "data")),
|
||||||
default=os.path.join(os.getcwd(), "data"),
|
help="directory where files are/will be stored (default: ./data) (env var: DATA_DIR)",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-b",
|
"-b",
|
||||||
"--bind",
|
"--bind",
|
||||||
default="0.0.0.0",
|
default=__get_env_str("BIND", "0.0.0.0"),
|
||||||
help="server bind address (default: 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()
|
args = parser.parse_args()
|
||||||
return Parameters.from_namespace(args)
|
return Parameters.from_namespace(args)
|
||||||
|
|||||||
Reference in New Issue
Block a user