chore: initialize repository with deployment baseline

This commit is contained in:
Austin A
2026-04-17 23:03:00 +01:00
parent f02ddf42aa
commit 5def26e0df
166 changed files with 43065 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
provider = "postgresql"

1205
backend/prisma/schema.prisma Normal file

File diff suppressed because it is too large Load Diff

184
backend/prisma/seed.js Normal file
View File

@@ -0,0 +1,184 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bcryptjs_1 = __importDefault(require("bcryptjs"));
const client_1 = require("@prisma/client");
const prisma = new client_1.PrismaClient();
async function main() {
const adminEmail = process.env.ADMIN_EMAIL ?? "admin@proxpanel.local";
const adminPassword = process.env.ADMIN_PASSWORD ?? "ChangeMe123!";
const password_hash = await bcryptjs_1.default.hash(adminPassword, 12);
const tenant = await prisma.tenant.upsert({
where: { slug: "default-tenant" },
update: {},
create: {
name: "Default Tenant",
slug: "default-tenant",
owner_email: adminEmail,
currency: client_1.Currency.NGN,
payment_provider: client_1.PaymentProvider.PAYSTACK
}
});
await prisma.user.upsert({
where: { email: adminEmail },
update: {
role: client_1.Role.SUPER_ADMIN,
password_hash,
tenant_id: tenant.id
},
create: {
email: adminEmail,
full_name: "System Administrator",
password_hash,
role: client_1.Role.SUPER_ADMIN,
tenant_id: tenant.id
}
});
await prisma.setting.upsert({
where: { key: "proxmox" },
update: {},
create: {
key: "proxmox",
type: "PROXMOX",
value: {
host: "",
port: 8006,
username: "root@pam",
token_id: "",
token_secret: "",
verify_ssl: true
}
}
});
await prisma.setting.upsert({
where: { key: "payment" },
update: {},
create: {
key: "payment",
type: "PAYMENT",
value: {
default_provider: "paystack",
paystack_public: "",
paystack_secret: "",
flutterwave_public: "",
flutterwave_secret: "",
flutterwave_webhook_hash: "",
callback_url: ""
}
}
});
await prisma.setting.upsert({
where: { key: "provisioning" },
update: {},
create: {
key: "provisioning",
type: "GENERAL",
value: {
min_vmid: 100
}
}
});
await prisma.setting.upsert({
where: { key: "backup" },
update: {},
create: {
key: "backup",
type: "GENERAL",
value: {
default_source: "local",
default_storage: "local-lvm",
max_restore_file_count: 100,
pbs_enabled: false,
pbs_host: "",
pbs_datastore: "",
pbs_namespace: "",
pbs_verify_ssl: true
}
}
});
await prisma.billingPlan.upsert({
where: { slug: "starter" },
update: {},
create: {
name: "Starter",
slug: "starter",
description: "Entry plan for lightweight VM workloads",
price_monthly: 12000,
price_hourly: 12000 / 720,
currency: client_1.Currency.NGN,
cpu_cores: 2,
ram_mb: 4096,
disk_gb: 60,
bandwidth_gb: 2000,
features: ["basic-support", "daily-backups"]
}
});
const ubuntuTemplate = await prisma.appTemplate.upsert({
where: { slug: "ubuntu-22-04-golden" },
update: {},
create: {
name: "Ubuntu 22.04 Golden",
slug: "ubuntu-22-04-golden",
template_type: "KVM_TEMPLATE",
virtualization_type: "QEMU",
source: "local:vztmpl/ubuntu-22.04-golden.qcow2",
description: "Baseline hardened Ubuntu template",
metadata: {
os_family: "linux",
os_version: "22.04"
}
}
});
const webGroup = await prisma.applicationGroup.upsert({
where: { slug: "web-workloads" },
update: {},
create: {
name: "Web Workloads",
slug: "web-workloads",
description: "HTTP-facing application services"
}
});
await prisma.applicationGroupTemplate.upsert({
where: {
group_id_template_id: {
group_id: webGroup.id,
template_id: ubuntuTemplate.id
}
},
update: {},
create: {
group_id: webGroup.id,
template_id: ubuntuTemplate.id,
priority: 10
}
});
await prisma.backupPolicy.upsert({
where: {
id: "default-tenant-backup-policy"
},
update: {},
create: {
id: "default-tenant-backup-policy",
tenant_id: tenant.id,
max_files: 25,
max_total_size_mb: 102400,
max_protected_files: 5,
allow_file_restore: true,
allow_cross_vm_restore: true,
allow_pbs_restore: true
}
});
}
main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (error) => {
// eslint-disable-next-line no-console
console.error("Seed failed:", error);
await prisma.$disconnect();
process.exit(1);
});
//# sourceMappingURL=seed.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"seed.js","sourceRoot":"","sources":["seed.ts"],"names":[],"mappings":"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"}

192
backend/prisma/seed.ts Normal file
View File

@@ -0,0 +1,192 @@
import bcrypt from "bcryptjs";
import { PrismaClient, Role, Currency, PaymentProvider } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const adminEmail = process.env.ADMIN_EMAIL ?? "admin@proxpanel.local";
const adminPassword = process.env.ADMIN_PASSWORD ?? "ChangeMe123!";
const password_hash = await bcrypt.hash(adminPassword, 12);
const tenant = await prisma.tenant.upsert({
where: { slug: "default-tenant" },
update: {},
create: {
name: "Default Tenant",
slug: "default-tenant",
owner_email: adminEmail,
currency: Currency.NGN,
payment_provider: PaymentProvider.PAYSTACK
}
});
await prisma.user.upsert({
where: { email: adminEmail },
update: {
role: Role.SUPER_ADMIN,
password_hash,
tenant_id: tenant.id
},
create: {
email: adminEmail,
full_name: "System Administrator",
password_hash,
role: Role.SUPER_ADMIN,
tenant_id: tenant.id
}
});
await prisma.setting.upsert({
where: { key: "proxmox" },
update: {},
create: {
key: "proxmox",
type: "PROXMOX",
value: {
host: "",
port: 8006,
username: "root@pam",
token_id: "",
token_secret: "",
verify_ssl: true
}
}
});
await prisma.setting.upsert({
where: { key: "payment" },
update: {},
create: {
key: "payment",
type: "PAYMENT",
value: {
default_provider: "paystack",
paystack_public: "",
paystack_secret: "",
flutterwave_public: "",
flutterwave_secret: "",
flutterwave_webhook_hash: "",
callback_url: ""
}
}
});
await prisma.setting.upsert({
where: { key: "provisioning" },
update: {},
create: {
key: "provisioning",
type: "GENERAL",
value: {
min_vmid: 100
}
}
});
await prisma.setting.upsert({
where: { key: "backup" },
update: {},
create: {
key: "backup",
type: "GENERAL",
value: {
default_source: "local",
default_storage: "local-lvm",
max_restore_file_count: 100,
pbs_enabled: false,
pbs_host: "",
pbs_datastore: "",
pbs_namespace: "",
pbs_verify_ssl: true
}
}
});
await prisma.billingPlan.upsert({
where: { slug: "starter" },
update: {},
create: {
name: "Starter",
slug: "starter",
description: "Entry plan for lightweight VM workloads",
price_monthly: 12000,
price_hourly: 12000 / 720,
currency: Currency.NGN,
cpu_cores: 2,
ram_mb: 4096,
disk_gb: 60,
bandwidth_gb: 2000,
features: ["basic-support", "daily-backups"]
}
});
const ubuntuTemplate = await prisma.appTemplate.upsert({
where: { slug: "ubuntu-22-04-golden" },
update: {},
create: {
name: "Ubuntu 22.04 Golden",
slug: "ubuntu-22-04-golden",
template_type: "KVM_TEMPLATE",
virtualization_type: "QEMU",
source: "local:vztmpl/ubuntu-22.04-golden.qcow2",
description: "Baseline hardened Ubuntu template",
metadata: {
os_family: "linux",
os_version: "22.04"
}
}
});
const webGroup = await prisma.applicationGroup.upsert({
where: { slug: "web-workloads" },
update: {},
create: {
name: "Web Workloads",
slug: "web-workloads",
description: "HTTP-facing application services"
}
});
await prisma.applicationGroupTemplate.upsert({
where: {
group_id_template_id: {
group_id: webGroup.id,
template_id: ubuntuTemplate.id
}
},
update: {},
create: {
group_id: webGroup.id,
template_id: ubuntuTemplate.id,
priority: 10
}
});
await prisma.backupPolicy.upsert({
where: {
id: "default-tenant-backup-policy"
},
update: {},
create: {
id: "default-tenant-backup-policy",
tenant_id: tenant.id,
max_files: 25,
max_total_size_mb: 102400,
max_protected_files: 5,
allow_file_restore: true,
allow_cross_vm_restore: true,
allow_pbs_restore: true
}
});
}
main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (error) => {
// eslint-disable-next-line no-console
console.error("Seed failed:", error);
await prisma.$disconnect();
process.exit(1);
});