CodePress CMS v1.9.0: visitor statistics with SVG world map and GeoIP
- Add GeoIP class with provider chain: local DB-IP Lite, MaxMind .mmdb, external API - Add built-in pure-PHP MMDBReader so .mmdb works without Composer - Add cli/geoip-update.php to download DB-IP Lite and build a compact binary index - Add cli/generate-world-map.php to generate the world map SVG from Natural Earth TopoJSON - Add Analytics class aggregating stats in admin/storage/stats.json with LOCK_EX - Add admin statistics page with choropleth world map, country list, top pages, daily chart, referrers and a period filter - Add GeoIP and privacy settings with database update and stats reset buttons - Add optional IP anonymization and configurable retention period - Add country field to requests.log (parser accepts 7, 8 or 9 fields) - Add country column to request log and KPI cards to the dashboard - Ignore GeoIP binaries and stats.json in Git - Update TODO.md, guides and version to 1.9.0
This commit is contained in:
@@ -45,6 +45,15 @@ if (!file_exists($configJsonPath)) {
|
||||
'custom_blocked_agents' => [],
|
||||
'blocked_ips' => [],
|
||||
'allowed_ips' => []
|
||||
],
|
||||
'analytics' => [
|
||||
'enabled' => true,
|
||||
'anonymize_ip' => false,
|
||||
'geoip_provider' => 'local',
|
||||
'geoip_mmdb_path' => '',
|
||||
'geoip_api_url' => '',
|
||||
'geoip_api_key' => '',
|
||||
'retention_days' => 400
|
||||
]
|
||||
];
|
||||
@file_put_contents($configJsonPath, json_encode($defaultConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
||||
@@ -56,6 +65,34 @@ if (file_exists($configJsonPath)) {
|
||||
$config = json_decode($jsonContent, true);
|
||||
|
||||
if (json_last_error() === JSON_ERROR_NONE && is_array($config)) {
|
||||
// Merge defaults for sections that may be missing in existing installs
|
||||
$sectionDefaults = [
|
||||
'security' => [
|
||||
'block_ai_bots' => true,
|
||||
'block_scrapers' => true,
|
||||
'block_search_engines' => false,
|
||||
'block_empty_user_agent' => true,
|
||||
'rate_limit_enabled' => true,
|
||||
'rate_limit_max' => 60,
|
||||
'rate_limit_window' => 60,
|
||||
'custom_blocked_agents' => [],
|
||||
'blocked_ips' => [],
|
||||
'allowed_ips' => [],
|
||||
],
|
||||
'analytics' => [
|
||||
'enabled' => true,
|
||||
'anonymize_ip' => false,
|
||||
'geoip_provider' => 'local',
|
||||
'geoip_mmdb_path' => '',
|
||||
'geoip_api_url' => '',
|
||||
'geoip_api_key' => '',
|
||||
'retention_days' => 400,
|
||||
],
|
||||
];
|
||||
foreach ($sectionDefaults as $section => $defaults) {
|
||||
$config[$section] = array_merge($defaults, is_array($config[$section] ?? null) ? $config[$section] : []);
|
||||
}
|
||||
|
||||
// Convert relative paths to absolute
|
||||
$projectRoot = __DIR__ . '/../../';
|
||||
if (isset($config['content_dir']) && strpos($config['content_dir'], '/') !== 0) {
|
||||
|
||||
Reference in New Issue
Block a user