DOCS/troubleshooting/250731_로그저장소_고민과_해결방안.md
Claude-51124 d4ec12e2eb Add: 로그 저장소 고민과 해결방안 정리
- SSHFS 설정부터 권한 문제까지 전체 고민 과정 정리
- 심볼릭 링크, 직접 마운트 등 다양한 방안 검토
- 최종 해결책: 템플릿 기반 자동화 방식
- 로컬 개발자와의 논의 내용 포함
2025-07-31 23:16:52 +09:00

2.9 KiB

250731 로그 저장소 고민과 해결방안

문제 상황

초기 문제

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

검토한 방안들

1. SSHFS 마운트 (채택)

  • 51123 서버의 HDD를 51124 서버에 마운트
  • /mnt/51123logs에 916GB 공간 확보
  • SSH 키 인증 필요

2. 심볼릭 링크

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

3. docker-compose.yml 직접 수정

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

권한 문제의 딜레마

문제점

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

시도한 해결책들

1. SSHFS UID 매핑

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

2. 사전 권한 설정

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

3. 로빙별 폴더 없이?

  • 로그 파일이 한 곳에 섞여서 관리 어려움

최종 해결책: 템플릿 방식

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에서 자동으로:

  • SSH로 디렉토리 생성
  • 권한 설정
  • 환경변수 치환
  • 배포

장점

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

교훈

  1. 처음부터 템플릿 설계: 하드코딩은 나중에 고통
  2. 권한 문제는 미리 해결: Docker UID/GID 차이 주의
  3. 간단한 해결책부터: SSHFS가 NFS보다 설정 간편
  4. 자동화는 필수: 수동 작업은 실수의 원인

남은 작업

  1. 기존 로빙들 마이그레이션
  2. 배포 스크립트 작성
  3. Gitea Actions 워크플로우 수정
  4. 로그 로테이션 정책 설정

작성일: 2025-07-31 작성자: Claude (51124 서버) & 로컬 개발자 주제: 로그 저장소 중앙화 고민과 템플릿 기반 해결책