# 그누보드5 Cloudflare R2 Storage 모듈 그누보드5의 파일 업로드를 Cloudflare R2 스토리지로 연동하는 확장 모듈입니다. ## 특징 - **코어 수정 없음**: 그누보드 extend 훅 시스템만 사용 - **S3 호환 API**: AWS SDK for PHP 사용 - **Presigned URL**: 보안을 위한 임시 다운로드 URL 생성 - **유저별 경로**: `users/{user_id}/` 구조로 파일 분리 ## 지원 기능 | 기능 | R2 저장 | 상태 | |------|---------|------| | 게시판 첨부파일 | ✅ | extend 훅으로 동작 | | 에디터 이미지 (SmartEditor2 등) | ✅ | extend 훅으로 동작 | | 프로필/회원 이미지 | ❌ | 로컬 저장 (아래 참고) | ## 제한사항 ### 프로필 이미지 R2 미지원 프로필 이미지(회원 아이콘/이미지)는 **코어 수정 없이는 R2 업로드가 불가능**합니다. **이유:** - 그누보드 코어의 `bbs/member_image_check.php`에서 파일 업로드를 직접 처리 - 해당 파일에 extend 훅 이벤트가 존재하지 않음 - 관리자 회원수정(`adm/member_form_update.php`)도 동일 **현재 동작:** - 프로필 이미지는 기존 방식대로 `data/member_image/` 디렉토리에 로컬 저장 - 게시판/에디터 파일만 R2에 저장 **코어 수정 시 가능한 방법:** ```php // bbs/member_image_check.php 수정 시 // 파일 저장 후 R2 업로드 이벤트 추가 필요 run_event('member_image_upload_after', $mb_id, $file_path); ``` > ⚠️ 이 모듈은 코어 무수정 원칙을 따르므로, 프로필 이미지는 로컬 저장이 최선의 선택입니다. ## R2 저장 경로 구조 ``` gnuboard-files/ ├── users/{user_id}/ │ ├── board/{bo_table}/{filename} # 게시판 첨부파일 │ └── editor/{date}/{filename} # 에디터 이미지 └── public/ # 비회원 업로드 (미구현) └── board/{bo_table}/{filename} ``` ## 설치 방법 1. `extend/r2-storage/` 디렉토리를 그누보드 `extend/` 폴더에 복사 2. `r2_config.php.example`을 `r2_config.php`로 복사 후 R2 인증정보 입력 3. Composer 의존성 설치: ```bash cd extend/r2-storage composer install ``` ## 설정 `r2_config.php` 파일에서 설정: ```php // R2 인증정보 define('R2_ACCOUNT_ID', 'your_account_id'); define('R2_ACCESS_KEY_ID', 'your_access_key'); define('R2_SECRET_ACCESS_KEY', 'your_secret_key'); define('R2_BUCKET_NAME', 'gnuboard-files'); // 옵션 define('R2_ENABLED', true); define('R2_USE_PRESIGNED_URL', true); define('R2_PRESIGNED_EXPIRY', 3600); // 1시간 ``` ## 테스트 결과 (2026-01-10) - ✅ 게시판 첨부파일 업로드 → R2 저장 확인 - ✅ SmartEditor2 이미지 업로드 → R2 저장 확인 - ✅ 파일 다운로드 → Presigned URL 리다이렉트 확인 - ❌ 프로필 이미지 → 로컬 저장 (코어 수정 불가로 인한 제한) ## 라이선스 MIT License