Files
Gnuboard7/vendor-bundle.json
T
HeuJung ea58c606a2 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)
2026-08-13 15:15:19 +09:00

545 lines
14 KiB
JSON

{
"schema_version": "1.0",
"generated_at": "2026-08-12T08:04:04+00:00",
"generator": "g7 vendor-bundle:build",
"target": "core",
"composer_json_sha256": "3c7e6e17966f09f12a0282b12b18eba46c5c4f06d63c2355a514a3160af1d77a",
"composer_lock_sha256": "49bd7586c511e420bb76418579b8ca94676870d4940fdaf6bb6e0c769dc54ce0",
"zip_sha256": "f193db3da359dfa2ce8f1da9ab1c4d9c090b22f4e607ae63bc1955c7c2317db2",
"zip_size": 15212477,
"package_count": 106,
"php_requirement": "^8.2",
"g7_version": "7.0.7",
"packages": [
{
"name": "aws/aws-crt-php",
"version": "v1.2.7",
"type": "library"
},
{
"name": "aws/aws-sdk-php",
"version": "3.386.1",
"type": "library"
},
{
"name": "brick/math",
"version": "0.14.8",
"type": "library"
},
{
"name": "carbonphp/carbon-doctrine-types",
"version": "3.2.0",
"type": "library"
},
{
"name": "clue/redis-protocol",
"version": "v0.3.2",
"type": "library"
},
{
"name": "clue/redis-react",
"version": "v2.8.0",
"type": "library"
},
{
"name": "composer/ca-bundle",
"version": "1.5.12",
"type": "library"
},
{
"name": "composer/semver",
"version": "3.4.4",
"type": "library"
},
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
"type": "library"
},
{
"name": "doctrine/inflector",
"version": "2.1.0",
"type": "library"
},
{
"name": "doctrine/lexer",
"version": "3.0.1",
"type": "library"
},
{
"name": "dragonmantank/cron-expression",
"version": "v3.6.0",
"type": "library"
},
{
"name": "egulias/email-validator",
"version": "4.0.4",
"type": "library"
},
{
"name": "evenement/evenement",
"version": "v3.0.2",
"type": "library"
},
{
"name": "fruitcake/php-cors",
"version": "v1.4.0",
"type": "library"
},
{
"name": "geoip2/geoip2",
"version": "v3.3.0",
"type": "library"
},
{
"name": "graham-campbell/result-type",
"version": "v1.1.4",
"type": "library"
},
{
"name": "guzzlehttp/guzzle",
"version": "7.12.3",
"type": "library"
},
{
"name": "guzzlehttp/promises",
"version": "2.5.0",
"type": "library"
},
{
"name": "guzzlehttp/psr7",
"version": "2.12.3",
"type": "library"
},
{
"name": "guzzlehttp/uri-template",
"version": "v1.0.8",
"type": "library"
},
{
"name": "jaybizzle/crawler-detect",
"version": "v1.4.0",
"type": "library"
},
{
"name": "laravel/framework",
"version": "v12.62.0",
"type": "library"
},
{
"name": "laravel/prompts",
"version": "v0.3.21",
"type": "library"
},
{
"name": "laravel/reverb",
"version": "v1.10.2",
"type": "library"
},
{
"name": "laravel/sanctum",
"version": "v4.3.2",
"type": "library"
},
{
"name": "laravel/scout",
"version": "v11.3.0",
"type": "library"
},
{
"name": "laravel/serializable-closure",
"version": "v2.0.13",
"type": "library"
},
{
"name": "laravel/tinker",
"version": "v2.11.1",
"type": "library"
},
{
"name": "league/commonmark",
"version": "2.8.2",
"type": "library"
},
{
"name": "league/config",
"version": "v1.2.0",
"type": "library"
},
{
"name": "league/flysystem",
"version": "3.35.1",
"type": "library"
},
{
"name": "league/flysystem-aws-s3-v3",
"version": "3.35.2",
"type": "library"
},
{
"name": "league/flysystem-local",
"version": "3.31.0",
"type": "library"
},
{
"name": "league/mime-type-detection",
"version": "1.16.0",
"type": "library"
},
{
"name": "league/uri",
"version": "7.8.1",
"type": "library"
},
{
"name": "league/uri-interfaces",
"version": "7.8.1",
"type": "library"
},
{
"name": "maxmind-db/reader",
"version": "v1.13.1",
"type": "library"
},
{
"name": "maxmind/web-service-common",
"version": "v0.11.1",
"type": "library"
},
{
"name": "monolog/monolog",
"version": "3.10.0",
"type": "library"
},
{
"name": "mtdowling/jmespath.php",
"version": "2.9.1",
"type": "library"
},
{
"name": "nesbot/carbon",
"version": "3.13.0",
"type": "library"
},
{
"name": "nette/schema",
"version": "v1.3.5",
"type": "library"
},
{
"name": "nette/utils",
"version": "v4.1.4",
"type": "library"
},
{
"name": "nikic/php-parser",
"version": "v5.7.0",
"type": "library"
},
{
"name": "nunomaduro/termwind",
"version": "v2.4.0",
"type": "library"
},
{
"name": "phpoption/phpoption",
"version": "1.9.5",
"type": "library"
},
{
"name": "predis/predis",
"version": "v2.4.1",
"type": "library"
},
{
"name": "psr/clock",
"version": "1.0.0",
"type": "library"
},
{
"name": "psr/container",
"version": "2.0.2",
"type": "library"
},
{
"name": "psr/event-dispatcher",
"version": "1.0.0",
"type": "library"
},
{
"name": "psr/http-client",
"version": "1.0.3",
"type": "library"
},
{
"name": "psr/http-factory",
"version": "1.1.0",
"type": "library"
},
{
"name": "psr/http-message",
"version": "2.0",
"type": "library"
},
{
"name": "psr/log",
"version": "3.0.2",
"type": "library"
},
{
"name": "psr/simple-cache",
"version": "3.0.0",
"type": "library"
},
{
"name": "psy/psysh",
"version": "v0.12.23",
"type": "library"
},
{
"name": "pusher/pusher-php-server",
"version": "7.2.8",
"type": "library"
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
"type": "library"
},
{
"name": "ramsey/collection",
"version": "2.1.1",
"type": "library"
},
{
"name": "ramsey/uuid",
"version": "4.9.3",
"type": "library"
},
{
"name": "ratchet/rfc6455",
"version": "v0.4.1",
"type": "library"
},
{
"name": "react/cache",
"version": "v1.2.0",
"type": "library"
},
{
"name": "react/dns",
"version": "v1.14.0",
"type": "library"
},
{
"name": "react/event-loop",
"version": "v1.6.0",
"type": "library"
},
{
"name": "react/promise",
"version": "v3.3.0",
"type": "library"
},
{
"name": "react/promise-timer",
"version": "v1.11.0",
"type": "library"
},
{
"name": "react/socket",
"version": "v1.17.0",
"type": "library"
},
{
"name": "react/stream",
"version": "v1.4.0",
"type": "library"
},
{
"name": "symfony/clock",
"version": "v7.4.8",
"type": "library"
},
{
"name": "symfony/console",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/css-selector",
"version": "v7.4.9",
"type": "library"
},
{
"name": "symfony/deprecation-contracts",
"version": "v3.7.0",
"type": "library"
},
{
"name": "symfony/error-handler",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/event-dispatcher",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v3.7.0",
"type": "library"
},
{
"name": "symfony/filesystem",
"version": "v7.4.11",
"type": "library"
},
{
"name": "symfony/finder",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/http-client",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/http-client-contracts",
"version": "v3.7.0",
"type": "library"
},
{
"name": "symfony/http-foundation",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/http-kernel",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/mailer",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/mailgun-mailer",
"version": "v7.4.14",
"type": "symfony-mailer-bridge"
},
{
"name": "symfony/mime",
"version": "v7.4.13",
"type": "library"
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.37.0",
"type": "library"
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.38.1",
"type": "library"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.38.1",
"type": "library"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.38.0",
"type": "library"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.38.2",
"type": "library"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.37.0",
"type": "library"
},
{
"name": "symfony/polyfill-php83",
"version": "v1.38.2",
"type": "library"
},
{
"name": "symfony/polyfill-php84",
"version": "v1.38.1",
"type": "library"
},
{
"name": "symfony/polyfill-php85",
"version": "v1.38.1",
"type": "library"
},
{
"name": "symfony/polyfill-uuid",
"version": "v1.37.0",
"type": "library"
},
{
"name": "symfony/process",
"version": "v7.4.13",
"type": "library"
},
{
"name": "symfony/routing",
"version": "v7.4.13",
"type": "library"
},
{
"name": "symfony/service-contracts",
"version": "v3.7.0",
"type": "library"
},
{
"name": "symfony/string",
"version": "v7.4.13",
"type": "library"
},
{
"name": "symfony/translation",
"version": "v7.4.14",
"type": "library"
},
{
"name": "symfony/translation-contracts",
"version": "v3.7.0",
"type": "library"
},
{
"name": "symfony/uid",
"version": "v7.4.9",
"type": "library"
},
{
"name": "symfony/var-dumper",
"version": "v7.4.14",
"type": "library"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "v2.4.0",
"type": "library"
},
{
"name": "vlucas/phpdotenv",
"version": "v5.6.3",
"type": "library"
},
{
"name": "voku/portable-ascii",
"version": "2.1.1",
"type": "library"
}
]
}