c4e6aab7b2
- 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>
4.6 KiB
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, certresolverle - 사설 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.com→https://redirecthttps://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 비밀번호 변경
.env의POSTGRES_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 |
| 텔레그램 안 옴 | 설정 메뉴에서 토큰 재입력 → 테스트 발송 버튼 / 컨테이너 로그 확인 |