feat(docker): add gunicorn support & production default

Supply FASTAPI_BACKEND=gunicorn and FASTAPI_WORKERS=<threads_num> to
docker-compose up to use the gunicorn backend.

This is defaulted in production to gunicorn, but FASTAPI_WORKERS
should definitely be configured by any production deployment.

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2021-10-16 21:02:05 -07:00
parent 28c4e9697b
commit 927f5e8567
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
5 changed files with 28 additions and 1 deletions

1
.env
View file

@ -1 +1,2 @@
FASTAPI_BACKEND="uvicorn"
FASTAPI_WORKERS=2

View file

@ -21,6 +21,8 @@ services:
- cache:/cache
fastapi:
environment:
- FASTAPI_BACKEND="gunicorn"
volumes:
- cache:/cache

View file

@ -166,6 +166,7 @@ services:
environment:
- AUR_CONFIG=conf/config
- DB_HOST=mariadb
- FASTAPI_WORKERS=${FASTAPI_WORKERS}
entrypoint: /docker/fastapi-entrypoint.sh
command: /docker/scripts/run-fastapi.sh "${FASTAPI_BACKEND}"
healthcheck:

View file

@ -12,6 +12,15 @@ if [ -f /cache/production.key.pem ]; then
KEY=/cache/production.key.pem
fi
# By default, set FASTAPI_WORKERS to 2. In production, this should
# be configured by the deployer.
if [ -z "$FASTAPI_WORKERS" ]; then
FASTAPI_WORKERS=2
fi
echo "FASTAPI_BACKEND: $FASTAPI_BACKEND"
echo "FASTAPI_WORKERS: $FASTAPI_WORKERS"
if [ "$1" == "uvicorn" ] || [ "$1" == "" ]; then
exec uvicorn --reload \
--ssl-certfile "$CERT" \
@ -20,11 +29,24 @@ if [ "$1" == "uvicorn" ] || [ "$1" == "" ]; then
--host "0.0.0.0" \
--port 8000 \
aurweb.asgi:app
else
elif [ "$1" == "gunicorn" ]; then
exec gunicorn \
--keyfile="$KEY" \
--certfile="$CERT" \
--log-config /docker/logging.conf \
--bind "0.0.0.0:8000" \
-w $FASTAPI_WORKERS \
-k uvicorn.workers.UvicornWorker \
aurweb.asgi:app
elif [ "$1" == "hypercorn" ]; then
exec hypercorn --reload \
--certfile "$CERT" \
--keyfile "$KEY" \
--log-config /docker/logging.conf \
-b "0.0.0.0:8000" \
aurweb.asgi:app
else
echo "Error: Invalid \$FASTAPI_BACKEND supplied."
echo "Valid backends: 'uvicorn', 'gunicorn', 'hypercorn'."
exit 1
fi

View file

@ -86,6 +86,7 @@ pytest-asyncio = { version = "0.15.1", python = "^3.9" }
pytest-cov = { version = "2.12.1", python = "^3.9" }
pytest-tap = { version = "3.2", python = "^3.9" }
uvicorn = { version = "0.15.0", python = "^3.9" }
gunicorn = { version = "20.1.0", python = "^3.9" }
[tool.poetry.scripts]
aurweb-git-auth = "aurweb.git.auth:main"