documentation
Kohinos v3 Doc générée le commit 8d60b1904

Installation

Procédure d'installation pour développement local et déploiement serveur. Le projet est structuré pour fonctionner sur une machine modeste (Raspberry Pi 4 4 Go suffit pour une instance avec ~500 adhérents).

Pré-requis système

Extensions PHP requises

ExtensionRôlePaquet Debian/Ubuntu
intlInternationalisation (formats, traductions)php8.4-intl
mbstringManipulation UTF-8 (obligatoire Symfony)php8.4-mbstring
pdo_mysqlConnexion MariaDB/MySQL (Doctrine)php8.4-mysql
sodiumSignatures Ed25519 (SEPA), libsodiumphp8.4-sodium
bcmathCalculs monétaires précis (eMLc)php8.4-bcmath
gdGénération d'images / QR codesphp8.4-gd
xml · dom · simplexmlGénération SEPA pain.008 (ISO 20022)php8.4-xml
zipArchives (exports, fixtures, Composer)php8.4-zip
curlHelloAsso, PayZen, webhooks sortantsphp8.4-curl
opcacheCache de bytecode (perf prod)php8.4-opcache
opensslTLS sortant (HTTPS, SMTP STARTTLS)built-in
iconvConversion d'encodagebuilt-in
pcreRegex (built-in)built-in
fileinfoDétection MIME (uploads)built-in
tokenizer · ctype · sessionSymfony corebuilt-in
xdebug (dev/CI)Couverture PHPUnit, debugphp8.4-xdebug
⚠ sodium et bcmath sont critiques

Sans sodium les signatures SEPA échouent (chaînage cryptographique). Sans bcmath, les calculs monétaires retombent sur des float et peuvent générer des écarts d'arrondi : refus de démarrage en prod.

Installation rapide (Debian 12 / Ubuntu 24.04)

# Dépôt Sury pour PHP 8.4
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg
sudo curl -sSL https://packages.sury.org/php/apt.gpg -o /etc/apt/trusted.gpg.d/sury-php.gpg
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" \
    > /etc/apt/sources.list.d/sury-php.list'
sudo apt update

# Paquets requis
sudo apt install -y \
    php8.4 php8.4-cli php8.4-fpm \
    php8.4-intl php8.4-mbstring php8.4-mysql php8.4-sodium \
    php8.4-bcmath php8.4-gd php8.4-xml php8.4-zip \
    php8.4-curl php8.4-opcache \
    mariadb-server nginx \
    composer git nodejs npm

# Vérification
php -m | grep -E '^(sodium|bcmath|intl|pdo_mysql|gd|xml|zip|curl|mbstring|opcache)$'

Installation locale

# 1. Clone
git clone https://gitlab.com/federation-kohinos/kohinos.git
cd kohinos

# 2. Dépendances PHP et JS
composer install
npm install

# 3. Configurer .env.local
cp .env .env.local
# Éditer DATABASE_URL, MAILER_DSN, APP_SECRET, PAYUM_*

# 4. Base de données
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate --no-interaction

# 5. Fixtures (optionnel, dev uniquement)
php bin/console doctrine:fixtures:load --no-interaction

# 6. Comptes manquants et invariants
php bin/console kohinos:accounts:create
php bin/console kohinos:accounts:check

# 7. Assets
npm run dev

# 8. Lancer le serveur
symfony server:start

Variables d'environnement clés

VariableRôleExemple
APP_ENVEnvironnementdev · prod · test
APP_SECRETSecret Symfony (signatures CSRF…)32 octets aléatoires
DATABASE_URLDSN Doctrinemysql://user:pwd@127.0.0.1:3306/kohinos?serverVersion=mariadb-10.6
MAILER_DSNSMTP symfony/mailersmtp://user:pwd@mail.example.org:587
MAILER_FROMExpéditeur défautnoreply@kohinos.example
KOHINOS_IBAN_SECRETClé chiffrement IBAN (AES-256-CBC)32 octets base64
PAYUM_HELLOASSO_*Credentials HelloAssoclient_id / client_secret / organization_slug
PAYUM_PAYZEN_*Credentials PayZenshop_id / cert_test / cert_prod
SECURE_SCHEMESchéma sécuriséhttps en prod, http en test
⛔ Secrets en clair

.env.local n'est pas versionné. En prod, préférer les Symfony secrets chiffrés (bin/console secrets:set) plutôt qu'un .env.local nu.

Installation serveur (prod)

# 1. Cloner sur le serveur
cd /var/www
sudo -u www-data git clone https://gitlab.com/federation-kohinos/kohinos.git kohinos
cd kohinos

# 2. Dépendances optimisées prod
sudo -u www-data composer install --no-dev --optimize-autoloader

# 3. Permissions
sudo chown -R www-data:www-data var/

# 4. Migrations
sudo -u www-data php bin/console doctrine:migrations:migrate --env=prod --no-interaction

# 5. Cache
sudo -u www-data php bin/console cache:clear --env=prod --no-debug
sudo -u www-data php bin/console cache:warmup --env=prod
Assets front pré-compilés

Les assets front sont pré-compilés et versionnés dans public/build/ (+ public/sw.js). Aucune installation de Node/npm/yarn n'est requise sur le serveur et il n'y a pas d'étape npm ci / npm run build au déploiement. La republication des bundles se fait côté développement, puis public/build/ est committé (voir scripts/build-and-stage-assets.sh et le garde-fou CI assets-freshness des pipelines Woodpecker, via scripts/ci-assets-freshness.sh).

VirtualHost Nginx (extrait)

server {
    server_name kohinos.example.org;
    root /var/www/kohinos/public;
    index index.php;

    location / { try_files $uri /index.php$is_args$args; }
    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        internal;
    }
    location ~ \.php$ { return 404; }

    listen 443 ssl http2;
    # ssl_certificate / ssl_certificate_key (Let's Encrypt)
}

VirtualHost Apache 2 (extrait)

Modules requis : rewrite, headers, ssl, http2, proxy, proxy_fcgi, setenvif.

# Activation des modules (Debian / Ubuntu)
sudo a2enmod rewrite headers ssl http2 proxy proxy_fcgi setenvif
sudo a2enconf php8.4-fpm   # si présent (paquet php8.4-fpm)
sudo systemctl reload apache2
# /etc/apache2/sites-available/kohinos.conf
<VirtualHost *:80>
    ServerName kohinos.example.org
    Redirect permanent / https://kohinos.example.org/
</VirtualHost>

<VirtualHost *:443>
    ServerName kohinos.example.org
    DocumentRoot /var/www/kohinos/public

    Protocols h2 http/1.1
    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/live/kohinos.example.org/fullchain.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/kohinos.example.org/privkey.pem

    <Directory /var/www/kohinos/public>
        AllowOverride None
        Require all granted

        # Routage Symfony front controller
        FallbackResource /index.php

        # Sécurité : pas d'exécution PHP en dehors d'index.php
        <FilesMatch "\.php$">
            Require all denied
        </FilesMatch>
        <Files index.php>
            Require all granted
        </Files>
    </Directory>

    # Exécution PHP via php-fpm (socket UNIX)
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://localhost/"
    </FilesMatch>

    # En-têtes de sécurité (à ajuster selon vos besoins)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Content-Type-Options    "nosniff"
    Header always set X-Frame-Options           "SAMEORIGIN"
    Header always set Referrer-Policy           "strict-origin-when-cross-origin"

    # Bloque l'accès aux dossiers sensibles
    <DirectoryMatch "^/var/www/kohinos/(?!public)">
        Require all denied
    </DirectoryMatch>

    ErrorLog  ${APACHE_LOG_DIR}/kohinos_error.log
    CustomLog ${APACHE_LOG_DIR}/kohinos_access.log combined
</VirtualHost>
# Activation
sudo a2ensite kohinos
sudo apache2ctl configtest
sudo systemctl reload apache2
mod_php vs php-fpm

Le VirtualHost ci-dessus utilise php-fpm via socket UNIX (recommandé en prod). Si libapache2-mod-php8.4 est installé à la place, supprimer le bloc SetHandler "proxy:..." — Apache exécute alors PHP en interne. mod_php est plus simple mais ne profite pas du process pool de fpm.

Vérifications post-installation

php bin/console doctrine:schema:validate
php bin/console kohinos:accounts:check
php bin/console lint:yaml config
php bin/console lint:twig templates
php bin/console debug:router | head