feat: Version 3.5.2 - Configuration Stripe et gestion des immeubles
- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD) * DEV: Clés TEST Pierre (mode test) * REC: Clés TEST Client (mode test) * PROD: Clés LIVE Client (mode live) - Ajout de la gestion des bases de données immeubles/bâtiments * Configuration buildings_database pour DEV/REC/PROD * Service BuildingService pour enrichissement des adresses - Optimisations pages et améliorations ergonomie - Mises à jour des dépendances Composer - Nettoyage des fichiers obsolètes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
169
api/scripts/cron/rotate_event_logs.php
Normal file
169
api/scripts/cron/rotate_event_logs.php
Normal file
@@ -0,0 +1,169 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Script CRON pour rotation des logs d'événements JSONL
|
||||
*
|
||||
* Politique de rétention : 15 mois
|
||||
* - 0-15 mois : fichiers .jsonl conservés (non compressés pour accès API)
|
||||
* - > 15 mois : suppression
|
||||
*
|
||||
* À exécuter mensuellement via crontab (1er du mois à 3h) :
|
||||
* 0 3 1 * * /usr/bin/php /var/www/geosector/api/scripts/cron/rotate_event_logs.php >> /var/www/geosector/api/logs/rotation_events.log 2>&1
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
// Configuration
|
||||
define('RETENTION_MONTHS', 15); // Conserver 15 mois
|
||||
define('LOCK_FILE', '/tmp/rotate_event_logs.lock');
|
||||
|
||||
// Empêcher l'exécution multiple simultanée
|
||||
if (file_exists(LOCK_FILE)) {
|
||||
$lockTime = filemtime(LOCK_FILE);
|
||||
// Si le lock a plus de 2 heures, on le supprime (processus probablement bloqué)
|
||||
if (time() - $lockTime > 7200) {
|
||||
unlink(LOCK_FILE);
|
||||
} else {
|
||||
die("Le processus est déjà en cours d'exécution\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Créer le fichier de lock
|
||||
file_put_contents(LOCK_FILE, getmypid());
|
||||
|
||||
// Enregistrer un handler pour supprimer le lock en cas d'arrêt
|
||||
register_shutdown_function(function() {
|
||||
if (file_exists(LOCK_FILE)) {
|
||||
unlink(LOCK_FILE);
|
||||
}
|
||||
});
|
||||
|
||||
// Simuler l'environnement web pour AppConfig en CLI
|
||||
if (php_sapi_name() === 'cli') {
|
||||
// Détecter l'environnement basé sur le hostname
|
||||
$hostname = gethostname();
|
||||
if (strpos($hostname, 'pra') !== false) {
|
||||
$_SERVER['SERVER_NAME'] = 'app3.geosector.fr';
|
||||
} elseif (strpos($hostname, 'rca') !== false) {
|
||||
$_SERVER['SERVER_NAME'] = 'rapp.geosector.fr';
|
||||
} else {
|
||||
$_SERVER['SERVER_NAME'] = 'dapp.geosector.fr'; // DVA par défaut
|
||||
}
|
||||
|
||||
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'];
|
||||
$_SERVER['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
|
||||
|
||||
// Définir getallheaders si elle n'existe pas (CLI)
|
||||
if (!function_exists('getallheaders')) {
|
||||
function getallheaders() {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Chargement de l'environnement
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
require_once __DIR__ . '/../../src/Config/AppConfig.php';
|
||||
require_once __DIR__ . '/../../src/Services/LogService.php';
|
||||
|
||||
try {
|
||||
// Initialisation de la configuration
|
||||
$appConfig = AppConfig::getInstance();
|
||||
$environment = $appConfig->getEnvironment();
|
||||
|
||||
// Définir le chemin du dossier des logs événements
|
||||
$eventLogDir = __DIR__ . '/../../logs/events';
|
||||
|
||||
if (!is_dir($eventLogDir)) {
|
||||
echo "Le dossier de logs événements n'existe pas : {$eventLogDir}\n";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Date limite de suppression
|
||||
$deletionDate = strtotime('-' . RETENTION_MONTHS . ' months');
|
||||
|
||||
// Lister tous les fichiers .jsonl
|
||||
$jsonlFiles = glob($eventLogDir . '/*.jsonl');
|
||||
|
||||
if (empty($jsonlFiles)) {
|
||||
echo "Aucun fichier .jsonl trouvé dans {$eventLogDir}\n";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
$deletedCount = 0;
|
||||
$deletedSize = 0;
|
||||
$deletedFiles = [];
|
||||
|
||||
// ========================================
|
||||
// Suppression des fichiers > 15 mois
|
||||
// ========================================
|
||||
foreach ($jsonlFiles as $file) {
|
||||
$fileTime = filemtime($file);
|
||||
|
||||
// Vérifier si le fichier est plus vieux que la date de rétention
|
||||
if ($fileTime < $deletionDate) {
|
||||
$fileSize = filesize($file);
|
||||
$fileName = basename($file);
|
||||
|
||||
if (unlink($file)) {
|
||||
$deletedCount++;
|
||||
$deletedSize += $fileSize;
|
||||
$deletedFiles[] = $fileName;
|
||||
echo "Supprimé : {$fileName} (> " . RETENTION_MONTHS . " mois, " .
|
||||
number_format($fileSize / 1024, 2) . " KB)\n";
|
||||
} else {
|
||||
echo "ERREUR : Impossible de supprimer {$fileName}\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// RÉSUMÉ ET LOGGING
|
||||
// ========================================
|
||||
if ($deletedCount > 0) {
|
||||
$message = sprintf(
|
||||
"Rotation des logs événements terminée - %d fichier(s) supprimé(s) - %.2f MB libérés",
|
||||
$deletedCount,
|
||||
$deletedSize / (1024 * 1024)
|
||||
);
|
||||
|
||||
LogService::log($message, [
|
||||
'level' => 'info',
|
||||
'script' => 'rotate_event_logs.php',
|
||||
'environment' => $environment,
|
||||
'deleted_count' => $deletedCount,
|
||||
'deleted_size_mb' => round($deletedSize / (1024 * 1024), 2),
|
||||
'deleted_files' => $deletedFiles
|
||||
]);
|
||||
|
||||
echo "\n" . $message . "\n";
|
||||
} else {
|
||||
echo "Aucune rotation nécessaire - Tous les fichiers .jsonl ont moins de " . RETENTION_MONTHS . " mois\n";
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
$errorMsg = 'Erreur lors de la rotation des logs événements : ' . $e->getMessage();
|
||||
|
||||
LogService::log($errorMsg, [
|
||||
'level' => 'error',
|
||||
'script' => 'rotate_event_logs.php',
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
echo $errorMsg . "\n";
|
||||
|
||||
// Supprimer le lock en cas d'erreur
|
||||
if (file_exists(LOCK_FILE)) {
|
||||
unlink(LOCK_FILE);
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Supprimer le lock
|
||||
if (file_exists(LOCK_FILE)) {
|
||||
unlink(LOCK_FILE);
|
||||
}
|
||||
|
||||
exit(0);
|
||||
Reference in New Issue
Block a user