Crear un superadmin
Cómo dar de alta el primer usuario superadmin para acceder a la Consola SaaS (apps/console).
La Consola SaaS (console.ixiclinic.com) la usan los
superadmin de la plataforma para gestionar clientes, planes, suscripciones y demos. Por
seguridad no existe un alta pública de superadmin: el primer usuario se crea manualmente
contra la base de datos. Los superadmin viven en la tabla saas_users y son independientes de
los usuarios de cada laboratorio (tenant).
Nota: cada base de datos tiene sus propios superadmin. Si trabajas con varios entornos (desarrollo, producción), debes crear el usuario en cada uno.
Método recomendado: script
Con la DATABASE_URL del entorno configurada (en apps/api/.env.local, o exportada en el
shell), ejecuta:
pnpm --filter @ixiclinic/api superadmin:create -- <email> <password> "<nombre>"Ejemplo:
pnpm --filter @ixiclinic/api superadmin:create -- admin@ixiclinic.com 'un-password-fuerte' "Administrador"El script (apps/api/src/scripts/create-superadmin.ts) hashea la contraseña con bcrypt
(10 rounds) e inserta la fila. Falla con un mensaje claro si el email ya existe o si la
contraseña tiene menos de 8 caracteres.
Para apuntar a un entorno remoto sin desplegar código, abre un túnel a su PostgreSQL y pásale
la DATABASE_URL:
# túnel a la base de datos remota (ajusta host/puertos a tu infraestructura)
ssh -f -N -L 15432:<host-interno-db>:5432 <usuario>@<host>
DATABASE_URL="postgresql://<user>:<pass>@localhost:15432/<db>" \
pnpm --filter @ixiclinic/api superadmin:create -- admin@ixiclinic.com 'un-password-fuerte' "Administrador"Alternativa: SQL directo
Si solo tienes acceso a psql (por ejemplo, vía docker exec en el servidor) y no al
repositorio, puedes insertar la fila a mano. Necesitas un hash bcrypt de la contraseña
(la app usa bcrypt, 10 rounds); genéralo con el script de arriba en cualquier entorno, o con
un one-liner de Node usando bcryptjs:
node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 10))" 'un-password-fuerte'Luego, contra la base de datos (<contenedor-postgres>, <usuario>, <bd> según tu entorno):
docker exec -i <contenedor-postgres> psql -U <usuario> -d <bd> <<'SQL'
INSERT INTO saas_users (email, name, password_hash, role, active)
VALUES ('admin@ixiclinic.com', 'Administrador', '<hash-bcrypt>', 'superadmin', true)
ON CONFLICT (email) DO UPDATE
SET password_hash = EXCLUDED.password_hash, active = true;
SQLEl ON CONFLICT hace el comando idempotente: si el usuario ya existe, reinicia su
contraseña a la nueva (útil porque hoy no hay endpoint de cambio de contraseña — ver
Known issues). El comodín <<'SQL' (con comillas) evita que
el shell interprete los $ del hash.
Iniciar sesión
Con el usuario creado, entra en la Consola y usa ese email y contraseña:
| Entorno | URL |
|---|---|
| Producción | https://console.ixiclinic.com |
| Desarrollo | http://localhost:3001 |
Buenas prácticas: usa una contraseña fuerte y única; no compartas la cuenta entre personas (crea un superadmin por persona); revisa periódicamente la tabla
saas_users.
Testing
La estrategia de pruebas de ixiclinic — Vitest en el API (pnpm test, test:watch, archivo único), los tests existentes y la cobertura concentrada en la API como área a ampliar.
Known issues y notas de traspaso
Deuda técnica conocida, peculiaridades del proyecto y pendientes verificados en el código, con su recomendación, para el equipo que recibe ixiclinic.