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
- PHP 8.4 (min 8.2) — voir extensions ci-dessous.
- MariaDB 10.6+ (ou MySQL 8). PostgreSQL non testé.
- Composer 2.x.
- Node.js 18+ (LTS) et npm pour Webpack Encore — uniquement en développement local. Le serveur de production n'en a pas besoin : les assets front sont pré-compilés et versionnés dans
public/build/. - Symfony CLI pour
symfony server:starten dev. - Git.
- Serveur HTTP : Nginx ou Apache 2.4 (mod_php ou php-fpm).
Extensions PHP requises
| Extension | Rôle | Paquet Debian/Ubuntu |
|---|---|---|
intl | Internationalisation (formats, traductions) | php8.4-intl |
mbstring | Manipulation UTF-8 (obligatoire Symfony) | php8.4-mbstring |
pdo_mysql | Connexion MariaDB/MySQL (Doctrine) | php8.4-mysql |
sodium | Signatures Ed25519 (SEPA), libsodium | php8.4-sodium |
bcmath | Calculs monétaires précis (eMLc) | php8.4-bcmath |
gd | Génération d'images / QR codes | php8.4-gd |
xml · dom · simplexml | Génération SEPA pain.008 (ISO 20022) | php8.4-xml |
zip | Archives (exports, fixtures, Composer) | php8.4-zip |
curl | HelloAsso, PayZen, webhooks sortants | php8.4-curl |
opcache | Cache de bytecode (perf prod) | php8.4-opcache |
openssl | TLS sortant (HTTPS, SMTP STARTTLS) | built-in |
iconv | Conversion d'encodage | built-in |
pcre | Regex (built-in) | built-in |
fileinfo | Détection MIME (uploads) | built-in |
tokenizer · ctype · session | Symfony core | built-in |
xdebug (dev/CI) | Couverture PHPUnit, debug | php8.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
| Variable | Rôle | Exemple |
|---|---|---|
APP_ENV | Environnement | dev · prod · test |
APP_SECRET | Secret Symfony (signatures CSRF…) | 32 octets aléatoires |
DATABASE_URL | DSN Doctrine | mysql://user:pwd@127.0.0.1:3306/kohinos?serverVersion=mariadb-10.6 |
MAILER_DSN | SMTP symfony/mailer | smtp://user:pwd@mail.example.org:587 |
MAILER_FROM | Expéditeur défaut | noreply@kohinos.example |
KOHINOS_IBAN_SECRET | Clé chiffrement IBAN (AES-256-CBC) | 32 octets base64 |
PAYUM_HELLOASSO_* | Credentials HelloAsso | client_id / client_secret / organization_slug |
PAYUM_PAYZEN_* | Credentials PayZen | shop_id / cert_test / cert_prod |
SECURE_SCHEME | Schéma sécurisé | https en prod, http en test |
.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
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
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