Files
chpark c4e6aab7b2 React + FastAPI 풀 마이그레이션 — Streamlit 제거
- backend/ — FastAPI + JWT + 모든 REST 엔드포인트
- frontend/ — Next.js 14 + Tailwind + 7페이지 (대시보드/트레이드/거래소/자동매매/설정/내정보/로그인)
- core_logic.py — 신호계산/알림 로직 분리 (기존 app_streamlit.py 에서 추출)
- users_db.py + bcrypt 인증, exchange_keys.py + Fernet 암호화
- trades_db.py — 진입/청산 lifecycle 추적, signal_events raw 로그
- settings_db.py — 모든 운영 파라미터 DB 영속 저장 (RSI/거래량/펀딩비 임계값 포함)
- docker-compose: frontend / backend / postgres + Traefik 라우팅
- assets/logo.svg — JUNGGOMOA 그라디언트 로고

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 17:27:11 +09:00

4.6 KiB

junggomoa.com 배포 가이드 (Traefik v2.11 + PostgreSQL)

서버 (183.99.177.40) 에 이미 떠있는 Traefik 이 80/443 + Let's Encrypt HTTPS + 글로벌 web→websecure redirect 까지 처리. 이 compose 는 포트 직접 노출 안 하고 Traefik labels 만 붙여 attach.

0. 서버 환경 (이미 확인됨)

  • OS: Ubuntu (Linux 6.8.0)
  • k3s 1대 + docker compose 혼합 운영
  • Traefik v2.11 — 컨테이너명 traefik, 네트워크 traefik-net, certresolver le
  • 사설 docker registry localhost:5000
  • Gitea + Act Runner (CI 가능)
  • 호스트 5432 는 invyone-db 가 사용 중 → 우리 Postgres 는 내부 네트워크로만

1. 소스 업로드 (로컬 → 서버)

# 로컬 Mac 에서
rsync -avz --exclude='.git' --exclude='.idea' --exclude='__pycache__' \
    --exclude='data/pgdata' --exclude='data/*.db' --exclude='*.log' \
    /Users/chpark/tradeing/ chpark@183.99.177.40:~/tradeing/

2. 환경변수 (.env)

서버 ~/tradeing/.env:

POSTGRES_PASSWORD=강한비밀번호로변경
TELEGRAM_TOKEN=실제토큰              # 최초 시드용 (이후엔 설정 메뉴에서 변경)
TELEGRAM_CHAT_ID=실제chatid

3. 빌드 + 기동

cd ~/tradeing
chmod +x deploy.sh
./deploy.sh
# 또는:
docker compose build
docker compose up -d
docker compose ps
docker compose logs -f app

Traefik 이 자동으로:

  • http://junggomoa.comhttps:// redirect
  • https://junggomoa.com → 이 컨테이너 8501 로 프록시
  • Let's Encrypt 인증서 자동 발급/갱신

4. 동작 확인

# 컨테이너 안
docker compose exec app curl -fsS http://127.0.0.1:8501/_stcore/health

# Traefik 라우팅 등록 확인
curl -I https://junggomoa.com

브라우저: https://junggomoa.com

5. 데이터베이스 (PostgreSQL)

이번 컴포즈에 같이 올라가는 tradeing-postgres 컨테이너가:

  • 진입 신호 → trades 테이블에 status=open 으로 INSERT
  • 손절 hit → status=stop_loss, pnl_pct 자동 계산
  • 30m/1h 반대 신호 → status=reversal
  • 캔들 forming 중 신호 사라짐 → status=cancelled
  • 발사된 모든 raw signal → signal_events 에 누적

볼륨: ~/tradeing/data/pgdata (서버 영속). 백업 권장:

docker compose exec postgres pg_dump -U tradeing tradeing > ~/backup/tradeing-$(date +%F).sql

psql 직접 접근:

docker compose exec postgres psql -U tradeing -d tradeing
\dt                                     # 테이블 목록
SELECT count(*), status FROM trades GROUP BY status;

6. 운영

작업 명령
로그 보기 docker compose logs -f app
재시작 docker compose restart app
정지 docker compose down ( -v 붙이면 DB 볼륨까지 삭제, 주의)
코드 변경 후 재배포 docker compose build app && docker compose up -d app
Postgres 진입 docker compose exec postgres psql -U tradeing -d tradeing
settings DB 백업 cp ~/tradeing/data/settings.db ~/backup/settings-$(date +%F).db
Postgres 덤프 docker compose exec postgres pg_dump -U tradeing tradeing > ~/backup/$(date +%F).sql

7. 화면 메뉴

  • 📊 대시보드 — 차트
  • 📈 트레이드 이력 — 진입/청산 이력 + 누적 PnL 차트 + 시간축/사유별 통계
  • ⚙️ 설정 — 텔레그램 토큰/Chat ID, 모니터링 심볼, 알림 시간축, 쿨다운, 손절가 비율, 알림/리포트 ON-OFF (저장 즉시 반영)

8. 보안 권고

  • SSH key 등록 (ssh-copy-id) 후 비밀번호 인증 disable 권장
  • 노출됐던 SSH 비밀번호 변경
  • .envPOSTGRES_PASSWORD 는 추측 불가능한 값으로 (compose 에서 외부 노출 안 되긴 하지만 컨테이너 escape 등 대비)

9. 트러블슈팅

증상 확인
network "traefik" declared as external, but could not be found docker network ls 에 실제 이름 확인 → compose 파일 수정
Traefik dashboard 에 라우터 없음 docker compose logs traefik (다른 디렉토리) → label 오타 / certresolver 이름
인증서 발급 실패 DNS A 레코드 / 80 포트 외부 접근 가능 / Traefik certresolver 설정
WebSocket 끊김 Traefik 은 기본적으로 WS 지원 — 별도 설정 불필요. 다른 미들웨어 (rate limit 등) 가 끊는지 확인
trades 테이블에 데이터 안 쌓임 `docker compose logs app
텔레그램 안 옴 설정 메뉴에서 토큰 재입력 → 테스트 발송 버튼 / 컨테이너 로그 확인