# Salto Innova – Documentación de Infraestructura

## Descripción del Entorno

##### 🖥 Servidor 1 (Aplicación)

Aloja la aplicación web (contenedor Docker con Apache + PHP).

##### 🗄 Servidor 2 (Base de Datos)

Aloja la base de datos del sistema.

##### 🗄 Servidor 3 (Proxy)

Este último es el entorno de producción, que está compuesto por un servidor en zona DMZ. Cuenta con acceso a Internet y
actúa como Proxy, permitiendo que los usuarios externos accedan a la aplicación.

![Diagrama](diag-despliegue-prod.png)

## Despliegue de producción

### En servidor de Aplicación (sin acceso a Internet):

La aplicación se encuentra en una imagen de Docker. Una imagen Docker es un paquete que contiene la aplicación y todo lo
necesario para ejecutarla (código, dependencias, configuración y sistema base), listo para crear un contenedor que
funcione de manera idéntica en cualquier servidor.
Este servidor no tiene conexión directa a Internet, por lo tanto la imagen Docker debe ser construida o transferida
previamente.
<br>

### 0. Requisitos previos

- Docker instalado

- Docker Compose instalado

- Acceso SSH al servidor

- Archivo `docker-compose.yaml`

- Archivo `.env.production` (basado en `.env.example`)

<br>

### 1. Obtener imagen

#### Bajar la imagen de DockerHub

DockerHub es un registro público de imágenes Docker donde se almacenan y distribuyen imágenes listas para descargar y
usar.

Pueden acceder a la que generamos para ustedes desde el repositorio de dockerhub
[Repositorio Docker Salto Innova](https://hub.docker.com/repository/docker/retofebrero2026/saltoinnovareto)

Desde el servidor se podrá ejecutar:

```
docker pull retofebrero2026/saltoinnovareto:latest
```

<br>

### 2. Configuración del servidor de Aplicación

Una vez que la imagen esté disponible:

**Paso 1 – Copiar archivos necesarios**

Colocar en el servidor los siguientes archivos:

`docker-compose.yaml`

`.env.production` (basado en `.env.example`)

Editar el archivo .env.production y configurar:

- Variables de base de datos

```
DB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
```

- Credenciales necesarias del registry
  Registry de Docker:

```
DOCKER_REPO=saltoinnovareto
DOCKERHUB_PASSWORD=Silla.Proyector.2026
DOCKERHUB_USERNAME=retofebrero20626
IMAGE_DOCKERHUB=retofebrero2026/saltoinnovareto
```

**Paso 2 – Levantar los servicios**

```
docker compose up -d
```

Esto iniciará:

- Contenedor de la aplicación

- Conexión con la base de datos

<br>

### En servidor con acceso a Internet (Proxy):

Este servidor es el único que recibe tráfico externo.

Su función es:

- Recibir solicitudes HTTP/HTTPS

- Redirigirlas al Servidor de Aplicación interno

### Configuración del servidor de Proxy

**Requisitos previos:**

- Certificar servidor (HTTPS)

Se debe utilizar el archivo de configuración de Proxy que les entregamos:

`CONFIG_PROXY.conf`

Esta configuración:

- Redirige el tráfico al servidor interno

- Permite que la aplicación sea accesible desde Internet

- Mantiene aislado el servidor interno

<br>

#### Verificación Final

Verificar que los contenedores estén corriendo:

```
docker ps
```

Desde el navegador, acceder a:

http://IP_PUBLICA_DEL_PROXY

Si todo está correcto, la aplicación debería mostrarse normalmente.

> ⚠️ Si al ingresar se visualiza un error, es posible que la base de datos no haya estado disponible al momento del
> despliegue.
> En ese caso, ingresar al contenedor de PHP y ejecutando:
>
>```docker exec -it innova-prod bash```
>
> Luego:
>
> `php artisan migrate`
>
> `php artisan db:seed`
>
> Estos comandos crean la estructura de la base de datos y cargan los datos iniciales necesarios para el correcto
> funcionamiento del sistema.

<br>

#### Soporte

En caso de inconvenientes puede verificar logs con:

```
docker logs innova-prod
```

o comunicarse con el equipo de desarrollo.

---

## Despliegue de desarrollo

A continuación, se detallan los pasos para levantar el entorno de desarrollo del proyecto.

Este entorno permite:

- Agregar nuevas funcionalidades
- Modificar reglas de negocio
- Realizar pruebas antes de pasar a producción

Todos estos pasos pueden realizarse desde cualquier computadora con acceso a Internet que tenga Docker instalado.

### Requisitos previos

- Docker instalado
- Docker Compose instalado
- Git instalado
- Repo clonado

<br>

**Paso 1 - Crear archivo de configuración** `.env.`

En la raíz del proyecto, crear un archivo llamado `.env` basado en el archivo `.env.example`.

```
cp .env.example .env
```

Luego, editar el archivo `.env` y completar los valores faltantes.

> ⚠️ El archivo .env contiene variables sensibles como:
> - Contraseñas
> - Claves de acceso
> - Configuración de base de datos"
>
>Estas variables no están incluidas en el repositorio por motivos de seguridad.

**Paso 3 - Levantar el entorno de desarrollo**

Ejecutar el siguiente comando en la terminal:

```
docker compose -f docker-compose.dev.yaml up --build -d
```

Este comando:

- Construye la imagen de desarrollo (si no existe)
- Crea los contenedores necesarios (aplicación + base de datos)
- Inicia el entorno en segundo plano, para que se pueda seguir usando la terminal

**Paso 4 - Generar la APP_KEY (solo la primera vez)**

Si es la primera vez que se levanta el proyecto, es necesario generar la clave interna de la aplicación.

> ¿Qué es la APP KEY?
>
>La APP KEY es una clave de seguridad utilizada por el framework Laravel para:
>
> - Encriptar datos
> - Proteger sesiones
> - Firmar información sensible

Para generarla, ejecutar:

```
docker exec -it php php artisan key:generate
```

Este comando:

- Ingresa al contenedor de PHP
- Genera automáticamente la clave
- La guarda en el archivo `.env`

**Paso 5 - Verificar funcionamiento**
Si todo está correcto, la aplicación debería estar disponible en:

http://localhost

Para verificar que los contenedores estén corriendo:

```
docker ps
```

> ⚠️ Si al ingresar se visualiza un error, es posible que la base de datos no haya estado disponible al momento del
> despliegue.
> En ese caso, ingresar al contenedor de PHP y ejecutando:
>
>```docker exec -it innova-prod bash```
>
> Luego:
>
> `php artisan migrate`
>
> `php artisan db:seed`
>
> Estos comandos crean la estructura de la base de datos y cargan los datos iniciales necesarios para el correcto
> funcionamiento del sistema.

---

#### Comandos útiles

Detener el entorno:

```
docker compose -f docker-compose.dev.yaml down
```
