![[프로젝트] 스마트폰을 이용한 디스코드 봇 24시간 가동하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FzcDSD%2FbtsOxtAeQ2S%2FAAAAAAAAAAAAAAAAAAAAACrjkYYuqxhAbDhXiad8Ef5XHjm-1-z6uBEyLLhO4v8K%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1759244399%26allow_ip%3D%26allow_referer%3D%26signature%3DtksZeGbhUKl%252BY%252B%252BnDQh5OSwbY4I%253D)
이번에는 (안쓰는) 스마트폰을 이용하여 디스코드 봇을 24시간 가동하도록 만들어볼 것이다.
이전에 스마트폰으로 파이썬 Flask 웹 서버를 동작시키는 프로젝트를 했었는데, UserLAnd가 SSH 연결은 되지만, 스마트폰에서 자꾸 연결이 안되는 문제가 있는 것 같아서 이번엔 Termux를 이용해서 진행해볼 예정이다.
🧩 준비물
- (안쓰는) 스마트폰
- (인터넷 연결을 위한) 와이파이
이번 프로젝트에서는 포트포워딩 설정, 내부 IP 고정, DDNS 설정까지 진행할 예정이다.
이 포스팅에서는 Galaxy S20+ 5G 모델을 사용하였다.
Termux 설치와 기본 세팅은 아래 블로그를 참고하여 진행하였다.
자체 서버 구축기 with Termux (대학생, 취준생이 EC2 프리티어를 쓰면 안되는 이유) [#01]
자체 서버 구축기 with Termux (대학생, 취준생이 EC2 프리티어를 쓰면 안되는 이유) [#01]
안쓰는 핸드폰으로 공짜 24시간 웹서버 구축하는 방법
velog.io
🛠️ Ubuntu 설치
📌 Termux 설치
안드로이드 폰에 Ubuntu를 설치하기 위해서는 Termux를 먼저 설치해야 한다. Termux는 터미널 에뮬레이터로, 루팅 없이 안드로이드 기기에 쉽게 리눅스 배포판을 설치할 수 있도록 해준다.
(Google Play Store에서 업데이트는 더 이상 진행이 되지 않는 것인지 마지막 업데이트가 2025.01.18.
이다. GitHub 기준 최신 버전(v0.118.3
)은 2025.05.22.
에 업데이트 되었다.)
GitHub에서 F-Droid에서 apk를 받아 설치하라고 안내되어 있어서 필자는 F-Droid에서 apk를 받아 설치하였다. GitHub Releases에서 termux-app_v0.118.3+github-debug_universal.apk
를 받아서 설치해도 동일하다.
GitHub Releases : https://github.com/termux/termux-app/releases
Releases · termux/termux-app
Termux - a terminal emulator application for Android OS extendible by variety of packages. - termux/termux-app
github.com
설치가 완료되었으면, 정상적으로 실행되는지 확인하고 다음으로 넘어간다.
📌 Ubuntu 설치
먼저 패키지 업데이트와 업그레이드를 진행한다. (SSH 연결 이전까지는 귀찮더라도 폰으로 진행해야 한다😢)
# 패키지 목록 업데이트
pkg update
# 설치된 패키지 업그레이드
pkg upgrade
업그레이드까지 모두 완료되면, 루팅 없이 안드로이드 환경에서 리눅스 배포판을 실행할 수 있게 도와주는 proot
와 proot-distro
를 설치한다.
# proot 설치
pkg install proot
# proot-distro 설치
pkg install proot-distro
proot & proot-distro
💬 proot는 사용자 공간에서 작동하는 chroot의 대안으로, root 권한 없이도 파일 시스템을 격리하고 가상화 할 수 있다. 시스템 콜을 가로채서 경로를 재매핑하는 방식으로 작동한다.
💬 proot-distro는 proot를 기반으로 한 리눅스 배포판 관리 도구로, 다양한 리눅스 배포판을 쉽게 설치하고 관리할 수 있게 도와주는 도구이다.
➡️ 따라서 proot와 proot-distro는 호스트 시스템에 영향 없이 리눅스 배포판을 설치하고 실행하도록 도와주는 도구인 것이다.
이제 우분투 설치를 진행한다. 먼저 사용가능한 배포판을 확인한다.
proot-distro list
유명한 리눅스 배포판인 Ubuntu, Debian을 비롯해서 약 14개의 리눅스 배포판을 지원하는 것을 확인할 수 있다.
가장 많이 사용하는 우분투를 설치한다. (2025.06.11. 기준으로 Ubuntu 24.04.1 LTS
가 설치된다.)
proot-distro install ubuntu
설치가 완료되면 우분투 환경으로 진입한다.
proot-distro login ubuntu
📌 Ubuntu 설정 및 SSH 연결
지금부터는 우분투 환경에서 진행하는 내용이다. 우분투 환경으로 진입한 후, 진행해주면 된다.
먼저 기본 시스템 업데이트를 진행한다. (apt
를 사용하면 정상적으로 설치가 완료되지 않아서, apt-get
으로 진행하였다.)
# 패키지 목록 업데이트
apt-get update
# 설치된 패키지 업그레이드
apt-get upgrade
업그레이드까지 완료되면, Vim을 설치한다. Vim은 리눅스 환경을 사용하면 가장 많이 사용하게 될 에디터이므로 사용법을 익혀두면 좋다.
apt-get install vim
폰으로 작업하는 건 어려우니, 우선 SSH 연결부터 빠르게 진행해보자. SSH 서버를 설치한다.
# SSH 서버 설치
apt-get install -y openssh-server
# SSH 서비스 상태 확인
service ssh status
설치가 완료되었으면, SSH 설정 파일을 수정한다.
vim /etc/ssh/sshd_config
파일에서는 아래 부분을 찾아 주석을 해제한다. 그리고 Port 번호는 1 ~ 1023번을 제외하고 다른 숫자로 변경한다. (필자는 2022번으로 변경함) 변경을 완료하면 저장하고 Vim을 종료한다.
Port 22 # 번호는 1~1023번을 제외하고 다른 번호로 변경
PasswordAuthentication yes
설정이 완료되면, SSH 서비스를 실행한다.
service ssh start
SSH 연결하기 전에, 우분투 계정(유저)을 추가한다. (username
부분은 자유롭게 사용자 계정 이름으로 사용할 이름을 입력한다. 당연히 영어로 입력해야 한다.)
adduser username
그리고 관리자 권한을 사용하기 위한 명령어인 sudo
를 사용할 수 있도록 설정해야 한다. 먼저 sudo
롤 설치한다.
apt-get install sudo
설치가 완료되면, 아래 파일을 Vim으로 열어 sudo 설정을 진행한다.
vim /etc/sudoers
해당 파일을 열어 아래와 같은 부분을 찾아 수정한다. (username
부분은 당연하게도 앞에서 본인이 만든 사용자 계정 이름을 입력하면 된다.) 수정이 완료되면 저장하고 나온다.
...
# User provilege specification
root ALL=(ALL:ALL) ALL
useranme ALL=(ALL:ALL) ALL
...
만약 위 설정을 하지 않고 계정 전환을 하는 경우, sudo
명령을 사용할 수 없다. 조금 많이 귀찮아지니 꼭 설정하고 넘어가자.
이제 root 계정에서 본인 사용자 계정으로 전환하고, 계정 홈 디렉토리로 이동한다.
# 사용자계정 전환
su username
# 홈 디렉토리로 이동
cd ~
이제 SSH 연결이 정상적으로 되는지 확인한다. 먼저 ip 주소를 확인한다. (만약 권한 문제로 실행되지 않는다면, 스마트폰의 와이파이 설정에서 연결된 ip 주소를 확인할 수 있다.)
ifconfig
그러고 본인이 사용하는 SSH 연결 프로그램으로 연결을 시도한다. (이번 포스팅에서는 MobaXterm이라는 프로그램을 사용하였다.) 아래와 같이 연결되면 SSH 연결이 성공적으로 이루어진 것이다. (포트포워딩은 안했기 때문에 당연히 외부에서는 접근 불가)
🤖 디스코드 봇 실행
디스코드 봇은 내부에서 외부로의 연결(Outbound)만 필요하기 때문에, 외부에서 내 봇으로 직접 접속하는 인바운드 포워딩이 필요 없다. (단, 내 서버로 직접 HTTP 접속이 필요한 서비스라면 필요하다.) 내가 만든 디스코드 봇은 외부 api를 사용하기 때문에 인바운드 연결이 필요 없고, 따라서 포트포워딩도 필요 없다.
🌐 디스코드 봇 프로그램 이동
아마 프로젝트를 리눅스 터미널에서 개발한 사람은 (아마도) 없을 것이다. 따라서 먼저 디스코드 봇 프로그램을 호스팅 장비(여기서는 스마트폰)로 이동해야 한다.
이동하는 방법은 너무 다양하기 때문에 따로 정리하진 않았다. GitHub을 이용해서 Clone을 해도 좋고, MobaXterm과 같은 프로그램을 사용한다면 fstp와 같은 기능을 이용하여 복사-붙여넣기로 이동해도 좋다. 본인이 편한 방법으로 디스코드 봇 프로그램을 이동시킨다.
🌐 tmux 설치 및 디스코드 봇 실행
SSH 연결이 끊기면 실행했던 프로그램이 종료된다. 하지만 디스코드 봇은 24시간 동작해야 하기 때문에 백그라운드로 실행할 필요가 있다. 따라서 리눅스(우분투)에서 여러 개의 프로그램을 백그라운드로 실행하고, SSH가 끊겨도 세션을 유지할 수 있는 tmux라는 프로그램을 설치해서 프로그램을 실행해야 한다.
먼저 tmux를 설치한다.
sudo apt-get install tmux
설치가 완료되면, tmux 세션을 실행한다.
tmux new -s SessionName
tmux가 실행되면, 여기서 원하는 프로그램을 실행한다.
# 프로젝트 디렉토리 내에서 실행
python3 main.py
그리고 해당 tmux 세션을 분리(Detach)한다. 분리는 Ctrl+B
를 누르고 D
를 누르면 된다.
다시 해당 세션을 가져오거나 현재 실행 중인 세션을 보고 싶으면 아래 명령어를 사용하면 된다.
# 실행 중인 세션 가져오기
tmux attach -t SessionName
# 실행 중인 세션 목록 보기
tmux ls
실행하고 디스코드에서 확인해보면, 정상적으로 봇이 동작하는 모습을 확인할 수 있다!
🤖 디스코드 봇 AlgoMori 소개
이번에 간단하게 만든 AlgoMori라는 디스코드 봇을 소개하고자 한다.
AlgoMori는 백준 문제를 추천해주는 디스코드 봇으로, 난이도 별로 랜덤으로 문제를 추천해주는 봇이다. 글을 작성하는 시점(2025.06.12. 기준)을 기준으로 매일 지정된 시간이 되면 난이도 별로(브론즈 ~ 플래티넘) 랜덤 문제를 하나씩 추천하는 기능과 사용자가 명령어를 입력하면 지정한 난이도의 문제를 랜덤으로 추천해주는 기능이 포함되어 있다.
파이썬으로 개발되어 있으며, 디스코드 api를 사용할 수 있는 discord.py
라이브러리를 사용했고, solved.ac 비공식 api를 사용하여 개발하였다.
https://github.com/byeongkukoh/AlgoMori
GitHub - byeongkukoh/AlgoMori: 백준 문제를 난이도 별로 추천해주는 디스코드 봇입니다.
백준 문제를 난이도 별로 추천해주는 디스코드 봇입니다. Contribute to byeongkukoh/AlgoMori development by creating an account on GitHub.
github.com
'🤖 프로젝트' 카테고리의 다른 글
[프로젝트] 안드로이드 기기에서 리눅스 GUI 구동하기 (with. Galaxy S20+) (0) | 2025.06.23 |
---|---|
[프로젝트] 스마트폰을 이용한 파이썬 Flask 웹 서버 구동 (2) | 2025.06.04 |
[프로젝트] PintOS 프로젝트 - PintOS 세팅 (5) | 2025.04.06 |
since 2025.01.27. ~ 개발자를 향해....🔥