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.2.tar.gz (24.3 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.2-py3-none-any.whl (24.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: cloudflare_saas-1.0.2.tar.gz
  • Upload date:
  • Size: 24.3 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.2.tar.gz
Algorithm Hash digest
SHA256 b5d238a0bbeb722c4f0635131ffee697d71d41a7482ed314acef20dc2003434a
MD5 367266a7ab45f848867dcdedb751b7f5
BLAKE2b-256 0287a04adf08ef6cfa0e116b2e12f2b3ff6a1cd2f563265a156278c7badefa53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cloudflare_saas-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d76c2b4f133de56222d8af87830beba757cdb42108d0c23b0542bd1ebbb524af
MD5 cf165b16354276509a13dfb7153ec4be
BLAKE2b-256 d0ee33ab95b54429e30570cc37f3d021d3e5f2d101ea403cab32be71846861b7

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