chore(backend): добавить поддержку ACME и управление сертификатами

This commit is contained in:
Denozordec
2026-05-12 20:00:25 +07:00
parent bfceb07a23
commit d62d212c86
21 changed files with 2183 additions and 301 deletions
+110
View File
@@ -0,0 +1,110 @@
import { z } from "zod"
export const certUsageSchema = z.enum([
"server",
"client",
"ca",
"crl-sign",
])
export const certStatusSchema = z.enum(["valid", "expired", "revoked"])
export const certificateDtoSchema = z.object({
id: z.string().min(1),
name: z.string().min(1),
serverId: z.string().min(1),
serverName: z.string().optional(),
commonName: z.string(),
sans: z.array(z.string()),
issuedBy: z.string(),
validFrom: z.string(),
validUntil: z.string(),
daysLeft: z.number().int(),
keySize: z.number().int().nonnegative(),
usage: z.array(certUsageSchema),
trusted: z.boolean(),
status: certStatusSchema,
acmeStatus: z.string().optional(),
})
export const certificatesListResponseSchema = z.object({
certificates: z.array(certificateDtoSchema),
failures: z.array(z.object({
serverId: z.string(),
serverName: z.string().optional(),
error: z.string(),
})),
})
export const certificateTrustStoreSchema = z.enum([
"www",
"api",
"sstp",
"ovpn",
"ipsec",
"email",
"radius",
"fetch",
"container",
])
export const certificateIssueRequestSchema = z.object({
serverId: z.union([z.string(), z.number()]),
certName: z.string().min(1).max(64),
domainNames: z.array(z.string().min(1)).min(1),
keyType: z.enum(["rsa2048", "ec256"]).optional(),
trustStore: z.array(certificateTrustStoreSchema).optional(),
})
export const certificateIssueJobStatusSchema = z.enum([
"queued",
"running",
"done",
"failed",
])
export const certificateIssueStepSchema = z.enum([
"queued",
"acme_order",
"dns_challenge",
"finalize",
"import",
"cleanup",
"done",
])
export const certificateIssueJobSchema = z.object({
id: z.string().min(1),
status: certificateIssueJobStatusSchema,
step: certificateIssueStepSchema,
serverId: z.string(),
certName: z.string(),
domainNames: z.array(z.string()),
requestedAt: z.string(),
startedAt: z.string().optional(),
finishedAt: z.string().optional(),
error: z.string().optional(),
})
export const acmeCloudflareSettingsDtoSchema = z.object({
directoryUrl: z.string().url(),
defaultZoneId: z.string().optional(),
tokenConfigured: z.boolean(),
updatedAt: z.string().optional(),
})
export const putAcmeCloudflareSettingsSchema = z.object({
directoryUrl: z.string().url().optional(),
defaultZoneId: z.union([z.string(), z.null()]).optional(),
cloudflareApiToken: z.union([z.string(), z.null()]).optional(),
})
export const testAcmeCloudflareSettingsSchema = z.object({
cloudflareApiToken: z.string().optional(),
})
export type CertificateDto = z.infer<typeof certificateDtoSchema>
export type CertificatesListResponse = z.infer<typeof certificatesListResponseSchema>
export type CertificateIssueRequest = z.infer<typeof certificateIssueRequestSchema>
export type CertificateIssueJob = z.infer<typeof certificateIssueJobSchema>
export type AcmeCloudflareSettingsDto = z.infer<typeof acmeCloudflareSettingsDtoSchema>
+1
View File
@@ -8,6 +8,7 @@ export const eventSourceModuleSchema = z.enum([
"filters",
"traffic",
"alerts",
"certificates",
"system",
])
+1
View File
@@ -1,3 +1,4 @@
export * from "./servers.js"
export * from "./alerts.js"
export * from "./events.js"
export * from "./certificates.js"