Aller au contenu principal

Déployer une stack PHP (Apache + MySQL)

Une application PHP minimale qui compte les visites d'une page dans MySQL, déployée comme une Stack. Contrairement aux tutoriels Python et Node, qui injectent une seule connectionString, celui-ci câble les champs un par un — hôte, utilisateur, mot de passe, base — ce qui correspond à l'usage en PHP avec mysqli.

Résultat attendu : en visitant l'application, vous lisez Hello from Kuploy Stacks! Visits: N, le compteur augmentant à chaque rafraîchissement.

1. L'application​

index.php
index.php
<?php
// Chaque valeur est injectée par une connexion de stack distincte.
$db = new mysqli(
getenv('DB_HOST'),
getenv('DB_USER'),
getenv('DB_PASSWORD'),
getenv('DB_NAME')
);
$db->query("CREATE TABLE IF NOT EXISTS visits (count INT)");
$db->query("INSERT INTO visits (count) SELECT 0 WHERE NOT EXISTS (SELECT 1 FROM visits)");
$db->query("UPDATE visits SET count = count + 1");
$n = $db->query("SELECT count FROM visits")->fetch_row()[0];
echo "Hello from Kuploy Stacks! Visits: {$n}";

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

Voir Méthodes de build pour la liste complète.

C'est la méthode recommandée pour cet exemple. Le dépôt contient un Dockerfile :

Dockerfile
FROM php:8.3-apache
RUN docker-php-ext-install mysqli
COPY . /var/www/html/
EXPOSE 80

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

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 à php-mysql si vous partez de kuploy/examples).
    • Build — choisissez le Build Type ci-dessus (Dockerfile pour cet exemple).
    • Network — mettez le port à 80 ; 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 → MySQL, nommée db ; notez le nom de la base, l'utilisateur et le mot de passe que vous définissez. L'hôte interne est le nom applicatif du service (mysql://<utilisateur>:<motdepasse>@<nom-applicatif-de-la-base>:3306/<base>, visible dans l'onglet General de la base ; voir Bases de données) — les connexions ci-dessous injectent host, user, password et database séparément.

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 (quatre champs)​

Ouvrez Connect et créez quatre connexions, toutes du fournisseur db vers le consommateur web :

Champ sourceNom de la variable
hostDB_HOST
userDB_USER
passwordDB_PASSWORD
databaseDB_NAME

Chaque connexion injecte une valeur ; ensemble, elles donnent à mysqli tout ce dont il a besoin. host se résout en nom de service interne au cluster : le trafic ne quitte donc jamais votre réseau privé.

6. Déployer​

Cliquez sur Deploy stack : db se déploie avant web, puisqu'il est le fournisseur des quatre connexions. 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é où DB_HOST, DB_USER, DB_PASSWORD et DB_NAME sont résolus.

Ce que vous avez appris​

  • Une connexion peut injecter une connectionString complète ou des champs isolés (host, user, password, database) : utilisez ce que votre pile technique attend.
  • Plusieurs connexions depuis un même fournisseur ne posent aucun problème ; la plateforme déploie toujours db en premier.

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