Skip to main content

Production-ready async library for multi-tenant SaaS platforms with Cloudflare R2 and Workers

Project description

Cloudflare R2 SaaS Platform Library

A production-ready Python async library for building multi-tenant SaaS platforms with Cloudflare R2, Workers, and Custom Hostnames.

Documentation Status

Features

  • ✅ Async R2 bucket operations (upload, delete, list)
  • ✅ Tenant management with namespace isolation
  • ✅ Custom domain onboarding with DNS verification
  • ✅ Cloudflare for SaaS custom hostname provisioning
  • ✅ Worker deployment automation via Terraform
  • Configurable logging system (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  • Multiple log formats (simple, detailed, JSON)
  • ✅ Full error handling and retry logic
  • ✅ Type-safe with Pydantic models
  • ✅ Comprehensive documentation

Installation

pip install cloudflare aiodns aioboto3 pydantic python-terraform httpx tenacity

For PostgreSQL storage:

pip install asyncpg

For development:

pip install -e ".[dev,web]"

Scripts

Working deployment and management scripts are available in the scripts/ folder:

  • deploy_worker.py - Deploy Cloudflare Worker script via API
  • create_token_with_global_key.py - Create API tokens with proper permissions
  • create_r2_bucket.py - Create and manage R2 buckets
  • test_token_permissions.py - Test API token permissions (8 tests)

See scripts/README.md for detailed usage instructions.

Documentation

Comprehensive documentation is available in the docs/ folder:

See docs/README.md for a complete list of documentation files.

Quick Start

Basic Usage with Logging

import asyncio
from cloudflare_saas import (
    CloudflareSaaSPlatform, 
    Config, 
    configure_logging, 
    LogLevel
)

async def main():
    # Configure logging
    configure_logging(level=LogLevel.INFO)
    
    # Load config from environment
    config = Config.from_env()
    
    # Initialize platform
    platform = CloudflareSaaSPlatform(config)
    
    # Create tenant
    tenant = await platform.create_tenant("Acme Inc", "acme-123")
    
    # Deploy site
    await platform.deploy_tenant_site(
        tenant.tenant_id,
        local_path="./acme-site"
    )
    
    # Add custom domain
    domain_status = await platform.add_custom_domain(
        tenant.tenant_id,
        "www.acme.com"
    )

asyncio.run(main())

Configuration

Environment Variables

Required:

  • CLOUDFLARE_API_TOKEN
  • CLOUDFLARE_ACCOUNT_ID
  • CLOUDFLARE_ZONE_ID
  • R2_ACCESS_KEY_ID
  • R2_SECRET_ACCESS_KEY
  • R2_BUCKET_NAME
  • PLATFORM_DOMAIN

Optional - Logging:

  • LOG_LEVEL (default: INFO) - DEBUG, INFO, WARNING, ERROR, CRITICAL
  • LOG_FORMAT (default: detailed) - simple, detailed, json
  • LOG_FILE - Path to log file (optional)
  • ENABLE_CONSOLE_LOGGING (default: true) - Enable console output

Programmatic Configuration

from cloudflare_saas import Config

config = Config(
    cloudflare_api_token="your-token",
    cloudflare_account_id="your-account",
    cloudflare_zone_id="your-zone",
    r2_access_key_id="your-r2-key",
    r2_secret_access_key="your-r2-secret",
    r2_bucket_name="yourplatform-sites",
    platform_domain="yourplatform.com",
    log_level="DEBUG",
    log_format="json",
    log_file="app.log"
)

Logging

Configure Logging

from cloudflare_saas import configure_logging, LogLevel, LogFormat

# Simple console logging
configure_logging(level=LogLevel.INFO)

# Detailed file logging
configure_logging(
    level=LogLevel.DEBUG,
    log_format=LogFormat.DETAILED,
    log_file="cloudflare-saas.log"
)

# JSON logging for production
configure_logging(
    level=LogLevel.WARNING,
    log_format=LogFormat.JSON,
    log_file="/var/log/cloudflare-saas.log",
    enable_console=False
)

Log Levels

  • DEBUG: Detailed diagnostic information
  • INFO: General informational messages
  • WARNING: Warning messages
  • ERROR: Error messages
  • CRITICAL: Critical errors

Log Formats

  • simple: Minimal output INFO: message
  • detailed: With timestamps and source 2025-12-17 10:30:45 - Module - INFO - [file.py:65] - message
  • json: Structured JSON for log aggregation

Using Loggers in Your Code

from cloudflare_saas import get_logger, LoggerMixin

# Get a logger
logger = get_logger(__name__)
logger.info("Starting operation")

# Use in a class
class MyService(LoggerMixin):
    def do_work(self):
        self.logger.info("Working...")

Documentation

Comprehensive documentation is available at Read the Docs.

Build Documentation Locally

# Install documentation dependencies
make install-docs

# Build HTML documentation
make docs

# Serve documentation locally
make docs-serve

Documentation includes:

  • Getting Started Guide: Quick start and installation
  • Configuration Guide: All configuration options
  • Logging Guide: Comprehensive logging documentation
  • API Reference: Complete API documentation
  • Examples: Practical code examples
  • Deployment Guide: Production deployment
  • Contributing Guide: Development guidelines

Development

Available Make Commands

make help          # Show all available commands

# Development
make install       # Install package
make install-dev   # Install with dev dependencies
make install-docs  # Install documentation dependencies

# Testing
make test          # Run tests
make test-cov      # Run tests with coverage
make test-watch    # Run tests in watch mode

# Code Quality
make lint          # Run linters (ruff, mypy)
make format        # Format code (black, ruff)
make check         # Run all checks (lint + test)

# Documentation
make docs          # Build documentation
make docs-serve    # Build and serve documentation
make docs-clean    # Clean documentation build

# Docker
make docker-build  # Build Docker image
make docker-run    # Run Docker container
make docker-stop   # Stop Docker containers

# API
make run-api       # Run FastAPI development server

# Utilities
make clean         # Clean build artifacts
make clean-all     # Clean all generated files

Running Tests

# Run all tests
make test

# Run with coverage
make test-cov

# Run specific test
pytest tests/test_platform.py::test_create_tenant -v

Code Quality

# Format code
make format

# Check linting
make lint

# Run all checks
make check

Architecture

See cloudflare_r2_plan.md for detailed architecture.

Contributing

We welcome contributions! Please see CONTRIBUTING.md for guidelines.

Development Setup

  1. Fork and clone the repository
  2. Install development dependencies: make install-dev
  3. Create a branch for your feature
  4. Make your changes with tests
  5. Run tests and linting: make check
  6. Submit a pull request

License

[Add your license here]

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cloudflare_saas-1.0.7.tar.gz (25.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cloudflare_saas-1.0.7-py3-none-any.whl (26.3 kB view details)

Uploaded Python 3

File details

Details for the file cloudflare_saas-1.0.7.tar.gz.

File metadata

  • Download URL: cloudflare_saas-1.0.7.tar.gz
  • Upload date:
  • Size: 25.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.2

File hashes

Hashes for cloudflare_saas-1.0.7.tar.gz
Algorithm Hash digest
SHA256 9ca727f1ffdc0f87334af97abb42497fe1cc5216563ba0cbe8a7746c53bbc194
MD5 5c08a6c44187c08b11ec840018daf4b4
BLAKE2b-256 fcbfe9a56deb6f48a5bd1a9ad8bf6179e6a3237ec78607f5701e1b03478b2d68

See more details on using hashes here.

File details

Details for the file cloudflare_saas-1.0.7-py3-none-any.whl.

File metadata

File hashes

Hashes for cloudflare_saas-1.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 143613e607fcca68f74a838695000dbc8fbb88d39e38f690c27292e5d9f6b639
MD5 ce02d2e4dda6aefbd4ade5efb85959a4
BLAKE2b-256 408aaec621677362caf09a8e473f2f261e9574414c01104e210424ef79659548

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page