From 175e3fdc42b67dc08fd37ba35b10e8f440f0a708 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Mon, 9 Mar 2026 22:33:15 +0900 Subject: [PATCH] docs: move 51124 migration record into infra --- journey/README.md | 1 + ...727_happybell80_51124서버이전작업.md | 261 ++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100644 journey/troubleshooting/250727_happybell80_51124서버이전작업.md diff --git a/journey/README.md b/journey/README.md index b2ecd27..5f5c3fd 100644 --- a/journey/README.md +++ b/journey/README.md @@ -35,6 +35,7 @@ - [260226 51123 SSH 브루트포스 차단 및 fail2ban 교정](./troubleshooting/260226_51123_SSH_브루트포스_차단_및_fail2ban_교정.md) - [260226 NAS(192.168.219.51) 접속불가 임시 백업 복구](./troubleshooting/260226_NAS_192_168_219_51_접속불가_임시백업복구.md) - [260217 starsandi DNS/nginx/SSL 분리 적용](./troubleshooting/260217_starsandi_dns_nginx_ssl_분리적용.md) +- [250727 51124 서버 이전 작업 및 nginx 프록시 설정](./troubleshooting/250727_happybell80_51124서버이전작업.md) - [51123 구 IP 하드코딩과 런타임 SSOT 불일치 이슈](./troubleshooting/260309_51123_구IP하드코딩_런타임SSOT불일치_이슈.md) - [24서버 우분투 터미널 불가, 네트워크 대역 오류, python3-apt 복구 기록](./troubleshooting/260309_24서버_우분투터미널불가_네트워크대역오류_python3apt복구.md) - [Gitea git credential helper 표준화](./troubleshooting/260309_gitea_git_credential_helper_표준화.md) diff --git a/journey/troubleshooting/250727_happybell80_51124서버이전작업.md b/journey/troubleshooting/250727_happybell80_51124서버이전작업.md new file mode 100644 index 0000000..ec479db --- /dev/null +++ b/journey/troubleshooting/250727_happybell80_51124서버이전작업.md @@ -0,0 +1,261 @@ +# 51124 서버 이전 작업 및 nginx 프록시 설정 + +**날짜**: 2025-07-27 +**작업자**: happybell80 & Claude +**관련 서버**: 51123 (nginx 프록시), 51124 (로빙 컨테이너 호스팅) + +## 배경 + +로빙 프로젝트의 확장을 위해 더 강력한 CPU를 가진 51124 서버로 로빙 컨테이너들을 이전하는 작업을 진행했습니다. +- 51123 서버: nginx 프록시 및 기타 유틸리티 서비스 담당 +- 51124 서버: 모든 로빙(rb8001, rb10408, rb10508) 및 스킬 서비스 실행 + +## 오전 1시 00분 - 51124 서버 초기 환경 구축 + +### 서버 정보 +- 서버 ID: 51124 +- IP: 192.168.219.52 +- SSH 포트: 51124 (커스텀 포트) +- 역할: Docker 컨테이너 호스팅 + +### Docker 환경 확인 및 설정 +```bash +# Docker 버전 확인 (v28.3.2 이미 설치됨) +docker --version + +# docker-compose 추가 설치 +sudo apt update +sudo apt install -y docker-compose + +# 프로젝트 구조 생성 +cd ~ +mkdir -p ivada_project +cd ivada_project +mkdir -p rb8001 rb10408_test rb10508_test skill_email skill_news +``` + +### Gitea 저장소 클론 +```bash +git clone https://happybell80:[TOKEN]@git.ro-being.com/ivada_Ro-being/rb10508_test.git +cd rb10508_test + +# Git 설정 +git config --global user.name "happybell80" +git config --global user.email "happybell80@ro-being.com" +``` + +### 환경변수 설정 +`.env` 파일 생성: +- Slack API 토큰 (BOT_TOKEN, SIGNING_SECRET, APP_TOKEN) +- AI API 키 (OpenAI, Gemini, Perplexity) +- Database 설정 +- JWT 설정 + +## 오전 1시 15분 - 컨테이너 권한 문제 해결 + +### 문제 발생 +```bash +docker ps +# STATUS: Restarting (1) X seconds ago + +docker logs rb10508_test +# PermissionError: [Errno 13] Permission denied: '/code/logs/rb10508_test_app.log' +``` + +### 원인 +Docker 컨테이너 내부의 appuser가 로그 디렉토리에 쓰기 권한이 없음 + +### 해결 방법 +```bash +# 컨테이너 중지 +docker-compose down + +# 필요한 디렉토리 생성 및 권한 설정 +mkdir -p logs chroma_db +sudo chmod 777 logs chroma_db + +# 컨테이너 재시작 +docker-compose up -d +``` + +### 결과 +```bash +docker ps | grep rb10508 +# STATUS: Up X minutes (healthy) + +curl http://localhost:10508/health +# {"status":"healthy"} +``` + +## 오전 1시 30분 - SSH 키 교환 작업 + +### 51124 서버 측 작업 +```bash +# SSH 디렉토리 생성 +mkdir -p ~/.ssh +chmod 700 ~/.ssh + +# SSH 키 생성 (배포용) +ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_deploy -N "" +``` + +### 51123 서버 측 작업 +```bash +# SSH 키 생성 +ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_51123_to_51124 -N "" -C "51123-to-51124-deploy" + +# 생성된 공개키를 51124 서버의 authorized_keys에 추가 +# (51124 서버에서 실행) +echo "[51123 공개키 내용]" >> ~/.ssh/authorized_keys +chmod 600 ~/.ssh/authorized_keys + +# SSH 연결 테스트 +ssh -p 51124 -i ~/.ssh/id_rsa_51123_to_51124 -o StrictHostKeyChecking=no admin@192.168.219.52 "echo '연결 성공!'" +``` + +### Gitea Actions 시크릿 설정 +Organization 레벨에서 다음 시크릿 등록: +- SSH_PRIVATE_KEY_51124: 51123 서버의 개인키 +- SSH_HOST_51124: 192.168.219.52 + +## 오전 2시 00분 - nginx 프록시 설정 및 문제 해결 + +### 초기 nginx 설정 +```nginx +# 51123 서버의 nginx 설정에 추가 +location /rb10508/ { + proxy_pass http://192.168.219.52:10508/; + 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; +} +``` + +### 문제 1: location 우선순위 문제 +**증상**: `/rb10508/health` 요청 시 API 응답 대신 React 프론트엔드 HTML 반환 + +**원인**: `location /` 블록의 `try_files`가 모든 요청을 처리 + +**해결**: `^~` 플래그 추가로 우선순위 강제 +```nginx +location ^~ /rb10508/ { + proxy_pass http://192.168.219.52:10508/; + # ... 나머지 설정 +} +``` + +### 문제 2: HTTP/HTTPS 서버 블록 분리 문제 +**증상**: HTTP localhost 요청 시 여전히 프론트엔드 반환 + +**원인 분석**: +```bash +# HTTP localhost → 프론트엔드 반환 +curl http://localhost/rb10508/health # HTML 반환 + +# HTTPS localhost → 정상 작동 +curl -k https://localhost/rb10508/health # {"status":"healthy"} +``` + +**근본 원인**: +- 포트 80 default_server 블록에는 프록시 설정 없음 +- 포트 443 ro-being.com 블록에만 프록시 설정 있음 +- localhost HTTP 요청은 첫 번째 블록이 처리 + +### 해결 방안 검토 +| 옵션 | 내용 | 장점 | 단점 | +|------|------|------|------| +| 1 | 첫 번째 server 블록에도 프록시 설정 추가 | 로컬 HTTP 요청 동작 | 설정 중복 | +| 2 | 모든 HTTP를 HTTPS로 리다이렉트 | 보안 강화, 표준 방식 | 로컬 개발 시 인증서 필요 | +| 3 | default_server 최소화 | 설정 명확성 | 로컬 테스트 불편 | + +## 오전 2시 30분 - Gitea Actions 워크플로우 수정 + +### 문제: SSH 키 처리 방식 +초기 워크플로우에서 SSH 키를 직접 전달하여 오류 발생 + +### 해결: SSH 키를 파일로 저장 +```yaml +- name: Setup SSH + run: | + echo "🔑 Setting up SSH..." + mkdir -p ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY_51124 }}" > ~/.ssh/deploy_key + chmod 600 ~/.ssh/deploy_key + ssh-keyscan -H ${{ secrets.SSH_HOST_51124 }} >> ~/.ssh/known_hosts + +- name: Deploy to 51124 Server + run: | + ssh -i ~/.ssh/deploy_key admin@${{ secrets.SSH_HOST_51124 }} << 'EOF' + # 배포 스크립트 + EOF + +- name: Cleanup SSH + run: | + rm -f ~/.ssh/deploy_key +``` + +## 최종 상태 및 결과 + +### ✅ 완료된 작업 +1. **51124 서버 환경 구축** + - Docker & docker-compose 설치 및 설정 + - 프로젝트 디렉토리 구조 생성 + - 환경변수 설정 + +2. **컨테이너 정상화** + - 권한 문제 해결 (chmod 777) + - 헬스체크 정상 응답 + +3. **네트워크 설정** + - 51123 → 51124 연결 확인 + - nginx 프록시 설정 (HTTPS 정상 작동) + +4. **자동 배포 준비** + - SSH 키 교환 완료 + - Gitea Actions 워크플로우 수정 + - Organization 시크릿 설정 + +### 📊 현재 작동 상태 +- ✅ 51124 컨테이너: 정상 작동 (healthy) +- ✅ HTTPS 프록시: 정상 (`https://ro-being.com/rb10508/health`) +- ✅ SSH 연결: 정상 (포트 51124) +- ⚠️ HTTP localhost: 추가 설정 필요 + +### 🔄 배포 플로우 +``` +로컬 push → Gitea Actions (51123) → SSH (포트 51124) → 51124 배포 +→ Docker 컨테이너 실행 → nginx 프록시 (51123) → 사용자 접속 +``` + +## 교훈 + +1. **Docker 권한 관리** + - 컨테이너가 쓰기 권한이 필요한 디렉토리는 미리 생성하고 적절한 권한 설정 필수 + - `network_mode: host` 사용 시 포트 매핑 불필요 + +2. **nginx location 매칭 이해** + - server 블록별로 location 설정이 독립적 + - `^~` 플래그로 우선순위 제어 가능 + - default_server의 영향 범위 고려 필요 + +3. **SSH 자동화 설정** + - Gitea Actions에서 SSH 키는 파일로 저장 후 사용 + - 커스텀 SSH 포트 사용 시 명시적 지정 필요 + - authorized_keys 권한은 반드시 600 + +4. **트러블슈팅 접근법** + - 로그 우선 확인 (`docker logs`, nginx 액세스 로그) + - 네트워크 경로별 테스트 (localhost vs 도메인, HTTP vs HTTPS) + - 권한 문제는 대부분 디렉토리/파일 권한으로 해결 + +5. **아키텍처 설계** + - 프록시 서버와 애플리케이션 서버 분리의 장점 확인 + - 각 서버의 역할을 명확히 정의하면 관리 용이 + +## 다음 단계 + +1. nginx HTTP 처리 방식 결정 (옵션 2 추천: HTTPS 리다이렉트) +2. 나머지 로빙 서비스 (rb8001, rb10408) 이전 +3. PostgreSQL 연결 설정 확인 +4. 프로덕션 환경변수 실제값 설정