Files
tradeing/DEPLOY.md
T
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

119 lines
4.6 KiB
Markdown

# 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. 소스 업로드 (로컬 → 서버)
```bash
# 로컬 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. 빌드 + 기동
```bash
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://` redirect
- `https://junggomoa.com` → 이 컨테이너 8501 로 프록시
- Let's Encrypt 인증서 자동 발급/갱신
## 4. 동작 확인
```bash
# 컨테이너 안
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` (서버 영속). 백업 권장:
```bash
docker compose exec postgres pg_dump -U tradeing tradeing > ~/backup/tradeing-$(date +%F).sql
```
**psql 직접 접근**:
```bash
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 | grep trades_db` → connect 실패 메시지 / 알림이 발사 자체가 안 되는 건지 |
| 텔레그램 안 옴 | 설정 메뉴에서 토큰 재입력 → 테스트 발송 버튼 / 컨테이너 로그 확인 |