/shared/platform-tools/backups/config.php * * Valores vêm do .env na raiz do projecto (/.env, gitignored). Os * fallbacks abaixo só são usados se o .env estiver ausente — em produção, * mete sempre o .env preenchido. */ $host_root = dirname(__DIR__, 3); // Three host patterns coexist: // - fotografia-style : config/env.php exposes env_load(), needs an explicit call // - dsa/moremio-style: config/env.php auto-loads .env via an IIFE; require is enough // - surf-style : no config/env.php -- config/db.php loads .env with // vlucas/phpdotenv, and the workers run without it, so // they read .env themselves (the fallback below). // Requiring config/env.php unconditionally fataled on the third layout. if (is_file($host_root . '/config/env.php')) { require_once $host_root . '/config/env.php'; if (function_exists('env_load')) { env_load($host_root . '/.env'); } } // Fallback reader for hosts with no config/env.php, and for CLI invocations // that run before any framework bootstrap: parse .env directly rather than // assuming something else already did. if (!function_exists('env')) { function env(string $key, $default = null) { $v = getenv($key); if ($v === false && array_key_exists($key, $_ENV)) $v = $_ENV[$key]; if ($v !== false && $v !== null) return $v; static $parsed = null; if ($parsed === null) { $parsed = []; $f = dirname(__DIR__, 3) . '/.env'; if (is_file($f) && is_readable($f)) { foreach (file($f, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) { $line = trim($line); if ($line === '' || $line[0] === '#' || !str_contains($line, '=')) continue; [$k, $val] = array_pad(explode('=', $line, 2), 2, ''); $parsed[trim($k)] = trim(trim($val), " \"'"); } } } return array_key_exists($key, $parsed) ? $parsed[$key] : $default; } } define('BACKUP_TOKEN', env('BACKUP_TOKEN', 'replace_me')); // Retenção avô-pai-filho — ver backup_gfs_keep() em functions_backup.php. define('BACKUP_KEEP_DAYS', (int) env('BACKUP_KEEP_DAYS', 7)); define('BACKUP_KEEP_WEEKS', (int) env('BACKUP_KEEP_WEEKS', 4)); define('BACKUP_KEEP_MONTHS', (int) env('BACKUP_KEEP_MONTHS', 1)); // Pasta (relativa à raiz do host) que o backup de ficheiros arquiva. Só os // uploads têm informação externa — todo o resto é reconstituível a partir do // git — por isso o default é 'uploads'. Overridável no .env se um host // guardar os uploads noutro sítio. define('BACKUP_FILES_DIR', trim((string) env('BACKUP_FILES_DIR', 'uploads'), '/')); // Credenciais da base de dados — sem fallbacks reais: se o .env faltar, a // ligação falha alto em vez de tentar um host/utilizador "mágico". define('DB_HOST', env('DB_HOST', 'localhost')); define('DB_PORT', (int) env('DB_PORT', 3306)); define('DB_NAME', env('DB_NAME', '')); define('DB_USER', env('DB_USER', '')); define('DB_PASS', env('DB_PASS', '')); define('DB_CHARSET', 'utf8mb4'); /** Poda avô-pai-filho no fim de um worker (ver backup_prune()), com o relatório no output. */ function backup_prune_report(): void { $r = backup_prune(); foreach ($r['deleted'] as $f) echo "Apagado (retenção): $f\n"; foreach ($r['errors'] as $f) echo "ERRO a apagar: $f\n"; echo 'Rotação: ' . count($r['deleted']) . ' apagado(s), ' . count($r['kept']) . ' mantido(s) — ' . backup_retention_summary($r['policy']) . ".\n"; }