해당 글은, 제가 작성한 Discord.js 보일러플레이트를 기반으로 합니다. 해당 보일러픝레이트는 다음에라도 봇을 빠르게 만들고 싶으실 때 사용하실 수 있습니다. Discord.js TypeScript Boilerplate
안녕하세요! 지난 시간에는 Prisma를 사용해서 데이터베이스 연동을 해봤습니다. 이제 우리 봇은 데이터를 영구적으로 저장할 수 있게 되었고, 꽤나 완성도 있는 모습을 갖추게 되었죠.
하지만 아직 우리 봇은 로컬 컴퓨터에서만 동작하고 있습니다. 컴퓨터를 끄면 봇도 함께 꺼지고, 다른 사람들이 우리 봇을 사용하려면 항상 컴퓨터를 켜두고 있어야 하죠. 이번 시간에는 봇을 실제 서버에 배포해서 24시간 내내 안정적으로 운영하는 방법을 알아보겠습니다.
봇 호스팅에는 여러 가지 방법이 있는데, 각각의 장단점과 비용, 그리고 설정 방법까지 차근차근 살펴보겠습니다. 처음에는 조금 복잡해 보일 수 있지만, 한 번 설정해두면 정말 편리하게 봇을 운영할 수 있어요.
봇 호스팅 방법들 비교하기
봇을 호스팅하는 방법은 크게 몇 가지로 나눌 수 있습니다. 각각의 특징을 먼저 알아보고, 본인의 상황에 맞는 방법을 선택해보세요.
1. VPS (Virtual Private Server)
VPS는 가상 사설 서버로, 클라우드 환경에서 독립적인 서버 환경을 제공받는 방식입니다. AWS EC2, Google Cloud Compute Engine, 가비아, 호스팅케이알 등이 대표적이죠.
장점:
- 완전한 서버 제어권을 가질 수 있어요
- 다양한 프로그램과 서비스를 함께 운영할 수 있어요
- 리눅스 서버 관리 경험을 쌓을 수 있어요
단점:
- 서버 관리에 대한 기본 지식이 필요해요
- 보안 설정, 업데이트 등을 직접 관리해야 해요
- 초기 설정이 복잡할 수 있어요
2. 디스코드 봇 전용 호스팅
디스호스트(DisHost) 같은 디스코드 봇 전용 호스팅 서비스입니다. 봇 운영에 최적화되어 있어서 별도의 서버 관리 없이도 쉽게 봇을 호스팅할 수 있어요.
장점:
- GUI 패널로 쉽게 관리할 수 있어요
- 디스코드 봇에 특화된 기능들을 제공해요
- 한국어 지원과 빠른 고객 지원을 받을 수 있어요
- 복잡한 서버 설정 없이 바로 사용 가능해요
단점:
- 봇 운영 외의 다른 용도로는 사용하기 어려워요
- 제공업체의 정책에 따라 제약이 있을 수 있어요
3. 클라우드 플랫폼 (PaaS)
Heroku, Railway, Render 등의 PaaS(Platform as a Service) 서비스를 이용하는 방법입니다.
장점:
- Git 연동으로 자동 배포가 가능해요
- 서버 관리 부담이 적어요
단점:
- 제약이 많아요 (시간 제한, 슬립 모드 등)
- 데이터베이스 등 추가 서비스 비용이 발생할 수 있어요
- 일부 서비스는 한국에서 속도가 느릴 수 있어요
디스호스트로 간편하게 배포하기
VPS 설정이 복잡하다고 느끼신다면, 디스호스트 같은 전용 호스팅 서비스를 사용하는 것도 좋은 선택입니다.
디스호스트 가입하기
- 디스호스트 홈페이지에 접속합니다
- 구글, 네이버, 카카오 계정으로 간편 로그인합니다
- 이용 약관에 동의합니다
- Pterodactyl 패널 연결을 위한 정보를 입력합니다
크레딧 충전 및 플랜 구매
- 대시보드의 크레딧 탭에서 충전하기 버튼을 클릭합니다
- 계좌이체나 문화상품권으로 결제합니다
- 봇 플랜을 필요한 사양에 맞게 구매합니다
봇 업로드 및 실행
- Pterodactyl 패널에 접속합니다
- 파일 매니저를 통해 봇 파일들을 업로드합니다
- 터미널에서
npm install
로 의존성을 설치합니다 - 환경 변수를 설정합니다
npm start
또는node dist/index.js
로 봇을 실행합니다
자세한 과정은 디스호스트 공식 가이드를 참고하시면 됩니다.
배포 시 주의사항들
1. 환경 변수 보안
절대로 .env
파일을 Git에 커밋하지 마세요. .gitignore
파일에 다음을 추가해주세요:
.env
.env.local
.env.production
node_modules/
dist/
*.log
2. 에러 로깅
프로덕션 환경에서는 에러 로깅이 매우 중요합니다. 간단한 로깅 시스템을 추가해보세요:
// src/utils/logger.ts
export const logger = {
info: (message: string) => {
console.log(`[INFO] ${new Date().toISOString()}: ${message}`);
},
error: (message: string, error?: Error) => {
console.error(`[ERROR] ${new Date().toISOString()}: ${message}`);
if (error) {
console.error(error.stack);
}
},
};
// 사용 예시
import { logger } from "./utils/logger";
client.on("ready", () => {
logger.info(`봇이 ${client.user?.tag}로 로그인했습니다!`);
});
client.on("error", (error) => {
logger.error("Discord.js 클라이언트 에러:", error);
});
3. 모니터링
봇이 정상적으로 작동하는지 모니터링하는 것도 중요합니다. 간단한 헬스체크 기능을 추가해보세요:
// src/utils/healthcheck.ts
export function startHealthCheck() {
setInterval(() => {
if (client.isReady()) {
logger.info("봇 상태 정상");
} else {
logger.error("봇 연결 끊어짐 감지");
// 필요시 재연결 로직 추가
}
}, 60000); // 1분마다 체크
}
배포 후 할 일들
슬래시 명령어 전역 등록
개발 중에는 특정 서버에만 명령어를 등록했지만, 배포 후에는 전역으로 등록하는 것을 고려해보세요:
// src/deploy-commands.ts 수정
const rest = new REST().setToken(config.DISCORD_TOKEN);
// 전역 등록 (guild_id 없이)
await rest.put(Routes.applicationCommands(config.DISCORD_CLIENT_ID), {
body: commands,
});
서버 상태 명령어 추가
봇의 상태를 확인할 수 있는 명령어를 추가하면 유용합니다:
// src/commands/status.ts
export const data = new SlashCommandBuilder()
.setName("상태")
.setDescription("봇의 현재 상태를 확인합니다");
export async function execute(interaction: ChatInputCommandInteraction) {
const uptime = process.uptime();
const hours = Math.floor(uptime / 3600);
const minutes = Math.floor((uptime % 3600) / 60);
const embed = new EmbedBuilder()
.setTitle("🤖 봇 상태")
.addFields(
{ name: "업타임", value: `${hours}시간 ${minutes}분`, inline: true },
{
name: "서버 수",
value: `${interaction.client.guilds.cache.size}개`,
inline: true,
},
{
name: "사용자 수",
value: `${interaction.client.users.cache.size}명`,
inline: true,
}
)
.setColor(0x00ae86)
.setTimestamp();
await interaction.reply({ embeds: [embed] });
}
마무리하며
이번 시간에는 Discord.js 봇을 실제 서버에 배포하여 24/7 운영하는 방법을 알아봤습니다. VPS를 사용한 직접 배포부터 디스호스트 같은 전용 호스팅 서비스까지, 다양한 선택지가 있으니 본인의 상황에 맞는 방법을 선택하시면 됩니다. 에러 로깅과 모니터링, 백업 등의 운영 요소들도 함께 고려하면 더욱 견고한 봇 서비스를 만들 수 있어요.
다음 시간에는 대화형 UI: 셀렉트 메뉴와 모달 활용하기에 대해 알아보겠습니다. 사용자와 더욱 풍부한 상호작용을 할 수 있는 고급 UI 컴포넌트들을 활용하는 방법을 배워보겠어요. 기대해주세요!
'DiscordJS 개발 튜토리얼' 카테고리의 다른 글
[DiscordJS 봇 개발 튜토리얼] 11. 사용자 반응(이모지) 기반 기능 만들기: 손쉬운 상호작용의 시작 (0) | 2025.06.12 |
---|---|
[DiscordJS 봇 개발 튜토리얼] 10. 대화형 UI: 셀렉트 메뉴와 모달 활용하기 (6) | 2025.06.11 |
[DiscordJS 봇 개발 튜토리얼] 8. Prisma로 SQLite, MySQL 연동하기 (2) | 2025.06.10 |
[DiscordJS 봇 개발 튜토리얼] 7. 역할과 권한 체크 구현하기: 봇에게 질서를 부여하자! (1) | 2025.06.09 |
[DiscordJS 봇 개발 튜토리얼] 6. 이벤트 핸들링 마스터하기: 봇을 살아 움직이게 만드는 비법 (1) | 2025.06.08 |