DevOS v1 + Phase 2: unified resource model, infra ops, website deployment, AI chat ops
- Monorepo: NestJS API (Fastify) + React web (antd/ProComponents) + shared packages - PostgreSQL/Prisma (unified resources, relations graph, audit, events, jobs) - Auth/RBAC/workspace isolation, credential vault (AES-256-GCM) - Servers/SSH, Docker discovery & lifecycle, Job Center - Websites & deployments (git provider credential clone, env, health verification) - Domains/DNS (Cloudflare adapter), certificates (TLS probe), monitoring - Automation (cron/event/webhook HMAC + notifications), AI Gateway, MCP (29 tools) - AI chat window (LLM function-calling + rules fallback, SSE streaming, approvals) - Notes: Vditor WYSIWYG markdown editor, non-blocking autosave - Tests: 35 unit/security tests; UI audit clean (desktop+mobile, deep links)
This commit is contained in:
@@ -0,0 +1,173 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "deployments" ADD COLUMN "buildStrategy" TEXT,
|
||||
ADD COLUMN "deployStrategy" TEXT,
|
||||
ADD COLUMN "environment" TEXT,
|
||||
ADD COLUMN "verification" JSONB;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "websites" ADD COLUMN "environment" TEXT NOT NULL DEFAULT 'production',
|
||||
ADD COLUMN "repositoryId" TEXT;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "GitConnection" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"resourceId" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"provider" TEXT NOT NULL,
|
||||
"apiBase" TEXT,
|
||||
"credentialId" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "GitConnection_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Repository" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"resourceId" TEXT NOT NULL,
|
||||
"connectionId" TEXT,
|
||||
"provider" TEXT NOT NULL DEFAULT 'GENERIC',
|
||||
"fullName" TEXT NOT NULL,
|
||||
"cloneUrl" TEXT NOT NULL,
|
||||
"defaultBranch" TEXT NOT NULL DEFAULT 'main',
|
||||
"visibility" TEXT NOT NULL DEFAULT 'private',
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Repository_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Task" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"resourceId" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT NOT NULL DEFAULT '',
|
||||
"status" TEXT NOT NULL DEFAULT 'TODO',
|
||||
"priority" TEXT NOT NULL DEFAULT 'MEDIUM',
|
||||
"labels" JSONB NOT NULL DEFAULT '[]',
|
||||
"dueAt" TIMESTAMP(3),
|
||||
"projectId" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Task_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Note" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"resourceId" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"content" TEXT NOT NULL DEFAULT '',
|
||||
"tags" JSONB NOT NULL DEFAULT '[]',
|
||||
"projectId" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Note_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Notification" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"resourceId" TEXT,
|
||||
"title" TEXT NOT NULL,
|
||||
"body" TEXT NOT NULL DEFAULT '',
|
||||
"level" TEXT NOT NULL DEFAULT 'INFO',
|
||||
"readAt" TIMESTAMP(3),
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "Notification_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Certificate" (
|
||||
"id" TEXT NOT NULL,
|
||||
"workspaceId" TEXT NOT NULL,
|
||||
"resourceId" TEXT NOT NULL,
|
||||
"domain" TEXT NOT NULL,
|
||||
"domainId" TEXT,
|
||||
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
||||
"issuer" TEXT,
|
||||
"notAfter" TIMESTAMP(3),
|
||||
"lastCheckedAt" TIMESTAMP(3),
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Certificate_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "GitConnection_resourceId_key" ON "GitConnection"("resourceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "GitConnection_workspaceId_idx" ON "GitConnection"("workspaceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Repository_resourceId_key" ON "Repository"("resourceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Repository_workspaceId_idx" ON "Repository"("workspaceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Repository_workspaceId_cloneUrl_key" ON "Repository"("workspaceId", "cloneUrl");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Task_resourceId_key" ON "Task"("resourceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Task_workspaceId_status_idx" ON "Task"("workspaceId", "status");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Task_projectId_idx" ON "Task"("projectId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Note_resourceId_key" ON "Note"("resourceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Note_workspaceId_idx" ON "Note"("workspaceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Notification_workspaceId_createdAt_idx" ON "Notification"("workspaceId", "createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Certificate_resourceId_key" ON "Certificate"("resourceId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Certificate_workspaceId_idx" ON "Certificate"("workspaceId");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "websites" ADD CONSTRAINT "websites_repositoryId_fkey" FOREIGN KEY ("repositoryId") REFERENCES "Repository"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "GitConnection" ADD CONSTRAINT "GitConnection_resourceId_fkey" FOREIGN KEY ("resourceId") REFERENCES "resources"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Repository" ADD CONSTRAINT "Repository_resourceId_fkey" FOREIGN KEY ("resourceId") REFERENCES "resources"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Repository" ADD CONSTRAINT "Repository_connectionId_fkey" FOREIGN KEY ("connectionId") REFERENCES "GitConnection"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Task" ADD CONSTRAINT "Task_resourceId_fkey" FOREIGN KEY ("resourceId") REFERENCES "resources"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Note" ADD CONSTRAINT "Note_resourceId_fkey" FOREIGN KEY ("resourceId") REFERENCES "resources"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Certificate" ADD CONSTRAINT "Certificate_resourceId_fkey" FOREIGN KEY ("resourceId") REFERENCES "resources"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
|
||||
-- Phase B: 关系类型标准化(旧 v1 小写名 → Phase2 大写规范名)
|
||||
UPDATE "resource_relations" SET "relationType" = 'WEBSITE_DEPLOYED_TO_SERVER' WHERE "relationType" = 'deployed_on';
|
||||
UPDATE "resource_relations" SET "relationType" = 'SERVER_HAS_CONTAINER' WHERE "relationType" = 'runs_container';
|
||||
UPDATE "resource_relations" SET "relationType" = 'WEBSITE_USES_DOMAIN' WHERE "relationType" = 'resolves_to';
|
||||
UPDATE "resource_relations" SET "relationType" = 'WEBSITE_HAS_DEPLOYMENT' WHERE "relationType" = 'has_deployment';
|
||||
UPDATE "resource_relations" SET "relationType" = 'WEBSITE_HAS_MONITOR' WHERE "relationType" = 'monitors';
|
||||
Reference in New Issue
Block a user