# Mi Rutina Gym — Instalación en cPanel

Dominio: **https://gym.ddm1078.com.mx**  ·  Usuario de cPanel: **ddmcommx**

## Contenido del zip

| Archivo / carpeta | Qué es |
|---|---|
| `gym.sql` | Base de datos (tablas + los 2 administradores + su rutina inicial). |
| `gym/` | Todo lo que va en la carpeta del subdominio. |
| `gym/includes/config.php` | **El único archivo que tienes que editar** (datos de la base). |
| `gym/cron/push_worker.php` | Script del cron que manda las notificaciones de descanso. |

## Usuarios iniciales (administradores)

| Nombre | Correo | Contraseña |
|---|---|---|
| Jean Bonilla | jean.bonilla@dart.biz | Dart1234 |
| César González | cesar.gonzalez2@dart.biz | Dart1234 |

Las contraseñas **se guardan cifradas** (hash bcrypt con `password_hash` de PHP); en la base nunca
queda la contraseña en texto. Recomendado: después del primer ingreso, cambiarlas en
**Usuarios → ícono de llave**.

---

## 1. Subdominio y SSL

1. cPanel → **Dominios** → crea `gym.ddm1078.com.mx` (si aún no existe).
   Fíjate en la **raíz del documento** que te asigna; normalmente es
   `/home/ddmcommx/gym.ddm1078.com.mx`.
2. cPanel → **SSL/TLS Status** → ejecuta **AutoSSL** para que el subdominio tenga `https`.
   Sin https no funcionan las notificaciones.

## 2. Base de datos

1. cPanel → **MySQL® Databases**:
   - Crea la base `gym` → queda como `ddmcommx_gym`.
   - Crea el usuario `gymuser` → queda como `ddmcommx_gymuser` (genera una contraseña fuerte y guárdala).
   - En **Add User To Database** une el usuario con la base y marca **ALL PRIVILEGES**.
2. cPanel → **phpMyAdmin** → selecciona `ddmcommx_gym` → pestaña **Importar** → sube `gym.sql` → **Importar**.

## 3. Subir los archivos

1. cPanel → **Administrador de archivos** → entra a la raíz del subdominio
   (`/home/ddmcommx/gym.ddm1078.com.mx`).
2. Sube el **contenido** de la carpeta `gym/` (no la carpeta en sí). Activa
   *Configuración → Mostrar archivos ocultos* para ver el `.htaccess`.
3. Los archivos que ya estaban (`php.ini`, `.user.ini`, `.well-known`) **déjalos como están**.
   El `.htaccess` nuevo **sí reemplaza al anterior**: ya incluye el bloque que cPanel había
   generado (el del `error_log`), así que no se pierde nada.

Debe quedar así:

```
gym.ddm1078.com.mx/
├── .htaccess  .user.ini  php.ini  .well-known/
├── index.php  login.php  registro.php  logout.php  app.php  admin.php  api.php
├── sw.js  manifest.webmanifest
├── assets/    (app.css, app.js, íconos)
├── includes/  (config.php, db.php, auth.php, webpush.php, head.php)
└── cron/      (push_worker.php)
```

## 4. Configurar `includes/config.php`

Edita solo estas líneas con los datos del paso 2:

```php
define('DB_NAME', 'ddmcommx_gym');
define('DB_USER', 'ddmcommx_gymuser');
define('DB_PASS', 'LA_CONTRASEÑA_DEL_USUARIO_MYSQL');
```

Otras opciones del mismo archivo:

- `REGISTRO_ABIERTO` → `false` (por defecto): solo los administradores dan de alta usuarios.
  Ponlo en `true` si quieres que cualquiera pueda crear su cuenta desde el login.
- `DESCANSO_SEG` → segundos de descanso entre series (60).

## 5. Versión de PHP

cPanel → **MultiPHP Manager** → el subdominio en **PHP 8.1 o mayor**.
Necesita las extensiones `pdo_mysql`, `openssl`, `curl` y `mbstring` (vienen activas en casi todos
los hostings; se revisan en **Select PHP Version → Extensions**).

## 6. Cron de notificaciones (aviso de "Descanso terminado")

cPanel → **Cron Jobs** → *Add New Cron Job*:

- Configuración común: **Once Per Minute** (`* * * * *`)
- Comando:

```
/usr/local/bin/php /home/ddmcommx/gym.ddm1078.com.mx/cron/push_worker.php >/dev/null 2>&1
```

(Si tu raíz del subdominio es otra, cambia la ruta. Si `/usr/local/bin/php` no existe en tu
servidor, usa `php`.)

**Cómo funciona:** cPanel solo permite un cron por minuto, así que el script se queda 58 segundos
revisando la cola **cada segundo** y luego entra el siguiente. El aviso llega con 1–2 s de diferencia.
Las claves de notificación (VAPID) se generan solas la primera vez y se guardan en la tabla `ajustes`.

> Si tu plan de hosting corta procesos largos y ves que los avisos llegan tarde, avísame y lo ajusto
> a ciclos más cortos.

## 7. Probar

1. Abre https://gym.ddm1078.com.mx y entra con uno de los administradores.
2. Toca **Activar** en el aviso "Activa los avisos de descanso" y acepta el permiso.
3. Marca una serie, bloquea el teléfono y espera el minuto: debe llegar la notificación.

### Teléfonos

- **Android (Chrome):** funciona en el navegador. Recomendado: menú ⋮ → *Agregar a pantalla de inicio*.
- **iPhone (iOS 16.4 o mayor):** las notificaciones **solo** funcionan si la abres desde el ícono:
  Safari → Compartir → *Agregar a pantalla de inicio* → abre la app desde ese ícono → Activar.

---

## Cómo funciona

- **Sesión:** con "Mantener sesión iniciada" queda abierta (cookie segura de 1 año que se renueva cada
  vez que entras) hasta que toques **Cerrar sesión**.
- **Checklist:** las series se marcan en orden (S1 → S2 → …); solo se puede desmarcar la última.
  Cada serie marcada inicia 1 minuto de descanso (+30 s o Saltar).
- **Cronómetro por actividad:** uno a la vez; se detiene solo al marcar la última serie.
- **Guardar en historial:** guarda la sesión (tiempos y pesos) y deja el checklist limpio.
  Los días, ejercicios y el último peso **siempre se conservan**.
- **Progreso:** solo ejercicios con "Lleva peso", agrupados por el nombre del ejercicio.
- **Usuarios (solo administradores):** agregar, editar (nombre, correo, tipo de cuenta), cambiar
  contraseña al momento (sin correo) y eliminar con confirmación. Al cambiarle la contraseña a otro
  usuario se cierran sus sesiones guardadas. No puedes eliminarte ni quitarte el rol de
  administrador a ti mismo, y siempre queda al menos un administrador.

## Seguridad incluida

- Contraseñas con hash bcrypt; tokens de sesión guardados como hash SHA-256.
- Consultas preparadas (PDO) contra inyección SQL.
- Token CSRF en todos los formularios y acciones.
- Cookies `HttpOnly`, `Secure`, `SameSite=Lax`; HTTPS forzado.
- `includes/`, `cron/`, `.sql` y `.md` bloqueados desde el navegador.

## Problemas comunes

| Síntoma | Revisión |
|---|---|
| "No se pudo cargar tu rutina" | Datos de `config.php` o falta importar `gym.sql`. Revisa `/home/ddmcommx/logs/php.error.log`. |
| Error 500 en todo | Versión de PHP menor a 8.1 o falta `pdo_mysql`. |
| No llega la notificación | Cron no creado o ruta incorrecta; el sitio no está en https; en iPhone no se abrió desde el ícono; permiso de notificaciones bloqueado. |
| La notificación llega tarde | Ahorro de batería del teléfono, o el hosting corta el script del cron. |
