Strapi 5 en Node.js Toolkit con MariaDB por socket, el build del panel de administración según tu plan, el primer administrador y tu API pública en JSON.
Strapi es un CMS sin cabeza: tú defines los tipos de contenido, un panel de administración los edita y una API REST los sirve en JSON a tu web, tu app o tu Nuxt. Corre en Node, así que en los planes Profesional y Avanzado va bajo Node.js Toolkit como cualquier otra aplicación. Hay dos cosas que lo diferencian de un Nuxt o un Next, y esta guía las resuelve las dos: la base de datos se conecta por socket y el build del panel de administración pide más memoria de la que tiene el plan Profesional. Todo lo de aquí está probado con Strapi 5.54 sobre Node 26.
Antes de empezar
- El plan decide dónde construyes. Strapi en marcha ocupa unos 300 MB, y eso cabe en el Profesional; pero
strapi build(el panel de administración) necesita más de 2 GB de memoria, y en el Profesional el proceso muere. En el Avanzado construyes en el servidor; en el Profesional construyes en tu ordenador y subes el resultado (Qué incluye tu plan de hosting: recursos, límites y permisos). - Un subdominio, por ejemplo
strapi.tudominio.es(Cómo crear un subdominio y qué puedes montar en él), con Raíz del documento enstrapiy su certificado (Cómo activar un certificado Let's Encrypt gratis en tu dominio). - Una base de datos MySQL con su usuario, creada en Bases de datos (Cómo gestionar tu base de datos).
- Tu proyecto Strapi, creado en tu ordenador con
npx create-strapi@latesteligiendo MySQL como base de datos. Los tipos de contenido se definen ahí, connpm run developy el Content-Type Builder: en producción ese editor está bloqueado a propósito. - Node 20 o superior en tu ordenador para el build local, si tu plan es el Profesional.
Paso a paso
- Prepara la conexión a la base de datos. El usuario que crea Plesk solo acepta conexiones locales por socket, y Node, con
host: localhost, intenta entrar por TCP y recibe «Access denied». Enconfig/database.ts(o.js), dentro de la conexiónmysql, añade una línea:
socketPath: env('DATABASE_SOCKET', undefined),
Y en .env, además de DATABASE_NAME, DATABASE_USERNAME y DATABASE_PASSWORD con los datos de tu base de datos:
DATABASE_CLIENT=mysql
DATABASE_SOCKET=/var/lib/mysql/mysql.sock
- Crea en la raíz del proyecto el archivo de arranque que usará el panel,
server.js:
const { createStrapi } = require('@strapi/strapi');
createStrapi({ distDir: './dist' }).start();
-
Si tu plan es el Profesional, construye en tu ordenador:
npm run builddeja la carpetadistcon el panel de administración y tu código compilado. En el Avanzado puedes saltarte este paso. -
Sube el proyecto a la carpeta
strapisinnode_modules: un zip desde Archivos y Extraer archivos (Cómo publicar una web Astro en tu hosting sin Node en el servidor), incluyendo.env,server.jsy, si lo construiste,dist. Borra elindex.htmlde bienvenida de Plesk. Comprueba en Archivos que.envtiene la contraseña real de la base de datos. -
En el subdominio, abre Node.js. En Archivo de inicio de la aplicación escribe
server.js, pulsa Activar Node.js y después Instalación de NPM. Strapi trae unas 1400 dependencias: tarda un par de minutos y ocupa unos 700 MB. -
Solo en el Avanzado: Ejecutar Script →
build→ Ejecutar. Tarda cerca de un minuto y termina con «Building admin panel».
En el Profesional ese mismo build acaba en «JavaScript heap out of memory» o muere sin mensaje al tocar el límite del plan; por eso subes dist ya construido.
- Pulsa el valor de Raíz del documento y elige la carpeta
publicdentro destrapi: ahí guarda Strapi las subidas de la biblioteca de medios, y el servidor web las sirve directamente..env,disty el resto quedan fuera del alcance del navegador. Pulsa Reiniciar app.
- Abre
https://strapi.tudominio.es/admin. La primera vez pide crear el administrador: nombre, correo y una contraseña con mayúscula, minúscula y número. Guárdalos: no hay otro.
- En Content Manager elige tu tipo de contenido, Create new entry, rellena los campos y pulsa Publish. Hasta que publiques, la API no lo devuelve.
- Abre la API al público: Settings → Users & Permissions plugin → Roles → Public, despliega tu tipo de contenido, marca find y findOne y pulsa Save. Solo lectura: create, update y delete se quedan sin marcar.
- Abre
https://strapi.tudominio.es/api/articulos(el plural de tu tipo). Devuelve tus entradas publicadas en JSON: eso es lo que consumirá tu web.
- Para cambiar el contenido, entras en
/admin. Para cambiar la estructura (un tipo nuevo, un campo más), lo haces en tu ordenador connpm run develop, construyes, subesdistysrcy pulsas Reiniciar app. En el Avanzado, en vez de subirdist, lanzas elbuilddesde el panel.
Cómo comprobar que ha funcionado
/admin carga y entra con tu usuario; /api/<plural> responde 200 con data y meta; una imagen subida a la Media Library se abre en https://strapi.tudominio.es/uploads/... servida por el servidor web, no por Node. Y https://strapi.tudominio.es/.env da 403: la raíz del documento está en public y los archivos que empiezan por punto no se sirven.
Si algo falla
- 503 al abrir la web: Strapi no ha arrancado. Lee
stderr.logen la carpetastrapidesde Archivos y los Registros del subdominio (Cómo leer los registros de tu web para encontrar un error). - «Access denied for user '...'@'127.0.0.1'»: te falta el
socketPathdel paso 1, o.envno llevaDATABASE_SOCKET. Con el socket, el usuario y la contraseña de Plesk entran a la primera. - «JavaScript heap out of memory» o el build desaparece sin terminar: es el paso 6 en un plan Profesional. Construye en tu ordenador y sube
dist. - En el Content-Type Builder los campos salen con un candado y no hay botón para crear tipos ni añadir campos: es normal en producción. Los tipos se crean en tu ordenador y se suben.
- La API devuelve 403: el rol Public no tiene find en ese tipo (paso 10). Devuelve 404 con
data: null: la entrada está en borrador, sin publicar. - Faltan
APP_KEYS,ADMIN_JWT_SECRETo similares al arrancar:.envno se subió (los zip de algunos programas omiten los archivos que empiezan por punto). Súbelo suelto desde Archivos. - Cualquier otra cosa: abre un ticket desde tu área de cliente (Cómo abrir un ticket de soporte y que se resuelva a la primera) con las últimas líneas de
stderr.log.