이 글에서는 디스코드 봇을 디스호스트에 올려 운영할 때 환경변수를 안전하게 등록하고 코드에서 읽어 오는 방법을 정리한다. .env 사용과 python-dotenv 적용, 컨테이너 재시작으로 변경사항을 즉시 반영하는 과정을 다룬다.
증상
app.py에서bot.run("톸은 검열")처럼 토큰을 하드코딩했거나 누락된 토큰으로 실행되어 봇이 기동하지 않는다.- 로그가 길어 실제 오류 원인을 찾기 어려운 상태가 자주 발생한다.
- 깃허브에 코드를 푸시했으나 환경변수 변경이 바로 적용되지 않아 지연되는 것처럼 보인다.
원인
- 토큰을 소스코드에 직접 넣거나
.env에 등록만 하고 로드 코드를 추가하지 않아os.getenv가 빈 값을 반환한다. - 호스팅 플랫폼(디스호스트)에서 환경변수나 파일 변경을 반영하려면 컨테이너 재시작이 필요하다. 푸시 후 자동 반영이 지연될 수 있다.
- 로그가 방대하면 토큰 관련 에러 메시지를 놓치기 쉽다(특히
bot.run()호출 지점 근처).
해결 방법
1단계: 환경변수 등록
- 로컬 개발이나 배포용으로
.env파일을 사용한다. 리포지토리에 절대 커밋하지 않도록.gitignore에 추가한다.
# .env
DISCORD_TOKEN=asdf...여기에_실제_토큰을_넣습니다
- 또는 디스호스트 호스팅 대시보드의 환경변수 입력란에
DISCORD_TOKEN키로 값을 등록한다(플랫폼 UI에서 제공하는 환경변수 입력 기능 사용).
2단계: 코드에서 안전하게 불러오기
python-dotenv를 설치하고, 애플리케이션 최상단에서.env를 로드한 뒤os.getenv로 읽어온 값을bot.run()에 전달한다.
# app.py (상단)
from dotenv import load_dotenv
import os
load_dotenv() # .env 파일이 있을 때 로드
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
if not DISCORD_TOKEN:
raise RuntimeError("DISCORD_TOKEN이 설정되지 않았습니다.")
# 기존의 하드코딩된 호출을 대체
# bot.run("톸은 검열") <-- 이 부분을 바꾼다
bot.run(DISCORD_TOKEN)
load_dotenv()호출은from dotenv import load_dotenv뒤에 반드시 위치시킨다(파일 최상단에 배치하면 안전).
3단계: 배포 후 반영(디스호스트)
- 환경변수를 디스호스트에서 추가하거나
.env를 수정한 뒤 컨테이너를 재시작한다. 푸시만으로는 즉시 반영되지 않는 경우가 있으므로 수동 재시작으로 변경사항을 즉시 적용한다. - 재시작 명령은 디스호스트 대시보드의 컨테이너 재시작 버튼을 사용하거나 제공되는 CLI/관리 페이지를 통해 수행한다.
- 재시작 후 로그에서
DISCORD_TOKEN관련 에러가 사라지고 봇이 정상 연결되는지 확인한다.
4단계: 디버깅 팁
- 로그가 길면
bot.run호출 근처의 스택트레이스를 찾아보면 토큰 관련 예외가 나온다. 파일 경로와 라인(예:File "/home/container/app.py", line 803)을 기준으로 검색하면 빠르다. - 토큰이 노출되지 않도록 로그에 토큰 값이 출력되지 않게 주의한다.
- 깃 커밋 히스토리에 토큰이 남아있다면
git filter-repo등으로 제거하고 토큰을 재발급한다.
마무리
디스코드 봇을 디스호스트에 안전하게 배포하려면 환경변수를 플랫폼에 등록하거나 .env를 사용하고 python-dotenv로 로드한 뒤 컨테이너를 재시작해 변경사항을 반영하면 된다. 토큰은 절대 소스코드에 하드코딩하지 말고 환경변수로 관리하라.