# Deploy en cPanel — Citalis Standalone

Guía para instalar **una** copia de Citalis (un negocio) en un dominio o subdominio usando
**cPanel → Setup Python App** (Passenger). SQLite incluido, sin servicios externos.

- App de ejemplo: `agenda.miclinica.cl`
- Estructura del repo: el proyecto Django vive en `turnilup/` (ahí están `manage.py` y
  `passenger_wsgi.py`).

---

## 0. Requisitos previos
- [ ] Dominio o subdominio creado en cPanel (ej. `agenda.miclinica.cl`) con su document root.
- [ ] Certificado SSL activo (AutoSSL / Let's Encrypt en cPanel).
- [ ] Una cuenta de correo para el envío de OTP/notificaciones (cPanel → Email Accounts).
- [ ] Python disponible en "Setup Python App" (3.10–3.12 recomendado).

## 1. Subir el proyecto
- [ ] Sube el contenido de `turnilup/` a una carpeta fuera del document root,
      ej. `/home/USUARIO/citalis_app/` (usando Git, el File Manager o SFTP).
- [ ] **No** subas: `env/`, `env312/`, `__pycache__/`, `*.sqlite3.bak-*`, `node_modules/`.
- [ ] Sí deben estar: `manage.py`, `passenger_wsgi.py`, `requirements.txt`, la carpeta
      `turnilup/` (settings/wsgi/urls), `static/`, `templates/`, y las apps
      (`accounts booking scheduler core`).

## 2. Crear la app en "Setup Python App"
cPanel → **Setup Python App** → **Create Application**:
- [ ] **Python version:** 3.10–3.12
- [ ] **Application root:** `citalis_app` (la carpeta del paso 1, donde está `manage.py`)
- [ ] **Application URL:** el dominio/subdominio (ej. `agenda.miclinica.cl`)
- [ ] **Application startup file:** `passenger_wsgi.py`
- [ ] **Application Entry point:** `application`
- [ ] Clic en **Create**. cPanel crea el virtualenv y muestra el comando `source` para
      activarlo desde la terminal.

## 3. Variables de entorno
En la misma pantalla de la app, sección **Environment variables**, agrega (según
`.env.production.example`):
- [ ] `DJANGO_SECRET_KEY` (clave única — generar, ver abajo)
- [ ] `DJANGO_DEBUG=False`
- [ ] `ALLOWED_HOSTS=agenda.miclinica.cl`
- [ ] `CSRF_TRUSTED_ORIGINS=https://agenda.miclinica.cl`
- [ ] `SITE_URL=https://agenda.miclinica.cl`
- [ ] `EMAIL_HOST`, `EMAIL_PORT`, `EMAIL_USE_TLS`, `EMAIL_HOST_USER`,
      `EMAIL_HOST_PASSWORD`, `DEFAULT_FROM_EMAIL`, `EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend`
- [ ] `OWNER_EMAIL`, `OWNER_PASSWORD`, `BUSINESS_NAME` (definir **antes** del primer migrate;
      crean el superusuario dueño + su negocio).

> Alternativa: copiar `.env.production.example` a `turnilup/.env` y completarlo
> (`python-dotenv` lo carga). Usa uno u otro método, no mezcles claves duplicadas.

## 4. Instalar dependencias y preparar la app (Terminal)
cPanel → **Terminal** (o SSH). Activa el venv con el comando `source .../bin/activate` que
te dio cPanel y luego, dentro del Application root:

```bash
pip install --upgrade pip
pip install -r requirements.txt

# Generar SECRET_KEY (pegar el resultado en la variable DJANGO_SECRET_KEY):
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"

# Base de datos + dueño por defecto (crea el superuser y el Business en el primer migrate):
python manage.py migrate

# Archivos estáticos → carpeta staticfiles/
python manage.py collectstatic --noinput
```

- [ ] `migrate` termina sin errores (aplica `accounts/0002_seed_owner`).
- [ ] `collectstatic` genera `staticfiles/`.

## 5. Servir estáticos y media (Apache)
Passenger no sirve archivos estáticos. En el **document root** del dominio crea enlaces y un
`.htaccess` para que Apache los entregue directo (ajusta la ruta del Application root):

```bash
# Desde el document root del dominio (ej. ~/agenda.miclinica.cl/):
ln -s /home/USUARIO/citalis_app/staticfiles static
ln -s /home/USUARIO/citalis_app/media media
```

Añade al `.htaccess` del document root, **antes** de las reglas de Passenger:

```apache
# Servir estáticos/media sin pasar por la app Python
RewriteEngine On
RewriteRule ^static/ - [L]
RewriteRule ^media/ - [L]
```

- [ ] `https://agenda.miclinica.cl/static/…` carga CSS/JS/imágenes.
- [ ] La carpeta `media/` tiene permisos de escritura para el usuario de cPanel (logos, fotos).

## 6. Reiniciar y verificar
- [ ] En "Setup Python App" pulsa **Restart** (o `touch tmp/restart.txt` en el Application root).
- [ ] `https://agenda.miclinica.cl/` → portada pública del negocio.
- [ ] `https://agenda.miclinica.cl/login/` → ingresar con `OWNER_EMAIL` (llega el código OTP por email) → `/dashboard/`.
- [ ] `/<slug-de-un-servicio>/` (ej. `/reunion`) → página de reserva funciona.
- [ ] `/admin/` accesible con el usuario dueño.
- [ ] Un correo de prueba (login OTP) se recibe correctamente.

## 7. Post-instalación (recomendado)
- [ ] **Cambiar la contraseña del dueño** desde `/admin/` o `/perfil/` (las por defecto son
      solo para el primer arranque).
- [ ] Completar la identidad del negocio en **Configuración → Mi Negocio** (nombre, logo,
      colores, contacto, redes, horarios, zona horaria).

---

## Bases de datos incluidas (SQLite)
El repo trae dos archivos SQLite en `turnilup/`:
- `turnilup.sqlite3` → **DEMO** (Estudio Jurídico Andes, con servicios y citas de ejemplo).
  Úsala solo para mostrar el producto.
- `turnilup.fresh.sqlite3` → **instalación limpia**: únicamente el superusuario dueño por
  defecto y un negocio vacío ("Mi Negocio"), listo para configurar.

Para un **cliente nuevo**, antes del paso 4, parte desde la BD limpia:
```bash
cp turnilup.fresh.sqlite3 turnilup.sqlite3
```
(Equivale a borrar la BD y correr `python manage.py migrate`, que recrea el dueño por defecto
vía `accounts/0002_seed_owner`.) Luego cambia la contraseña del dueño y configura el negocio.

## Notas
- **Base de datos:** SQLite (`turnilup/turnilup.sqlite3`). Respáldalo periódicamente
  (File Manager o `cp`). No requiere MySQL/PostgreSQL.
- **Actualizaciones:** subir cambios → `pip install -r requirements.txt` →
  `python manage.py migrate` → `python manage.py collectstatic --noinput` → **Restart**.
- Los archivos `nginx.conf.production.example`, `gunicorn.service.production.example` y
  `deploy.sh` son para un deploy alternativo en VPS y **no se usan** en cPanel.
