diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0cfbf09 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +PORT=8002 +UWSGI_PROCESSES=4 +UWSGI_THREADS=4 diff --git a/.gitignore b/.gitignore index 738528c..69ce438 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ -venv/ -.venv/ -__pycache__/ +/dist/ +docker-compose.yml +.env *.pyc -/dist/ \ No newline at end of file +__pycache__/ +.venv/ +venv/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..27951c4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM alpine:3.20 + +ENV APP_ENV=/opt/venv +ENV PATH="${APP_ENV}/bin:$PATH" + +WORKDIR $APP_ENV + +COPY . . + +RUN apk add --no-cache py3-pip uwsgi-python3 && \ + python3 -m venv $APP_ENV && \ + pip install --no-cache-dir . && \ + adduser -D -H small + +EXPOSE 8002 + +USER small:small + +ENTRYPOINT ["/opt/venv/entrypoint.sh"] diff --git a/docker-compose-example.yml b/docker-compose-example.yml new file mode 100644 index 0000000..16d53bc --- /dev/null +++ b/docker-compose-example.yml @@ -0,0 +1,15 @@ +services: + small: + container_name: small + restart: unless-stopped + build: . + ports: [127.0.0.1:8002:8002] + env_file: .env + security_opt: [no-new-privileges:true] + cap_drop: [ALL] + read_only: true + deploy: + resources: + limits: + cpus: '0.5' + memory: 300M diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..77dec71 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,18 @@ +#!/bin/sh +args="--plugin python3 \ + --http-socket 0.0.0.0:$PORT \ + --master \ + --module small.app:app \ + -H /opt/venv" + +if [ "$UWSGI_PROCESSES" ] +then + args="$args --processes $UWSGI_PROCESSES" +fi + +if [ "$UWSGI_THREADS" ] +then + args="$args --threads $UWSGI_THREADS" +fi + +exec /usr/sbin/uwsgi $args