* 자동배포 구현
- github 세팅 > Actions에 .pem 의 내용 붙여넣기
- 주의 : 이때 .pem은 root 계정의 비밀번호 확인전용, 이것으로 로그인불가!
- 추가로 user명/.ssh/auth 에 공개키 방식으로 추가 키 생성필요!
- ec2에 node 설치 (ssh 원격접속후)
sudo apt-get update && /
sudo apt-get install -y ca-certificates curl gnupg && /
mkdir -p /etc/apt/keyrings && /
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && /
NODE_MAJOR=20 && /
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && /
sudo apt-get update && /
sudo apt-get install nodejs -y
- env 옮기기 자동화
* ssh 에러 해결
- 시도1 : secret에 password 직접 넣어보기 -> 안됨
- 원인 : root 계정이기때문에 ssh가 안되는것같다.
- 해결 : 새 계정 만들기 && 공개키-비밀키 설정
- 얘는 또 뭐지?
- 폴더 소유권 변경
- pm2 권한문제 해결
- 수정사항이 main에 push후, 자동반영되는모습!!!
- 흐름정리
- push가 될때,
- 깃헙액션 컴퓨터에서 의존성 설치, 테스트
- 빌드, 압축
- ec2에 압축파일전송
- 압축을풀고 실행
name: Deploy To EC2 on: push: branches: ["main", "dev-be", "dev-fe"] jobs: deploy: runs-on: ubuntu-latest steps: - name: Github Repository 파일 불러오기 uses: actions/checkout@v4 - name: Node 설치 uses: actions/setup-node@v4 with: node-version: "20" - name: BE 의존성 설치 working-directory: ./BE run: npm ci - name: FE 의존성 설치 working-directory: ./FE run: npm ci - name: .env 파일 만들기 run: | echo '${{ secrets.ENV }}' > .env - name: BE 테스트 코드 실행 working-directory: ./BE run: npm run test # todo: FE 테스트 코드 실행 # - name: FE 테스트 코드 실행 # working-directory: ./FE # run: npm run test - name: BE 빌드 working-directory: ./BE run: npm run build - name: FE 빌드 working-directory: ./FE run: npm run build - name: github-action 컴퓨터에서 압축하기 run: | # 현재 위치 확인 (디버깅용) pwd # BE와 FE 모든 필요 파일들을 함께 압축 tar -czvf project.tar.gz \\ BE/dist \\ BE/package.json \\ BE/package-lock.json \\ .env \\ FE/dist \\ FE/package.json \\ FE/package-lock.json \\ # 압축 파일 내용 확인 (디버깅용) echo "Created archive with contents:" tar -tvf project.tar.gz - name: Rsync로 EC2에 빌드된 파일 전송하기 run: | sshpass -p "123456" rsync -avz -e "ssh -o StrictHostKeyChecking=no" \\ project.tar.gz \\ ubuntu@${{ secrets.EC2_HOST }}:/home/ubuntu/nest-server/tobe/ - name: SSH로 EC2에 접속하기 uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USERNAME }} key: ${{ secrets.EC2_PRIVATE_KEY }} script_stop: true script: | rm -rf /home/ubuntu/nest-server/current mkdir /home/ubuntu/nest-server/current mv /home/ubuntu/nest-server/tobe/project.tar.gz /home/ubuntu/nest-server/current/project.tar.gz cd /home/ubuntu/nest-server/current tar -xvf project.tar.gz cd /home/ubuntu/nest-server/current/BE npm i cd cd /home/ubuntu/nest-server/current/FE npm i pm2 kill cd /home/ubuntu/nest-server/current/BE pm2 start dist/main.js --name "backend-server" # todo: # FrontEnd 배포 # # Frontend 배포 # echo "Deploying Frontend..." # sudo rm -rf /var/www/html/* # sudo cp -r ../FE/dist/* /var/www/html/
- 핵심
- 깃헙액션 컴퓨터에서 빌드후 필수파일만 압축해서 보냄 ⇒ 깃정보를 ec2에 저장할필요x
- 코드를 current, tobe폴더 로 구분 ⇒ 장애발생시 신속복구
* nginx 설정
- 80번 포트열기
- 3000 포트 잠그기
- nginx.conf 수정
- 주의 : include 문이 나중에 와야함
- 안그러면 default conf가 우선시되버림
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
include /etc/nginx/conf.d/*.conf;
}
- ncloud , ubuntu에 nginx 설치 issue가 있는듯함
- 해결 : 공식문서 따라서 설치
레퍼런스
- https://eveningdev.tistory.com/205
- https://nginx.org/en/linux_packages.html#Ubuntu
- https://www.youtube.com/watch?v=SDPnInSfgls&list=PLtUgHNmvcs6pzeVotjaBaRy-BtoWo_qBd&index=16
'CS > Linux' 카테고리의 다른 글
[Linux] OS 비교 (0) | 2024.11.04 |
---|---|
24. 9. 11. 개발일지 / 자동배포, git, 구조분해할당 , \r 명령어를 찾을수 없음 해결 (0) | 2024.09.11 |
24.9.5. 개발일지 // virtual box에 배포하기 , nat, bridge, ufw방화벽, nginx (0) | 2024.09.05 |
[Linux] pw 없이 접속하기, ssh-keygen, 배포하기 (0) | 2024.09.05 |
[Linux] 배포관련 아키텍쳐 best practice? (0) | 2024.09.04 |