Skip to main content

Self Hosting

Host a Flet app on your own server with NGINX.

There are free and inexpensive cloud server tiers available at AWS, Oracle, Linode, and more.

Setup Flet Environment

requirements.txt and virtualenv

Create requirements.txt with a list of application dependencies. At minimum it should contain flet module:

flet

Create a virtualenv and install requirements:

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Sample Flet app

import flet as ft

def main(page: ft.Page):
page.title = "My Flet app"
page.add(ft.Text("Hello, world!"))

if __name__ == "__main__":
ft.app(main)

Flet app will be served from the root URL, but you can configure FLET_WEB_APP_PATH environment variable to serve beneath the root e.g. /apps/myapp.

By default, Flet web app will be running on port 8000, but you can change that by setting up FLET_SERVER_PORT environment variable.

Complete list of environment variables supported by a web app.

Automatically start Flet app

Create systemd unit file

Automatically start the Flet app using a systemd service unit file flet.service.

Setup below assumes your Flet app script is defined in $HOME/flet-app/main.py. Replace User, Group, WorkingDirectory, etc. as per your setup.

[Unit]
Description=Flet App
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/flet-app
Environment="PATH=/home/ubuntu/flet-app/.venv/bin"
ExecStart=/home/ubuntu/flet-app/.venv/bin/python /home/ubuntu/flet-app/main.py

[Install]
WantedBy=multi-user.target

Enable Flet app service

cd /etc/systemd/system
sudo ln -s /home/ubuntu/flet-app/flet.service
sudo systemctl start flet
sudo systemctl enable flet
sudo systemctl status flet

NGINX Proxy Setup

NGINX will proxy the Flet app and the websocket.

In your /etc/nginx/sites-available/* config file, updating path and port as needed:

    location / {
proxy_pass http://127.0.0.1:8000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

location /ws {
proxy_pass http://127.0.0.1:8000/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

That's it! Restart NGINX, and open your app in a browser.