chore: prepare for Vercel + Koyeb deployment

- API base URL now reads from VITE_API_URL env var (frontend)
- WorldMap localhost URLs replaced with env-aware API constant
- Added httpx to backend requirements (live data proxy)
- Added Procfile for Koyeb backend deployment
- Added vercel.json for frontend SPA routing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Kansaram
2026-06-07 18:46:51 +05:30
parent 4bf370ba81
commit aaa0acf64b
5 changed files with 15 additions and 4 deletions
+1
View File
@@ -0,0 +1 @@
web: uvicorn app.main:app --host 0.0.0.0 --port $PORT
+1
View File
@@ -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
+2 -1
View File
@@ -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)
+5 -3
View File
@@ -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)
+6
View File
@@ -0,0 +1,6 @@
{
"buildCommand": "npm run build",
"outputDirectory": "dist",
"framework": "vite",
"rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
}