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>
This commit is contained in:
chpark
2026-05-06 17:27:11 +09:00
parent bdd2d66ea0
commit c4e6aab7b2
55 changed files with 5192 additions and 46 deletions
+89
View File
@@ -0,0 +1,89 @@
# 운영 배포 (Traefik + junggomoa.com)
# - frontend (Next.js) → junggomoa.com (UI)
# - backend (FastAPI) → junggomoa.com/api/* (REST + 알림스레드)
# - postgres → 내부 (5432)
# - app (Streamlit) → 임시 보존 (legacy.junggomoa.com 등 별도 운영 가능, 일단 비활성)
services:
frontend:
build:
context: .
dockerfile: frontend/Dockerfile
image: junggomoa-frontend:latest
container_name: junggomoa-frontend
restart: always
environment:
- TZ=Asia/Seoul
# 클라이언트는 같은 도메인이라 빈 값. SSR 시 backend 호출용.
- BACKEND_URL=http://backend:8000
networks:
- traefik-net
- tradeing-internal
depends_on:
- backend
labels:
- traefik.enable=true
- traefik.docker.network=traefik-net
- traefik.http.routers.junggomoa-front.rule=Host(`junggomoa.com`) || Host(`www.junggomoa.com`)
- traefik.http.routers.junggomoa-front.entrypoints=websecure,web
- traefik.http.routers.junggomoa-front.tls=true
- traefik.http.routers.junggomoa-front.tls.certresolver=le
- traefik.http.routers.junggomoa-front.priority=10
- traefik.http.services.junggomoa-front.loadbalancer.server.port=3000
backend:
build:
context: .
dockerfile: backend/Dockerfile
image: junggomoa-backend:latest
container_name: junggomoa-backend
restart: always
environment:
- TZ=Asia/Seoul
- SETTINGS_DB_PATH=/app/data/settings.db
- DATABASE_URL=postgresql://tradeing:${POSTGRES_PASSWORD:-tradeing_pw}@tradeing-postgres:5432/tradeing
- ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
- JWT_SECRET=${JWT_SECRET:-change-me-in-production}
- TELEGRAM_TOKEN=${TELEGRAM_TOKEN:-}
- TELEGRAM_CHAT_ID=${TELEGRAM_CHAT_ID:-}
volumes:
- ./data:/app/data
depends_on:
postgres:
condition: service_healthy
networks:
- traefik-net
- tradeing-internal
labels:
- traefik.enable=true
- traefik.docker.network=traefik-net
- traefik.http.routers.junggomoa-api.rule=(Host(`junggomoa.com`) || Host(`www.junggomoa.com`)) && PathPrefix(`/api`)
- traefik.http.routers.junggomoa-api.entrypoints=websecure,web
- traefik.http.routers.junggomoa-api.tls=true
- traefik.http.routers.junggomoa-api.tls.certresolver=le
- traefik.http.routers.junggomoa-api.priority=100
- traefik.http.services.junggomoa-api.loadbalancer.server.port=8000
postgres:
image: postgres:16-alpine
container_name: tradeing-postgres
restart: always
environment:
- POSTGRES_USER=tradeing
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-tradeing_pw}
- POSTGRES_DB=tradeing
- TZ=Asia/Seoul
volumes:
- ./data/pgdata:/var/lib/postgresql/data
networks:
- tradeing-internal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U tradeing -d tradeing"]
interval: 10s
timeout: 5s
retries: 5
networks:
traefik-net:
external: true
tradeing-internal:
driver: bridge