코딩/Git

[GIT] CI/CD 적용기

카슈밀 2025. 4. 17. 23:06
반응형

nas에 적용하는건 금방했는데, 권한 오류가 나서 자꾸 git pull이나, pm2 작동에서 오류를 뱉었다. 빡시더라..

 

Synology NAS 기반 Node.js API 서버 설정 및 배포 자동화 문서

✅ 프로젝트 개요

  • 서버 위치: Synology NAS (/volume1/web/api)
  • 기술 스택: Node.js (Express), MariaDB, PM2, GitHub Actions
  • 배포 방식: GitHub main 브랜치 병합 → GitHub Action → SSH → NAS 배포

1. NAS 초기 설정

📁 디렉토리 구조

/volume1/web/api

🛠 Node.js 설치 위치

/volume1/@appstore/Node.js_v18/usr/local/bin/node

🌐 리버스 프록시 설정

  • 도메인: api도메인
  • 포트: 내부 4000, 외부는 포트 없이 도메인으로 접근

🔐 SSL 인증서

  • Let's Encrypt를 통해 api도메인 에 적용 완료

2. Express API 서버 기본 구성

📦 필수 패키지

npm install express cors jsonwebtoken dotenv mysql2
npm install --save-dev nodemon

🗂 프로젝트 구조

api/
├── index.js
├── routes/
│   └── auth.js
├── .env.production
├── .env.test
├── .gitignore

⚙️ index.js 예시

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const authRouter = require('./routes/auth');

const app = express();
app.use(cors());
app.use(express.json());
app.use('/auth', authRouter);

app.listen(4000, () => {
  console.log('✅ API 서버 실행 중: http://localhost:4000');
});

3. PM2로 Node 서버 관리

▶️ 실행

pm install -g pm2
pm2 start index.js --name api
pm2 save

🔁 재시작

pm2 restart api

4. GitHub Actions 자동 배포

🔐 필요 설정

  • NAS에 SSH 키 생성 → GitHub에 등록 (SSH and GPG Keys)
  • GitHub Secrets 등록: NAS_HOST, NAS_USER, NAS_SSH_KEY

📄 .github/workflows/deploy.yml

name: 🚀 Deploy to Synology NAS on main merge

on:
  pull_request:
    types: [closed]
    branches: [main]

jobs:
  deploy:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest

    steps:
      - name: ✅ Checkout source code
        uses: actions/checkout@v3

      - name: 🚀 Deploy to NAS via SSH
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.NAS_HOST }}
          username: ${{ secrets.NAS_USER }}
          key: ${{ secrets.NAS_SSH_KEY }}
          port: 22 # 변경 시 포트 지정
          script: |
            export PATH=$PATH:/usr/local/bin:/volume1/@appstore/Node.js_v18/usr/local/bin
            echo "🔑 SSH 연결 완료"
            cd /volume1/web/api
            git config --global --add safe.directory /volume1/web/api
            git reset --hard HEAD
            git pull origin main
            cp .env.production .env
            npm install --omit=dev
            pm2 restart api
            echo "📅 배포 완료"

 

728x90