이 블로그 자체가 유휴 휴대폰을 서버로 쓰는 프로젝트인데, 사실 이 방식을 먼저 시도해본 기기가 하나 더 있습니다. 오래된 갤럭시 S9입니다. 이 시리즈는 그 S9 위에서 카카오톡 챗봇 “Iris"를 돌리고, 여러 기능을 개발하면서 겪은 과정을 기록합니다.

루팅 이후, 서버 환경부터

지난 글에서 이 S9을 루팅하기까지의 과정(그리고 일반적인 방법이 안 통해 TWRP로 돌아갔던 이야기)을 다뤘습니다. 이번 글은 그 이후, 루팅된 안드로이드 위에 실제로 상시 구동되는 서버 환경을 어떻게 쌓아올렸는지부터 시작합니다.

Termux + proot-distro 조합

기본 구조는 이 블로그의 다른 서버(휴대폰 서버)와 동일합니다. Termux를 리눅스 유저랜드로 쓰고, 그 위에 proot-distro로 우분투 컨테이너를 하나 더 얹습니다. 루트 권한이 있는 기기라고 해도 Claude CLI가 안드로이드 환경에서 구동되지 않기 때문에 이 기기를 agent로 두고 Claude를 통해 이 휴대폰 서버에서 돌아가는 모든 서비스를 원격으로 통제하기 위해서는 우분투 환경이 필수적이었습니다.

서버 환경 구성

tmux로 4~5개 세션 상시 구동

이 S9 위에서는 여러 프로세스가 동시에 떠 있어야 합니다. tmux로 세션을 나눠서 각각 독립적으로 관리합니다.

  • iris: 카카오톡 봇 컨트롤러이자 파이썬 메인 프로세스
  • claude: Claude Code 세션 자체도 이 폰 안에서 무인 모드(--permission-mode auto)로 상시 대기
  • cloudflare: Cloudflare Tunnel(네임드 터널, 토큰 기반)
  • remote: 원격 코딩용 채팅 서버 (이 시리즈 뒷부분에서 따로 다룰 예정입니다)

각 세션이 독립적으로 죽고 살 수 있어서, 하나가 문제를 일으켜도 나머지에 영향을 덜 주는 구조입니다.

재부팅 때 겪은 삽질: “수동 설정 ≠ 영구 설정”

Termux의 ~/.termux/boot/ 훅을 이용하면 기기가 재부팅될 때 이 tmux 세션들을 자동으로 다시 띄울 수 있습니다. 문제는 한 번, 부팅 스크립트에는 반영하지 않고 tmux 세션 설정만 수동으로 바꿔둔 적이 있었는데, 이후 실제로 폰이 재시작되면서 그 변경 사항이 통째로 예전 상태로 롤백되어 버린 일이 있었습니다. “지금 떠 있는 상태 = 앞으로도 유지될 상태"가 아니라는, 당연하지만 실제로 겪어봐야 몸에 붙는 교훈이었습니다. 이후로는 설정을 바꿀 때마다 부팅 스크립트도 함께 갱신하는 습관을 들였습니다.

핵심 요약

다음 글부터는 이 환경 위에서 실제로 카카오톡 봇을 어떻게 만들었는지 — 기존에 쓰던 다른 봇 코드를 어떻게 이 환경으로 옮겼는지부터 이어가겠습니다.

🤖 이 포스팅은 AI의 도움을 받아 작성되었습니다.