--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 는 이 헬퍼로 위임(상위호환)
38 lines
1.6 KiB
PHP
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);
|
|
}
|
|
}
|