subir y desplegar un proyecto springboot a render

 render es una plataforma en donde podemos desplegar nuestras aplicaciones de forma gratuita (tambien se puede contratar algun plan por si necesitamos mas recursos. Para pruebas sencillas basta con la capa gratuita)


Paso 1: Preparar tu Aplicación Spring Boot

a) Configurar el Puerto HTTP:
Spring Boot, por defecto, usa el puerto 8080. Render asigna un puerto dinámico mediante la variable de entorno PORT. Tu aplicación debe usar ese puerto.

En tu src/main/resources/application.properties:

server.port=${PORT:8080}

b) (Si usas Base de Datos) Usar Variables de Entorno:
Nunca hardcodees las credenciales de tu BD. Usa variables de entorno.

En application.properties:

spring.datasource.url=${DATABASE_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}

c) Crear un "Health Check" (Recomendado):
Render verifica que tu app esté viva haciendo una petición a un endpoint. Activa Spring Boot Actuator.

En tu pom.xml:

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

En application.properties:

management.endpoints.web.exposure.include=health,info

management.endpoint.health.show-details=always

Render hará una petición a /actuator/health para verificar el estado.

d) Crear un Dockerfile (Opción A - Recomendada para más control)
Cre

a un archivo llamado Dockerfile (sin extensión) en la raíz de tu proyecto:

vvv

# Usa una imagen oficial de Java con Maven incluido
FROM maven:3.8.6-eclipse-temurin-17-alpine AS builder

# Directorio de trabajo para construir la app
WORKDIR /app

# Copia el archivo de dependencias primero (aprovecha la cache de Docker)
COPY pom.xml .
# Descarga las dependencias
RUN mvn dependency:go-offline

# Copia todo el código fuente
COPY src ./src

# Compila el proyecto y crea el JAR
RUN mvn clean package -DskipTests

# --- Segunda etapa: crea una imagen más pequeña solo para ejecutar ---
FROM eclipse-temurin:17-jre-alpine

WORKDIR /app

# Copia el JAR desde la etapa de construcción
COPY --from=builder /app/target/*.jar app.jar

# Expone el puerto (Render lo manejará con la variable PORT)
EXPOSE 8080

# Comando para ejecutar la aplicación
ENTRYPOINT ["java", "-jar", "app.jar"] jajajaja


nota:
en el dockerfile estamos generando una imagen de maven para poder luego usar sus comandos de despliegue.
Render NO tiene Maven preinstalado en sus entornos de build.

Paso 2: Subir tu Código a GitHub

  1. Crea un repositorio en GitHub.

  2. Sube todo tu código (incluyendo el Dockerfile si elegiste esa opción).


Paso 3: Desplegar en Render.com

  1. Regístrate/Crea una cuenta en render.com (puedes usar tu cuenta de GitHub).

  2. Crea un nuevo "Web Service":

    • En tu dashboard, haz clic en "New +" y selecciona "Web Service".

    • Render te pedirá conectar tu cuenta de GitHub y autorizar el acceso. Conectala y selecciona el repositorio de tu app.

  3. Configura el Web Service:

    • Name: El nombre que tendrá tu app (e.g., mi-app-spring).

    • Environment: Docker 

    • Region: Elige la más cercana a tus usuarios (e.g., Ohio (US East)).

    • Branch: main (o la rama que quieras desplegar).

    • Root Directory: Déjalo en blanco si tu código está en la raíz del repo.

    • Build Command:

      • Si elegiste Docker: No necesitas este campo.

    • Start Command:

      • Si elegiste Docker: No necesitas este campo.

    • Plan: Elige Free para empezar.

  4. Configura Variables de Entorno (Advanced Settings):

    • Aquí es donde agregas las variables que definiste en tu archivo .env (e.g., DB_USERNAMEDB_PASSWORDDATABASE_URL).

    • Si añades una base de datos en Render (más abajo), Render creará automáticamente una variable DATABASE_URL que tu app usará.

  5. Haz clic en "Create Web Service".

    • Render empezará automáticamente a construir y desplegar tu aplicación. Puedes ver los logs en tiempo real en la pestaña "Logs" de tu servicio.

    • ¡Si el build tiene éxito, tu app estará viva! La URL tendrá la forma https://tu-app.onrender.com.


Paso 4 (Opcional pero Recomendado): Crear una Base de Datos en Render

Render también ofrece bases de datos PostgreSQL gratis.

  1. En el dashboard, haz clic en "New +" y selecciona "PostgreSQL".

  2. Configúrala (Nombre, Plan Free, etc.) y haz clic en "Create".

  3. Una vez creada, ve a la sección "Settings" de tu base de datos y encontrarás la Connection String (DATABASE_URL), el usuario (DB_USERNAME) y la contraseña (DB_PASSWORD).

  4. Copia estos valores y agrégalos como Variables de Entorno en tu Web Service (ve a tu Web Service -> Settings -> Environment Variables).

✅ Para Verificar que Todo Funcionó

  1. Ve a la URL de tu app (e.g., https://tu-app.onrender.com).

  2. Prueba el endpoint de health check: https://tu-app.onrender.com/actuator/health. Debería responder con {"status":"UP"}.

  3. Prueba los endpoints principales de tu API.

IMPORTANTE

al momento de hacer el despliegue nos dará el sgt error:

io.github.cdimascio.dotenv.DotenvException: Could not find /.env on the classpath

Este error es muy común y tiene una solución directa. La librería dotenv-java que estás usando está buscando específicamente un archivo llamado .env en el classpath (la raíz de tu proyecto), pero en el entorno de producción (Render) ese archivo no existe o no está donde la librería lo espera.

¿Por qué ocurre esto?

  • Localmente: Tienes un archivo .env en la raíz de tu proyecto con tus variables (claves de API, URLs de BD, etc.). Este archivo está listado en tu .gitignore, por lo que no se sube a GitHub (y es lo correcto, por seguridad).

  • En Render: No existe el archivo .env físico. En su lugar, configuras las variables de entorno directamente en el dashboard de Render.

La librería dotenv-java por defecto intenta cargar el archivo .env y, al no encontrarlo, lanza esta excepción.

 

Solución 1 (Recomendada): Configurar la librería para que falle en silencio si no existe .env

Esta es la mejor práctica. Configura Dotenv para que solo intente cargar el archivo .env en entornos de desarrollo y dependa totalmente de las variables del sistema operativo en producción.

En tu código Java (donde configuras Dotenv), modifícalo así:

import io.github.cdimascio.dotenv.Dotenv;
import jakarta.annotation.PostConstruct;

import org.springframework.context.annotation.Configuration;

@Configuration
public class EnvConfig {
    @PostConstruct
    public void loadEnv() {
        // Solo cargar .env en desarrollo local
        // Render inyecta la variable RENDER automáticamente
        if (System.getenv("RENDER") == null) {
            try {
                Dotenv dotenv = Dotenv.configure()
                        .ignoreIfMissing() // No lanzar excepción si no encuentra el archivo
                        .load();

                // Opcional: Poner las variables del .env en el System Environment
                // Esto asegura que @Value("${MI_VAR}") funcione tanto con .env como con variables del SO
                dotenv.entries().forEach(entry -> {
                    String key = entry.getKey();
                    if (System.getenv(key) == null) {
                        System.setProperty(key, entry.getValue());
                    }
                });
                
            } catch (Exception e) {
                System.out.println("Info: No .env file found. Using system environment variables.");
            }
        }
    }     
}

Comentarios

Entradas populares de este blog

crear un properties local + implementar actuator/health

subir un proyecto local a un repositorio de github