diff --git a/backend/Procfile b/backend/Procfile new file mode 100644 index 0000000..4b32c3e --- /dev/null +++ b/backend/Procfile @@ -0,0 +1 @@ +web: uvicorn app.main:app --host 0.0.0.0 --port $PORT diff --git a/backend/requirements.txt b/backend/requirements.txt index 5bf9a7b..13dc19c 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -6,3 +6,4 @@ pandas>=2.0,<4.0 yfinance>=0.2.38 pydantic>=2.0,<3.0 reportlab>=4.0,<5.0 +httpx>=0.27,<1.0 diff --git a/frontend/src/api/client.js b/frontend/src/api/client.js index 665a30d..d6d4b5e 100644 --- a/frontend/src/api/client.js +++ b/frontend/src/api/client.js @@ -1,6 +1,7 @@ import axios from 'axios' -const api = axios.create({ baseURL: '/api' }) +const BASE = import.meta.env.VITE_API_URL ? `${import.meta.env.VITE_API_URL}/api` : '/api' +const api = axios.create({ baseURL: BASE }) // Market export const fetchMarket = (ticker) => api.get(`/market/${ticker}`).then(r=>r.data) diff --git a/frontend/src/components/WorldMap.jsx b/frontend/src/components/WorldMap.jsx index 57799b3..2066988 100644 --- a/frontend/src/components/WorldMap.jsx +++ b/frontend/src/components/WorldMap.jsx @@ -1,4 +1,6 @@ import { useState, useEffect, useRef, useCallback } from 'react' + +const API = import.meta.env.VITE_API_URL || '' import { MapContainer, TileLayer, Marker, Popup, CircleMarker, useMap } from 'react-leaflet' import L from 'leaflet' import 'leaflet/dist/leaflet.css' @@ -95,7 +97,7 @@ export default function WorldMap() { const loadAircraft = useCallback(async () => { setLoadingAc(true) try { - const r = await fetch('http://localhost:8000/api/live/aircraft') + const r = await fetch('${API}/api/live/aircraft') const d = await r.json() const planes = (d.states || []) .filter(s => s[5] != null && s[6] != null && !s[8]) @@ -118,7 +120,7 @@ export default function WorldMap() { const loadQuakes = useCallback(async () => { try { - const r = await fetch('http://localhost:8000/api/live/earthquakes') + const r = await fetch('${API}/api/live/earthquakes') const d = await r.json() const qs = d.features || [] setQuakes(qs) @@ -128,7 +130,7 @@ export default function WorldMap() { const loadEvents = useCallback(async () => { try { - const r = await fetch('http://localhost:8000/api/news/calendar') + const r = await fetch('${API}/api/news/calendar') const d = await r.json() const evs = (d.events || []).filter(e => CCY_POS[e.country]) setEvents(evs) diff --git a/frontend/vercel.json b/frontend/vercel.json new file mode 100644 index 0000000..bdae1c7 --- /dev/null +++ b/frontend/vercel.json @@ -0,0 +1,6 @@ +{ + "buildCommand": "npm run build", + "outputDirectory": "dist", + "framework": "vite", + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +}