๐Ÿ’พ ๋ฐฐํฌ ๊ด€๋ จ ํšŒ์˜ - boostcampwm-2022/web33-Mildo GitHub Wiki

1. ๊ฐœ์š”

  1. ์ผ์‹œ ๋ฐ ์žฅ์†Œ : 11.17.(์ˆ˜) 15:00 ~ 21:30, ๊ฒŒ๋”ํƒ€์šด
  2. ์ฐธ์—ฌ์ž : ์ „์›
  3. ๋ชฉ์  : CI/CD ๊ตฌ์ถ• ๋ฐ ๋ฐฐํฌ ์ž๋™ํ™”
  4. ํšŒ์˜ ์ค‘์š”๋„ : ์ค‘

2. ๊ณ ๋ ค ์‚ฌํ•ญ

2.1. nCloud ์„œ๋ฒ„ ๊ตฌ์ถ• ๋ฐ ๋ฐฐํฌ

  • ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ๋ช‡ ๊ฐœ ๋งŒ๋“ค์ง€?
    • 2๊ฐœ
      • ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค์—์„œ ๋‘ ์„œ๋ฒ„๋ฅผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
      • web server + api server
      • crontab server
    • 3๊ฐœ
      • web server์™€ api server๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ
      • web server
      • api server
      • crontab sever
    • ์šฐ์„  ํ•˜๋‚˜์—์„œ ์ง„ํ–‰
  • nginx ์„ค์ •
    • ์„ค์น˜
    • ipv4 80๋ฒˆ ํฌํŠธ๋กœ ์ ‘์†
      • default ํŒŒ์ผ์˜ ipv6 80๋ฒˆ ํฌํŠธ๋Š” ์ฃผ์„ ์ฒ˜๋ฆฌ
  • nodejs ์„ค์น˜ ๋ฐ ์„ค์ •
    • Ubuntu node.js ์„ค์น˜ ๋ฐฉ๋ฒ•
      • 16.10.0 ๋ฒ„์ „์œผ๋กœ ์ง„ํ–‰
  • git ํด๋ก 
    • dev ๋ธŒ๋Ÿฐ์น˜ ์‚ฌ์šฉ
    • yarn ์„ค์น˜ : npm install -g yarn
  • ๋ฐฐํฌ ํ™•์ธ
    • FE
      • ํ”„๋กœ์ ํŠธ client์—์„œ ๋นŒ๋“œํ•˜๊ธฐ
      • usr/share/nginx/html์— client ๋นŒ๋“œ ํŒŒ์ผ ๋„ฃ๊ธฐ
    • BE
      • js ํŒŒ์ผ๋กœ buildํ•ด์„œ ์‚ฌ์šฉ
      • pm2๋กœ ๊ตฌ๋™
        • yarn global add pm2
        • pm2 start ./dist/src/app.js
      • ์ฐธ๊ณ  ์ž๋ฃŒ

2.2. Github Actions๋กœ CI/CD ๊ตฌํ˜„

2.2.1. ์‚ฌ์šฉ ์ด์œ 

  • CI/CD๋Š” ๋ฐฐํฌ ๊ด€๋ จ๋œ ์ž‘์—… ์‹œ๊ฐ„์„ ์ค„์—ฌ์ค˜ ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์— ๋„์›€์ด ๋จ
  • Jenkins๋Š” CI/CD ๊ตฌํ˜„์„ ์œ„ํ•œ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋งŽ์ด ์†Œ์š”๋˜๋Š”๋ฐ, Github Actions๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋‚ฎ์Œ
    • ํŒ€์›๋“ค์ด CI/CD์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ง€์‹์ด ์ ์–ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    • ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ์งง๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ๋ฐฐ์›Œ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

2.2.2. ๊ตฌํ˜„ ์ „ ๊ณ ๋ ค ์‚ฌํ•ญ

  • CI
    • ํ˜„์žฌ test ์ฝ”๋“œ๊ฐ€ ์—†๊ณ , ๋‹จ์ˆœํžˆ ์ž๋™ push ๊ธฐ๋Šฅ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•จ
    • ๋‹ค๋งŒ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ์ด๋™ํ–ˆ์„ ๋•Œ ์ œ๋Œ€๋กœ ๋ณ‘ํ•ฉ๋˜๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
  • CD
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ์˜ Node.js, Ubuntu ๋ฒ„์ „์„ ํ†ต์ผ
    • nCloud์™€ ์—ฐ๋™

3. ํ•  ์ผ

  • nCloud์—์„œ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์ƒ์„ฑ
    • Client - Nginx
    • API - pm2
  • GitHub Actions CI/CD ๊ตฌํ˜„
  • ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰
  • Nginx ์„ค์ •

Untitled (3)

4. Trouble Shooting

4.1. Nginx start ์—๋Ÿฌ

  • ๋ฌธ์ œ์  : nginx ์‹คํ–‰ ์‹œ nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol) ์—๋Ÿฌ ๋ฐœ์ƒ
  • ์›์ธ : nCloud์—์„œ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์ƒ์„ฑ ์‹œ IPv6๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์Œ
  • ํ•ด๊ฒฐ : /etc/nginx/sites-available/default ํŒŒ์ผ์—์„œ IPv6๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋ถ€๋ถ„์„ ์ฃผ์„์ฒ˜๋ฆฌํ•จ
# /etc/nginx/sites-available/default
server {
    listen 80 default_server;
    # listen [::]:80 default_server; -> ์ฃผ์„ ์ฒ˜๋ฆฌ
		...
}

4.2. Ubuntu 18.04์—์„œ node.js ์„ค์น˜

  • ๋ฌธ์ œ์  : Ubuntu 18.04์—์„œ nvm์œผ๋กœ node.js 18.12.1์„ ์„ค์น˜ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ
    • node: /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.28' not found (required by node)
  • ์›์ธ : Ubuntu 18.04๋Š” node.js 18๋ฒˆ๋Œ€๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ
  • ํ•ด๊ฒฐ : node.js ๋ฒ„์ „์„ 16.10.0์œผ๋กœ ๋ณ€๊ฒฝ
    • ์ด๋ž˜์„œ docker๋ฅผ ์“ฐ๋Š”๊ตฌ๋‚˜โ€ฆ
  • ์ฐธ๊ณ ์ž๋ฃŒ

4.3. git checkout -t [์›๊ฒฉ ๋ธŒ๋žœ์น˜๋ช…]

  • ๋ฌธ์ œ์ :
    • git remote update๋ฅผ ํ•ด๋„ ์›๊ฒฉ์ €์žฅ์†Œ์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€์ ธ์™€์ง€์ง€ ์•Š์•˜์Œ
    • git checkout์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์•˜์Œ
  • ์›์ธ: ๋ธŒ๋žœ์น˜ ์ถ”์ ์ด ๋˜์ง€ ์•Š์•„์„œ ์ƒ๊ฒผ๋˜ ๋ฌธ์ œ
  • ํ•ด๊ฒฐ: โ€˜--trackโ€™ ์˜ต์…˜์„ ์„ค์ •ํ•ด์„œ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์˜ ๋ชฉ๋ก๋“ค์„ ํŠธ๋ž˜ํ‚นํ•ด์„œ ๊ฐ€์ ธ์˜ด
  • ์ฐธ๊ณ ์ž๋ฃŒ

4.4. cannot read properties of undefined (reading โ€˜CITYDATAโ€™)

  • ์›์ธ: .env ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„ ์ƒ๊ธฐ๋Š” ์—๋Ÿฌ
  • ํ•ด๊ฒฐ: ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ํŒŒ์ผ ๋‚ด๋ถ€์— CITYDATA ์ •๋ณด๋ฅผ ์ ์Œ

4.5. cp -r /A/B/โ€ฆ/C/ /D๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ์ผ๋“ค์„ ๋ณต์‚ฌํ•˜๊ธฐ๋กœ ํ–ˆ์œผ๋‚˜ ๋ณต์‚ฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ

  • ์›์ธ: 3๋ฒˆ์งธ ์ธ์ž์™€ 4๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์„œ๋กœ ๋’ค๋ฐ”๋€Œ์—ˆ๋‹ค (3๋ฒˆ์งธ๊ฐ€ ์›๋ณธ์ด๊ณ , 4๋ฒˆ์งธ๊ฐ€ ๋ณต์‚ฌํ•  ๋Œ€์ƒ์„ ์˜๋ฏธ)

4.6. nginx์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ ์„ค์ •์ด ์ œ๋Œ€๋กœ ์•ˆ๋˜์–ด์„œ index.html์„ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•จ

  • ๋ฌธ์ œ์  : ํด๋ผ์ด์–ธํŠธ์˜ build ํŒŒ์ผ์„ /usr/share/nginx/html ์— ๋ณต์‚ฌํ•˜๊ณ  nginx๋ฅผ ์‹คํ–‰์‹œ์ผฐ์ง€๋งŒ ๊ธฐ์กด์˜ ํŽ˜์ด์ง€๊ฐ€ ๋…ธ์ถœ๋จ
  • ์›์ธ: nginx์˜ root ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ /var/www/html ๋กœ ๋˜์–ด์žˆ์—ˆ์Œ
  • ํ•ด๊ฒฐ: etc/nginx/sites-available์—์„œ root ๋ถ€๋ถ„์˜ ๊ฒฝ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•จ

4.7. nvm์œผ๋กœ ์„ค์ •ํ•œ node v16.10.0๋ฒ„์ „์ด ๋ฐฅ ๋จน๊ณ  ๋Œ์•„์™”๋”๋‹ˆ v18.12.0์œผ๋กœ ๋กค๋ฐฑ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ œ

4.8. [ERROR][PM2] Interpreter โ€ฆ is not available in PATH

  • ํ•ด๊ฒฐ: pm2 install typescript ๋ฅผ ์„ค์น˜ โ†’ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์น˜๋ฅผ ํ–ˆ์–ด์•ผ ํ•จ

4.9. .env ํŒŒ์ผ์„ ์ฝ์ง€ ๋ชปํ•˜๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ (TypeError: Cannot read properties of undefined โ€˜CITYDATAโ€™)

4.9.1 ์‹œ๋„ 1

  • PM2์™€ PM2 with TypeScript๋ฅผ global๋กœ ์„ค์น˜ํ•ด์„œ ๋ฌธ์ œ๋ผ๊ณ  ํ•จ(์ฐธ๊ณ ์ž๋ฃŒ) โ†’ node_moduls ๋‚ด๋ถ€์—์„œ PM2์™€ typescript๋ฅผ ์„ค์น˜ํ–ˆ์ง€๋งŒ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

4.9.2 ์‹œ๋„ 2

  • npx tsc -p . ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ
  • ์ปดํŒŒ์ผ๋œ dist ํด๋” ๋‚ด๋ถ€์—์„œ pm2 start app.js ์‹คํ–‰

4.9.3. ์‹œ๋„ 3 โ†’ ํ•ด๊ฒฐ

  • .env ํŒŒ์ผ์˜ ์œ„์น˜๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค
  • .env ํŒŒ์ผ์„ server/dist ์— ๋„ฃ์–ด์„œ ํ•ด๊ฒฐ

5. ๊ถ๊ธˆํ•œ ์ 

5.1. docker์™€ ๋ฒ„์ „

  • docker ์œ„์—์„œ๋Š” ubuntu์—ฌ๋„ 18๋ฒ„์ „ ์ด์ƒ์˜ node๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? 4.2.์ฐธ๊ณ 

5.2. Nginx ํด๋” ๊ตฌ์กฐ

  • ์ •์  ํŒŒ์ผ์ด ์œ„์น˜ํ•ด์•ผ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์œ„์น˜๊ฐ€ /usr/share/nginx/html, /var/www/html ๋‘ ๊ณณ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋‘˜์˜ ์ฐจ์ด์ ์ด ๋ญ˜๊นŒ?
  • ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„์˜ˆ ํ”„๋กœ์ ํŠธ์˜ buildํด๋” ์œ„์น˜๋ฅผ ๋ฃจํŠธ ๋””ํ…ํ† ๋ฆฌ๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋” ํŽธํ•˜์ง€ ์•Š์„๊นŒ? ํ•ด์„œ ๋ฐ”๊พธ์–ด๋ณด์•˜์ง€๋งŒ 404 ์—๋Ÿฌ ๋ฐœ์ƒ (ํ™•์‹คํ•˜์ง„ ์•Š์Œ)

5.3. node

  • nodemon๊ณผ ts-node์—์„œ๋Š” server/dist/app.js ๋ฅผ ์‹คํ–‰ํ•ด๋„ ์ž˜ ๋˜์—ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ pm2์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค. ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

6. ๋ฐฐํฌ ๊ฒฐ๊ณผ

๋ฐฐํฌ ์‚ฌ์ดํŠธ

๋ฐฑ์—”ํŠธ ํฌํŠธ ๋ฒˆํ˜ธ : 3000(๋ฆฌ์•กํŠธ ๋นŒ๋“œ ์„œ๋ฒ„๋ž‘ ๋™์ผ)

ํด๋ผ์ด์–ธํŠธ ํฌํŠธ ๋ฒˆํ˜ธ : 80

6.1. ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„

  • build๋œ ํŒŒ์ผ์„ nginx์—์„œ ๊ตฌ๋™ ์ค‘์ธ ๋ชจ์Šต ์บก์ฒ˜2

6.2. api ์„œ๋ฒ„

  • ์š”์ฒญ์ด ์ž˜ ์˜จ๋‹ค

Untitled

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ž˜ ๋ณด์ž„

์บก์ฒ˜

6.3. CI/CD๋Š” ๋‹ค์Œ ๊ธฐํšŒ์— ใ…Ž.ใ…Ž

  • .github/workflows์—์„œ ์“ฐ๋˜ yml ํŒŒ์ผ ์‚ฌ์šฉํ•˜๊ธฐ