- 지원 기능 명시 (게시판/에디터 ✅, 프로필 ❌) - 프로필 이미지 R2 미지원 사유 문서화 - 코어 수정 없이는 extend 훅으로 불가능 - 로컬 저장이 최선의 선택임을 명시 - 설치/설정 방법 및 테스트 결과 포함 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
그누보드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에 저장
코어 수정 시 가능한 방법:
// 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}
설치 방법
extend/r2-storage/디렉토리를 그누보드extend/폴더에 복사r2_config.php.example을r2_config.php로 복사 후 R2 인증정보 입력- Composer 의존성 설치:
cd extend/r2-storage composer install
설정
r2_config.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