fix(core,admin_basic): S3 스토리지 드라이버 실동작 결함 수정 및 S3 호환 스토리지 연결 지원

공개 제보 — 파일 스토리지에서 S3 를 선택해 저장해도 실제 파일 저장이
동작하지 않던 결함의 전면 수정.

- S3 어댑터(league/flysystem-aws-s3-v3)·predis 를 코어 기본 의존성으로 포함
 — 어댑터 부재 즉사, phpredis 확장 없는 서버의 redis 선택 전면 다운 차단
 (부트 시 확장 부재 감지 → predis 자동 폴백)
- storage_driver=s3 저장 시 코어 첨부 업로드 디스크를 s3 로 전환
 (ATTACHMENT_DISK env 명시가 항상 우선, 기존 행은 저장 당시 disk 로 서빙)
- 첨부·템플릿 레이아웃 첨부 서빙을 행 disk 를 따르는 스토리지 스트림으로 교체
 — 로컬 절대 경로 전제 fileResponse 는 S3 행에서 filemtime stat 500
 (streamedFileResponse: 행 메타 기반 ETag/304/Cache-Control)
- S3 호환 스토리지(R2/MinIO/NCP) 연결 지원: 엔드포인트 URL·path-style 설정
 신설, 리전 목록 선택 → 자유 입력 전환, 연결 테스트를 실제 저장 경로와
 동일 설정(endpoint/path-style)으로 정렬
- 사용 불능 드라이버(어댑터·PHP 확장 부재)의 저장/테스트 요청을 사유와 함께
 422 로 차단하는 서버 게이트 신설 (DriverRegistryService 능력 판정)
- 웹소켓 연결 테스트에 서버(백엔드 발송용) endpoint 검사 추가 — 클라이언트만
 검사해 테스트 성공 + 실제 발송 실패가 가능하던 비대칭 해소
- env 빈 값(`KEY=`) 함정 정규화: AWS_URL/AWS_ENDPOINT/ATTACHMENT_DISK 빈 문자열을
 미설정으로 취급 (config 정규화 + 예시 파일 주석 처리)
- 플러그인 드라이버 폴백의 log 카테고리 죽은 키(logging.default) 정정 및
 websocket 유령 설정 키 제거
- 실 AWS S3 종단 검증 완료 (설정 저장 → 업로드 S3 실저장 → 서빙 200/304)
This commit is contained in:
HeuJung
2026-08-13 15:15:19 +09:00
parent c128a6ea3a
commit ea58c606a2
56 changed files with 2899 additions and 243 deletions
@@ -4,6 +4,22 @@
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
## [1.0.6] - 2026-08-12
### Added
- S3 호환 스토리지 설정 신설 항목(엔드포인트 URL·Path-style 주소)과 리전 형식 안내의 검증 메시지 일본어 번역 추가 (`validation.settings.s3_endpoint_*`, `s3_use_path_style_boolean`, `s3_region_*`) — 드라이버 설정 저장 시 오류 안내가 일본어 로케일에서 자연스럽게 표시됩니다. (#99 @lyg-kaban 님께서 제보해주셨습니다.)
- 드라이버 사용 불능 안내 문구 일본어 번역 추가 (`validation.settings.driver_unusable`, `settings.driver_unusable_*`, `settings.s3_adapter_missing`) — 필요한 라이브러리·PHP 확장이 없는 드라이버를 저장·테스트할 때의 사유 안내가 일본어 로케일에서 표시됩니다.
- 웹소켓 서버(백엔드 발송용) endpoint 연결 실패 안내 일본어 번역 추가 (`settings.websocket_server_test_failed`).
### Changed
- S3 리전 검증 메시지를 목록 선택 안내에서 형식 안내(소문자 영숫자·하이픈, R2 는 `auto`)로 개정했습니다.
### Removed
- 참조처가 사라진 S3 리전 선택 검증 메시지(`validation.settings.s3_region_required`)를 원본(ko/en)과 함께 정리했습니다.
## [1.0.5] - 2026-08-10
### Added
@@ -71,6 +71,7 @@ return [
's3_test_failed' => 'S3バケットへの接続に失敗しました。',
's3_missing_config' => 'S3設定が不足しています。(バケット、リージョン、アクセスキー、シークレットキー)',
's3_sdk_missing' => 'AWS SDKがインストールされていません。',
's3_adapter_missing' => 'S3ストレージアダプター(league/flysystem-aws-s3-v3)がインストールされていません。',
's3_bucket_not_found' => 'S3バケットが見つかりません。',
's3_access_denied' => 'S3バケットへのアクセスが拒否されました。',
's3_invalid_credentials' => 'S3認証情報が正しくありません。',
@@ -86,6 +87,10 @@ return [
'memcached_connection_failed' => 'Memcachedサーバーに接続できません。',
'websocket_test_success' => 'Websocketサーバーに正常に接続されました。',
'websocket_test_failed' => 'Websocketサーバーへの接続に失敗しました。',
'websocket_server_test_failed' => 'Websocketサーバー(バックエンド送信用)エンドポイントへの接続に失敗しました。クライアントエンドポイントは正常です。',
'driver_unusable_s3_adapter' => 'S3ストレージアダプター(league/flysystem-aws-s3-v3)がインストールされていません。',
'driver_unusable_redis_client' => 'phpredis拡張とpredisライブラリのどちらも利用できません。',
'driver_unusable_memcached_extension' => 'memcached PHP拡張がインストールされていません。',
'websocket_invalid_host' => 'Websocketホスト設定が正しくありません。ホストにはアドレスのみを入力し、アカウント情報(@)またはhttp/https以外のプロトコルは使用できません。',
'websocket_connection_refused' => 'Websocketサーバーに接続できません。サーバーが実行中であるか確認してください。',
'invalid_email' => '無効なメールアドレスです。',
@@ -897,11 +897,16 @@ return [
'storage_driver_required' => 'ストレージドライバーを選択してください。',
'storage_driver_invalid' => '正しいストレージドライバーを選択してください。',
's3_bucket_max' => 'S3バケット名は255字を超えることはできません。',
's3_region_invalid' => '正しいS3リージョンを選択してください。',
's3_region_invalid' => 'S3リージョンには小文字の英数字とハイフンのみ使用できます。(例: ap-northeast-2、Cloudflare R2 は auto)',
's3_region_max' => 'S3リージョンは64字を超えることはできません。',
's3_access_key_max' => 'S3 Access Keyは255字を超えることはできません。',
's3_secret_key_max' => 'S3 Secret Keyは255字を超えることはできません。',
's3_url_invalid' => '正しいS3 URL形式ではありません。',
's3_url_max' => 'S3 URLは500字を超えることはできません。',
's3_endpoint_invalid' => '正しいS3エンドポイントURL形式ではありません。',
's3_endpoint_max' => 'S3エンドポイントURLは500字を超えることはできません。',
's3_use_path_style_boolean' => 'Path-styleアドレス使用の設定はtrueまたはfalseである必要があります。',
'driver_unusable' => "':driver' ドライバーはこのサーバーでは使用できません。:reason",
'cache_driver_required' => 'キャッシュドライバーを選択してください。',
'cache_driver_invalid' => '正しいキャッシュドライバーを選択してください。',
'redis_host_max' => 'Redisホストは255字を超えることはできません。',
@@ -950,7 +955,6 @@ return [
'log_days_min' => 'ログ保持日数は1以上である必要があります。',
'log_days_max' => 'ログ保持日数は365を超えることはできません。',
's3_bucket_required' => 'S3バケット名は必須です。',
's3_region_required' => 'S3リージョンを選択してください。',
's3_access_key_required' => 'S3 Access Keyは必須です。',
's3_secret_key_required' => 'S3 Secret Keyは必須です。',
's3_url_url' => 'S3 URLは有効なURLである必要があります。',
@@ -1073,6 +1077,8 @@ return [
's3_access_key' => 'S3 Access Key',
's3_secret_key' => 'S3 Secret Key',
's3_url' => 'S3 URL',
's3_endpoint' => 'S3 エンドポイントURL',
's3_use_path_style' => 'Path-styleアドレス使用',
'cache_driver' => 'キャッシュ ドライバー',
'redis_host' => 'Redis ホスト',
'redis_port' => 'Redis ポート',
@@ -12,7 +12,7 @@
"en": "G7 core Japanese language pack (bundled)",
"ja": "G7 コア 日本語 言語パック(バンドル)"
},
"version": "1.0.5",
"version": "1.0.6",
"license": "MIT",
"scope": "core",
"target_identifier": null,
@@ -4,6 +4,20 @@
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
## [1.0.5] - 2026-08-12
### Added
- 환경설정 > 드라이버 > 파일 스토리지의 S3 신설 항목 일본어 번역 추가 (`settings.drivers.storage.s3_endpoint*`, `s3_use_path_style*`, `s3_region_desc`) — 엔드포인트 URL·Path-style 토글·리전 입력 도움말이 일본어 로케일에서 자연스럽게 표시됩니다. (#99 @lyg-kaban 님께서 제보해주셨습니다.)
### Changed
- S3 URL 항목의 이름·설명을 공개 URL(CDN) 용도로 명확히 한 문구 개정을 반영했습니다.
### Removed
- 리전 목록 선택 라벨(`settings.drivers.storage.regions.*`) 5종 제거 — 리전이 자유 입력으로 바뀌어 더 이상 사용되지 않습니다.
## [1.0.4] - 2026-08-10
### Added
@@ -1631,17 +1631,15 @@
},
"s3_bucket": "S3バケット",
"s3_region": "S3リージョン",
"regions": {
"ap_northeast_2": "アジアパシフィック(ソウル)",
"ap_northeast_1": "アジアパシフィック(東京)",
"us_east_1": "米国東部(バージニア)",
"us_west_2": "米国西部(オレゴン)",
"eu_west_1": "ヨーロッパ(アイルランド)"
},
"s3_region_desc": "AWSリージョンコードまたはS3互換ストレージのリージョン値を入力してください。(例: ap-northeast-2、Cloudflare R2 は auto)",
"s3_access_key": "Access Key",
"s3_secret_key": "Secret Key",
"s3_url": "S3 URL",
"s3_url_desc": "カスタムエンドポイントまたはCDN URLを使用する場合のみ入力してください。"
"s3_endpoint": "エンドポイントURL",
"s3_endpoint_desc": "S3互換ストレージ(Cloudflare R2、MinIOなど)のAPIアドレスです。AWS S3の場合は空欄にしてください。",
"s3_use_path_style": "Path-styleアドレスを使用",
"s3_use_path_style_desc": "MinIOなどpath-styleアドレス専用ストレージで有効にします。",
"s3_url": "S3 URL (公開URL)",
"s3_url_desc": "ファイルの公開URL生成に使うCDN/カスタムドメインです。APIリクエストアドレスはエンドポイントURLに入力してください。"
},
"cache": {
"title": "キャッシュ",
@@ -12,7 +12,7 @@
"en": "G7 template (sirsoft-admin_basic) Japanese language pack (bundled)",
"ja": "G7 テンプレート (sirsoft-admin_basic) 日本語 言語パック(バンドル)"
},
"version": "1.0.4",
"version": "1.0.5",
"license": "MIT",
"scope": "template",
"target_identifier": "sirsoft-admin_basic",