Discord 봇: 실행과 모니터링
systemd로 VPS에서 Discord 봇을 실행하고, 메모리를 제한하며, 로그를 읽고, 속도 제한을 처리하고, 다운타임 없이 업데이트하는 방법을 알아봐요.
업데이트 2026년 8월 23일
Discord 봇은 Discord 게이트웨이에 지속적인 WebSocket 연결을 유지하므로, 항상 켜져 있는 머신이 필요해요. 리소스 요구량은 크지 않지만, Telegram 봇과 달리 재시작을 더 나쁘게 처리해요. 재시작할 때마다 게이트웨이에 새로 연결해야 하거든요.
설치
useradd -r -m -d /srv/dbot -s /usr/sbin/nologin dbot
cd /srv/dbot && sudo -u dbot git clone https://github.com/you/bot.git .
sudo -u dbot npm ci --omit=dev
install -o dbot -g dbot -m 600 /dev/null /srv/dbot/.env
토큰과 ID를 .env에 넣어요. Discord Developer Portal에서 발급한 토큰은 봇에 대한 전체 접근 권한이에요. 비밀번호처럼 다뤄야 해요.
Python 라이브러리도 절차는 같아요. 가상 환경을 사용해요. 자세한 내용은 Python 앱을 참고해요.
서비스
/etc/systemd/system/dbot.service:
[Unit]
Description=Discord bot
After=network-online.target
Wants=network-online.target
[Service]
User=dbot
WorkingDirectory=/srv/dbot
EnvironmentFile=/srv/dbot/.env
ExecStart=/usr/bin/node index.js
Restart=always
RestartSec=15
MemoryMax=512M
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now dbot
RestartSec=15는 표준 5초 대신 사용해요. 게이트웨이 연결이 끊겼을 때 잦은 재시작은 Discord 측에서 연결을 일시적으로 차단하게 만들거든요.
MemoryMax는 메모리 누수가 있는 봇이 머신 전체를 끌어내리는 것을 막아줘요. 특히 2 GB인 VDS-1에서 중요해요.
모니터링
systemctl status dbot
journalctl -u dbot -f
journalctl -u dbot --since today -p err
systemctl show dbot -p NRestarts
NRestarts가 가장 유용한 지표예요. 이 카운터가 매시간 증가하면 봇이 크래시하고 있고 Restart=always가 이를 가리고 있는 거예요.
특정 서비스의 메모리 사용량:
systemctl status dbot | grep Memory
머신 전체 상황은 /hosting/vds/m/<id> 패널의 "개요"에서 CPU, 메모리, 트래픽 그래프를 참고해요.
속도 제한
Discord는 API 호출에 속도 제한을 걸어요. 징후는 로그의 429 오류와 "멈춘" 명령어예요. 도움이 되는 것들:
- 일시 정지 없이 반복해서 메시지를 보내지 않아요.
- 새 메시지를 보내는 대신 하나의 메시지를 편집해요.
- 매 이벤트마다 요청하는 대신 참조 데이터를 캐시해요.
- 대량 브로드캐스트에는 Redis 큐를 사용해요.
업데이트
cd /srv/dbot
sudo -u dbot git pull
sudo -u dbot npm ci --omit=dev
systemctl restart dbot
journalctl -u dbot -n 50
마지막 줄은 필수예요. 봇이 새 의존성에서 크래시하지 않고 게이트웨이에 연결되었는지 확인해요.
자주 발생하는 오류
| 증상 | 원인 |
|---|---|
| 봇이 온라인이지만 명령어에 응답하지 않음 | Developer Portal에서 필요한 인텐트가 활성화되지 않음 |
| 지속적인 재연결 | RestartSec이 너무 짧거나 이벤트 핸들러에서 크래시 발생 |
Invalid token | 토큰이 재생성되었고 .env가 업데이트되지 않음 |
| 명령어가 중복됨 | 봇의 복사본 두 개가 실행 중 — ps aux | grep node로 확인 |
| 머신이 스왑을 시작함 | MemoryMax가 없거나 코드에 누수가 있음 |
봇을
screen이나tmux에서 실행하지 마세요. 세션은 SSH 연결 끊김은 견디지만 머신 재부팅은 견디지 못해요. 그리고 한 달 뒤에는 어디서 실행 중인지조차 잊게 될 거예요.