4. 설치 절차 (코드가 실제로 하는 일)
4.1 사용자 절차
- 전체 파일을 웹 루트(또는 하위 디렉터리)에 업로드.
data/,pages/,core/쓰기 가능 상태로. https://도메인/install/접속.data/config.php가 없으면index.php도 자동으로/install/로 302 이동한다.- 4단계: ① LGPL-3.0 동의 → ② 환경 점검 → ③ 설치 정보 입력 → ④ 완료.
- 동의(
license_agree=1)는 매 POST에서 서버가 재확인한다. URL로 2·3단계에 직접 진입해도 1단계로 되돌린다.
- 동의(
- 설치 후
install/폴더 삭제 권장.
4.2 3단계 입력값과 기본값
| 필드 | 기본값 | 검증 |
|---|---|---|
| 사이트명 | DesignOneX CMS |
— |
| 사이트 URL | 현재 scheme://host |
끝 / 제거 |
| 시간대 | Asia/Seoul |
선택지: Seoul, Tokyo, UTC, New_York, Los_Angeles, London |
| DB 호스트 | localhost |
— |
| DB 이름/사용자 | (필수) | 비어 있으면 오류 |
| DB 비밀번호 | — | — |
| 테이블 접두사 | dx_ |
[^a-z0-9_] 제거, 빈 값이면 dx_ |
| 관리자 ID | admin |
— |
| 관리자 이메일 | — | 미입력 시 admin@localhost |
| 관리자 비밀번호 | — | 6자 이상, 확인란 일치 |
4.3 설치 실행 순서 [확인]
mysql:host=...;dbname=...;charset=utf8mb4로 PDO 접속 (ERRMODE_EXCEPTION). DB는 미리 만들어 두어야 한다. 마법사는CREATE DATABASE를 하지 않는다.schema.sql읽기 → 접두사가dx_가 아니면`dx_와'dx_만 치환 →--주석과/* */제거 →;로 분리하여 구문별 실행. 개별 구문 오류는$schemaErrors에 모으되 설치를 중단하지 않는다.secret_key= 64자 hex 생성 (random_bytes→openssl_random_pseudo_bytes→mt_rand순 폴백).security_path=substr(sha256(host + microtime + secretKey + uniqid), 0, 16).core/security/{security_path}/를 0755로 만들고core/Secure.php를 그 안에 복사. 실패 시 예외.dx_settings갱신:security_path,site_url,site_name,secret_key,cms_version,license_type=LGPL-3.0,license_agreed_at,license_agreed_version.- 관리자 계정:
UPDATE dx_members SET login_id, password(bcrypt), email WHERE role='admin' LIMIT 1. (스키마가 시드한admin / admin1234계정을 덮어쓰는 방식) data/config.php작성 (아래 §4.4).data/.install_complete에 1회용 토큰을 쓰고index.php?step=4&t=토큰으로 리다이렉트.config.php가 이미 있으면 이 토큰이 있는 요청만 완료 화면을 볼 수 있고, 토큰은 사용 즉시 삭제된다. 그 외에는 "이미 설치됨" 안내(step 0).
4.4 생성되는 data/config.php 구조
php
<?php
if (!defined('DX_CMS')) exit('Direct access not allowed.');
$db = Database::getInstance();
$db->connect('호스트','DB명','사용자','비밀번호','utf8mb4','접두사');
global $dx_config; $dx_config = array();
// 1순위 DxCache::get('dx_settings') → 2순위 DB SELECT setting_key,setting_value FROM {prefix}settings
// DB에서 정상 로드된 경우만 DxCache::set('dx_settings', $dx_config, 300) (빈 배열은 캐시 금지)
define('DX_DEBUG', false);
define('DX_CHARSET', 'UTF-8');
date_default_timezone_set('Asia/Seoul');
define('DX_SECRET_KEY', '64자hex');
define('DX_SECURITY_PATH','16자hex');
[주의] 값은 addslashes()만 거친 채 따옴표 문자열로 박힌다. DB 비밀번호에 \ 나 ' 가 있으면 의도대로 저장되는지 확인해야 한다. DX_SECRET_KEY는 설치 시 1회 생성되며 이후 변경 불가로 취급한다. config.php에 없고 DB에는 있으면 index.php가 config.php 끝에 자동 추가한다(config.php 쓰기 가능 시). REDIS_* 상수(REDIS_HOST, REDIS_PORT, REDIS_AUTH, REDIS_SESSION_URL)는 마법사가 쓰지 않는다. 필요하면 config.php에 수동으로 define 한다.