이 글에서는 디스코드 봇을 디스호스트 환경에 배포할 때 자주 마주치는 콘솔 명령어 제한, 엔트리 파일 이름 문제, requirements.txt 인식 실패 등에 대해 경험을 바탕으로 정리한다. 간단한 확인 절차와 우회 방법, 코드 예제를 통해 빠르게 해결할 수 있다.
증상
- 호스팅 환경에서
pip install등 콘솔 명령어로 설치해도 반영되지 않거나 권한 오류가 발생한다. - 에러:
/usr/local/bin/python: can't open file '/home/container/app.py': [Errno 2] No such file or directory requirements.txt를 넣었는데 라이브러리가 설치되지 않는 것처럼 보인다.- 초기 템플릿 파일(index.js, main.py 등)이 비어 있어서 어디에 코드를 넣어야 할지 모른다.
원인
- 디스호스트는 가상화/컨테이너 기반으로 격리된 환경을 사용하므로, 직접 콘솔에서 패키지를 설치해도 컨테이너 이미지나 실행 환경에 반영되지 않거나 설치 권한이 제한될 수 있다.
- 런타임에서 기대하는 엔트리 파일명이 고정되어 있어(예:
app.py) 다른 이름(main.py)을 사용하면 파일을 찾지 못한다. - 자동 템플릿으로 생성되는 파일들이 비어 있고,
.env나requirements.txt가 올바른 형식이 아니면 환경변수/의존성 반영이 실패할 수 있다.
해결 방법
1단계: 엔트리 파일과 기본 파일 확인
- 파이썬은 디폴트 엔트리 파일명이
app.py인지 확인한다. 파일명이main.py라면 이름을app.py로 변경한다. - Node.js 템플릿은
index.js가 빈 파일로 생성되기도 한다. 필요한 봇 코드를 해당 파일에 넣는다. - 권장 파이썬 버전: 3.11. 런타임 설정에서 버전 확인/변경이 가능하면 맞춰둔다.
2단계: .env와 토큰 설정
- Node.js(또는 환경변수 사용 시)
.env파일에 인증 토큰을 넣는다. 예시:
DISCORD_TOKEN=여기에_토큰_입력
- 따옴표 없이 토큰 문자열만 넣는다.
3단계: requirements.txt가 작동하지 않을 때 우회
- 먼저
requirements.txt에 최소한 필수 라이브러리(예:requests,discord.py)를 넣어둔다. (requirements.txt예시)
requests
discord.py
- 호스팅에서
pip를 직접 실행할 수 없거나 자동 설치가 실패하면 런타임에서 설치하도록 시도할 수 있다(허용되는 환경에서만 사용). 다음 코드를app.py맨 위에 추가하면 실행 중 설치를 시도한다.
import sys
import subprocess
def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
install("requests")
install("discord.py")
- 또 다른 우회 방법으로는 실행 경로에 직접 라이브러리를 넣고 Python의 모듈 경로에 추가하는 것이다. 예:
import sys
sys.path.append("./lib")
import requests
import discord
- 위 방법은 호스팅이 외부 패키지 설치를 제한하지만, 수동으로 라이브러리 파일을 업로드하거나 작은 패키지는 런타임에서 설치 가능한 경우에 유효하다. 용량이 큰 패키지는 실패할 수 있다.
4단계: Node.js로 전환 고려 (선택사항)
- Python 환경에서 반복적으로 문제를 겪는다면 Node.js로 전환하는 것도 방법이다. Node.js 템플릿(
index.js)과.env를 이용해 디스코드 봇을 구성하면 파일명/런타임 차이로 인한 일부 문제를 피할 수 있다. 다만 언어 전환 작업이 필요하다.
마무리
디스코드 봇을 디스호스트에 배포할 때는 엔트리 파일명(app.py)과 .env 형식, 그리고 컨테이너 환경에서의 패키지 설치 제약을 우선 확인한다. requirements.txt 자동 설치가 실패하면 런타임 설치(subprocess)나 sys.path 우회로 해결할 수 있다.