맥에서 AI 모델을 실행하고 IDC 서버가 공개 웹서비스를 맡는 구조는 효율적이지만, 연결만 되면 운영이 끝나는 것은 아니다. 인터넷 경계, 터널, AI 프로세스, 데이터, 복구 절차를 서로 다른 장애 영역으로 다뤄야 한다.
권장 구조
사용자 HTTPS 요청은 IDC의 Nginx가 받고 인증과 요청 제한을 거친다. 내부 애플리케이션이 필요한 요청만 WireGuard 또는 SSH 터널을 통해 맥의 AI API로 전달한다. 맥의 AI 포트는 공인 인터넷에 직접 열지 않는다.
사용자
-> IDC Nginx :443
-> 웹 애플리케이션 :내부 포트
-> WireGuard 전용 주소
-> Mac AI API :로컬/전용 인터페이스
-> MLX 모델1. 네트워크 경계
IDC 방화벽은 80·443과 관리에 꼭 필요한 포트만 허용한다. SSH는 가능하면 VPN 내부 주소에서만 받고 키 인증을 사용한다. WireGuard의 `AllowedIPs`는 편의를 위해 전체 대역을 넣기보다 실제 필요한 주소로 제한한다.
맥 AI API는 `0.0.0.0` 대신 `127.0.0.1` 또는 WireGuard 인터페이스 주소에 바인딩한다. Nginx의 upstream 타임아웃과 본문 크기 제한도 모델 특성에 맞게 명시한다.
2. 인증과 권한
터널이 암호화되어도 API 인증은 별도로 필요하다. IDC 애플리케이션만 가진 서비스 자격증명이나 상호 TLS를 사용하고 정기적으로 교체한다. 사용자의 관리자 권한과 서비스 프로세스 권한도 분리한다.
AI가 Bash나 운영 함수를 호출한다면 자연어가 직접 명령 문자열이 되어서는 안 된다. 허용된 함수, 타입이 정해진 인자, 확인 단계, 실행 시간 제한을 둔다. `rm`, 방화벽 변경, 계정 관리 같은 작업은 자동 승인 대상에서 제외한다.
3. 비밀정보 관리
API 키와 WireGuard 개인키를 Git 저장소, 게시글, 로그에 넣지 않는다. 환경 파일은 소유자만 읽을 수 있게 하고 백업본도 암호화한다. 로그를 외부 분석 서비스로 보낼 때 프롬프트와 검색 문서에 개인정보가 없는지 확인한다.
교체 절차가 없는 비밀은 결국 교체할 수 없다. 새 키 배포, 양쪽 동시 허용 기간, 이전 키 폐기, 연결 확인 순서를 문서화한다.
4. 백업 범위를 나눈다
| 대상 | 권장 방식 | 복구 확인 | |
|---|---|---|
| 게시판 DB | 일관된 SQLite 백업 또는 스냅숏, 다른 장비에 암호화 보관 | 복사본으로 실제 조회 | |
| 원본 문서 | 버전 관리 또는 증분 백업 | 임의 파일 복원 | |
| 벡터 색인 | 재생성 가능하면 생성 절차와 버전 보존 | 원문에서 재색인 | |
| 모델 파일 | 다운로드 출처·해시·버전 기록 | 새 장비에서 재다운로드 | |
| 설정·서비스 파일 | 비밀을 제외해 버전 관리 | 빈 서버에 재배포 | |
| 암호화 키 | 별도 안전 매체와 접근 기록 | 승인된 복구 훈련 | |
백업 성공 로그만 믿지 말고 복원 훈련을 해야 한다. 복구 목표 시간(RTO)과 허용 가능한 데이터 손실 범위(RPO)를 먼저 정하면 백업 주기와 저장 위치가 결정된다.
5. 장애를 구분해 관측한다
웹서비스가 느리다는 신호 하나로 원인을 알 수 없다. 다음 지표를 분리한다.
- IDC: HTTP 상태 코드, 요청률, upstream 연결 오류, 인증 실패
- 터널: handshake 시각, 패킷 손실, 왕복 지연, 재연결 횟수
- 맥: CPU·GPU·메모리 압박, 디스크 여유, 온도와 throttling
- 모델: 로드 시간, 첫 토큰 지연, 초당 토큰, 큐 길이, 취소율
- 데이터: DB 쓰기 실패, 색인 버전, 마지막 성공 백업과 복원 시험
단일 포트가 열렸다는 사실은 정상 응답을 보장하지 않는다. 가벼운 `/health/live`와 실제 의존성을 확인하는 `/health/ready`를 분리한다. 모델 생성까지 매번 수행하는 깊은 점검은 낮은 주기로 실행한다.
6. 자동 복구의 한계
프로세스가 종료되면 제한된 횟수로 다시 시작할 수 있다. 그러나 메모리 부족이나 잘못된 모델처럼 같은 원인이 계속될 때 무한 재시작하면 상황을 악화시킨다.
attempt=0
while (( attempt < 5 )); do
if curl --fail --max-time 3 http://127.0.0.1:9000/health/ready; then
exit 0
fi
sleep $((2 ** attempt))
attempt=$((attempt + 1))
done
logger -t ai-ops "AI readiness check failed after retries"
exit 1재시작 횟수와 냉각 시간을 제한하고, 실패 후에는 운영자에게 상태와 최근 변경 사항을 알린다. 데이터 삭제나 방화벽 변경은 자동 복구로 수행하지 않는다.
7. 장애 시 우회와 성능 저하
맥이 끊겼을 때 웹 전체가 502로 멈추지 않게 한다. AI 기능만 일시 중지하고 일반 게시판은 계속 제공하거나, 짧은 요청은 제한된 대체 모델로 처리할 수 있다. 큐가 길어지면 무작정 요청을 쌓지 말고 429 또는 명확한 대기 안내를 반환한다.
배포는 기존 모델을 내리기 전에 새 프로세스의 준비 상태를 확인한다. 메모리가 두 모델을 동시에 담지 못한다면 점검 시간을 공지하고 롤백 파일과 명령을 미리 준비한다.
8. 사고 대응 절차
- 영향 범위와 시작 시각을 기록한다.
- 최근 배포·키 교체·네트워크 변경을 확인한다.
- 증거가 사라지지 않게 로그와 설정 상태를 보존한다.
- 노출이 의심되면 자격증명을 교체하고 접근을 차단한다.
- 검증된 백업으로 복구하고 기능별 점검을 수행한다.
- 원인, 탐지 실패, 재발 방지 항목을 문서화한다.
배포 전 최종 체크리스트
- 공개 포트와 실제 수신 프로세스를 확인했다.
- AI API는 전용 인터페이스에만 바인딩했다.
- API 인증, 속도 제한, 본문 제한, 타임아웃이 있다.
- 비밀값이 저장소와 로그에 포함되지 않았다.
- 마지막 백업의 복원 시험을 완료했다.
- 터널 단절과 맥 재부팅 상황을 시험했다.
- 무한 재시작이 아닌 제한된 복구 정책을 사용한다.
- 장애 시 AI 이외 기능이 계속 동작하거나 명확히 실패한다.
결론
맥과 IDC를 나누는 목적은 단순히 비용을 줄이는 것이 아니라 공개 경계와 AI 연산의 역할을 분리하는 데 있다. 안전한 운영은 방화벽 하나가 아니라 최소 권한, 복원 가능한 백업, 계층별 관측, 제한된 자동 복구가 함께 작동할 때 완성된다.
참고 자료
- WireGuard Quick Start: https://www.wireguard.com/quickstart/
- OpenSSH 터널링: https://man.openbsd.org/ssh
- Nginx proxy module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- OWASP API Security: https://owasp.org/API-Security/
댓글
0개아직 댓글이 없습니다.