핸드폰(Termux)에서 집 PC의 Claude Code를 텔레그램으로 원격 제어하는 시스템
**최종 검증: 2026-03-16 — 전체 파이프라인 동작 확인**
외출 중에도 핸드폰으로 집 PC의 Claude Code를 돌리고 싶어서.
┌─────────────────────────────────────────────────────────┐
│ 핸드폰 (Termux) │
│ │
│ 텔레그램 앱에서 메시지/파일 전송 │
│ 또는 SSH 직접 접속 (tmux attach) │
└──────────┬──────────────────────┬────────────────────────┘
│ Telegram API │ SSH (port 2222)
│ │ Tailscale VPN
▼ ▼
┌─────────────────────────────────────────────────────────┐
│ 집 PC (WSL2 Ubuntu) │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ tg-image │ │ tg-audio │ │ claude-main │ │
│ │ │ │ │ │ │ │
│ │ bridge: │ │ bridge: │ │ 범용 작업 │ │
│ │ 이미지 │ │ 오디오 │ │ (SSH 접속용) │ │
│ │ 다운로더 │ │ 양방향 │ │ │ │
│ │ │ │ 브릿지 │ └─────────────────┘ │
│ │ work: │ │ │ │
│ │ Claude Bot │ │ work: │ ┌─────────────────┐ │
│ │ (이미지) │ │ Claude Bot │ │ watchdog │ │
│ │ │ │ (오디오) │ │ 60초마다 감시 │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
│ │
│ D:\parksy-image\ D:\PARKSY\parksy-audio\ │
└─────────────────────────────────────────────────────────┘
| 봇 | 용도 | 사용법 | ||
| **@parksy_bridge_bot** | 이미지/도면/MIDI 전송 | 파일을 이 봇에게 보내면 PC에 자동 저장 | ||
|---|---|---|---|---|
| **@parksy_bridges_bot** | 오디오/비디오 전송 | 양방향. PC 결과물도 이 봇으로 받음 | ||
| **@Parksy_Image_Claude_bot** | 이미지 Claude 제어 | 메시지 보내면 Claude가 parksy-image에서 작업 | ||
| **@Parksy_Audio_Claude_bot** | 오디오 Claude 제어 | 메시지 보내면 Claude가 parksy-audio에서 작업 |
@Parksy_Audio_Claude_bot 에게:
"swan_lake_original.mid를 SGM SF2로 렌더링해서 보내줘"
1. telegram_claude_bot.py가 메시지 수신
2. claude -p "swan_lake_original.mid를 SGM SF2로 렌더링..." --dangerously-skip-permissions 실행
3. Claude가 작업 수행
4. 결과 텍스트를 텔레그램으로 반환
5. (렌더링된 오디오는 audio_bridge.py가 자동 감지해서 전송)
| 명령 | 설명 | |
| 일반 메시지 | Claude에게 새 작업 지시 | |
|---|---|---|
| `/c 이어서 해` | 이전 대화 이어가기 (`--continue`) | |
| `/status` | 현재 상태 확인 | |
| `/start` | 봇 소개 |
나: "local-agent/sources 폴더에 있는 MIDI 파일 목록 보여줘"
봇: "작업 시작..."
봇: "local-agent/sources/ 폴더에 다음 MIDI 파일이 있습니다:
1. swan_lake_original.mid (24KB)
2. carnival_overture.mid (18KB)
..."
나: "/c 1번을 렌더링해줘"
봇: "작업 시작..."
봇: "swan_lake_original.mid 렌더링 완료. 파일: /mnt/d/tmp/swan_lake.wav"
| 파일 종류 | 보낼 봇 | PC 저장 위치 | ||
| 이미지 (jpg, png) | @parksy_bridge_bot | `D:\parksy-image\00_inbox\` | ||
|---|---|---|---|---|
| MIDI (.mid) | @parksy_bridge_bot 또는 @parksy_bridges_bot | `D:\PARKSY\parksy-audio\local-agent\sources\` | ||
| 오디오/비디오 | @parksy_bridges_bot | `D:\tmp\audio_inbox\` |
| 방법 | 설명 | |
| outbox 폴더 | `/home/dtsli/dtslib-localpc/telegram-bots/outbox/`에 파일 넣으면 자동 전송 | |
|---|---|---|
| watch 폴더 | `D:\tmp\` 또는 `D:\5_YOUTUBE\`에 새 파일 생기면 자동 전송 | |
| 도면 | DXF 금지 → SVG만 전송 (핸드폰에서 DXF 못 열음) |
급하거나 복잡한 작업은 SSH로 직접 접속.
# 1. Termux에서 접속
ssh -p 2222 dtsli@100.90.83.128 # 외부 (Tailscale)
ssh -p 2222 dtsli@ # 같은 WiFi
# 2. 원하는 세션에 붙기
tmux attach -t claude-main # 메인 작업
tmux attach -t tg-image # 이미지 채널
tmux attach -t tg-audio # 오디오 채널
# 3. tmux 기본 조작
Ctrl+B → D # 세션 빠져나오기 (detach)
Ctrl+B → 0 # 윈도우 0 (bridge)
Ctrl+B → 1 # 윈도우 1 (work)
# Windows에서:
wsl hostname -I
Windows 시작 → wsl-autostart.vbs → wsl-server-init.sh 실행
→ SSH, Tailscale, 4개 tmux 세션, 모든 브릿지 자동 기동
죽은 서비스 자동 재시작:
# WSL 전체 재시작
wsl --shutdown
# → Windows에서 wsl-autostart.vbs 실행, 또는 재부팅
# 개별 브릿지 재시작 (tmux 안에서)
Ctrl+C → python3 image_downloader.py
Ctrl+C → python3 audio_bridge.py
| 증상 | 원인 | 해결 | ||
| 외부에서 SSH 안 됨 | Tailscale 안 돌아감 | `sudo tailscale up --accept-routes --accept-dns=false` | ||
|---|---|---|---|---|
| 같은 WiFi인데 SSH 안 됨 | WSL IP 바뀜 | `wsl hostname -I`로 새 IP 확인 | ||
| 봇이 응답 안 함 | watchdog이 재시작할 때까지 60초 대기 | 직접 SSH 들어가서 `tmux attach` 확인 | ||
| Claude 응답 "(응답 없음)" | Node.js PATH 문제 | `.bashrc` 최상단에 NVM PATH 확인 | ||
| DNS 안 됨 | Tailscale MagicDNS | `--accept-dns=false` 옵션 필수 | ||
| 봇 메시지가 잘못된 곳으로 | 봇 혼용 | 이미지↔오디오 봇 절대 섞지 말 것 | ||
| Claude 인증 만료 (401) | credentials.json 토큰 만료 | watchdog이 자동 갱신 (60초 주기). 수동: `cp /mnt/c/Users/dtsli/.claude/.credentials.json ~/.claude/.credentials.json` |
/home/dtsli/
├── wsl-server-init.sh # 부팅 자동시작 마스터
├── server.log # 서버 로그
└── dtslib-localpc/telegram-bots/
├── image_downloader.py # 이미지 브릿지 (Phone→PC)
├── audio_bridge.py # 오디오 양방향 브릿지
├── telegram_claude_bot.py # Claude 텔레그램 봇
├── config.json → image_config_wsl.json
├── audio_config.json
├── claude_image_config.json # 이미지 Claude 봇 설정
├── claude_audio_config.json # 오디오 Claude 봇 설정
├── watchdog.sh # 서비스 감시 스크립트
├── outbox/ # PC→Phone 전송 대기
└── sent/ # 전송 완료