# 🏠 Home NAS Web Platform (webpage) Synology NAS 기반의 개인 μ›Ή ν”Œλž«νΌμœΌλ‘œ, 둜또 뢄석/μΆ”μ²œ μ„œλΉ„μŠ€μ™€ μ—¬ν–‰ 사진 지도 μ„œλΉ„μŠ€λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. Frontend, Backend, Travel Proxy, Auto Deployerλ₯Ό Docker Compose둜 ν†΅ν•©ν•˜μ—¬ μš΄μ˜ν•©λ‹ˆλ‹€. --- ## πŸ–₯️ NAS ν™˜κ²½ 정보 | ν•­λͺ© | κ°’ | | --------------- | ------------------------------------- | | **NAS** | Synology NAS | | **OS** | Synology DSM | | **CPU** | Intel Celeron J4025 (2 Core, 2.0GHz) | | **λ©”λͺ¨λ¦¬** | 18 GB | | **Docker** | Synology Container Manager | | **Reverse Proxy** | Nginx (μ»¨ν…Œμ΄λ„ˆ) | | **Git Server** | Gitea (self-hosted) | --- ## πŸ“ 디렉토리 ꡬ쑰 ``` /volume1 β”œβ”€β”€ docker/ β”‚ └── webpage/ # πŸš€ 운영 λŸ°νƒ€μž„ (Docker Compose 기쀀점) β”‚ β”œβ”€β”€ backend/ # lotto-backend β”‚ β”œβ”€β”€ travel-proxy/ # travel API + thumbnail generator β”‚ β”œβ”€β”€ deployer/ # webhook 기반 μžλ™ 배포 μ»¨ν…Œμ΄λ„ˆ β”‚ β”œβ”€β”€ frontend/ # 정적 파일 (Vite build κ²°κ³Ό) β”‚ β”œβ”€β”€ nginx/ β”‚ β”‚ └── default.conf β”‚ β”œβ”€β”€ scripts/ β”‚ β”‚ └── deploy.sh # webhook이 ν˜ΈμΆœν•˜λŠ” μ‹€ν–‰κΈ° β”‚ β”œβ”€β”€ docker-compose.yml β”‚ └── data/ β”‚ └── lotto.db β”‚ β”œβ”€β”€ workspace/ β”‚ └── web-page-backend/ # 🧠 Git 레포 (backend + infra) β”‚ β”œβ”€β”€ backend/ β”‚ β”œβ”€β”€ travel-proxy/ β”‚ β”œβ”€β”€ deployer/ β”‚ β”œβ”€β”€ nginx/ β”‚ β”œβ”€β”€ scripts/ β”‚ β”‚ └── deploy-nas.sh # μ‹€μ œ 운영 반영 둜직 β”‚ β”œβ”€β”€ docker-compose.yml β”‚ β”œβ”€β”€ .env.example β”‚ └── README.md β”‚ └── web/ └── images/ └── webPage/ └── travel/ # πŸ“· 원본 μ—¬ν–‰ 사진 (RO) ``` --- ## 🧩 μ„œλΉ„μŠ€ ꡬ성 κ°œμš” ``` Internet ↓ Nginx (frontend container) β”œβ”€β”€ / β†’ SPA (React/Vite) β”œβ”€β”€ /api/ β†’ lotto-backend β”œβ”€β”€ /api/travel/ β†’ travel-proxy β”œβ”€β”€ /media/... β†’ Nginx 직접 파일 μ„œλΉ™ └── /webhook/ β†’ deployer ``` --- ### 🟦 Frontend (lotto-frontend) - **μ—­ν• **: React + Vite 기반 SPA둜, 둜또 μΆ”μ²œ 및 μ—¬ν–‰ 지도 UIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. - **νŠΉμ§•**: - 정적 파일만 운영 μ„œλ²„μ— λ°°ν¬ν•©λ‹ˆλ‹€. - μž₯κΈ° μΊμ‹œ(`assets/`)와 `index.html` μΊμ‹œ λ¬΄νš¨ν™” μ „λž΅μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. - Backend / Travel APIλŠ” Nginxμ—μ„œ Reverse Proxy둜 μ—°κ²°λ©λ‹ˆλ‹€. - **배포 방식**: 1. **둜컬 개발**: - `.env` 파일 μ„€μ • ν›„ `docker compose up`으둜 전체 μŠ€νƒ μ‹€ν–‰ κ°€λŠ₯ 2. **운영 배포**: - Codeλ₯Ό Git에 Push - Webhook이 νŠΈλ¦¬κ±°λ˜μ–΄ NASκ°€ μžλ™ Pull & Deploy - (Frontend λΉŒλ“œ μ‚°μΆœλ¬Όμ€ 별도 μ—…λ‘œλ“œ ν˜Ήμ€ CI 연동 ν•„μš”) --- ## πŸ› οΈ 개발 ν™˜κ²½ μ„€μ • (Local Development) 이 ν”„λ‘œμ νŠΈλŠ” **Windows/Mac 둜컬 ν™˜κ²½**κ³Ό **Synology NAS 운영 ν™˜κ²½**을 λͺ¨λ‘ μ§€μ›ν•˜λ„λ‘ κ΅¬μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ### 1. ν™˜κ²½ λ³€μˆ˜ μ„€μ • `docker-compose.yml`은 ν™˜κ²½ λ³€μˆ˜μ— μ˜μ‘΄ν•©λ‹ˆλ‹€. 1. `.env.example` νŒŒμΌμ„ λ³΅μ‚¬ν•˜μ—¬ `.env` νŒŒμΌμ„ μƒμ„±ν•˜μ„Έμš”. ```bash cp .env.example .env ``` 2. `.env` 파일의 경둜(`RUNTIME_PATH`, `PHOTO_PATH` λ“±)λ₯Ό 둜컬 ν™˜κ²½μ— 맞게 μˆ˜μ •ν•˜μ„Έμš”. - 기본값은 ν˜„μž¬ 디렉토리(`.`) κΈ°μ€€μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμ–΄ λ°”λ‘œ μ‹€ν–‰ κ°€λŠ₯ν•©λ‹ˆλ‹€. ### 2. 둜컬 μ‹€ν–‰ ```bash docker compose up -d ``` - Frontend: http://localhost:8080 - Backend API: http://localhost:18000 - Travel API: http://localhost:19000 --- --- ### 🟩 Backend (lotto-backend) - **μ—­ν• **: 둜또 데이터 μˆ˜μ§‘, 뢄석, μΆ”μ²œ APIλ₯Ό μ œκ³΅ν•˜λ©° SQLite둜 데이터λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. - **μ£Όμš” κΈ°λŠ₯**: - μ΅œμ‹  및 νŠΉμ • 회차 쑰회 - μΆ”μ²œ 번호 생성 및 νžˆμŠ€ν† λ¦¬ 관리 (쀑볡 제거) - 즐겨찾기, λ©”λͺ¨, νƒœκ·Έ 관리 - 배치 μΆ”μ²œ κΈ°λŠ₯ - **기술 μŠ€νƒ**: FastAPI, SQLite, APScheduler (μ •κΈ° μˆ˜μ§‘) - **μ£Όμš” μ—”λ“œν¬μΈνŠΈ**: ```http GET /api/lotto/latest GET /api/lotto/{drw_no} GET /api/lotto/recommend GET /api/lotto/recommend/batch GET /api/history PATCH /api/history/{id} DELETE /api/history/{id} ``` --- ### 🟨 Travel Proxy (travel-proxy) - **μ—­ν• **: μ—¬ν–‰ 사진 API, 지역별 사진 λ§€μΉ­, 썸넀일 μžλ™ 생성 및 μΊμ‹œλ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€. - **섀계 포인트**: - 원본 사진은 읽기 μ „μš©(RO)으둜 λ§ˆμš΄νŠΈν•©λ‹ˆλ‹€. - 썸넀일은 μ“°κΈ°/읽기(RW) μ „μš© μΊμ‹œ 디렉토리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. - 사진 메타데이터 λ³€κ²½ μ‹œ μΊμ‹œκ°€ μžλ™μœΌλ‘œ λ¬΄νš¨ν™”λ©λ‹ˆλ‹€. - **데이터 ꡬ쑰**: ``` /data/travel/ # 원본 사진 (RO) β”œβ”€β”€ 24.09.jeju/ β”œβ”€β”€ 25.07.maldives/ └── _meta/ β”œβ”€β”€ region_map.json └── regions.geojson /data/thumbs/ # 썸넀일 μΊμ‹œ (RW) β”œβ”€β”€ 24.09.jeju/ └── 25.07.maldives/ ``` - **μ£Όμš” μ—”λ“œν¬μΈνŠΈ**: ```http GET /api/travel/regions GET /api/travel/photos?region=jeju GET /media/travel/.thumb/{album}/{file} ``` --- ### πŸŸ₯ Deployer (webpage-deployer) - **μ—­ν• **: Gitea Webhook을 μˆ˜μ‹ ν•˜μ—¬ Git pull 및 Docker μž¬κΈ°λ™μ„ μžλ™ν™”ν•©λ‹ˆλ‹€. - **흐름**: `Gitea Push` β†’ `Webhook` β†’ `deployer` β†’ `/scripts/deploy.sh` β†’ `docker compose up -d --build` - **λ³΄μ•ˆ**: HMAC SHA256 μ„œλͺ…(`X-Gitea-Signature`)을 `WEBHOOK_SECRET` ν™˜κ²½λ³€μˆ˜λ‘œ κ²€μ¦ν•©λ‹ˆλ‹€. - **νŠΉμ§•**: - Docker socket을 λ§ˆμš΄νŠΈν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€. - 둀백을 μœ„ν•΄ `.releases/` 디렉토리에 μžλ™ 백업을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. --- ## πŸ” 배포 ν”Œλ‘œμš° μš”μ•½ - **Backend / Travel / Infra λ³€κ²½**: `git push`λ₯Ό 톡해 Gitea둜 ν‘Έμ‹œν•˜λ©΄ Webhook이 νŠΈλ¦¬κ±°λ˜μ–΄ μžλ™μœΌλ‘œ λ°°ν¬λ©λ‹ˆλ‹€. - **Frontend λ³€κ²½**: λ‘œμ»¬μ—μ„œ λΉŒλ“œ ν›„, μƒμ„±λœ 정적 파일만 NAS둜 μ—…λ‘œλ“œν•©λ‹ˆλ‹€. --- ## πŸ§ͺ 운영 체크 포인트 - `/health`: Backend μ„œλΉ„μŠ€ μƒνƒœ 확인 - `/api/travel/photos`: 응닡 속도 확인 - `/media/travel/.thumb`: 썸넀일 생성 μ—¬λΆ€ 확인 - `deployer` μ»¨ν…Œμ΄λ„ˆ 둜그 확인 --- ## πŸ“ TODO ### πŸ”₯ 둜또 μ„œλΉ„μŠ€ 고도화 - [ ] μΆ”μ²œ κ²°κ³Ό 톡계 μ‹œκ°ν™” (뢄포, 합계, 홀짝) - [ ] μΆ”μ²œ νžˆμŠ€ν† λ¦¬ ν•„ν„° 및 검색 κΈ°λŠ₯ - [ ] μΆ”μ²œ κ²°κ³Ό 즐겨찾기 UI - [ ] 회차 λŒ€λΉ„ μΆ”μ²œ μ„±λŠ₯ 뢄석 ### πŸ—ΊοΈ μ—¬ν–‰ 지도 UI - [ ] 지도 μ˜μ—­ 클릭 μ‹œ ν•΄λ‹Ή μ§€μ—­ 사진 λ‘œλ”© - [ ] 사진 μ§€μ—° λ‘œλ”© (Lazy Load) - [ ] 앨범 및 연도별 ν•„ν„° κΈ°λŠ₯ - [ ] λͺ¨λ°”일 UX κ°œμ„  ### βš™οΈ 운영/인프라 - [ ] Docker 이미지 버전 νƒœκΉ… μžλ™ν™” - [ ] 배포 μ‹€νŒ¨ μ‹œ μžλ™ λ‘€λ°± κΈ°λŠ₯ - [ ] Health check 기반 배포 성곡 νŒλ‹¨ 둜직 - [ ] 둜그 μˆ˜μ§‘ 및 관리 체계 κ°œμ„  --- ## ✨ μ² ν•™ > β€œNASλŠ” μ„œλ²„κ°€ μ•„λ‹ˆλΌ 집이닀.” > > κ·Έλž˜μ„œ μ•ˆμ „ν•˜κ³ , λ‹¨μˆœν•˜λ©°, 볡ꡬ κ°€λŠ₯ν•œ ꡬ쑰λ₯Ό μ΅œμš°μ„ μœΌλ‘œ ν•©λ‹ˆλ‹€. --- ## Makefile μ„€μ • μ‚¬μš© μ˜ˆμ‹œ - **배포**: `make deploy` - **λ°±μ—”λ“œ 둜그**: `make logs S=backend` - **전체 둜그**: `make logs` - **μƒνƒœ**: `make status`