diff --git a/.env b/.env index f4a585ba..630e856d 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ FASTAPI_BACKEND="uvicorn" +FASTAPI_WORKERS=2 diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 1addecb2..eb75343b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -21,6 +21,8 @@ services: - cache:/cache fastapi: + environment: + - FASTAPI_BACKEND="gunicorn" volumes: - cache:/cache diff --git a/docker-compose.yml b/docker-compose.yml index f19485e3..71f3b970 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: diff --git a/docker/scripts/run-fastapi.sh b/docker/scripts/run-fastapi.sh index 4dcc1d96..16ae3cb9 100755 --- a/docker/scripts/run-fastapi.sh +++ b/docker/scripts/run-fastapi.sh @@ -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 diff --git a/pyproject.toml b/pyproject.toml index 4b530493..141ec0ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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"