운영 FAQ
설계 문서와 결정 기록, 테스트 서버에서 실제로 겪은 상황만 적었어요.
점검 → 복구를 두 번 해야 할 때
/설정 점검은 항목마다 번호를 붙이고, 마지막 줄에 고칠 수 있는 번호로 된 명령 (예: /설정 복구 항목:1,2,3)을 알려 줘요. (복구 불가: 이유)가 붙은 항목은 봇이 고칠 수 없어요(예: 봇 역할이 너무 낮음 → 서버 설정에서 봇 역할을 맨 위로).
/설정 복구는 먼저 계획을 보여 주고, 계획을 만든 본인(관리자)이 확인을 눌러야 실행돼요. 확인할 때 다시 점검해서 같은 항목만 고쳐요.
대기 역할처럼 다른 항목이 기대는 것을 지웠다 복구하면, 역할이 먼저 다시 생기고 그 역할에 기대는 항목(대기 부여, #대기실 오버라이드)은 그다음 점검에서야 보여요. 그래서 복구 결과 끝에 재점검 줄이 붙어요.
- 재점검: 정상 — 끝.
- 재점검: 남은 항목 N건 — /설정 복구 항목:전체 를 한 번 더 실행하세요 — 말 그대로 한 번 더. 두 번째 복구는 자동으로 하지 않아요.
- … · 복구 불가 M건은 /설정 점검에서 확인 — 봇이 못 고치는 항목이 남음. 점검에서 이유를 보고 손으로 처리.
[자동 수정 대상] 표시는 봇이 다시 시작할 때 조정에서 알아서 고치는 항목이에요(대기 역할 누락, 운영진 재계산, 서버 밖 사용자 탈퇴 반영, 신청 카드 재게시). 지금 고치려면 /설정 복구.
근거: 설계 6장·8.1, decisions 26·30 (M8 수동 테스트에서 대기 역할 삭제 후 복구)
봇이 관리하는 역할·채널을 손으로 지웠을 때
#봇-로그에 「⚠️ 봇이 관리하는 역할(채널)이 삭제됐어요」가 떠요. 봇은 자동으로 다시 만들지 않아요.
- 시스템 역할·카테고리·채널(
관리자,운영진,인증됨,대기,#대기실,#봇-로그등):/설정 점검→/설정 복구로 다시 만들어요. 위의 「두 번」 경우가 자주 생겨요. - 무리·게임의 역할·카테고리·채널: 복구 불가예요.
/그룹 삭제후/그룹 생성(게임은/게임 삭제후/게임 생성). - 봇 역할: 봇을 다시 초대한 뒤
/설정 점검.
/그룹 삭제·/게임 삭제로 봇이 지운 것은 경고하지 않아요. #사진·라운지·#운영-회의은 ID로 추적하지 않아 경고 대신 점검이 보고해요.
근거: 설계 4.1·8.1, decisions 28
디스코드에서 직접 추방·차단했을 때
봇이 감사 로그에서 알아채고 그 사람을 제거됨(REMOVED)으로 기록해요. 사유는 「디스코드에서 직접 추방: 입력한 사유」, 실행자는 추방한 사람. #봇-로그에 「⚠️ 봇 명령을 거치지 않은 추방」 경고가 떠요.
되도록 /멤버 제거를 쓰세요. 사유를 남기고, 열린 신청을 취소하고, 추방까지 한 번에 해요. 서버를 이미 떠난 사람에게 쓰면 추방 없이 기록만 바꿔서 재입장 때 자동 복구를 막아요.
#봇-로그에 「감사 로그를 읽지 못해 탈퇴(LEFT)로 기록했어요 … 봇 역할의 「감사 로그 보기」 권한을 켜 주세요」가 떴다면, 추방이 그냥 탈퇴로 기록된 거예요. 그대로 두면 다시 들어올 때 자동 복구돼요. 권한을 켜고, 그 사람에게 /멤버 제거를 해 두세요.
/멤버 제거 유저:@대상 사유:규칙 위반근거: 설계 3.2·4.1, decisions 25·28·30 (M8 수동 테스트)
나갔던 사람이 다시 들어왔을 때
스스로 나갔던 인증 멤버 → 자동 복구
인증됨, 소속 무리의 역할, 닉네임 이름 (별명)을 되돌리고 #봇-로그에 그 무리 담당을 멘션해 알려요. 삭제된 무리의 역할은 건너뛰어요. 담당 역할은 복구하지 않아요 — 다시 맡기려면 /그룹 담당 추가. 닉네임을 못 바꾼 경우(봇보다 높은 역할)는 로그에 적혀요.
신청 전·신청 중에 나갔던 사람 → 처음처럼 대기
대기를 받고 #대기실 안내가 나가요. 거절 횟수와 재신청 대기 시간은 그대로라 나갔다 들어와서 우회할 수 없어요.
제거됨(REMOVED) → 대기 + 경고 카드
자동 복구 없이 대기를 받고, #승인-대기에 「⚠️ 이전에 제거된 멤버가 다시 입장했어요」 카드(제거 사유·제거자·시각·이전 거절 횟수)가 떠요. 거절 횟수는 0으로 돌아가 다시 신청할 수 있어요. 받아 줄 생각이 없으면 /멤버 제거.
근거: 설계 3.2·4.2, decisions 15·28 (M8 수동 테스트)
리마인더와 일일 감사 읽는 법
리마인더 — 매시 정각, #대기실
신청하지 않은 대기 멤버에게 입장(거절됐으면 마지막 거절) 뒤 1일·3일째에 「아직 합류 신청이 접수되지 않았어요」를 멘션해요. 봇이 꺼져 있다 켜져도 지난 날짜를 몰아 보내지 않고 가장 큰 날짜 하나만 보내요. 거절 2회(신청 불가), 재신청 대기 중, 서버에 없는 사람은 건너뛰어요. #봇-로그에는 남지 않아요.
누가 받았는지는 /대기 목록의 「리마인드 1일·3일」 또는 「리마인드 없음」으로 봐요.
일일 감사 — 매일 09:00, #봇-로그
/설정 점검과 같은 형식이에요. 「일일 감사: 정상」이면 문제 없음. 항목이 있으면 번호대로/설정 복구. 일일 감사는 보고만 하고 아무것도 고치지 않아요([자동 수정 대상]도 재시작 때까지 그대로).
시작 시 조정 — 봇이 켜질 때, #봇-로그
「조정 결과: 정상」, 또는 「자동 수정:」(고친 것)과 「확인 필요:」(/설정 점검 → /설정 복구) 목록.
기다리지 않고 지금 돌리기(소유자)
/설정 작업실행 작업:리마인더/설정 작업실행 작업:감사테스트 서버에서 리마인더를 바로 보려면 봇 쪽에서 pnpm seed:test --reminder-days 0(되돌리기--reminder-days "1,3"). 실행 뒤 출력의 「저장된 값」 줄로 실제 값을 확인하세요. M7 테스트에서 정각이 오기 전에 다른 실행이 값을 되돌려 리마인더가 안 간 적이 있어요. PowerShell에서는 쉼표 목록을 따옴표로 감싸야 그대로 전달돼요.
근거: 설계 8.1~8.4, decisions 26·27 (M7 수동 테스트 9)
봇이 응답하지 않을 때
- 서버 멤버 목록에서 봇이 온라인인지 봐요. 명령 목록에 봇 명령이 아예 없으면 명령 등록이 안 된 것 —
pnpm deploy-commands. - 배포 서버에서 컨테이너 상태를 봐요. 봇은 디스코드에 연결돼 있을 때만 30초마다 하트비트를 갱신하고, 120초 넘게 멈추면 unhealthy예요.
docker compose ps - 로그를 봐요. 정상이면 「디스코드 로그인 완료」 다음에 조정 결과가 나와요. 「GUILD_ID 서버에 봇이 없습니다」면 봇이 그 서버에 초대되지 않은 것.
docker compose logs --tail 200 - 연결이 5분(
WATCHDOG_MINUTES) 넘게 안 되면 봇이 스스로 종료하고 재시작 정책이 다시 띄워요. unhealthy만으로는 Docker가 재시작하지 않으니, 로그가 멈춰 있고 unhealthy면 직접 재시작해요.docker compose restart - 명령은 되는데 역할·닉네임 변경이 실패하고
#봇-로그에 50013(권한 부족)이 보이면, 봇 역할이 대상 역할·멤버보다 낮거나 권한이 빠진 거예요. 봇 역할을 맨 위로 올리고/설정 점검.
근거: 설계 10·12장, README 배포 절
백업과 복원
DB는 SQLite 파일 하나(data/gatekeeper.db)예요. 배포 호스트의 crontab으로 매일 04:00에sqlite3 .backup(봇이 돌고 있어도 일관된 사본)을 만들고 14일 보관해요. 주 1회 외부로 복사하는 방법은 배포 대상과 함께 M9에서 정해요.
복원
docker compose stopcp backups/gatekeeper-YYYY-MM-DD.db data/gatekeeper.dbdocker compose up -d켜지면 시작 시 조정이 백업 이후 달라진 것을 자동 수정하거나 #봇-로그에 보고해요. 보고된 항목은/설정 점검 → /설정 복구.
근거: 설계 12장, README 백업·복구 절