Big Bang - 100-hours-a-week/3-team-ssammu-wiki GitHub Wiki
- ํ์ ์ ์ ๋ฆฌํ ํ๊ฒฝ: ๋ก์ปฌ์์ ๋ฐ์ํ ์ ์๋ ํ๊ฒฝ ๋ถ์ผ์น, ํฌํธ ์ถฉ๋, ๋ณด์ ์ค์ ์ด์ ๋ฑ์ ํํผํ๊ณ , ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ผ๊ด๋ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ ์ ๊ณต
- ๋น์ฉ ์ ๊ฐ: GCP๋ ์ ๊ท ์ฌ์ฉ์์๊ฒ $300 ํฌ๋ ๋ง์ ์ ๊ณตํ์ฌ, ์์ฐ์ด ์ ํ๋ ์ด๊ธฐ ํ์ ์ ํฉ
- IaaS ํ์ต ๊ธฐํ ์ ๊ณต: VM, ๋ฐฉํ๋ฒฝ, IP ๊ตฌ์ฑ, ์๋ธ๋ท ๋ฑ ํด๋ผ์ฐ๋ ์ธํ๋ผ ๊ตฌ์ฑ์ ๋ํ ์ค์ต ๊ธฐ๋ฐ ๋ง๋ จ
- AWS ์ ํ ๊ณ ๋ ค: AWS์ ์ ์ฌํ ๊ตฌ์กฐ ๋๋ถ์, ํฅํ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ํ ๋ถ๋ด์ด ์ ์
- ๋น ๋ฅธ MVP ์ถ์: ์ด๊ธฐ์๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ๊ณผ ํผ๋๋ฐฑ ํ๋ณด๊ฐ ํต์ฌ์ด๊ธฐ ๋๋ฌธ์ ์๋ํ๋ณด๋ค๋ ์์์ ๋ฐฐํฌ๋ฅผ ํตํด ๊ฐ ์๋น์ค ํ๋ฆ์ ๋ช ํํ ์ดํด
- ํ ๋ด ์ธํ๋ผ ์ดํด๋ ์ฆ์ง: ๋ฐฐํฌ ๊ณผ์ ์ ์ฒด๋ฅผ ์ง์ ๊ฒฝํํจ์ผ๋ก์จ ๊ตฌ์ฑ์๋ค์ด ์๋น์ค ์ธํ๋ผ ์ ๋ฐ์ ๋ํ ๊ฐ๊ฐ๊ณผ ์ฑ ์ ์์์ ๊ฐ์ง ์ ์์
๐ก Big Bang ๋ฐฐํฌ๋? ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ํ ๋ฒ์ ์๋์ผ๋ก ์ค์น ๋ฐ ๋ฐฐํฌํ๋ ์ ๋ต์ผ๋ก, ์ด๊ธฐ ์๋น์ค ๊ฐ๋ฐ ๋ฐ ํ ์๋ จ๋ ํฅ์์ ์ ํฉํ ๋ฐฉ์์ด๋ค.
- ํ๋์ ์ธ์คํด์ค์ ํ๋ก ํธ์๋(Next.js), ๋ฐฑ์๋(Spring Boot), AI ์๋ฒ(FastAPI), DB(MySQL) ์ ๋ชจ๋ ๊ตฌ์ฑํ์ฌ ๋ฐฐํฌ
-
๋๋ฉ์ธ ์ฐ๊ฒฐ ๋ฐ ์ ์ ๋ฆฌ์์ค ์๋น์ ์ํด
Nginx
์น์๋ฒ๋ฅผ ๋์
- ๋๋ฉ์ธ์ ๊ฐ๋น์์์ ๊ตฌ๋งค, GCP Cloud DNS๋ฅผ ํตํด ๋ค์์๋ฒ ์ค์ ๋ฐ A๋ ์ฝ๋๋ก ๊ณ ์ IP์ ์ฐ๋
- Cloud DNS๋ GCP์ ๋ค์ดํฐ๋ธํ๊ฒ ํตํฉ๋์ด, ๋ณต์กํ ์ธ๋ถ DNS ์ค์ ์์ด ๋๋ฉ์ธ ๊ด๋ฆฌ ๊ฐ๋ฅ
- ์๋ธ๋๋ฉ์ธ(
fe.domain.com
,api.domain.com
๋ฑ) ์ ์ค์ ํ์ฌ ๊ตฌ์กฐ์ URL ๊ตฌ์ฑ ๊ฐ๋ฅ - ํนํ OAuth2 ๊ธฐ๋ฐ ๋ก๊ทธ์ธ์ ๋์ ํ ์๋น์ค ํน์ฑ ์, Redirect URI์ ์ฌ์ฉํ ๊ณ ์ ๋๋ฉ์ธ ํ๋ณด๊ฐ ํ์์ ์
์๋น์ค ์์ญ | ์๋ธ๋๋ฉ์ธ | ํฌํธ/๋ผ์ฐํ ๋ฐฉ์ | ์ค๋ช |
---|---|---|---|
ํ๋ก ํธ์๋ (Next.js) | www.careerbee.co.kr | 80, 443 (Nginx ์ ์ ์๋น) | Nginx๋ฅผ ํตํด /var/www/html ๊ฒฝ๋ก์ ์๋ ๋น๋ ํ์ผ ์ ๊ณต |
๋ฐฑ์๋ (Spring Boot) | api.careerbee.co.kr | 8080 (์ง์ ์ ๊ทผ ๋๋ Nginx๋ฅผ ํตํ ๋ผ์ฐํ ) | REST API ์์ฒญ ์ฒ๋ฆฌ |
AI ์๋ฒ (FastAPI) | ai.careerbee.co.kr | 8000 (์ง์ ์ ๊ทผ ๋๋ Nginx๋ฅผ ํตํ ๋ผ์ฐํ ) | AI ๋ชจ๋ธ ์๋ต ์ฒ๋ฆฌ์ฉ API |
DB (MySQL) | - (๋ด๋ถ์ฉ) | 3306 (๋ด๋ถ ์ ์) | ์ธ๋ถ ๋น๊ณต๊ฐ, ์๋ฒ ๋ด ์๋น์ค ๊ฐ ์ ๊ทผ๋ง ํ์ฉ |
- ํ๋ก ํธ์๋ ์ ์ ๋ฆฌ์์ค(HTML/CSS/JS) ์๋น์ ์ํด ๊ฒฝ๋ ์น ์๋ฒ ํ์
- Nginx๋ ๋์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ, ๋ฆฌ๋ฒ์ค ํ๋ก์ ๊ธฐ๋ฅ๊น์ง ์ง์ํด ์ด๊ธฐ ๊ตฌ์ฑ์ ์ ํฉ
-
/var/www/html
๊ฒฝ๋ก์ ๋น๋๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ๋ฐฐ์นํ๊ณ ,index.html
์ ๊ธฐ๋ณธ ์ํธ๋ฆฌ๋ก ์ค์ - ๋ฐฑ์๋ ๋ฐ AI API ์์ฒญ์ ์ดํ Nginx ๋ฆฌ๋ฒ์ค ํ๋ก์ ๋๋ ๋ณ๋ ํฌํธ๋ก ๋ถ๋ฆฌ ์ด์ ๊ฐ๋ฅ
- ํ๋กํ ์ด๋ฏธ์ง, ๊ธฐ์ ์ด๋ฏธ์ง ๋ฑ ๊ฐ๋ฐ ์ด๊ธฐ๋ถํฐ ์ ์ ๋ฆฌ์์ค๋ฅผ ํ์ฉํ๋ ์ฐ๋ฆฌ ์๋น์ค์ ํน์ฑ์ ๋ฐ์ํ์ฌ GCP Cloud Storage๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ
- DB ๋๋ ๋ก์ปฌ์ ์ด์ง์(๋ฐ์ดํธ ๋ฐฐ์ด) ํํ๋ก ์ ์ฅํ๋ ๋ฐฉ์์ ๊ด๋ฆฌ์ ํ์ฅ์ ๋ถ๋ฆฌํจ
- URL๋ง DB์ ์ ์ฅํจ์ผ๋ก์จ, ์คํ ๋ฆฌ์ง์ ์ฐ๋๋ ํจ์จ์ ์ธ ๋ฏธ๋์ด ๊ด๋ฆฌ ๊ฐ๋ฅ
- ๋ฐฐํฌ ๋ฐฉ์: ์ผ๊ด ์์์ ๋ฐฐํฌ (Big Bang)
- ๋ฐฐํฌ ํ๊ฒฝ: GCP Compute Engine ์ธ์คํด์ค (์ด 1๊ฐ)
- ๋ฐฐํฌ ๋์: ํ๋ก ํธ์๋, ๋ฐฑ์๋, AI ์๋ฒ, DB ์ ๋ถ ๋จ์ผ ์ธ์คํด์ค์์ ์ด์
- ์ ์ ๋ฐฉ์: SSH๋ฅผ ํตํ ์ง์ ์ ์
- ๋๊ตฌ: SSH, Git, Nginx, Python (venv), Java (Gradle), MySQL
์ญํ | ๋ด๋น์ | ์ค๋ช |
---|---|---|
๋ฐฐํฌ ์ด๊ด | ํ ๋ฆฌ๋(๋ฌด๋ฌด) | ์ ์ฒด ๋ฐฐํฌ ํ๋ฆ ๊ด๋ฆฌ, ํ์๋ผ์ธ ์กฐ์จ ๋ฐ ์ค๋ฅ ๋ฐ์ ์ ๋กค๋ฐฑ ์ฌ๋ถ ๊ฒฐ์ |
์์ค ์ฝ๋ ์ค๋น ๋ฐ ์ ์ก | ๊ฐ ํํธ๋ณ ๋ด๋น์(์๋ฐ๋ฆฌ, ๋ฌด๋ฌด, ์๋ฆฌ๋ยท๋ค์ธ) | FE/BE/AI ๊ฐ ํํธ์ ์ต์ ์ฝ๋๋ฅผ ํด๋ผ์ฐ๋ ๋ด๋น์ PC์์ ์ค๋น ํ ์ธ์คํด์ค๋ก ์ ์ก (scp) |
ํ๋ก ํธ ๋น๋ ๋ฐ ๋ฐฐํฌ | ํด๋ผ์ฐ๋ ๋ด๋น์(๋ชจ๊ฑด, ์ค) | GCE์์ ํ๋ก ํธ์๋ ์ฝ๋ ๋น๋ โ ์ ์ ๋ฆฌ์์ค ๋ณต์ฌ ๋ฐ Nginx ์ค์ ํ์ธ ๋ฐ ์ฌ์์ |
๋ฐฑ์๋ ๋น๋ ๋ฐ ๋ฐฐํฌ | ํด๋ผ์ฐ๋ ๋ด๋น์(๋ชจ๊ฑด, ์ค) | GCE์์ Gradle ๋น๋ โ ๊ธฐ์กด JAR ์ข ๋ฃ ํ ์๋ก์ด JAR ์คํ (nohup) |
AI ์๋ฒ ๋น๋ ๋ฐ ๋ฐฐํฌ | ํด๋ผ์ฐ๋ ๋ด๋น์(๋ชจ๊ฑด, ์ค) | GCE์์ Python ๊ฐ์ํ๊ฒฝ ํ์ฑํ โ ์์กด์ฑ ์ค์น ๋ฐ Uvicorn ํ๋ก์ธ์ค ๊ต์ฒด |
๋๋ฉ์ธ ๋ฐ ์ธํ๋ผ ์ ๊ฒ | ํด๋ผ์ฐ๋ ๋ด๋น์(๋ชจ๊ฑด, ์ค) | ๋๋ฉ์ธ ์ฐ๊ฒฐ ์ํ, ์ธ์คํด์ค ๋ฆฌ์์ค(CPU, ๋์คํฌ ๋ฑ), ๋ณด์ ๊ทธ๋ฃน/๋ฐฉํ๋ฒฝ ์ํ ํ์ธ |
๊ธฐ๋ฅ ํ ์คํธ ๋ฐ ์๋ฃ ๋ณด๊ณ | ๊ฐ ํํธ๋ณ ๋ด๋น์(์๋ฐ๋ฆฌ, ๋ฌด๋ฌด, ์๋ฆฌ๋ยท๋ค์ธ) | FE/BE/AI ๊ฐ ํํธ์ ์ฃผ์ ๊ธฐ๋ฅ ์๋ ์ฌ๋ถ ํ์ธ ํ ์๋ฃ ๋ณด๊ณ |
๋จ๊ณ | ์ ์ฐจ | ์์ธ ์ค๋ช |
---|---|---|
1 | ์ฌ์ ์ ๊ฒ | GCE ์ธ์คํด์ค ์ํ(CPU/๋ฉ๋ชจ๋ฆฌ/๋์คํฌ), ๋๋ฉ์ธ ์ฐ๊ฒฐ ์ํ, ๋ฐฉํ๋ฒฝ ์ค์ ํ์ธ |
2 | ์์ค ์ฝ๋ ์ ์ก | ํด๋ผ์ฐ๋ ๋ด๋น์ PC์์ FE/BE/AI ์์ค์ฝ๋๋ฅผ ๊ฐ๊ฐ GCE ์ธ์คํด์ค๋ก scp ๋ณต์ฌ |
3 | GCE ์ ์ | ์ธ์คํด์ค(GCE)์ SSH ์ ์ |
4 | ํ๋ก ํธ์๋ ๋น๋ ๋ฐ ๋ฐฐํฌ | Node.js ๋ฐ Nginx ์ค์น ํ, ํ๋ก ํธ์ํธ ๋น๋ ์ํ(pnpm install && pnpm build) โ ๋น๋ ๋ ์ ์ ๋ฆฌ์์ค๋ฅผ Nginx ๋ฃจํธ ๋๋ ํ ๋ฆฌ(/var/www/html ๋ฑ)๋ก ๋ณต์ฌ |
5 | ๋ฐฑ์๋ ๋น๋ ๋ฐ ๋ฐฐํฌ | JDK ํ๊ฒฝ์์ Gradle ๋น๋ ์ํ (./gradlew build) โ ์คํ ์ค์ธ ๋ฐฑ์๋ ํ๋ก์ธ์ค ์ข ๋ฃ ( pkill) ํ ์ต์ JAR ํ์ผ ์คํ |
6 | AI ์๋ฒ ๋ฐฐํฌ | Python ๊ฐ์ํ๊ฒฝ ์ง์ โ ํ์ ์ ์์กด์ฑ ์ค์น (pip install -r requirements.txt) โ ์คํ ์ค์ธ ํ๋ก์ธ์ค ๊ต์ฒด |
7 | ๋ก๊ทธ ํ์ธ | ๊ฐ ์๋ฒ ๋ก๊ทธ(nohup, uvicorn, nginx ๋ฑ) ํ์ธํ์ฌ ์ ์ ์๋ ์ฌ๋ถ ์ ๊ฒ |
8 | ๋๋ฉ์ธ ์ ๊ทผ ํ์ธ | FE/BE/AI ๊ฒฝ๋ก๊ฐ ์ฐ๊ฒฐ๋ ๋๋ฉ์ธ ์ฃผ์๋ก ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ ๋ฐ ์ฃผ์ ๊ธฐ๋ฅ ํ ์คํธ ์ํ |
9 | ์๋ฃ ๋ณด๊ณ | ๋ด๋น์๋ณ ์๋ฃ ๋ณด๊ณ , ๋ฐฐํฌ ์ด๊ด์๊ฐ ์ต์ข ๋ฐฐํฌ ์๋ฃ ์ฌ๋ถ ํ์ธ ํ ๊ณต์ |
-
์ด ๋ฐฐํฌ ์๊ฐ: ์ฝ 20~30๋ถ (๋ณ๋ ฌ ์งํ ์ 15๋ถ ๋ด์ธ)
-
์๋น์ค ์ค๋จ ๊ฐ๋ฅ์ฑ: ๊ฐ ์๋ฒ/ํ์ผ ๊ต์ฒด ๊ตฌ๊ฐ์ 2~3๋ถ ์ด๋ด์ ๋ค์ดํ์ ๋ฐ์ ๊ฐ๋ฅ
-
๋ฐฐํฌ ์๊ฐ๋ ๊ถ์ฅ:
โฐ ์๋ฒฝ 2์~5์ (ํธ๋ํฝ ์ต์ ์๊ฐ๋)
โ ์ฐ๋ฆฌ ์๋น์ค์ ์ฃผ์ ํ๊ฒ์ด ์ง์ฅ์ธ/๊ตฌ์ง์์ด๋ฏ๋ก ์ถํด๊ทผยท์ ์ฌ์๊ฐ ์ธ ์๊ฐ๋์ ์งํ
๊ตฌ๋ถ | ํญ๋ชฉ | ํ์ธ |
---|---|---|
๋ฐฐํฌ ์ | GCE ์ธ์คํด์ค ์ํ ํ์ธ (CPU/๋ฉ๋ชจ๋ฆฌ/๋์คํฌ) | |
๋๋ฉ์ธ ์ฐ๊ฒฐ ๋ฐ DNS ์ ํ ์๋ฃ ์ฌ๋ถ ํ์ธ | ||
๋ฐฉํ๋ฒฝ ์ค์ (80/443/8000/3306 ํฌํธ ๋ฑ) ์ ์ ์ ์ฉ ์ฌ๋ถ | ||
FE/BE/AI ์ต์ ์ฝ๋ ํด๋ผ์ฐ๋ ๋ด๋น์ PC์ ์ค๋น | ||
๋ฐฐํฌ ์ค | scp๋ฅผ ํตํด FE/BE/AI ์์ค์ฝ๋๋ฅผ ์ธ์คํด์ค์ ๋ณต์ฌ | |
SSH ์ ์ ํ ๋น๋ ์ํ (npm run build, ./gradlew build, pip install ...) | ||
FE โ ์ ์ ํ์ผ ๋ณต์ฌ + Nginx ์ฌ์์ | ||
BE โ ๊ธฐ์กด ํ๋ก์ธ์ค ์ข ๋ฃ ํ JAR ์ฌ์คํ | ||
AI โ ๊ฐ์ํ๊ฒฝ ํ์ฑํ ๋ฐ Uvicorn ์ฌ์คํ | ||
MySQL ์คํ ์ํ ๋ฐ ์ฐ๊ฒฐ ํ ์คํธ | ||
๋ฐฐํฌ ํ | ๋๋ฉ์ธ ์ ๊ทผ ์ FE ์ ์ ๋ ๋๋ง ์ฌ๋ถ | |
์ฃผ์ API ๋์ ํ์ธ (ํ์๊ฐ์ , ๋ก๊ทธ์ธ, DB ๋ฐ์ ๋ฑ) | ||
AI ์๋ฒ ์ฐ๋ ๊ธฐ๋ฅ ํ ์คํธ | ||
MySQL DB ์ํ ๋ฐ ๋ฐ์ดํฐ ํ์ธ (SELECT * FROM ...) | ||
๋ด๋น์ ์๋ฃ ๋ณด๊ณ ๋ฐ ์ต์ข ์น์ธ |
๋ฐฐํฌ ๋ด๋น์ ๋ก์ปฌ
โโโ deploy/
โโโ scripts/
โ โโโ deploy.sh
โ โโโ rollback.sh
โโโ frontend/
โ โโโ dist/
โโโ backend/
โ โโโ build/libs/app.jar
โโโ ai-server/
โโโ ...
ํญ๋ชฉ | FTP | SCP |
---|---|---|
๋ณด์ | ์ํธํ ์์ | SSH ๊ธฐ๋ฐ ์ํธํ ์ ์ก |
์๋ํ ์ฐ๊ณ | GUI ์นํ, ์๋ํ ์ด๋ ค์ | CLI ๊ธฐ๋ฐ ์๋ํ์ ์ต์ ํ |
๋ฐฉํ๋ฒฝ ์ค์ | Passive ๋ชจ๋ ํฌํธ ๋ค์ ๊ฐ๋ฐฉ ํ์ | ๊ธฐ๋ณธ 22๋ฒ ํฌํธ๋ง ํ์ฉ |
โ MVP/ํ ์คํธ ํ๊ฒฝ์์๋ ๋ณด์์ฑ๊ณผ ํธ์์ฑ์ ๊ณ ๋ คํ์ฌ SCP ์ฌ์ฉ์ ์ ํ
โป ๋ชจ๋ ๋ช ๋ น์ด๋ deploy/scripts ๋๋ ํ ๋ฆฌ ๊ธฐ์ค
#!/bin/bash
SERVER_USER=ssmu-morgan
SERVER_IP=34.64.180.54
SSH_KEY=~/.ssh/gcp-ssmu-dev-key
JAR_NAME=careerbee-0.0.1-SNAPSHOT.jar
PROFILE=dev
# ๋ฐฑ์๋ JAR ๋น๋ ์ํฐํฉํธ ๊ฒฝ๋ก
LOCAL_JAR_PATH=../backend/3-team-CareerBee-be/build/libs/$JAR_NAME
REMOTE_RELEASE_DIR=~/release
REMOTE_APP_LINK=~/app.jar
TIMESTAMP=$(date +%Y%m%d%H%M%S)
REMOTE_JAR_PATH=$REMOTE_RELEASE_DIR/app-$TIMESTAMP.jar
echo "[1] ๋ฐฑ์๋ JAR ์ ์ก ์ค..."
scp -i $SSH_KEY $LOCAL_JAR_PATH $SERVER_USER@$SERVER_IP:$REMOTE_JAR_PATH
echo "[2] ํ๋ก ํธ์๋ ์ ์ ํ์ผ ์ ์ก ์ค..."
scp -i $SSH_KEY -r ../frontend/dist/* $SERVER_USER@$SERVER_IP:/var/www/html/
echo "[3] AI ์๋ฒ ์์ค์ฝ๋ ์ ์ก ์ค..."
scp -i $SSH_KEY -r ../ai-server $SERVER_USER@$SERVER_IP:~/ai-server/
echo "[4] ๋ฐฑ์๋ ์คํ ์ค๋จ ๋ฐ ์ฌ์์..."
ssh -i $SSH_KEY $SERVER_USER@$SERVER_IP <<EOF
pkill -f '$JAR_NAME' || echo "๊ธฐ์กด ๋ฐฑ์๋ ์์"
mkdir -p $REMOTE_RELEASE_DIR ~/logs
ln -sf $REMOTE_JAR_PATH $REMOTE_APP_LINK
nohup java -jar -Dspring.profiles.active=$PROFILE $REMOTE_APP_LINK > ~/logs/backend.log 2>&1 &
EOF
echo "[5] AI ์๋ฒ ์ฌ์์..."
ssh -i $SSH_KEY $SERVER_USER@$SERVER_IP <<EOF
cd ~/ai-server
python3 -m venv venv && source venv/bin/activate || source venv/bin/activate
pip install -r requirements.txt
pkill -f 'uvicorn' || echo "๊ธฐ์กด AI ์์"
nohup uvicorn main:app --host 0.0.0.0 --port 8000 > ~/logs/ai.log 2>&1 &
EOF
echo "โ
๋ฐฐํฌ ์๋ฃ"
#!/bin/bash
SERVER_USER=ubuntu
SERVER_IP=<GCP-VM-IP>
SSH_KEY=~/.ssh/gcp-ssmu-dev-key
echo "[1] ์ต์ ์ด์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ ์ค..."
ssh -i $SSH_KEY $SERVER_USER@$SERVER_IP <<EOF
PREV_JAR=\$(ls -t ~/release/app-*.jar | sed -n 2p)
if [ -z "\$PREV_JAR" ]; then
echo "โ ๋กค๋ฐฑ ๊ฐ๋ฅํ ์ด์ ๋ฒ์ ์ด ์์ต๋๋ค."
exit 1
fi
echo "๐ ๋กค๋ฐฑ ๋์: \$PREV_JAR"
pkill -f 'app.jar'
ln -sf \$PREV_JAR ~/app.jar
nohup java -jar ~/app.jar > ~/logs/backend_rollback.log 2>&1 &
EOF
echo "โ
๋กค๋ฐฑ ์๋ฃ"
# ๋ฐฐํฌ ์คํ
cd deploy/scripts
bash deploy.sh
# ๋กค๋ฐฑ ์คํ
bash rollback.sh
-
์
rollback.sh
์ ๋ฐฑ์๋๋ง ์๋๊ฐ?- ๊ฐ๋ฐ ํํธ์ ํน์ฑ์ ๊ณ ๋ คํ์๋ค.
ํญ๋ชฉ | ์ค๋ช |
---|---|
๋ฐฑ์๋ |
.jar ํ์ผ ๋จ์๋ก ๋ฒ์ ์ค๋
์ท์ ๋ณด๊ดํ๊ธฐ ์ฌ์ โ ~/release/ ๋๋ ํ ๋ฆฌ์ ํ์์คํฌํ ๋ฒ์ ์ ์ง ๊ฐ๋ฅ |
ํ๋ก ํธ์๋ |
dist/ ์ ์ ํ์ผ์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋์ง ์์ผ๋ฏ๋ก, ๋กค๋ฐฑ ์ ๋ณ๋ ๋ฐฑ์
์ ์ฑ
์ด ํ์ํจ |
AI ์๋ฒ | Python ํ๊ฒฝ์ main.py ์์ ๋ด์ฉ์ด git ๊ด๋ฆฌ๋์ง ์๊ฑฐ๋, ์์กด์ฑ์ ๋ฐ๋ผ ์๊ธฐ์น ์์ ๋์ ๋ฐ์ ๊ฐ๋ฅ โ ๋จ์ ๋กค๋ฐฑ๋ณด๋ค ์ฌ๋ฐฐํฌ๊ฐ ์ผ๋ฐ์
|
๋ฐ๋ผ์ ๋ฐฑ์๋์ฒ๋ผ ๋กค๋ฐฑ์ด ๋ช ํํ๊ฒ ํ์ํ ๊ฒฝ์ฐ๋ง ๋กค๋ฐฑ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๊ณ , ๋๋จธ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋ค์ ๋น๋๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ฌ๋ฐฐํฌํ๋ ๋ฐฉ์์ด ํ ์ํฉ์์ ๋ ์์ ์ ์ด๋ผ๊ณ ํ๋จ
์๋น์ค ์์ญ | ์ฃผ์ ์ฆ์ | ์ฆ์ ์กฐ์น | ๋ด๋น์ | ๋ณต๊ตฌ ๋ฐฉ๋ฒ |
---|---|---|---|---|
ํ๋ก ํธ์๋ (React.js) | ํ๋ฉด ๋น์ ์ ๋ ๋๋ง, 404 ์ค๋ฅ, JS ์คํ ์ค๋ฅ ๋ฑ | ๋ธ๋ผ์ฐ์ ์ฝ์ ํ์ธ, ๋ฐฐํฌ๋ index.html ๋ฐ ์ ์ ํ์ผ ํ์ธ |
FE (์๋ฐ๋ฆฌ) |
dist/ ์ฌ๋น๋ ํ Nginx ์ฌ์์ ๋ฐ ์ ์ ํ์ผ ์ฌ๋ฐฐํฌ |
๋ฐฑ์๋ (Spring Boot) | API 500 ์ค๋ฅ, ์๋ต ์์ |
backend.log ํ์ธ, ๋ฐฑ์๋ ํ๋ก์ธ์ค ์ํ ์ ๊ฒ |
BE (๋ฌด๋ฌด) |
rollback.sh ์คํ โ ์ด์ .jar ๋ก ๋ณต๊ตฌ |
AI ์๋ฒ (FastAPI) | ๊ธฐ๋ฅ ์๋ต ์ง์ฐ ๋๋ 502/504 ์ค๋ฅ |
ai.log ํ์ธ, uvicorn ์ํ ์ ๊ฒ |
AI (์๋ฆฌ๋, ๋ค์ธ) | ๊ฐ์ํ๊ฒฝ(venv ) ์ฌ์คํ, ํ์ ์ main.py ์์ ํ ์ฌ์์ |
DB (MySQL) | ๋ก๊ทธ์ธ, ์ ์ฅ, ์กฐํ ๊ธฐ๋ฅ ์คํจ / DB ์ฐ๊ฒฐ ์ค๋ฅ |
mysql ์ํ ํ์ธ, 3306 ํฌํธ ์ ๊ทผ ์ ๊ฒ |
BE (๋ฌด๋ฌด), ํด๋ผ์ฐ๋ (์ค) |
systemctl restart mysql , ํ์ ์ mysqldump ๊ธฐ๋ฐ ๋ณต๊ตฌ |
์ ์ฒด ์ธ์คํด์ค (GCE) | ๋ชจ๋ ์๋น์ค ์๋ต ๋ถ๊ฐ, SSH ์ ์ ๋ถ๊ฐ | GCP Console๋ก ์ธ์คํด์ค ์ ๊ทผ ์๋ | ํด๋ผ์ฐ๋ (๋ชจ๊ฑด) | VM ์ฌ์์ ๋๋ ์๋ก์ด ์ธ์คํด์ค์์ ์ฌ๋ฐฐํฌ ์งํ |
-
VPC (SSMU-DEV)
- CIDR:
192.168.0.0/16
- CIDR:
-
Public Subnet (SUBNET-SSMU-DEV-PUBLIC-Azone)
- CIDR:
192.168.10.0/24
- GCP ๋ฆฌ์ :
asia-northeast3a
- CIDR:
-
Compute Engine (FE + BE + AI + DB)
- ๋จธ์ ์ ํ:
g2-standard-4
- vCPU: 4๊ฐ, ๋ฉ๋ชจ๋ฆฌ(RAM): 16GB
- ํ๋ก ํธ/๋ฐฑ์๋, AI ์ฒ๋ฆฌ ๋ก์ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ชจ๋ ํฌํจ๋ ๋จ์ผ VM
- ํผ๋ธ๋ฆญ IP๊ฐ ํ ๋น๋์ด ์๊ณ , Cloud DNS๋ฅผ ํตํด ๋๋ฉ์ธ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
- ์ฌ์ฉ์ ์์ฒญ๊ณผ ๊ฐ๋ฐ์ ๋ฐฐํฌ ๋ชจ๋ ์ด ์ธ์คํด์ค๋ฅผ ์ค์ฌ์ผ๋ก ์ด๋ฃจ์ด์ง
- ๋จธ์ ์ ํ:
-
Cloud DNS
- ์ฌ์ฉ์ ์์ฒญ์ ํผ๋ธ๋ฆญ IP๋ก ์ ๋ฌ
- ๋๋ฉ์ธ ๊ธฐ๋ฐ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ์ค์
-
Cloud Storage
- ์ ์ ๋ฆฌ์์ค(์ด๋ฏธ์ง, ํ์ผ ๋ฑ) ์ ์ฅ ์ฉ๋๋ก ์ฐ๋
-
Dev
- ๊ฐ๋ฐ์๋ ์ธ๋ถ์์
scp
,ssh
์ ํตํด ์ง์ ์๋ฒ์ ๋ฐฐํฌ
- ๊ฐ๋ฐ์๋ ์ธ๋ถ์์
๋ฌธ์ | ์ค๋ช | โ ํด๊ฒฐ ๋ฐฉ์ |
---|---|---|
๋๋ฆฐ ์๋ต ์๋ | ๋จ์ผ VM์์ ๋ชจ๋ ํธ๋ํฝ ์ฒ๋ฆฌ๋ก ์ธํด ๋ณ๋ชฉ ๋ฐ์(๋์ ์ ์ ์ ์ฑ๋ฅ ์ ํ) | ์๋น์ค๋ค์ Nginx ๊ธฐ๋ฐ ํฌํธ ๋ถ๋ฆฌ๋ก ์ฐ์ ๋์ํ๊ณ , ์ฅ๊ธฐ์ ์ผ๋ก๋ GKE, Cloud Run ๋ฑ ๋ถ์ฐ ์ธํ๋ผ๋ก ์ ํ |
์ฆ์ ์ค๋จ | ์ค์ ์ถฉ๋, ์๋ ๋ฐฐํฌ ์ค๋จ ๋ฑ์ผ๋ก ์ธํ ์๊ธฐ์น ์์ ์ค๋ฅ(์๋ฒ ๋ค์ด) | ๋ฐฐํฌ ์ ํ๋ก์ธ์ค ์ ๊ฒ ๋ฐ ๋ก๊ทธ ํ์ธ์ ์ฒ ์ ํ ํ๋ฉฐ, ํฌ์ค์ฒดํฌ ๊ธฐ๋ฐ ์๋ ๋ณต๊ตฌ ๊ตฌ์กฐ ๋์ |
๋ณด์ ๋ฏธํก | HTTPS ๋ฏธ์ ์ฉ, ํฌํธ ๊ณผ๋ค ๋ ธ์ถ๋ก ์ธํด ์ ๋ณด ์ ์ถ ์ํ | Let's Encrypt๋ฅผ ํตํ SSL ์ ์ฉ, ์ธ๋ถ ํฌํธ๋ Nginx๋ก ํตํฉํ๊ณ ๋ฐฉํ๋ฒฝ ์ ์ฑ ์ ์๊ฒฉํ ์ค์ |
๋ค์ดํ์ ๋ฐ์ | ๋ฐฐํฌ ์ค ์๋น์ค ์ ์ ๋ถ๊ฐ | ์๋ฒฝ ์๊ฐ ๋ฐฐํฌ ๋ฐ Nginx์ ๋ฌด์ค๋จ ์ค์ ์ ์ฉ, ์ดํ Blue/Green ๋ฐฉ์ ๋์ ์ผ๋ก ๋ฌด์ค๋จ ๋ฐฐํฌ ์คํ |
์ฌ์ฉ์ ์ ๋ขฐ ์ ํ | ์ฅ์ ์ ๋๋ฆฐ ๋์, ๋ฐ๋ณต๋ ๋ฌธ์ ๋ก ์ฌ์ฉ์ ๊ฒฝํ(์ ๋ขฐ) ์ ํ | ๋น ๋ฅธ ๋ณต๊ตฌ ์ ์ฐจ ๋งค๋ด์ผํ ๋ฐ ์ฅ์ ๊ฐ์ง ์๋ฆผ ์์คํ ๋์ ์ผ๋ก ๋์ ์๊ฐ ์ต์ํ |
๋ฌธ์ | ์ค๋ช | โ ํด๊ฒฐ ๋ฐฉ์ |
---|---|---|
์๋ ๋ฐฐํฌ ๋ถ๋ด | ๋ฐ๋ณต์ ์ธ scp , ssh ์๋ ๋ฐฐํฌ๋ก ์ธํ ์ค์ ๊ฐ๋ฅ์ฑ |
๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋นํ๊ณ , GitHub Actions ๋ฑ CI/CD ์๋ํ๋ก ์ ํ |
ํ๊ฒฝ ๋ถ์ผ์น | ๋ก์ปฌ/์ด์ ํ๊ฒฝ ์ฐจ์ด๋ก ์คํ ์ค๋ฅ ๋ฐ์ |
.env ํ๊ฒฝ ํต์ผ ๋ฐ Docker ๊ธฐ๋ฐ ์คํ ํ๊ฒฝ์ผ๋ก ์ผ๊ด์ฑ ํ๋ณด |
๋๋ฒ๊น ์ด๋ ค์ | ๋ก๊ทธ ๋ถ์ฐ ๋ฐ ๋ถ์กฑ์ผ๋ก ์ฅ์ ์์ธ ์ถ์ ์ด๋ ค์ | ๋ก๊ทธ ๊ฒฝ๋ก๋ฅผ ํต์ผํ๊ณ , Cloud Logging, Sentry ๋ฑ ๋๊ตฌ๋ก ๋ชจ๋ํฐ๋ง ๊ฐํ |
ํ ์คํธ ์๋ํ ๋ฏธ๋น | ๋ฆด๋ฆฌ์ฆ ์ ์๋ ํ ์คํธ๋ง ์กด์ฌ | ๊ฐ๋จํ ์ ธ ํ ์คํธ๋ถํฐ ์์ํด CI ํ์ดํ๋ผ์ธ ๋ด ํ ์คํธ ์๋ํ ๊ตฌํ |
ํ์ฅ์ฑ ๋ถ์กฑ | ๋ชจ๋ ๊ธฐ๋ฅ์ด ํ๋์ ์๋ฒ์ ์ง์ค๋์ด ์์ด, ๊ธฐ๋ฅ/ํธ๋ํฝ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์์คํ ๋์ ํ๊ณ | Nginx์์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๊ณ , ์ ์ง์ ์ผ๋ก GKE ๋๋ Cloud Run ๊ธฐ๋ฐ์ ์ ์ฐํ ๊ตฌ์กฐ๋ก ์ด์ |
๋กค๋ฐฑ ์ฒด๊ณ ๋ฏธํก | FE/AI๋ ๋๋๋ฆด ๊ตฌ์กฐ ์์ด ์ฌ๋ฐฐํฌ๋ง ๊ฐ๋ฅ | ํ๋ก ํธ๋ dist/ ๋ฐฑ์ ๋ฐ symlink ํ์ฉ, AI๋ Docker ์ด๋ฏธ์ง ๋ฐ git ๋ฒ์ ๊ด๋ฆฌ๋ก ์ผ๊ด๋ ๋กค๋ฐฑ ๊ตฌ์กฐ ํ๋ฆฝ |
๋ฐฑ์ ์ ๋ต ์์ | DB/์ ์ ๋ฆฌ์์ค ์์ค ์ ๋ณต๊ตฌ ๋ถ๊ฐ |
mysqldump + ์ด๋ฏธ์ง ZIP ๋ฐฑ์
์ ์์์ผ๋ก, Cloud SQL ๋ฐ Cloud Storage์ ์ ๊ธฐ ๋ฐฑ์
๊ตฌ์กฐ ๋์
|
๋ณด์ ์ทจ์ฝ | SSH ํค ๊ณต์ , ํฌํธ ๋ ธ์ถ ๋ฑ์ผ๋ก ๋ณด์ ์ํ ์ฆ๊ฐ | GCP OS Login์ผ๋ก ์ฌ์ฉ์๋ณ SSH ๋ถ๋ฆฌ, IAM ๊ถํ ์ ์ด, VPC ๋ด๋ถ๋ง ํ์ฉ |
๋ชจ๋ํฐ๋ง ๋ถ์ฌ | ์ฅ์ ๋ฐ์ ์ธ์ง ์ง์ฐ, ์๋ฒ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ ํ๊ธฐ ์ด๋ ค์ |
top , tail ๋ฑ ๊ธฐ๋ณธ ๋ช
๋ น์ด ์๋ํ ํ, Cloud Monitoring, Slack Alert ์ฐ๋์ผ๋ก ์ค์๊ฐ ๋์ ์ฒด๊ณ ๊ตฌ์ถ |
๐ ๋ณธ ํ์ด์ง๋ 2025๋ 5์ 7์ผ์ ๋ง์ง๋ง์ผ๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค.