aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2024-06-07 21:28:29 +0100
committerGravatar GitHub <[email protected]>2024-06-07 21:28:29 +0100
commit369853209f930cdd6238d4314a0c67441335d01b (patch)
tree0536ea0dd7ceccca6a156f561c525ef0792b17e2
parentMerge pull request #1335 from python-discord/dependabot/pip/ruff-0.4.8 (diff)
parentUpdate taskipy start task to remove redundant --debug flag (diff)
Merge pull request #1338 from python-discord/jb3/deployment/gunicorn-from-docker
Update production deployment configuration
-rw-r--r--Dockerfile8
-rw-r--r--docker-compose.yml2
-rwxr-xr-xmanage.py65
-rw-r--r--pyproject.toml2
4 files changed, 28 insertions, 49 deletions
diff --git a/Dockerfile b/Dockerfile
index 5aea6dbf..a14af3ee 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -39,6 +39,8 @@ RUN if [ $STATIC_BUILD = "TRUE" ] ; \
then SECRET_KEY=dummy_value poetry run python manage.py distill-local build --traceback --force ; \
fi
-# Run web server through custom manager
-ENTRYPOINT ["poetry", "run", "python", "manage.py"]
-CMD ["run"]
+ENTRYPOINT ["poetry", "run"]
+CMD ["gunicorn", "--preload", "-b", "0.0.0.0:8000", \
+ "pydis_site.wsgi:application", "-w", "2", "--statsd-host", \
+ "graphite.default.svc.cluster.local:8125", "--statsd-prefix", "site", \
+ "--config", "file:gunicorn.conf.py"]
diff --git a/docker-compose.yml b/docker-compose.yml
index 61554ae4..d2192f5c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -30,7 +30,7 @@ services:
build:
context: .
dockerfile: Dockerfile
- command: ["run", "--debug"]
+ command: ["python", "manage.py", "run"]
networks:
default:
aliases:
diff --git a/manage.py b/manage.py
index 80601935..38bf6be0 100755
--- a/manage.py
+++ b/manage.py
@@ -28,21 +28,21 @@ for key, value in DEFAULT_ENVS.items():
class SiteManager:
"""
- Manages the preparation and serving of the website.
+ Manages the preparation and serving of the website for local use.
- Handles both development and production environments.
+ This class is used solely for setting up the development
+ environment. In production, gunicorn is invoked directly
+ and migrations are handled in an init container.
Usage:
manage.py run [option]...
Options:
- --debug Runs a development server with debug mode enabled.
--silent Sets minimal console output.
--verbose Sets verbose console output.
"""
def __init__(self, args: list[str]):
- self.debug = "--debug" in args
self.silent = "--silent" in args
if self.silent:
@@ -50,9 +50,8 @@ class SiteManager:
else:
self.verbosity = 2 if "--verbose" in args else 1
- if self.debug:
- os.environ.setdefault("DEBUG", "true")
- print("Starting in debug mode.")
+ os.environ.setdefault("DEBUG", "true")
+ print("Starting in debug mode.")
@staticmethod
def create_superuser() -> None:
@@ -104,53 +103,31 @@ class SiteManager:
call_command("migrate", verbosity=self.verbosity)
def prepare_server(self) -> None:
- """Preform runserver-specific preparation tasks."""
- if self.debug:
- # In Production, collectstatic is ran in the Docker image
- print("Collecting static files.")
- call_command(
- "collectstatic",
- interactive=False,
- clear=True,
- verbosity=self.verbosity - 1
- )
+ """Perform debug runserver-specific preparation tasks."""
+ print("Collecting static files.")
+ call_command(
+ "collectstatic",
+ interactive=False,
+ clear=True,
+ verbosity=self.verbosity - 1
+ )
- self.set_dev_site_name()
- self.create_superuser()
+ self.set_dev_site_name()
+ self.create_superuser()
- def run_server(self) -> None:
- """Prepare and run the web server."""
+ def run_debug(self) -> None:
+ """Prepare and run the debug web server."""
in_reloader = os.environ.get('RUN_MAIN') == 'true'
# Prevent preparing twice when in dev mode due to reloader
- if not self.debug or in_reloader:
+ if in_reloader:
self.prepare_environment()
self.prepare_server()
print("Starting server.")
# Run the development server
- if self.debug:
- call_command("runserver", "0.0.0.0:8000")
- return
-
- # Import gunicorn only if we aren't in debug mode.
- import gunicorn.app.wsgiapp
-
- # Patch the arguments for gunicorn
- sys.argv = [
- "gunicorn",
- "--preload",
- "-b", "0.0.0.0:8000",
- "pydis_site.wsgi:application",
- "-w", "2",
- "--statsd-host", "graphite.default.svc.cluster.local:8125",
- "--statsd-prefix", "site",
- "--config", "file:gunicorn.conf.py"
- ]
-
- # Run gunicorn for the production server.
- gunicorn.app.wsgiapp.run()
+ call_command("runserver", "0.0.0.0:8000")
def run_tests(self) -> None:
"""Prepare and run the test suite."""
@@ -190,7 +167,7 @@ def main() -> None:
if len(sys.argv) > 1 and sys.argv[1] in ("run", "test"):
manager = SiteManager(sys.argv)
if sys.argv[1] == "run":
- manager.run_server()
+ manager.run_debug()
elif sys.argv[1] == "test":
manager.run_tests()
diff --git a/pyproject.toml b/pyproject.toml
index 73f15977..4d647855 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -73,7 +73,7 @@ select = ["ANN", "B", "C4", "D", "DJ", "DTZ", "E", "F", "ISC", "INT", "N", "PGH"
"pydis_site/apps/api/models/bot/off_topic_channel_name.py" = ["RUF001"]
[tool.taskipy.tasks]
-start = "python manage.py run --debug"
+start = "python manage.py run"
makemigrations = "python manage.py makemigrations"
django_shell = "python manage.py shell"
test = "coverage run manage.py test"