# 서버 백업 체계 구축 및 로그 관리 개선 **날짜**: 2025-07-29 **작업자**: admin@51123 & Claude **관련 시스템**: 백업, 로그 관리, 디스크 최적화 **참조**: 이 NAS는 23/24/NAS 공유 인프라의 일부. 권장 운영안·역할 분리는 [260221_23_24_NAS_게이트웨이_운영구성_정리](../../../../projectStarsAndI/DOCS/journey/research/260221_23_24_NAS_게이트웨이_운영구성_정리.md) 참조. ## 오후 11시 00분 ### 크론잡 및 로그 백업 현황 점검 > 후속 장애 기록: [260226_NAS_192_168_219_51_접속불가_임시백업복구.md](./260226_NAS_192_168_219_51_접속불가_임시백업복구.md) **문제 발견**: - 크론잡은 정상 작동 중 (매일 새벽 4시 cleanup 스크립트 실행) - NAS 마운트 정상 (192.168.219.51, 5.3T 중 1% 사용) - **로그 자동 백업 없음**: HDD의 로그가 NAS로 백업되지 않음 **확인 내용**: ```bash # 크론탭 확인 0 4 * * * /home/admin/scripts/cleanup-server.sh # NAS 백업 디렉토리 구조 /mnt/nas/backup/ ├── archives/ └── current/ ├── config/ ├── gitea/ └── robeing/ ``` ## 오후 11시 10분 ### 주간 서버 백업 스크립트 작성 **목표**: 매주 일요일 새벽 5시 서버 상태 전체 백업 **Sequential Thinking 분석 결과**: - 서버 상태 백업 필요성 확인 - NAS 공간 충분 (5.3T 중 1%) - 재해 복구 및 문제 분석용 백업 필요 **작성한 스크립트**: `/home/admin/scripts/weekly-backup.sh` - 시스템 상태 덤프 (텍스트) - 로그 파일 압축 백업 - 설정 파일 백업 - Git 저장소 상태 기록 - DB 스키마 백업 (데이터 제외) - 12주 보관 정책 (기존 4주에서 변경) **크론탭 등록**: ```bash 0 5 * * 0 /home/admin/scripts/weekly-backup.sh ``` ## 오후 11시 20분 ### Docker 디스크 사용량 정리 **문제**: - Docker Build Cache 19.85GB 사용 - 사용하지 않는 이미지 15.69GB - 사용하지 않는 볼륨 5.04GB **Sequential Thinking으로 위험성 분석**: - `docker system prune -af --volumes` 명령어는 매우 위험 - 볼륨 삭제 시 데이터 손실 위험 - 단계적 접근 필요 **안전한 정리 수행**: ```bash # Build Cache만 정리 (안전) docker builder prune -af # 결과: 19.85GB → 0B # SSD 사용률: 33% → 24% ``` **cleanup 스크립트 개선**: - 매일 Docker 빌드 캐시 정리 추가 - 시스템 로그 2주 이상 정리 추가 - 정리 전 Docker 상태 기록 추가 ## 오후 11시 30분 ### 로그 파일 HDD 이전 **문제 발견**: - nginx, PostgreSQL, Actions Runner 로그가 SSD에 저장 중 - CLAUDE.md 규칙: "모든 로그는 HDD에 저장" - SSD 수명 보호 필요 **Sequential Thinking 분석**: - 로그는 지속적 쓰기 작업으로 SSD 수명 단축 - HDD 916GB 중 1%만 사용 (충분한 공간) - 성능상 로그 쓰기는 HDD로도 충분 **이전 작업**: 1. **nginx 로그 이전**: ```bash sudo systemctl stop nginx sudo mv /var/log/nginx /mnt/hdd/logs/ sudo ln -s /mnt/hdd/logs/nginx /var/log/nginx sudo chown -R www-data:adm /mnt/hdd/logs/nginx sudo systemctl start nginx ``` 2. **Actions Runner 로그 이전**: - 시작 스크립트 작성: `/home/admin/scripts/start-act-runner.sh` - 로그 경로: /tmp → /mnt/hdd/logs/act_runner/ - 기존 로그 파일 이동 완료 **최종 HDD 로그 구조**: ``` /mnt/hdd/logs/ ├── act_runner/ (새로 추가) ├── cleanup/ (기존) ├── company-x/ (기존) └── nginx/ (새로 이동) ``` ## 교훈 1. **백업은 필수**: - 주간 백업으로 서버 상태 추적 가능 - 12주 보관으로 장기 분석 가능 - NAS 공간이 충분할 때 적극 활용 2. **Docker 정리는 신중하게**: - Build Cache는 안전하게 정리 가능 - 볼륨과 이미지는 확인 후 수동 정리 - 자동 정리는 최소한으로 제한 3. **로그는 HDD에**: - SSD 수명 보호가 중요 - 로그 쓰기 성능은 HDD로도 충분 - 심볼릭 링크로 투명하게 처리 4. **curl 사용 주의**: - 외부 도메인 curl 금지 (CLAUDE.md 규칙) - localhost 또는 ss 명령어 사용 5. **단계적 접근**: - 한 번에 모든 것을 변경하지 않음 - 각 단계마다 검증 - 롤백 계획 준비 ## 자정 00분 ### auth-server 로그 타임스탬프 이슈 **문제**: Docker 로그에 시간이 표시되지 않음 **원인 분석**: - `docker logs` 기본 동작은 타임스탬프 미표시 - uvicorn 자체도 타임스탬프를 로그에 포함하지 않음 **해결 방법**: ```bash # 타임스탬프 포함해서 로그 확인 docker logs auth-server --timestamps # Gmail 로그인 시도 발견 2025-07-29T14:54:37 (23:54 KST): Gmail 로그인 시도 2025-07-29T14:55:03 (23:55 KST): OAuth 콜백 완료 ``` **발견 사항**: - IP: 172.21.0.1 (Docker 내부 네트워크) - redirect_uri: http://localhost:5173 (개발 환경) - 누군가 로컬 개발 환경에서 Gmail OAuth 테스트 수행 ## 자정 10분 ### uv 패키지 매니저 관련 오해 정리 **혼동 사항**: uvicorn(ASGI 서버)과 uv(패키지 매니저) 혼동 **명확한 차이**: - **uvicorn**: FastAPI 앱을 실행하는 ASGI 서버 - **uv**: pip 대체 패키지 매니저 (10-100배 빠름) **Docker와 호스트 격리 원칙**: - 호스트에 설치된 소프트웨어는 컨테이너에서 사용 불가 - Docker의 핵심은 "격리된 환경" - 각 컨테이너마다 필요한 소프트웨어 별도 설치 필요 **uv 활용 방안**: ```dockerfile # Dockerfile 개선 예시 RUN pip install uv RUN uv pip install -r requirements.txt # 훨씬 빠른 설치 ``` ## 추가 교훈 6. **로그 확인 시 타임스탬프**: - Docker 로그는 `--timestamps` 옵션 필수 - 시간 기반 분석 시 중요 - nginx 로그는 기본적으로 타임스탬프 포함 7. **Docker 격리 원칙 이해**: - 컨테이너는 호스트와 완전히 격리 - 호스트 설치 프로그램 ≠ 컨테이너에서 사용 가능 - 이식성과 일관성을 위한 설계 8. **패키지 매니저 최적화**: - uv는 빌드 시간 단축에 효과적 - 운영 중인 서비스는 신중하게 적용 - 새 프로젝트나 큰 업데이트 시 도입 검토 --- **작성 완료**: 2025-07-30 00:15