달나라 노트

Python Discord : Python으로 Discord bot 만들기 03. Discord bot 호스팅하기, Discord bot 24시간 실행 (Heroku 사용) 본문

Python/Python ETC

Python Discord : Python으로 Discord bot 만들기 03. Discord bot 호스팅하기, Discord bot 24시간 실행 (Heroku 사용)

CosmosProject 2022. 2. 21. 19:50
728x90
반응형

 

 

 

지난번까지 discord bot을 만들고 작동까지 시켜봤습니다.

 

Discord bot 만들기 1 = https://cosmosproject.tistory.com/384

Discord bot 만들기 2 = https://cosmosproject.tistory.com/482

 

 

근데 아주 결정적인 문제가 있습니다.

기본적으로 discord bot은 여러분이 컴퓨터에서 작성한 Python code를 실행시켜놓은 상태에서만 작동을 한다는 것입니다.

 

즉, 내가 컴퓨터를 계속 켜두고 discord bot의 내용이 담긴 코드를 실행시켜두지 않으면 그 시간에는 그 누구도 discord bot을 이용할 수 없죠.

 

이 부분을 해결하려면 나의 discord bot을 계속 실행시켜줄 수단이 필요합니다.

보통 이런 과정에서는 서버에 코드를 올리는 것으로 가능합니다.

이러한 서비스를 제공하는건 AWS, Google Cloud Platform 등 여러 가지가 있지만 주로 discord bot의 간단한 무료 호스팅을 위해 자주 사용되는 Heroku를 이용해보려합니다.

 

Heroku의 홈페이지 링크 = https://www.heroku.com/

 

Heroku 사이트에 접속해서 로그인 또는 계정이 없다면 Sign up 버튼을 눌러서 회원가입을 해줍시다.

 

정보를 입력해줍니다.

 

 

 

 

 

 

 

 

그리고 이제 코드를 돌릴 app을 생성해야하기 때문에 우측 상단에 Create new app 버튼을 클릭해줍니다.

(Heroku 홈페이지의 개편 등에 의해 Create new app 버튼의 위치는 좀 다를 수 있습니다.)

 

 

 

 

 

 

 

 

 

그러면 위같은 화면이 뜹니다.

App name은 원하는 App이름을 입력해주시면 됩니다.

Choose a region은 App을 실행할 지역인데 미국과 유럽 2가지만 있어서 그냥 아무거나 선택합시다. 크게 차이는 없습니다.

 

그리고 Create app 버튼을 눌러주면 App이 생성됩니다.

 

 

그러면 위처럼 새로운 app이 생성된 것을 볼 수 있습니다.

 

 

 

 

 

 

사용할 언어가 python이라는 것을 설정해주기 위해 app을 클릭해서 Settings 버튼을 누릅시다.

 

 

 

 

 

Settings 화면에서 스크롤을 내려보면 Add buildpack이라는 버튼이 있습니다.

Add buildpack 버튼을 클릭해줍시다.

 

 

 

 

 

그러면 위와같은 화면이 뜨는데 우리는 discord bot을 python으로 작성했으므로 python을 클릭해줍시다.

클릭한 후 Save changes 버튼을 클릭해줍니다.

 

 

 

 

 

 

 

이제 컴퓨터에 Heroku CLI를 설치해야합니다.

이게 뭐냐면 간단하게 내 컴퓨터에서 Heroku를 조작할 수 있는 기능을 할 수 있도록 해주는 것이라고 이해하면 됩니다.

 

 

Deploy 탭으로 진입한 후 Heroku Git을 선택하면 Heroku CLI 다운로드 링크를 볼 수 있습니다.

 

 

그러면 아래와같이 각 운영체제별로 어떻게 Heroku를 설치할 수 있는지가 나와있습니다.

 

저는 Mac OS를 사용하고 있기 때문에 brew를 통해 heroku를 설치하려고합니다.

 

그러면 위 안내에 나와있는대로 terminal에 아래 명령어를 그대로 복사해서 붙여넣기한 후 엔터를 누르면 됩니다.

brew tap heroku/brew && brew install heroku

 

 

다만 위 명령어에서 보는 것처럼 heroku를 설치하려면 brew가 필요합니다.

 

본인의 Mac에 brew가 설치되지 않은 상태라면 brew를 먼저 설치해야 합니다.

 

Homebrew가 뭔지 간단하게 설명하자면 Mac OS에서 여러 패키지를 관리할 수 있도록 해주는 도구입니다. 주로 command line 도구 또는 시스템 패키지들을 설치하는데 사용됩니다.

예를들어 어떤 기능을 조작할 때 그 기능을 Mac OS의 terminal에서 명령어를 사용하여 조작할 수 있도록 해주는 tool을 설치해줄 때 brew를 사용합니다.

이번 예시에서는 Mac OS의 terminal에서 명령어를 사용하여 Heroku의 기능들을 제어할 수 있도록 해주는 tool을 설치해주는 역할을 하죠.

 

 

Homebrew link = https://brew.sh/index_ko

위 링크를 들어가면 아래와 같은 화면이 나옵니다.

 

 

 

 

그러면 위 빨간색 표시된 부분의 명령어를 그대로 복사해서 terminal에 붙여넣기 하면 됩니다.

명령어는 아래에 복사해뒀으니 편하신대로 사용하면 됩니다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

 

 

terminal에서 위 brew 설치 명령어를 입력하면 아래와같이 Command line에서 brew를 사용할 수 있는 툴들을 다운로드 받습니다.

쉽게 말해서 terminal에서 brew를 조작할 수 있는 명령어 사용을 가능하게 하기 위한 툴들을 다운로드 한다고 보시면 됩니다.

설치 과정 중에 Mac 비밀번호(Mac에 설정된 비밀번호)를 입력하라는 질문이 나오면 비밀번호를 입력해줍니다.

(설치에 시간이 좀 걸릴 수 있습니다.)

 

 

homebrew가 설치 완료되면 위같은 메세지가 뜹니다.

 

 

 

 

 

brew tap heroku/brew && brew install heroku

 

그럼 다시 Heroku CLI 설치로 돌아와서 위 명령어를 terminal에 붙여넣은 후 설치를 시작합시다.

 

이렇게 설치가 되면 이제 terminal에서 heroku 라는 글자로 시작하는 명령어들을 사용할 수 있게 됩니다.

 

 

 

참고로 Heroku 설치 중 위같은 에러메세지가 발생할 수도 있습니다.

이런 경우 Appstore로 가서 Xcode를 검색한 후 Xcode를 업데이트해줍시다.

 

 

 

 

 

 

 

 

 

 

이제 Heroku Git에 내가 작성한 파일들을 업로드할건데 이때 필요한 파일이 3개 더 있습니다.

 

아래 내용을 참고해서 아래 3개의 파일을 생성합시다.

이 파일들은 이름과 확장자를 반드시 동일하게 생성해줍시다.

 

 

1. runtime.txt

runtime.txt는 내가 업로드한 코드가 어떤 언어인지를 알려주는 내용을 담아주면 됩니다.

 

python-3.8.3

위 내용처럼 python과 사용하는 python version을 적어줍니다.

위 예시에서는 python 3.8.3 버전을 사용한다는 내용을 적어주었습니다.

 

(조금 더 아래에 내용이 나올테지만 heroku에서 사용 불가능한 python version이 있는 것 같습니다. 본인이 직접 아래 과정을 실행하면서 heroku에서 사용할 수 없는 python version이라는 error가 발생하면 runtime.txt 파일의 python version을 적절하게 수정해주면 됩니다.)

 

 

 

 

 

2. requirements.txt

requirements.txt는 내가 작성한 코드에서 사용되는 python library들을 적어두는 곳입니다.

 

discord는 discord bot을 만들기 위해 반드시 필요한 discord library입니다.

asyncio, openpyxl은 사실 직접적으로 사용하진 않았지만 예시를 위해 적어뒀습니다.

이처럼 사용되는 library와 각 library의 version을 적어두면 discord 코드를 Heroku에 호스팅할 때 내가 적어둔 version의 library들을 자동으로 설치해서 사용하게됩니다.

discord.py
asyncio
openpyxl
discord==1.7.3
numpy=1.22.2
asyncio==3.4.3
openpyxl==3.0.9

 

 

 

 

 

3. Procfile

Procfile은 Heroku에서 실행할 명령어를 담고있는 파일입니다.

main.py 파일에 제가 작성한 discord bot 코드가 적혀있기에 main.py를 실행해야합니다.

따라서 terminal에서 python 파일을 실행할 때 사용하는 명령어처럼 python main.py를 적어줬습니다.

 

worker: python main.py

 

Procfile은 확장자가 없어야 하며 첫 글자인 P가 대문자 P이어야만 한다는 것에 주의합시다.

 

 

 

https://cosmosproject.tistory.com/490

위 링크는 Procfile 관련해서 여러 개의 bot(Multiple bot)을 동시에 hosting할 수 있는 내용입니다.

혹시나 필요한 경우 참고하면 되며 그렇지 않다면 이 본문의 내용을 먼저 이해하면 됩니다.

 

 

 

 

 

 

 

 

 

이제 기본적인 설치와 파일들의 준비는 완료되었습니다.

 

본격적으로 Heroku 서버에 코드를 올려봅시다.

 

 

먼저 terminal을 열고 cd 명령어를 이용해서 discord bot python 파일이 있는 위치로 이동해줍시다.

 

저는 ~/Documents/Code/discord_api/ 디렉토리에 main.py라는 파일을 생성했기 때문에 이 디렉토리(~/Documents/Code/discord_api/)로 위치를 변경했습니다.

 

 

 

 

[terminal] $ git init

discord bot python 파일이 있는 위치로 이동했으면 위 명령어를 입력해줍시다.

 

그러면 위 화면처럼 비어있는 git repository가 initialize되었다는 메세지가 뜹니다.

 

 

 

 

heroku git:remote -a "heroku_app_이름"

그리고 위 명령어를 입력해줍시다.

여기서 heroku_app_이름은 Heroku 웹 페이지에서 만들었던 app의 이름을 입력하면 됩니다.

 

제가 생성한 app 이름은 discord-cake이기 때문에 아래처럼 적었습니다.

 

heroku git:remote -a "discord-cake"

이 명령어는 discord-cake app의 heroku git을 이용하겠다는 의미입니다.

heroku git의 remote를 추가하는데 이때 추가할 app은 discord-cake app이다 라는 의미이죠.

 

 

그러면 위같은 메세지가 뜹니다.

 

q를 입력한 후 엔터를 누르면 현재 프로세스를 끝내겠다는 의미이므로 그 외의 키를 입력해줍시다.

그냥 엔터를 칩시다.

 

엔터를 치면 위처럼 웹사이트가 켜지면서 로그인 창이 뜹니다.

 

로그인합시다.

 

만약 정상적으로 로그인이 되었다면 

Logging in... done
see git remote heroku to https://git.heroku.com/discord-cake.git

위같은 메세지가 뜹니다.

 

지금 상태가 어떤 상태인지 다시 살펴봅시다.

 

1. 내가 만든 discord bot 코드가 적힌 내 컴퓨터의 디렉토리에 git이 설치되었습니다.

2. 이렇게 설치된 git을 discord-cake app과 연결하고, heroku의 git에 연결하였습니다.

 

따라서 이제 git 명령어 (git add, git commit, git push 등)를 이용해서 나의 코드를 heroku git에 업로드하면 됩니다.

 

 

 

 

[terminal] $ git add .
[terminal] $ git commit -am "commit message"

그러면 위 2개 명령어를 순서대로 각각 입력해서 내가 작성한 아래의 파일들을 모두 add & commit 합시다.

 

main.py

procfile

requirements.txt

runtime.txt

 

 

 

 

[terminal] $ git push heroku master

그리고 위 명령어를 이용해서 heroku git에 나의 파일들을 push해줍시다.

 

 

 

Requested runtime (python-3.8.3) is not available for this stack (heroku-20).

저는 Python 3.8.3 version을 runtime.txt 파일에 적었었는데 이 상태로 push를 하려하다보니 위같은 에러가 발생하더군요.

보니까 heroku에서 사용할 수 없는 python version이 있는 것으로 보입니다.

그래서 runtime.txt 파일을 아래처럼 수정해서 python version을 3.8.3에서 3.8.5로 바꿔준 후 다시 commit, push를 해주니 정상적으로 push가 되었습니다.

 

python-3.8.5

 

 

https://devcenter.heroku.com/articles/git

여기까지의 내용은 위 링크에서도 볼 수 있습니다.

 

 

그 후에 Heroku 웹페이지에서 Resources 탭을 들어가면 Dynos 부분에 내가 방금 업로드한 python 파일의 이름이 보일겁니다.

이것을 시작해주면 됩니다.

 

근데 저는 이상하게 한참을 기다려도 python 파일이 보이지 않더군요.

 

그래서 저는 저의 개인 github repository를 이용하기로 했습니다.

 

 

 

 

 


 

 

 

 

 

heroku git이 아닌 개인 github repository를 이용해서 app을 실행해봅시다.

 

 

그러기 위해선 app을 새로 생성해야합니다.

 

App을 생성하는 화면에서 Github을 클릭한 후 Connect to Github 버튼을 눌러줍니다.

 

 

그러면 나의 개인 Github와 연결을 시작합니다.

이 과정에서 내 개인 Github의 로그인을 요구할 수 있습니다.

 

 

 

 

완료되면 위같은 화면이 뜹니다.

 

빨간색으로 표시된 부분에서 내가 만든 discord github repository이름을 입력한 후 Search 버튼을 눌러줍니다.

 

그러면 내 개인 github에서 discord 라는 이름이 포함된 repository 가 표시됩니다.

저는 discord_api라는 이름으로 지었기 때문에 위처럼 나오네요.

 

Connect 버튼을 눌러줍시다.

그러면 이제 저희 github에서 discord_api라는 repoistory에 Heroku가 접근할 수 있도록 연결을 합니다.

 

정상적으로 연결되었다면 위같이 표시됩니다.

 

 

 

화면을 이동하지 않고 아래로 스크롤해보면 위같은 부분이 있을겁니다.

 

배포(deploy)를 할 때의 설정입니다.

 

 

 

 

Enable Automatic Deploys는 아마 연결된 github에 코드/파일의 번화가 있으면 자동으로 deploy하겠다는 의미인 것 같습니다.

Enable Automatic Deploys 버튼을 누르면 위처럼 변합니다.

만약 Automatic Deploy를 비활성화하고싶으면 Disable Automatic Deploys 버튼을 눌러주면 됩니다.

 

 

 

 

Manual deploy 부분에 있던 Deploy Branch 버튼은 현재 연결된 github에 있는 파일을 deploy해줍니다.

 

Deploy Branch 버튼을 누르면 Manual deply 부분이 위처럼 바뀝니다.

마지막 부분의 Deploy to Heroku 부분이 초록색으로 변하면 배포에 성공한겁니다.

 

 

 

 

 

이제 배포한 코드를 호스팅해봅시다.

 

Settings 메뉴로 갑시다.

Reveal Config Vars 버튼을 누릅시다.

 

 

그럼 2개의 칸이 나옵니다.

왼쪽 칸에는 기본값이 key라고 적혀있는데 이것을 token으로 바꿔줍니다.

그리고 오른쪽 칸에는 discord bot을 만들 때 사용했던 token값을 입력해줍니다.

 

그리고 Add 버튼을 눌러줍시다.

 

이제 다시 생성한 Heroku app의 Resources 탭으로 갑시다.

 

그러면 위처럼 방금 deploy한 python file이 보입니다.

 

이 file의 우측 연필 버튼을 눌러줍시다.

 

그러면 위같은 화면이 나오는데

우측의 토글 버튼을 클릭해서 파란색으로 만들어준 후 Confirm 버튼을 눌러줍시다.

 

 

 

이제 시간을 좀 기다리면 배포가 완료되고 discord bot이 온라인으로 변할겁니다.

 

 

 

 

내가 만든 app의 Activity 탭을 들어가보면 아래와 같은 화면이 나옵니다.

그러면 위처럼 내가 github에 push해서 뭔가 변화를 주어 Automatic deploy가 된 내역, 그리고 각각의 Automatic deploy에 대한 log 등을 볼 수 있습니다.

 

View build log 버튼을 클릭하면 내가 github에 어떤 변화를 push했을 때 그 변화사항을 deploy하는 도중의 log를 볼 수 있으며 그 내용은 아래와 비슷합니다.

정상적으로 deploy됐다는 것을 볼 수 있습니다.

 

 

 

 

 

정상적으로 deploy가 완료되었다면 아래처럼 내가 만든 Bot이 온라인으로 되어있는 것을 볼 수 있습니다.

 

Bot의 기능도 잘 작동합니다.

 

 

 

 

 

 


 

 

 

 

 

추가로 Heroku에 배포한 이후 어떤 문제가 생길 수도 있으니 error log를 확인해야 할 때가 있습니다.

 

그럴 경우 아래 명령어를 terminal에 입력하면 log를 볼 수 있습니다.

[terminal] $ heroku logs -a heroku_app_name

(이 명령어를 terminal에서 사용하려면 Heroku CLI가 설치되어있어야 합니다. Heroku CLI가 설치되어있지 않다면 이 글의 상단에서 Homebrew를 이용해 Heroku CLI를 설치했던 그 부분을 참고합시다.)

 

 

 

저의 경우 heroku에서 생성한 app 이름이 discord-bot-cake이기 때문에 아래처럼 입력하였습니다.

[terminal] $ heroku logs -a discord-bot-cake

 

위 이미지는 heroku log 명령어를 사용했을 때의 예시입니다.

 

제가 일부러 numpy library를 사용하는데도 requirements.txt 파일에 numpy를 적지 않고 deploy를 하였습니다.

 

이런 경우 당연히 discord bot은 정상적으로 deploy되지 않으며 discord app에서 bot은 offline 상태가 됩니다.

 

이렇게 이상한 상황이 발생한 경우 위처럼 heroku log 명령어를 사용하면 어디가 문제인지 알 수 있습니다.

 

 

 

 

위 이미지는 정상적으로 실행됐을 때의 log입니다.

 

제가 discord bot의 on_ready 함수에서 Bot의 정보를 print하도록 해놨는데

잘 보이는 것을 알 수 있습니다.

 

 

 

 

 

 

728x90
반응형
Comments