Files
edubox/server/prisma/seed.ts
T
root 852171cc59 feat(vpn): intégration Tailscale/Headscale + URLs publiques par sous-domaine
- Ajout d'un conteneur Tailscale côté serveur pour joindre les agents via IPs Tailscale
- Configuration Headscale exposé en HTTPS via Caddy (headscale.alfrednobel.edudeploy.com)
- Caddy configuré pour les sous-domaines avec TLS on-demand
- Middleware et route proxy Next.js pour router les sous-domaines vers les agents
- Ajout du champ domain sur Establishment et affichage de l'URL publique dans le dashboard
- Agent Windows v0.2.3 avec proxy Tailscale par instance pour contourner Docker Desktop
- Templates WordPress/PrestaShop bindés sur 0.0.0.0 pour être accessibles via Tailscale
2026-06-12 21:41:56 +00:00

153 lines
3.9 KiB
TypeScript

import { PrismaClient } from "@prisma/client";
import bcrypt from "bcryptjs";
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 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: "PrestaShop latest vierge",
type: "prestashop",
dockerImage: "prestashop/prestashop:latest",
dbImage: "mariadb:10.11",
dbName: "prestashop",
dbUser: "prestashop",
dbPassword: "prestashop",
dbRootPassword: "rootpassword",
},
{
name: "PrestaShop 8.1 vierge",
type: "prestashop",
dockerImage: "prestashop/prestashop:8.1",
dbImage: "mariadb:10.11",
dbName: "prestashop",
dbUser: "prestashop",
dbPassword: "prestashop",
dbRootPassword: "rootpassword",
},
];
for (const t of templates) {
const dbHost = "db";
const dbPort = "3306";
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:
- "127.0.0.1:{PORT}:80"
environment:
WORDPRESS_DB_HOST: ${dbHost}:${dbPort}
WORDPRESS_DB_NAME: ${t.dbName}
WORDPRESS_DB_USER: ${t.dbUser}
WORDPRESS_DB_PASSWORD: ${t.dbPassword}
WORDPRESS_DB_PREFIX: wp_
WORDPRESS_CONFIG_EXTRA: |
define('WP_HOME', '{PUBLIC_URL}');
define('WP_SITEURL', '{PUBLIC_URL}');
PS_DB_HOST: ${dbHost}:${dbPort}
PS_DB_NAME: ${t.dbName}
PS_DB_USER: ${t.dbUser}
PS_DB_PASSWORD: ${t.dbPassword}
PS_DB_PREFIX: ps_
PS_DOMAIN: {PUBLIC_DOMAIN}
PS_SHOP_NAME: ${t.name}
PS_INSTALL_AUTO: "0"
INSTANCE_ID: {INSTANCE_ID}
depends_on:
db:
condition: service_healthy
volumes:
- app_data:/var/www/html
restart: unless-stopped
volumes:
db_data:
app_data:
`;
await prisma.template.upsert({
where: { id: `${t.type}-${t.dockerImage.replace(/[:\/]/g, "-")}` },
update: { composeConfig },
create: {
id: `${t.type}-${t.dockerImage.replace(/[:\/]/g, "-")}`,
name: t.name,
type: t.type,
dockerImage: t.dockerImage,
composeConfig,
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);
});