Files
Gnuboard7/upgrades/data/7.0.0-beta.5/migrations/05_RecoverPublicStorageSymlink.php
T
HeuJung 0a6ff23132 fix(core-update): --prune 시 public/storage symlink 삭제로 업로드 파일 404 되는 문제
--prune 은 릴리즈 소스에 없는 public/storage 런타임 symlink 를 orphan 으로
삭제해 업로드 파일이 404 되었다. 심층 방어 2층으로 차단한다.

- 층1(예방): FilePermissionHelper 에 preserveLinkPaths 화이트리스트 추가.
 applyUpdate 가 public 타깃에 ['storage'] 전달 → 매칭 orphan 링크/junction 만
 삭제 제외 (정밀 보호)
- 층2(복구): StorageLinkHelper::ensurePublicStorageLink 신규 정적 헬퍼.
 CoreUpdateCommand 종료 시점(정상+핸드오프) 호출로 부재/손상 링크 멱등 재생성
 (Windows junction 폴백). beta.5 migration 05 는 이 헬퍼로 위임(상위호환)
2026-07-16 12:42:54 +09:00

38 lines
1.6 KiB
PHP

<?php
namespace App\Upgrades\Data\V7_0_0_beta_5\Migrations;
use App\Extension\Helpers\StorageLinkHelper;
use App\Extension\Upgrade\DataMigration;
use App\Extension\UpgradeContext;
/**
* `public/storage` symlink 손상 자동 복구 (단발성).
*
* beta.4 → beta.5 업그레이드 시점의 백업/복원은 부모 beta.4 메모리의 `FilePermissionHelper`
* 를 사용하므로 symlink 보존 분기 (beta.5+ 도입) 가 미적용 → 롤백 발생 시 `public/storage`
* symlink 가 일반 디렉토리로 변질되는 결함이 잔존한다. 본 step 이 단발성 자동 복구
* (rename 보존 + symlink 재생성) 로 보완한다.
*
* 복구 로직은 `StorageLinkHelper::ensurePublicStorageLink()` 로 일원화되어 있다 (#43 에서
* 코어 업데이트 종료 시점과 공유). 헬퍼가 멱등이며 "부재→재생성" 케이스까지 처리하므로
* 본 step 의 기존 동작(정상 symlink skip / 손상 디렉토리 rename+재생성 / 실패 원복)은
* 상위호환으로 유지된다.
*
* V-1 안전: `StorageLinkHelper` 는 `Illuminate\Support\Facades\*` + 네이티브 함수 + 로컬
* 로직만 사용하는 정적 헬퍼이므로, 이 step 이 이전 버전 프로세스 메모리에서 in-process
* fallback 으로 실행되어도 stale 인스턴스 의존이 없다.
*/
final class RecoverPublicStorageSymlink implements DataMigration
{
public function name(): string
{
return 'RecoverPublicStorageSymlink';
}
public function run(UpgradeContext $context): void
{
StorageLinkHelper::ensurePublicStorageLink($context->logger);
}
}