true, 'bootstrap/cache' => false, 'vendor' => false, 'modules' => false, 'modules/_pending' => false, 'plugins' => false, 'plugins/_pending' => false, 'templates' => false, 'templates/_pending' => false, 'public/build' => false, // 초기 화면 정적 파일 게시 루트(public/build/ext)의 상위 — 설치 마지막 단계와 웹 렌더 자가 치유가 웹 계정으로 쓴다 'lang-packs' => false, // 언어팩 활성 디렉토리 (코어/모듈/플러그인/템플릿 lang-packs) 'lang-packs/_pending' => false, // 외부 ZIP/URL/GitHub 다운로드 staging 'storage/app/core_pending' => false, // 코어 업데이트 _pending (기본값, 커스텀 경로는 Step 3에서 설정) ]); } // 인스톨러 기본 설정값 if (! defined('DEFAULT_INSTALL_CONFIG')) { define('DEFAULT_INSTALL_CONFIG', [ // Write DB 설정 'db_write_host' => 'localhost', 'db_write_port' => '3306', 'db_write_database' => '', 'db_write_username' => '', 'db_write_password' => '', 'db_prefix' => 'g7_', // Read DB 설정 'use_read_db' => false, 'db_read_host' => 'localhost', 'db_read_port' => '3306', 'db_read_database' => '', 'db_read_username' => '', 'db_read_password' => '', // 사이트 설정 'app_name' => '그누보드7', 'app_env' => 'production', // 관리자 계정 설정 'admin_name' => '관리자', 'admin_email' => '', 'admin_password' => '', 'admin_language' => 'ko', // 코어 업데이트 설정 'core_update_pending_path' => '', // 빈 값 = 기본값(storage/app/core_pending) 사용 'core_update_github_url' => 'https://github.com/gnuboard/g7', 'core_update_github_token' => '', // GitHub Personal Access Token (프라이빗 저장소용) // PHP CLI / Composer 경로 설정 'php_binary' => 'php', // PHP CLI 바이너리 경로 (예: /usr/local/php82/bin/php) 'composer_binary' => '', // Composer 바이너리 경로 (빈 값 = 시스템 PATH 사용) // Vendor 설치 모드 (auto|composer|bundled) // - auto: composer 사용 가능 시 composer, 불가 시 vendor-bundle.zip 추출 // - composer: 강제 composer 실행 // - bundled: 강제 vendor-bundle.zip 추출 (공유 호스팅 환경) 'vendor_mode' => 'auto', ]); } // 설치 단계별 파일 매핑 // Step 5 (installation)에서 완료/실패/중단 화면까지 모두 처리 if (! defined('STEP_FILE_MAP')) { define('STEP_FILE_MAP', [ 0 => 'welcome', 1 => 'license', 2 => 'requirements', 3 => 'configuration', 4 => 'extension-selection', 5 => 'installation', ]); } // 인스톨러 기본 상태 정의 if (! defined('DEFAULT_INSTALLATION_STATE')) { define('DEFAULT_INSTALLATION_STATE', [ 'current_step' => 0, 'step_status' => [ '0' => 'pending', '1' => 'pending', '2' => 'pending', '3' => 'pending', '4' => 'pending', '5' => 'pending', ], 'completed_tasks' => [], 'current_task' => null, 'current_task_name' => null, 'installation_status' => 'not_started', 'config' => [], 'selected_extensions' => [ 'admin_templates' => [], 'user_templates' => [], 'modules' => [], 'plugins' => [], 'language_packs' => [], ], 'extension_names' => [], // 확장 이름 매핑 (identifier → {ko: '...', en: '...'}) ]); } // 지원 언어 목록 (언어 추가 시 이 한 곳만 수정) if (! defined('SUPPORTED_LANGUAGES')) { define('SUPPORTED_LANGUAGES', [ 'ko' => '한국어 (Korean)', 'en' => 'English', ]); } // 설치 완료 후 인스톨러 파일 삭제 여부 if (! defined('DELETE_INSTALLER_AFTER_COMPLETE')) { define('DELETE_INSTALLER_AFTER_COMPLETE', true); } // 코어와 공유하는 판정 SSoT 클래스 로드. // // 인스톨러는 Laravel 오토로드 없이 도는 순수 PHP 이므로 파일을 직접 require 한다. // 두 클래스는 프레임워크 의존성이 0 이라 이 방식이 성립하며, 인스톨러와 코어가 // 서로 다른 판정을 내리는 것을 구조적으로 차단한다. // class_exists 가드: Laravel 부트가 선행된 테스트 환경에서 중복 로드 방지. // // 오토로드를 **막지 않는다**(2번째 인자 생략). `false` 를 주면 오토로드 가능한 // 클래스를 못 본 채 require 로 내려가는데, BASE_PATH 를 임시 디렉토리로 바꿔 두는 // 인스톨러 단위 테스트에서는 그 경로에 app/Support 가 없어 fatal 이 된다. // 순수 인스톨러 실행 시에는 등록된 오토로더가 없어 false 를 반환하므로 require 가 그대로 돈다. if (! class_exists('App\\Support\\PrivilegedDatabaseAccounts')) { require_once BASE_PATH.'/app/Support/PrivilegedDatabaseAccounts.php'; } if (! class_exists('App\\Support\\OpcacheStatus')) { require_once BASE_PATH.'/app/Support/OpcacheStatus.php'; }