코딩/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