문지기 운영 가이드

서버 연동 체크리스트

설계 13장 순서 그대로예요. 안드로이드 공기계로 돌리면 폰 단계가 함께 붙어요. 체크 표시는 이 기기에만 저장돼요.

0 / 22 완료

디스코드 명령 예시는 입력할 값을 보여 주는 거예요. 채팅창에 명령 이름(예: /그룹 생성)을 입력하고 옵션 칸을 골라 채우세요.

안드로이드 단계의 명령·확인 방법 전체는 docs/deploy-android.md에 있어요. 저장소는 비공개(소유자만 열림)예요.

폰(안드로이드) 준비

Galaxy S8+ 같은 안드로이드 공기계(Termux + proot Ubuntu)로 봇을 돌릴 때만. 서버·라즈베리파이의 Docker로 돌리면 건너뛰고 README 「배포」를 따르세요.

  1. 누를 것

    • github.com/termux/termux-app/releases → arm64-v8a APK
    • github.com/termux/termux-boot/releases, github.com/termux/termux-api/releases → APK
    • 설치 후 Termux:Boot를 한 번 열었다 닫기(부팅 실행 등록)

    보여야 할 것

    • 세 앱이 모두 같은 출처(GitHub)여야 해요. Play 스토어·F-Droid 것과 섞으면 서명이 달라 서로 연결되지 않아요
    • Termux를 열면 $ 프롬프트
  2. 누를 것

    • 디바이스 케어 → 배터리 → 앱 전원 관리 → 절전 예외 앱에 Termux·Termux:Boot 추가
    • 디바이스 케어 → ⋮ → 자동 최적화 끄기
    • 설정 → 애플리케이션 → Termux → 배터리 → 백그라운드 제한 없음(배터리 사용량 최적화 해제)
    • 설정 → 연결 → Wi-Fi → ⋮ → 고급 → 절전 모드에서 Wi-Fi 연결 유지: 항상
    • 설정 → 소프트웨어 업데이트 자동 다운로드 끄기, Play·Galaxy Store 앱 자동 업데이트 끄기

    보여야 할 것

    • 메뉴 이름은 펌웨어마다 조금 달라요. 자세한 경로는 아래 문서 2단계
  3. 누를 것

    • Termux에서 패키지를 올린 뒤 스크립트 한 줄

    보여야 할 것

    • 「==> 완료」 뒤에 Ubuntu용 한 줄이 출력됨
    • 「Termux를 완전히 종료했다 다시 연 뒤」 안내가 나오면 알림의 Exit → 다시 열고 같은 줄을 한 번 더
    pkg upgrade -y
    curl -sL https://gatekeeper-7sf.pages.dev/android/setup-termux.sh | bash
  4. 누를 것

    • Termux에서 그대로 한 줄. Termux의 curl로 받아 Ubuntu 안 bash에 흘려 넣어요

    보여야 할 것

    • 마지막에 node v24.x, pnpm 12.5.1, gh·sqlite3·rclone 버전 목록
    curl -sL https://gatekeeper-7sf.pages.dev/android/setup-ubuntu.sh | proot-distro login ubuntu -- bash -s
  5. 누를 것

    • proot-distro login ubuntu 로 들어가기(프롬프트가 root@localhost)
    • gh auth login → GitHub.com → HTTPS → 브라우저 로그인(기기 코드)
    • 저장소 clone 후 설치·빌드

    보여야 할 것

    • gh auth login 끝에 「Logged in as …」
    • pnpm build가 오류 없이 끝나고 dist/index.js가 생김
    proot-distro login ubuntu
    gh auth login
    gh repo clone psychopomp0519/gatekeeper /root/gatekeeper
    cd /root/gatekeeper && pnpm install && pnpm build

개발자 포털

  1. 누를 것

    • discord.com/developers/applications → New Application
    • Bot 탭 → Reset Token → 토큰을 봇 서버의 .env DISCORD_TOKEN에 붙여 넣기
    • Bot 탭의 Public Bot 끄기

    보여야 할 것

    • 토큰은 한 번만 보여요. 잃어버리면 다시 Reset Token
    • Public Bot이 꺼져 있어 나만 초대할 수 있음
  2. 누를 것

    • Bot 탭 → Privileged Gateway Intents
    • Server Members Intent 켜기, Presence·Message Content는 끄기 → Save

    보여야 할 것

    • Server Members Intent만 켜져 있음. 꺼져 있으면 봇이 입장·탈퇴를 받지 못해요
  3. 누를 것

    • 아래 초대 URL을 열고(홈의 「봇 초대」 버튼과 같음) 서버 선택 → 승인

    보여야 할 것

    • 권한 32개가 선택된 승인 화면
    • 서버 멤버 목록에 봇이 보임(봇 프로세스를 켜기 전엔 오프라인)
    • 권한을 빠뜨려도 /설정 초기화가 빠진 권한을 알려 줘요. 서버 설정 → 역할 → 봇 역할에서 켜면 됨
    https://discord.com/oauth2/authorize?client_id=1552202076921270342&scope=bot+applications.commands&permissions=585483968573139&integration_type=0

    권한 정수 585483968573139. 감사 로그 보기는 디스코드에서 직접 한 추방·차단을 알아채는 데 써요.

폰에서 봇 기동

안드로이드일 때만. 토큰과 봇 초대(위 개발자 포털)가 끝난 뒤에 해요.

  1. 누를 것

    • Ubuntu 안 /root/gatekeeper에서 .env를 만들고 토큰·클라이언트 ID·실서버 ID 입력(DATABASE_PATH=./data/gatekeeper.db)
    • DB 준비 후 명령 등록

    보여야 할 것

    • pnpm deploy-commands 끝에 「등록 완료: /설정, /그룹, …」
    • 토큰은 위 「애플리케이션과 토큰」, 봇은 「봇 초대」를 먼저 끝내야 해요
    cp .env.example .env && chmod 600 .env && nano .env
    pnpm db:migrate && pnpm deploy-commands
  2. 누를 것

    • run-loop.sh로 띄우고, Termux 왼쪽 가장자리에서 밀어 새 세션을 열어 로그 보기
    • 확인 후 첫 세션에서 Ctrl+C

    보여야 할 것

    • 로그에 「디스코드 로그인 완료」, 디스코드에서 봇이 온라인
    • Ctrl+C 후 「중지 요청으로 종료」 「run-loop 종료」
    bash /root/gatekeeper/scripts/android/run-loop.sh
    proot-distro login ubuntu -- tail -f /root/gatekeeper/logs/bot.log
  3. 누를 것

    • Termux(Ubuntu 밖)에서 boot.sh를 Termux:Boot 폴더에 받기
    • 폰 재부팅 후 화면을 켜지 않고 1~2분 기다리기

    보여야 할 것

    • 재부팅 뒤 Termux 알림에 「wake lock held」, 디스코드에서 봇이 온라인
    • 상태 확인: node dist/health.js 가 「healthy: 하트비트 N초 전」
    mkdir -p ~/.termux/boot && curl -sL https://gatekeeper-7sf.pages.dev/android/boot.sh -o ~/.termux/boot/gatekeeper.sh && chmod +x ~/.termux/boot/gatekeeper.sh
    proot-distro login ubuntu -- bash -c "cd /root/gatekeeper && node dist/health.js"
  4. 누를 것

    • Ubuntu 안에서 rclone config → n → 이름 gdrive → drive → 브라우저로 Google 로그인
    • 백업 1회 수동 실행 → Termux(Ubuntu 밖)에서 매일 04:10 crontab 등록

    보여야 할 것

    • 「==> 완료」, Drive의 gatekeeper-backups 폴더에 gatekeeper-날짜.db.gz
    • crontab -l 에 backup.sh 줄
    rclone config
    bash /root/gatekeeper/scripts/android/backup.sh
    mkdir -p ~/.gatekeeper && (crontab -l 2>/dev/null | grep -v gatekeeper/scripts/android/backup.sh; echo '10 4 * * * PATH=/data/data/com.termux/files/usr/bin /data/data/com.termux/files/usr/bin/proot-distro login ubuntu -- bash /root/gatekeeper/scripts/android/backup.sh >> /data/data/com.termux/files/home/.gatekeeper/backup.log 2>&1') | crontab -

서버(소유자)

  1. 누를 것

    • 디스코드에서 서버 추가 → 직접 만들기(빈 템플릿)
    • 커뮤니티는 켜지 않기

    보여야 할 것

    • 기본 #general·음성 채널은 /설정 초기화 뒤 지워도 됨
  2. 누를 것

    • 인증 수준: 낮음(이메일 인증)
    • 기본 알림: @멘션만
    • 운영 작업 2단계 인증: 켬(소유자 2FA 필요)
    • 시스템 메시지 채널: 없음

    보여야 할 것

    • 입장 메시지는 봇이 #대기실에서 처리하므로 시스템 메시지는 끔
  3. 누를 것

    • 서버 설정 → 역할 → 봇 역할을 목록 맨 위(소유자 바로 아래)로 드래그

    보여야 할 것

    • 사람이 만든 역할이 봇 위에 있으면 그 역할을 가진 사람의 역할·닉네임을 봇이 못 바꿔요
  4. 누를 것

    • 봇을 켠 상태에서(로컬 pnpm dev 또는 배포) 명령 등록을 한 번 실행
    • 서버에서 /설정 초기화 → 계획 확인 → 실행

    보여야 할 것

    • 역할 관리자·운영진·인증됨·대기, 카테고리 입구·공용·운영와 채널이 생김
    • #대기실에 「합류 신청」 버튼이 달린 고정 메시지, #봇-로그에 실행 결과
    • 소유자는 자동으로 인증됨(VERIFIED)
    • 다시 실행하면 「변경할 것이 없어요」
    pnpm deploy-commands
    /설정 초기화
  5. 누를 것

    • 서버 프로필에서 본인 닉네임을 이름 (별명) 형식으로 직접 설정

    보여야 할 것

    • 봇은 소유자 닉네임을 바꿀 수 없어서 이 단계만 손으로 해요
  6. 누를 것

    • 첫 무리는 소유자를 담당으로 /그룹 생성
    • 실제 담당을 /멤버 등록 → /그룹 담당 추가
    • 소유자가 담당을 맡지 않을 거면 /그룹 담당 제거, 무리 소속은 /멤버 그룹제거
    • 두 번째 무리부터는 담당을 먼저 /멤버 등록한 뒤 /그룹 생성

    보여야 할 것

    • 무리마다 역할 그룹:X·담당:X, 카테고리 X와 #잡담·음성 채널
    • /멤버 등록은 무리가 하나 이상 있어야 하고, /그룹 생성의 담당은 인증된 멤버여야 해서 첫 무리만 순서가 달라요
    /그룹 생성 이름:군대 담당:@소유자
    /멤버 등록 유저:@담당 이름:홍길동 그룹:군대
    /그룹 담당 추가 그룹:군대 유저:@담당
    /그룹 담당 제거 그룹:군대 유저:@소유자
  7. 누를 것

    • /멤버 일괄등록 → 열린 창에 한 줄에 한 명
    • 새로 오는 사람은 #대기실의 합류 신청 폼으로

    보여야 할 것

    • 진행률이 응답에 표시되고, 실패한 줄은 이유와 함께 보고돼요
    /멤버 일괄등록
    123456789012345678, 홍길동, 군대;고등학교, 길동이

    줄 형식: 사용자ID, 이름, 그룹[;그룹], 별명(선택). 사용자ID는 개발자 모드를 켜고 프로필 → ID 복사.

  8. 누를 것

    • /게임 생성으로 2~3개

    보여야 할 것

    • #안내에 게임 역할 메뉴 버튼. 누르면 게임 역할을 받고 그 게임 카테고리가 보이고, 다시 누르면 반납하고 사라짐
    /게임 생성 이름:발로란트
  9. 누를 것

    • #안내에 규칙과 사용법을 운영진이 직접 작성

    보여야 할 것

    • 봇은 이 글을 쓰지 않아요
  10. 누를 것

    • /설정 점검

    보여야 할 것

    • 「점검 결과: 정상」이면 초대 링크를 나눠도 돼요. 항목이 있으면 운영 FAQ의 점검·복구 참고
    /설정 점검