644 lines
17 KiB
Markdown
644 lines
17 KiB
Markdown
## 🚨 CRITICAL GUIDELINES
|
|
|
|
### Windows File Path Requirements
|
|
|
|
**MANDATORY: Always Use Backslashes on Windows for File Paths**
|
|
|
|
When using Edit or Write tools on Windows, you MUST use backslashes (`\`) in file paths, NOT forward slashes (`/`).
|
|
|
|
**Examples:**
|
|
- ❌ WRONG: `D:/repos/project/file.tsx`
|
|
- ✅ CORRECT: `D:\repos\project\file.tsx`
|
|
|
|
This applies to:
|
|
- Edit tool file_path parameter
|
|
- Write tool file_path parameter
|
|
- All file operations on Windows systems
|
|
|
|
### Documentation Guidelines
|
|
|
|
**NEVER create new documentation files unless explicitly requested by the user.**
|
|
|
|
- **Priority**: Update existing README.md files rather than creating new documentation
|
|
- **Repository cleanliness**: Keep repository root clean - only README.md unless user requests otherwise
|
|
- **Style**: Documentation should be concise, direct, and professional - avoid AI-generated tone
|
|
- **User preference**: Only create additional .md files when user specifically asks for documentation
|
|
|
|
---
|
|
|
|
|
|
# Azure Service Emulators for Local Development (2025)
|
|
|
|
## Overview
|
|
|
|
This skill provides comprehensive knowledge of Azure service emulators available as Docker containers for local development in 2025.
|
|
|
|
## Available Azure Emulators
|
|
|
|
### 1. Azurite (Azure Storage Emulator)
|
|
|
|
**Official replacement for Azure Storage Emulator (deprecated)**
|
|
|
|
**Image:** `mcr.microsoft.com/azure-storage/azurite:latest`
|
|
|
|
**Supported Services:**
|
|
- Blob Storage
|
|
- Queue Storage
|
|
- Table Storage
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
services:
|
|
azurite:
|
|
image: mcr.microsoft.com/azure-storage/azurite:latest
|
|
container_name: azurite
|
|
command: azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --loose
|
|
ports:
|
|
- "10000:10000" # Blob service
|
|
- "10001:10001" # Queue service
|
|
- "10002:10002" # Table service
|
|
volumes:
|
|
- azurite-data:/data
|
|
restart: unless-stopped
|
|
```
|
|
|
|
**Standard Development Connection String:**
|
|
```
|
|
DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000/devstoreaccount1;QueueEndpoint=http://azurite:10001/devstoreaccount1;TableEndpoint=http://azurite:10002/devstoreaccount1;
|
|
```
|
|
|
|
**Features:**
|
|
- Cross-platform (Windows, Linux, macOS)
|
|
- Written in Node.js/JavaScript
|
|
- Supports latest Azure Storage APIs
|
|
- Persistence to disk
|
|
- Compatible with Azure Storage Explorer
|
|
- `--loose` flag for relaxed validation (useful for local development)
|
|
|
|
|
|
**2025 API Version Support:**
|
|
- Latest release (v3.35.0) targets 2025-11-05 API version
|
|
- Blob service: 2025-11-05
|
|
- Queue service: 2025-11-05
|
|
- Table service: 2025-11-05 (preview)
|
|
- RA-GRS support for geo-redundant replication testing
|
|
|
|
**CLI Usage:**
|
|
```bash
|
|
# Install via npm (alternative to Docker)
|
|
npm install -g azurite
|
|
|
|
# Run with custom location
|
|
azurite --location /path/to/data --debug /path/to/debug.log
|
|
```
|
|
|
|
**Application Integration:**
|
|
```javascript
|
|
// Node.js with @azure/storage-blob
|
|
const { BlobServiceClient } = require('@azure/storage-blob');
|
|
|
|
const connectionString = process.env.AZURITE_CONNECTION_STRING;
|
|
const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString);
|
|
```
|
|
|
|
```csharp
|
|
// .NET with Azure.Storage.Blobs
|
|
using Azure.Storage.Blobs;
|
|
|
|
var connectionString = Environment.GetEnvironmentVariable("AZURITE_CONNECTION_STRING");
|
|
var blobServiceClient = new BlobServiceClient(connectionString);
|
|
```
|
|
|
|
### 2. Azure SQL Server 2025
|
|
|
|
**Latest SQL Server with AI features**
|
|
|
|
**Image:** `mcr.microsoft.com/mssql/server:2025-latest`
|
|
|
|
**2025 Features:**
|
|
- Built-in Vector Search for AI similarity queries
|
|
- Semantic Queries alongside traditional full-text search
|
|
- Optimized Locking (TID Locking, LAQ)
|
|
- Native JSON and RegEx support
|
|
- Fabric Mirroring integration
|
|
- REST API support
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
services:
|
|
sqlserver:
|
|
image: mcr.microsoft.com/mssql/server:2025-latest
|
|
container_name: sqlserver
|
|
environment:
|
|
- ACCEPT_EULA=Y
|
|
- MSSQL_PID=Developer
|
|
- MSSQL_SA_PASSWORD_FILE=/run/secrets/sa_password
|
|
secrets:
|
|
- sa_password
|
|
ports:
|
|
- "1433:1433"
|
|
volumes:
|
|
- sqlserver-data:/var/opt/mssql
|
|
- ./init:/docker-entrypoint-initdb.d
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P $$MSSQL_SA_PASSWORD -Q 'SELECT 1' -C || exit 1"]
|
|
interval: 10s
|
|
timeout: 3s
|
|
retries: 3
|
|
start_period: 10s
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '2'
|
|
memory: 4G
|
|
reservations:
|
|
cpus: '1'
|
|
memory: 2G
|
|
networks:
|
|
- backend
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
restart: unless-stopped
|
|
|
|
secrets:
|
|
sa_password:
|
|
file: ./secrets/sa_password.txt
|
|
|
|
volumes:
|
|
sqlserver-data:
|
|
driver: local
|
|
```
|
|
|
|
**Connection String:**
|
|
```
|
|
Server=sqlserver;Database=MyApp;User Id=sa;Password=YourStrong!Passw0rd;TrustServerCertificate=True;
|
|
```
|
|
|
|
**Important Notes:**
|
|
- **Azure SQL Edge retired September 30, 2025** - Use SQL Server 2025 instead
|
|
- Use `mssql-tools18` for TLS 1.3 support (`-C` flag trusts certificate)
|
|
- Developer edition is free for non-production use
|
|
- Supports arm64 via Rosetta 2 on macOS
|
|
|
|
**Vector Search Example (2025 Feature):**
|
|
```sql
|
|
-- Create vector index for AI similarity search
|
|
CREATE TABLE Documents (
|
|
Id INT PRIMARY KEY,
|
|
Content NVARCHAR(MAX),
|
|
ContentVector VECTOR(1536)
|
|
);
|
|
|
|
-- Perform similarity search
|
|
SELECT TOP 10 Id, Content
|
|
FROM Documents
|
|
ORDER BY VECTOR_DISTANCE(ContentVector, @queryVector);
|
|
```
|
|
|
|
**2025 vnext-preview Features:**
|
|
- Entirely Linux-based emulator (cross-platform: x64, ARM64, Apple Silicon)
|
|
- No virtual machines required on Apple Silicon or Microsoft ARM
|
|
- Changefeed support (April 2025+)
|
|
- Document TTL (Time-to-Live) support
|
|
- OpenTelemetry V2 support
|
|
- API for NoSQL in gateway mode
|
|
- Currently in preview (active development)
|
|
|
|
**Image:** `mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview`
|
|
|
|
### 3. Cosmos DB Emulator
|
|
|
|
**NoSQL database emulator**
|
|
|
|
**Image:** `mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview`
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
services:
|
|
cosmosdb:
|
|
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
|
|
container_name: cosmosdb
|
|
environment:
|
|
- AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
|
|
- AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true
|
|
- AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=127.0.0.1
|
|
ports:
|
|
- "8081:8081" # Data Explorer
|
|
- "10251:10251"
|
|
- "10252:10252"
|
|
- "10253:10253"
|
|
- "10254:10254"
|
|
volumes:
|
|
- cosmos-data:/data/db
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '2'
|
|
memory: 4G
|
|
networks:
|
|
- backend
|
|
restart: unless-stopped
|
|
```
|
|
|
|
**Emulator Endpoint:**
|
|
```
|
|
https://localhost:8081
|
|
```
|
|
|
|
**Emulator Key (Standard):**
|
|
```
|
|
C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==
|
|
```
|
|
|
|
**Data Explorer:**
|
|
Access at `https://localhost:8081/_explorer/index.html`
|
|
|
|
**Application Integration:**
|
|
```javascript
|
|
// Node.js with @azure/cosmos
|
|
const { CosmosClient } = require('@azure/cosmos');
|
|
|
|
const endpoint = 'https://localhost:8081';
|
|
const key = process.env.COSMOS_EMULATOR_KEY;
|
|
const client = new CosmosClient({ endpoint, key });
|
|
```
|
|
|
|
```csharp
|
|
// .NET with Microsoft.Azure.Cosmos
|
|
using Microsoft.Azure.Cosmos;
|
|
|
|
var endpoint = "https://localhost:8081";
|
|
var key = Environment.GetEnvironmentVariable("COSMOS_EMULATOR_KEY");
|
|
var client = new CosmosClient(endpoint, key);
|
|
```
|
|
|
|
**Limitations:**
|
|
- Performance not representative of production
|
|
- Limited to single partition for local development
|
|
- Certificate trust required (self-signed)
|
|
|
|
**2025 Official Azure Service Bus Emulator:**
|
|
- Released as official Docker container
|
|
- Linux-based emulator with cross-platform support
|
|
- Requires SQL Server Linux as dependency
|
|
- Supports AMQP protocol (port 5672)
|
|
- Connection string format with UseDevelopmentEmulator=true
|
|
- Current limitations: No JMS protocol, no partitioned entities, no AMQP Web Sockets
|
|
|
|
**Official Emulator Image:** `mcr.microsoft.com/azure-messaging/servicebus-emulator:latest`
|
|
|
|
**Connection String:**
|
|
```
|
|
Endpoint=sb://host.docker.internal;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;
|
|
```
|
|
|
|
### 4. Azure Service Bus Emulator
|
|
|
|
**Message queue emulator**
|
|
|
|
**Note:** Official emulator has limited Docker support. Use RabbitMQ as alternative.
|
|
|
|
**Official Emulator (Preview):**
|
|
```yaml
|
|
services:
|
|
servicebus-sql:
|
|
image: mcr.microsoft.com/mssql/server:2025-latest
|
|
environment:
|
|
- ACCEPT_EULA=Y
|
|
- MSSQL_SA_PASSWORD=ServiceBus123!
|
|
volumes:
|
|
- servicebus-sql-data:/var/opt/mssql
|
|
|
|
servicebus:
|
|
image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest
|
|
depends_on:
|
|
- servicebus-sql
|
|
environment:
|
|
- ACCEPT_EULA=Y
|
|
- SQL_SERVER=servicebus-sql
|
|
- SQL_SA_PASSWORD=ServiceBus123!
|
|
ports:
|
|
- "5672:5672" # AMQP
|
|
networks:
|
|
- backend
|
|
```
|
|
|
|
**RabbitMQ Alternative (Recommended):**
|
|
```yaml
|
|
services:
|
|
rabbitmq:
|
|
image: rabbitmq:3.14-alpine
|
|
container_name: rabbitmq
|
|
ports:
|
|
- "5672:5672" # AMQP
|
|
- "15672:15672" # Management UI
|
|
environment:
|
|
- RABBITMQ_DEFAULT_USER=admin
|
|
- RABBITMQ_DEFAULT_PASS=admin123
|
|
volumes:
|
|
- rabbitmq-data:/var/lib/rabbitmq
|
|
healthcheck:
|
|
test: ["CMD", "rabbitmq-diagnostics", "ping"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
networks:
|
|
- backend
|
|
restart: unless-stopped
|
|
```
|
|
|
|
### 5. PostgreSQL (Azure Database for PostgreSQL)
|
|
|
|
**Image:** `postgres:16.6-alpine`
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
services:
|
|
postgres:
|
|
image: postgres:16.6-alpine
|
|
container_name: postgres
|
|
environment:
|
|
- POSTGRES_USER=postgres
|
|
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
|
|
- POSTGRES_DB=myapp
|
|
secrets:
|
|
- postgres_password
|
|
ports:
|
|
- "5432:5432"
|
|
volumes:
|
|
- postgres-data:/var/lib/postgresql/data
|
|
- ./init:/docker-entrypoint-initdb.d
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
interval: 10s
|
|
timeout: 3s
|
|
retries: 3
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1'
|
|
memory: 2G
|
|
networks:
|
|
- backend
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
restart: unless-stopped
|
|
```
|
|
|
|
**Extensions:**
|
|
Match Azure PostgreSQL Flexible Server extensions:
|
|
```sql
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
|
|
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
|
```
|
|
|
|
### 6. MySQL (Azure Database for MySQL)
|
|
|
|
**Image:** `mysql:9.2`
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
services:
|
|
mysql:
|
|
image: mysql:9.2
|
|
container_name: mysql
|
|
environment:
|
|
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
|
|
- MYSQL_DATABASE=myapp
|
|
- MYSQL_USER=appuser
|
|
- MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
|
|
secrets:
|
|
- mysql_root_password
|
|
- mysql_password
|
|
ports:
|
|
- "3306:3306"
|
|
volumes:
|
|
- mysql-data:/var/lib/mysql
|
|
- ./init:/docker-entrypoint-initdb.d
|
|
healthcheck:
|
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
|
|
interval: 10s
|
|
timeout: 3s
|
|
retries: 3
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1'
|
|
memory: 2G
|
|
networks:
|
|
- backend
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
restart: unless-stopped
|
|
```
|
|
|
|
### 7. Redis (Azure Cache for Redis)
|
|
|
|
**Image:** `redis:7.4-alpine`
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
services:
|
|
redis:
|
|
image: redis:7.4-alpine
|
|
container_name: redis
|
|
command: >
|
|
redis-server
|
|
--appendonly yes
|
|
--requirepass ${REDIS_PASSWORD}
|
|
--maxmemory 512mb
|
|
--maxmemory-policy allkeys-lru
|
|
ports:
|
|
- "6379:6379"
|
|
volumes:
|
|
- redis-data:/data
|
|
healthcheck:
|
|
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
|
|
interval: 10s
|
|
timeout: 3s
|
|
retries: 3
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '0.5'
|
|
memory: 512M
|
|
networks:
|
|
- backend
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
restart: unless-stopped
|
|
```
|
|
|
|
### 8. Application Insights Alternative (Jaeger + Grafana)
|
|
|
|
**OpenTelemetry-compatible observability stack**
|
|
|
|
```yaml
|
|
services:
|
|
jaeger:
|
|
image: jaegertracing/all-in-one:latest
|
|
container_name: jaeger
|
|
ports:
|
|
- "16686:16686" # UI
|
|
- "14268:14268" # HTTP collector
|
|
- "4317:4317" # OTLP gRPC
|
|
- "4318:4318" # OTLP HTTP
|
|
environment:
|
|
- COLLECTOR_OTLP_ENABLED=true
|
|
networks:
|
|
- monitoring
|
|
restart: unless-stopped
|
|
|
|
grafana:
|
|
image: grafana/grafana:latest
|
|
container_name: grafana
|
|
ports:
|
|
- "3001:3000"
|
|
environment:
|
|
- GF_SECURITY_ADMIN_PASSWORD=admin
|
|
volumes:
|
|
- grafana-data:/var/lib/grafana
|
|
networks:
|
|
- monitoring
|
|
restart: unless-stopped
|
|
```
|
|
|
|
## Complete Azure Stack Example
|
|
|
|
```yaml
|
|
services:
|
|
# Application Services
|
|
frontend:
|
|
build: ./frontend
|
|
ports: ["3000:3000"]
|
|
networks: [frontend]
|
|
depends_on:
|
|
backend:
|
|
condition: service_healthy
|
|
|
|
backend:
|
|
build: ./backend
|
|
ports: ["8080:8080"]
|
|
networks: [frontend, backend]
|
|
depends_on:
|
|
sqlserver:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_started
|
|
azurite:
|
|
condition: service_started
|
|
|
|
# Databases
|
|
sqlserver:
|
|
image: mcr.microsoft.com/mssql/server:2025-latest
|
|
environment:
|
|
- ACCEPT_EULA=Y
|
|
- MSSQL_PID=Developer
|
|
- MSSQL_SA_PASSWORD=${MSSQL_SA_PASSWORD}
|
|
ports: ["1433:1433"]
|
|
volumes: [sqlserver-data:/var/opt/mssql]
|
|
networks: [backend]
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P $$MSSQL_SA_PASSWORD -Q 'SELECT 1' -C"]
|
|
interval: 10s
|
|
|
|
postgres:
|
|
image: postgres:16.6-alpine
|
|
environment:
|
|
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
ports: ["5432:5432"]
|
|
volumes: [postgres-data:/var/lib/postgresql/data]
|
|
networks: [backend]
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready"]
|
|
interval: 10s
|
|
|
|
# Cache
|
|
redis:
|
|
image: redis:7.4-alpine
|
|
command: redis-server --requirepass ${REDIS_PASSWORD}
|
|
ports: ["6379:6379"]
|
|
volumes: [redis-data:/data]
|
|
networks: [backend]
|
|
|
|
# Storage
|
|
azurite:
|
|
image: mcr.microsoft.com/azure-storage/azurite:latest
|
|
command: azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --loose
|
|
ports: ["10000:10000", "10001:10001", "10002:10002"]
|
|
volumes: [azurite-data:/data]
|
|
networks: [backend]
|
|
|
|
# NoSQL
|
|
cosmosdb:
|
|
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
|
|
ports: ["8081:8081"]
|
|
volumes: [cosmos-data:/data/db]
|
|
networks: [backend]
|
|
|
|
# Monitoring
|
|
jaeger:
|
|
image: jaegertracing/all-in-one:latest
|
|
ports: ["16686:16686", "4317:4317"]
|
|
networks: [monitoring]
|
|
|
|
networks:
|
|
frontend:
|
|
driver: bridge
|
|
backend:
|
|
driver: bridge
|
|
internal: true
|
|
monitoring:
|
|
driver: bridge
|
|
|
|
volumes:
|
|
sqlserver-data:
|
|
postgres-data:
|
|
redis-data:
|
|
azurite-data:
|
|
cosmos-data:
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Use health checks** - Ensure dependencies are ready before app starts
|
|
2. **Network isolation** - Keep databases on internal backend network
|
|
3. **Resource limits** - Prevent emulators from consuming all system resources
|
|
4. **Persistence** - Use named volumes for data that should survive restarts
|
|
5. **Secrets management** - Use Docker secrets or environment files
|
|
6. **Version pinning** - Use specific tags, not `latest`
|
|
7. **Security hardening** - Drop capabilities, run as non-root where possible
|
|
8. **Documentation** - Document differences between emulators and Azure services
|
|
|
|
## Known Limitations
|
|
|
|
- **Performance**: Emulators are slower than Azure services
|
|
- **Scale**: Single-instance only, no clustering
|
|
- **Features**: Some Azure-specific features unavailable locally
|
|
- **SSL/TLS**: Self-signed certificates require trust configuration
|
|
- **Azure AD**: Authentication not replicated locally
|
|
- **Networking**: VNets, Private Endpoints not available
|
|
|
|
## Migration Checklist
|
|
|
|
When moving from Azure to Docker emulators:
|
|
|
|
- [ ] Replace Azure Storage connection strings with Azurite
|
|
- [ ] Update SQL Server connection strings (remove Azure-specific options)
|
|
- [ ] Configure Cosmos DB with emulator endpoint and key
|
|
- [ ] Replace Service Bus with RabbitMQ or emulator
|
|
- [ ] Set up alternative for Application Insights
|
|
- [ ] Update authentication (remove Azure AD dependencies)
|
|
- [ ] Configure network isolation
|
|
- [ ] Test all integrations
|
|
- [ ] Document feature parity gaps
|
|
- [ ] Create init scripts for sample data
|
|
|
|
## References
|
|
|
|
- [Azurite Documentation](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite)
|
|
- [SQL Server 2025 in Docker](https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker)
|
|
- [Cosmos DB Emulator](https://learn.microsoft.com/en-us/azure/cosmos-db/local-emulator)
|
|
- [Service Bus Emulator](https://learn.microsoft.com/en-us/azure/service-bus-messaging/test-locally-with-service-bus-emulator)
|