# 📋 Instrucciones de Instalación en VPS Ubuntu 24.04

## 🎯 Requisitos Previos
- VPS con Ubuntu 24.04 instalado
- Acceso root (SSH)
- Dominio apuntando al IP del VPS
- Credenciales de GitLab para clonar el repositorio

---

## 📦 Archivos a Subir al VPS

**Solo necesitas 1 archivo:**
- `InstallAPIDocker.sh`

---

## 🚀 Pasos de Instalación

### 1️⃣ Conectarse al VPS por SSH

```bash
ssh root@TU_IP_VPS
```

### 2️⃣ Subir el Script al VPS

**Opción A: Usando SCP desde tu máquina local**
```bash
scp c:\laragon\www\apidian2026-8\InstallAPIDocker.sh root@TU_IP_VPS:/root/
```

**Opción B: Crear el archivo directamente en el VPS**
```bash
# En el VPS, crear el archivo
nano /root/InstallAPIDocker.sh

# Copiar y pegar el contenido del script
# Guardar con Ctrl+O, Enter, Ctrl+X
```

**Opción C: Descargar desde un repositorio**
```bash
# Si el script está en GitLab/GitHub
wget https://gitlab.torresoftware.com/TorreSoftware/apidian-laravel-8-s3/raw/main/InstallAPIDocker.sh
# o
curl -O https://gitlab.torresoftware.com/.../InstallAPIDocker.sh
```

### 3️⃣ Dar Permisos de Ejecución

```bash
chmod +x /root/InstallAPIDocker.sh
```

### 4️⃣ Ejecutar el Script

```bash
cd /root
sudo bash InstallAPIDocker.sh tu-dominio.com
```

**Ejemplo:**
```bash
sudo bash InstallAPIDocker.sh miempresa.com
```

### 5️⃣ Responder las Preguntas del Script

Durante la ejecución, el script te preguntará:

**a) Puerto de MySQL:**
```
Ingrese el puerto de MySQL o Enter para 3306 por defecto [3306]:
```
- Presiona `Enter` para usar el puerto 3306 por defecto
- O escribe otro puerto si lo necesitas (ej: 3307)

**b) Subdominio de la API:**
```
Ingrese el subdominio para la api o Enter para valor por defecto (api) por defecto [api]:
```
- Presiona `Enter` para usar "api" (resultado: `api.tu-dominio.com`)
- O escribe otro subdominio (ej: apidian → `apidian.tu-dominio.com`)

**c) Instalar SSL (al final):**
```
instalar SSL gratuito? si[s] no[n]:
```
- Escribe `s` para instalar certificado SSL gratuito (Let's Encrypt)
- Escribe `n` para omitir (podrás instalarlo después)

---

## ⏱️ Tiempo de Instalación

- **Primera vez:** 10-15 minutos
  - Instalación de Docker y dependencias
  - Clonación del repositorio
  - Construcción de la imagen PHP 8
  - Instalación de Composer y dependencias
  - Ejecución de migraciones

---

## 📝 Lo que Hace el Script Automáticamente

1. ✅ Actualiza Ubuntu 24.04
2. ✅ Instala Docker CE (última versión)
3. ✅ Instala Docker Compose v2.24.0 (compatible con Ubuntu 24.04)
4. ✅ Crea la red Docker necesaria
4. ✅ Clona el repositorio de GitLab
5. ✅ Crea el Dockerfile para PHP 8.0
6. ✅ Genera contraseñas seguras automáticamente
7. ✅ Configura MySQL/MariaDB
8. ✅ Configura Nginx como proxy
9. ✅ Instala todas las extensiones PHP necesarias
10. ✅ Ejecuta `composer install`
11. ✅ Ejecuta las migraciones de la base de datos
12. ✅ Configura los permisos correctos
13. ✅ Genera la clave de aplicación Laravel
14. ✅ (Opcional) Instala certificado SSL

---

## 📂 Estructura Creada en el VPS

Después de la instalación, tendrás:

```
/root/
├── InstallAPIDocker.sh          # El script que ejecutaste
├── .env                          # Variables de entorno (contraseñas)
├── docker-compose.yml            # Configuración de contenedores
├── apidian/                      # Código de la aplicación
│   ├── .env                      # Configuración de Laravel
│   ├── docker/
│   │   └── php8/
│   │       └── Dockerfile        # Dockerfile PHP 8
│   └── ... (código Laravel)
└── setup/
    ├── certs/                    # Certificados SSL
    ├── mysql/
    │   └── init.sql              # Script inicial de BD
    ├── fpms/
    │   └── apidian/
    │       └── default           # Configuración Nginx
    └── private.txt               # 🔒 IMPORTANTE: Credenciales
```

---

## 🔐 Credenciales Generadas

Al finalizar, encontrarás las credenciales en:

```bash
cat /root/setup/private.txt
```

**Contenido:**
```
MYSQL
----------------------------------
DB_PORT     = 3306
DB_USERNAME = root
DB_PASSWORD = [contraseña-generada-automáticamente]

API
----------------------------------
PATH = /root/apidian
URL  = api.tu-dominio.com
```

**⚠️ IMPORTANTE:** Guarda estas credenciales en un lugar seguro.

---

## 🧪 Verificar la Instalación

### Comprobar que los contenedores están corriendo:
```bash
docker ps
```

Deberías ver 4 contenedores:
- `proxy` (nginx-proxy)
- `nginx_api` (nginx)
- `php_api` (PHP 8.0-fpm)
- `mariadb` (base de datos)

### Comprobar logs:
```bash
# Ver logs de todos los contenedores
docker-compose logs

# Ver logs de un contenedor específico
docker-compose logs php_api
docker-compose logs nginx_api
docker-compose logs mariadb
```

### Probar la API:
```bash
curl http://api.tu-dominio.com
# o
curl https://api.tu-dominio.com  # Si instalaste SSL
```

---

## 🔧 Comandos Útiles Post-Instalación

### Reiniciar todos los contenedores:
```bash
cd /root
docker-compose restart
```

### Detener todos los contenedores:
```bash
cd /root
docker-compose down
```

### Iniciar todos los contenedores:
```bash
cd /root
docker-compose up -d
```

### Entrar al contenedor PHP:
```bash
docker-compose exec php_api bash
```

### Ejecutar comandos de Laravel:
```bash
# Limpiar caché
docker-compose exec php_api php artisan cache:clear

# Ver rutas
docker-compose exec php_api php artisan route:list

# Ejecutar migraciones
docker-compose exec php_api php artisan migrate

# Ver logs de Laravel
docker-compose exec php_api tail -f storage/logs/laravel.log
```

### Ver base de datos:
```bash
# Conectarse a MySQL
docker-compose exec mariadb mysql -u root -p
# Usar la contraseña de /root/setup/private.txt
```

---

## 🆘 Solución de Problemas

### Si el script falla:

**1. Verificar que tienes acceso al repositorio de GitLab:**
```bash
git clone https://gitlab.torresoftware.com/TorreSoftware/apidian-laravel-8-s3.git /tmp/test
```

**2. Si Docker no está instalado:**
```bash
sudo apt update
sudo apt install docker.io docker-compose -y
```

**3. Si los contenedores no inician:**
```bash
cd /root
docker-compose logs
```

**4. Si el puerto 80/443 está ocupado:**
```bash
# Ver qué está usando el puerto
sudo lsof -i :80
sudo lsof -i :443

# Detener Apache/Nginx si está instalado
sudo systemctl stop apache2
sudo systemctl stop nginx
```

**5. Limpiar todo y volver a empezar:**
```bash
cd /root
docker-compose down -v
rm -rf apidian setup docker-compose.yml .env
# Volver a ejecutar el script
sudo bash InstallAPIDocker.sh tu-dominio.com
```

---

## 🔄 Reinstalar o Actualizar

Si necesitas reinstalar:

```bash
cd /root
docker-compose down -v
rm -rf apidian setup docker-compose.yml
sudo bash InstallAPIDocker.sh tu-dominio.com
```

**⚠️ Esto borrará la base de datos. Haz backup antes.**

---

## 📌 Notas Importantes

1. **Docker Compose:** El script instala automáticamente Docker Compose v2.24.0
   - Compatible con Docker Engine API 1.44 (Ubuntu 24.04)
   - No necesitas instalarlo manualmente

2. **Dominio DNS:** Asegúrate de que tu dominio apunta al IP del VPS antes de ejecutar el script
   - Tipo A: `tu-dominio.com` → `IP_VPS`
   - Tipo A: `*.tu-dominio.com` → `IP_VPS` (wildcard para subdominios)

3. **Firewall:** Abre los puertos necesarios:
   ```bash
   sudo ufw allow 22/tcp    # SSH
   sudo ufw allow 80/tcp    # HTTP
   sudo ufw allow 443/tcp   # HTTPS
   sudo ufw allow 3306/tcp  # MySQL (si necesitas acceso externo)
   sudo ufw enable
   ```

3. **Credenciales GitLab:** Si el repositorio es privado, necesitarás autenticarte:
   ```bash
   git config --global credential.helper store
   ```

4. **PHP 8.0:** El script usa PHP 8.0-fpm automáticamente, no necesitas configurar nada

5. **Composer:** Se instala automáticamente dentro del contenedor PHP

---

## 🎉 ¡Listo!

Si todo funcionó correctamente, tu API estará disponible en:
- **HTTP:** `http://api.tu-dominio.com`
- **HTTPS:** `https://api.tu-dominio.com` (si instalaste SSL)

Para verificar:
```bash
curl http://api.tu-dominio.com/api/ubl2.1/config/software
```

---

## 📞 Soporte

Si tienes problemas, revisa:
1. Los logs: `docker-compose logs`
2. El archivo `.env` en `/root/apidian/.env`
3. Las credenciales en `/root/setup/private.txt`
