Docker와 AWS로 디스코드 봇 배포하기
아래는 Docker와 AWS EC2를 이용해 디스코드 봇(앱)을 배포하는 전체적인 흐름이에요. 각 단계를 하나씩 따라가면서 진행하면 됩니다. 최대한 상세하게 적었으니 참고해보세요.
1. 사전 준비 사항
AWS 계정 생성 및 EC2 인스턴스 생성
- AWS Console에서 EC2 인스턴스를 생성해야 합니다. (Amazon Linux 2, Ubuntu, etc. 원하는 OS를 선택)
- 인스턴스를 생성할 때, SSH로 접속할 수 있도록 키 페어를 생성하거나, 기존 키를 사용 가능하게 설정하세요.
- 보안 그룹 설정에서 필요한 경우 특정 포트를 오픈할 수도 있습니다. (일반적인 디스코드 봇은 인바운드로 들어오는 HTTP 요청이 별도로 없으므로 80/443 포트가 꼭 필요하진 않지만, 웹훅 등을 사용하면 포트가 필요할 수 있습니다. 기본적으로 봇은 Discord 서버에 outbound로만 연결하면 됩니다.)
Docker가 설치된 로컬 환경
- Docker가 정상적으로 동작하는지 확인:
docker --version
- Docker가 정상적으로 동작하는지 확인:
Node.js / npm / TypeScript 로컬 환경
- 프로젝트에서 TypeScript를 사용 중이므로
npx tsc등을 사용하려면 Node.js와 npm이 필요. - 이미 개발 환경에서 사용 중이라면 OK.
- 프로젝트에서 TypeScript를 사용 중이므로
**디스코드 봇 토큰(token)**과 (필요하다면) 구글 TTS API용 인증 파일(google-credentials.json) 준비
- 디스코드 봇을 돌리려면
DISCORD_BOT_TOKEN등의 환경 변수가 필요할 수 있어요. - 구글 TTS가 필요하면
google-credentials.json파일 위치를 어떻게 설정할지 생각해둡니다.
- 디스코드 봇을 돌리려면
2. 소스 코드 구성 확인
일반적으로 TypeScript로 작성된 봇을 Docker 컨테이너에서 돌리려면 다음 과정이 필요합니다.
- TypeScript를 JavaScript로 트랜스파일(컴파일)한다.
- 컴파일된 JS 코드를 Docker 컨테이너에 포함시킨다.
- 컨테이너 내에서
node dist/...?등의 명령으로 앱을 실행한다.
프로젝트 구조를 보면 tsconfig.json이 있고, src 안에 *.ts 파일들이 있네요. 보통 npx tsc로 빌드하면 dist 폴더나 다른 폴더(설정에 따라 다름)에 JS 파일이 생성되도록 설정합니다. 이 점을 먼저 확인하세요.
tsconfig.json에서"outDir": "dist"등으로 설정되어 있다면,npm run build시dist/폴더에 JS 파일이 생길 것.
3. Dockerfile 작성
Dockerfile은 프로젝트 루트(package.json이 있는 폴더)에 만들어두시면 됩니다. 예시는 다음과 같습니다.
# ---- 1. 베이스 이미지 선택 ----
FROM node:16-alpine
# ---- 2. 컨테이너 내부 작업 디렉토리 설정 ----
WORKDIR /app
# ---- 3. package.json, package-lock.json 복사 후 의존성 설치 ----
COPY package*.json ./
RUN npm install
# ---- 4. 소스 전체 복사 ----
COPY . .
# ---- 5. TypeScript 빌드 ----
RUN npm run build
# 빌드 결과물이 dist 폴더에 들어간다고 가정
# ---- 6. 실행 커맨드 설정 ----
# 예: dist/index.js 가 진입점이라고 가정
CMD ["node", "dist/index.js"]
주의:
npm run build가tsc를 수행하도록 package.json에 스크립트가 설정되어 있어야 합니다.// package.json "scripts": { "build": "tsc", "start": "node dist/index.js" }
- 만약 `google-credentials.json`이 필요하다면 해당 파일도 COPY 단계에서 포함되도록 해야 합니다(또는 volume 마운트).
4. Docker 이미지 빌드 & 로컬 테스트
이제 로컬에서 도커 이미지를 빌드하고 컨테이너를 실행하여 잘 동작하는지 확인해봅시다.
Docker 이미지 빌드
docker build -t my-discord-bot .-t my-discord-bot는 이미지 이름을 의미합니다.- Dockerfile이 현재 디렉토리에 있다는 점을
.으로 표시합니다.
환경 변수 설정 (예: 디스코드 토큰)
- 디스코드 토큰 등은 보통 안전하게 관리하기 위해 환경 변수로 주입합니다.
- 예를 들어
docker run -e DISCORD_BOT_TOKEN=xxxxx -it my-discord-bot이런 식으로 넘길 수 있어요. - 만약 구글 TTS JSON 파일 경로를 환경 변수로 잡아야 한다면 비슷하게
-e GOOGLE_CREDENTIALS=...등을 넘기거나, 컨테이너에 복사된 파일을 지정하도록 코드를 작성해야 합니다.
Docker 컨테이너 실행 테스트
docker run -d \ --name discord-bot \ -e DISCORD_BOT_TOKEN=your_token_here \ my-discord-bot-d는 백그라운드 모드로 실행.--name discord-bot는 컨테이너에 이름을 붙임.- 정상적으로 봇이 실행되면 디스코드 서버에서 봇이 온라인 상태인지 확인합니다.
- 에러가 있을 경우
docker logs discord-bot명령으로 로그를 확인하세요.
로컬에서 이 테스트가 끝나면, 배포할 준비가 된 것입니다.
5. AWS EC2 서버 설정
5.1. EC2에 SSH 접속
로컬에서
ssh -i <redacted-key>.pem ec2-user@<EC2 퍼블릭 IP 주소>(Amazon Linux 기준) 명령으로 접속합니다.- Ubuntu라면
ssh -i <redacted-key>.pem ubuntu@<EC2 퍼블릭 IP 주소>로 접속.
- Ubuntu라면
접속 후,
sudo yum update -y(Amazon Linux) 혹은sudo apt-get update && sudo apt-get upgrade -y(Ubuntu) 등으로 업데이트.
5.2. EC2에 Docker 설치
(Amazon Linux 2 기준)
# 1. 도커 설치
sudo yum install -y docker
# 2. 도커 서비스 시작 및 재부팅시 자동시작 설정
sudo service docker start
sudo systemctl enable docker
# 3. ec2-user를 docker 그룹에 추가(옵션)
sudo usermod -a -G docker ec2-user
# -> 이 명령어 후에는 ec2-user로 재접속해야 docker 명령 사용 가능
(Ubuntu 기준)
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ubuntu
# -> 이 명령어 후에는 ubuntu 유저로 재접속 또는 로그아웃/로그인해야 docker 명령 사용 가능
6. Docker 이미지 업로드/배포 방법
방법 A) Docker Hub 등을 사용해 이미지 푸시/풀
- Docker Hub 계정이 있다면, 로컬에서 빌드한 이미지를 Docker Hub에 push할 수 있습니다.
- EC2에서 Docker Hub로부터 pull 받아서 실행하는 방법입니다.
절차:
- Docker Hub 로그인 (로컬)
docker login - 이미지 태깅 후 push
docker tag my-discord-bot <도커허브아이디>/my-discord-bot:latest docker push <도커허브아이디>/my-discord-bot:latest - EC2에서 pull
docker pull <도커허브아이디>/my-discord-bot:latest - EC2에서 실행
docker run -d \ --name discord-bot \ -e DISCORD_BOT_TOKEN=your_token_here \ <도커허브아이디>/my-discord-bot:latest
방법 B) 직접 EC2에서 Git clone 후 Docker build
- EC2에 Git 설치 (Amazon Linux, Ubuntu 공통)
혹은sudo yum install -y gitsudo apt-get install -y git - 프로젝트 clone
git clone https://github.com/your-repo/discord-bot.git cd discord-bot - Docker build
docker build -t my-discord-bot . - Docker run
docker run -d \ --name discord-bot \ -e DISCORD_BOT_TOKEN=your_token_here \ my-discord-bot
둘 다 장단점이 있습니다. A 방법은 CI/CD 파이프라인 구축에 좋고, B 방법은 빠르게 테스트하기에 편합니다.
7. 봇이 제대로 동작하는지 확인
docker ps명령으로 컨테이너가 실행 중인지 확인합니다.docker logs discord-bot명령으로 로그를 보면서 에러가 없는지 확인합니다.- 디스코드 서버(테스트 서버)에서 봇이 온라인인지, 명령어를 제대로 처리하는지 확인합니다.
8. (선택) 서버 재부팅 시 자동 실행 설정
EC2를 재부팅하면 docker 컨테이너도 꺼집니다. 자동으로 다시 띄우려면 방법이 여러 가지인데, 대표적으로 docker-compose + restart: always 또는 systemd를 이용할 수 있습니다.
8.1. Docker-compose 예시
- EC2에 docker-compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose - 프로젝트 폴더에
docker-compose.yml파일 작성 (예시)version: '3' services: discord-bot: image: <도커허브아이디>/my-discord-bot:latest container_name: discord-bot environment: - DISCORD_BOT_TOKEN=your_token_here restart: always - 실행
docker-compose up -d restart: always를 지정했으므로 서버 재부팅 시 자동 실행됩니다.
9. 자주 하는 실수 / 체크리스트
- 디스코드 토큰을 깃에 올리지 말기
.env파일이나 AWS Systems Manager Parameter Store 등을 사용해 안전하게 관리.
- 보안 그룹 확인
- 디스코드 봇은 보통 80/443 포트를 열 필요가 없지만, 웹훅이나 HTTP 서버가 필요하다면 인바운드 규칙을 열어야 할 수 있음.
- 로그 확인
- 에러 발생 시
docker logs <container-name>또는docker-compose logs로 로그 확인.
- 에러 발생 시
- AWS 비용
- EC2 인스턴스가 계속 구동되므로 과금이 발생합니다. t2.micro 또는 t3.micro 같은 프리티어(신규 계정이면 1년 무료) 또는 비용이 적은 사양 사용을 권장.
결론
정리하면,
- 로컬에서 TypeScript -> JS 빌드가 정상적으로 되는지, 그리고 도커 컨테이너로 봇이 잘 동작하는지 확인.
- AWS EC2 준비 후 Docker를 설치.
- 이미지 업로드(Docker Hub) 또는 소스 clone해서 EC2에서 직접 빌드.
- 도커 컨테이너 실행 및 환경 변수(DISCORD_BOT_TOKEN 등) 주입.
- 봇이 온라인 상태인지, 로그를 통해 정상 작동되는지 확인.
- 서버 재부팅 시 자동 실행 설정(선택).
이 과정을 순서대로 따라가면 디스코드 앱(봇)을 AWS EC2에 무리 없이 올릴 수 있습니다. 천천히 따라 해보시고, 중간에 궁금한 점이 생기면 해당 단계의 로그나 오류 메시지를 확인하면서 문제를 해결해나가면 돼요.
잘 배포하시길 바랍니다!