์ด ๋ ํฌ๋ 3๊ฐ์ ์๋น์ค(backend, camera-ai, frontend)์ MySQL DB๋ฅผ docker-compose๋ก ํ ๋ฒ์ ์คํํ๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- backend: Spring Boot (8080)
- camera-ai: FastAPI (8000)
- frontend: React(Vite) ์ ์ ๋น๋ โ Nginx ์๋น (5173 โ ์ปจํ ์ด๋ 80)
- db: MySQL 8.0 (3306)
๋คํธ์ํฌ: safeview-net
ํผ์์คํด์ค ๋ณผ๋ฅจ:
db_dataโ MySQL ๋ฐ์ดํฐcamera_uploadsโ AI ์๋ฒ ์ ๋ก๋ ํ์ผcamera_api_resultsโ AI ์๋ฒ ๊ฒฐ๊ณผ ํ์ผ
- .env ์์ฑ
cp .env.example .env
# ํ์ ์ ๊ฐ ์์ (๋น๋ฐ๋ฒํธ/ํค ๋ฑ)- ๋น๋ ๋ฐ ์คํ
docker compose up -d --build- ์ ์
- Frontend: http://localhost:5173
- Backend (Spring): http://localhost:8080
- Camera-AI (FastAPI): http://localhost:8000/health
- ๋ก๊ทธ ๋ณด๊ธฐ/์ค๋จ
docker compose logs -f
docker compose down.env๋ก ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ docker-compose.yml ๋ด ์ฃผ์ ์ฐธ๊ณ .
- DB
MYSQL_ROOT_PASSWORD/MYSQL_DATABASE/MYSQL_USER/MYSQL_PASSWORD
- Backend
JWT_SECRETAI_SERVER_API_KEY(application.yml์api.internal.ai-server-key๋ก ์ฌ์ฉ)AI_SERVER_URLโ Spring์ai.server.url๋ก ๋งคํ๋๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ compose์์http://camera-ai:8000- DB ์ ์์ ๋ด๋ถ์์
jdbc:mysql://db:3306/...๋ก ์ค์ ๋จ
- Camera-AI
BACKEND_API_URL๊ธฐ๋ณธhttp://backend:8080SPRING_MAKE_ENTITY_URL๊ธฐ๋ณธhttp://backend:8080/api/videos/make-entityAI_API_KEYโ Backend์์ ๊ฒ์ฆ์ฉ ํค์ ์ผ์น ํ์ ์.env์์ ๋์ผ ๊ฐ ์ฌ์ฉ- ์ ํ:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,S3_BUCKET_NAME,S3_REGION
ํ์ฌ services/frontend/src/apis/api.ts์์ axios ๊ธฐ๋ณธ baseURL์ด http://localhost:8080/api ๋ก ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ๋ก์ปฌ ๋ธ๋ผ์ฐ์ ์์ ์์ฒญํ๋ ๊ฒ์ด๋ฏ๋ก ์ปจํ
์ด๋ ๋คํธ์ํน๊ณผ ๋ฌด๊ดํ๊ฒ ์ ์ ๋์ํฉ๋๋ค. (ํ์ ์ .env ๊ธฐ๋ฐ VITE_API_BASE_URL ํํ๋ก ๊ฐ์ ๊ฐ๋ฅ)
- Backend ํฌ์ค์ฒดํฌ(Actuator)๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด
spring-boot-starter-actuator์ถ๊ฐ ํ/actuator/health๋ฅผ compose healthcheck๋ก ์ค์ ํ์ธ์. - Apple Silicon(arm64)์์๋ ๋์ํ๋๋ก ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์ ์ ํ์ผ๋, ์ด๊ธฐ์ Python ํ ๋ค์ด๋ก๋์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
- ํฌํธ ์ถฉ๋ ์:
docker-compose.yml์ports์์ ํธ์คํธ ํฌํธ๋ฅผ ๋ณ๊ฒฝํ์ธ์. - ์นด๋ฉ๋ผ AI๊ฐ ๋ฐฑ์๋์ ์ ๊ทผ ๋ชปํ ๋:
BACKEND_API_URL์ดhttp://backend:8080์ธ์ง ํ์ธ. - CORS ์๋ฌ ์: Backend CORS ์ค์ ์ ํ์ธํ๊ฑฐ๋ ํ์ ์ ํ์ฉ ๋๋ฉ์ธ์
http://localhost:5173์ถ๊ฐ.