feat: 24/7 무중단 운영을 위한 launchd 서비스 구축
- macOS의 launchd를 이용하여 AI 서버를 시스템 서비스로 등록 - 시스템 재부팅 시 서버 자동 시작 기능 구현 - 예기치 않은 오류 발생 시 서버 자동 재시작 기능 추가 - 서비스 로그를 logs/ 디렉토리에 자동으로 기록하도록 설정 - CODING_CONVENTIONS.md에 서버 운영 및 배포 가이드 상세히 문서화
This commit is contained in:
@@ -65,4 +65,24 @@
|
||||
- **DS1525+ NAS IP**: `192.168.1.227` (문서 저장소)
|
||||
- **NAS 마운트 포인트**: `/Volumes/DS1525+`
|
||||
- **서버 포트**: `8080` (FastAPI 웹 서비스)
|
||||
- **대시보드 접속**: `http://192.168.1.122:8080/dashboard`
|
||||
- **대시보드 접속**: `http://192.168.1.122:8080/dashboard`
|
||||
|
||||
## 7. 서버 운영 및 배포 (macOS)
|
||||
|
||||
이 서버는 24/7 무중단 운영을 위해 macOS의 `launchd` 서비스를 통해 관리됩니다. 이를 통해 시스템 재부팅 시 자동 시작 및 예기치 않은 종료 시 자동 재시작이 보장됩니다.
|
||||
|
||||
- **서비스 설정 파일**: `~/Library/LaunchAgents/com.nllb-translation-system.app.plist`
|
||||
- 이 파일은 서비스의 실행 방법, 로그 경로, 자동 재시작 여부 등을 정의합니다.
|
||||
|
||||
- **서비스 제어 명령어**:
|
||||
- **시작**: `launchctl start com.nllb-translation-system.app`
|
||||
- **중지**: `launchctl stop com.nllb-translation-system.app`
|
||||
- **재시작 (설정 파일 수정 후)**:
|
||||
1. `launchctl unload ~/Library/LaunchAgents/com.nllb-translation-system.app.plist`
|
||||
2. `launchctl load ~/Library/LaunchAgents/com.nllb-translation-system.app.plist`
|
||||
|
||||
- **로그 확인**:
|
||||
- **일반 로그**: `tail -f logs/service.log`
|
||||
- **에러 로그**: `tail -f logs/service_error.log`
|
||||
|
||||
- **주의**: 개발 및 디버깅 시에는 `launchd` 서비스를 중지(`launchctl stop ...`)한 후, 터미널에서 직접 `python src/fastapi_with_dashboard.py`를 실행해야 포트 충돌이 발생하지 않습니다.
|
||||
9
logs/service.log
Normal file
9
logs/service.log
Normal file
@@ -0,0 +1,9 @@
|
||||
번역 시스템 초기화 (디바이스: mps)
|
||||
모델 로딩 중...
|
||||
NLLB 번역 모델...
|
||||
INFO: 192.168.1.122:51436 - "GET /api/dashboard HTTP/1.1" 200 OK
|
||||
NLLB 모델 로드 완료
|
||||
KoBART 요약 모델...
|
||||
KoBART 모델 로드 완료
|
||||
모델 로딩 완료!
|
||||
INFO: 192.168.1.122:51443 - "GET /api/dashboard HTTP/1.1" 200 OK
|
||||
23
logs/service_error.log
Normal file
23
logs/service_error.log
Normal file
@@ -0,0 +1,23 @@
|
||||
2025-07-25 06:59:45,307 - __main__ - INFO - 🚀 Mac Mini AI 번역 서버 with 대시보드 (v2.1)
|
||||
2025-07-25 06:59:45,307 - __main__ - INFO - 📡 서버 주소: http://192.168.1.122:20080
|
||||
2025-07-25 06:59:45,307 - __main__ - INFO - 📊 대시보드: http://192.168.1.122:20080/dashboard
|
||||
2025-07-25 06:59:45,307 - __main__ - INFO - 📁 NAS 주소: 192.168.1.227
|
||||
INFO: Started server process [20661]
|
||||
INFO: Waiting for application startup.
|
||||
2025-07-25 06:59:45,328 - __main__ - INFO - 🚀 Mac Mini AI 번역 서버 시작 (v2.1)
|
||||
2025-07-25 06:59:45,328 - __main__ - INFO - 📍 Mac Mini IP: 192.168.1.122
|
||||
2025-07-25 06:59:45,328 - __main__ - INFO - 📍 NAS IP: 192.168.1.227
|
||||
2025-07-25 06:59:45,328 - __main__ - INFO - --------------------------------------------------
|
||||
2025-07-25 06:59:45,328 - background_ai_service - INFO - 🚀 백그라운드 AI 서비스 시작
|
||||
2025-07-25 06:59:45,328 - background_ai_service - INFO - ✅ 백그라운드 서비스 준비 완료
|
||||
2025-07-25 06:59:45,351 - __main__ - INFO - ✅ NAS 연결 정상: /Volumes/Media
|
||||
2025-07-25 06:59:45,357 - __main__ - INFO - ✅ 폴더 구조 확인/생성 완료
|
||||
INFO: Application startup complete.
|
||||
INFO: Uvicorn running on http://0.0.0.0:20080 (Press CTRL+C to quit)
|
||||
|
||||
Loading checkpoint shards: 0%| | 0/3 [00:00<?, ?it/s]
|
||||
Loading checkpoint shards: 33%|███▎ | 1/3 [00:00<00:01, 1.80it/s]
|
||||
Loading checkpoint shards: 67%|██████▋ | 2/3 [00:01<00:00, 1.68it/s]
|
||||
Loading checkpoint shards: 100%|██████████| 3/3 [00:01<00:00, 2.66it/s]
|
||||
Loading checkpoint shards: 100%|██████████| 3/3 [00:01<00:00, 2.32it/s]
|
||||
You passed along `num_labels=3` with an incompatible id to label map: {'0': 'NEGATIVE', '1': 'POSITIVE'}. The number of labels will be overwritten to 2.
|
||||
38
~/Library/LaunchAgents/com.nllb-translation-system.app.plist
Normal file
38
~/Library/LaunchAgents/com.nllb-translation-system.app.plist
Normal file
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<!-- 서비스의 고유 이름. 보통 역도메인 형식을 사용합니다. -->
|
||||
<key>Label</key>
|
||||
<string>com.nllb-translation-system.app</string>
|
||||
|
||||
<!-- 실행할 명령어와 인자들 -->
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<!-- 1. 가상환경의 파이썬 실행 파일 경로 (절대 경로) -->
|
||||
<string>/Users/hyungi/Scripts/nllb-translation-system/nllb_env/bin/python</string>
|
||||
<!-- 2. 실행할 파이썬 스크립트 경로 (절대 경로) -->
|
||||
<string>/Users/hyungi/Scripts/nllb-translation-system/src/fastapi_with_dashboard.py</string>
|
||||
</array>
|
||||
|
||||
<!-- 스크립트의 작업 디렉토리 설정 (매우 중요) -->
|
||||
<key>WorkingDirectory</key>
|
||||
<string>/Users/hyungi/Scripts/nllb-translation-system</string>
|
||||
|
||||
<!-- 서비스를 로드할 때 바로 실행 -->
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
|
||||
<!-- 프로세스가 종료되면 자동으로 다시 시작 (무중단 운영의 핵심) -->
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
|
||||
<!-- 표준 출력 로그 파일 경로 -->
|
||||
<key>StandardOutPath</key>
|
||||
<string>/Users/hyungi/Scripts/nllb-translation-system/logs/service.log</string>
|
||||
|
||||
<!-- 표준 에러 로그 파일 경로 -->
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/Users/hyungi/Scripts/nllb-translation-system/logs/service_error.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
Reference in New Issue
Block a user