226 lines
5.8 KiB
TypeScript
226 lines
5.8 KiB
TypeScript
import { PrismaClient } from "@prisma/client";
|
|
import bcrypt from "bcryptjs";
|
|
import fs from "fs";
|
|
import path from "path";
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
async function main() {
|
|
const superadminEmail = process.env.SUPERADMIN_EMAIL || "admin@edudeploy.fr";
|
|
const superadminPassword = process.env.SUPERADMIN_PASSWORD || "CHANGE_ME";
|
|
|
|
const hashedPassword = await bcrypt.hash(superadminPassword, 12);
|
|
|
|
await prisma.user.upsert({
|
|
where: { email: superadminEmail },
|
|
update: {},
|
|
create: {
|
|
email: superadminEmail,
|
|
password: hashedPassword,
|
|
role: "superadmin",
|
|
},
|
|
});
|
|
|
|
const wpReadyInitScript = fs.readFileSync(
|
|
path.join(__dirname, "../templates/wordpress-ready/wp-init.sh"),
|
|
"utf-8"
|
|
);
|
|
|
|
const templates = [
|
|
{
|
|
name: "WordPress latest vierge",
|
|
type: "wordpress",
|
|
dockerImage: "wordpress:latest",
|
|
dbImage: "mariadb:10.11",
|
|
dbName: "wordpress",
|
|
dbUser: "wordpress",
|
|
dbPassword: "wordpress",
|
|
dbRootPassword: "rootpassword",
|
|
},
|
|
{
|
|
name: "WordPress 6.7 vierge",
|
|
type: "wordpress",
|
|
dockerImage: "wordpress:6.7",
|
|
dbImage: "mariadb:10.11",
|
|
dbName: "wordpress",
|
|
dbUser: "wordpress",
|
|
dbPassword: "wordpress",
|
|
dbRootPassword: "rootpassword",
|
|
},
|
|
{
|
|
name: "WordPress 6.4 vierge",
|
|
type: "wordpress",
|
|
dockerImage: "wordpress:6.4",
|
|
dbImage: "mariadb:10.11",
|
|
dbName: "wordpress",
|
|
dbUser: "wordpress",
|
|
dbPassword: "wordpress",
|
|
dbRootPassword: "rootpassword",
|
|
},
|
|
{
|
|
name: "WordPress latest prêt à l'emploi",
|
|
type: "wordpress-ready",
|
|
dockerImage: "wordpress:latest",
|
|
dbImage: "mariadb:10.11",
|
|
dbName: "wordpress",
|
|
dbUser: "wordpress",
|
|
dbPassword: "wordpress",
|
|
dbRootPassword: "rootpassword",
|
|
ready: true,
|
|
initScript: wpReadyInitScript,
|
|
},
|
|
{
|
|
name: "WordPress 7.0.0 prêt à l'emploi",
|
|
type: "wordpress-ready",
|
|
dockerImage: "wordpress:7.0.0-php8.3",
|
|
dbImage: "mariadb:10.11",
|
|
dbName: "wordpress",
|
|
dbUser: "wordpress",
|
|
dbPassword: "wordpress",
|
|
dbRootPassword: "rootpassword",
|
|
ready: true,
|
|
initScript: wpReadyInitScript,
|
|
},
|
|
{
|
|
name: "PrestaShop 9 vierge (edubox)",
|
|
type: "prestashop",
|
|
dockerImage: "151.80.60.98:3001/yacine/edubox/edubox-prestashop:9-edubox-9",
|
|
dbImage: "mariadb:10.11",
|
|
dbName: "prestashop",
|
|
dbUser: "prestashop",
|
|
dbPassword: "prestashop",
|
|
dbRootPassword: "rootpassword",
|
|
},
|
|
];
|
|
|
|
for (const t of templates) {
|
|
const dbHost = "db";
|
|
const dbPort = "3306";
|
|
const isPrestaShop = t.type === "prestashop";
|
|
const isWordPressReady = (t as any).ready === true;
|
|
|
|
const appEnv = isPrestaShop
|
|
? ` DB_SERVER: ${dbHost}
|
|
DB_PORT: ${dbPort}
|
|
DB_NAME: ${t.dbName}
|
|
DB_USER: ${t.dbUser}
|
|
DB_PASSWD: ${t.dbPassword}
|
|
DB_PREFIX: ps_
|
|
PS_DOMAIN: {PUBLIC_DOMAIN}
|
|
PS_SHOP_NAME: ${t.name}
|
|
PS_INSTALL_AUTO: "1"
|
|
PS_INSTALL_DB: "0"
|
|
PS_ENABLE_SSL: "0"
|
|
PS_LANGUAGE: fr
|
|
PS_COUNTRY: fr
|
|
ADMIN_MAIL: admin@edubox.local
|
|
ADMIN_PASSWD: EduboxPrestashop2024!
|
|
PS_FOLDER_ADMIN: admin-edubox
|
|
PS_FOLDER_INSTALL: install
|
|
PS_DEV_MODE: "1"`
|
|
: ` WORDPRESS_DB_HOST: ${dbHost}:${dbPort}
|
|
WORDPRESS_DB_NAME: ${t.dbName}
|
|
WORDPRESS_DB_USER: ${t.dbUser}
|
|
WORDPRESS_DB_PASSWORD: ${t.dbPassword}
|
|
WORDPRESS_DB_PREFIX: wp_
|
|
# No hardcoded WP_HOME/WP_SITEURL so WordPress auto-detects from the Host header`;
|
|
|
|
const appDNS = isWordPressReady
|
|
? ` dns:
|
|
- 8.8.8.8
|
|
- 1.1.1.1`
|
|
: "";
|
|
|
|
const appVolumes = isPrestaShop
|
|
? ` volumes:
|
|
- app_data:/var/www/html`
|
|
: ` volumes:
|
|
- app_data:/var/www/html
|
|
- {MU_PLUGINS_DIR}/edubox-public-url.php:/var/www/html/wp-content/mu-plugins/edubox-public-url.php:ro`;
|
|
|
|
const wpInitService = isWordPressReady
|
|
? ` wp-init:
|
|
image: wordpress:cli
|
|
user: "0:0"
|
|
environment:
|
|
WORDPRESS_DB_HOST: ${dbHost}:${dbPort}
|
|
WORDPRESS_DB_NAME: ${t.dbName}
|
|
WORDPRESS_DB_USER: ${t.dbUser}
|
|
WORDPRESS_DB_PASSWORD: ${t.dbPassword}
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
app:
|
|
condition: service_started
|
|
volumes:
|
|
- app_data:/var/www/html
|
|
- ./wp-init.sh:/wp-init.sh:ro
|
|
restart: "no"
|
|
entrypoint: ["/bin/sh", "/wp-init.sh"]
|
|
`
|
|
: "";
|
|
|
|
const composeConfig = `services:
|
|
db:
|
|
image: ${t.dbImage}
|
|
environment:
|
|
MYSQL_ROOT_PASSWORD: ${t.dbRootPassword}
|
|
MYSQL_DATABASE: ${t.dbName}
|
|
MYSQL_USER: ${t.dbUser}
|
|
MYSQL_PASSWORD: ${t.dbPassword}
|
|
volumes:
|
|
- db_data:/var/lib/mysql
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 10
|
|
app:
|
|
image: ${t.dockerImage}
|
|
ports:
|
|
- "{PORT}:80"
|
|
environment:
|
|
${appEnv}
|
|
INSTANCE_ID: {INSTANCE_ID}
|
|
${appDNS}
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
${appVolumes}
|
|
restart: unless-stopped
|
|
${wpInitService}volumes:
|
|
db_data:
|
|
app_data:
|
|
`;
|
|
const initScript = isWordPressReady ? wpReadyInitScript : null;
|
|
|
|
await prisma.template.upsert({
|
|
where: { id: `${t.type}-${t.dockerImage.replace(/[:\/]/g, "-")}` },
|
|
update: { composeConfig, initScript },
|
|
create: {
|
|
id: `${t.type}-${t.dockerImage.replace(/[:\/]/g, "-")}`,
|
|
name: t.name,
|
|
type: t.type,
|
|
dockerImage: t.dockerImage,
|
|
composeConfig,
|
|
initScript,
|
|
isPublic: true,
|
|
createdBy: "system",
|
|
},
|
|
});
|
|
}
|
|
|
|
console.log("Seed completed.");
|
|
}
|
|
|
|
main()
|
|
.then(async () => {
|
|
await prisma.$disconnect();
|
|
})
|
|
.catch(async (e) => {
|
|
console.error(e);
|
|
await prisma.$disconnect();
|
|
process.exit(1);
|
|
});
|