Módulo 0
Iniciación a Strapi.
0.1. Instalación de Strapi y creación de un proyecto.
-
Abrimos GitHub en nuestro navegador.
-
Vamos al apartado repositories.
-
Creamos un nuevo repositorio.
-
Copiamos el HTTPS del repositorio creado.
-
Clonamos el repositorio en la ruta que queramos usando
git clone [HTTPS]. En este caso, nuestra ruta serávar/www/html. -
Abrimos MySQL Workbench.
-
Seleccionamos la conexión donde queramos tener nuestra BBDD, en este caso
mysql-local.(OJO! esto cambia en función del entorno TEST, PRODUCCIÓN, LOCAL) -
Creamos un nuevo schema. Seleccionamos la opción
utf8paraCharacter setyutf8_unicode_ciparaCollation. -
En la ruta donde hemos clonado anteriormente el repositorio, ejecutamos el comando npx create-strapi-app@latest [nombre]. En la configuración seleccionaremos la siguiente estructura:
- skip
- Do you want to use the default database (sqlite) ? n
- mysql
- [nombre squema BBDD]
- [IP conexión donde hemos creado el schema de la BBDD]
- default port
- desarrollo
- Alebat12358%
- no enable SSL
- Start with an example structure & data? N
- Start with Typescript? Y
- Install dependencies with npm? Y
- Initialize a git repository? Y
-
una vez terminada la configuración, movemos todos los archivos (exceptuando el .git) de la carpeta strapi acabamos de crear al repositorio previamente clonado.
-
Hacemos cd en el repositorio y ejecutamos:
npm i npm run build npm run develop- iniciamos sesión para crear el primer usuario (Normalmente se abre el navegador para hacer el registro, sino copiamos la url del terminal y la pegamos en el navegador)
- copiamos en .gitinore de algún proyecto ya creado y lo pegamos en el nuestro.
0.3. Configuración básica para un proyecto de Strapi mínimo.
- Vamos a la configuracion
- En Media Library dejamos la selección como la de la siguiente imagen:
- En el
package.json, en el apartado de dependencies, tenemos que tener las siguientes dependencias instaladas (Puede que cuando estes leyendo esto hay versiones mas modernas asique no copies y pegues, fijate en el númerito que es la versión)
"@retikolo/drag-drop-content-types": "1.3.9","@strapi/plugin-graphql": "^4.14.4","@strapi/plugin-i18n": "^4.15.0","@strapi/plugin-seo": "1.9.2","@strapi/plugin-users-permissions": "4.13.6","@strapi/provider-email-amazon-ses": "4.12.5","@strapi/provider-upload-aws-s3": "4.11.7","@strapi/strapi": "v4.14.4","aws-sdk": "^2.1494.0","axios": "1.4.0","jsonwebtoken": "9.0.2","mysql": "2.18.1","mysql2": "3.5.2","semver": "^7.5.4","strapi-plugin-import-export-entries": "1.21.0","strapi-plugin-multi-select": "1.2.2","strapi-plugin-notes": "1.0.1","strapi-plugin-transformer": "3.1.1","strapi-plugin-translate": "^1.2.3","strapi-provider-translate-deepl": "^1.1.2","stripe": "13.5.0"- El archivo
plugins.ts, lo cambiaremos por el siguiente código:
const fechaActual = new Date();const añoActual = fechaActual.getFullYear();const mesActual = fechaActual.getMonth() + 1;
module.exports = ({ env }) => ({ upload: { config: { provider: "aws-s3", providerOptions: { baseUrl: env("CDN_URL"), rootPath: `${env("CDN_ROOT_PATH")}${añoActual}/${mesActual}`, s3Options: { accessKeyId: env("AWS_ACCESS_KEY_ID"), secretAccessKey: env("AWS_ACCESS_SECRET"), region: env("AWS_REGION"), params: { ACL: env("AWS_ACL", "public-read"), signedUrlExpires: env("AWS_SIGNED_URL_EXPIRES", 15 * 60), Bucket: env("AWS_BUCKET"), }, }, }, actionOptions: { upload: {}, uploadStream: {}, delete: {}, }, }, }, "import-export-entries": { enabled: true, config: {}, }, email: { config: { provider: "amazon-ses", providerOptions: { key: env("AWS_SES_KEY"), secret: env("AWS_SES_SECRET"), amazon: `https://email.${env("AWS_SES_REGION")}.amazonaws.com`, }, settings: { defaultFrom: "info@alebateducation.com", defaultReplyTo: "info@alebateducation.com", }, }, }, pedidos: { enabled: true, resolve: "./src/plugins/pedidos", }, transformer: { enabled: true, config: { responseTransforms: { removeAttributesKey: true, removeDataKey: true, }, }, }, translate: { enabled: true, config: { provider: "deepl", providerOptions: { apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", localeMap: { ES: "ES", }, apiOptions: { formality: "default", }, }, }, },});La sección de “pedidos” solo la incluiremos si la aplicación estamos creando va a permitir compras
Esta es la configuración para poder utilizar bases de datos de escritura y lectura. El archivo se llama databaseRouter.ts
import { Next, Context } from "koa";import mysql from "mysql2/promise";
export default (config, { strapi }) => { return async (ctx: Context, next: Next) => { const poolRead = mysql.createPool({ host: process.env.DATABASE_HOST_READING, port: parseInt(process.env.DATABASE_PORT), database: process.env.DATABASE_NAME, user: process.env.DATABASE_USERNAME, password: process.env.DATABASE_PASSWORD, });
const poolWrite = mysql.createPool({ host: process.env.DATABASE_HOST_WRITING, port: parseInt(process.env.DATABASE_PORT), database: process.env.DATABASE_NAME, user: process.env.DATABASE_USERNAME, password: process.env.DATABASE_PASSWORD, });
const isWriteOperation = ["POST", "PUT", "DELETE"].includes(ctx.method);
ctx.dbConfig = isWriteOperation ? poolWrite : poolRead;
await next(); };};