{
    "_meta": {
        "version": "1.0.0",
        "description": "그누보드7 환경설정 기본값 및 프론트엔드 스키마",
        "categories": ["general", "security", "mail", "upload", "seo", "cache", "debug", "drivers", "core_update", "geoip", "notifications", "identity"]
    },
    "defaults": {
        "general": {
            "site_name": "그누보드7",
            "site_url": "",
            "site_description": "",
            "admin_email": "",
            "timezone": "Asia/Seoul",
            "language": "ko",
            "currency": "KRW",
            "maintenance_mode": false,
            "site_logo": []
        },
        "security": {
            "force_https": false,
            "login_attempt_enabled": true,
            "auth_token_lifetime": 30,
            "max_login_attempts": 5,
            "login_lockout_time": 5,
            "two_factor_auth": false,
            "password_min_length": 8,
            "require_password_special_char": false,
            "allow_internal_outbound_urls": false
        },
        "mail": {
            "mailer": "smtp",
            "host": "",
            "port": 587,
            "username": "",
            "password": "",
            "encryption": "tls",
            "mailgun_domain": "",
            "mailgun_secret": "",
            "mailgun_endpoint": "api.mailgun.net",
            "ses_key": "",
            "ses_secret": "",
            "ses_region": "ap-northeast-2",
            "from_address": "noreply@example.com",
            "from_name": "그누보드7"
        },
        "upload": {
            "max_file_size": 10,
            "allowed_extensions": ["jpg", "jpeg", "png", "gif", "webp", "pdf", "doc", "docx", "xls", "xlsx", "zip"],
            "image_max_width": 2000,
            "image_max_height": 2000,
            "image_quality": 85
        },
        "seo": {
            "meta_title_suffix": "",
            "meta_description": "",
            "meta_keywords": "",
            "google_analytics_id": "",
            "google_site_verification": "",
            "naver_site_verification": "",
            "bot_user_agents": ["kakaotalk-scrap", "Meta-ExternalAgent", "ChatGPT-User"],
            "bot_detection_enabled": true,
            "bot_detection_library_enabled": true,
            "og_default_site_name": "",
            "og_image_default_width": 1200,
            "og_image_default_height": 630,
            "twitter_default_card": "summary_large_image",
            "twitter_default_site": "",
            "cache_enabled": true,
            "cache_ttl": 7200,
            "sitemap_enabled": true,
            "sitemap_cache_ttl": 86400,
            "sitemap_schedule": "daily",
            "sitemap_schedule_time": "02:00",
            "sitemap_last_updated_at": "",
            "generator_enabled": true,
            "generator_content": ""
        },
        "cache": {
            "enabled": true,
            "default_ttl": 86400,
            "layout_enabled": true,
            "layout_ttl": 3600,
            "seo_enabled": true,
            "seo_ttl": 7200,
            "seo_sitemap_ttl": 86400,
            "stats_enabled": true,
            "stats_ttl": 1800,
            "notification_ttl": 3600,
            "extension_status_ttl": 86400,
            "geoip_enabled": true,
            "geoip_ttl": 86400,
            "version_check_ttl": 3600
        },
        "debug": {
            "mode": false,
            "sql_query_log": false,
            "log_level": "error"
        },
        "core_update": {
            "github_url": "",
            "github_token": ""
        },
        "geoip": {
            "feature_enabled": false,
            "license_key": "",
            "auto_update_enabled": true,
            "last_updated_at": ""
        },
        "drivers": {
            "storage_driver": "local",
            "s3_bucket": "",
            "s3_region": "ap-northeast-2",
            "s3_access_key": "",
            "s3_secret_key": "",
            "s3_url": "",
            "cache_driver": "file",
            "redis_host": "127.0.0.1",
            "redis_port": 6379,
            "redis_password": "",
            "redis_database": 0,
            "memcached_host": "127.0.0.1",
            "memcached_port": 11211,
            "session_driver": "file",
            "session_lifetime": 120,
            "queue_driver": "sync",
            "log_driver": "daily",
            "log_level": "error",
            "log_days": 14,
            "websocket_enabled": false,
            "websocket_app_id": "",
            "websocket_app_key": "",
            "websocket_app_secret": "",
            "websocket_host": "localhost",
            "websocket_port": 8080,
            "websocket_scheme": "https",
            "websocket_verify_ssl": true,
            "websocket_server_host": "127.0.0.1",
            "websocket_server_port": 8080,
            "websocket_server_scheme": "http",
            "search_engine_driver": "mysql-fulltext"
        },
        "notifications": {
            "channels": [
                { "id": "mail", "is_active": true, "sort_order": 1 },
                { "id": "database", "is_active": true, "sort_order": 2 }
            ]
        },
        "identity": {
            "default_provider": "g7:core.mail",
            "purpose_providers": {
                "password_reset": null,
                "self_update": null,
                "sensitive_action": null
            },
            "challenge_ttl_minutes": 15,
            "max_attempts": 5
        }
    },
    "frontend_schema": {
        "_description": "프론트엔드에 노출할 설정 필드 정의. 각 카테고리별로 노출할 필드와 타입 캐스팅, 민감 정보 여부를 정의합니다.",
        "general": {
            "expose": true,
            "_comment": "site_url, admin_email, language, timezone는 프론트엔드에서 미참조하므로 expose: false",
            "fields": {
                "site_name": { "type": "string", "sensitive": false },
                "site_url": { "type": "string", "sensitive": false, "expose": false },
                "site_description": { "type": "string", "sensitive": false },
                "admin_email": { "type": "string", "sensitive": false, "expose": false },
                "language": { "type": "string", "sensitive": false, "expose": false },
                "timezone": { "type": "string", "sensitive": false, "expose": false },
                "site_logo": { "type": "array", "sensitive": false, "transform": "attachments" },
                "site_logo_url": { "type": "string", "sensitive": false, "computed": true, "source": "site_logo", "transform": "first_image_url" }
            }
        },
        "security": {
            "expose": false,
            "_comment": "보안 정책은 프론트엔드에서 미참조 — 노출 시 공격자에게 정보 제공 위험"
        },
        "mail": {
            "expose": false,
            "_comment": "mail 설정은 password 포함으로 프론트엔드에 노출하지 않음"
        },
        "upload": {
            "expose": true,
            "fields": {
                "max_file_size": { "type": "integer", "sensitive": false },
                "allowed_extensions": { "type": "string", "sensitive": false, "transform": "join_comma", "expose": false },
                "allowed_extensions_formatted": { "type": "string", "sensitive": false, "computed": true, "source": "allowed_extensions", "transform": "format_extensions" },
                "image_max_width": { "type": "integer", "sensitive": false },
                "image_max_height": { "type": "integer", "sensitive": false },
                "image_quality": { "type": "integer", "sensitive": false, "expose": false }
            }
        },
        "seo": {
            "expose": false,
            "_comment": "SEO 설정 전체 — 프론트엔드 미참조 (admin 환경설정 폼은 API 데이터 기반)",
            "fields": {
                "meta_title_suffix": { "type": "string", "sensitive": false },
                "meta_description": { "type": "string", "sensitive": false },
                "meta_keywords": { "type": "string", "sensitive": false },
                "google_analytics_id": { "type": "string", "sensitive": false },
                "google_site_verification": { "type": "string", "sensitive": false },
                "naver_site_verification": { "type": "string", "sensitive": false },
                "bot_user_agents": { "type": "array", "sensitive": false },
                "bot_detection_enabled": { "type": "boolean", "sensitive": false },
                "bot_detection_library_enabled": { "type": "boolean", "sensitive": false },
                "og_default_site_name": { "type": "string", "sensitive": false },
                "og_image_default_width": { "type": "integer", "sensitive": false },
                "og_image_default_height": { "type": "integer", "sensitive": false },
                "twitter_default_card": { "type": "string", "sensitive": false },
                "twitter_default_site": { "type": "string", "sensitive": false },
                "cache_enabled": { "type": "boolean", "sensitive": false },
                "cache_ttl": { "type": "integer", "sensitive": false },
                "sitemap_enabled": { "type": "boolean", "sensitive": false },
                "sitemap_cache_ttl": { "type": "integer", "sensitive": false },
                "sitemap_schedule": { "type": "string", "sensitive": false },
                "sitemap_schedule_time": { "type": "string", "sensitive": false },
                "sitemap_last_updated_at": { "type": "string", "sensitive": false },
                "generator_enabled": { "type": "boolean", "sensitive": false },
                "generator_content": { "type": "string", "sensitive": false }
            }
        },
        "cache": {
            "expose": true,
            "frontend_name": "advanced",
            "_comment": "cache와 debug를 합쳐서 advanced로 노출",
            "fields": {
                "enabled": { "type": "boolean", "sensitive": false, "frontend_key": "cache_enabled", "expose": false },
                "default_ttl": { "type": "integer", "sensitive": false, "frontend_key": "cache_default_ttl", "expose": false },
                "layout_enabled": { "type": "boolean", "sensitive": false, "frontend_key": "layout_cache_enabled", "expose": false },
                "layout_ttl": { "type": "integer", "sensitive": false, "frontend_key": "layout_cache_ttl", "expose": false },
                "seo_enabled": { "type": "boolean", "sensitive": false, "frontend_key": "seo_cache_enabled", "expose": false },
                "seo_ttl": { "type": "integer", "sensitive": false, "frontend_key": "seo_cache_ttl", "expose": false },
                "seo_sitemap_ttl": { "type": "integer", "sensitive": false, "frontend_key": "seo_sitemap_cache_ttl", "expose": false },
                "stats_enabled": { "type": "boolean", "sensitive": false, "frontend_key": "stats_cache_enabled", "expose": false },
                "stats_ttl": { "type": "integer", "sensitive": false, "frontend_key": "stats_cache_ttl", "expose": false },
                "notification_ttl": { "type": "integer", "sensitive": false, "frontend_key": "notification_cache_ttl", "expose": false },
                "extension_status_ttl": { "type": "integer", "sensitive": false, "frontend_key": "extension_status_cache_ttl", "expose": false },
                "geoip_enabled": { "type": "boolean", "sensitive": false, "frontend_key": "geoip_cache_enabled", "expose": false },
                "geoip_ttl": { "type": "integer", "sensitive": false, "frontend_key": "geoip_cache_ttl", "expose": false },
                "version_check_ttl": { "type": "integer", "sensitive": false, "frontend_key": "version_check_cache_ttl", "expose": false }
            }
        },
        "debug": {
            "expose": true,
            "merge_into": "advanced",
            "_comment": "debug 설정은 advanced 카테고리에 병합",
            "fields": {
                "mode": { "type": "boolean", "sensitive": false, "frontend_key": "debug_mode" },
                "sql_query_log": { "type": "boolean", "sensitive": false, "expose": false }
            }
        },
        "core_update": {
            "expose": true,
            "merge_into": "advanced",
            "_comment": "core_update 설정은 advanced 카테고리에 병합",
            "fields": {
                "github_url": { "type": "string", "sensitive": false, "frontend_key": "core_update_github_url", "expose": false },
                "github_token": { "type": "string", "sensitive": true, "frontend_key": "core_update_github_token" }
            }
        },
        "geoip": {
            "expose": true,
            "merge_into": "advanced",
            "_comment": "GeoIP 기능 설정은 advanced 카테고리에 병합",
            "fields": {
                "feature_enabled": { "type": "boolean", "sensitive": false, "frontend_key": "geoip_enabled" },
                "license_key": { "type": "string", "sensitive": true, "frontend_key": "geoip_license_key" },
                "auto_update_enabled": { "type": "boolean", "sensitive": false, "frontend_key": "geoip_auto_update_enabled" },
                "last_updated_at": { "type": "string", "sensitive": false, "frontend_key": "geoip_last_updated_at" }
            }
        },
        "drivers": {
            "expose": false,
            "_comment": "드라이버 설정 — 프론트엔드 미노출 (admin_settings에서 API 원본값 기반 비교로 변경)",
            "fields": {
                "storage_driver": { "type": "string", "sensitive": false },
                "s3_bucket": { "type": "string", "sensitive": false },
                "s3_region": { "type": "string", "sensitive": false },
                "s3_access_key": { "type": "string", "sensitive": true },
                "s3_secret_key": { "type": "string", "sensitive": true },
                "s3_url": { "type": "string", "sensitive": false },
                "cache_driver": { "type": "string", "sensitive": false },
                "redis_host": { "type": "string", "sensitive": false },
                "redis_port": { "type": "integer", "sensitive": false },
                "redis_password": { "type": "string", "sensitive": true },
                "redis_database": { "type": "integer", "sensitive": false },
                "memcached_host": { "type": "string", "sensitive": false },
                "memcached_port": { "type": "integer", "sensitive": false },
                "session_driver": { "type": "string", "sensitive": false },
                "session_lifetime": { "type": "integer", "sensitive": false },
                "queue_driver": { "type": "string", "sensitive": false },
                "log_driver": { "type": "string", "sensitive": false },
                "log_level": { "type": "string", "sensitive": false },
                "log_days": { "type": "integer", "sensitive": false },
                "websocket_enabled": { "type": "boolean", "sensitive": false },
                "websocket_app_id": { "type": "string", "sensitive": false },
                "websocket_app_key": { "type": "string", "sensitive": false },
                "websocket_app_secret": { "type": "string", "sensitive": true },
                "websocket_host": { "type": "string", "sensitive": false },
                "websocket_port": { "type": "integer", "sensitive": false },
                "websocket_scheme": { "type": "string", "sensitive": false },
                "websocket_verify_ssl": { "type": "boolean", "sensitive": false },
                "websocket_server_host": { "type": "string", "sensitive": false },
                "websocket_server_port": { "type": "integer", "sensitive": false },
                "websocket_server_scheme": { "type": "string", "sensitive": false }
            }
        },
        "notifications": {
            "expose": true,
            "fields": {
                "channels": { "type": "array", "sensitive": false }
            }
        },
        "identity": {
            "expose": true,
            "_comment": "본인인증 인프라 provider 기술 파라미터 — signup/enabled 등 정책 분기 키는 IdentityPolicy 로 흡수됨",
            "fields": {
                "default_provider": { "type": "string", "sensitive": false },
                "purpose_providers": { "type": "array", "sensitive": false, "expose": false },
                "challenge_ttl_minutes": { "type": "integer", "sensitive": false, "expose": false },
                "max_attempts": { "type": "integer", "sensitive": false, "expose": false }
            }
        }
    }
}
