The AI Fabrix Setup Portal is a modern web application that provides a self-service interface for managing AI Fabrix deployments. Built with Next.js 15 and Microsoft Fluent UI, it offers an intuitive experience for operators and administrators to create environments, manage applications, and monitor deployments.
graph TB
subgraph "User Interface Layer"
A[Dashboard] --> B[Environment Detail]
B --> C[Job Detail]
end
subgraph "Authentication Layer"
D[Admin Role] --> E[Operator Role]
E --> F[Viewer Role]
end
subgraph "API Layer"
G[/api/jobs] --> H[/api/envs]
H --> I[/api/groups]
I --> J[/api/auth]
J --> K[/api/config]
K --> L[/api/deploy]
end
subgraph "Database Layer"
M[SQLite Local] --> N[PostgreSQL Production]
N --> O[Prisma Models]
end
subgraph "Deployment Engine"
P[Deploy-AIFabrix.ps1] --> Q[Config Validation]
Q --> R[Status Reporting]
end
subgraph "Azure Resources"
S[Key Vault] --> T[Storage Account]
T --> U[Virtual Network]
U --> V[PostgreSQL Server]
V --> W[Redis Cache]
W --> X[App Services]
end
A --> D
D --> G
G --> M
M --> P
P --> S
sequenceDiagram
participant Dev as Developer
participant GH as GitHub Actions
participant Portal as Portal API
participant DB as Database
participant PS as PowerShell
Dev->>GH: Push app-schema.json
GH->>Portal: POST /api/github/deploy (OIDC token)
Portal->>Portal: Validate OIDC token
Portal->>DB: Create Application record
Portal->>GH: Return deployment config
GH->>Portal: POST /api/deployments
Portal->>DB: Create DynamicDeployment record
Portal->>PS: Start PowerShell deployment
Portal->>DB: Update deployment status
GH->>Portal: Poll /api/deployments/{id}
Portal->>GH: Return completion status
sequenceDiagram
participant User as Operator/Admin
participant Portal as Portal UI
participant API as Portal API
participant DB as Database
participant PS as PowerShell
User->>Portal: Fill configuration form
Portal->>Portal: Validate with Zod schema
User->>Portal: Submit "Create Environment"
Portal->>API: POST /api/environments
API->>Portal: Validate infrastructure schema
API->>DB: Create Environment record
API->>PS: Call Deploy-AIFabrix.ps1
API->>DB: Create Job record
PS->>DB: Update JobStep records
Portal->>API: Poll job status
API->>Portal: Return progress updates
PS->>DB: Mark job complete
Portal->>User: Show success with outputs
sequenceDiagram
participant Dev as Developer
participant Portal as Portal API
participant DB as Database
participant PS as PowerShell
Dev->>Portal: POST /api/applications (register)
Dev->>Portal: POST /api/deployments (deploy)
Portal->>DB: Create DynamicDeployment record
Portal->>Portal: Validate schema compatibility
Portal->>PS: Call PowerShell with config
Portal->>DB: Create DynamicDeploymentStep records
PS->>DB: Update deployment progress
Portal->>Dev: Return real-time status
PS->>DB: Mark deployment complete
Portal->>Dev: Return deployment outputs
sequenceDiagram
participant User as User
participant Portal as Portal
participant Entra as Entra ID
participant MSAL as MSAL
User->>Portal: Access portal
Portal->>MSAL: Redirect to login
MSAL->>Entra: Authenticate user
Entra->>User: MFA challenge (if required)
User->>Entra: Complete authentication
Entra->>MSAL: Return ID token with roles
MSAL->>Portal: Validate token and extract roles
Portal->>User: Enforce role-based access
| Role | Dashboard | Create Env | Update Env | View Jobs | Manage Roles | Deploy Apps |
|---|---|---|---|---|---|---|
| Viewer | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Operator | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
| Admin | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
interface Application {
id: string;
key: string;
displayName: string;
type: string;
image: string;
registryMode: 'acr' | 'external' | 'public';
requiresDatabase: boolean;
requiresRedis: boolean;
requiresStorage: boolean;
environmentVariables: Record<string, any>;
secrets: Record<string, any>;
roles: string[];
createdAt: Date;
updatedAt: Date;
}
interface DynamicDeployment {
id: string;
applicationKey: string;
environment: string;
preset: string;
location: string;
serviceName: string;
configuration: Record<string, any>;
status: 'pending' | 'running' | 'completed' | 'failed';
progress: number;
message?: string;
error?: string;
dryRun: boolean;
createdAt: Date;
updatedAt: Date;
}
interface Environment {
id: string;
serviceName: string;
environment: 'dev' | 'tst' | 'pro';
preset: string;
location: string;
status: 'pending' | 'running' | 'completed' | 'failed';
createdAt: Date;
updatedAt: Date;
}
GET /api/applications - List all applicationsPOST /api/applications - Register new applicationGET /api/applications/[key] - Get application detailsPUT /api/applications/[key] - Update applicationDELETE /api/applications/[key] - Remove applicationPOST /api/deployments - Create new deploymentGET /api/deployments/[id] - Get deployment statusDELETE /api/deployments/[id] - Cancel deploymentPOST /api/github/deploy - GitHub Actions deployment triggerGET /api/github/oidc - OIDC token validationGET /api/environments - List environmentsPOST /api/environments - Create environmentGET /api/environments/[id] - Get environment detailsThe existing Deploy-AIFabrix.ps1 script is enhanced with:
function Write-DeploymentStatus {
param($DeploymentId, $Status, $Progress, $Message, $Error)
# Update DynamicDeployment record via API
}
function Load-ConfigurationFromAPI {
param($DeploymentId)
# Fetch configuration from /api/deployments/{id}
}
function Write-DeploymentStep {
param($DeploymentId, $StepId, $Name, $Status, $Progress)
# Create DynamicDeploymentStep record
}
Contact us and we’ll get back to you as soon as possible.
Submit a Request