# Despliegue con dominio propio + HTTPS gratis

Objetivo: que las URLs cortas de los QR dinámicos sean
`https://tudominio.com/r/xxxx` — con control total, métricas propias y sin costo.

> Si el server es un VPS con IP pública fija, andá directo al paso 3 (Let's Encrypt).
> Si corrés XAMPP en una PC de casa/oficina, la **Opción A (Cloudflare Tunnel)** es la
> más simple y segura: no abrís puertos ni exponés tu IP.

---

## 1) Configurar la app (`config.php`)

```php
define('PUBLIC_BASE_URL', 'https://tudominio.com'); // dominio real, SIN barra final
define('APP_DOMAIN',      'tudominio.com');
define('FORCE_HTTPS',     true);   // detrás de Cloudflare/túnel Apache ve http; esto fuerza https en las URLs cortas
define('DISPLAY_ERRORS',  false);  // producción: no mostrar errores
define('ACCESS_PASSWORD', 'PONÉ_UNA_CLAVE_FUERTE'); // o usá ACCESS_PASSWORD_HASH
```

Para una clave hasheada (más seguro):
```bash
C:\xampp\php\php.exe -r "echo password_hash('tu-clave-fuerte', PASSWORD_DEFAULT);"
```
Pegá el resultado en `ACCESS_PASSWORD_HASH`.

---

## 2) Servir la app en la RAÍZ del dominio (VirtualHost)

Así las URLs quedan limpias (`/r/xxxx` en vez de `/qr-studio-php/public/r/xxxx`).

Editá `C:\xampp\apache\conf\extra\httpd-vhosts.conf` y agregá:

```apache
<VirtualHost *:80>
    ServerName tudominio.com
    DocumentRoot "C:/xampp/htdocs/qr-studio-php/public"
    <Directory "C:/xampp/htdocs/qr-studio-php/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

Reiniciá Apache desde el panel de XAMPP. Ahora `http://tudominio.com/` sirve la app
y `/r/xxxx` funciona en la raíz.

---

## 3) DNS

Creá un registro **A** para `tudominio.com` → **IP pública** del server.

- ¿PC de casa sin IP fija? Usá **Cloudflare Tunnel** (Opción A) — no necesita IP fija ni DNS manual.
- ¿VPS con IP fija? A record directo a esa IP.

---

## 4) HTTPS — elegí UNA opción

### Opción A — Cloudflare Tunnel  ⭐ (recomendada para XAMPP en casa)

Ventajas: TLS automático, **no abrís puertos**, oculta tu IP, gratis.

1. Pasá tu dominio a **Cloudflare** (cambiás los nameservers en tu registrador). Gratis.
2. Descargá **cloudflared** (https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/).
3. En una terminal:
   ```bash
   cloudflared tunnel login
   cloudflared tunnel create qr-studio
   ```
4. Creá `C:\Users\TU_USUARIO\.cloudflared\config.yml`:
   ```yaml
   tunnel: <ID-DEL-TUNEL>
   credentials-file: C:\Users\TU_USUARIO\.cloudflared\<ID-DEL-TUNEL>.json
   ingress:
     - hostname: tudominio.com
       service: http://localhost:80
     - service: http_status:404
   ```
5. Ruteá el dominio e iniciá el túnel:
   ```bash
   cloudflared tunnel route dns qr-studio tudominio.com
   cloudflared tunnel run qr-studio
   ```
   (Para que quede permanente: `cloudflared service install`.)

Resultado: `https://tudominio.com` con TLS de Cloudflare. Dejá `FORCE_HTTPS = true`.

---

### Opción B — Cloudflare como proxy (nube naranja)

Requiere abrir puertos 80/443, pero suma CDN + protección DDoS.

1. Dominio en Cloudflare, registro A **proxied** (nube naranja) → tu IP pública.
2. En **SSL/TLS → Overview**, poné modo **Full**.
3. Instalá un **Origin Certificate** de Cloudflare en Apache (`httpd-ssl.conf`).
4. Abrí puertos **80** y **443** en el router (port forwarding) y en el firewall de Windows.

---

### Opción C — Let's Encrypt directo (win-acme)

Ideal para VPS o si tenés IP pública + puertos abiertos.

1. Asegurate de que `tudominio.com` resuelva a tu IP y que **80/443** estén abiertos.
2. Descargá **win-acme** (https://www.win-acme.com/) → ejecutá `wacs.exe`.
3. Elegí crear certificado, validación **http-01**, e indicá el `DocumentRoot` de `public`.
4. win-acme guarda los certificados y crea una **tarea programada** que los renueva solo (cada ~60 días).
5. Configurá `C:\xampp\apache\conf\extra\httpd-ssl.conf` con un VirtualHost `*:443`
   apuntando a los certificados generados y al mismo `DocumentRoot`:
   ```apache
   <VirtualHost *:443>
       ServerName tudominio.com
       DocumentRoot "C:/xampp/htdocs/qr-studio-php/public"
       SSLEngine on
       SSLCertificateFile    "ruta/al/fullchain.pem"
       SSLCertificateKeyFile "ruta/al/privkey.pem"
       <Directory "C:/xampp/htdocs/qr-studio-php/public">
           AllowOverride All
           Require all granted
       </Directory>
   </VirtualHost>
   ```
6. Reiniciá Apache.

---

## 5) Verificar

1. Entrá a `https://tudominio.com` → debe pedir login (candado verde/HTTPS ok).
2. Creá un QR dinámico → la URL corta debe ser `https://tudominio.com/r/xxxx`.
3. Escaneá el QR con el celular → tiene que redirigir al destino.
4. Cambiá el destino desde "Mis códigos" y volvé a escanear → redirige al nuevo (¡dinámico!).
5. (Opcional) Testeá el certificado en https://www.ssllabs.com/ssltest/.

---

## 6) Checklist de seguridad en producción

- [ ] `ACCESS_PASSWORD` fuerte (o `ACCESS_PASSWORD_HASH`).
- [ ] `DISPLAY_ERRORS = false`.
- [ ] `FORCE_HTTPS = true` y todo el tráfico por HTTPS.
- [ ] MySQL **solo en localhost** (nunca expuesto a internet); usuario dedicado, no `root`.
- [ ] Backups periódicos de la base `qr_studio`.
- [ ] `config.php` fuera del alcance web (ya lo protege el `.htaccess` raíz).
- [ ] (Opcional) Header HSTS en Apache:
      `Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"`
- [ ] Mantené XAMPP/PHP actualizados.

---

## Notas

- La app ya está lista para esto: el `PUBLIC_BASE_URL` se usa para armar las URLs cortas,
  y `FORCE_HTTPS` fuerza `https` aunque Apache reciba el tráfico por `http` (típico detrás
  de Cloudflare o un túnel).
- Ventaja de usar **tu dominio**: si algún día cambiás de hosting, repuntás el DNS y **los QR
  ya impresos siguen funcionando** — sin depender de ningún servicio externo.
