Run a Flask App

Getting an application running on Fly.io is essentially working out how to package it as a deployable image. Once packaged, it can be deployed to the Fly.io platform.

In this guide we’ll learn how to deploy a Flask application on Fly.io.

Flask is a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to complex applications.

Spinning up a flask app is fun!

Speedrun


First, install flyctl, the Fly.io CLI, and sign up to Fly.io if you haven’t already.

The fastest way to get a basic Flask server on Fly.io is to use our Flask template:

git clone git@github.com:fly-apps/hello-flask-poetry.git flask-app
cd flask-app
fly launch --generate-name

Deploy a Flask app from scratch


For managing our project, we use Poetry. For more information on the initial setup with poetry, refer to setting up a python environment. We can initialize a new project like so:

poetry new flask-app
cd flask-app
poetry shell

To run this app we will need 2 dependencies:

  • flask: the framework
  • gunicorn: the server
poetry add flask gunicorn

Now let’s create a basic app in app.py:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_fly():
    return "hello from fly.io"

To check that everything is working, we can use the included flask cli tool:

flask run
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

Note that flask run command works since our file is named app.py. It also works if your file is named wsgi.py, so you don’t have to use --app to tell Flask where your app is. More details here.

If your file is saved as hello.py instead of app.py, you would need to use the --app option to point to Flask where your app is:

flask --app hello run

If you open http://127.0.0.1:5000/ in your web browser, it should display hello from fly.io.

And with that you can deploy the app!

fly launch
Scanning source code
Detected a Flask app
Warning: This organization has no payment method, turning off high availability
Creating app in [redacted]/[app-name]
We're about to launch your app on Fly.io. Here's what you're getting:

Organization: Your Name              (fly launch defaults to the personal org)
Name:         [app-name]             (derived from your directory name)
Region:       Amsterdam, Netherlands (this is the fastest region for you)
App Machines: shared-cpu-1x, 1GB RAM (most apps need about 1GB of RAM)
Postgres:     <none>                 (not requested)
Redis:        <none>                 (not requested)
Sentry:       false                  (not requested)

...

==> Building image
...
==> Building image with Docker
...

Watch your deployment at https://fly.io/apps/[app-name]/monitoring
...

Visit your newly deployed app at https://[app-name].fly.dev/

This will generate a fly.toml file with the configuration for your app and a Dockerfile that uses multi-stage builds. Refer to the fly.toml docs for more configuration options.

To deploy a new version of your app, simply run fly deploy in the project directory.

You can check out the full (yet minimal) example in this GitHub repository for a reference.