Aller au contenu principal

Déployer une stack Node.js (Express + PostgreSQL)

Une application Express 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.

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 :

index.js
index.js
const express = require("express");
const { Pool } = require("pg");

const pool = new Pool({ connectionString: process.env.DATABASE_URL }); // injectée par la stack
const app = express();

app.get("/", async (_req, res) => {
await pool.query("CREATE TABLE IF NOT EXISTS visits (count int)");
await pool.query(
"INSERT INTO visits (count) SELECT 0 WHERE NOT EXISTS (SELECT 1 FROM visits)",
);
const { rows } = await pool.query(
"UPDATE visits SET count = count + 1 RETURNING count",
);
res.send(`Hello from Kuploy Stacks! Visits: ${rows[0].count}`);
});

app.listen(3000, () => console.log("listening on 3000"));
package.json
package.json
{
"name": "visits",
"version": "1.0.0",
"main": "index.js",
"scripts": { "start": "node index.js" },
"dependencies": { "express": "^4.19.2", "pg": "^8.12.0" }
}

Récupérez le tout depuis kuploy/examples (sous-répertoire express-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​

Choisissez-en une — votre choix est repris d'un tutoriel à l'autre. Voir Méthodes de build pour la liste complète.

La maîtrise complète. Le dépôt contient un Dockerfile :

Dockerfile
FROM node:20-slim
WORKDIR /app
COPY package.json ./
RUN npm install --omit=dev
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

À la création de l'application, choisissez Build Type → Dockerfile et saisissez Dockerfile dans le champ Docker File (obligatoire, et relatif au chemin de build).

3. Créer les services​

Dans l'environnement de votre projet :

  1. 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 à express-postgres si vous partez de kuploy/examples).
    • Build — choisissez le Build Type retenu ci-dessus.
    • Network — mettez le port à 3000 ; 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.
  2. 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 — est postgresql://<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 nom DATABASE_URL.

4. Les regrouper dans une stack​

  1. Barre d'outils de l'environnement → Stacks → Create stack, nommez-la visits, puis ouvrez-la.
  2. Add component → ajoutez web, puis db.

5. Les relier​

Tirez un fil de db vers web (ou cliquez sur Connect) :

  • Provider : db
  • Source field : connectionString
  • Consumer : web
  • Env var name : DATABASE_URL

Le Pool de pg lit DATABASE_URL directement.

6. Déployer​

Cliquez sur Deploy stack : db se déploie avant web. Ouvrez le domaine de l'application et rafraîchissez ; le compteur grimpe.

Vérifier l'injection

L'onglet Environment du service web affiche un bloc géré contenant la valeur résolue de DATABASE_URL.

Ce que vous avez appris​

  • Un composant de stack reste un service ordinaire.
  • Une seule connexion injecte l'URL de la base : aucun câblage manuel d'identifiants.
  • L'ordre de déploiement découle automatiquement de la connexion.
  • La même application se déploie via Dockerfile ou Nixpacks — seule la configuration de build change.

La suite : la même application en Python ou en PHP.