# 포트폴리오 사이트 - 설치 가이드 JSON + PHP 기반의 가벼운 포트폴리오 사이트입니다. Synology NAS Web Station에서 동작하도록 설계되었습니다. ## 📁 파일 구조 ``` portfolio/ ├── index.html # 메인 페이지 (프로젝트 목록) ├── profile.html # 프로필 페이지 ├── generate_password.php # 비밀번호 해시 생성기 (사용 후 삭제!) ├── api/ │ ├── config.php # 설정 (비밀번호 해시 위치) │ ├── auth.php # 로그인/로그아웃 API │ ├── projects.php # 프로젝트 CRUD API │ ├── profile.php # 프로필 수정 API │ └── upload.php # 이미지 업로드 API ├── data/ │ ├── projects.json # 프로젝트 데이터 │ ├── profile.json # 프로필 데이터 │ └── .htaccess # 직접 접근 차단 └── uploads/ └── .htaccess # PHP 실행 차단 ``` ## 🚀 설치 (Synology NAS 기준) ### 1. Web Station 설치 및 PHP 활성화 - Package Center에서 **Web Station** 설치 - **Web Station → Web Service Portal**에서 PHP 8.x 활성화 - **Web Service**에서 사이트의 PHP 버전을 8.x로 지정 ### 2. 파일 업로드 - File Station에서 `/web/portfolio/` 폴더 생성 - 위 모든 파일을 해당 폴더에 업로드 ### 3. 권한 설정 다음 폴더는 PHP가 쓸 수 있어야 합니다: - `data/` (JSON 쓰기) - `uploads/` (이미지 업로드) File Station에서 두 폴더의 권한을 `http` 그룹에 쓰기 가능하게 설정하세요. ### 4. 관리자 비밀번호와 보안 설정 실제 관리자 비밀번호 해시는 저장소에 커밋하지 않습니다. 운영 서버에서는 다음 둘 중 하나로 설정하세요. **(A) api/config.local.php 사용 권장** 1. `api/config.local.example.php`를 `api/config.local.php`로 복사합니다. 2. 브라우저에서 다음 주소에 접속해 원하는 비밀번호의 해시를 생성합니다. ``` http://your-nas/portfolio/generate_password.php ``` 3. 생성된 해시를 `api/config.local.php`의 `ADMIN_PASSWORD_HASH` 값으로 넣습니다. 4. `api/config.local.php`는 `.gitignore`에 포함되어 있으므로 저장소에 올리지 않습니다. **(B) 환경변수 사용** 서버 환경변수 `ADMIN_PASSWORD_HASH`에 `password_hash()`로 만든 해시를 설정해도 됩니다. ```bash ADMIN_PASSWORD_HASH='$2y$10$replace_with_your_generated_hash' ``` `api/config.php`에는 기본 관리자 비밀번호나 실제 해시가 들어 있지 않아야 합니다. 설정이 없으면 관리자 로그인은 실패합니다. **추가 운영 보안** - 로그인 후 상태 변경 API는 CSRF 토큰을 요구합니다. 프론트엔드의 `fetch` 흐름은 로그인/세션 확인 응답에서 받은 토큰을 자동으로 보냅니다. - 업로드 실패 응답에는 서버 내부 경로, 임시 경로, 저장 대상 경로가 노출되지 않습니다. 상세 오류는 서버 로그에서만 확인합니다. - URL 입력은 `http`, `https`, `uploads/` 상대 경로만 허용합니다. CSS 색상 값은 hex 색상 allowlist로 제한합니다. - 보안을 위해 `generate_password.php`는 설정 완료 후 운영 서버에서 삭제하거나 접근을 차단하세요. ### 5. 접속 - 메인: `http://your-nas/portfolio/` - 관리자 로그인: 페이지 하단 우측 방패 아이콘(🛡️) 클릭 ## 🎯 기능 ### 일반 방문자 - 프로젝트 목록 보기 - 프로필 페이지에서 자기소개/스킬/타임라인/연락처 확인 ### 관리자 (로그인 후) - ✅ 새 프로젝트 등록 - ✅ 기존 프로젝트 수정/삭제 - ✅ 프로필 정보 편집 (이름, 사진, 자기소개) - ✅ 기술 스택 추가/수정/삭제 (스킬 바) - ✅ 타임라인 추가/수정/삭제 - ✅ SNS 링크 관리 ## 🔒 보안 체크리스트 - [ ] `generate_password.php` 삭제했는가? - [ ] `api/config.local.php` 또는 `ADMIN_PASSWORD_HASH` 환경변수에 실제 관리자 해시가 설정되어 있는가? - [ ] `api/config.local.php`가 저장소에 커밋되지 않는가? - [ ] HTTPS 설정 (NAS의 Reverse Proxy 또는 Let's Encrypt) - [ ] 비밀번호는 8자 이상, 영문/숫자/기호 조합 - [ ] `data/`, `uploads/` 폴더의 .htaccess 파일이 동작하는지 확인 ## 💾 백업 데이터는 모두 텍스트 파일이므로 Git으로 관리할 수 있습니다: ```bash cd /web/portfolio git init git remote add origin http://your-nas:3000/your-name/portfolio.git git add . git commit -m "initial" git push -u origin main ``` `data/*.json` 파일이 변경 이력으로 남아 언제든 복구 가능합니다. ## 🐛 문제 해결 **"데이터를 읽을 수 없습니다" 오류** → `data/` 폴더의 쓰기 권한을 확인하세요. **로그인이 안 됨** → `api/config.local.php` 또는 `ADMIN_PASSWORD_HASH` 환경변수에 올바른 해시가 설정되어 있는지 확인하세요. **.htaccess가 동작하지 않음** → Web Station에서 Apache 사용 + `mod_rewrite`, `AllowOverride All` 설정 필요. nginx를 쓴다면 nginx 설정으로 동일한 차단 규칙을 추가해야 합니다. ## 🔄 향후 확장 아이디어 - 프로젝트별 상세 페이지 (markdown 지원) - 태그/카테고리 필터링 - 방문자 통계 - 다국어 지원 (i18n) - Gitea API 연동으로 저장소 정보 자동 가져오기