INSTALLER_COMPLETED=true 가 적힌 .env 를 빈 DB 새 서버에 복사한 뒤
php artisan migrate 로 테이블을 만들기 전에 앱이 부팅되면, installer_completed
fast-path 가 테이블 존재를 잘못 전제하여 뒤따르는 쿼리가 table not found 로
부팅을 깨뜨렸다. 마이그레이션을 실행하려는 부팅에서 그 명령이 오히려 실패하는
닭-달걀 상태가 된다.
fast-path 자체(매 요청 information_schema 쿼리 제거 성능 최적화)는 유지하되,
이미 존재하던 참조 구현(LanguagePackServiceProvider::isRegistryReady)의 방어
패턴을 InstallerContext::isSchemaMutatingCommand 로 SSoT 화하여 나머지 5곳에
통일 적용했다.
- app/Support/InstallerContext.php: 마이그레이션 계열 콘솔 명령 판정 헬퍼
(migrate/migrate:fresh/migrate:refresh/migrate:rollback/migrate:reset/db:wipe)
- Caches{Module,Plugin,Template}Status: fast-path 앞에 && 가드
- {Module,Plugin}RouteServiceProvider: hasTable 검증 진입 조건에 || 가드로
무방비 pluck 도달 차단
- LanguagePackServiceProvider: 인라인 argv 검사를 헬퍼로 치환(migrate:refresh 보강)
부류 B(NotificationHookListener, IdentityPolicyRepository)는 fast-path 이후
쿼리가 이미 try/catch 로 보호되어 빈 DB 에서도 안전하므로 수정 제외.
최초 설치 흐름은 migrate 시점에 완료 플래그가 없어(false) 이번 가드의 영향권
밖이며 원래대로 hasTable 폴백을 탄다. 가드가 실제 발동하는 유일 케이스는
"플래그 true + 빈 DB" 뿐이고, 정상 운영 웹 요청은 fast-path 성능이 유지된다.
회귀 테스트: InstallerContextTest 8건 + InstallerCompletedGuardTest 5건 추가
(수정 전 5건 fail → 수정 후 green). 관련 스위트 355 passed.
7.0.3 출시 버전 bump: 코어 버전 SSoT 7곳 + CHANGELOG 동기화.
113 lines
2.4 KiB
Bash
113 lines
2.4 KiB
Bash
APP_NAME=그누보드7
|
|
APP_ENV=production
|
|
APP_KEY=
|
|
APP_DEBUG=false
|
|
APP_URL=http://localhost
|
|
APP_VERSION=7.0.3
|
|
|
|
APP_LOCALE=ko
|
|
APP_FALLBACK_LOCALE=ko
|
|
APP_FAKER_LOCALE=ko_KR
|
|
|
|
APP_MAINTENANCE_DRIVER=file
|
|
# APP_MAINTENANCE_STORE=database
|
|
|
|
PHP_CLI_SERVER_WORKERS=4
|
|
|
|
PHP_BINARY=php
|
|
COMPOSER_BINARY=
|
|
|
|
BCRYPT_ROUNDS=12
|
|
|
|
LOG_CHANNEL=stack
|
|
LOG_STACK=single
|
|
LOG_DEPRECATIONS_CHANNEL=null
|
|
LOG_LEVEL=debug
|
|
|
|
DB_CONNECTION=mysql
|
|
|
|
# Write Database Connection (Primary)
|
|
DB_WRITE_HOST=127.0.0.1
|
|
DB_WRITE_PORT=3306
|
|
DB_WRITE_DATABASE=g7
|
|
DB_WRITE_USERNAME=root
|
|
DB_WRITE_PASSWORD=
|
|
|
|
# Database Table Prefix (optional)
|
|
DB_PREFIX=g7_
|
|
|
|
# Read Database Connection (Optional)
|
|
# 비워두면 각 항목이 대응하는 DB_WRITE_* 값으로 대체됩니다 (config/database.php).
|
|
# Read 전용 DB(리플리카)를 쓸 때만 값을 채우세요.
|
|
DB_READ_HOST=
|
|
DB_READ_PORT=
|
|
DB_READ_DATABASE=
|
|
DB_READ_USERNAME=
|
|
DB_READ_PASSWORD=
|
|
|
|
SESSION_DRIVER=database
|
|
SESSION_LIFETIME=120
|
|
SESSION_ENCRYPT=false
|
|
SESSION_PATH=/
|
|
SESSION_DOMAIN=null
|
|
SESSION_COOKIE=g7-session
|
|
|
|
BROADCAST_CONNECTION=reverb
|
|
FILESYSTEM_DISK=local
|
|
QUEUE_CONNECTION=database
|
|
|
|
# Laravel Scout (검색엔진)
|
|
SCOUT_DRIVER=mysql-fulltext
|
|
|
|
# Laravel Reverb (WebSocket)
|
|
REVERB_APP_ID=
|
|
REVERB_APP_KEY=
|
|
REVERB_APP_SECRET=
|
|
REVERB_HOST="localhost"
|
|
REVERB_PORT=8080
|
|
REVERB_SCHEME=https
|
|
REVERB_VERIFY_SSL=true
|
|
|
|
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
|
|
VITE_REVERB_HOST="${REVERB_HOST}"
|
|
VITE_REVERB_PORT="${REVERB_PORT}"
|
|
VITE_REVERB_SCHEME="${REVERB_SCHEME}"
|
|
|
|
CACHE_STORE=database
|
|
CACHE_PREFIX=g7-cache-
|
|
|
|
MEMCACHED_HOST=127.0.0.1
|
|
|
|
REDIS_CLIENT=phpredis
|
|
REDIS_HOST=127.0.0.1
|
|
REDIS_PASSWORD=null
|
|
REDIS_PREFIX=g7-database-
|
|
REDIS_PORT=6379
|
|
|
|
MAIL_MAILER=log
|
|
MAIL_SCHEME=null
|
|
MAIL_HOST=127.0.0.1
|
|
MAIL_PORT=2525
|
|
MAIL_USERNAME=null
|
|
MAIL_PASSWORD=null
|
|
MAIL_FROM_ADDRESS="hello@example.com"
|
|
MAIL_FROM_NAME="${APP_NAME}"
|
|
|
|
AWS_ACCESS_KEY_ID=
|
|
AWS_SECRET_ACCESS_KEY=
|
|
AWS_DEFAULT_REGION=us-east-1
|
|
AWS_BUCKET=
|
|
AWS_USE_PATH_STYLE_ENDPOINT=false
|
|
|
|
VITE_APP_NAME="${APP_NAME}"
|
|
|
|
# 코어 업데이트
|
|
G7_UPDATE_GITHUB_URL=https://github.com/gnuboard/g7
|
|
G7_UPDATE_GITHUB_TOKEN=
|
|
G7_UPDATE_PENDING_PATH=
|
|
|
|
# spawn 자식 프로세스 실패 시 동작 모드 (기본: abort)
|
|
# - abort : 즉시 abort + 운영자에게 수동 명령 안내 (안전 우선, stale 메모리 fatal 차단)
|
|
# - fallback : in-process fallback 진행 (proc_open 미지원 공유 호스팅 호환, stale 메모리 위험 잔존)
|
|
# G7_UPDATE_SPAWN_FAILURE_MODE=abort
|