From 86b14896a9388b012bcb3e4e98bf3ed049933213 Mon Sep 17 00:00:00 2001 From: Cody Miller Date: Mon, 23 Jan 2023 13:17:26 -0500 Subject: [PATCH 1/3] docs: quick start for using gunicorn with python --- getting-started/quickstarts/gunicorn.mdx | 64 +++++++++++++++++++++++ images/hop-cmd-option.webp | Bin 0 -> 9324 bytes mint.json | 5 +- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 getting-started/quickstarts/gunicorn.mdx create mode 100644 images/hop-cmd-option.webp diff --git a/getting-started/quickstarts/gunicorn.mdx b/getting-started/quickstarts/gunicorn.mdx new file mode 100644 index 0000000..7edf883 --- /dev/null +++ b/getting-started/quickstarts/gunicorn.mdx @@ -0,0 +1,64 @@ +--- +title: 'Gunicorn' +description: 'How to deploy a python application with Gunicorn' +--- + +Using [Gunicorn]("https://gunicorn.org/") is a great way to deploy a python application. Using it on Hop is very easy and can be done in a few steps. + +## Demo + + + We have already made a repository for you to use. You can find it{' '} + [here]("https://github.com/hop-examples/python_gunicorn") + + +### Preparing your application for Hop + +1. Gunicorn needs a config file to run. We will create a file called `gunicorn.conf.py` and add the following code to it. If you already have a config file, make sure to have this appended to it. + +
+ +```python +bind = "0.0.0.0" +``` + +If you are going to expose this service through a gateway, the application needs to be bound to `0.0.0.0` instead of `localhost` or `127.0.0.1`. + +
+ +2. If you are using a dockerfile (if not skip to #3), make sure to add the following line to it. + +
+ +```dockerfile +CMD ["gunicorn", "[WSGI_APP]"] +``` + +Where `WSGI_APP` is of the pattern `$(MODULE_NAME):$(VARIABLE_NAME)`. +For example for: + +```python +# main.py +def app(environ, start_response): + # your code here +``` + +The command is `CMD ["gunicorn", "main:app"]` + +
+ +3. If you are not using a dockerfile, upon deploying your project to Hop, make sure to add the following under "Advanced Options" -> "CMD" + +
+ +```bash +gunicorn [WSGI_APP] +``` + +Like so, + +![](/images/hop-cmd-option.webp) +
+ + +4. All set! Enjoy your python application on Hop! diff --git a/images/hop-cmd-option.webp b/images/hop-cmd-option.webp new file mode 100644 index 0000000000000000000000000000000000000000..34acbb84da7677297ab3e26fdf88fa43ef4839aa GIT binary patch literal 9324 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 Date: Mon, 23 Jan 2023 13:25:21 -0500 Subject: [PATCH 2/3] rm quotes --- getting-started/quickstarts/gunicorn.mdx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/getting-started/quickstarts/gunicorn.mdx b/getting-started/quickstarts/gunicorn.mdx index 7edf883..af6613e 100644 --- a/getting-started/quickstarts/gunicorn.mdx +++ b/getting-started/quickstarts/gunicorn.mdx @@ -3,13 +3,13 @@ title: 'Gunicorn' description: 'How to deploy a python application with Gunicorn' --- -Using [Gunicorn]("https://gunicorn.org/") is a great way to deploy a python application. Using it on Hop is very easy and can be done in a few steps. +Using [Gunicorn](https://gunicorn.org/) is a great way to deploy a python application. Using it on Hop is very easy and can be done in a few steps. ## Demo We have already made a repository for you to use. You can find it{' '} - [here]("https://github.com/hop-examples/python_gunicorn") + [here](https://github.com/hop-examples/python_gunicorn) ### Preparing your application for Hop @@ -60,5 +60,4 @@ Like so, ![](/images/hop-cmd-option.webp) - 4. All set! Enjoy your python application on Hop! From 9887c5b9c2df350e46749c7bf89abed4a3b3285a Mon Sep 17 00:00:00 2001 From: Cody Miller Date: Mon, 23 Jan 2023 13:30:04 -0500 Subject: [PATCH 3/3] docs(feat): better image --- images/hop-cmd-option.webp | Bin 9324 -> 7036 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/hop-cmd-option.webp b/images/hop-cmd-option.webp index 34acbb84da7677297ab3e26fdf88fa43ef4839aa..68a2468c440b3960734217e6a747807e93c5bb5a 100644 GIT binary patch literal 7036 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