How to deploy a Flask app to Digital Ocean's app platform
Tags: flask, python, tutorial, digitalocean
Published: 2022-04-19 02:19:34

I recently went through the process to put my side project [howbigisthebaby.io](https://howbigisthebaby.io) on Digital Ocean's new app platform, and wanted to document it in case anyone else found it helpful (or atleast me revisiting this later).

---
## Part 1: Setup the environment for the Flask app

**Step 1: Create the virtual environment on your machine**
```
$ virtualenv venv -p Python3
```

**Step 2: Activate the virtual environment**

```
$ source venv/bin/activate
```

**Step 3: Install Flask and gunicorn**

```
$ pip install Flask gunicorn
```

**Step 4: Freeze the requirements in requirements.txt file**

Now that you have the flask package installed, you will need to save this requirement and its dependencies so App Platform can install them later. Do this now using pip and then saving the information to a requirements.txt file:

```
$ pip freeze > requirements.txt
```

**Step 5: Write code for your Flask app in app.py. Here's a simple "hello world" app**

```
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'
```

---
## Part 2: Setting Up Your Gunicorn Configuration
Since we cannot use Flask's built-in server in production environment, we will use Gunicron web server [Why Nginx/Gunicorn/Flask?](https://www.reddit.com/r/Python/comments/68phcu/why_nginxgunicornflask/)
> While lightweight and easy to use, Flask’s built-in server is not suitable for production as it doesn’t scale well and by default serves only one request at a time.
> [Source: Flask's docs](https://flask.palletsprojects.com/en/2.0.x/deploying/)

**Step 1: Create the gunicorn config file**
```
$ touch gunicorn_config.py
```

**Step 2: Add this configuration to gunicorn_config.py file**
```
# inside gunicorn_config.py
bind = "0.0.0.0:8080"
workers = 2
```

---
## Part 3: Pushing the Site to GitHub
The way the Digital Ocean app platform works is that it syncs with a GitHub repo. Any changes to this GitHub repo will automatically be pushed to your app living on Digital Ocean's app platform.

**Step 1: Create a new repo on GitHub.com**
Open your browser and navigate to GitHub, log in with your profile, and create a new repository called flask-app.

**Step 2: Then, create a .gitignore file, and add .pyc so these files are not pushed to GitHub.**

```
$ git init
$ nano .gitignore
```

```
# inside .gitignore
.pyc
```

**Step 3: Add files to your repository, and commit the changes**

```
$ git add app.py gunicorn_config.py requirements.txt .gitignore
$ git commit -m "Initial Flask App"
```

**Step 4: Add the GitHub repo you created earlier as the remote repository**

```
$ git remote add origin https://github.com/your_username/flask-app
```

example: git remote add origin https://github.com/ajot/hbb-flask-webhook

**Step 5: Push to GitHub**
```
$ git branch -M main
$ git push -u origin main
```

---
## Part 4: Deploying to Digital Ocean's app platform
1. Create a new "app" on Digital Ocean.
2. Choose GitHub as source
3. Choose the GitHub repo you just created
4. Follow the promots to create the app
5. Edit the run command to this - gunicorn --worker-tmp-dir /dev/shm app:app

---

**Bonus Tip:** You can also set environment variables in Digital Ocean, and then access them in your code like this -

```
airtable_api_key = os.environ.get('airtable_api_key')
airtable_base = os.environ.get('airtable_base')
```

---
**Resources:** 
[How To Deploy a Flask App Using Gunicorn to App Platform | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-app-using-gunicorn-to-app-platform)