Files
edubox/server/prisma/seed.ts
EduBox Dev fc61404271 feat: installation offline complete, HTTPS registry, 8Go WSL, v0.3.18
- Wizard: installation 100% offline (WSL bundle, Podman MSI, machine image, docker-compose)
- Wizard: suppression de wsl --install --no-distribution
- Wizard: .wslconfig avec 8Go RAM / 4 CPU
- Wizard: operations asynchrones pour eviter le freeze UI
- Wizard: detection automatique de podman.exe
- Wizard: version 0.1.1
- Agent: passage en v0.3.18
- Serveur: registry PrestaShop en HTTPS via gitea.alfrednobel.edudeploy.com
- Caddy: config gitea.alfrednobel.edudeploy.com
- Docs: mise a jour SUIVI_INSTALLER.md, README.md, seed.ts
2026-07-02 22:52:28 +00:00

226 lines
5.9 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: "gitea.alfrednobel.edudeploy.com/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);
});