ixiclinicDocs
DesarrolladoresOperaciones

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;
SQL

El 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:

EntornoURL
Producciónhttps://console.ixiclinic.com
Desarrollohttp://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.

On this page