# Ajustes, posts, archivos y visitantes del CMS de Total.js y dónde se guarda todo

> Los ajustes del CMS de Total.js, el gestor de posts, cómo se sirven y redimensionan los archivos subidos, las estadísticas de visitantes y el panel, la integración con OpenPlatform y el modelo de datos del sitio.

Framework: cms
Product: CMS (cms@8071e48)
Language: es
Content-SHA256: ca3d69074413368667fdb738b364b0683d26ff1965734e47418167d0a6e2dc63
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

## Ajustes

El plugin *Settings* (`settings_read`, `settings_save`; permiso `settings`) edita la configuración que el CMS guarda dentro de los metadatos del sitio y carga en `CONF` en cada arranque:

| Clave | Significado |
|---|---|
| `name` | el nombre del sitio, usado en el `<title>` de todas las páginas salvo `/` y en el nombre del archivo de la copia de seguridad |
| `url` | la dirección pública del sitio; el CMS también la actualiza a partir del host de las peticiones del admin |
| `smtp` | los ajustes SMTP como texto JSON (`server`, `from`, `user`, `password`, `port`); `settings_test` los prueba |
| `icon` | un icono para el sitio |
| `$tms`, `secret_tms` | publica los eventos por TMS, y el secreto de esa conexión |
| `op_reqtoken`, `op_restoken` | los tokens de una aplicación de [OpenPlatform](/en/openplatform/how-an-app-connects/); cuando están los dos, el acceso al admin se sustituye por el de OpenPlatform |
| `totalapi` | una clave para los servicios de la API de Total.js |

Los plugins pueden añadir más claves, que aparecen en el mismo formulario. Los valores que viven en el archivo `config` (`$api`, `cdn`, `salt` y, si lo añades, `token`) no se editan aquí.

## Posts

El plugin *Posts* es un pequeño gestor de artículos, guardado en su propio archivo NoSQL dentro del almacén. Un post tiene `name`, `category`, `picture`, `summary`, `body`, `reference`, `icon`, `color`, `hidden` y `date`; el admin los lista del más nuevo al más antiguo (100 por página) y `posts_categories` devuelve las categorías en uso. Los posts son datos para tu propio código: el renderizador público del CMS (`controllers/default.js`) no los imprime, así que un widget o una ruta tuyos tienen que leerlos y dibujarlos.

## Archivos

El plugin *Files* guarda las subidas en el almacén de archivos y las marca como públicas. `GET /download/<id>.<ext>` sirve un archivo público (solo los públicos; el resto responde 404). Para imágenes, `?s=<percent>` devuelve un JPEG más pequeño (el valor debe estar entre 10 y 80, con calidad 80), y `?download=1` fuerza la descarga. Las rutas de subida y sus límites están en [la API del admin](/en/cms/the-admin-api/).

## Visitantes y el panel

El módulo `modules/visitors.js` cuenta las visitas de las páginas públicas mediante el script `/visitors.js` que incluye cada página: visitantes únicos, impresiones, navegadores, referentes, tráfico de búsqueda, social y directo, móvil y escritorio, horas del día y la gente conectada (un visitante está conectado durante 20 minutos sin actividad). El plugin *Dashboard* dibuja esas cifras con `dashboard_stats`, `dashboard_online`, `dashboard_browsers`, `dashboard_referers` y `dashboard_pages`.

## OpenPlatform

Cuando `op_reqtoken` y `op_restoken` están definidos, el CMS inicia sesión a través de [OpenPlatform](/en/openplatform/what-is-openplatform/) (módulo `modules/openplatform.js`) y cada plugin aporta su permiso a la lista que OpenPlatform muestra al asignar grupos: `pages`, `layouts`, `widgets`, `navigation`, `posts`, `files`, `redirects`, `variables`, `settings` y `admin`. Recuerda la regla de OpenPlatform: una aplicación solo es visible para los grupos que le asignas.

## El modelo de datos

`MAIN.db` guarda los metadatos del sitio (`pages`, `layouts`, `widgets`, `redirects`, `vars`, `nav`, `config` y `storage`) y se guarda como un único documento JSON llamado `meta` en el almacén de archivos. El HTML de cada página y layout es un archivo de ese almacén cuyo nombre es el id de la página o del layout. `FUNC.load()` lee los metadatos al arrancar, compila los widgets (ejecutando su función `install`) y reconstruye las cachés; `FUNC.save()` los vuelve a escribir. Por eso una copia de seguridad del almacén es una copia de seguridad del sitio.
