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>
90 lines
3.0 KiB
YAML
90 lines
3.0 KiB
YAML
# 운영 배포 (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
|