- 모든 .md, .html 파일 권한을 644로 정상화 - .gitignore 파일 권한도 644로 수정 - 문서 파일에 실행 권한은 불필요하고 보안상 바람직하지 않음 - deprecated 아이디어 폴더 생성 및 레벨별 UI 변경 아이디어 이동
5.8 KiB
5.8 KiB
서버 백업 체계 구축 및 로그 관리 개선
날짜: 2025-07-29
작업자: admin@51123 & Claude
관련 시스템: 백업, 로그 관리, 디스크 최적화
오후 11시 00분
크론잡 및 로그 백업 현황 점검
문제 발견:
- 크론잡은 정상 작동 중 (매일 새벽 4시 cleanup 스크립트 실행)
- NAS 마운트 정상 (192.168.219.51, 5.3T 중 1% 사용)
- 로그 자동 백업 없음: HDD의 로그가 NAS로 백업되지 않음
확인 내용:
# 크론탭 확인
0 4 * * * /home/admin/scripts/cleanup-server.sh
# NAS 백업 디렉토리 구조
/mnt/nas/backup/
├── archives/
└── current/
├── config/
├── gitea/
└── robing/
오후 11시 10분
주간 서버 백업 스크립트 작성
목표: 매주 일요일 새벽 5시 서버 상태 전체 백업
Sequential Thinking 분석 결과:
- 서버 상태 백업 필요성 확인
- NAS 공간 충분 (5.3T 중 1%)
- 재해 복구 및 문제 분석용 백업 필요
작성한 스크립트: /home/admin/scripts/weekly-backup.sh
- 시스템 상태 덤프 (텍스트)
- 로그 파일 압축 백업
- 설정 파일 백업
- Git 저장소 상태 기록
- DB 스키마 백업 (데이터 제외)
- 12주 보관 정책 (기존 4주에서 변경)
크론탭 등록:
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명령어는 매우 위험- 볼륨 삭제 시 데이터 손실 위험
- 단계적 접근 필요
안전한 정리 수행:
# 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로도 충분
이전 작업:
- nginx 로그 이전:
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
- 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/ (새로 이동)
교훈
-
백업은 필수:
- 주간 백업으로 서버 상태 추적 가능
- 12주 보관으로 장기 분석 가능
- NAS 공간이 충분할 때 적극 활용
-
Docker 정리는 신중하게:
- Build Cache는 안전하게 정리 가능
- 볼륨과 이미지는 확인 후 수동 정리
- 자동 정리는 최소한으로 제한
-
로그는 HDD에:
- SSD 수명 보호가 중요
- 로그 쓰기 성능은 HDD로도 충분
- 심볼릭 링크로 투명하게 처리
-
curl 사용 주의:
- 외부 도메인 curl 금지 (CLAUDE.md 규칙)
- localhost 또는 ss 명령어 사용
-
단계적 접근:
- 한 번에 모든 것을 변경하지 않음
- 각 단계마다 검증
- 롤백 계획 준비
자정 00분
auth-server 로그 타임스탬프 이슈
문제: Docker 로그에 시간이 표시되지 않음
원인 분석:
docker logs기본 동작은 타임스탬프 미표시- uvicorn 자체도 타임스탬프를 로그에 포함하지 않음
해결 방법:
# 타임스탬프 포함해서 로그 확인
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 개선 예시
RUN pip install uv
RUN uv pip install -r requirements.txt # 훨씬 빠른 설치
추가 교훈
-
로그 확인 시 타임스탬프:
- Docker 로그는
--timestamps옵션 필수 - 시간 기반 분석 시 중요
- nginx 로그는 기본적으로 타임스탬프 포함
- Docker 로그는
-
Docker 격리 원칙 이해:
- 컨테이너는 호스트와 완전히 격리
- 호스트 설치 프로그램 ≠ 컨테이너에서 사용 가능
- 이식성과 일관성을 위한 설계
-
패키지 매니저 최적화:
- uv는 빌드 시간 단축에 효과적
- 운영 중인 서비스는 신중하게 적용
- 새 프로젝트나 큰 업데이트 시 도입 검토
작성 완료: 2025-07-30 00:15