ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [라즈베리파이5] 홈서버에 서비스 배포 1 - git, nvm, pm2, nginx 기본 세팅
    📗공부기록/CS 2026. 2. 17. 01:40

    나는 앞서 말했듯 이미 완성해서 다른 곳에 배포 중이었던 프로젝트를 내 서버에서 돌릴 수 있게 하는 것이 1차적인 목적이었다.

    프로젝트를 배포하기 위해서는 아래와 같은 작업이 필요하다.

    1. git 설치 후 프로젝트 clone
    2. 프로젝트 .env 추가
    3. nvm 설치
    4. pm2 설치 및 세팅
    5. nginx 설치
    6. 도메인 연결, https 세팅 
    7. docker 설치
    8. docker에 postgre SQL설치

    이번 포스팅에서는 6번까지만 진행할 계획이다.

     

    git

    우선 git 을 설치하고 ssh키를 생성 후 git hub에 등록해야 한다. 

    github 사이트에서 프로필 > settings > ssh keys에 cat 명령어로 확인한 내용의 Authentication Key를 등록한다.

    sudo apt install git -y
    git config --global user.name "git 계정 이름"
    git config --global user.email "git 계정 이메일"
    
    
    ssh-keygen -t ed25519 -C "git 계정 이메일" #ssh키 생성
    cat ~/.ssh/id_ed25519.pub # 생성된 키 내용 확인

     

    그리고 프로젝트를 저장할 원하는 경로를 생성 후 clone한다. 나는 srv 폴더에 www폴더를 추가하고 해당 위치에서 clone을 했다.

    그리고 환경변수 파일을 추가했고, 프로젝트를 돌리기 위해 node를 설치해야 했다.

     

    nvm

    node는 버전을 자유롭게 바꿔 적용할 수 있는 nvm을 설치했는데, 지금은 프로젝트가 하나밖에 없어서 해당 프로젝트에서 사용된 버전인 22.17.0을 기본값으로 고정시켰다.

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # 지금 세션에서 바로 활성화
    
    nvm install 22.17.0
    nvm use 22.17.0
    nvm alias default 22.17.0 # 원하는 버전 적용
    
    nvm which 22.17.0 #나오는 경로를 아래 경로에 입력
    sudo ln -sf /home/ubuntu/.nvm/versions/node/v22.17.0/bin/node /usr/local/bin/node
    sudo ln -sf /home/ubuntu/.nvm/versions/node/v22.17.0/bin/npm  /usr/local/bin/npm
    sudo ln -sf /home/ubuntu/.nvm/versions/node/v22.17.0/bin/npx  /usr/local/bin/npx
    node -v

     

    이제 npm 명령어를 사용할 수 있게 됐다. 프로젝트 경로에서 아래 명령어로 프로젝트 빌드한다. 여기서 빌드 후 npm run start 명령어로 에러 없이 잘 실행되는지 확인해 봐도 상관없다.

    npm ci
    npm run build

     

    pm2

    이제 내 서비스를 자동으로 재실행해주고 터미널을 닫아도 항상 서비스가 유지될 수 있게 해주는 pm2를 설치하고 세팅하자.

    npm i -g pm2
    pm2 start npm --name "myapp" -- start

     

     

    아래는 서버가 재부팅돼도 자동으로 실행될 수 있게 하는 명령어이다. 두 번째 명령어를 입력하면 긴 명령어가 뜨는데, 그걸 복사해서 터미널에 입력해 주면 된다.

    pm2 save
    pm2 startup systemd -u $USER --hp $HOME

     

     

    Nginx

    nginx는 외부에서 내 서비스에 안전하게 접근할 수 있게 해주는 소프트웨어다. ssl 인증서를 관리를 통해 https로 서비스를 할 수 있게 만들어주고, 리버스프록시를 통해 서비스는 내부에서 node로 실행하고 외부 접근은 nginx가 받아서 전달해 주어 더욱 안전하다. 

    nginx를 설치하고 포트포워딩, certbot으로 80번 포트(http)를 통해 ssl 인증서 발급, 443번 포트(https)로 서비스할 수 있게 해야 한다.

    세팅이 끝나면 80번 포트는 443 포트로 리디렉션 시켜주는 용도일 뿐이고 실제 서비스는 443 포트로만 운영된다.

     

    sudo apt install -y nginx # 설치
    sudo systemctl status nginx # 확인 명령어
    
    sudo ufw allow 80/tcp # nginx 서비스 포트 방화벽 열기
    sudo ufw aloow 443/tcp

     

    앱을 연결하기 위한 설정파일을 생성하고 아래 코드를 추가한다.

    sudo nano /etc/nginx/sites-available/myapp # 아래 코드를 작성 후 저장해야 한다.
    
    server {
        listen 80;
        server_name 도메인 www.도메인;
    
        location / {
            proxy_pass http://127.0.0.1:포트; # package.json 파일 start에 적은 포트
            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;
        }
    }

     

    nginx는 sites-available에 설정파일을 생성하고 sites-enabled에 링크를 연결하여 사용하는 방식이다.

    # 생성한 파일을 sites-enabled에 링크 연결
    sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/ 
    
    sudo nginx -t # 문법 검사
    sudo systemctl restart nginx # 재실행

     

    그리고 ssl 인증서를 받기 위해 certbot 설치, 도메인을 구매한 사이트에 내 WAN IP를 추가한 뒤, 공유기 설정 사이트에서 80번 포트를 포트포워딩한다.

    sudo apt install -y certbot python3-certbot-nginx
    
    # 도메인 구매 후 사이트에서 DNS에 WAN IP 추가, 공유기 포트포워딩 까지 끝났으면 아래 명령어 입력 
    sudo certbot --nginx -d 도메인 -d www.도메인 # 이메일 입력 후 y로 약관 동의
    
    sudo nginx -t
    sudo systemctl reload nginx # 확인 명령어

     

    여기까지 하면 자동으로 nginx에 443이 설정되고 80번 포트는 리디렉션 용도로 바뀐다.

     

     


    이번 포스팅은 딱 기본적인 서비스 배포를 위한 내용만 급하게 작성해서 나도 학습이 덜 된 상태고, 중간중간 내용이 빠졌을 수 있다. 천천히 더 학습하고 추후 포트포워딩 없이 서비스가 가능한 cloudflare나 자동 배포를 위한 git  action 세팅까지 공부하고 적용해 볼 것이다. 아직 다른 것도 해야 될 일이 너무 많아서 후순위로 미뤄둬야 하는 게 아쉽다..

    댓글

Designed by Tistory.