Deployment Guide
This guide describes how to deploy the GeoQuery platform for public access.
Strategy
We use a single-container approach where the backend (FastAPI) serves the frontend (Next.js) as static files. This simplifies deployment to PaaS providers like Railway, Render, or Hugging Face Spaces.
Architecture
- Build Stage: Node.js builder compiles the Next.js frontend into static HTML/CSS/JS (
frontend/out). - Runtime Stage: Python 3.11 image installs backend dependencies.
- Serving: FastAPI mounts the static build at
/and serves the API at/api. - Data: Geospatial data (
backend/data) is included in the image (~2GB).
Prerequisites
- Docker
- ~5GB Free disk space (for image build)
- 4GB+ RAM on host machine (for DuckDB in-memory analytics)
Local Build & Run
# Build the image
docker build -t geoquery .
# Run the container (Mapping 7860 to 7860 to match standard Space config)
docker run -p 7860:7860 -e GEMINI_API_KEY=your_key_here geoquery
Hosting Options (Getting a Public URL)
To share this demo with others, you need to host the Docker container on a cloud provider.
Option A: Hugging Face Spaces (Easiest & Free)
This will give you a public URL like https://huggingface.co/spaces/username/geoquery.
- Create Space: Go to huggingface.co/spaces -> "Create new Space".
- SDK: Docker
- Template: Blank
- Push Code:
git remote add space https://huggingface.co/spaces/YOUR_USERNAME/SPACE_NAME git push space main - Configure Secrets: In the Space "Settings" tab, add a "Repository Secret" named
GEMINI_API_KEYwith your key.
Option B: Railway / Render
- Connect your GitHub repository.
- Railway/Render will detect the
Dockerfile. - Set the environment variable
GEMINI_API_KEY. - Detailed output will be available at a URL like
https://geoquery-production.up.railway.app.
Option C: Google Cloud Run
- Build:
gcloud builds submit --tag gcr.io/PROJECT_ID/geoquery - Deploy:
gcloud run deploy geoquery --image gcr.io/PROJECT_ID/geoquery --platform managed
Notes
- Data Persistence: The current setup uses read-only data baked into the image. User uploads will be lost on restart unless a volume is mounted to
/app/backend/data/custom. - Memory Usage: DuckDB processes data in-memory. For large queries, ensure the host has sufficient RAM.