Déployer une stack Python (Flask + PostgreSQL)
Une application Flask minimale qui compte les visites d'une page dans PostgreSQL, déployée comme une Stack : la plateforme injecte la chaîne de connexion à la base dans l'application web et déploie les deux dans l'ordre — sans recopier le moindre identifiant.
Résultat attendu : en visitant l'application, vous lisez Hello from Kuploy Stacks! Visits: N, le compteur augmentant à chaque rafraîchissement.
1. L'application
Le code est le même quelle que soit la méthode de build retenue :
app.py
import os
import psycopg
from flask import Flask
app = Flask(__name__)
DATABASE_URL = os.environ["DATABASE_URL"] # injectée par la connexion de la stack
def init_db():
with psycopg.connect(DATABASE_URL) as conn:
conn.execute("CREATE TABLE IF NOT EXISTS visits (count int)")
if conn.execute("SELECT count(*) FROM visits").fetchone()[0] == 0:
conn.execute("INSERT INTO visits VALUES (0)")
@app.route("/")
def home():
with psycopg.connect(DATABASE_URL) as conn:
conn.execute("UPDATE visits SET count = count + 1")
n = conn.execute("SELECT count FROM visits").fetchone()[0]
return f"Hello from Kuploy Stacks! Visits: {n}"
init_db()
requirements.txt
flask
psycopg[binary]
gunicorn
Récupérez le tout depuis kuploy/examples (sous-répertoire flask-postgres), ou créez les fichiers vous-même et poussez-les dans un dépôt Git. Traitez d'abord les prérequis des tutoriels — un fournisseur Git connecté et un registre de build — puis connectez le dépôt et renseignez le chemin de build comme dans Déployer votre première application.
2. Choisir une méthode de build
Kuploy sait construire ce même code de plusieurs façons. Choisissez-en une — votre choix est repris d'un tutoriel à l'autre. Voir Méthodes de build pour la liste complète.
- Dockerfile
- Nixpacks
La maîtrise complète. Le dépôt contient un Dockerfile :
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:app"]
À la création de l'application, choisissez Build Type → Dockerfile et saisissez Dockerfile dans le champ Docker File : il est obligatoire, et s'entend relativement au chemin de build. Vous pouvez laisser Docker Context Path vide.
Sans configuration : Nixpacks reconnaît Python tout seul et installe requirements.txt. Aucun Dockerfile n'est nécessaire. Ajoutez un nixpacks.toml pour qu'il démarre sous gunicorn en production :
[start]
cmd = "gunicorn -b 0.0.0.0:8000 app:app"
À la création de l'application, choisissez Build Type → Nixpacks.
3. Créer les services
Dans l'environnement de votre projet :
- Create Service → Application, nommée
web. L'assistant Set up your application s'ouvre : suivez les étapes dans l'ordre, ou fermez-le pour passer par les onglets du service.- Source — pointez vers votre dépôt Git (renseignez Build Path à
flask-postgressi vous partez dekuploy/examples). - Build — choisissez le Build Type retenu ci-dessus.
- Network — mettez le port à 8000 ; ajoutez un domaine si vous voulez la rendre publique.
- Registry — sélectionnez le registre des prérequis ; sans lui, le build n'a nulle part où pousser et le déploiement échoue sur Registry required. (Étape automatiquement sautée pour une source de type image Docker ou un déploiement sur serveur unique.)
- Deploy — reste désactivé tant que la source et le registre ne sont pas définis. Ne déployez pas encore : il faut d'abord la base de données.
- Source — pointez vers votre dépôt Git (renseignez Build Path à
- Create Service → Database → PostgreSQL, nommée
db(les valeurs par défaut conviennent). Sa chaîne de connexion interne — affichée dans l'onglet General de la base — estpostgresql://<utilisateur>:<motdepasse>@<nom-applicatif-de-la-base>:5432/<base>, l'hôte étant le nom applicatif du service (voir Bases de données). C'est exactement cette chaîne que la stack injectera sous le nomDATABASE_URL.
4. Les regrouper dans une stack
- Barre d'outils de l'environnement → Stacks → Create stack, nommez-la
visits, puis ouvrez-la. - Add component → ajoutez
web, puisdb.
5. Les relier
Tirez un fil du nœud db vers le nœud web (ou cliquez sur Connect) :
- Provider :
db - Source field :
connectionString - Consumer :
web - Env var name :
DATABASE_URL
Cela injecte postgresql://utilisateur:motdepasse@db-nomapp:5432/nombase dans web au moment du déploiement. psycopg la lit directement.
6. Déployer
Cliquez sur Deploy stack. La plateforme déploie db en premier, puis web, puisque web dépend de db. Ouvrez le domaine de l'application : rafraîchissez, et le compteur grimpe.
Dans l'onglet Environment du service web, vous verrez un bloc géré contenant la valeur résolue de DATABASE_URL. C'est la connexion de la stack à l'œuvre.
Ce que vous avez appris
- Un composant de stack reste un service ordinaire :
webetdbconservent tous leurs réglages. - Une seule connexion remplace tout le câblage manuel des identifiants.
- L'ordre des dépendances découle automatiquement de la connexion.
- La même application se déploie via Dockerfile ou Nixpacks — seule la configuration de build change.