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); });