How to deploy a Flask app to Digital Ocean's app platform
I recently went throught the process to put my side project 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?
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
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
- Create a new "app" on Digital Ocean.
- Choose GitHub as source
- Choose the GitHub repo you just created
- Follow the promots to create the app
- 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 -
import OS
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