---
title: Referencia del panel
description: Sintaxis, opciones y alcances de todos los subcomandos plak panel.
sidebar:
  label: Comandos del panel
  order: 1
---

Todos los subcomandos `plak panel` operan sobre **tu cuenta conectada** (ver [Conexión](/cli/connect)). El token guardado jamás se envía a otro origen: `--panel`/`--dev` en estos comandos se rechazan; para cambiar de panel reconecta primero. `--json` nunca incluye secretos.

Alcances: lecturas con `user:read`; escrituras de servidores con `servers:write`; escrituras de sitios y WordPress con `sites:write` (opt-in en **Perfil > API Keys**). Las claves de pairing aprobado traen lectura + SSH; un `403` indica cómo otorgar el scope.

## Lectura

```bash
plak panel sites [--page N] [--per-page N] [--all] [--json]
plak panel site <id|dominio> [--json]
plak panel servers [--page N] [--per-page N] [--all] [--json]
plak panel server <id|nombre> [--json]
```

`--per-page` 1–100 (defecto 25); `--all` recorre todas las páginas. La selección acepta id numérico o dominio/nombre **exacto**. Un id ajeno resuelve a `404`: nada de otras cuentas es enumerable.

```bash
plak panel sites --all --json
plak panel site ejemplo.com
```

## Vinculación

```bash
plak panel link <sitio-panel> <sitio-local> [--system-user USUARIO] [--path RUTA] [--key CLAVE | --generate] [--alias NOMBRE] [--yes] [--json]
plak panel unlink <sitio-local> [--yes]
plak panel links [--json]
```

Autoriza una sola clave pública (`ssh:authorize`), verifica SSH y la raíz WordPress real (`StrictHostKeyChecking=accept-new`; una ruta incorrecta nunca se vincula), crea o reutiliza el remoto (defecto `panel-<dominio>`) y registra `.panel-link` (panel, cuenta e IDs; sin secretos). `unlink` solo borra el registro; la llave SSH se retira en el panel (Servidores > SSH keys) y vive independiente de la API key. Detalle del flujo en [Vincular y migrar](/cli/vincular).

## Proveedores, servidores y sitios

```bash
plak panel providers [--json]
plak panel create-server --name N --provider ID --region ID --plan ID [--database T] [--php V] [--os O] [--wait SECS] [--poll SECS] [--json]
plak panel delete-server <id|nombre> [--yes] [--json]
plak panel restart-server <id|nombre> [--yes] [--json]
plak panel create-site --domain D --server <id|nombre> [--wait SECS] [--poll SECS] [--json]
plak panel delete-site <id|dominio> [--yes] [--json]
```

La creación es asíncrona (`202 busy`): espera hasta `active`/`failed` o timeout (`--wait` defecto 600, `--poll` 15). Un fallo remoto nunca queda como éxito. Necesitan `servers:write` / `sites:write`.

## WordPress

Patrón: `plak panel <cmd> <sitio> [opciones] [--json]` (`<sitio>` = id o dominio exacto). Lecturas con `user:read`; mutaciones con `sites:write`. Ayuda por área: `plak panel wp-overview help`.

| Comando | Opciones |
| --- | --- |
| `wp-overview`, `wp-themes`, `wp-plugins` | `[--refresh]` |
| `wp-complete-install` | `--title T --user U --email E --password P` (los 4 requeridos) |
| `wp-mark-installed`, `wp-install-wpcli` | — |
| `wp-xmlrpc` | `--block` \| `--allow` |
| `wp-theme-activate`, `wp-plugin-activate`, `wp-plugin-deactivate` | `<slug>` (uno) |
| `wp-theme-update`, `wp-plugin-update` | `<slug...>` (uno o más) |
| `wp-theme-install`, `wp-plugin-install` | `<slug> [--activate]` |
| `wp-theme-delete`, `wp-plugin-delete` | `<slug...> [--yes]` |
| `wp-search-replace` | `--search S [--replace R] [--dry-run] [--yes]` (`--search` requerido; sin `--dry-run` confirma) |
| `wp-cli` | `-- <comando...>` (remoto vigilado; lo destructivo se deniega en servidor) |
| `wp-set-php` | `--version V [--wait S] [--poll S]` (espera hasta aplicado) |
| `wp-set-robots` | `--disable` \| `--enable` |

Los resultados parciales (`updated`/`failed`) siempre se muestran.

## Servidores

Patrón: `plak panel <cmd> <servidor> [opciones] [--json]` (`<servidor>` = id o nombre exacto). Lecturas con `user:read`; mutaciones con `servers:write`. Ayuda: `plak panel service-list help`.

| Comando | Opciones |
| --- | --- |
| `service-list` | — |
| `service-restart`, `service-reload` | `<servicio> [--yes]` (`mysql`, `nginx`, `supervisor`; reload suma `mariadb`, `postgresql`) |
| `wpcli-install` | `[--wait S] [--poll S]` (instala y espera) |
| `wpcli-uninstall` | `[--yes]` |
| `php-info` | — |
| `php-install` | `--version V [--yes]` |
| `php-cli-set` | `--version V` |
| `opcache-enable`, `opcache-disable`, `opcache-refresh` | `[--yes]` |
| `firewall-list` | — |
| `firewall-add` | `--name N --port P [--type tcp\|udp] [--rule allow\|deny] [--ip IP] [--yes]` |
| `firewall-del` | `<regla-id> [--yes]` |
| `users-list` | — |
| `users-add` | `--name N [--sudo]` (la contraseña se muestra **una sola vez**) |
| `users-del` | `<id\|ploi_id> [--yes]` (nunca `ploi`) |

Todo es síncrono en el servidor: un `200` solo vuelve cuando Ploi respondió.

## Infraestructura de sitios

Patrón: `plak panel <cmd> <sitio> [opciones] [--json]`. Lecturas con `user:read`; mutaciones con `sites:write`. Ayuda: `plak panel db-add help`. Los recursos locales se direccionan por id del panel; DNS y HTTP auth por su id remoto.

| Grupo | Lectura | Escritura |
| --- | --- | --- |
| Bases de datos | `db-list` | `db-add --name N --user U --password P` · `db-del <id> [--yes]` |
| Cronjobs | `cron-list` | `cron-add --command CMD [--frequency F]` · `cron-del <id> [--yes]` |
| Certificados | `cert-list` | `cert-add --type letsencrypt\|custom [--domain D] [--cert C] [--private P]` · `cert-del <id> [--yes]` |
| Redirecciones | `redirect-list` | `redirect-add --from /old --to /new [--type redirect\|permanent]` · `redirect-del <id> [--yes]` |
| Alias | `alias-list` | `alias-add --domain D [--cert]` · `alias-del <alias> [--yes]` (por alias, no id) |
| DNS (Cloudflare) | `dns-list` | `dns-add --type T --name N --content C [--ttl N]` · `dns-update <registro> --type T --name N --content C [--ttl N]` · `dns-del <registro> [--yes]` |
| HTTP auth | `authuser-list` | `authuser-add --name N --password P [--path /]` · `authuser-del <id> [--yes]` |
| Caché | `cache-info` | `cache-enable\|cache-disable\|cache-flush\|cache-opcache-refresh [--yes]` |
| Apps | `app-info` | `app-install --type wordpress\|nextcloud [--options JSON] [--wait S]` · `app-uninstall [--yes]` |

## Credencial, Access y revocación

- Vive en `${PLAK_HOME:-~/.plak}/connection.json` (directorio `700`, archivo `600`, escritura atómica): `panel_url`, token e identidad mínima. Nunca en logs, argv, historial ni `--json`.
- `plak connect status [--json]` revalida contra `GET /api/v1/user` (válido / inválido-revocado / bloqueada / panel inalcanzable).
- Tras Cloudflare Access (desarrollo): la sesión del navegador no se comparte; exporta `PLAK_CF_ACCESS_TOKEN` (token de servicio, distinto de la API key) y la CLI lo envía como `CF-Access-Token`. Las respuestas HTML/redirect de Access se detectan y no cuentan como conexión válida. La API nunca sigue redirecciones con el `Bearer`.
- `plak disconnect [--yes]` solo borra la credencial local; la clave sigue viva hasta revocarla en **Perfil > API Keys > Revoke**. Las autorizaciones SSH de `link` tienen su propio ciclo de vida.

En sitios vinculados, `push`/`pull` revalidan panel, cuenta, remoto y dominio antes de lo destructivo y se detienen con explicación ante cualquier desvío ([Vincular y migrar](/cli/vincular)).
