친구와 함께 디스코드 봇을 개발하고 배포할 때 생기는 실무적 문제와 이를 예방·해결하는 방법을 정리했다. GitHub을 이용한 협업 워크플로우, 비밀 정보 관리, CI/CD로 호스팅 배포하는 방법을 중심으로 설명한다.
증상
- 코드 병합 시 충돌이 자주 발생하고 기능 버전이 뒤섞인다.
- 개발 환경마다 동작이 달라 로컬에서는 정상이나 배포환경에서 오류가 난다.
- 실수로 봇 토큰이나 비밀 키를 리포지토리에 커밋해 보안 사고 위험이 생긴다.
- 배포 권한 관리가 없어 누군가가 의도치 않게 서비스 중단을 유발한다.
원인
- 분명한 브랜칭 전략과 리뷰 프로세스가 미비하다.
- 환경 변수와 시크릿을 코드에 직접 포함하거나
.env파일을 커밋한다. - CI나 자동화된 테스트 없이 수동으로 배포한다.
- 호스팅 접근 정보(SSH 키, API 토큰) 관리를 중앙화하지 않아 권한 제어가 불명확하다.
해결 방법
1단계: GitHub 기반 협업 기초 구성
-
리포지토리 기본 설정
.gitignore에node_modules,.env등을 추가한다.- 환경 예시 파일은
/.env.example로 저장해 실제 비밀 값은 커밋하지 않는다. package-lock.json또는yarn.lock을 커밋해 일관된 의존성을 유지한다.
-
브랜치 전략 & 코드 리뷰
main(또는master)은 보호(branch protection)하고 직접 푸시 금지.- 기능별 브랜치(
feature/xxx)에서 작업하고 Pull Request(PR)로 병합. - PR 템플릿과 리뷰 규칙을 만들어 코드 품질 확보.
-
권한 및 소유자
CODEOWNERS로 특정 경로에 대한 리뷰어를 지정.- 민감한 설정 변경은 2인 이상의 승인 요구하도록 브랜치 보호 구성.
-
환경 변수 관리
.env에 토큰 저장 금지. 로컬은.env사용하되 절대 커밋하지 않음.- GitHub Secrets에
BOT_TOKEN,SSH_PRIVATE_KEY등 등록.
예시 .env.example
DISCORD_TOKEN=
NODE_ENV=development
간단한 Node.js 디스코드 봇 (discord.js) 예
// index.js
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
const token = process.env.DISCORD_TOKEN;
if (!token) throw new Error('DISCORD_TOKEN이 설정되어야 합니다.');
client.once('ready', () => console.log(`Logged in as ${client.user.tag}`));
client.login(token);
2단계: CI/CD와 배포 자동화 (호스팅 연동)
-
CI 파이프라인
- PR마다
npm ci→ 린트 → 테스트를 실행해 품질 보장. workflow에서 취약점 스캔이나 의존성 검사 추가 고려.
- PR마다
-
배포 자동화
- 성공한
main병합 시 자동 배포. - GitHub Actions에 호스팅 접근 정보(예:
SSH_PRIVATE_KEY)를 시크릿으로 등록. - 호스팅 공급자로는
디스호스트같은 호스팅을 사용 가능하며, 배포 키나 Docker 이미지를 이용해 안전하게 배포한다.
- 성공한
예시 GitHub Actions 워크플로(SSH로 배포)
name: CI & Deploy
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- run: npm ci
- run: npm test
- name: Deploy via SSH
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /path/to/app
git pull
npm ci --production
pm2 restart bot || pm2 start index.js --name bot
-
개발환경 통일
- Docker 개발 컨테이너 혹은
devcontainer를 구성해 로컬 환경 차이를 줄인다. npm ci와 락파일로 모든 개발자가 동일한 의존성 사용.
- Docker 개발 컨테이너 혹은
-
비상 복구와 롤백
- 배포 시 버전 태그 사용(
v1.2.0)으로 빠른 롤백 가능. - 점진적 배포(블루/그린 또는 Canary)를 도입하면 서비스 중단 위험 감소.
- 배포 시 버전 태그 사용(
마무리
GitHub 기반의 명확한 브랜치·리뷰 규칙, 환경 변수의 안전한 관리, CI/CD 자동화로 협업 안정성과 배포 신뢰도를 높일 수 있다. 디스코드 봇 개발은 코드 품질과 비밀 관리, 배포 자동화에 투자하면 더 적은 트러블로 빠르게 확장 가능하다.