Deploying a flask app
Setting up Github
We should run
git init
and create a .gitignore
.
Details
A reasonable .gitignore
for this project might look like this:
# Local
venv/
.env
.env.*
dev.sqlite
# Byte-compiled / optimized / DLL files
__pycache__/
# Unit test / coverage reports
.pytest_cache/
# Flask stuff:
instance/
.webassets-cache
If we create an empty repo on Github, we can link it to the local like this:
# Stage all changes
git add .
# Commit all changes
git commit -am "initial commit"
# Add the remote
git remote add origin <your-repo-url>
# Push your code
git push -u origin main
TIP
The -u origin main
part links the local main
branch to the remote main
branch, and means that in the future we only need to do git push
.
Deploying on Render
Render is a service which allows us to deploy an api for free.
We can get started by signing up and selecting to create a new web service.
We can determine the build command, which is usually something like
pip install -r requirements.txt
We can also specify the command to start the app. The actual command will vary depending on how your app is set up, could be something like
gunicorn -e MODE=production -w 4 -b 0.0.0.0:$PORT 'src.app:create_app()'
-e MODE=production
sets the environment variableMODE
to"production"
-w 4
sets up 4 workers, to allow concurrent request handling-b 0.0.0.0:$PORT
binds the app to a specific host and port, where$PORT
is an environment variable provided by Render
INFO
The app.run()
method starts a development server. It is not intended for high traffic deployments. Gunicorn is a development server and can be installed with pip install gunicorn
. Be sure the add this to requirements.txt
.
Environment variables
We can specify a list of environment variables. This allows us to choose a different configuration for production compared with local development.
SECRET_KEY=bac954ba70aec51f59966de92702e887f8801c374de2c369e24133b0cb9d3380
DB_URL=postgresql://postgres.imivjbohxrpueurbqdho:y8QsnKBXSvjCG2DA@aws-0-eu-west-2.pooler.supabase.com:6543/postgres
WARNING
Your database url contains the database password. It is structured like this:
postgresql://[user:password]@[host][:port][/dbname]
It is extremely sensitive and should not be shared or stored anywhere else.
TIP
The production database is hosted on Supabase, which is a good choice if you would like to experiment for free with a hosted database.
Visiting the site
When we push to the main
branch on Github, Render will automatically rebuild and redploy the app, and we can view at at the url, e.g. https://corndel-todo.onrender.com.