generator client { provider = "prisma-client-js" binaryTargets = ["native", "darwin-arm64"] engineType = "binary" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Team { id String @id @default(uuid()) @db.Uuid name String @unique @db.VarChar(70) slug String @unique @db.VarChar(16) createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid registries Registry[] projects Project[] nodes Node[] users UsersOnTeams[] invitations UserInvitation[] auditLog AuditLog[] notifications Notification[] storages Storage[] configBundles ConfigBundle[] pipelines Pipeline[] packages Package[] } model Token { id String @id @default(uuid()) @db.Uuid userId String @db.Uuid name String @db.VarChar(70) createdAt DateTime @default(now()) @db.Timestamptz(6) expiresAt DateTime? @db.Timestamptz(6) nonce String @db.Uuid @@unique([userId, name, nonce]) } enum UserInvitationStatusEnum { pending expired declined } model UserInvitation { userId String @db.Uuid teamId String @db.Uuid email String status UserInvitationStatusEnum @default(pending) createdAt DateTime @default(now()) @db.Timestamptz(6) team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) @@id([userId, teamId]) @@unique([userId, teamId, email]) } model UsersOnTeams { userId String @db.Uuid role UserRoleEnum teamId String @db.Uuid team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) @@id([userId, teamId]) } model Node { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) type NodeTypeEnum? @default(docker) description String? icon String? address String? connectedAt DateTime? @db.Timestamptz(6) disconnectedAt DateTime? @db.Timestamptz(6) team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) teamId String @db.Uuid deployments Deployment[] events NodeEvent[] token NodeToken? environments PackageEnvironment[] @@unique([name, teamId]) } model NodeToken { nodeId String @id @unique @db.Uuid nonce String createdBy String @db.Uuid node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade) } model Registry { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) description String? icon String? url String user String? token Bytes? type RegistryTypeEnum namespace RegistryNamespaceEnum? imageNamePrefix String? apiUrl String? images Image[] eventWatchers PipelineEventWatcher[] registryToken RegistryToken? team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) teamId String @db.Uuid @@unique([name, teamId]) } model RegistryToken { id String @id @default(uuid()) @db.Uuid registryId String @db.Uuid createdBy String @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) expiresAt DateTime? @db.Timestamptz(6) nonce String @db.Uuid registry Registry @relation(fields: [registryId], references: [id], onDelete: Cascade) @@unique([registryId]) @@unique([registryId, nonce]) } model Project { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) description String? type ProjectTypeEnum team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) teamId String @db.Uuid versions Version[] versionChains VersionChain[] @@unique([name, teamId]) } model Version { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) changelog String? default Boolean @default(false) type VersionTypeEnum @default(incremental) autoCopyDeployments Boolean @default(true) projectId String @db.Uuid chainId String? @db.Uuid project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) chain VersionChain? @relation(fields: [chainId], references: [id], onDelete: SetNull) images Image[] deployments Deployment[] parent VersionsOnParentVersion? @relation("child") children VersionsOnParentVersion[] @relation("parent") @@unique([projectId, name]) } model VersionChain { id String @id @db.Uuid projectId String @db.Uuid project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) members Version[] packages VersionChainsOnPackage[] } model VersionsOnParentVersion { versionId String @unique @db.Uuid parentVersionId String @unique @db.Uuid child Version @relation(name: "child", fields: [versionId], references: [id], onDelete: Cascade) parent Version @relation(name: "parent", fields: [parentVersionId], references: [id], onDelete: Cascade) @@id([versionId, parentVersionId]) } model Image { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String tag String? order Int labels Json? registry Registry @relation(fields: [registryId], references: [id], onDelete: Cascade) registryId String @db.Uuid version Version @relation(fields: [versionId], references: [id], onDelete: Cascade) versionId String @db.Uuid config ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade) configId String @unique @db.Uuid instances Instance[] } enum NetworkMode { none host bridge } enum DeploymentStrategy { recreate rolling } enum RestartPolicy { always unlessStopped no onFailure } enum ExposeStrategy { none expose exposeWithTls } enum ContainerConfigType { image instance deployment configBundle } model ContainerConfig { id String @id @default(uuid()) @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? type ContainerConfigType //Common name String? environment Json? secrets Json? capabilities Json? expose ExposeStrategy? routing Json? configContainer Json? user Int? workingDirectory String? tty Boolean? ports Json? portRanges Json? volumes Json? commands Json? args Json? initContainers Json? storageSet Boolean? storageConfig Json? expectedState Json? //Dagent logConfig Json? restartPolicy RestartPolicy? networkMode NetworkMode? networks Json? dockerLabels Json? //Crane deploymentStrategy DeploymentStrategy? healthCheckConfig Json? resourceConfig Json? proxyBuffering Boolean? proxyHeaders Json? useLoadBalancer Boolean? extraLBAnnotations Json? corsHeaders Json? annotations Json? labels Json? metrics Json? replicas Int? experimental Json? image Image? instance Instance? deployment Deployment? configBundle ConfigBundle? storage Storage? @relation(fields: [storageId], references: [id], onDelete: Cascade) storageId String? @db.Uuid } model Deployment { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid deployedAt DateTime? @db.Timestamptz(6) deployedBy String? @db.Uuid note String? prefix String? status DeploymentStatusEnum tries Int @default(0) protected Boolean @default(false) version Version @relation(fields: [versionId], references: [id], onDelete: Cascade) versionId String @db.Uuid node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade) nodeId String @db.Uuid config ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade) configId String @unique @db.Uuid instances Instance[] events DeploymentEvent[] token DeploymentToken? configBundles ConfigBundleOnDeployments[] } model DeploymentToken { id String @id @default(uuid()) @db.Uuid deploymentId String @unique @db.Uuid createdBy String @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) name String expiresAt DateTime? @db.Timestamptz(6) nonce String @db.Uuid deployment Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade) AuditLog AuditLog[] @@unique([deploymentId, nonce]) } model Instance { id String @id @default(uuid()) @db.Uuid deployment Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade) deploymentId String @db.Uuid image Image @relation(fields: [imageId], references: [id], onDelete: Cascade) imageId String @db.Uuid config ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade) configId String @unique @db.Uuid } model DeploymentEvent { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) type DeploymentEventTypeEnum value Json deploymentId String @db.Uuid tryCount Int @default(0) deployment Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade) } enum AuditLogContextEnum { http ws rpc } enum AuditLogRequestMethodEnum { get post put patch delete } enum AuditLogActorTypeEnum { user deploymentToken } model AuditLog { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) actorType AuditLogActorTypeEnum userId String? @db.Uuid deploymentTokenId String? @db.Uuid teamId String @db.Uuid context AuditLogContextEnum method AuditLogRequestMethodEnum? event String data Json? team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) deploymentToken DeploymentToken? @relation(fields: [deploymentTokenId], references: [id], onDelete: SetNull) // is it ok on SetNull } enum UserRoleEnum { owner admin user } model Notification { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) url String type NotificationTypeEnum active Boolean @default(false) teamId String @db.Uuid team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) events NotificationEvent[] @@unique([name, teamId]) } model NotificationEvent { id String @id @default(uuid()) @db.Uuid event NotificationEventTypeEnum notificationId String @db.Uuid notification Notification @relation(fields: [notificationId], references: [id], onDelete: Cascade) @@unique([event, notificationId]) } model NodeEvent { id String @id @default(uuid()) @db.Uuid nodeId String @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) event NodeEventTypeEnum data Json? node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade) @@map("NodeEvent") } enum ProjectTypeEnum { versionless versioned } enum VersionTypeEnum { incremental rolling } enum DeploymentStatusEnum { preparing inProgress successful failed obsolete downgraded } enum DeploymentEventTypeEnum { log deploymentStatus containerState } enum RegistryTypeEnum { v2 hub gitlab github google unchecked } enum RegistryNamespaceEnum { organization user group project } enum NodeTypeEnum { docker k8s } enum NotificationTypeEnum { discord slack teams rocket mattermost } enum NotificationEventTypeEnum { deploymentStatus versionCreated nodeAdded userInvited imagePushed imagePulled } enum NodeEventTypeEnum { installed connected left kicked update updateCompleted containerCommand tokenReplaced } model Storage { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) description String? icon String? url String accessKey Bytes? secretKey Bytes? team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) teamId String @db.Uuid containerConfigs ContainerConfig[] @@unique([name, teamId]) } enum PipelineTypeEnum { github gitlab azure } enum PipelineStatusEnum { unknown queued running successful failed } model Pipeline { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) type PipelineTypeEnum description String? icon String? token Bytes repository Json trigger Json hooks Json team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) teamId String @db.Uuid runs PipelineRun[] eventWatchers PipelineEventWatcher[] @@unique([name, teamId]) } enum PipelineRunCreatorTypeEnum { user eventWatcher } model PipelineRun { id String @id @default(uuid()) @db.Uuid externalId Int status PipelineStatusEnum createdAt DateTime @default(now()) @db.Timestamptz(6) creatorType PipelineRunCreatorTypeEnum createdBy String @db.Uuid finishedAt DateTime? pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade) pipelineId String @db.Uuid @@unique([pipelineId, externalId]) } enum PipelineTriggerEventEnum { imagePush imagePull } model PipelineEventWatcher { id String @id @default(uuid()) @db.Uuid name String event PipelineTriggerEventEnum trigger Json createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade) pipelineId String @db.Uuid registry Registry? @relation(fields: [registryId], references: [id], onDelete: Cascade) registryId String? @db.Uuid } model ConfigBundle { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String description String? team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) teamId String @db.Uuid config ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade) configId String @unique @db.Uuid deployments ConfigBundleOnDeployments[] @@unique([name, teamId]) } model ConfigBundleOnDeployments { deployment Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade) deploymentId String @db.Uuid configBundle ConfigBundle @relation(fields: [configBundleId], references: [id], onDelete: Cascade) configBundleId String @db.Uuid @@id([deploymentId, configBundleId]) } model QualityAssuranceConfig { id String @id @default(uuid()) @db.Uuid name String? } model Package { id String @id @default(uuid()) @db.Uuid createdAt DateTime @default(now()) @db.Timestamptz(6) createdBy String @db.Uuid updatedAt DateTime @updatedAt @db.Timestamptz(6) updatedBy String? @db.Uuid name String @db.VarChar(70) description String? icon String? team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) teamId String @db.Uuid chains VersionChainsOnPackage[] environments PackageEnvironment[] @@unique([name, teamId]) } model VersionChainsOnPackage { chainId String @db.Uuid packageId String @db.Uuid chain VersionChain @relation(fields: [chainId], references: [id], onDelete: Cascade) package Package @relation(fields: [packageId], references: [id], onDelete: Cascade) @@id([chainId, packageId]) @@unique([chainId, packageId]) } model PackageEnvironment { id String @id @default(uuid()) @db.Uuid name String packageId String @db.Uuid nodeId String @db.Uuid prefix String package Package @relation(fields: [packageId], references: [id], onDelete: Cascade) node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade) @@unique([name, packageId]) }