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
<?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.
- Dockerfile
- Nixpacks
C'est la méthode recommandée pour cet exemple. Le dépôt contient un 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.
Le fournisseur PHP de Nixpacks attend un composer.json, et sert l'application via nginx et php-fpm sur $PORT. Cet exemple minimal, réduit à un seul index.php, n'a pas de composer.json : il ne se construit de façon fiable qu'avec la méthode Dockerfile ci-dessus. Si votre application PHP repose sur Composer, choisissez Build Type → Nixpacks et réglez le port sur celui que Nixpacks utilise ($PORT) ; sinon, restez sur le Dockerfile.
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 à
php-mysqlsi vous partez dekuploy/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.
- Source — pointez vers votre dépôt Git (renseignez Build Path à
- 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 injectenthost,user,passwordetdatabaseséparément.
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 (quatre champs)
Ouvrez Connect et créez quatre connexions, toutes du fournisseur db vers le consommateur web :
| Champ source | Nom de la variable |
|---|---|
host | DB_HOST |
user | DB_USER |
password | DB_PASSWORD |
database | DB_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.
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
connectionStringcomplè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
dben premier.