Gestion du multi-instances

Créer le dossier dédié à l’instance

Créez un dossier dédié à l’instance dans l’arborescence du serveur, par exemple /var/www/app/instancename, puis créez les fichiers nécessaires pour assurer la séparation des instances :

# Dossier contenant le code de l'application
APP=/var/www/app
# Dossier comprenant les paramètres spécifiques de l'instance
FOLDER="/var/www/instances/instancename"
mkdir -P $FOLDER
chmod g+r $FOLDER
cd $FOLDER
mkdir temp
# Nouvelles cles cryptographiques
openssl genpkey -algorithm rsa -out id_app -pkeyopt rsa_keygen_bits:2048
openssl rsa -in id_app -pubout -out id_app.pub
# Recopie du fichier de parametrage
cp $APP/env .env
# Mise à niveau des droits
chmod -R g+r .
chmod g+w temp
chown www-data id_app

le dossier temp est le dossier dans lequel l’application va générer tous les fichiers avant leur envoi au navigateur. Pour éviter les risques de collision entre deux instances, il est vivement recommandé que chacune dispose de son propre espace.

Mettre à niveau du site virtuel Apache

Rajoutez, dans la description du site virtuel (fichier moninstance.conf, dans /etc/apache2/sites-available) :

<VirtualHost *:443>
    (...)
    DocumentRoot /var/www/app
    setenv envPath /var/www/instances/instancename
    (...)  

Modifier les paramètres

Éditez le fichier /var/www/instances/instancename/.env :

app.baseURL = 'https://myinstance.mysociety.com'
BASE_DIR = "/var/www/instances/instancename"
app.privateKey = ${BASE_DIR}/id_app
app.pubKey = ${BASE_DIR}/id_app.pub
app.APP_temp = ${BASE_DIR}/temp
database.default.hostname = localhost
database.default.database = dbname_instance
database.default.username = login_instance
database.default.password = password_instance

Vérifiez également le mode d’identification par défaut, et adaptez-le le cas échéant.

Adapter les scripts lancés en ligne de commande

Si vous utilisez des scripts qui sont exécutés en ligne de commande, par exemple programmés à horaires réguliers (crontab), vous devrez modifier le script de lancement :

#!/bin/bash
export envPath=/var/www/instances/instancename
cd $envPath/public
php index.php monscript

monscript correspond à la route à appeler.

La variable envPath est disponible dans $_SERVER.

Technique : modifications apportées au code pour gérer le multi-instances

La fin du fichier index.php est modifié ainsi :

//exit(CodeIgniter\Boot::bootWeb($paths));
require FCPATH. '../vendor/equinton/ppci/src/BootApp.php';
exit (CodeIgniter\BootApp::bootweb($paths));

Et la classe BootApp contient ce code :

<?php

namespace CodeIgniter;

use CodeIgniter\Boot;
use Config\Paths;
use CodeIgniter\Config\DotEnv;

class BootApp extends Boot {

    protected static function loadDotEnv(Paths $paths): void
    {
        require_once $paths->systemDirectory . '/Config/DotEnv.php';
        if (is_file($file = $_SERVER["envPath"] . DIRECTORY_SEPARATOR . ".env") && is_readable($file)) {
            (new DotEnv($_SERVER["envPath"],".env"))->load();
        } else {
            (new DotEnv($paths->appDirectory . '/../'))->load();
        }
    }
}

Attention : l’utilisation d’un fichier .env placé ailleurs qu’à la racine de l’application empêche le fonctionnement des outils de débogage de CodeIgniter (mode développement).