streamlitdéploiementcloudtutorielgratuit

Déployer une app Streamlit sur Streamlit Cloud (gratuit) - Tutoriel complet 2025

GP
Gaël Penessot
Déployer une app Streamlit sur Streamlit Cloud (gratuit) - Tutoriel complet 2025

Déployer une app Streamlit sur Streamlit Cloud (gratuit) - Tutoriel complet 2025

Vous avez créé votre première application Streamlit et vous voulez la partager avec le monde ? Bonne nouvelle : Streamlit Cloud offre un hébergement 100% gratuit avec HTTPS, redéploiement automatique et gestion des secrets.

Dans ce tutoriel complet, je vous montre étape par étape comment déployer votre app Streamlit gratuitement en moins de 10 minutes, même si vous n'avez jamais déployé d'application web.

Ce que vous allez apprendre

  • ✅ Déployer votre app Streamlit en 1 clic (gratuit)
  • ✅ Configurer un domaine personnalisé (optionnel)
  • ✅ Gérer les variables d'environnement et secrets
  • ✅ Optimiser les performances de déploiement
  • ✅ Résoudre les erreurs courantes
  • ✅ Redéployer automatiquement à chaque modification

Prérequis : Une application Streamlit fonctionnelle en local et un compte GitHub (gratuit).

Pourquoi Streamlit Cloud ?

Comparaison avec les alternatives

Critère Streamlit Cloud Heroku Render Railway
Prix ✅ Gratuit illimité ❌ Payant (7$/mois) ⚠️ Gratuit limité ⚠️ Gratuit limité
Setup ⭐⭐⭐⭐⭐ 1 clic ⭐⭐⭐ Configuration ⭐⭐⭐ Configuration ⭐⭐⭐ Configuration
HTTPS ✅ Automatique ✅ Automatique ✅ Automatique ✅ Automatique
Redéploiement auto ✅ À chaque commit ⚠️ Manuel ✅ Configurable ✅ Configurable
Logs ✅ En temps réel ✅ Oui ✅ Oui ✅ Oui
Domaine custom ✅ Gratuit ❌ Payant ⚠️ Limité ⚠️ Limité

Verdict : Streamlit Cloud est imbattable pour héberger gratuitement des apps Streamlit.

Étape 0 : Préparer votre application

Avant de déployer, assurez-vous que votre projet a cette structure :

mon-app-streamlit/
├── app.py                 # Votre application principale
├── requirements.txt       # Dépendances Python
├── .streamlit/
│   └── config.toml       # Configuration (optionnel)
├── data/                  # Vos données (optionnel)
└── README.md             # Documentation

Créer le fichier requirements.txt

C'est crucial : listez toutes vos dépendances Python.

# Générer automatiquement
pip freeze > requirements.txt

Exemple de requirements.txt minimal :

streamlit==1.30.0
pandas==2.1.4
plotly==5.18.0

⚠️ Erreur courante : Oublier une dépendance = app qui crash au déploiement.

Configuration optionnelle (.streamlit/config.toml)

Créez un fichier .streamlit/config.toml pour personnaliser l'apparence :

[theme]
primaryColor = "#FF4B4B"
backgroundColor = "#FFFFFF"
secondaryBackgroundColor = "#F0F2F6"
textColor = "#262730"
font = "sans serif"

[server]
headless = true
port = 8501

Étape 1 : Pousser votre code sur GitHub

Streamlit Cloud se connecte directement à GitHub pour déployer votre app.

Si vous n'avez pas encore de repo GitHub

# Dans le dossier de votre projet
git init
git add .
git commit -m "Initial commit - Mon app Streamlit"

# Créer un repo sur GitHub.com (via l'interface)
# Puis lier le repo local au remote
git remote add origin https://github.com/votre-username/mon-app-streamlit.git
git branch -M main
git push -u origin main

Si vous avez déjà un repo

git add .
git commit -m "Prêt pour déploiement Streamlit Cloud"
git push

Checkpoint : Votre code est maintenant sur GitHub. Passons au déploiement !

Étape 2 : Créer un compte Streamlit Cloud

  1. Allez sur share.streamlit.io
  2. Cliquez sur "Sign up"
  3. Connectez-vous avec votre compte GitHub (recommandé)

Streamlit Cloud Sign Up

Pourquoi utiliser GitHub ? : Connexion directe à vos repos = déploiement en 1 clic.

Étape 3 : Déployer votre app en 1 clic

Via l'interface Streamlit Cloud

  1. Cliquez sur "New app"
  2. Sélectionnez votre repository GitHub
  3. Choisissez la branche (généralement main)
  4. Indiquez le chemin vers votre fichier principal : app.py
  5. Cliquez sur "Deploy!"

Streamlit Cloud Deploy

Configuration avancée (optionnelle)

Avant de cliquer "Deploy", vous pouvez :

Changer l'URL de l'app :

  • Par défaut : https://votre-username-mon-app-streamlit.streamlit.app
  • Personnalisée : https://mon-app-custom.streamlit.app (gratuit !)

Choisir la version Python :

  • Python 3.9, 3.10, 3.11 disponibles
  • Recommandé : 3.10 (bon équilibre stabilité/nouveautés)

Étape 4 : Gérer les secrets et variables d'environnement

Si votre app utilise des API keys ou mots de passe, ne les committez JAMAIS dans GitHub !

Ajouter des secrets dans Streamlit Cloud

  1. Ouvrez votre app sur Streamlit Cloud
  2. Cliquez sur "Settings" (icône ⚙️)
  3. Allez dans "Secrets"
  4. Ajoutez vos secrets au format TOML :
# Secrets (format TOML)
OPENAI_API_KEY = "sk-..."
DATABASE_URL = "postgresql://user:pass@host:5432/db"

[api]
key = "ma-cle-secrete"
endpoint = "https://api.exemple.com"

Utiliser les secrets dans votre code

import streamlit as st

# Accéder aux secrets
api_key = st.secrets["OPENAI_API_KEY"]
db_url = st.secrets["DATABASE_URL"]

# Secrets imbriqués
api_endpoint = st.secrets["api"]["endpoint"]

⚠️ Sécurité : Les secrets sont chiffrés et jamais exposés dans les logs.

Alternative : Fichier .streamlit/secrets.toml (local uniquement)

Pour tester en local sans exposer vos secrets :

# .streamlit/secrets.toml (AJOUTER À .gitignore !)
OPENAI_API_KEY = "sk-test-local"

Important : Ajoutez ce fichier au .gitignore :

echo ".streamlit/secrets.toml" >> .gitignore
git add .gitignore
git commit -m "Ignore secrets file"

Étape 5 : Suivre le déploiement et déboguer

Logs en temps réel

Pendant le déploiement, Streamlit Cloud affiche les logs en temps réel :

[timestamp] Cloning repository...
[timestamp] Installing requirements from requirements.txt...
[timestamp] Collecting streamlit==1.30.0
[timestamp] Successfully installed streamlit-1.30.0
[timestamp] Starting app...
[timestamp] You can now view your Streamlit app in your browser.

Erreurs courantes et solutions

❌ Erreur : "No module named 'xxx'"

Cause : Dépendance manquante dans requirements.txt

Solution :

# En local, identifier la dépendance manquante
pip install xxx

# Ajouter à requirements.txt
echo "xxx==1.2.3" >> requirements.txt

# Commit et push
git add requirements.txt
git commit -m "Add missing dependency"
git push

Le redéploiement se fera automatiquement !

❌ Erreur : "Port 8501 is already in use"

Cause : Tentative de spécifier un port manuellement

Solution : Supprimez toute ligne st.set_option('server.port', ...) de votre code. Streamlit Cloud gère le port automatiquement.

❌ Erreur : "Memory limit exceeded"

Cause : Votre app utilise trop de RAM (limite : 1 GB sur plan gratuit)

Solutions :

  1. Optimiser le chargement des données avec @st.cache_data
  2. Réduire la taille des datasets
  3. Passer à Streamlit Cloud Teams ($250/mois, 8 GB RAM)
import streamlit as st

@st.cache_data  # Cache les données pour économiser la RAM
def load_large_dataset():
    return pd.read_csv('huge_file.csv')

❌ Erreur : "File not found"

Cause : Chemin relatif incorrect

Solution : Utilisez des chemins relatifs depuis la racine du projet :

import os
import streamlit as st

# ❌ Mauvais
df = pd.read_csv('../data/file.csv')

# ✅ Bon
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(BASE_DIR, 'data', 'file.csv'))

# ✅ Encore mieux (Python 3.9+)
from pathlib import Path
df = pd.read_csv(Path(__file__).parent / 'data' / 'file.csv')

Étape 6 : Redéploiement automatique

La killer feature de Streamlit Cloud : le redéploiement automatique.

Comment ça marche ?

  1. Vous modifiez votre code en local
  2. Vous commitez et pushez sur GitHub
  3. Streamlit Cloud détecte automatiquement le commit
  4. Votre app se redéploie en 30-60 secondes

Exemple de workflow

# Modifier app.py
vim app.py

# Commiter et pousser
git add app.py
git commit -m "Fix: Corriger bug affichage graphique"
git push

# ✨ Streamlit Cloud redéploie automatiquement !
# Rafraîchir votre navigateur dans 30s pour voir les changements

Désactiver le redéploiement auto (optionnel)

Si vous voulez tester des changements sans redéployer :

  1. Allez dans Settings > Auto-deploy
  2. Désactivez "Automatically deploy when you push to main"
  3. Cliquez manuellement sur "Reboot app" quand vous êtes prêt

Étape 7 : Configurer un domaine personnalisé (gratuit)

Par défaut, votre app est accessible sur :

https://votre-username-mon-app.streamlit.app

Vous pouvez configurer un domaine personnalisé gratuitement !

Option 1 : Sous-domaine Streamlit Cloud (gratuit, instant)

Lors du déploiement, choisissez un nom court :

https://ma-super-app.streamlit.app

Avantages :

  • ✅ Gratuit
  • ✅ HTTPS automatique
  • ✅ Disponible instantanément

Option 2 : Votre propre domaine (nécessite un domaine)

Si vous possédez mondomaine.com, vous pouvez configurer :

https://app.mondomaine.com

Configuration DNS :

  1. Ajoutez un enregistrement CNAME :

    • Host : app
    • Points to : votre-app.streamlit.app
    • TTL : 3600
  2. Dans Streamlit Cloud Settings :

    • Custom domain : app.mondomaine.com

Délai : Propagation DNS 1-48h (généralement < 1h)

Étape 8 : Optimiser les performances

Cache intelligent avec @st.cache_data

import streamlit as st
import pandas as pd

@st.cache_data(ttl=3600)  # Cache 1h
def load_data():
    """Charge les données (coûteux)"""
    return pd.read_csv('https://exemple.com/big_data.csv')

# Utilisation
df = load_data()  # Premier appel : chargement
df = load_data()  # Appels suivants : instantané (cache)

Cache des connexions avec @st.cache_resource

import streamlit as st
from sqlalchemy import create_engine

@st.cache_resource
def init_db_connection():
    """Initialise la connexion DB (1 seule fois)"""
    return create_engine(st.secrets["DATABASE_URL"])

# Utilisation
engine = init_db_connection()
df = pd.read_sql("SELECT * FROM users", engine)

Lazy loading des données

import streamlit as st

# ❌ Mauvais : charge tout au démarrage
df = pd.read_csv('huge_file.csv')
st.dataframe(df)

# ✅ Bon : charge seulement ce qui est nécessaire
@st.cache_data
def load_filtered_data(category):
    df = pd.read_csv('huge_file.csv')
    return df[df['category'] == category]

category = st.selectbox("Catégorie", ["A", "B", "C"])
df = load_filtered_data(category)  # Charge uniquement la catégorie sélectionnée
st.dataframe(df)

Étape 9 : Monitoring et analytics

Logs de l'application

Accédez aux logs en temps réel :

  1. Ouvrez votre app sur Streamlit Cloud
  2. Cliquez sur "Manage app" (icône ⚙️)
  3. Consultez les logs dans "Logs"

Métriques disponibles

Streamlit Cloud vous donne accès à :

  • Nombre de visiteurs uniques
  • Durée des sessions
  • Pages vues
  • Erreurs (crashes, timeouts)

Ajouter Google Analytics (optionnel)

import streamlit as st

# Injecter le script Google Analytics
st.markdown("""
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-XXXXXXXXXX');
</script>
""", unsafe_allow_html=True)

Étape 10 : Limites du plan gratuit et alternatives

Limites Streamlit Cloud (plan gratuit)

Ressource Limite gratuite Impact
Apps publiques Illimité ✅ Parfait pour side projects
Apps privées 1 seule ⚠️ Limité pour projets internes
RAM 1 GB ⚠️ Suffisant pour 80% des apps
CPU Partagé ⚠️ Possible lenteur aux heures de pointe
Visiteurs Illimité ✅ Excellent
Bande passante Illimité ✅ Excellent

Quand upgrader vers Streamlit Cloud Teams ?

Passez à Teams ($250/mois) si :

  • ✅ Vous avez besoin de plusieurs apps privées
  • ✅ Votre app utilise > 1 GB de RAM
  • ✅ Vous voulez un support prioritaire
  • ✅ Vous avez besoin d'authentification SSO

Alternatives gratuites si limitations

Render.com (gratuit avec limites) :

# render.yaml
services:
  - type: web
    name: streamlit-app
    env: python
    buildCommand: pip install -r requirements.txt
    startCommand: streamlit run app.py --server.port=$PORT --server.address=0.0.0.0

Railway.app (5$/mois après trial) : Déploiement similaire à Streamlit Cloud

Docker + VPS (à partir de 5$/mois) : Contrôle total mais configuration manuelle

Checklist finale : Votre app est prête ?

Avant de partager votre app publiquement, vérifiez :

  • Aucun secret n'est commité dans GitHub
  • requirements.txt est à jour et complet
  • ✅ L'app fonctionne en local sans erreur
  • ✅ Les chemins de fichiers sont relatifs (pas absolus)
  • ✅ Un README.md explique le projet
  • ✅ Le cache est configuré pour les opérations coûteuses
  • ✅ L'app a été testée sur plusieurs navigateurs
  • ✅ Les données sensibles sont dans les secrets Streamlit
  • ✅ Le design est responsive (mobile friendly)
  • ✅ Les erreurs sont gérées avec try/except

Exemple complet : App météo déployée

Voici une mini-app complète prête à déployer :

Structure du projet

meteo-app/
├── app.py
├── requirements.txt
├── .streamlit/
│   └── config.toml
└── README.md

app.py

import streamlit as st
import requests
from datetime import datetime

st.set_page_config(page_title="Météo France", page_icon="🌤️")

st.title("🌤️ Météo en temps réel")

# Sélection de la ville
ville = st.selectbox(
    "Choisissez une ville",
    ["Paris", "Lyon", "Marseille", "Toulouse", "Nice"]
)

# API OpenWeather (nécessite une clé gratuite)
@st.cache_data(ttl=600)  # Cache 10 minutes
def get_weather(city):
    api_key = st.secrets["OPENWEATHER_API_KEY"]
    url = f"https://api.openweathermap.org/data/2.5/weather?q={city},fr&appid={api_key}&units=metric&lang=fr"
    return requests.get(url).json()

if st.button("Obtenir la météo"):
    with st.spinner("Chargement..."):
        data = get_weather(ville)

        if data.get("cod") == 200:
            temp = data["main"]["temp"]
            description = data["weather"][0]["description"]
            humidity = data["main"]["humidity"]

            col1, col2, col3 = st.columns(3)
            col1.metric("Température", f"{temp}°C")
            col2.metric("Humidité", f"{humidity}%")
            col3.metric("Conditions", description.capitalize())
        else:
            st.error("Impossible de récupérer les données météo")

st.caption(f"Dernière mise à jour : {datetime.now().strftime('%H:%M')}")

requirements.txt

streamlit==1.30.0
requests==2.31.0

Secrets (dans Streamlit Cloud)

OPENWEATHER_API_KEY = "votre-cle-api-gratuite"

Déploiement

git init
git add .
git commit -m "App météo Streamlit"
git remote add origin https://github.com/username/meteo-app.git
git push -u origin main

Puis déployez sur share.streamlit.io en 1 clic !

Résolution de problèmes avancés

Mon app est lente

Diagnostics :

  1. Vérifiez l'utilisation de @st.cache_data sur les fonctions coûteuses
  2. Profilez votre code avec streamlit run app.py --logger.level=debug
  3. Réduisez la fréquence de st.rerun()

Solutions :

# ❌ Lent : rechargement à chaque interaction
df = pd.read_csv('big_file.csv')

# ✅ Rapide : cache
@st.cache_data
def load_data():
    return pd.read_csv('big_file.csv')

L'app se redémarre toute seule

Cause : Streamlit Cloud redémarre les apps inactives après 7 jours

Solution : Visitez votre app régulièrement, ou passez au plan Teams pour désactiver le sleep mode

Erreur CORS avec une API externe

Solution : Utilisez un backend intermédiaire ou activez CORS sur votre API

# Si vous contrôlez l'API
from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)  # Autoriser tous les domaines

Conclusion : Votre app Streamlit est en ligne !

Félicitations ! Vous savez maintenant :

✅ Déployer une app Streamlit gratuitement en 10 minutes ✅ Gérer les secrets et variables d'environnement ✅ Optimiser les performances avec le cache ✅ Résoudre les erreurs courantes ✅ Configurer un domaine personnalisé ✅ Monitorer votre application

Prochaines étapes :

  1. Partagez votre app sur LinkedIn, Twitter, Reddit
  2. Ajoutez votre app à la Streamlit Gallery
  3. Collectez les feedbacks utilisateurs
  4. Itérez et améliorez votre app

Ressources pour aller plus loin

Apprendre Streamlit

Documentation officielle

Communauté


Besoin d'aide pour déployer votre app ? Testez gratuitement mon outil Roast My Streamlit - il analyse votre code et vous donne des recommandations personnalisées pour l'optimiser avant le déploiement !

Vous voulez créer des apps Streamlit professionnelles ? Découvrez ma formation Streamlit Unleashed : CSS avancé, authentification, déploiement multi-plateforme et 15 projets concrets.

Livre Business Intelligence avec Python

📚 Approfondir avec mon livre

"Business Intelligence avec Python" - Le guide complet pour maîtriser l'analyse de données

Voir sur Amazon →

📬 Ne manquez rien de l'actualité data

Rejoignez +1000 professionnels qui reçoivent chaque semaine mes analyses, conseils et découvertes data.

S'abonner gratuitement
Prochaine révision : Trimestre prochain