Azure Adapter
Installation
Section titled “Installation”npm install @cruzjs/adapter-azureAzure Functions
Section titled “Azure Functions”Best for: Serverless APIs, event-driven workloads, pay-per-execution billing.
import { AzureFunctionsAdapter } from '@cruzjs/adapter-azure';
export default createCruzApp({ schema, modules: [/* your modules */], adapter: new AzureFunctionsAdapter({ databaseUrl: process.env.DATABASE_URL, openaiApiKey: process.env.AZURE_OPENAI_API_KEY, openaiBaseUrl: process.env.AZURE_OPENAI_ENDPOINT, }), pages: () => import('virtual:react-router/server-build'),});Azure Container Apps
Section titled “Azure Container Apps”Best for: Microservices, high-traffic apps, long-running processes.
import { AzureContainerAppsAdapter } from '@cruzjs/adapter-azure';
export default createCruzApp({ schema, modules: [/* your modules */], adapter: new AzureContainerAppsAdapter({ databaseUrl: process.env.DATABASE_URL, }), pages: () => import('virtual:react-router/server-build'),});Service Mapping
Section titled “Service Mapping”| CruzJS Binding | Azure Service |
|---|---|
| Database | Azure Database for PostgreSQL (Flexible Server) |
| Cache | Azure Cache for Redis |
| Storage | Azure Blob Storage |
| Queue | Azure Service Bus |
| AI | Azure OpenAI Service |
Database Setup (Azure Database for PostgreSQL)
Section titled “Database Setup (Azure Database for PostgreSQL)”Flexible Server
Section titled “Flexible Server”Azure Database for PostgreSQL Flexible Server is the recommended option for CruzJS deployments.
# Create a PostgreSQL Flexible Serveraz postgres flexible-server create \ --resource-group my-cruz-rg \ --name my-cruz-db \ --location eastus \ --admin-user cruzuser \ --admin-password 'YourSecurePassword!' \ --sku-name Standard_B1ms \ --tier Burstable \ --version 16 \ --storage-size 32
# Create the databaseaz postgres flexible-server db create \ --resource-group my-cruz-rg \ --server-name my-cruz-db \ --database-name cruzdb
# Allow Azure services to connectaz postgres flexible-server firewall-rule create \ --resource-group my-cruz-rg \ --name my-cruz-db \ --rule-name AllowAzureServices \ --start-ip-address 0.0.0.0 \ --end-ip-address 0.0.0.0Connection String
Section titled “Connection String”DATABASE_URL=postgresql://cruzuser:YourSecurePassword!@my-cruz-db.postgres.database.azure.com:5432/cruzdb?sslmode=requireVNet Integration
Section titled “VNet Integration”For production, use VNet integration to keep database traffic private:
az postgres flexible-server create \ --resource-group my-cruz-rg \ --name my-cruz-db \ --vnet my-cruz-vnet \ --subnet my-db-subnet \ --private-dns-zone my-cruz-dns.postgres.database.azure.comCache Setup (Azure Cache for Redis)
Section titled “Cache Setup (Azure Cache for Redis)”Azure Cache for Redis maps to CruzJS’s CacheBinding interface.
Creating a Redis Cache
Section titled “Creating a Redis Cache”az redis create \ --resource-group my-cruz-rg \ --name my-cruz-cache \ --location eastus \ --sku Basic \ --vm-size c0 \ --enable-non-ssl-port falseConfiguration
Section titled “Configuration”new AzureFunctionsAdapter({ databaseUrl: process.env.DATABASE_URL, redisUrl: process.env.REDIS_URL, // ...})# Get the connection stringaz redis list-keys --resource-group my-cruz-rg --name my-cruz-cache
REDIS_URL=rediss://:YourAccessKey@my-cruz-cache.redis.cache.windows.net:6380The rediss:// protocol (with double ‘s’) indicates TLS, which Azure Cache for Redis requires.
Storage Setup (Azure Blob Storage)
Section titled “Storage Setup (Azure Blob Storage)”Blob Storage maps to CruzJS’s storage binding for file uploads and media.
Creating a Storage Account
Section titled “Creating a Storage Account”# Create a storage accountaz storage account create \ --resource-group my-cruz-rg \ --name mycruzuploads \ --location eastus \ --sku Standard_LRS
# Create a containeraz storage container create \ --account-name mycruzuploads \ --name uploads \ --public-access offConfiguration
Section titled “Configuration”new AzureFunctionsAdapter({ databaseUrl: process.env.DATABASE_URL, azureStorageConnectionString: process.env.AZURE_STORAGE_CONNECTION_STRING, azureStorageContainer: process.env.AZURE_STORAGE_CONTAINER, // ...})AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=mycruzuploads;AccountKey=...;EndpointSuffix=core.windows.netAZURE_STORAGE_CONTAINER=uploadsCORS Configuration
Section titled “CORS Configuration”az storage cors add \ --services b \ --methods GET PUT \ --origins "https://myapp.com" \ --allowed-headers "*" \ --exposed-headers "*" \ --max-age 3600 \ --account-name mycruzuploadsQueue Setup (Azure Service Bus)
Section titled “Queue Setup (Azure Service Bus)”Service Bus maps to CruzJS’s QueueBinding interface for reliable message processing.
Creating a Service Bus Namespace and Queue
Section titled “Creating a Service Bus Namespace and Queue”# Create a namespaceaz servicebus namespace create \ --resource-group my-cruz-rg \ --name my-cruz-bus \ --location eastus \ --sku Basic
# Create a queueaz servicebus queue create \ --resource-group my-cruz-rg \ --namespace-name my-cruz-bus \ --name cruz-jobs \ --max-delivery-count 3 \ --default-message-time-to-live P14D
# Create a dead-letter queue is automatic in Service BusConfiguration
Section titled “Configuration”new AzureFunctionsAdapter({ databaseUrl: process.env.DATABASE_URL, serviceBusConnectionString: process.env.SERVICE_BUS_CONNECTION_STRING, serviceBusQueueName: process.env.SERVICE_BUS_QUEUE_NAME, // ...})SERVICE_BUS_CONNECTION_STRING=Endpoint=sb://my-cruz-bus.servicebus.windows.net/;SharedAccessKeyName=...;SharedAccessKey=...SERVICE_BUS_QUEUE_NAME=cruz-jobsAI Setup (Azure OpenAI Service)
Section titled “AI Setup (Azure OpenAI Service)”Azure OpenAI Service provides GPT models with enterprise security, compliance, and regional availability.
Creating an Azure OpenAI Resource
Section titled “Creating an Azure OpenAI Resource”az cognitiveservices account create \ --resource-group my-cruz-rg \ --name my-cruz-openai \ --kind OpenAI \ --sku S0 \ --location eastusConfiguration
Section titled “Configuration”AZURE_OPENAI_API_KEY=your-api-keyAZURE_OPENAI_ENDPOINT=https://my-cruz-openai.openai.azure.com/AZURE_OPENAI_DEPLOYMENT=gpt-4oEnvironment Variables Reference
Section titled “Environment Variables Reference”| Variable | Required | Description |
|---|---|---|
DATABASE_URL | Yes | PostgreSQL connection string with ?sslmode=require |
REDIS_URL | No | Azure Cache for Redis connection string |
AZURE_STORAGE_CONNECTION_STRING | No | Blob Storage connection string |
AZURE_STORAGE_CONTAINER | No | Blob Storage container name |
SERVICE_BUS_CONNECTION_STRING | No | Service Bus connection string |
SERVICE_BUS_QUEUE_NAME | No | Service Bus queue name |
AZURE_OPENAI_API_KEY | No | Azure OpenAI API key |
AZURE_OPENAI_ENDPOINT | No | Azure OpenAI endpoint URL |
AUTH_SECRET | Yes | Session encryption key |
Deployment with az CLI
Section titled “Deployment with az CLI”Azure Functions
Section titled “Azure Functions”# Build the CruzJS appcruz build
# Create a Function Appaz functionapp create \ --resource-group my-cruz-rg \ --name my-cruz-func \ --storage-account mycruzuploads \ --runtime node \ --runtime-version 20 \ --functions-version 4 \ --os-type Linux
# Set environment variablesaz functionapp config appsettings set \ --resource-group my-cruz-rg \ --name my-cruz-func \ --settings \ DATABASE_URL="postgresql://..." \ AUTH_SECRET="$(openssl rand -base64 32)"
# Deployfunc azure functionapp publish my-cruz-funcAzure Container Apps
Section titled “Azure Container Apps”# Create a Container Apps environmentaz containerapp env create \ --resource-group my-cruz-rg \ --name my-cruz-env \ --location eastus
# Build and push Docker imageaz acr build \ --registry mycruzregistry \ --image my-cruz-app:latest .
# Deploy to Container Appsaz containerapp create \ --resource-group my-cruz-rg \ --name my-cruz-app \ --environment my-cruz-env \ --image mycruzregistry.azurecr.io/my-cruz-app:latest \ --target-port 3000 \ --ingress external \ --env-vars \ DATABASE_URL="postgresql://..." \ AUTH_SECRET="$(openssl rand -base64 32)" \ --min-replicas 0 \ --max-replicas 10 \ --cpu 0.5 \ --memory 1GiRuntime Type
Section titled “Runtime Type”- Azure Functions:
serverless— Scale-to-zero functions.waitUntil()must be flushed before response returns. - Container Apps:
container— Auto-scaling containers.waitUntil()is fire-and-forget.