posts

Docker와 AWS로 디스코드 봇 배포하기

Mar 15, 2025 updated Mar 15, 2025 awsdockerhttpnodetokens

아래는 DockerAWS EC2를 이용해 디스코드 봇(앱)을 배포하는 전체적인 흐름이에요. 각 단계를 하나씩 따라가면서 진행하면 됩니다. 최대한 상세하게 적었으니 참고해보세요.


1. 사전 준비 사항

  1. AWS 계정 생성 및 EC2 인스턴스 생성

    • AWS Console에서 EC2 인스턴스를 생성해야 합니다. (Amazon Linux 2, Ubuntu, etc. 원하는 OS를 선택)
    • 인스턴스를 생성할 때, SSH로 접속할 수 있도록 키 페어를 생성하거나, 기존 키를 사용 가능하게 설정하세요.
    • 보안 그룹 설정에서 필요한 경우 특정 포트를 오픈할 수도 있습니다. (일반적인 디스코드 봇은 인바운드로 들어오는 HTTP 요청이 별도로 없으므로 80/443 포트가 꼭 필요하진 않지만, 웹훅 등을 사용하면 포트가 필요할 수 있습니다. 기본적으로 봇은 Discord 서버에 outbound로만 연결하면 됩니다.)
  2. Docker가 설치된 로컬 환경

    • Docker가 정상적으로 동작하는지 확인: docker --version
  3. Node.js / npm / TypeScript 로컬 환경

    • 프로젝트에서 TypeScript를 사용 중이므로 npx tsc 등을 사용하려면 Node.js와 npm이 필요.
    • 이미 개발 환경에서 사용 중이라면 OK.
  4. **디스코드 봇 토큰(token)**과 (필요하다면) 구글 TTS API용 인증 파일(google-credentials.json) 준비

    • 디스코드 봇을 돌리려면 DISCORD_BOT_TOKEN 등의 환경 변수가 필요할 수 있어요.
    • 구글 TTS가 필요하면 google-credentials.json 파일 위치를 어떻게 설정할지 생각해둡니다.

2. 소스 코드 구성 확인

일반적으로 TypeScript로 작성된 봇을 Docker 컨테이너에서 돌리려면 다음 과정이 필요합니다.

  1. TypeScript를 JavaScript로 트랜스파일(컴파일)한다.
  2. 컴파일된 JS 코드를 Docker 컨테이너에 포함시킨다.
  3. 컨테이너 내에서 node dist/...? 등의 명령으로 을 실행한다.

프로젝트 구조를 보면 tsconfig.json이 있고, src 안에 *.ts 파일들이 있네요. 보통 npx tsc로 빌드하면 dist 폴더나 다른 폴더(설정에 따라 다름)에 JS 파일이 생성되도록 설정합니다. 이 점을 먼저 확인하세요.

  • tsconfig.json에서 "outDir": "dist" 등으로 설정되어 있다면, npm run builddist/ 폴더에 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 buildtsc를 수행하도록 package.json에 스크립트가 설정되어 있어야 합니다.
    
    

// package.json "scripts": { "build": "tsc", "start": "node dist/index.js" }

- 만약 `google-credentials.json`이 필요하다면 해당 파일도 COPY 단계에서 포함되도록 해야 합니다(또는 volume 마운트).

4. Docker 이미지 빌드 & 로컬 테스트

이제 로컬에서 도커 이미지를 빌드하고 컨테이너를 실행하여 잘 동작하는지 확인해봅시다.

  1. Docker 이미지 빌드

    docker build -t my-discord-bot .
    
    • -t my-discord-bot는 이미지 이름을 의미합니다.
    • Dockerfile이 현재 디렉토리에 있다는 점을 .으로 표시합니다.
  2. 환경 변수 설정 (예: 디스코드 토큰)

    • 디스코드 토큰 등은 보통 안전하게 관리하기 위해 환경 변수로 주입합니다.
    • 예를 들어 docker run -e DISCORD_BOT_TOKEN=xxxxx -it my-discord-bot 이런 식으로 넘길 수 있어요.
    • 만약 구글 TTS JSON 파일 경로를 환경 변수로 잡아야 한다면 비슷하게 -e GOOGLE_CREDENTIALS=... 등을 넘기거나, 컨테이너에 복사된 파일을 지정하도록 코드를 작성해야 합니다.
  3. 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 접속

  1. 로컬에서 ssh -i <redacted-key>.pem ec2-user@<EC2 퍼블릭 IP 주소> (Amazon Linux 기준) 명령으로 접속합니다.

    • Ubuntu라면 ssh -i <redacted-key>.pem ubuntu@<EC2 퍼블릭 IP 주소> 로 접속.
  2. 접속 후, 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 등을 사용해 이미지 푸시/풀

  1. Docker Hub 계정이 있다면, 로컬에서 빌드한 이미지를 Docker Hub에 push할 수 있습니다.
  2. EC2에서 Docker Hub로부터 pull 받아서 실행하는 방법입니다.

절차:

  1. Docker Hub 로그인 (로컬)
    docker login
    
  2. 이미지 태깅 후 push
    docker tag my-discord-bot <도커허브아이디>/my-discord-bot:latest
    docker push <도커허브아이디>/my-discord-bot:latest
    
  3. EC2에서 pull
    docker pull <도커허브아이디>/my-discord-bot:latest
    
  4. EC2에서 실행
    docker run -d \
      --name discord-bot \
      -e DISCORD_BOT_TOKEN=your_token_here \
      <도커허브아이디>/my-discord-bot:latest
    

방법 B) 직접 EC2에서 Git clone 후 Docker build

  1. EC2에 Git 설치 (Amazon Linux, Ubuntu 공통)
    sudo yum install -y git
    
    혹은
    sudo apt-get install -y git
    
  2. 프로젝트 clone
    git clone https://github.com/your-repo/discord-bot.git
    cd discord-bot
    
  3. Docker build
    docker build -t my-discord-bot .
    
  4. 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 예시

  1. 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
    
  2. 프로젝트 폴더에 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
    
  3. 실행
    docker-compose up -d
    
  4. restart: always를 지정했으므로 서버 재부팅 시 자동 실행됩니다.

9. 자주 하는 실수 / 체크리스트

  1. 디스코드 토큰을 깃에 올리지 말기
    • .env 파일이나 AWS Systems Manager Parameter Store 등을 사용해 안전하게 관리.
  2. 보안 그룹 확인
    • 디스코드 봇은 보통 80/443 포트를 열 필요가 없지만, 웹훅이나 HTTP 서버가 필요하다면 인바운드 규칙을 열어야 할 수 있음.
  3. 로그 확인
    • 에러 발생 시 docker logs <container-name> 또는 docker-compose logs로 로그 확인.
  4. AWS 비용
    • EC2 인스턴스가 계속 구동되므로 과금이 발생합니다. t2.micro 또는 t3.micro 같은 프리티어(신규 계정이면 1년 무료) 또는 비용이 적은 사양 사용을 권장.

결론

정리하면,

  1. 로컬에서 TypeScript -> JS 빌드가 정상적으로 되는지, 그리고 도커 컨테이너로 봇이 잘 동작하는지 확인.
  2. AWS EC2 준비 후 Docker를 설치.
  3. 이미지 업로드(Docker Hub) 또는 소스 clone해서 EC2에서 직접 빌드.
  4. 도커 컨테이너 실행환경 변수(DISCORD_BOT_TOKEN 등) 주입.
  5. 봇이 온라인 상태인지, 로그를 통해 정상 작동되는지 확인.
  6. 서버 재부팅 시 자동 실행 설정(선택).

이 과정을 순서대로 따라가면 디스코드 앱(봇)을 AWS EC2에 무리 없이 올릴 수 있습니다. 천천히 따라 해보시고, 중간에 궁금한 점이 생기면 해당 단계의 로그나 오류 메시지를 확인하면서 문제를 해결해나가면 돼요.

잘 배포하시길 바랍니다!