이 회사에 입사하자마자 새로운 프로젝트를 만들어야했고, 프론트엔드 플젝은 알아서 배포해야한다는 청천벽력(?)과 같은 말을 들었다.
어차피 Next.js를 안쓰고 CRA로 만든 프로젝트를 쓰다 보니 S3에 build 파일 올리는 형식으로 배포하면 되겠다 생각했는데... 여차저차의 이유로 EC2 instance로 배포하라고 하셨다.
instance 사양도 t3a nano로.... 처음에 많은 난관에 부딪혔다.
1. instance로 배포하면 정적 build 파일이더라도 instance가 백그라운드에서 계속 실행되게 해야하는데 어떻게 할지? -> 나는 어설프게나마 Docker로 돌려 본 경험은 있다
2. 부트캠프에서 플젝 배포할 때 요금 생각안하고 빵빵한 사양으로 돌렸던 instance에서도 build할 때 멈추던 경험이 있는데 nano 사양에서 npm run build가 돌아갈지...? -> 역시나 안돌아갔다
저 두 가지의 큰 난관 아닌 난관을 어떻게 풀어가야할까란 생각을 하다 결론을 지었다.
- instance 백그라운드 실행을 위해 Nginx를 사용하자!
- npm run build가 절대 안돌아가니 gitignore 파일에서 build 주석을 슬며시 풀어주어 로컬에서 npm run build를 실행하고 build 파일을 git에 함께 올리자.......!
이런 결론에 따라... instance 안에 Nginx를 설치하고 github default branch (master 아니면 main)에 push하면 build 파일을 pull 받아 배포되는 GitAction을 설정한 과정을 대략적으로 정리해보고자 한다!
sudo su
로 루트계정 실행vi /etc/ssh/sshd_config
:set number
38번째줄 "PermitRootLogin yes" 주석 해제
sudo cp /home/ec2-user/.ssh/authorized_keys /root/.ssh
systemctl restart sshd
yum install git -y
git config credential.helper store
**nginx 설치**
sudo amazon-linux-extras install nginx1 -y
**nginx 실행**
sudo systemctl start nginx.service
**nginx 상태 확인**
service nginx status
**nginx 설정 변경**
cd /etc/nginx
vi nginx.conf
**아래부분 다음과 같이 수정**
server {
listen 3000;
listen [::]:80;
root /home/프로젝트명/build;
**새로고침 404 수정
아래부분 추가**
location / {
try_files $uri /index.html;
}
****
**nginx 재시작**
service nginx restart
# Deploy
name: Deploy
on:
push:
branches: [master] # 마스터 브랜치에 push될 경우 배포
jobs:
deploy:
name: deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: excuting remote ssh commands
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_SSH_HOST }} # 인스턴스 IP
username: ${{secrets.REMOTE_SSH_USER}} # user
key: ${{ secrets.REMOTE_SSH_KEY }} # ec2 instance pem key
port: ${{ secrets.REMOTE_SSH_PORT }} # 접속포트
script: |
cd /home
cd [ git clone한 프로젝트명 ]
git pull
service nginx restart