Claude Code는 Anthropic의 AI 코딩 어시스턴트로, 터미널(CLI) 환경에서 동작합니다. 파일 읽기/쓰기, 명령어 실행, 서버 SSH 접속, Docker 관리까지 직접 수행할 수 있어 코드 작성 → 빌드 → 배포 → 검증을 하나의 대화에서 끝낼 수 있습니다.
| 항목 | 설명 |
|---|---|
| macOS | 개발 머신 |
| Claude Code | npm install -g @anthropic-ai/claude-code |
| SSH 키 | ~/.ssh/avalabs (서버 접속용) |
| Mutagen | brew install mutagen-io/mutagen/mutagen |
| 서버 | Ubuntu, Docker, Docker Compose 설치 완료 |
~/.ssh/config:
Host avalabs
HostName 117.16.145.143
User hyun
IdentityFile ~/.ssh/avalabsclaudedev.xxx.avalabs.me에서 검증deploy.sh로 정식 배포# 프로젝트 폴더에서 Claude Code 실행
cd ~/_ava_server
claude
# 또는 특정 프로젝트로 바로 진입
cd ~/_ava_server/www_gate
claudessh avalabs "bash ~/www_gate/deploy-dev.sh"deploy-dev.sh 동작: ① rsync repo/ → dev/ ② docker compose up -d --build
ssh avalabs "bash ~/www_gate/deploy.sh"deploy.sh 동작: ① 미커밋 변경사항 자동 git commit ② rsync repo/ → prod/ ③ docker compose up -d --build
# 컨테이너 상태
ssh avalabs "docker ps --filter name=hyun_trade"
# 앱 로그
ssh avalabs "docker logs hyun_trade_dev --tail 30"
# HTTP 응답
curl -s -o /dev/null -w "%{http_code}" https://dev.trade.avalabs.me모든 프로젝트는 서버에서 동일한 3-폴더 구조를 따릅니다:
| 문제 | 해결 |
|---|---|
| dev와 prod가 같은 소스로 실행되면 위험 | repo/에서 각각 별도 rsync |
| dev 수정이 즉시 prod에 반영되면 안 됨 | dev/와 prod/ 격리 |
| 소스 원본 보존 필요 | repo/에 git 유지 |
| 배포 자동화 | deploy-dev.sh, deploy.sh |
모든 컨테이너(prod/dev)는 hyun_db_net 단일 Docker 네트워크를 공유합니다.
hyun_db_net 하나만 사용. 새 네트워크를 생성하지 않습니다.| 프로젝트 | Prod | Dev | Prod URL | Dev URL |
|---|---|---|---|---|
| www_main | 5700 | 5701 | store.avalabs.me | dev.store.avalabs.me |
| www_gate | 5510 | 5511 | trade.avalabs.me | dev.trade.avalabs.me |
| www_dress | 5600 | 5601 | dress.avalabs.me | dev.dress.avalabs.me |
| www_sandbox | 5501 | 5504 | sandbox.avalabs.me | dev.sandbox.avalabs.me |
| www_sysbox | 5500 | 5503 | sysbox.avalabs.me | dev.sysbox.avalabs.me |
| www_token | 5520 | 5523 | tokens.avalabs.me | dev.tokens.avalabs.me |
| www_dropbox | 5502 | 5505 | dropbox.avalabs.me | dev.dropbox.avalabs.me |
| PostgreSQL prod | 5555 | — | — | — |
| PostgreSQL dev | — | 5556 | — | — |
| 구분 | 형식 | 예시 |
|---|---|---|
| PROD | hyun_{이름} | hyun_trade |
| DEV | hyun_{이름}_dev | hyun_trade_dev |
| Prod DB | Dev DB | 사용자 | 프로젝트 |
|---|---|---|---|
gate_data | gate_data_dev | gate | www_gate |
dress_sandbox | dress_sandbox_dev | sandbox | www_sysbox + www_sandbox |
airdrop | airdrop_dev | airdrop | www_dropbox |
# SSH 터널 (맥북에서 dev DB 접속)
ssh -f -L 5556:localhost:5556 avalabs -N
# psql 접속
psql -h localhost -p 5556 -U gate gate_data_dev
# 서버에서 직접 접속
docker exec -it hyun_postgres_dev psql -U gate -d gate_data_dev소스코드 직접 편집, 설정 파일 수정
npm install, git commit, docker logs 등
서버 배포, 로그 확인, DB 조회
최신 API 문서, 라이브러리 조회
리팩토링, 기능 추가 일괄 수정
로그 분석 → 원인 파악 → 수정 → 재배포
package.json 변경 시 Docker 캐시 무효화 → npm ci 재실행NEXT_PUBLIC_*, VITE_* 환경변수는 빌드 시 임베딩 → 변경 시 재빌드 필수docker compose build --no-cache# 상태 + 로그 확인
ssh avalabs "docker ps -a --filter name=hyun_xxx"
ssh avalabs "docker logs hyun_xxx_dev --tail 50"
# 일반적 원인:
# - DB 연결 실패 → 환경변수, 네트워크 확인
# - 포트 충돌 → docker ps로 포트 확인
# - 빌드 실패 → docker compose build --no-cachemutagen sync list
bash sync-scripts/gate_ava-local.sh stop
bash sync-scripts/gate_ava-local.sh startssh avalabs "docker network ls | grep hyun"
# hyun_db_net이 없으면 PostgreSQL 재시작
ssh avalabs "cd ~/hyun_postgres && docker compose up -d"ssh avalabs "sudo nginx -t"
ssh avalabs "sudo certbot certificates"
dig dev.xxx.avalabs.me +short @8.8.8.8| 프로젝트 | 스택 | DB | 비고 |
|---|---|---|---|
| www_main | React + Vite + Tailwind | 없음 | 정적 사이트 |
| www_gate | Express + React + Socket.IO | PostgreSQL | 실시간 WebSocket |
| www_dress | Vanilla JS + Express | 없음 | Gate.io API 프록시 |
| www_sandbox | Next.js 16 + Prisma | PostgreSQL | sysbox와 DB 공유 |
| www_sysbox | Next.js 16 + Prisma + Wagmi | PostgreSQL | sandbox와 DB 공유 |
| www_token | Next.js 16 + Wagmi | 없음 | 블록체인 직접 조회 |
| www_dropbox | Express + React + Vite + Wagmi | PostgreSQL | 에어드롭 시스템 |
~/www_xxx/{repo,dev,prod}| 명령 | 설명 |
|---|---|
ssh avalabs "bash ~/www_xxx/deploy-dev.sh" | dev 배포 |
ssh avalabs "bash ~/www_xxx/deploy.sh" | prod 배포 |
ssh avalabs "docker logs hyun_xxx_dev --tail 50" | dev 로그 |
ssh avalabs "docker ps | grep hyun" | 컨테이너 상태 |
bash sync-scripts/xxx_ava-local.sh | Mutagen 시작 |
| 명령 | 설명 |
|---|---|
docker compose up -d --build | 재빌드 + 재시작 |
docker compose down | 중지 (DB 유지) |
docker compose build --no-cache | 캐시 없이 재빌드 |
docker exec -it hyun_postgres_dev psql -U gate -d gate_data_dev | dev DB 접속 |
실제 개발 과정에서 겪은 문제와 해결 방법. 클릭하여 상세 확인.
www_dress에서 브라우저가 Gate.io API를 직접 호출 → CORS 차단
Express 서버에 /api/ticker 프록시 엔드포인트 추가
외부 API는 서버 프록시를 통해 호출한다.
www_gate dev에서 hyun_db_dev_net (존재하지 않는 네트워크) 참조 → 시작 실패
모든 컨테이너가 hyun_db_net 하나를 공유하도록 통일
Docker 네트워크는 hyun_db_net 하나만 사용. 새 네트워크를 만들지 않는다.
position: absolute + display: none + onLoad 패턴 → onLoad 미실행 시 placeholder가 이미지를 가림
<img> 직접 렌더 + onError 시에만 fallback
이미지 로딩은 단순하게. imgError 상태 하나만 사용.
dev 컨테이너가 repo/에서 직접 실행 → 소스 변경 즉시 반영되어 불안정
3-폴더 구조 (repo → dev/ rsync → Docker build) 표준화
dev도 prod와 동일한 격리 구조를 유지한다.
www_dropbox dev 컨테이너 재시작 반복 → DB 인증 실패
init-databases.sh의 초기 비밀번호와 .env.dev.docker 비밀번호 불일치 → DB 사용자 비밀번호 재설정
DB 사용자 생성 시 비밀번호를 env 파일과 반드시 일치시킨다.