관리 메뉴

Mini

24. 11. 4. 개발일지 // 자동배포, nginx 설정 본문

CS/Linux

24. 11. 4. 개발일지 // 자동배포, nginx 설정

Mini_96 2024. 11. 5. 03:38

* 자동배포 구현

  • 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가 있는듯함
    • 해결 : 공식문서 따라서 설치

결과(80번 포트로 접속함 -> 3000포트로 리버스 프록시)

레퍼런스

 

[Ncloud] Server g3 업데이트 후 ubuntu 22.04에서 Nginx 설치가 안될 때 방법 알아보기

안녕하세요. 이번에 Ncloud에서 서버가 3세대로 업데이트되면서 KVM ubuntu 22.04로 서버 이미지가 업데이트되었습니다. 평소처럼 Nginx를 Init Script로 기본적으로 사용하다가 갑자기 설치가 안되길래

eveningdev.tistory.com

 

 

nginx: Linux packages

nginx: Linux packages Supported distributions and versions nginx packages are available for the following Linux distributions and versions: RHEL and derivatives Version Supported Platforms 8.x x86_64, aarch64/arm64 9.x x86_64, aarch64/arm64 Debian Version

nginx.org

 

 

 

[Ncloud] Server g3 업데이트 후 ubuntu 22.04에서 Nginx 설치가 안될 때 방법 알아보기

안녕하세요. 이번에 Ncloud에서 서버가 3세대로 업데이트되면서 KVM ubuntu 22.04로 서버 이미지가 업데이트되었습니다. 평소처럼 Nginx를 Init Script로 기본적으로 사용하다가 갑자기 설치가 안되길래

eveningdev.tistory.com

 

 

 

nginx: Linux packages

nginx: Linux packages Supported distributions and versions nginx packages are available for the following Linux distributions and versions: RHEL and derivatives Version Supported Platforms 8.x x86_64, aarch64/arm64 9.x x86_64, aarch64/arm64 Debian Version

nginx.org