๐จ TroubleShotting
๋ฌธ์ ๋ฐ์์ ๋ฐฐ๊ฒฝ - As Is
ํ๋ก์ ํธ๋ฅผ GitHub Actions์ Docker๋ฅผ ํ์ฉํด EC2์ ๋ฐฐํฌํ๋ ๊ณผ์ ์์, .env ํ์ผ์ด ๋์ปค ์ปจํ ์ด๋์ ์ ์์ ์ผ๋ก ๋ค์ด๊ฐ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋จ์ํ .env ํ์ผ ํ๋์ ๋ฌธ์ ์์ง๋ง, ์ด๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ๋น๋ํ์๊ณผ ๋ฐํ์, ๊ทธ๋ฆฌ๊ณ webpack.config.js์์์ ํ๊ฒฝ๋ณ์ ์ฒ๋ฆฌ๊น์ง ์ฌ๋ฌ ๊ฐ์ง ์ค์ํ ๊ฐ๋ ์ ์ ๋๋ก ์ดํดํ๊ฒ ๋์๋ค.
์ด๋ฒ ๊ธ์์๋ ๋ด๊ฐ ๊ฒช์ ๋ฌธ์ ์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํตํด ์ ๋ฆฌํ ๋ฐฐํฌ ํ๋ฆ์ ๊ธฐ๋กํด๋ณธ๋ค.
โ๏ธ ๋ฌธ์
- GitHub Actions์์ .env ํ์ผ์ ์์ฑํ๊ณ EC2์ ๋ณต์ฌํ์์๋
- ๋์ปค ์ปจํ ์ด๋ ๋ด๋ถ์๋ .env ํ์ผ์ด ์กด์ฌํ์ง ์์์
[ec2-user@ipxxxx ~]$ docker exec -it app cat /usr/src/app/.env
cat: can't open '/usr/src/app/.env': No such file or directory
- ๋ฐฐํฌ๋ ํ์ด์ง์์ ๋ฐฑ์๋๋ก ์์ฒญ์ ํ ์, requestUrl ๋ด API_URL ์ฃผ์๊ฐ undefined๊ฐ ๋์ด ์์ฒญ ์คํจ
2. ์์ธ ๋ถ์
โ ์์ธ 1. GitHub Actions(deploy.yaml)์ Dockerfile์ ์คํ ํ๋ฆ์ ๋ํ ๊ฐ๋ ๋ถ์กฑ
- deploy.yaml์ GitHub Actions์์ ์คํ๋๋ YAML ์คํฌ๋ฆฝํธ์ด๊ณ ,
๊ทธ ์ค docker build ๋จ๊ณ์์ Dockerfile์ด ์คํ๋จ - ๋ฐ๋ผ์ .env ํ์ผ์ Docker build ์ด์ ์ ๋ง๋ค์ด์ ธ ์์ด์ผ ๋ณต์ฌ ๊ฐ๋ฅํจ!
- ์ด์ deploy.yaml ํ์ผ์์ .env ์์ฑ ๋ช ๋ น์ docker build ์ด์ ์ ํ์ด์ผ ํ๋๋ฐ, ์ดํ์ ํ๊ณ ์์์
- ๋ณต์ฌํ .env ํ์ผ ์์ฒด๊ฐ ์์์ผ๋ฏ๋ก - undefined ๋ฐํ
โ ์์ธ 2. .dockerignore ํ์ผ์ .env๊ฐ ํฌํจ๋์ด ์์์
- .env ํ์ผ์ ์์ฑํด๋ Docker ์ด๋ฏธ์ง์ ๋ณต์ฌ๋์ง ์์
- ๊ฒฐ๊ณผ์ ์ผ๋ก ์ปจํ ์ด๋ ๋ด๋ถ์์ .env ํ์ผ์ด ๋ณด์ด์ง ์์ - undefined ๋ฐํ
2. ํด๊ฒฐ๋ฐฉ์
โ .dockerignore์์ .env ์ ์ธ
# .dockerignore
.env โ
โ .env ํ์ผ์ 2๊ฐ์ง ๋ณต์ฌ ๋ฐฉ๋ฒ
๐ง ๋ฐฉ๋ฒ 1. Dockerfile์์ .env๋ฅผ ์ง์ ๋ณต์ฌ(docker ์ด๋ฏธ์ง ๋น๋ ์ ๋ณต์ฌ)
# 1. Build ๋จ๊ณ
FROM node:22 AS build
...
# # โ
.env ํ์ผ ์ถ๊ฐ
# COPY .env ./
...
CMD ["nginx", "-g", "daemon off;"]
๐ง ๋ฐฉ๋ฒ 2. EC2์ ๋ณต์ฌ ํ ์ปจํ ์ด๋๋ก ์ฎ๊น
์ด ๋ฐฉ๋ฒ์ .env๋ฅผ Docker ์ด๋ฏธ์ง์ ํฌํจํ์ง ์์ ๋ณด์์์ผ๋ก๋ ๋ ์์ ํ์ง ์์๊น..? ์ถ์ด์ ์คํํด๋ณธ ๋ฐฉ๋ฒ ๐ ์ด ๋ฐฉ๋ฒ๋ ์ฑ๊ณต!
# deploy.yaml
jobs:
build-and-deploy:
runs-on: ubuntu-latest
...
- name: Prepare .env
run: |
# โ
1) env ํ์ผ ์์ฑ
echo "API_URL=${{ secrets.API_URL }}" > .env
echo "๐ .env file contents:"
cat .env
...
- name: Copy .env to EC2
run: |
# โ
2) EC2๋ก ๋ณต์ฌ
echo "${{ secrets.EC2_KEY }}" > ec2.pem
chmod 600 ec2.pem
scp -i ec2.pem -o StrictHostKeyChecking=no .env ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/home/${{ secrets.EC2_USERNAME }}/.env
# โ
3) ์ปจํ
์ด๋ ์คํ ํ ์ปจํ
์ด๋ ๋ด๋ถ .env ๋ณต์ฌํ ๋๋ ํ ๋ฆฌ ์์ฑ
docker exec golaping-app mkdir -p /usr/src/app
# โ
4) ํด๋น ๋๋ ํ ๋ฆฌ์ EC2์ .env ํ์ผ ๋ณต์ฌ
docker cp /home/${{ secrets.EC2_USERNAME }}/.env golaping-app:/usr/src/app/.env
...
๐ก ์๋กญ๊ฒ ์๊ฒ๋ ์
๋น๋ํ์ vs ๋ฐํ์ ๋ณต์ต
๐ฆ ๋น๋ํ์ | - Webpack์ด ๋ฒ๋ค๋ง์ ์ํํ ๋, JS ์ฝ๋๊ฐ ๋ฒ๋ค๋ง๋๊ณ ์ต์ข
HTML/JS ํ์ผ์ด ์์ฑ๋๋ ์์ - ex) pnpm build ์์ โก๏ธ ์ด๋ .env ๊ฐ์ webpack.config.js์์ dotenv๋ก .env ํ์ผ์ ์ฝ๊ณ , DefinePlugin์ผ๋ก process.env.API_URL ๊ฐ์ ๊ฐ์ ์ค์ JS ์ฝ๋ ๋ด ๋ฌธ์์ด๋ก ์นํ |
โ๏ธ ๋ฐํ์ | - ์น ๋ธ๋ผ์ฐ์ ๋ Node.js์์ ์ค์ JS ์ฝ๋๊ฐ ์คํ๋๋ ์์ - ์ฑ ๋ด JS ์ฝ๋๊ฐ ์คํ ์ค .env ๊ฐ์ ์ฐธ์กฐํ ๋ โก๏ธ .env ํ์ผ์ด ๋์ปค ์ปจํ ์ด๋ ๋ด๋ถ์ ์กด์ฌํด์ผ, ์คํ ์ฝ๋์์ ์ฌ์ฉ๊ฐ๋ฅํ๋๋ก ์ค๋น๋จ |
๋ฐฐํฌ ์ ์ฒด ํ๋ฆ์ ๋ฆฌ
[GitHub Actions - deploy.yaml]
1. .env ์์ฑ
2. pnpm build (for ๋น๋: webpack.config.js ์คํ - .env ์ฐธ์กฐ)
3. docker build (for ๋ฐํ์: COPY .env ./)
4. docker push
[EC2]
5. docker pull
6. docker run (์คํ ์ -e API_URL=... ๋ก ์ ๋ฌ ๊ฐ๋ฅ)
๐ฉ๋ง๋ฌด๋ฆฌ
์ด๋ฒ ๋ฌธ์ ๋ ๋จ์ํ .env๊ฐ ์ปจํ ์ด๋์ ๋ณต์ฌ๋์ง ์๋ ๋ฌธ์ ์์ง๋ง,
๊ทธ ๊ณผ์ ์์ ๋น๋ํ์ vs ๋ฐํ์์ ์ฐจ์ด,
GitHub Actions(deploy.yaml)์ Dockerfile์ ์คํ ์์,
webpack์์์ ํ๊ฒฝ๋ณ์ ์ฃผ์
๋ฐฉ์ ๋ฑ ์ค์ํ ๊ฐ๋
๋ค์ ๋ฐฐ์ธ ์ ์์๋ค.
์ด์ ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ฌํ ์ง ์ ํํ ์ ์๊ณ , ๊ฐ ๋ฐฉ๋ฒ์ด ์ด๋ค ์์ ์์ ์๋ํ๋์ง๋ ์ดํดํ ์ ์๊ฒ ๋์๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐งฉ WebSocket, Recoil๋ก ๊ด๋ฆฌํด๋ ๋ ๊น? (0) | 2025.03.22 |
---|---|
TimePicker ์ธ๋ถ ํด๋ฆญ ์ ๋ค์ ์ด๋ฆฌ๋ ํ์ (0) | 2025.03.22 |
SSL ์ธ์ฆ์ ๋ฐ๊ธ๊ณผ IP ์ฃผ์ (0) | 2025.03.03 |
์์ฒญ์ ์ฟ ํค๊ฐ ์ ๋ด๊ฒจ์.. SameSite=None? Strict? (0) | 2025.03.02 |
๋ฐฐํฌ๋ฐฉ๋ฒ ๊ณ ๋ฏผ - ๐ EC2 + NginX vs CloudFront + S3 (0) | 2025.01.11 |