로드맵
향후 작업 일정은 보장하지 않습니다.
방향
AI가 제안하고, 패스키가 실행합니다. 서버에 대한 모든 변경은 정확한 실행 계획, 제안한 쪽, 되돌릴 수 있는지를 담은 승인 카드 한 장이 됩니다. 패스키 승인만이 카드를 실행하며, 카드는 서비스가 복구됐는지 알리는 것으로 끝납니다.
혼자 서버를 운영하는 사람은 장애를 늦게 알고, 고치는 방법을 알아도 서버에 접근하지 못하는 경우가 많습니다. opsgate는 먼저 알리고, 장애에 맞는 조치를 보여 주고, 어디서든 패스키로 그중 하나를 승인하게 해야 합니다. AI 클라이언트와 함께하는 원인 분석은 서비스를 되살린 다음에 합니다.
아래 작업은 다음 원칙을 따릅니다.
- 조치는 카탈로그에서 나옵니다. 규칙이나 AI가 조치를 제안할 수 있지만, 버튼은 서버가 정의하고 허용 목록이 허락한 조치 종류에만 생깁니다. AI는 조치를 고르고 인자를 채울 뿐, 새로운 조치를 만들 수 없습니다. 버튼에는 규칙이 제안했는지 AI가 제안했는지 표시합니다.
- 카탈로그에 삭제는 없습니다. 재시작, 파드 수 조정, 이미지 복원, 컨트롤러가 다시 만드는 파드의 삭제는 포함하고, 데이터나 다른 리소스 삭제는 포함하지 않습니다.
- 승인하면 실행됩니다. 패스키로 승인하면 서버가 실행 계획을 다시 확인하고 실행합니다. 승인했다고 채팅에 다시 알릴 필요가 없습니다.
- 어디서든 승인합니다. 특정 메신저에 의존하지 않고, 패스키가 동작하는 폰이나 컴퓨터 브라우저라면 어디서든 승인합니다.
다음 작업
위 방향에서 나온 여섯 단계는 v0.4.0으로 릴리스했습니다. 방향을 승인 카드로 좁히자 빈틈 세 가지가 드러났고, v0.5.0에서 모두 해결했습니다 (변경 기록 참고).
- "적용됨"은 "복구됨"이 아닙니다. 웹에서 승인한 Kubernetes 조치 뒤에 카드가 워크로드를 지켜보고 복구됨 또는 아직 복구되지 않음을 푸시와 함께 알립니다. 복구 확인을 참고하세요.
- 앱 안 승인은 "패스키만 실행한다"와 맞지 않습니다. 이제
mode가 없어도 builtin 인증이면 웹 승인이 기본입니다. - 처음 설치가 길면 혼자 운영하는 사람은 떠납니다.
opsgate init -recover가 설정 두 개를 만들고 남은 명령을 모두 출력합니다.
다음 후보(약속 아님): 호스트 provider 조치(systemd 유닛, Docker 컨테이너)에도 같은 복구 확인을 붙이는 것.
완료
아래 기능은 v0.7.0까지 구현했지만, 외부 보안 검토는 아직 받지 않았습니다.
- 어느 페이지에서나 앱 설치, iPhone 홈 화면 추가 안내, 승인함의 테스트 알림.
- 승인 페이지, 승인함, 조치 선택 페이지, 패스키 초대를 폰에서 여는 QR 코드.
- 웹에서 승인한 Kubernetes 조치 뒤의 복구 확인과, 결과만 담은 푸시 알림.
mode가 있든 없든 builtin 인증이면 웹 승인이 기본.- 폰 복구를 한 번에 설정하는
opsgate init -recover. - 공식 MCP Registry 등록, 문서 사이트,
llms.txt. - 승인하면 조치가 실행됩니다. 서버가 계획을 다시 확인하고 원래 호출자로 한 번 실행합니다.
채팅 호출은
approval.wait까지 기다리고, 그 뒤 결과는approval_status로 읽습니다. - 알림, 분석기, MCP 도구가 함께 쓰는 조치 카탈로그(재시작, 이미지 복구, 파드 수 조정,
컨트롤러 소유 파드 삭제). 버튼마다 규칙 제안인지 AI 제안인지 표시하며, 조회 전용
action_link를 제공합니다. - 설치할 수 있는
/approvals승인함과 선택 기능인 Web Push. 알림을 누르면 가장 최근의 대기 중인 승인이 열립니다. 서명된 watch 알림이 경고를 승인함에 넣습니다. - 장애마다 현재 상태에 맞는 선택지(이미지 실패, 실패 중인 배포, 반복 종료나 OOM, 멈추거나 연결할 수 없는 파드)를 로그인한 선택지 페이지로 제공합니다.
- 출력, 알림 수준, 묶음 주기를 따로 정하는 namespace별 알림 그룹.
- 선택 기능인 호스트 provider(systemd 유닛, Docker 컨테이너). 기본값은 꺼짐이며, root나 Docker 소켓 대신 polkit과 소켓 프록시를 사용합니다.
- 파드 수 조정과 이미지 복구의 되돌리기 링크.
- 실험 기능이던 Dev provider를 제거했습니다.
- 내장 인증에서 패스키 로그인을 지원합니다. upstream provider는
passkey이며,opsgate passkey invite로 일회용 등록 초대를 발급합니다. - ChatGPT에 필요한 세션 없는 MCP 프로토콜
2026-07-28을 서버에 상태를 유지하지 않는 방식으로 제공합니다. - stdio로 Kubernetes를 조회할 수 있습니다. 허용 목록, 네임스페이스 거부 목록, 스코프 검사, 출력 제한, 마스킹을 적용하고 JSONL 감사 로그를 저장합니다.
/mcp에서 인증이 필수인 Streamable HTTP를 제공하며, Protected Resource Metadata를 지원합니다.- 내장 OAuth 2.1에서 PKCE S256을 사용하는 인가 코드, 클라이언트 등록(DCR), 동의, upstream GitHub/OIDC 로그인(Google 포함)을 지원합니다. 불투명 토큰은 해시로 저장하고, 리프레시 토큰 교체와 재사용 탐지를 지원하며, 필요하면 상태를 저장해 재시작 후에도 유지할 수 있습니다.
- issuer 검색/JWKS를 사용하는 외부 JWT 인증과 다이제스트로 설정하는 정적 Bearer 토큰을 지원하며,
-gen-token보조 명령을 제공합니다. - Kubernetes 워크로드 롤아웃 재시작, 복제본 수 변경, 파드 삭제를 지원합니다. 각 작업에는 별도 허용 목록과
ops:write, 사람의 승인이 필요합니다. - 여러 MCP 프로토콜 버전에서 클라이언트 내 확인(elicitation)을 지원하며, 같은 사용자로 upstream에 로그인하는 브라우저 승인을 제공합니다. 승인은 유효 기간이 있는 일회용이며, 승인한 인자에만 유효합니다.
- GoReleaser 릴리스, cosign 키 없는 서명, SBOM, 출처 증명, 컨테이너 이미지, Kubernetes 매니페스트를 제공합니다.
- 도구 등록 정책과 사용자별·토큰별 도구 제한, 리다이렉트 호스트 등록 정책을 지원합니다. 관리자는 등록 대기 중인 클라이언트를 검토할 수 있고, 필요하면 알림을 받을 수 있습니다.
- 선택 기능인 승인 시간 창은 특정 사용자, 도구, 대상에만 유효하고, 상태는 메모리에만 저장합니다. 기본적으로는 꺼져 있습니다.
- 실험적 note provider는 범위가 제한된 Markdown 폴더(Obsidian 호환)에서 읽기·검색·링크·태그 조회를 지원합니다. 노트 작성, 내용 추가, 내용 수정, 휴지통으로 이동은 승인을 받아 실행합니다.
- 배포 모드(
mode: kubernetes)가 기본값을 채우고,opsgate init이 짧은 설정 파일을 만들며,opsgate config show가 최종 설정을 보여 줍니다. - 실험적
opsgate watch는 별도 프로세스로 파드, 워크로드, 노드, ConfigMap 키를 watch하고, 알림을 묶고 중복을 줄여 webhook으로 보냅니다. 필요하면 HMAC으로 서명합니다. - 실험적
opsgate-analyzer는 서명된 watch 알림을 받아 제한된 읽기 전용 MCP 조사를 수행합니다. OpenAI 호환 API, Claude Code CLI, Codex CLI 중 하나를 선택하며, Discord 보고서와 선택 사항인 서명 webhook 전달, 한국어/영어 보고서와 실행하지 않는 작업 제안을 지원합니다. k8s_restore_image는 허용 목록과 사람의 승인을 거쳐 Deployment 컨테이너 이미지를 현재 준비된 소유 ReplicaSet의 이미지로 복원합니다. 읽기 전용k8s_remediation_options는 검증한 복원 후보의 승인 링크를 제공합니다.- watch는 독립된 Discord 및 사용자 지정 JSON webhook 출력, 본문 템플릿, 헤더, 자격 증명 파일, HTTP 429 재시도를 지원합니다. SMTP 이메일 출력은 검증된 TLS, 별도 배치와 재시도를 사용합니다.
- watch는 한국어/영어 표시와 원본 오류 코드·메시지 보존, 출력별
problems_only경고 필터링을 지원합니다. - HTTP에서는 사용 가능한 웹 승인을 기본적으로 요구합니다.
approval.require_web: false로 클라이언트 내 확인을 허용할 수 있고, stdio는require_web: true를 명시하지 않으면 클라이언트 내 확인을 유지합니다.
남은 아이디어
아래 항목은 아이디어이며 구현을 약속한 것은 아닙니다. 범위는 보안 검토에 따라 달라질 수 있습니다.
- 최소 권한과 입력 제한을 적용한 PostgreSQL provider.
- 설정 다시 불러오기.
- Client ID Metadata Documents(CIMD).
- 도구별 요청 빈도 제한.