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:
@@ -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
|
||||
Reference in New Issue
Block a user