Run a Streamlit 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 Streamlit application on Fly.io.

Streamlit turns data scripts into shareable web apps in minutes. All in pure Python. No front‑end experience required.

Spinning up a streamlit app takes no time at all!

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 Streamlit server on Fly.io is to use our streamlit template:

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

Deploy a Streamlit 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 streamlit-app
cd streamlit-app

Then we have to add the streamlit dependency:

poetry add streamlit

Now, let’s create a simple streamlit app in main.py:

import streamlit as st

st.write('hello from fly.io')

We can then serve the development version of the app using the streamlit cli tool:

streamlit run main.py

This will display a ‘hello from fly.io!’ message when you visit the root URL.

Before deploying, we must add a bit of configuration to .streamlit/config.toml:

[server]
headless = true

This ensures that our app doesn’t give a prompt when we ship it.

And with that you can deploy the app!

fly launch
Scanning source code
Detected a streamlit 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.