다른 서버로 프로젝트 이전하기

mynameisjaehoon·2024년 3월 1일
0

최근에 비용문제로 프로젝트의 VM인스턴스와 DB서버를 옮기게 되었다. 내 생각보다 사용자가 많아져 한달만에 AWS 프리티어가 제공하는 리소스를 모두 사용했고, 구글 클라우드에서는 하나의 계정당 $300의 크레딧을 무료로 제공하기 때문에 적어도 한달 동안 프로젝트를 유지할 수 있을 것이라 생각했기 때문이다.
1.

1. GCP VM 인스턴스 생성

  • CPU 코어 2개, 4GB의 메모리를 가지는 인스턴스로 설정
  • 부팅 디스크는 Ubuntu 20.04 LTS 로 등록, 디스크의 크기는 10GB로 설정
  • 방화벽 옵션에서 HTTP, HTTPS 트래픽 허용
  • 로컬에서 SSH 접속을 위해서 다음 과정을 거침(인스턴스 생성후 수행해도 됨)
    - 고급 옵션 >> 보안 탭에서 수동으로 이전에 사용하던 SSH 키를 등록

2. GCP Cloud SQL 인스턴스 생성

  • MySQL 8.0 버전으로 선택
  • Cloud SQL 버전은 엔터프라이즈 >> 샌드박스 (CPU 2개, 8GB RAM, 10GB 스토리지)
  • MySQL WorkBench나 DataGrip을 사용해서 로컬로 접속하기 위해서는 승인된 네트워크 IP를 등록해주어야한다.
    - 서버의 인스턴스 IP는 공개 IP로 설정
    • 승인된 네트워크 IP를 CIDR 표현으로 제공하면 된다. 나는 어디서나 접속할 수 있도록 0.0.0.0/0 으로 설정해주었다. 하지만 이렇게 설정한다고 DB에 접근할 수 있는 것은 아니다. username, password를 입력하는 과정은 필요하다.

3. 로컬에서 VM에 접속하기

  • 로컬에서 접속하지 않는다면 구글 클라우드 서비스 에서 제공하는 웹브라우저를 통한 SSH 접속도 가능하다.

3-1 터미널에서 접속

VM 인스턴스를 생성할 때 등록한 SSH키를 저장하고 있는 키파일을 이용해서 로컬 터미널에서 VM에 접속할 수 있다.

ssh -i (키파일) (사용자 이름)@(서버의 IP주소)
  • 사용자이름은 구글 계정이름으로 설정되어 있다.
  • 서버의 IP주소는 구글 클라우드 콘솔에서 확인할 수 있다.

3-2 vscode에서 접속

Remote SSH를 활용한다.
1. F1 >> Remote-SSH: 호스트에 연결
2. (호스트 이름)@(서버 IP주소) 입력
3. 설정 파일을 열어 다음과 같이 수정

  • Host: 원하는 이름 적으면 됨. VScode에서 접속할 때만 접속 서버를 구분하는데 사용된다.
  • HostName: 서버의 IP주소
  • IdentityFile: 서버에 접속하는데 필요한 SSH파일의 경로
    - 없으면 Permission Denied 발생
  • User: 서버에 접속할 호스트이름 입력.

4. 로컬에서 Cloud SQL 접속하기

WorkBench와 DataGrip에서 동일하다.

  • Host: DB서버 IP주소 입력
  • Username: 사용자 이름
  • Password: 비밀번호

Cloud SQL을 처음 만들면 root 사용자만 생성되어 있기 때문에 다른 사용자로 접속하고 싶으면 클라우드 콘솔의 사용자 탭에서 새로운 사용자와 패스워드를 등록해주어야 한다.

5. VM 인스턴스에 필요한 패키지 설치

5-1 git 설치

sudo apt install git
git --version

5-2 npm 설치

sudo apt install nodejs npm
nodejs -v

5-3 vite: not found

프로젝트 폴더(프론트엔드)에서

sudo npm install
또는
sudo npm i

5-4 자바 설치

스프링 부트 프로젝트가 자바 17기반으로 설치되었기 때문에 자바17을 설치했다.

sudo apt install openjdk-17-jdk

5-5 Nginx 설치

sudo apt update
sudo apt install nginx

6. HTTPS 키 가져오기

이전 서버에서 HTTPS 설정을 위해 사용하던 키를 가져와야한다. 나는 Let's Encrypt의 SSL 서비스를 사용하고 있었고, 나와 동일하게 다른 서버로 인증서를 옮기려는 질문을 한 사람이 있었다.

몇개의 인증을 위한 파일을 수동으로 복사해서 새로운 서버에 가져다 놓으면 사용할 수 있다.

물론 새롭게 인증서를 발급받아도 되지만, 이 경우에는 이미 등록된 도메인으로 새롭게 등록하는 과정이기 때문에 몇가지 과정이 더 필요하다. 그래서 나는 수동으로 인증서 파일을 옮기기로 하였다.

처음 Let's Encrypt 서비스를 적용했다면 필요한 키인 fullchain.pem, privkey.pem이

/etc/letsencrypt/live/gongnomok.site/fullchain.pem
/etc/letsencrypt/live/gongnomok.site/privkey.pem

위 경로에 저장되어 있고, nginx의 open ssl을 위한 설정은

/etc/letsencrypt/options-ssl-nginx.conf

위 경로에 위치한다 이 파일의 내용을 복사해서 새로운 서버의 내가 원하는 위치에 복붙 하면된다.

80번 포트로 들어오는 요청을 https 주소로 자동으로 리다이렉션 해주었고, 443 포트로 들어온 요청은 빌드된 리액트 프로덕션 코드의 index.html을 반환한다.

server {
        listen 80;
        server_name gongnomok.site;

	location / {
		return 301 https://gongnomok.site$request_uri;
	}

}

server {
        listen 443 ssl;
        server_name gongnomok.site;

        ssl_certificate /etc/my_ssh/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/my_ssh/privkey.pem; # managed by Certbot
        include /etc/my_ssh/options-ssl-nginx.conf; # managed by Certbot

        location / {
        	root   /usr/project/gongnomok-simulator/frontend/dist;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
        
        location /api {
            proxy_pass https://localhost:8080;
        }
}

물론 이곳에서 도메인 주소를 사용하기 위해서는 가비아 같은 DNS서비스에 이미 도메인 주소가 등록되어 있어야 한다.

ssl_certificate /etc/my_ssh/fullchain.pem;
ssl_certificate_key /etc/my_ssh/privkey.pem;
include /etc/my_ssh/options-ssl-nginx.conf;

Nginx의 SSL설정에 사용된 위 주소들은 나의 SSL 키값이 위치하는 경로이다.

7. 데이터 옮기기

MySQL WorkBench로 현재 데이터베이스 파일을 덤프시켜 테이블을 새로운 MySQL 서버에 복원하였다.

덤프할 데이터베이스와 테이블을 선택한후 Export 해주면 된다. 한꺼번에 Export할지, 테이블별로 Export 할지 선택하는 등 디테일한 설정도 있지만 그건 여기서 다루지 않는다.
덤프할 때 꼭 set-gtid-purged 옵션을 OFF로 설정해주어야 한다는 점을 기억하자.

데이터를 가져올 DB 서버에 접속해서 Data Import를 통해 아까전에 덤프한 파일로 데이터를 복원할 수 있다.

8. 백엔드 서버 통신 DB 바꿔주기

백엔드 서버에서 접속하는 DB 주소를 바꿔주도록 하자.

0개의 댓글