DOCS/troubleshooting/250731_로그저장소_SSHFS설정과_템플릿해결책.md
happybell80 725ad0876c fix: 문서 파일 실행 권한 제거
- 모든 .md, .html 파일 권한을 644로 정상화
- .gitignore 파일 권한도 644로 수정
- 문서 파일에 실행 권한은 불필요하고 보안상 바람직하지 않음
- deprecated 아이디어 폴더 생성 및 레벨별 UI 변경 아이디어 이동
2025-08-18 00:37:51 +09:00

5.2 KiB

250731 로그 저장소 SSHFS 설정과 템플릿 해결책

문제 상황

초기 문제

  • rb10508 등 로빙 컨테이너들의 로그가 SSD에 저장되고 있음
  • CLAUDE.md에 명시된 대로 로그는 HDD(/mnt/hdd/logs/)에 저장되어야 함
  • 51123 서버에 HDD가 있고, 51124 서버에서 접근 필요

SSHFS가 적합한 이유

  1. 이미 SSH 키 설정 완료 - 추가 인증 설정 불필요
  2. 다양한 로그 형태 지원 - stdout/stderr뿐만 아니라 파일 로그도 저장
  3. 설정 최소화 - 51123 서버는 디렉토리만 만들면 됨
  4. 투명한 작동 - 컨테이너는 로컬 디렉토리처럼 사용

실제 설정 과정

오후 10시 48분 - 51123 서버 작업

# 1. 51124서버 전용 로그 디렉토리 생성
sudo mkdir -p /mnt/hdd/logs/51124-server
sudo chown admin:admin /mnt/hdd/logs/51124-server

# 2. 51124서버의 SSH 공개키 추가
# 51124 서버의 ~/.ssh/id_rsa_deploy.pub 내용을 ~/.ssh/authorized_keys에 추가

# 3. cleanup 스크립트에 51124 서버 로그 정리 추가
# 51124 서버 로그도 30일 후 자동 정리되도록 설정

오후 10시 50분 - 51124 서버 작업

# 1. SSHFS 설치
sudo apt install -y sshfs

# 2. 마운트 포인트 생성
sudo mkdir -p /mnt/51123logs

# 3. 마운트 시도 (초기 실패 - SSH 키 문제)
sudo sshfs -o allow_other,reconnect admin@192.168.219.45:/mnt/hdd/logs/51124-server /mnt/51123logs -p 51123

오후 10시 51분 - SSHFS 마운트 성공

# 1. SSH 키 파일 지정하여 마운트
sshfs -o IdentityFile=/home/admin/.ssh/id_rsa_deploy admin@192.168.219.45:/mnt/hdd/logs/51124-server /mnt/51123logs -p 51123

# 2. 마운트 확인
df -h /mnt/51123logs
# 결과: 916G 크기의 HDD가 성공적으로 마운트됨

# 3. 테스트
mkdir -p /mnt/51123logs/rb10508
echo "SSHFS mount test - $(date)" > /mnt/51123logs/rb10508/test.log

권한 문제의 딜레마

발견된 문제점

  1. SSHFS 마운트: admin(UID 1000)으로 마운트됨
  2. Docker 컨테이너: UID 999로 실행
  3. 권한 불일치: Docker가 디렉토리 생성 시 실패

검토한 해결방안들

1. 심볼릭 링크

ln -s /mnt/51123logs/rb10508 logs
  • 간단하지만 로빙마다 수동 작업 필요

2. docker-compose.yml 직접 수정

volumes:
  - /mnt/51123logs/rb10508:/code/logs:rw
  • 명확하지만 역시 로빙마다 수정 필요

3. SSHFS UID 매핑

sudo sshfs -o allow_other,uid=999,gid=999 ...
  • root 권한 필요, 복잡함

4. 사전 권한 설정

sudo chown -R 999:999 /mnt/hdd/logs/51124-server/
  • 여전히 디렉토리는 수동 생성 필요

최종 해결책: 템플릿 방식

1. docker-compose.yml 템플릿화

services:
  app:
    volumes:
      - ${LOG_ROOT:-./logs}/${ROBING_NAME:-${COMPOSE_PROJECT_NAME}}:/code/logs:rw

2. .env.template 생성

# .env.template
LOG_ROOT=/mnt/51123logs
ROBING_NAME=__ROBING__

3. 배포 자동화 스크립트

#!/bin/bash
# deploy_robing.sh rb10508_test
set -e
ROBING=$1
LOG_ROOT=/mnt/51123logs

sudo mkdir -p ${LOG_ROOT}/${ROBING}
sudo chown 999:docker ${LOG_ROOT}/${ROBING}

cp .env.template .env
sed -i "s/__ROBING__/${ROBING}/" .env

docker compose up -d

4. CI/CD 통합 (Gitea Actions)

- name: Create log dir
  run: |
    ssh admin@192.168.219.52 "sudo mkdir -p /mnt/51123logs/${{ env.PROJECT }}"
    ssh admin@192.168.219.52 "sudo chown 999:docker /mnt/51123logs/${{ env.PROJECT }}"
- name: Deploy
  run: |
    sed -i "s/__ROBING__/${{ env.PROJECT }}/" .env
    docker compose up -d

5. 기존 로빙 마이그레이션

for r in rb8001 rb10408 rb10508_test; do
  sudo mkdir -p /mnt/51123logs/$r
  sudo chown 999:docker /mnt/51123logs/$r
  mv /home/admin/ivada_project/$r/logs/* /mnt/51123logs/$r/ 2>/dev/null || true
done

템플릿 방식의 장점

  1. 수동 작업 제로: 스크립트 한 번 실행으로 끝
  2. 환경별 자동 전환: 로컬에선 ./logs, 서버에선 /mnt/51123logs
  3. 확장성: 새 로빙 추가 시 이름만 변경
  4. CI/CD 통합 가능: 완전 자동화

교훈

  1. 서버 간 통신은 항상 SSH 키 먼저: 51123-51124 간 SSH 키가 설정되어 있지 않았음
  2. 마운트 포인트 이름 규칙: /mnt/51123logs처럼 연결하는 서버 번호를 명시하면 관리가 편함
  3. SSHFS vs NFS: 간단한 로그 저장용도는 SSHFS가 설정이 훨씬 간편함
  4. SSH 키 파일 명시: -o IdentityFile 옵션으로 특정 키 파일 지정 필요
  5. 처음부터 템플릿 설계: 하드코딩은 나중에 고통
  6. 권한 문제는 미리 해결: Docker UID/GID 차이 주의
  7. 자동화는 필수: 수동 작업은 실수의 원인

남은 작업

  1. 기존 로빙들 마이그레이션
  2. 배포 스크립트 작성
  3. Gitea Actions 워크플로우 수정
  4. 로그 로테이션 정책 설정
  5. 영구 마운트 설정 (/etc/fstab)

작성일: 2025-07-31 작성자: Claude (51123 서버 - SSH 키 등록 및 디렉토리 생성) Claude (51124 서버 - SSHFS 설정 및 마운트) 로컬 개발자 (템플릿 해결책 제안) 주제: 로그 저장소 중앙화를 위한 SSHFS 설정과 템플릿 기반 자동화