# Instalar el CMS de Total.js e iniciar sesión por primera vez

> Ejecuta el CMS con Node.js o Docker en el puerto 8000, inicia sesión con el login y la contraseña que genera en el primer arranque, conoce las tres formas de autenticar el admin y dónde viven los datos del sitio.

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

## Ejecutarlo

El CMS solo necesita Node.js: ni base de datos ni servicio externo.

```bash
git clone https://github.com/totaljs/cms.git
cd cms
npm install
npm run start
```

`npm run start` ejecuta `node index.js 8000`; el puerto es opcional y el valor por defecto es `8000`. Con Docker:

```bash
docker pull totalplatform/cms
docker run -p 8000:8000 totalplatform/cms
```

## El primer inicio de sesión

En el primer arranque el CMS crea a su único administrador con un **login y una contraseña aleatorios**. Abre `http://localhost:8000/admin/`: hasta el primer inicio de sesión correcto la página los muestra en un cuadro con un botón que rellena el formulario. Después se borra de las preferencias la copia en claro de la contraseña y el cuadro deja de aparecer, así que usa enseguida el perfil del admin para definir un login y una contraseña propios, y haz el primer inicio de sesión en cuanto arranques una instalación nueva.

Hasta que crees la primera página, la dirección `/` redirige a `/admin/` mientras la contraseña siga siendo la generada; cuando existe una página con la dirección `/`, `/` sirve tu sitio.

## Tres formas de autenticar el admin

El admin vive bajo la dirección de la línea `$api : /admin/` del archivo `config`. La función `AUTH` de `definitions/auth.js` decide para las peticiones de esa ruta:

| Modo | Cuándo | Cómo |
|---|---|---|
| Sesión | es el modo por defecto | una cookie cifrada con la `salt` de la cuenta; el login y la contraseña se comprueban con SHA-256 y esa sal |
| Token | existe la línea `token : <value>` en `config` | envíalo en la cabecera `x-token`: la petición se ejecuta como un usuario integrado llamado *Bot*, un administrador (`sa`). Diez intentos erróneos bloquean la dirección, y un token incorrecto no recibe respuesta alguna (la petición acaba en timeout) |
| OpenPlatform | los ajustes contienen `op_reqtoken` y `op_restoken` | las personas inician sesión con [OpenPlatform](/en/openplatform/how-an-app-connects/) y sus grupos deciden los permisos `pages`, `layouts`, `widgets`, `navigation`, `posts`, `files`, `redirects`, `variables`, `settings` y `admin` |

Las páginas públicas usan la función `FUNC.auth` si tu código la define (consulta [páginas, layouts y navegación](/en/cms/pages-layouts-and-navigation/)); sin ella todos los visitantes son anónimos.

## Dónde viven los datos

| Lugar | Qué contiene |
|---|---|
| `databases/config.json` | valores generados de la instalación |
| `databases/memorize_account.json` | el administrador: nombre, login, hash de la contraseña, nombre de la cookie y sal |
| `databases/fs-db/` | el almacén de archivos: los metadatos del sitio (páginas, layouts, widgets, navegación, redirecciones, variables, configuración) y el HTML de cada página y layout, los archivos subidos y los posts |

Para mover el sitio, copia la carpeta `databases/` o usa la copia de seguridad del admin ([la API del admin](/en/cms/the-admin-api/)).
