Entradas

Mostrando entradas de 2021

Create a docker image from a spring boot project

In order to create a docker image from a spring boot project, First, your pom.xml has to be configured. <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- Cofiguration for creating a docker image --> <image> <name>chamow01/${project.artifactId}</name> </image> </configuration> </plugin> </plugins> </build> Then, the next maven command needs to be applied, so spring boot uses paketo-buildpacks in order to create a docker image based on you Java code mvn spring-boot:build-image ... [INFO] > Running creator [INFO] [creator] ===> DETECTING [INFO] [creator] 6 of 24 buildpacks participating [INFO] [creator] paketo-buildpacks/ca-certificates 3.2.0 [INFO] [creator] paketo-buildpacks/bellsoft-liberica 9.3.2 [INFO]

Dockerfile multi fase

Imagen
A continuación se detalla la configuración de un archivo Dockerfile multi fase; en donde, primero se utiliza una imagen alpine para construir una aplicación ReactJs y luego utilizar una imagen de nginx para deployar el contenido de la carpeta build Diagrama de configuración Archivo Dockerfile # --------------------------------- # FIRST BLOCK AS A BUILDER PHASE # --------------------------------- FROM node:16-alpine as builder WORKDIR /usr/app COPY package.json . RUN npm install COPY . . RUN npm run build # Default commando for the image, no es necesario #CMD [ ] # --------------------------------- # SECOND BLOCK AS A RUN PHASE # --------------------------------- FROM nginx COPY --from=builder /usr/app/build /usr/share/nginx/html # Default commando for the image, no es necesario ya que nginx inicia automaticamente #CMD [ ] Fase 1: Se utiliza una imagen 16-alpine como constructor, se utiliza el directorio de trabajo /usr/app , se copia el archivo package.jso

Docker Compose

Imagen
Docker compoose permite inicializar múltiples contenedores al mismo tiempo; ademas, permite automatizar la variedad de opciones que se utiliza en los comandos con docker, como por ejemplo; docker run <arguments> Se debe utilizar el archivo docker-compose.yml en donde se puede utilizar varios comandos docker A continuación un ejemplo de creación de dos contenedores en un archivo docker-compose.yml. version: "3" services: redise-server: image: "redis" node-app: build: ./app ports: - "8081:8083" Contenedor 1: Contiene la configuración de redis, en el cual se indica que se debe usar la imagen:redis Contenedor 2: Contiene la configuración de un servidor node, en el cual se indica que se debe usar un archivo Dockerfile ubicado en la carpeta ./app; ademas, se realiza el mapeao de los puertos 8081 (máquina local) con el puerto 8083 (Servidor node) A continuación un ejemplo de creación

Comandos docker

A continuación se detalla un listado de comandos para Docker Comando Descripción Ejemplo Básicos docker --version Versión de docker docker --version docker info Información sobre el entrono de docker docker info docker login Para iniciar sesión en hub docker Imagenes docker images Lista las imagenes instaladas docker image inspect id_image Información detalla de la imagen docker image inspect 7adf docker pull Obtiene e instala una imagen desde hub docker docker pull ubuntu docker rmi Elimina una imagen instalada docker rmi ubuntu Contenedores

Comandos Docker Compose

Imagen
A continuación, se detalla los comandos de docker compose. Comando Descripción Ejemplo docker-compose up Es equivalente a docker run; por lo tanto, corre las imagenes declaradas en el archivo docker-compose.yml docker-compose up docker-compose up -d Similar a docker-compose up pero la bandera -d permite correr la imagen en background docker-compose up -d docker-compose down Permite parar las imagenes detalladas en el archivo docker-compose.yml docker-compose down docker-compose ps Ppermite ver los procesos corriendo de dicho archivo docker-compose ps docker-compose restart container_name Permite reiniciar un contenedor docker-compose restart postgres docker-compose up --build Permite reconstruir las imag

Comandos en Angular-CLI

Comando usados en Angular CLI Comando Descripcion ng new nombre-app Permite crear una nueva aplicación Angular ng serve -o Permite levantar el servidor embebido y abrirlo en el navegador ng generate componente nombre ng g c nombre Permite Genear un componente de angular (con una carpeta.ts, .html, .css, .spec.ts) y actualiza el app.module.ts TES Fuentes https://angular.io/clim

Configuración de Profiles para Spring-Boot

Proceso para crear profiles para un proyecto Spring-boot Configurar en el pom.xml los perfiles deseados, por ejemplo, a continuación se configura dos profiles para dev y prod <profiles> <profile> <id>dev</id> <properties> <activatedProperties>dev</activatedProperties> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>prod</id> <properties> <activatedProperties>prod</activatedProperties> </properties> </profile> </profiles> Configurar los recursos que se van a cargar con el profile activo <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plu

Deploy de un jar en Heroku

Proceso para deployar un jar en Heroku Logearse en heroku con el comando: heroku login Instalar el siguiente plugin: heroku plugins:install heroku-cli-deploy Crear un nuevo proyecto en Heroku y enlazarlo con el proyecto local: heroku git:remote -a dc-homepay-rest Deployar el jar en Heroku con el siguiente comando: heroku deploy:jar target/homepay-controller-1.0.0-SNAPSHOT.jar Si se debea ver los logs de la aplicación se debe ejecutar el siguiente comando: heroku logs heroku logs --tail Fuentes https://devcenter.heroku.com/articles/deploying-java

Comandos en MongoDB

Comando usados para importar y exportar datos de MongoDB en formatos JSON Y BSON JSON BSON mongoimport mongorestore mongoexport mongodump Comandos para EXPORTAR datos JSON mongoexport mongoexport --uri <Atlas Cluster URI> --collection=<collection name> --out=<filename>.json Example: mongoexport --uri="mongodb+srv://<your username>:<your password>@<your cluster>.mongodb.net/sample_supplies" --collection=sales --out=sales.json BSON mongodump mongodump --uri <Atlas Cluster URI> Example: mongodump --

Tips nodejs

Crear un archivo .env para manejo de variables de entorno y no subir datos sensibles a los repositorios #.env file PORT=500 Nota 1: Agregar el archivo .evn a .gitignore Nota 2: Se debe instalar npm i dotenv

Tips React

Evitar el submit de un form cuando se da enter en un input Configurar el form como se indica <form autoComplete="off" noValidate onSubmit={e => { e.preventDefault(); }}>

Creación de una aplicación MERN

Creación de una aplicación MERN M.- MongoDB E.- Express R.- React N.- NodeJs Crear una carpeta padre llamada app y dentro crear dos carpetas hijas llamadas client y server Servidor Dentro de la carpeta server, ejecutar el comando npm init -y para crear un archivo package.json de forma automática Luego ejecutar el comando npm install body-parser cors express mongoose nodemon para instalar las dependencias básicas que se necesitan de lado del servidor Instalar las siguientes librerias para login: npm install bcryptjs jsonwebtoken Notas: Para poder utilizar los imports de tipo import module from 'module' se debe configurar la bandera "type":"module" Deploy en Heroku: Crear el archivo Procfile con el contenido: web: npm run start Esto permite a heroku levantar el servidor una vez que esté deployada Cliente Dentro de la carpeta client, ejecutar el comando npm install axios moment react-f

Configuración de Swagger con spring boot

Swagger permite documentar las APIS de un proyecto de forma automática. Para usar swagger en un proyecto maven con spring-boot, se debe seguir los siguientes pasos Configuración de dependencias en proyecto maven. <!--SWAGGER--> <dependency> <groupId> io.springfox </groupId> <artifactId> springfox-boot-starter </artifactId> <version> 3.0.0 </version> </dependency> Crear una clase SwaggerConfig configurada con las anotaciones:  @Configuration  y que retorne un objecto de tipo   Docket import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.D

Comandos Ionic

ionic cordova build android ionic build Generar artefacto para android ionic cordova run android --device Debug en dispositivo android npx cap add android npx cap add ios Agregar una plataforma nativa npx cap copy Copiar el contenido construido dentro de las carpetas nativas de desarrolo npx cap sync Sincronizar los cambios realizados npx cap open android Lanzar Android Studio para debuggear la aplicacion nativa con los nuevos cambios construidos npx cap run android Correr el proyecto en Android

Configuración de JBoss para modo debug

Imagen
Para que una instancia de Jboss puede ser accedida en modo debug se debe realizar la siguiente configuración (para este ejemplo en el archivo: host-slave.xml):  Entidad Padre <server name="MI-INSTANCIA-EN-DEBUG" group="MI-INSTANCIA-EN-DEBUGL_GR" auto-start="true"> <jvm name="default"> <jvm-options> <option value="-Xrunjdwp:transport=dt_socket,address=10899,server=y,suspend=n"/> </jvm-options> </jvm> <socket-bindings socket-binding-group="standard-sockets" port-offset="19900"/> </server> Configuración en Eclipse Para poder utilizar desde eclipse el modo debug, se debe realizar un Debug Configuration de tipo Remote Java Application con el puerto configurado previamente, en este ejemplo 10899: Fuentes:  Experiencia del autor.

JPA Infinite recursion (StackOverflowError); nested exception spring boot

Parea evitar que un par de entidades JPA (padre, hijo) genere una recursión infinita al ser utilizadas en un servicio REST, se debe usar las siguientes anotaciones:  @JsonManagedReference  @JsonBackReference annotations. Entidad Padre @Entity @Table public class User extends CommonBean implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue private long id; private String name; @Column(name = "lastname") private String lastName; private String cellphone; private String email; private String password; @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) @JsonManagedReference private List listHouses; } Entidad Hija @Entity public class House extends CommonBean implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Id @GeneratedVa

Configuración de Swagger

Swagger permite documentar las APIS de un proyecto de forma automática. Para usar swagger en un proyecto maven, se debe seguir los siguientes pasos Configuración de dependencias en proyecto maven. <!--SWAGGER--> <dependency> <groupid>io.springfox</groupid> <artifactid>springfox-swagger2</artifactid> <version>2.9.2</version> </dependency> <dependency> <groupid>io.springfox</groupid> <artifactid>springfox-swagger-ui</artifactid> <version>2.9.2</version> </dependency> Crear una clase SwaggerConfig configurada con las anotaciones:  @Configuration @EnableSwagger2 y que retorne un objecto de tipo   Docket @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket apiDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(getApiInfo()) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any())

Ejemplo de diseño de api REST

 Antes de empezar con el diseño de un api REST es necesario definir los recursos que se necesitan para lograr una funcionalidad específica; por ejemplo, a continuación se lista los recursos  necesarios para administrar un listado de actividades por usuario. Obtener el listado de actividades de un usuario específico  GET /users/{user_id}/activities Eliminar una actividad de un usuario específico  DELETE /users/{user_id}/activities/{act_id} Editar una actividad de un usuario específico   PUT /users/{user_id}/activities/{act_id} Crear una actividad de un usuario específico.  POST /users/{user_id}/activitie