# App Master Backend

통합 백엔드 서버 - 전자서명, 명함, QR 코드 관리 API

## 📋 개요

이 프로젝트는 다음 앱들의 백엔드 API를 제공합니다:
- 전자서명 앱
- 명함 관리 앱
- QR 코드 생성/스캔 앱 (QRyQuick)

## 🚀 Ubuntu 서버 배포 가이드

### 1. 서버 환경 준비

```bash
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y

# Node.js 18.x 설치
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# PM2 글로벌 설치
sudo npm install -g pm2

# Git 설치 (필요시)
sudo apt install git -y
```

### 2. MySQL 데이터베이스 설정

```bash
# MySQL 설치
sudo apt install mysql-server -y

# MySQL 보안 설정
sudo mysql_secure_installation

# MySQL 접속
sudo mysql -u root -p

# 데이터베이스 및 사용자 생성
CREATE DATABASE app_master_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON app_master_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

### 3. 프로젝트 배포

```bash
# 홈 디렉토리로 이동
cd ~

# Git 클론 (또는 파일 업로드)
git clone https://github.com/your-repo/app-master-back.git
# 또는 scp로 파일 업로드:
# scp -r ./app-master-back user@server:~/

# 프로젝트 디렉토리로 이동
cd app-master-back

# 의존성 설치
npm install

# 환경변수 파일 생성
cp .env.example .env
```

### 4. 환경변수 설정

`.env` 파일을 편집하여 다음 내용을 설정:

```bash
nano .env
```

```env
# Server Configuration
PORT=5001
NODE_ENV=production

# MySQL Database Configuration
DB_HOST=officialsite.kr
DB_USER=admin
DB_PASSWORD=dlgks~123
DB_PORT=23306
DB_NAME=app_master

# CORS Configuration
CORS_ORIGIN=*

# Upload Configuration
MAX_FILE_SIZE=10mb
UPLOAD_DIR=./uploads
```

### 5. 데이터베이스 초기화

```bash
# 개발 모드로 한 번 실행하여 테이블 생성
NODE_ENV=development npm start

# Ctrl+C로 중지 후 다시 프로덕션 모드로 설정
```

### 6. PM2로 서비스 시작

```bash
# PM2 설정 파일 생성
cat > ecosystem.config.js << 'EOF'
module.exports = {
  apps: [{
    name: 'app-master-backend',
    script: 'server.js',
    instances: 1,
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'development',
      PORT: 5001
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 5001
    },
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_file: './logs/combined.log',
    time: true,
    max_memory_restart: '1G',
    restart_delay: 4000,
    max_restarts: 10,
    min_uptime: '10s'
  }]
};
EOF

# 로그 디렉토리 생성
mkdir -p logs

# PM2로 앱 시작
pm2 start ecosystem.config.js --env production

# PM2 상태 확인
pm2 status

# 로그 확인
pm2 logs app-master-backend

# PM2 자동 시작 설정
pm2 startup
pm2 save
```

### 7. 방화벽 설정

```bash
# UFW 방화벽 활성화
sudo ufw enable

# 필요한 포트 허용
sudo ufw allow 22      # SSH
sudo ufw allow 80      # HTTP
sudo ufw allow 443     # HTTPS
sudo ufw allow 3000    # 백엔드 API

# 방화벽 상태 확인
sudo ufw status
```

### 8. Nginx 리버스 프록시 설정 (선택사항)

```bash
# Nginx 설치
sudo apt install nginx -y

# Nginx 설정 파일 생성
sudo nano /etc/nginx/sites-available/app-master-backend
```

```nginx
server {
    listen 80;
    server_name your-domain.com;  # 또는 서버 IP

    location /api {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
```

```bash
# 설정 활성화
sudo ln -s /etc/nginx/sites-available/app-master-backend /etc/nginx/sites-enabled/

# Nginx 설정 테스트
sudo nginx -t

# Nginx 시작
sudo systemctl start nginx
sudo systemctl enable nginx
```

### 9. SSL 인증서 설정 (Let's Encrypt)

```bash
# Certbot 설치
sudo apt install certbot python3-certbot-nginx -y

# SSL 인증서 발급
sudo certbot --nginx -d your-domain.com

# 자동 갱신 확인
sudo certbot renew --dry-run
```

## 🔧 PM2 관리 명령어

```bash
# 앱 시작
pm2 start ecosystem.config.js --env production

# 앱 중지
pm2 stop app-master-backend

# 앱 재시작
pm2 restart app-master-backend

# 앱 삭제
pm2 delete app-master-backend

# 로그 보기
pm2 logs app-master-backend

# 실시간 모니터링
pm2 monit

# 프로세스 상태
pm2 status

# 메모리 사용량 확인
pm2 show app-master-backend
```

## 📊 모니터링 및 로그

```bash
# PM2 로그 위치
# - Error: ./logs/err.log
# - Output: ./logs/out.log
# - Combined: ./logs/combined.log

# 실시간 로그 보기
tail -f logs/combined.log

# 시스템 리소스 모니터링
pm2 monit

# 서버 상태 확인
pm2 status
```

## 🌐 API 엔드포인트

서버가 정상적으로 실행되면 다음 주소로 API에 접근할 수 있습니다:

- **Base URL**: `http://your-server-ip:3000/api` 또는 `https://your-domain.com/api`
- **QR Codes**: `/api/qr-codes`
- **Business Cards**: `/api/business-cards`
- **Signatures**: `/api/signatures`

## 🔍 문제 해결

### 포트 3000이 이미 사용중인 경우:
```bash
# 포트 사용 프로세스 확인
sudo lsof -i :3000

# 프로세스 종료
sudo kill -9 PID
```

### 데이터베이스 연결 오류:
```bash
# MySQL 서비스 상태 확인
sudo systemctl status mysql

# MySQL 재시작
sudo systemctl restart mysql
```

### PM2 프로세스 문제:
```bash
# PM2 프로세스 모두 중지
pm2 kill
 
# PM2 재시작
pm2 resurrect
```

## 📝 주의사항

1. **보안**: `.env` 파일에 민감한 정보가 포함되어 있으므로 권한 설정 주의
2. **백업**: 정기적으로 데이터베이스 백업 수행
3. **업데이트**: 정기적으로 의존성 및 시스템 업데이트
4. **모니터링**: PM2 모니터링을 통해 서버 상태 지속적으로 확인

## 📞 지원

문제가 발생하면 다음을 확인하세요:
1. PM2 로그: `pm2 logs app-master-backend`
2. 시스템 로그: `sudo journalctl -u mysql`
3. 네트워크 상태: `netstat -tulpn | grep :3000`

---
**개발**: 브로시스터
**포트**: 3000
**환경**: Node.js + Express + MySQL
**프로세스 관리**: PM2