๐พ ๋ฐฐํฌ ๊ด๋ จ ํ์ - boostcampwm-2022/web33-Mildo GitHub Wiki
1. ๊ฐ์
- ์ผ์ ๋ฐ ์ฅ์ : 11.17.(์) 15:00 ~ 21:30, ๊ฒ๋ํ์ด
- ์ฐธ์ฌ์ : ์ ์
- ๋ชฉ์ : CI/CD ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ ์๋ํ
- ํ์ ์ค์๋ : ์ค
2. ๊ณ ๋ ค ์ฌํญ
2.1. nCloud ์๋ฒ ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ
- ์๋ฒ ์ธ์คํด์ค ๋ช ๊ฐ ๋ง๋ค์ง?
- 2๊ฐ
- ํ๋์ ์ธ์คํด์ค์์ ๋ ์๋ฒ๋ฅผ ๊ฐ์ด ์คํํ ์ ์์
- web server + api server
- crontab server
- 3๊ฐ
- web server์ api server๋ฅผ ๋ถ๋ฆฌํด์ ์์ ์ฑ์ ๋์ผ ์ ์์
- web server
- api server
- crontab sever
- ์ฐ์ ํ๋์์ ์งํ
- 2๊ฐ
- nginx ์ค์
- ์ค์น
- ipv4 80๋ฒ ํฌํธ๋ก ์ ์
- default ํ์ผ์ ipv6 80๋ฒ ํฌํธ๋ ์ฃผ์ ์ฒ๋ฆฌ
- nodejs ์ค์น ๋ฐ ์ค์
- Ubuntu node.js ์ค์น ๋ฐฉ๋ฒ
- 16.10.0 ๋ฒ์ ์ผ๋ก ์งํ
- Ubuntu node.js ์ค์น ๋ฐฉ๋ฒ
- 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
- ์ฐธ๊ณ ์๋ฃ
- FE
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 ์ค์
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์์ ๊ตฌ๋ ์ค์ธ ๋ชจ์ต
6.2. api ์๋ฒ
- ์์ฒญ์ด ์ ์จ๋ค
- ๋ธ๋ผ์ฐ์ ์์๋ ์ ๋ณด์
6.3. CI/CD๋ ๋ค์ ๊ธฐํ์ ใ .ใ
- .github/workflows์์ ์ฐ๋ yml ํ์ผ ์ฌ์ฉํ๊ธฐ