Skip to content

Azure Adapter

Terminal window
npm install @cruzjs/adapter-azure

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'),
});

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'),
});
CruzJS BindingAzure Service
DatabaseAzure Database for PostgreSQL (Flexible Server)
CacheAzure Cache for Redis
StorageAzure Blob Storage
QueueAzure Service Bus
AIAzure OpenAI Service

Database Setup (Azure Database for PostgreSQL)

Section titled “Database Setup (Azure Database for PostgreSQL)”

Azure Database for PostgreSQL Flexible Server is the recommended option for CruzJS deployments.

Terminal window
# Create a PostgreSQL Flexible Server
az 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 database
az postgres flexible-server db create \
--resource-group my-cruz-rg \
--server-name my-cruz-db \
--database-name cruzdb
# Allow Azure services to connect
az 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.0
Terminal window
DATABASE_URL=postgresql://cruzuser:YourSecurePassword!@my-cruz-db.postgres.database.azure.com:5432/cruzdb?sslmode=require

For production, use VNet integration to keep database traffic private:

Terminal window
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.com

Azure Cache for Redis maps to CruzJS’s CacheBinding interface.

Terminal window
az redis create \
--resource-group my-cruz-rg \
--name my-cruz-cache \
--location eastus \
--sku Basic \
--vm-size c0 \
--enable-non-ssl-port false
new AzureFunctionsAdapter({
databaseUrl: process.env.DATABASE_URL,
redisUrl: process.env.REDIS_URL,
// ...
})
Terminal window
# Get the connection string
az redis list-keys --resource-group my-cruz-rg --name my-cruz-cache
REDIS_URL=rediss://:YourAccessKey@my-cruz-cache.redis.cache.windows.net:6380

The rediss:// protocol (with double ‘s’) indicates TLS, which Azure Cache for Redis requires.

Blob Storage maps to CruzJS’s storage binding for file uploads and media.

Terminal window
# Create a storage account
az storage account create \
--resource-group my-cruz-rg \
--name mycruzuploads \
--location eastus \
--sku Standard_LRS
# Create a container
az storage container create \
--account-name mycruzuploads \
--name uploads \
--public-access off
new AzureFunctionsAdapter({
databaseUrl: process.env.DATABASE_URL,
azureStorageConnectionString: process.env.AZURE_STORAGE_CONNECTION_STRING,
azureStorageContainer: process.env.AZURE_STORAGE_CONTAINER,
// ...
})
Terminal window
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=mycruzuploads;AccountKey=...;EndpointSuffix=core.windows.net
AZURE_STORAGE_CONTAINER=uploads
Terminal window
az storage cors add \
--services b \
--methods GET PUT \
--origins "https://myapp.com" \
--allowed-headers "*" \
--exposed-headers "*" \
--max-age 3600 \
--account-name mycruzuploads

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”
Terminal window
# Create a namespace
az servicebus namespace create \
--resource-group my-cruz-rg \
--name my-cruz-bus \
--location eastus \
--sku Basic
# Create a queue
az 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 Bus
new AzureFunctionsAdapter({
databaseUrl: process.env.DATABASE_URL,
serviceBusConnectionString: process.env.SERVICE_BUS_CONNECTION_STRING,
serviceBusQueueName: process.env.SERVICE_BUS_QUEUE_NAME,
// ...
})
Terminal window
SERVICE_BUS_CONNECTION_STRING=Endpoint=sb://my-cruz-bus.servicebus.windows.net/;SharedAccessKeyName=...;SharedAccessKey=...
SERVICE_BUS_QUEUE_NAME=cruz-jobs

Azure OpenAI Service provides GPT models with enterprise security, compliance, and regional availability.

Terminal window
az cognitiveservices account create \
--resource-group my-cruz-rg \
--name my-cruz-openai \
--kind OpenAI \
--sku S0 \
--location eastus
Terminal window
AZURE_OPENAI_API_KEY=your-api-key
AZURE_OPENAI_ENDPOINT=https://my-cruz-openai.openai.azure.com/
AZURE_OPENAI_DEPLOYMENT=gpt-4o
VariableRequiredDescription
DATABASE_URLYesPostgreSQL connection string with ?sslmode=require
REDIS_URLNoAzure Cache for Redis connection string
AZURE_STORAGE_CONNECTION_STRINGNoBlob Storage connection string
AZURE_STORAGE_CONTAINERNoBlob Storage container name
SERVICE_BUS_CONNECTION_STRINGNoService Bus connection string
SERVICE_BUS_QUEUE_NAMENoService Bus queue name
AZURE_OPENAI_API_KEYNoAzure OpenAI API key
AZURE_OPENAI_ENDPOINTNoAzure OpenAI endpoint URL
AUTH_SECRETYesSession encryption key
Terminal window
# Build the CruzJS app
cruz build
# Create a Function App
az 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 variables
az functionapp config appsettings set \
--resource-group my-cruz-rg \
--name my-cruz-func \
--settings \
DATABASE_URL="postgresql://..." \
AUTH_SECRET="$(openssl rand -base64 32)"
# Deploy
func azure functionapp publish my-cruz-func
Terminal window
# Create a Container Apps environment
az containerapp env create \
--resource-group my-cruz-rg \
--name my-cruz-env \
--location eastus
# Build and push Docker image
az acr build \
--registry mycruzregistry \
--image my-cruz-app:latest .
# Deploy to Container Apps
az 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 1Gi
  • 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.