wip:milestone 0 fixes
Some checks failed
CI/CD Pipeline / unit-tests (push) Failing after 1m16s
CI/CD Pipeline / integration-tests (push) Failing after 2m32s
CI/CD Pipeline / lint (push) Successful in 5m22s
CI/CD Pipeline / e2e-tests (push) Has been skipped
CI/CD Pipeline / build (push) Has been skipped

This commit is contained in:
2026-03-15 12:35:42 +02:00
parent 6708cf28a7
commit cffdf8af86
61266 changed files with 4511646 additions and 1938 deletions

View File

@@ -0,0 +1,141 @@
import axios from 'axios'
const api = axios.create({
baseURL: '/api/v1',
headers: {
'Content-Type': 'application/json',
},
})
// Types
export interface Server {
id: string
name: string
template: string
provider: string
ip_address: string
status: 'provisioning' | 'starting' | 'active' | 'draining' | 'stopping' | 'stopped' | 'error'
created_at: string
updated_at: string
}
export interface Template {
id: string
name: string
description: string
min_hetzner_plan: string
estimated_monthly_cost: number
services: Service[]
requirements: TemplateRequirements
}
export interface Service {
id: string
name: string
image: string
ports: string[]
}
export interface TemplateRequirements {
min_nodes: number
max_nodes: number
supports_ha: boolean
}
export interface Provider {
name: string
provider: string
supported: boolean
plans: Plan[]
regions: number
}
export interface Plan {
id: string
name: string
cpu_cores: number
memory_gb: number
disk_gb: number
monthly_cost: number
}
export interface ClusterHealth {
healthy: boolean
total_servers: number
active_servers: number
error_servers: number
services_up: number
services_down: number
}
export interface ScalingPlan {
scaling_plan: ScalingStep[]
total_cost_monthly: number
estimated_time_minutes: number
}
export interface ScalingStep {
provider: string
action: string
template: string
plan: string
count: number
cost_per_server: number
total_cost: number
}
// API Functions
export const apiService = {
// Servers
getServers: () => api.get<{ servers: Server[] }>('/servers'),
addServer: (data: AddServerRequest) => api.post('/servers', data),
getServer: (id: string) => api.get(`/servers/${id}`),
deleteServer: (id: string) => api.delete(`/servers/${id}`),
getServerStatus: (id: string) => api.get(`/servers/${id}/status`),
fortifyServer: (id: string, data: FortifyRequest) => api.post(`/servers/${id}/fortify`, data),
// Templates
getTemplates: () => api.get<{ templates: Template[] }>('/templates'),
getTemplate: (id: string) => api.get(`/templates/${id}`),
validateTemplate: (id: string) => api.post(`/templates/${id}/validate`),
// Providers
getProviders: () => api.get<{ providers: Provider[] }>('/providers'),
getProviderPlans: (provider: string) => api.get(`/providers/${provider}/plans`),
getProviderRegions: (provider: string) => api.get(`/providers/${provider}/regions`),
// Scaling
createScalingPlan: (data: ScalingPlanRequest) => api.post('/cluster/scale-plan', data),
executeScalingPlan: (plan: ScalingStep[]) => api.post('/cluster/scale-execute', plan),
// Cluster
getClusterHealth: () => api.get<ClusterHealth>('/cluster/health'),
}
export interface AddServerRequest {
name: string
template: string
provider: string
plan: string
region: string
features?: string[]
environment?: string
ssh_key_id?: string
tags?: Record<string, string>
}
export interface FortifyRequest {
enable_firewall?: boolean
enable_fail2ban?: boolean
harden_ssh?: boolean
enable_monitoring?: boolean
}
export interface ScalingPlanRequest {
provider: string
plan?: string
region?: string
target_worker_count?: number
target_db_count?: number
min_ha_nodes?: boolean
}