diff --git a/RULES.md b/RULES.md index 554719a..317ff15 100644 --- a/RULES.md +++ b/RULES.md @@ -6,9 +6,12 @@ ## ๐Ÿ› ๏ธ **๊ธฐ์ˆ  ์Šคํƒ** ``` -Frontend: React.js + Material-UI + Vite + React Router DOM -Backend: FastAPI + SQLAlchemy + Python +Frontend: React.js + Material-UI + Vite + React Router DOM + Nginx +Backend: FastAPI + SQLAlchemy + Python + Uvicorn Database: PostgreSQL (์šด์˜ ๋ฐ ๊ฐœ๋ฐœ) +์บ์‹œ: Redis +๊ด€๋ฆฌ๋„๊ตฌ: pgAdmin4 +์ปจํ…Œ์ด๋„ˆ: Docker + Docker Compose ๊ธฐํƒ€: Axios, XLSX (SheetJS), file-saver ``` @@ -28,6 +31,37 @@ TK-MP-Project/ โ””โ”€โ”€ database/ # DB ์Šคํ‚ค๋งˆ/์‹œ๋“œ ``` +## ๐Ÿณ **Docker ์‹คํ–‰ ํ™˜๊ฒฝ** +### ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ +- **tk-mp-frontend**: React + Nginx (ํฌํŠธ: 3000) +- **tk-mp-backend**: FastAPI + Uvicorn (ํฌํŠธ: 8000) +- **tk-mp-postgres**: PostgreSQL (ํฌํŠธ: 5432) +- **tk-mp-redis**: Redis (ํฌํŠธ: 6379) +- **tk-mp-pgadmin**: pgAdmin4 (ํฌํŠธ: 5050) + +### ์‹คํ–‰ ๋ฐฉ๋ฒ• +```bash +# ๊ฐœ๋ฐœ ํ™˜๊ฒฝ +./scripts/dev.sh +# ๋˜๋Š” +docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d + +# ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ +./scripts/prod.sh +# ๋˜๋Š” +docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d + +# ๊ธฐ๋ณธ ํ™˜๊ฒฝ +docker-compose up -d +``` + +### ์ค‘์š”ํ•œ ์„ค์ • ์‚ฌํ•ญ +- **API URL ์„ค์ •**: + - ๊ฐœ๋ฐœํ™˜๊ฒฝ: `http://localhost:8000` (์ง์ ‘ ์ ‘๊ทผ) + - ํ”„๋กœ๋•์…˜: `/api` (nginx ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•œ ์ƒ๋Œ€๊ฒฝ๋กœ) +- **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ**: `postgres:5432` (์ปจํ…Œ์ด๋„ˆ๋ช… ์‚ฌ์šฉ, localhost ์•„๋‹˜!) +- **ํ™˜๊ฒฝ๋ณ€์ˆ˜**: `VITE_API_URL`๋กœ API URL ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ + ## ๐Ÿ—„๏ธ **ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ** ```sql -- ํ•ต์‹ฌ ํ…Œ์ด๋ธ”๋“ค @@ -203,4 +237,50 @@ const purchaseQuantity = Math.ceil(bomQuantity / 5) * 5; - ์ž‘์—… ์ƒํƒœ๋Š” 'in-progress'์™€ 'complete'๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œ์‹œ --- -**๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ**: 2024-12-20 \ No newline at end of file +## ๐Ÿšจ **Docker ์‹คํ–‰ ๊ด€๋ จ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…** + +### ํ•ด๊ฒฐ๋œ ์ฃผ์š” ๋ฌธ์ œ๋“ค (2025.08.01) + +1. **ํ”„๋ก ํŠธ์—”๋“œ API ์—ฐ๊ฒฐ ์˜ค๋ฅ˜** + - **๋ฌธ์ œ**: ๋นŒ๋“œ๋œ ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ 10080 ํฌํŠธ๋กœ API ์š”์ฒญ + - **์›์ธ**: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ๋ˆ„๋ฝ์œผ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํฌํŠธ ์‚ฌ์šฉ + - **ํ•ด๊ฒฐ**: + ```bash + # Dockerfile์—์„œ ๋นŒ๋“œ ์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž… + ARG VITE_API_URL=http://localhost:8000 + ENV VITE_API_URL=$VITE_API_URL + + # docker-compose.yml์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • + environment: + - VITE_API_URL=${VITE_API_URL:-/api} + ``` + +2. **๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ** + - **๋ฌธ์ œ**: `psycopg2.OperationalError` - localhost:5432 ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€ + - **์›์ธ**: ๋ฐฑ์—”๋“œ๊ฐ€ localhost๋กœ DB ์ ‘๊ทผ ์‹œ๋„ (Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ๋Š” ๋ถˆ๊ฐ€) + - **ํ•ด๊ฒฐ**: + ```python + # backend/app/database.py ์ˆ˜์ • + DATABASE_URL = os.getenv( + "DATABASE_URL", + "postgresql://tkmp_user:tkmp_password_2025@postgres:5432/tk_mp_bom" # localhost โ†’ postgres + ) + ``` + +3. **ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ๊ด€๋ฆฌ ๊ฐœ์„ ** + - **๋ฌธ์ œ**: ๊ฐœ๋ฐœ/ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ตฌ๋ถ„ ์—†์ด ํ•˜๋“œ์ฝ”๋”ฉ + - **ํ•ด๊ฒฐ**: docker-compose ํŒŒ์ผ ๋ถ„๋ฆฌ + ```bash + docker-compose.yml # ๊ธฐ๋ณธ ์„ค์ • + docker-compose.dev.yml # ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์˜ค๋ฒ„๋ผ์ด๋“œ + docker-compose.prod.yml # ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์˜ค๋ฒ„๋ผ์ด๋“œ + ``` + +### ์‹คํ–‰ ์ „ ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- [ ] Docker ๋ฐ Docker Compose ์„ค์น˜ ํ™•์ธ +- [ ] ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ •์ƒ ์‹คํ–‰ ํ™•์ธ: `docker-compose ps` +- [ ] ๋ฐฑ์—”๋“œ API ๋ฌธ์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ: http://localhost:8000/docs +- [ ] ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๋”ฉ ํ™•์ธ: http://localhost:3000 +- [ ] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ™•์ธ: pgAdmin (http://localhost:5050) + +**๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ**: 2025-08-01 (Docker ํ™˜๊ฒฝ ๊ตฌ์„ฑ ์™„๋ฃŒ) \ No newline at end of file