diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 9d8f8a2..9853736 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -37,7 +37,9 @@ "Bash(start http://localhost:8000)", "Bash(npm --version)", "mcp__sequential-thinking__sequentialthinking", - "Bash(git commit:*)" + "Bash(git commit:*)", + "Bash(chmod:*)", + "Bash(./deploy-to-nas.sh:*)" ], "deny": [], "ask": [], diff --git a/deploy-to-nas.sh b/deploy-to-nas.sh new file mode 100644 index 0000000..36eea5f --- /dev/null +++ b/deploy-to-nas.sh @@ -0,0 +1,266 @@ +#!/bin/bash + +# 시놀로지 NAS 자료실 배포 스크립트 +# 사용법: ./deploy-to-nas.sh [nas-ip] [project-name] + +# 기본 설정 +NAS_IP="${1:-119.64.1.86}" +PROJECT_NAME="${2:-jaryo}" +DEPLOY_DIR="/volume1/web/$PROJECT_NAME" +SERVICE_PORT="3005" +GITEA_URL="http://$NAS_IP:3000/vibsin9322/jaryo.git" + +echo "==========================================" +echo "🚀 시놀로지 NAS 자료실 배포 시작" +echo "==========================================" +echo "NAS IP: $NAS_IP" +echo "프로젝트: $PROJECT_NAME" +echo "배포 경로: $DEPLOY_DIR" +echo "서비스 포트: $SERVICE_PORT" +echo "Gitea URL: $GITEA_URL" +echo "==========================================" + +# 사전 요구사항 확인 +echo "📋 1단계: 사전 요구사항 확인" + +# SSH 연결 테스트 (포트 2222) +echo "🔗 SSH 연결 테스트 중... (포트 2222)" +if ! ssh -p 2222 -o ConnectTimeout=5 admin@$NAS_IP "echo 'SSH 연결 성공'" 2>/dev/null; then + echo "❌ SSH 연결 실패. 다음을 확인하세요:" + echo " - NAS IP 주소: $NAS_IP" + echo " - SSH 포트: 2222" + echo " - SSH 서비스 활성화 (DSM > 제어판 > 터미널 및 SNMP)" + echo " - 방화벽 설정 (포트 2222 허용)" + exit 1 +fi +echo "✅ SSH 연결 성공" + +# Node.js 설치 확인 +echo "📦 Node.js 설치 확인 중..." +ssh -p 2222 admin@$NAS_IP "which node" >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo "❌ Node.js가 설치되지 않았습니다." + echo "DSM 패키지 센터에서 Node.js를 설치하세요." + exit 1 +fi + +NODE_VERSION=$(ssh -p 2222 admin@$NAS_IP "node --version") +echo "✅ Node.js 설치됨: $NODE_VERSION" + +# Git 설치 확인 +echo "📦 Git 설치 확인 중..." +ssh -p 2222 admin@$NAS_IP "which git" >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo "❌ Git이 설치되지 않았습니다." + echo "DSM 패키지 센터에서 Git Server를 설치하거나 다음 명령을 실행하세요:" + echo "ssh -p 2222 admin@$NAS_IP 'sudo apt update && sudo apt install git'" + exit 1 +fi + +GIT_VERSION=$(ssh -p 2222 admin@$NAS_IP "git --version") +echo "✅ Git 설치됨: $GIT_VERSION" + +# 2단계: 소스 코드 배포 +echo "" +echo "📂 2단계: 소스 코드 배포" + +# 기존 배포 디렉토리 확인 +echo "🗂️ 배포 디렉토리 확인 중..." +ssh -p 2222 admin@$NAS_IP " +if [ -d '$DEPLOY_DIR' ]; then + echo '⚠️ 기존 배포가 존재합니다: $DEPLOY_DIR' + echo '백업 생성 중...' + sudo cp -r '$DEPLOY_DIR' '${DEPLOY_DIR}_backup_$(date +%Y%m%d_%H%M%S)' + echo '기존 배포 제거 중...' + sudo rm -rf '$DEPLOY_DIR' +fi +" + +# 배포 디렉토리 생성 +echo "📁 배포 디렉토리 생성 중..." +ssh -p 2222 admin@$NAS_IP " +sudo mkdir -p '$DEPLOY_DIR' +sudo chown admin:users '$DEPLOY_DIR' +cd '$DEPLOY_DIR' +" + +# Git 클론 +echo "📥 Gitea에서 소스 코드 클론 중..." +ssh -p 2222 admin@$NAS_IP " +cd '$DEPLOY_DIR' +git clone '$GITEA_URL' . +if [ \$? -ne 0 ]; then + echo '❌ Git 클론 실패' + exit 1 +fi +echo '✅ 소스 코드 클론 완료' +" + +# 3단계: 의존성 설치 및 빌드 +echo "" +echo "🔧 3단계: 의존성 설치 및 빌드" + +ssh -p 2222 admin@$NAS_IP " +cd '$DEPLOY_DIR' + +# 기존 node_modules 제거 +if [ -d 'node_modules' ]; then + echo '🗑️ 기존 node_modules 제거 중...' + rm -rf node_modules package-lock.json +fi + +# 의존성 설치 +echo '📦 의존성 설치 중...' +npm install + +if [ \$? -ne 0 ]; then + echo '❌ npm install 실패' + exit 1 +fi +echo '✅ 의존성 설치 완료' + +# 데이터베이스 초기화 +if [ -f 'scripts/init-database.js' ]; then + echo '🗄️ 데이터베이스 초기화 중...' + npm run init-db + echo '✅ 데이터베이스 초기화 완료' +fi +" + +# 4단계: 서비스 설정 +echo "" +echo "⚙️ 4단계: 서비스 설정" + +# 시작 스크립트 생성 +echo "📝 시작 스크립트 생성 중..." +ssh -p 2222 admin@$NAS_IP " +cat > '$DEPLOY_DIR/start-nas-service.sh' << 'EOF' +#!/bin/bash + +# 자료실 NAS 서비스 시작 스크립트 +PROJECT_DIR='$DEPLOY_DIR' +SERVICE_PORT='$SERVICE_PORT' +PID_FILE='\$PROJECT_DIR/jaryo-nas.pid' +LOG_FILE='\$PROJECT_DIR/logs/app.log' + +# 로그 디렉토리 생성 +mkdir -p '\$PROJECT_DIR/logs' + +# 기존 프로세스 확인 및 종료 +if [ -f '\$PID_FILE' ]; then + OLD_PID=\$(cat '\$PID_FILE') + if kill -0 '\$OLD_PID' 2>/dev/null; then + echo '기존 서비스 종료 중... (PID: '\$OLD_PID')' + kill '\$OLD_PID' + sleep 2 + fi + rm -f '\$PID_FILE' +fi + +# 포트 사용 확인 +if netstat -tulpn | grep :'$SERVICE_PORT' >/dev/null; then + echo '⚠️ 포트 '$SERVICE_PORT'가 이미 사용 중입니다.' + echo '사용 중인 프로세스:' + netstat -tulpn | grep :'$SERVICE_PORT' + exit 1 +fi + +# 서비스 시작 +echo '🚀 자료실 서비스 시작 중...' +cd '\$PROJECT_DIR' +PORT='$SERVICE_PORT' nohup node server.js > '\$LOG_FILE' 2>&1 & +echo \$! > '\$PID_FILE' + +sleep 2 + +# 시작 확인 +if kill -0 \$(cat '\$PID_FILE') 2>/dev/null; then + echo '✅ 자료실 서비스 시작 완료!' + echo '📍 접속 URL: http://$NAS_IP:$SERVICE_PORT' + echo '📋 PID: '\$(cat '\$PID_FILE') + echo '📄 로그: '\$LOG_FILE' +else + echo '❌ 서비스 시작 실패' + echo '로그 확인:' + tail -20 '\$LOG_FILE' + exit 1 +fi +EOF + +chmod +x '$DEPLOY_DIR/start-nas-service.sh' +" + +# 중지 스크립트 생성 +echo "📝 중지 스크립트 생성 중..." +ssh -p 2222 admin@$NAS_IP " +cat > '$DEPLOY_DIR/stop-nas-service.sh' << 'EOF' +#!/bin/bash + +# 자료실 NAS 서비스 중지 스크립트 +PROJECT_DIR='$DEPLOY_DIR' +PID_FILE='\$PROJECT_DIR/jaryo-nas.pid' + +if [ -f '\$PID_FILE' ]; then + PID=\$(cat '\$PID_FILE') + if kill -0 '\$PID' 2>/dev/null; then + echo '🛑 자료실 서비스 중지 중... (PID: '\$PID')' + kill '\$PID' + sleep 2 + + # 강제 종료 확인 + if kill -0 '\$PID' 2>/dev/null; then + echo '⚡ 강제 종료 중...' + kill -9 '\$PID' + fi + + rm -f '\$PID_FILE' + echo '✅ 자료실 서비스 중지 완료' + else + echo '⚠️ 프로세스가 이미 종료됨' + rm -f '\$PID_FILE' + fi +else + echo '⚠️ PID 파일이 없습니다. 수동으로 프로세스를 확인하세요.' + echo '실행 중인 Node.js 프로세스:' + ps aux | grep 'node.*server.js' | grep -v grep +fi +EOF + +chmod +x '$DEPLOY_DIR/stop-nas-service.sh' +" + +# 5단계: 서비스 시작 +echo "" +echo "🎬 5단계: 서비스 시작" + +ssh -p 2222 admin@$NAS_IP "$DEPLOY_DIR/start-nas-service.sh" + +# 6단계: 접속 테스트 +echo "" +echo "🧪 6단계: 접속 테스트" + +sleep 3 + +echo "🌐 서비스 상태 확인 중..." +if curl -s "http://$NAS_IP:$SERVICE_PORT" >/dev/null; then + echo "✅ 자료실 서비스 정상 작동!" + echo "" + echo "==========================================" + echo "🎉 배포 완료!" + echo "==========================================" + echo "📍 접속 URL: http://$NAS_IP:$SERVICE_PORT" + echo "🔧 관리자 URL: http://$NAS_IP:$SERVICE_PORT/admin" + echo "📂 배포 경로: $DEPLOY_DIR" + echo "📄 로그 파일: $DEPLOY_DIR/logs/app.log" + echo "" + echo "🔧 서비스 관리:" + echo " 시작: ssh -p 2222 admin@$NAS_IP '$DEPLOY_DIR/start-nas-service.sh'" + echo " 중지: ssh -p 2222 admin@$NAS_IP '$DEPLOY_DIR/stop-nas-service.sh'" + echo " 로그: ssh -p 2222 admin@$NAS_IP 'tail -f $DEPLOY_DIR/logs/app.log'" + echo "" + echo "📱 브라우저에서 http://$NAS_IP:$SERVICE_PORT 접속하세요!" +else + echo "❌ 서비스 접속 실패" + echo "로그 확인:" + ssh -p 2222 admin@$NAS_IP "tail -20 $DEPLOY_DIR/logs/app.log" +fi \ No newline at end of file diff --git a/manual-nas-deployment-guide.md b/manual-nas-deployment-guide.md new file mode 100644 index 0000000..3f36a5c --- /dev/null +++ b/manual-nas-deployment-guide.md @@ -0,0 +1,328 @@ +# 시놀로지 NAS 수동 배포 가이드 + +## 🚀 시놀로지 NAS에서 자료실 서비스 배포하기 + +### 사전 준비사항 ✅ + +1. **DSM 패키지 설치 확인** + - Node.js v16+ (패키지 센터에서 설치) + - Git Server (패키지 센터에서 설치) + - SSH 서비스 활성화 (제어판 > 터미널 및 SNMP) + +2. **방화벽 설정** + - SSH 포트: 2222 허용 + - 서비스 포트: 3005 허용 + - Gitea 포트: 3000 허용 + +### 1단계: SSH 접속 🔗 + +```bash +# Windows에서 NAS 접속 +ssh -p 2222 admin@119.64.1.86 + +# 접속 후 관리자 권한 확인 +sudo whoami +``` + +### 2단계: 배포 디렉토리 준비 📁 + +```bash +# 웹 디렉토리로 이동 +cd /volume1/web + +# 기존 jaryo 폴더가 있다면 백업 +if [ -d "jaryo" ]; then + sudo mv jaryo jaryo_backup_$(date +%Y%m%d_%H%M%S) +fi + +# 새 디렉토리 생성 +sudo mkdir -p jaryo +sudo chown admin:users jaryo +cd jaryo +``` + +### 3단계: 소스 코드 클론 📥 + +```bash +# Gitea에서 소스 코드 클론 +git clone http://119.64.1.86:3000/vibsin9322/jaryo.git . + +# 클론 성공 확인 +ls -la +``` + +### 4단계: 의존성 설치 📦 + +```bash +# 기존 node_modules 제거 (있다면) +rm -rf node_modules package-lock.json + +# npm 의존성 설치 +npm install + +# 설치 확인 +ls -la node_modules +``` + +### 5단계: 데이터베이스 초기화 🗄️ + +```bash +# SQLite 데이터베이스 초기화 +npm run init-db + +# 데이터베이스 파일 확인 +ls -la *.db +``` + +### 6단계: 서비스 시작 스크립트 생성 📝 + +```bash +# 시작 스크립트 생성 +cat > start-jaryo.sh << 'EOF' +#!/bin/bash + +# 자료실 서비스 시작 스크립트 +PROJECT_DIR="/volume1/web/jaryo" +SERVICE_PORT="3005" +PID_FILE="$PROJECT_DIR/jaryo.pid" +LOG_FILE="$PROJECT_DIR/jaryo.log" + +# 로그 디렉토리 생성 +mkdir -p "$PROJECT_DIR/logs" + +# 기존 프로세스 확인 및 종료 +if [ -f "$PID_FILE" ]; then + OLD_PID=$(cat "$PID_FILE") + if ps -p "$OLD_PID" > /dev/null; then + echo "기존 서비스 종료 중... (PID: $OLD_PID)" + kill "$OLD_PID" + sleep 2 + fi + rm -f "$PID_FILE" +fi + +# 포트 사용 확인 +if netstat -tulpn | grep ":$SERVICE_PORT " > /dev/null; then + echo "⚠️ 포트 $SERVICE_PORT가 이미 사용 중입니다." + echo "사용 중인 프로세스:" + netstat -tulpn | grep ":$SERVICE_PORT " + exit 1 +fi + +# 서비스 시작 +echo "🚀 자료실 서비스 시작 중..." +cd "$PROJECT_DIR" +PORT="$SERVICE_PORT" nohup node server.js > "$LOG_FILE" 2>&1 & +echo $! > "$PID_FILE" + +sleep 2 + +# 시작 확인 +if ps -p $(cat "$PID_FILE") > /dev/null; then + echo "✅ 자료실 서비스 시작 완료!" + echo "📍 접속 URL: http://119.64.1.86:$SERVICE_PORT" + echo "📋 PID: $(cat "$PID_FILE")" + echo "📄 로그: $LOG_FILE" +else + echo "❌ 서비스 시작 실패" + echo "로그 확인:" + tail -20 "$LOG_FILE" + exit 1 +fi +EOF + +# 실행 권한 부여 +chmod +x start-jaryo.sh +``` + +### 7단계: 중지 스크립트 생성 🛑 + +```bash +# 중지 스크립트 생성 +cat > stop-jaryo.sh << 'EOF' +#!/bin/bash + +# 자료실 서비스 중지 스크립트 +PROJECT_DIR="/volume1/web/jaryo" +PID_FILE="$PROJECT_DIR/jaryo.pid" + +if [ -f "$PID_FILE" ]; then + PID=$(cat "$PID_FILE") + if ps -p "$PID" > /dev/null; then + echo "🛑 자료실 서비스 중지 중... (PID: $PID)" + kill "$PID" + sleep 2 + + # 강제 종료 확인 + if ps -p "$PID" > /dev/null; then + echo "⚡ 강제 종료 중..." + kill -9 "$PID" + fi + + rm -f "$PID_FILE" + echo "✅ 자료실 서비스 중지 완료" + else + echo "⚠️ 프로세스가 이미 종료됨" + rm -f "$PID_FILE" + fi +else + echo "⚠️ PID 파일이 없습니다. 수동으로 프로세스를 확인하세요." + echo "실행 중인 Node.js 프로세스:" + ps aux | grep 'node.*server.js' | grep -v grep +fi +EOF + +# 실행 권한 부여 +chmod +x stop-jaryo.sh +``` + +### 8단계: 서비스 시작 🎬 + +```bash +# 서비스 시작 +./start-jaryo.sh + +# 로그 확인 (별도 터미널에서) +tail -f jaryo.log +``` + +### 9단계: 접속 테스트 🧪 + +**브라우저에서 접속:** +- **메인 페이지**: `http://119.64.1.86:3005` +- **관리자 페이지**: `http://119.64.1.86:3005/admin` + +**명령줄에서 테스트:** +```bash +# 서비스 상태 확인 +curl -s http://119.64.1.86:3005 + +# 프로세스 확인 +ps aux | grep 'node.*server.js' | grep -v grep + +# 포트 확인 +netstat -tulpn | grep :3005 +``` + +## 🔧 서비스 관리 + +### 일상적인 관리 명령어 + +```bash +# 서비스 시작 +/volume1/web/jaryo/start-jaryo.sh + +# 서비스 중지 +/volume1/web/jaryo/stop-jaryo.sh + +# 서비스 재시작 +/volume1/web/jaryo/stop-jaryo.sh && /volume1/web/jaryo/start-jaryo.sh + +# 로그 확인 +tail -f /volume1/web/jaryo/jaryo.log + +# 실시간 로그 보기 +ssh -p 2222 admin@119.64.1.86 'tail -f /volume1/web/jaryo/jaryo.log' +``` + +### 상태 모니터링 + +```bash +# 서비스 상태 스크립트 +cat > status-jaryo.sh << 'EOF' +#!/bin/bash + +PROJECT_DIR="/volume1/web/jaryo" +PID_FILE="$PROJECT_DIR/jaryo.pid" +LOG_FILE="$PROJECT_DIR/jaryo.log" + +echo "=== 자료실 서비스 상태 ===" + +if [ -f "$PID_FILE" ]; then + PID=$(cat "$PID_FILE") + if ps -p "$PID" > /dev/null; then + echo "✅ 서비스 실행 중 (PID: $PID)" + echo "📊 메모리 사용량:" + ps -o pid,ppid,cmd,%mem,%cpu -p "$PID" + echo "" + echo "🌐 포트 상태:" + netstat -tulpn | grep :3005 + else + echo "❌ 서비스 중지됨 (PID 파일 존재하지만 프로세스 없음)" + fi +else + echo "❌ 서비스 중지됨 (PID 파일 없음)" +fi + +echo "" +echo "📄 최근 로그 (최근 5줄):" +if [ -f "$LOG_FILE" ]; then + tail -5 "$LOG_FILE" +else + echo "로그 파일이 없습니다." +fi +EOF + +chmod +x status-jaryo.sh +``` + +## 🔄 자동 시작 설정 (선택사항) + +### DSM 작업 스케줄러 사용 + +1. **DSM 로그인** → **제어판** → **작업 스케줄러** +2. **생성** → **예약된 작업** → **사용자 정의 스크립트** +3. 설정: + - **작업 이름**: Jaryo 자료실 자동 시작 + - **사용자**: root + - **스케줄**: 시스템 부팅 시 + - **스크립트**: `/volume1/web/jaryo/start-jaryo.sh` + +## 🚨 문제 해결 + +### 일반적인 문제들 + +**1. 포트 충돌** +```bash +# 포트 사용 확인 +netstat -tulpn | grep :3005 + +# 다른 포트 사용시 (예: 3006) +PORT=3006 node server.js +``` + +**2. 권한 문제** +```bash +# 디렉토리 권한 수정 +sudo chown -R admin:users /volume1/web/jaryo +chmod -R 755 /volume1/web/jaryo +``` + +**3. Node.js 버전 문제** +```bash +# Node.js 버전 확인 +node --version + +# 최소 요구 버전: v16.0.0 +``` + +**4. 데이터베이스 문제** +```bash +# 데이터베이스 재초기화 +rm -f jaryo.db +npm run init-db +``` + +## 📱 최종 확인 + +배포 완료 후 다음 URL들이 정상 작동하는지 확인: + +- ✅ **메인 페이지**: http://119.64.1.86:3005 +- ✅ **관리자 페이지**: http://119.64.1.86:3005/admin +- ✅ **API 상태**: http://119.64.1.86:3005/api/files +- ✅ **Gitea 저장소**: http://119.64.1.86:3000/vibsin9322/jaryo + +## 🎉 배포 완료! + +시놀로지 NAS에서 자료실 서비스가 성공적으로 실행되고 있습니다. +서비스 관리는 위의 스크립트들을 사용하여 쉽게 할 수 있습니다. \ No newline at end of file