A multi-tenant STAC-based geospatial metadata management platform built for CloudFerro infrastructure.
CaaS provides a complete solution for managing SpatioTemporal Asset Catalogs (STAC) with enterprise features including:
- STAC 1.1.0 Compliant - Full support for Catalogs, Collections, and Items
- Multi-tenant Architecture - Isolated data and configuration per tenant
- S3 Ingestion - Import STAC items from S3-compatible storage (CloudFerro EODATA)
- Advanced Search - CQL2 filtering with spatial and temporal queries
- Access Control - Role-based permissions with CloudFerro IAM integration
- Usage Quotas - Rate limiting and resource quotas per tenant
- Framework: FastAPI (Python 3.11+)
- Database: PostgreSQL 15 with PostGIS
- Search: OpenSearch 2.x
- Cache: Redis 7
- Auth: CloudFerro IAM (Keycloak)
- Framework: React 18 with TypeScript
- Styling: Tailwind CSS (CloudFerro design system)
- State: TanStack Query + Zustand
- Build: Vite
- Docker and Docker Compose
- Node.js 20+ (for frontend development)
- Python 3.11+ (for backend development)
- Clone the repository:
cd "C:\Users\piotr\projects\Catalogue as a Service"- Copy environment files:
cp backend/.env.example backend/.env- Start all services:
docker-compose up -d- Access the application:
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
- API Docs: http://localhost:8000/api/v1/docs
cd backend
python -m venv venv
source venv/bin/activate # or venv\Scripts\activate on Windows
pip install -e ".[dev]"
# Run migrations
alembic upgrade head
# Start development server
uvicorn app.main:app --reloadcd frontend
npm install
npm run devCatalogue as a Service/
├── ARCHITECTURE.md # Detailed architecture documentation
├── docker-compose.yml # Docker Compose configuration
├── backend/
│ ├── app/
│ │ ├── api/ # API routes
│ │ │ └── v1/ # API version 1
│ │ ├── core/ # Configuration and security
│ │ ├── db/ # Database models and session
│ │ └── schemas/ # Pydantic schemas
│ │ └── stac/ # STAC-specific schemas
│ ├── alembic/ # Database migrations
│ └── pyproject.toml # Python dependencies
├── frontend/
│ ├── src/
│ │ ├── api/ # API client
│ │ ├── components/ # React components
│ │ └── pages/ # Page components
│ └── package.json # Node dependencies
└── infrastructure/
└── init-db.sql # Database initialization
GET /- Landing pageGET /api/v1/conformance- Conformance classes
GET /api/v1/catalogs- List catalogsPOST /api/v1/catalogs- Create catalogGET /api/v1/catalogs/{id}- Get catalogPUT /api/v1/catalogs/{id}- Update catalogDELETE /api/v1/catalogs/{id}- Delete catalog
GET /api/v1/collections- List collectionsPOST /api/v1/collections- Create collectionGET /api/v1/collections/{id}- Get collectionPUT /api/v1/collections/{id}- Update collectionDELETE /api/v1/collections/{id}- Delete collection
GET /api/v1/collections/{id}/items- List itemsPOST /api/v1/collections/{id}/items- Create itemGET /api/v1/collections/{id}/items/{itemId}- Get itemPUT /api/v1/collections/{id}/items/{itemId}- Update itemDELETE /api/v1/collections/{id}/items/{itemId}- Delete item
GET /api/v1/search- Search items (GET)POST /api/v1/search- Search items (POST with CQL2)GET /api/v1/search/queryables- Get queryable properties
GET /api/v1/ingestion/sources- List ingestion sourcesPOST /api/v1/ingestion/sources- Create ingestion sourceGET /api/v1/ingestion/jobs- List ingestion jobsPOST /api/v1/ingestion/jobs- Start ingestion job
CaaS uses a custom caas: namespace for platform-specific fields:
caas:tenant_id- Tenant identifiercaas:region- CloudFerro region (WAW3-2, FRA1-2)caas:visibility- Access level (public, organization, private)caas:created_at- Creation timestampcaas:updated_at- Last update timestamp
Key environment variables:
| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection URL | postgresql+asyncpg://caas:caas@localhost:5432/caas |
OPENSEARCH_URL |
OpenSearch URL | http://localhost:9200 |
REDIS_URL |
Redis URL | redis://localhost:6379/0 |
KEYCLOAK_URL |
CloudFerro IAM URL | https://iam.cloudferro.com |
S3_ENDPOINT_URL |
S3-compatible endpoint | https://s3.waw3-2.cloudferro.com |
See backend/.env.example for all configuration options.
Proprietary - CloudFerro
For support, contact CloudFerro support or open an issue in the project repository.