Skip to content

Claude Code 클라우드 서버 배포 가이드

이 가이드는 클라우드 서버에 VitePress 프로젝트를 배포하고 PM2를 사용하여 프로세스를 관리하며, SSH 연결이 끊어진 후에도 서비스가 계속 실행되도록 하는 방법을 자세히 설명합니다.

🛠 환경 요구사항

  • 운영 체제: Linux (Ubuntu/CentOS)
  • Node.js: v22.11.0 (/www/server/nodejs/v22.11.0/bin에 설치됨)
  • PM2: 프로세스 관리자
  • 메모리: 최소 512MB
  • 저장 공간: 최소 1GB 사용 가능한 공간

📋 배포 단계

1. 서버 환경 구성

1.1 Node.js 환경 변수 구성

bash
# ~/.bashrc 또는 ~/.profile에 추가
echo 'export PATH=$PATH:/www/server/nodejs/v22.11.0/bin' >> ~/.bashrc
source ~/.bashrc

# Node.js 버전 확인
node --version
npm --version

1.2 프로젝트 디렉터리 생성

bash
# 프로젝트 디렉터리 생성
mkdir -p /www/wwwroot/claudecode
cd /www/wwwroot/claudecode

2. 프로젝트 파일 업로드

2.1 SCP를 사용한 업로드 (권장)

bash
# 로컬에서 실행 (your-server-ip를 실제 IP로 교체)
scp -r /c:/Users/PC/Desktop/claudecode.blueshirtmap.com_eN7Pt/* root@your-server-ip:/www/wwwroot/claudecode/

2.2 Git 클론 사용 (Git 저장소가 있는 경우)

bash
# 서버에서 실행
git clone https://github.com/your-username/claudecode.git .

3. 프로젝트 의존성 설치

bash
# 프로젝트 디렉터리로 이동
cd /www/wwwroot/claudecode

# 프로젝트 의존성 설치
npm install

# 권한 문제가 발생하는 경우, 다음 명령 사용
npm install --unsafe-perm

4. 프로덕션 버전 빌드

bash
# 프로젝트 빌드
npm run docs:build

# 빌드 결과 확인
ls -la .vitepress/dist/

5. PM2 설치 및 구성

5.1 PM2 전역 설치

bash
npm install -g pm2

# 설치 확인
pm2 --version

5.2 PM2 구성 파일 생성

bash
# PM2 구성 파일 생성
cat > ecosystem.config.js << 'EOF'
module.exports = {
  apps: [
    {
      name: 'claudecode-docs',
      script: 'npm',
      args: 'run docs:preview',
      cwd: '/www/wwwroot/claudecode',
      instances: 1,
      exec_mode: 'fork',
      env: {
        NODE_ENV: 'production',
        PORT: 4173
      },
      error_file: '/www/wwwroot/claudecode/logs/err.log',
      out_file: '/www/wwwroot/claudecode/logs/out.log',
      log_file: '/www/wwwroot/claudecode/logs/combined.log',
      time: true,
      restart_delay: 1000,
      max_restarts: 5,
      min_uptime: '10s',
      max_memory_restart: '1G',
      watch: false,
      ignore_watch: ['node_modules', 'logs', '.git']
    }
  ]
}
EOF

5.3 로그 디렉터리 생성

bash
mkdir -p /www/wwwroot/claudecode/logs

6. 서비스 시작

6.1 PM2를 사용하여 프로젝트 시작

bash
# 서비스 시작
pm2 start ecosystem.config.js

# 서비스 상태 확인
pm2 status

# 로그 확인
pm2 logs claudecode-docs

6.2 PM2 자동 시작 설정

bash
# PM2 구성 저장
pm2 save

# 자동 시작 설정
pm2 startup
# 위 명령의 출력 명령 실행 (일반적으로 sudo 명령)

7. 리버스 프록시 구성 (선택사항)

도메인을 사용하여 액세스해야 하는 경우 Nginx 리버스 프록시를 구성할 수 있습니다:

7.1 Nginx 구성 예제

nginx
server {
    listen 80;
    server_name claudecode.blueshirtmap.com;
    
    location / {
        proxy_pass http://localhost:4173;
        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;
        
        # 정적 파일 캐싱
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
            proxy_pass http://localhost:4173;
        }
    }
}

8. 배포 검증

8.1 서비스 상태 확인

bash
# PM2 상태 확인
pm2 status

# 프로세스 세부 정보 확인
pm2 show claudecode-docs

# 실시간 로그 확인
pm2 logs claudecode-docs --lines 50

8.2 웹사이트 접근 테스트

bash
# 로컬 테스트
curl -I http://localhost:4173

# 원격 테스트 (실제 IP로 교체)
curl -I http://your-server-ip:4173

🔧 일반적인 PM2 관리 명령

기본 명령

bash
# 모든 프로세스 확인
pm2 list

# 서비스 재시작
pm2 restart claudecode-docs

# 서비스 중지
pm2 stop claudecode-docs

# 서비스 삭제
pm2 delete claudecode-docs

# 구성 다시 로드
pm2 reload claudecode-docs

로그 관리

bash
# 로그 확인
pm2 logs claudecode-docs

# 로그 지우기
pm2 flush claudecode-docs

# 실시간 로그
pm2 logs claudecode-docs --lines 100 -f

모니터링 명령

bash
# 실시간 모니터링
pm2 monit

# 메모리 사용량 확인
pm2 show claudecode-docs

🚀 성능 최적화 제안

1. 정적 파일 배포 (권장)

bash
# Nginx를 사용하는 경우 정적 파일을 직접 배포할 수 있음
cp -r .vitepress/dist/* /www/wwwroot/claudecode-static/

2. Gzip 압축 활성화

nginx
# Nginx 구성에 추가
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;

3. PM2 구성 조정

javascript
// 서버 성능에 따라 조정
instances: 'max',  // 모든 CPU 코어 사용
max_memory_restart: '500M',  // 사용 가능한 메모리에 따라 조정

🛡️ 보안 구성

1. 방화벽 구성

bash
# 필요한 포트 열기
ufw allow 22    # SSH
ufw allow 80    # HTTP
ufw allow 443   # HTTPS
ufw allow 4173  # VitePress (직접 액세스하는 경우)

2. 프로세스 권한

bash
# 전용 사용자 생성 (선택사항)
useradd -m -s /bin/bash claudecode
chown -R claudecode:claudecode /www/wwwroot/claudecode

📊 모니터링 및 유지보수

1. 정기 백업

bash
# 백업 스크립트 생성
cat > /root/backup-claudecode.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
tar -czf /backup/claudecode_$DATE.tar.gz /www/wwwroot/claudecode
find /backup -name "claudecode_*.tar.gz" -mtime +7 -delete
EOF

chmod +x /root/backup-claudecode.sh

# 예약 작업에 추가
crontab -e
# 추가: 0 2 * * * /root/backup-claudecode.sh

2. 로그 순환

bash
# logrotate 구성
cat > /etc/logrotate.d/claudecode << 'EOF'
/www/wwwroot/claudecode/logs/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        pm2 reloadLogs
    endscript
}
EOF

🐛 일반적인 문제 해결

1. 포트 점유

bash
# 포트 점유 확인
netstat -tlnp | grep 4173
lsof -i :4173

# 점유 프로세스 종료
kill -9 <PID>

2. 권한 문제

bash
# 권한 수정
chown -R $USER:$USER /www/wwwroot/claudecode
chmod -R 755 /www/wwwroot/claudecode

3. 메모리 부족

bash
# 메모리 사용량 확인
free -h
pm2 show claudecode-docs

# 서비스 재시작으로 메모리 해제
pm2 restart claudecode-docs

4. 빌드 실패

bash
# 캐시 정리 후 재빌드
rm -rf node_modules package-lock.json
npm cache clean --force
npm install
npm run docs:build

📞 배포 후 확인 체크리스트

  • [ ] ✅ Node.js 환경이 올바르게 구성됨
  • [ ] ✅ 프로젝트 파일이 성공적으로 업로드됨
  • [ ] ✅ 의존성 설치 완료
  • [ ] ✅ 프로젝트 빌드 성공
  • [ ] ✅ PM2가 정상적으로 실행됨
  • [ ] ✅ 서비스에 정상적으로 액세스 가능
  • [ ] ✅ 로그 출력이 정상임
  • [ ] ✅ 자동 시작 설정 완료
  • [ ] ✅ 리버스 프록시 구성 (필요한 경우)
  • [ ] ✅ 방화벽 및 보안 구성

위 단계를 완료하면 Claude Code 문서 웹사이트가 클라우드 서버에서 안정적으로 실행되며, SSH 연결이 끊어져도 서비스에 영향을 주지 않습니다.