The GeoViable production environment runs on an Oracle Cloud Infrastructure Always Free ARM instance. The Always Free tier provides enough RAM and storage for the full stack — PostGIS database, FastAPI backend, PDF generation with WeasyPrint, and the React frontend — with no ongoing cost. An Nginx Proxy Manager instance handles SSL termination and routes external HTTPS traffic into the Docker network.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/danizd/geoviable/llms.txt
Use this file to discover all available pages before exploring further.
Infrastructure
| Aspect | Detail |
|---|---|
| Provider | Oracle Cloud Infrastructure (OCI) Always Free |
| Architecture | ARM (Ampere A1) |
| RAM | 24 GB |
| Storage | 200 GB block storage |
| OS | Ubuntu 22.04 LTS (ARM64) |
Port Mapping
The Oracle-specific compose file (docker-compose-oracle.yml) exposes the API on a different host port than the default local development compose file. This lets Nginx Proxy Manager sit in front of both services on the host and route traffic without port conflicts.
| Service | External port (host) | Internal port (container) |
|---|---|---|
| Frontend (Nginx) | 3000 | 80 |
| API (FastAPI) | 8001 | 8000 |
| Database | not exposed | 5432 |
ARM64 is fully supported. All images used by GeoViable —
kartoza/postgis:15-3.4, public.ecr.aws/docker/library/nginx:1.25-alpine, python:3.11-slim, and the system packages that WeasyPrint and GDAL depend on — provide native linux/arm64 builds. No emulation layer is required on Ampere A1.First Deployment
Configure production environment variables
POSTGRES_PASSWORD— generate a strong password withopenssl rand -base64 32DATABASE_URL— update the password portion to matchPOSTGRES_PASSWORDENVIRONMENT=productionLOG_LEVEL=INFOCORS_ORIGINS=https://your-domain.example.com
Upload environmental data ZIPs (optional)
If you want to load data immediately after startup, upload the ZIP files to
backend/data/ via scp or your preferred file transfer method before proceeding. You can also load data after the containers are running.Start all services
Use the Oracle-specific compose file for all production operations:Docker will build the backend image and start all three containers. The database container initialises PostGIS and runs the
backend/initdb/ SQL scripts on first boot.Load environmental data
Updating Production
To deploy a new version of the application:Dockerfile or requirements.txt changed, otherwise it reuses the cached image. The pgdata volume persists across restarts — data is never lost by a regular update.
Frontend-Only Update
When only the React frontend has changed, you can avoid a full image rebuild by compiling locally and restarting only Nginx:frontend/build/ is mounted as a read-only volume.
Full Reset
Database Backups
GeoViable’s backup strategy usespg_dump to create compressed SQL dumps of the database. The environmental layer data can always be reloaded from the original ZIPs, but any user-generated content or layer_update_log entries are only persisted in the database.
| Aspect | Detail |
|---|---|
| Tool | pg_dump |
| Frequency | Daily at 02:00 UTC (host cron job) |
| Retention | 7 days |
| Storage | backups/ directory on the OCI host |
Create a backup manually
Restore from a backup
Automate daily backups (host cron)
Add the following entry to the host crontab withcrontab -e:
Monitoring
Health endpoints
Check the overall service status at any time:Container logs
Monthly layer update log
The automatedupdate_layers.py cron job runs on the first day of each month at 03:00 UTC and writes its output to a log file inside the container: