Bonjour @bruno29900, et merci pour le rapport détaillé et bien documenté !
Tu as trouvé un vrai bug. public/api.php chargeait bien le fichier de l'autoloader mais n'appelait jamais Autoloader::register(BASE_PATH) — PHP n'avait donc aucun gestionnaire SPL pour résoudre les classes et chaque requête API plantait immédiatement en 500. Ce bug s'est introduit lors de la refactorisation qui a extrait la logique d'initialisation dans un bootstrap.php partagé : index.php a été migré pour l'utiliser, mais api.php a été oublié et a continué à réimplémenter cette logique en ligne, de façon incomplète. index.php n'était donc pas affecté car il passe bien par bootstrap.php, qui appelle correctement register().
Le correctif est inclus dans Flatboard 5.0.6 : api.php délègue désormais à bootstrap.php de la même façon qu'index.php, ce qui supprime au passage une trentaine de lignes de code dupliqué.
Concernant ta configuration Caddy : les erreurs 500 que tu rencontrais étaient causées par ce bug PHP, pas par Caddy. Ta config était très probablement correcte. Les directives essentielles pour Flatboard sous Caddy sont les suivantes :
ton-domaine.com {
root * /var/www/flatboard
php_fastcgi unix//run/php/php8.x-fpm.sock
file_server
# Redirige toutes les requêtes vers index.php
try_files {path} /index.php?{query}
# Bloque les répertoires sensibles
@protected path /stockage/* /app/* /vendor/*
respond @protected 403
}
Si tu veux corriger manuellement pour tester le fix, remplace tout contenu du fichier public/api.php par :
<?php
/*
* Project name: Flatboard 5
* Project URL: https://flatboard.org
* Author: Frédéric Kaplon and contributors
* All Flatboard code is released under the GPL3 license.
*
* Flatboard 5 - Point d'entrée API REST
*/
// Définir les chemins de base
define('BASE_PATH', dirname(__DIR__));
define('PUBLIC_PATH', __DIR__);
define('API_MODE', true);
// ============================================================================
// BOOTSTRAP COMMUN (logs, constantes, autoloader PSR-4)
// Identique à public/index.php — évite la duplication et garantit que
// Autoloader::register() est bien appelé.
// ============================================================================
require_once BASE_PATH . '/bootstrap.php';
// Headers API
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-API-Token');
// Gérer les requêtes OPTIONS (CORS preflight)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
// ============================================================================
// INITIALISATION DE L'APPLICATION EN MODE API
// ============================================================================
try {
$app = new \App\Core\App();
$app->runApi();
} catch (\Exception $e) {
http_response_code(500);
echo json_encode([
'error' => true,
'message' => 'Une erreur est survenue',
'details' => DEBUG ? $e->getMessage() : null
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// Logger l'erreur
$logFile = BASE_PATH . '/stockage/logs/php-errors.log';
$errorMsg = sprintf(
"[%s] API ERROR: %s\nStack trace:\n%s\n\n",
date('Y-m-d H:i:s'),
$e->getMessage(),
$e->getTraceAsString()
);
@file_put_contents($logFile, $errorMsg, FILE_APPEND | LOCK_EX);
}
Merci encore d'avoir pris le temps de signaler ça !
Ps j'ai éditer ton message pour ajouter des tags et les blocs de code adapté ;)