5aa4acdf87
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
// server/db/schema.ts
|
|
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
|
|
|
export const machines = sqliteTable("machines", {
|
|
id: text("id").primaryKey(),
|
|
name: text("name").notNull(),
|
|
hostname: text("hostname").notNull(),
|
|
port: integer("port").notNull().default(22),
|
|
osFamily: text("os_family").notNull().default("unknown"),
|
|
username: text("username").notNull(),
|
|
encPassword: text("enc_password").notNull(),
|
|
encSudoPassword: text("enc_sudo_password"),
|
|
aptProxyMode: text("apt_proxy_mode").notNull().default("direct"),
|
|
aptProxyUrl: text("apt_proxy_url"),
|
|
status: text("status").notNull().default("unknown"),
|
|
lastCheckedAt: text("last_checked_at"),
|
|
createdAt: text("created_at").notNull(),
|
|
});
|
|
|
|
export const snapshots = sqliteTable("snapshots", {
|
|
id: text("id").primaryKey(),
|
|
machineId: text("machine_id").notNull().references(() => machines.id, { onDelete: "cascade" }),
|
|
checkedAt: text("checked_at").notNull(),
|
|
status: text("status").notNull(),
|
|
payloadJson: text("payload_json").notNull(),
|
|
});
|
|
|
|
export const executions = sqliteTable("executions", {
|
|
id: text("id").primaryKey(),
|
|
machineId: text("machine_id").notNull().references(() => machines.id, { onDelete: "cascade" }),
|
|
action: text("action").notNull(),
|
|
mode: text("mode").notNull().default("manual"),
|
|
startedAt: text("started_at").notNull(),
|
|
finishedAt: text("finished_at"),
|
|
status: text("status").notNull(),
|
|
resultJson: text("result_json"),
|
|
reportPath: text("report_path"),
|
|
rawLogPath: text("raw_log_path"),
|
|
});
|