snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,262 @@
---
title: Docker Compose
icon: docker
---
<Warning>
Los contenedores de Docker son para alojamiento en producción o autoalojamiento. Para contribuir, consulta la [Configuración local](/l/es/developers/contribute/capabilities/local-setup).
</Warning>
## Resumen
Esta guía proporciona instrucciones paso a paso para instalar y configurar la aplicación Twenty utilizando Docker Compose. El objetivo es simplificar el proceso y prevenir errores comunes que podrían arruinar tu configuración.
**Importante:** Solo modifica configuraciones explícitamente mencionadas en esta guía. Alterar otras configuraciones puede causar problemas.
Consulta [Configurar variables de entorno](/l/es/developers/self-host/capabilities/setup) para configuraciones avanzadas. Todas las variables de entorno deben declararse en el archivo `docker-compose.yml` a nivel de servidor y/o trabajador, dependiendo de la variable.
## Requisitos del sistema
* RAM: Asegúrate de que tu entorno tenga al menos 2GB de RAM. La memoria insuficiente puede causar que los procesos se bloqueen.
* Docker & Docker Compose: Asegúrate de que ambos estén instalados y actualizados.
## Opción 1: Script de una línea
Instala la última versión estable de Twenty con un solo comando:
```bash
bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
```
Para instalar una versión o rama específica:
```bash
VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
```
* Reemplace x.y.z con el número de versión deseado.
* Reemplace branch-name con el nombre de la rama que desea instalar.
## Opción 2: Pasos manuales
Sigue estos pasos para una configuración manual.
### Paso 1: Configurar el archivo de entorno
1. **Crea el archivo .env**
Copia el archivo de entorno de ejemplo a tu directorio de trabajo a un nuevo archivo .env:
```bash
curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
```
2. **Generar una clave de cifrado**
Ejecuta el siguiente comando para generar una cadena única aleatoria:
```bash
openssl rand -base64 32
```
**Importante:** Mantén este valor en secreto / no lo compartas. Perder `ENCRYPTION_KEY` significa perder el acceso a todos los secretos almacenados en la base de datos (tokens OAuth, variables de la aplicación, secretos TOTP, etc.).
3. **Actualiza el `.env`**
Reemplaza el valor de marcador de posición en tu archivo .env con el token generado:
```ini
ENCRYPTION_KEY=random_string
```
Consulta la [guía de rotación de claves](/l/es/developers/self-host/capabilities/key-rotation) para obtener instrucciones sobre cómo rotarla sin tiempo de inactividad.
4. **Establecer la contraseña de Postgres**
Actualiza el valor de `PG_DATABASE_PASSWORD` en el archivo .env con una contraseña fuerte sin caracteres especiales.
```ini
PG_DATABASE_PASSWORD=my_strong_password
```
### Paso 2: Obtener el archivo Docker Compose
Descarga el archivo `docker-compose.yml` en tu directorio de trabajo:
```bash
curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
```
### Paso 3: Lanza la aplicación
Inicia los contenedores Docker:
```bash
docker compose up -d
```
### Paso 4: Acceder a la aplicación
Si alojas twentyCRM en tu propia computadora, abre tu navegador y navega a [http://localhost:3000](http://localhost:3000).
Si lo alojas en un servidor, verifica que el servidor esté en funcionamiento y que todo esté bien con
```bash
curl http://localhost:3000
```
## Configuración
### Exponer Twenty para acceso externo
Por defecto, Twenty se ejecuta en `localhost` en el puerto `3000`. La interfaz de usuario resuelve la API desde el propio origen del navegador, por lo que se carga desde cualquier nombre de host que llegue al contenedor, pero aun así establece `SERVER_URL` en tu URL pública: el servidor la usa para los enlaces generados (correos electrónicos, callbacks de OAuth) y para detectar HTTPS para las cookies seguras.
#### Entendiendo `SERVER_URL`
* **Protocolo:** Usa `http` o `https` dependiendo de tu configuración.
* Usa `http` si no has configurado SSL.
* Usa `https` si tienes SSL configurado.
* **Dominio/IP:** Este es el nombre de dominio o dirección IP donde tu aplicación es accesible.
* **Puerto:** Incluye el número de puerto si no estás usando los puertos predeterminados (`80` para `http`, `443` para `https`).
### Requisitos de SSL
SSL (HTTPS) es requerido para que ciertas características del navegador funcionen correctamente. Aunque estas características podrían funcionar durante el desarrollo local (ya que los navegadores tratan localhost de manera diferente), se requiere una configuración SSL adecuada al alojar Twenty en un dominio regular.
Por ejemplo, es posible que la API del portapapeles requiera un contexto seguro: algunas características como los botones de copia en toda la aplicación pueden no funcionar sin HTTPS habilitado.
Recomendamos encarecidamente configurar Twenty detrás de un proxy inverso con terminación SSL para una seguridad y funcionalidad óptimas.
#### Configurando `SERVER_URL`
1. **Determine su URL de acceso**
* **Sin proxy inverso (Acceso directo):**
Si estás accediendo a la aplicación directamente sin un proxy inverso:
```ini
SERVER_URL=http://your-domain-or-ip:3000
```
* **Con proxy inverso (Puertos estándar):**
Si estás usando un proxy inverso como Nginx o Traefik y tienes SSL configurado:
```ini
SERVER_URL=https://your-domain-or-ip
```
* **Con proxy inverso (Puertos personalizados):**
Si estás usando puertos no estándar:
```ini
SERVER_URL=https://your-domain-or-ip:custom-port
```
2. **Actualiza el archivo `.env`**
Abre tu archivo `.env` y actualiza el `SERVER_URL`:
```ini
SERVER_URL=http(s)://your-domain-or-ip:your-port
```
**Ejemplos:**
* Acceso directo sin SSL:
```ini
SERVER_URL=http://123.45.67.89:3000
```
* Acceso vía dominio con SSL:
```ini
SERVER_URL=https://mytwentyapp.com
```
3. **Reiniciar la aplicación**
Para que los cambios surtan efecto, reinicia los contenedores Docker:
```bash
docker compose down
docker compose up -d
```
#### Consideraciones
* **Configuración del Proxy Inverso:**
Asegúrese de que su proxy inverso envíe las solicitudes al puerto interno correcto (`3000` por defecto). Configure la terminación SSL y cualquier cabecera necesaria.
* **Configuración del Cortafuegos:**
Abra los puertos necesarios en su cortafuegos para permitir el acceso externo.
* **Consistencia:**
La `SERVER_URL` debe coincidir con cómo los usuarios acceden a su aplicación en sus navegadores.
#### Persistencia
* **Volúmenes de Datos:**
La configuración de Docker Compose utiliza volúmenes para persistir datos para la base de datos y el almacenamiento del servidor.
* **Entornos Sin Estado:**
Si se despliega en un entorno sin estado (por ejemplo, ciertos servicios en la nube), configure un almacenamiento externo para persistir los datos.
## Copia de seguridad y restauración
Las copias de seguridad periódicas protegen los datos de tu CRM contra la pérdida.
### Crea una copia de seguridad de la base de datos
```bash
docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
```
### Automatiza las copias de seguridad diarias
Añade a tu crontab (`crontab -e`):
```bash
0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
```
### Restaura desde una copia de seguridad
1. Detén la aplicación:
```bash
docker compose stop server worker
```
2. Restaura la base de datos:
```bash
docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
```
3. Reinicia los servicios:
```bash
docker compose up -d
```
### Mejores prácticas de copias de seguridad
* **Prueba las restauraciones con regularidad** — verifica que las copias de seguridad realmente funcionen
* **Almacena las copias de seguridad fuera del sitio** — usa almacenamiento en la nube (S3, GCS, etc.)
* **Cifra los datos sensibles** — protege las copias de seguridad con cifrado
* **Conserva múltiples copias** — mantén copias de seguridad diarias, semanales y mensuales
## Solución de Problemas
Si encuentras algún problema, consulta [Solución de Problemas](/l/es/developers/self-host/capabilities/troubleshooting) para ver soluciones.
## Alojamiento gestionado
<Tip>
¿Prefieres no ejecutar y mantener Twenty por tu cuenta? [Encuentra un partner de alojamiento certificado de Twenty](https://twenty.com/partners/list?categories=HOSTING\&ref=docs-docker-compose) para implementar, alojar y gestionar tu instancia de principio a fin. *(O contacta con nuestro equipo: [contact@twenty.com](mailto:contact@twenty.com).)*
</Tip>

View File

@@ -0,0 +1,60 @@
---
title: Rotación de claves
icon: rotate
---
Twenty tiene dos familias de claves independientes:
* **Claves de firma JWT** — pares de claves asimétricas ES256 (etiquetados con `kid`) almacenados en `core."signingKey"`, utilizados para firmar y verificar tokens de acceso/renovación.
* **Clave de cifrado en reposo** — `ENCRYPTION_KEY`, se usa para cifrar tokens OAuth, variables de la aplicación, claves privadas de las claves de firma, valores de configuración confidenciales y secretos TOTP dentro de un sobre `enc:v2:`.
`APP_SECRET` es un secreto heredado mantenido para compatibilidad retroactiva: cuando `ENCRYPTION_KEY` no está definido actúa como el cifrado en reposo / alternativa para la cookie de sesión, y todavía verifica los tokens de acceso HS256 preexistentes. Quedará obsoleto.
## Claves de firma JWT
Cada clave contiene una `publicKey` (conservada indefinidamente para poder verificar los tokens emitidos anteriormente), una `privateKey` cifrada (usada solo mientras la clave sea la actual), un indicador `isCurrent` (exactamente una fila a la vez) y un `revokedAt` opcional.
### Rotar la clave actual
Establece `SIGNING_KEY_ROTATION_DAYS` para habilitarlo: un cron diario emite una nueva clave actual cuando la existente es más antigua que ese umbral. Las claves anteriores *no* se revocan, por lo que los tokens firmados con ellas siguen verificándose. Deja la variable sin configurar para desactivar la rotación automática.
<Note>La rotación automática se incluye a partir de la versión v2.6+.</Note>
### Revocar una clave (solo en caso de filtración / emergencia)
**Settings → Admin Panel → Signing keys → Revoke** en una fila que no sea la actual. Borra el material privado cifrado, establece `revokedAt` y rechaza todos los tokens existentes firmados con ese `kid`.
## Rotar `ENCRYPTION_KEY`
<Note>El comando `secret-encryption:rotate` descrito a continuación se incluye a partir de la versión v2.6+.</Note>
Cada valor cifrado se encapsula como `enc:v2:\<keyId>:\<payload>`, donde `\<keyId>` es un prefijo hexadecimal de 8 caracteres derivado de la clave en bruto. La rotación es en línea y reanudable.
1. **Generar una nueva clave**: `openssl rand -base64 32`.
2. **Configurar ambas claves en paralelo** en `.env`, luego reinicie:
```ini
ENCRYPTION_KEY=NEW_VALUE
FALLBACK_ENCRYPTION_KEY=OLD_VALUE
```
Las nuevas escrituras usan la nueva clave, las filas existentes todavía se descifran mediante la clave de respaldo.
3. **Volver a cifrar las filas existentes**:
```bash
docker exec -it {server_container} yarn command:prod secret-encryption:rotate
```
El comando recorre seis sitios (`connected-account-tokens`, `application-variable`, `application-registration-variable`, `signing-key-private-keys`, `sensitive-config-storage`, `totp-secrets`). Un filtro SQL omite las filas que ya están en el nuevo `\<keyId>`, por lo que el comando es idempotente: interrúmpalo y vuelva a ejecutarlo según sea necesario. Finaliza con código distinto de cero si falla alguna fila; vuelva a ejecutar para reintentar.
| Opción | Descripción |
| ---------------------------------------- | ----------------------------------------------------------- |
| `-s, --site \<site>` | Limitar a un solo sitio. |
| `-b, --batch-size \<n>` | Filas por lote (predeterminado `200`, máximo `5000`). |
| `-d, --dry-run` | Descifrar + volver a cifrar en memoria, omitir el `UPDATE`. |
4. **Elimine la clave de respaldo** una vez que `--dry-run` muestre cero filas restantes: quite `FALLBACK_ENCRYPTION_KEY` y reinicie.
## Compatibilidad heredada con `APP_SECRET`
Las instancias más antiguas que nunca configuraron `ENCRYPTION_KEY` usan `APP_SECRET` como la clave de cifrado en reposo (y como el secreto de la cookie de sesión, derivado de esta). Esta ruta se conserva por compatibilidad retroactiva, pero está **en desuso**: configure una `ENCRYPTION_KEY` dedicada y siga el procedimiento de rotación anterior para migrar y dejar de usarla. El propio `APP_SECRET` sigue utilizándose para verificar tokens de acceso HS256 heredados.

View File

@@ -0,0 +1,415 @@
---
title: Configuración
icon: gear
---
# Gestión de Configuración
<Warning>
**¿Instalando por primera vez?** Siga la [guía de instalación de Docker Compose](/l/es/developers/self-host/capabilities/docker-compose) para ejecutar Twenty, luego regrese aquí para la configuración.
</Warning>
Twenty ofrece **dos modos de configuración** para adaptarse a diferentes necesidades de implementación:
**Acceso al panel de administración:** Solo los usuarios con privilegios de administrador (`canAccessFullAdminPanel: true`) pueden acceder a la interfaz de configuración.
## 1. Configuración del Panel de Administración (Predeterminado)
```bash
IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
```
**La mayoría de las configuraciones se realizan a través de la interfaz** después de la instalación:
1. Acceda a su instancia de Twenty (normalmente `http://localhost:3000`)
2. Vaya a **Configuración / Panel de Administración / Variables de Configuración**
3. Configure integraciones, correo electrónico, almacenamiento y más
4. Los cambios se aplican inmediatamente (dentro de 15 segundos para implementaciones multicontenedor)
<Warning>
**Implementaciones Multicontenedor:** Al usar la configuración de base de datos (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), tanto los contenedores del servidor como los de trabajo leen de la misma base de datos. Los cambios en el panel de administración afectan a ambos automáticamente, eliminando la necesidad de duplicar las variables de entorno entre contenedores (excepto para las variables de infraestructura).
</Warning>
**Qué se puede configurar a través del panel de administración:**
* **Autenticación** - OAuth de Google/Microsoft, configuración de contraseñas
* **Correo Electrónico** - Configuración de SMTP, plantillas, verificación
* **Almacenamiento** - Configuración S3, rutas de almacenamiento local
* **Integraciones** - Gmail, Google Calendar, servicios de Microsoft
* **Flujo de Trabajo y Limitación de Tasas** - Límites de ejecución, restricción de API
* **Y mucho más...**
![Variables de Configuración del Panel de Administración](/images/user-guide/setup/admin-panel-config-variables.png)
<Warning>
Cada variable está documentada con descripciones en su panel de administración en **Configuración → Panel de Administración → Variables de Configuración**.
Algunas configuraciones de infraestructura como las conexiones de base de datos (`PG_DATABASE_URL`), URLs del servidor (`SERVER_URL`), y secretos (`ENCRYPTION_KEY`, `FALLBACK_ENCRYPTION_KEY`) solo se pueden configurar a través del archivo `.env`.
[Referencia técnica completa →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
</Warning>
## Claves de cifrado
Twenty utiliza dos claves de cifrado definidas únicamente mediante variables de entorno:
| Variable | Propósito | Obligatorio |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `ENCRYPTION_KEY` | Clave principal utilizada para cifrar secretos en reposo (tokens OAuth, variables de la aplicación, claves privadas de firma, secretos TOTP, valores de configuración confidenciales). | Sí para nuevas instalaciones (las instalaciones heredadas pueden en su lugar depender de `APP_SECRET` — ver más abajo) |
| `FALLBACK_ENCRYPTION_KEY` | Clave solo para verificación. Se establece durante una rotación como la *anterior* `ENCRYPTION_KEY` para que las filas existentes sigan siendo descifrables. | Solo durante la rotación |
Para mantener la compatibilidad con versiones anteriores, si `ENCRYPTION_KEY` no está definida, Twenty recurre a `APP_SECRET` para el cifrado en reposo, lo que coincide con el comportamiento heredado de implementaciones más antiguas. Las nuevas instalaciones siempre deben establecer una `ENCRYPTION_KEY` dedicada.
Genera valores con `openssl rand -base64 32` y guárdalos en un lugar seguro (un gestor de secretos, configuración sellada, etc.). Perder la `ENCRYPTION_KEY` significa perder el acceso a todos los secretos almacenados en la base de datos.
Para rotar `ENCRYPTION_KEY` sin tiempo de inactividad, consulta la [Guía de rotación de claves](/l/es/developers/self-host/capabilities/key-rotation).
## 2. Configuración Solo de Entorno
```bash
IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
```
**Toda la configuración se gestiona a través de archivos `.env`:**
1. Establezca `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` en su archivo `.env`
2. Agregue todas las variables de configuración a su archivo `.env`
3. Reinicie los contenedores para que los cambios tengan efecto
4. El panel de administración mostrará los valores actuales pero no podrá modificarlos
## Modo de múltiples espacios de trabajo
De forma predeterminada, Twenty se ejecuta en **modo de un solo espacio de trabajo** — ideal para la mayoría de las implementaciones autoalojadas en las que necesitas una instancia de CRM para tu organización.
### Modo de un solo espacio de trabajo (predeterminado)
```bash
IS_MULTIWORKSPACE_ENABLED=false # default
```
* Un espacio de trabajo por instancia de Twenty
* El primer usuario se convierte automáticamente en administrador con privilegios completos (`canImpersonate` y `canAccessFullAdminPanel`)
* Los nuevos registros se deshabilitan después de crear el primer espacio de trabajo
* Estructura de URL simple: `https://your-domain.com`
### Habilitar el modo de múltiples espacios de trabajo
```bash
IS_MULTIWORKSPACE_ENABLED=true
DEFAULT_SUBDOMAIN=app # default value
```
Habilita el modo de múltiples espacios de trabajo para implementaciones tipo SaaS en las que varios equipos independientes necesitan sus propios espacios de trabajo en la misma instancia de Twenty.
**Diferencias clave respecto al modo de un solo espacio de trabajo:**
* Se pueden crear varios espacios de trabajo en la misma instancia
* Cada espacio de trabajo obtiene su propio subdominio (p. ej., `sales.your-domain.com`, `marketing.your-domain.com`)
* Los usuarios se registran e inician sesión en `{DEFAULT_SUBDOMAIN}.your-domain.com` (p. ej., `app.your-domain.com`)
* Sin privilegios de administrador automáticos — el primer usuario de cada espacio de trabajo es un usuario normal
* Configuraciones específicas del espacio de trabajo, como subdominio y dominio personalizado, están disponibles en la configuración del espacio de trabajo
<Warning>
**Configuración solo por entorno:** `IS_MULTIWORKSPACE_ENABLED` solo se puede configurar mediante el archivo `.env` y requiere un reinicio. No se puede cambiar a través del panel de administración.
</Warning>
### Configuración de DNS para múltiples espacios de trabajo
Al usar el modo de múltiples espacios de trabajo, configura tu DNS con un registro comodín para permitir la creación dinámica de subdominios:
```
*.your-domain.com -> your-server-ip
```
Esto habilita el enrutamiento automático de subdominios para nuevos espacios de trabajo sin configuración manual de DNS.
### Restricción de la creación de espacios de trabajo
En el modo de múltiples espacios de trabajo, es posible que quieras limitar quién puede crear nuevos espacios de trabajo:
```bash
IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
```
Cuando está habilitado, solo los usuarios con `canAccessFullAdminPanel` pueden crear espacios de trabajo adicionales. Los usuarios aún pueden crear su primer espacio de trabajo durante el registro inicial.
## Integración con Gmail y Google Calendar
### Crear Proyecto en Google Cloud
1. Vaya a [Google Cloud Console](https://console.cloud.google.com/)
2. Cree un nuevo proyecto o seleccione uno existente
3. Habilite estas APIs:
* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
### Configurar OAuth
1. Vaya a [Credenciales](https://console.cloud.google.com/apis/credentials)
2. Cree un ID de Cliente OAuth 2.0
3. Agregue estas URIs de redirección:
* `https://{your-domain}/auth/google/redirect` (para SSO)
* `https://{your-domain}/auth/google-apis/get-access-token` (para integraciones)
### Configurar en Twenty
1. Vaya a **Configuración → Panel de Administración → Variables de Configuración**
2. Encuentre la sección **Google Auth**
3. Establezca estas variables:
* `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
* `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
* `AUTH_GOOGLE_CLIENT_ID={client-id}`
* `AUTH_GOOGLE_CLIENT_SECRET={client-secret}`
* `AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirect`
* `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
<Warning>
**Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar.
</Warning>
**Ámbitos requeridos** (configurados automáticamente):
[Ver código fuente relevante](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
* `https://www.googleapis.com/auth/calendar.events`
* `https://www.googleapis.com/auth/gmail.readonly`
* `https://www.googleapis.com/auth/profile.emails.read`
### Si su aplicación está en modo de prueba
Si su aplicación está en modo de prueba, deberá agregar usuarios de prueba a su proyecto.
En [Pantalla de consentimiento OAuth](https://console.cloud.google.com/apis/credentials/consent), agregue sus usuarios de prueba en la sección "Usuarios de prueba".
## Integración con Microsoft 365
<Warning>
Los usuarios deben tener una [licencia de Microsoft 365](https://admin.microsoft.com/Adminportal/Home) para poder usar la API de Calendar y Messaging. No podrán sincronizar su cuenta en Twenty sin una.
</Warning>
### Cree un proyecto en Microsoft Azure
Necesitará crear un proyecto en [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) y obtener las credenciales.
### Habilitar APIs
En la Consola de Microsoft Azure habilite las siguientes APIs en "Permisos":
* Microsoft Graph: Mail.ReadWrite
* Microsoft Graph: Mail.Send
* Microsoft Graph: Calendars.Read
* Microsoft Graph: User.Read
* Microsoft Graph: openid
* Microsoft Graph: email
* Microsoft Graph: profile
* Microsoft Graph: offline_access
<Note>
"Mail.ReadWrite" y "Mail.Send" solo son obligatorios si desea enviar correos electrónicos usando nuestras acciones de flujo de trabajo. Puede usar "Mail.Read" en su lugar si solo desea recibir correos electrónicos.
</Note>
<Note>
"Calendars.ReadWrite" es obligatorio si desea crear eventos de calendario usando nuestras acciones de flujo de trabajo. Si solo desea sincronizar eventos de calendario, use "Calendars.Read".
</Note>
### URIs de redirección autorizadas
Necesita agregar las siguientes URIs de redirección a su proyecto:
* `https://{your-domain}/auth/microsoft/redirect` si quieres usar el inicio de sesión único de Microsoft
* `https://{your-domain}/auth/microsoft-apis/get-access-token`
### Configurar en Twenty
1. Vaya a **Configuración → Panel de Administración → Variables de Configuración**
2. Encuentre la sección **Microsoft Auth**
3. Establezca estas variables:
* `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
* `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
* `AUTH_MICROSOFT_ENABLED=true`
* `AUTH_MICROSOFT_CLIENT_ID={client-id}`
* `AUTH_MICROSOFT_CLIENT_SECRET={client-secret}`
* `AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirect`
* `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
<Warning>
**Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar.
</Warning>
### Configurar ámbitos
[Ver código fuente relevante](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
* 'openid'
* 'correo Electrónico'
* 'perfil'
* 'offline_access'
* 'Mail.ReadWrite'
* 'Mail.Send'
* 'Calendars.Read'
### Si su aplicación está en modo de prueba
Si su aplicación está en modo de prueba, deberá agregar usuarios de prueba a su proyecto.
Agregue sus usuarios de prueba a la sección "Usuarios y grupos".
## Trabajos en segundo plano para Calendarios y Mensajes
Después de configurar las integraciones de Gmail, Google Calendar, o Microsoft 365, necesita iniciar los trabajos en segundo plano que sincronizan los datos.
Registre los siguientes trabajos recurrentes en su contenedor de trabajo:
```bash
# from your worker container
yarn command:prod cron:messaging:messages-import
yarn command:prod cron:messaging:message-list-fetch
yarn command:prod cron:calendar:calendar-event-list-fetch
yarn command:prod cron:calendar:calendar-events-import
yarn command:prod cron:messaging:ongoing-stale
yarn command:prod cron:calendar:ongoing-stale
yarn command:prod cron:workflow:automated-cron-trigger
```
## Configuración de Correo Electrónico
1. Vaya a **Configuración → Panel de Administración → Variables de Configuración**
2. Encuentre la sección **Correo Electrónico**
3. Configure su configuración SMTP:
<Tabs>
<Tab title="Gmail">
Necesitará proporcionar una [Contraseña de Aplicación](https://support.google.com/accounts/answer/185833).
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=smtp.gmail.com
* EMAIL_SMTP_PORT=465
* EMAIL_SMTP_USER=gmail_email_address
* EMAIL_SMTP_PASSWORD='gmail_app_password'
</Tab>
<Tab title="Office365">
Tenga en cuenta que si tiene la autenticación de dos factores habilitada, necesitará proporcionar una [Contraseña de Aplicación](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=smtp.office365.com
* EMAIL_SMTP_PORT=587
* EMAIL_SMTP_USER=office365_email_address
* EMAIL_SMTP_PASSWORD='office365_password'
</Tab>
<Tab title="smtp4dev">
**smtp4dev** es un servidor de correo SMTP falso para desarrollo y pruebas.
* Ejecute la imagen de smtp4dev: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
* Acceda a la interfaz de smtp4dev aquí: [http://localhost:8090](http://localhost:8090)
* Establezca las siguientes variables:
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=localhost
* EMAIL_SMTP_PORT=2525
</Tab>
</Tabs>
<Warning>
**Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar.
</Warning>
## Almacenamiento de S3
<Warning>
De forma predeterminada, Twenty almacena los archivos cargados en el sistema de archivos local. Para implementaciones en producción, usa S3 o un servicio compatible con S3 (MinIO, DigitalOcean Spaces, etc.). para garantizar que los archivos persistan tras los reinicios de los contenedores y escalen en varias instancias de servidor.
</Warning>
Establece `STORAGE_TYPE=S_3` y configura las variables `STORAGE_S3_*` a través del panel de administración o `.env`. Consulta la [referencia de config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) para ver la lista completa de variables de S3.
Al usar S3 con funciones que dependen de CORS (p. ej., descargas de archivos en el navegador), asegúrate de que tu bucket permita el origen de tu frontend de Twenty en su configuración de CORS.
## Funciones de lógica e intérprete de código
Twenty admite funciones de lógica para flujos de trabajo y el intérprete de código para el análisis de datos con IA. Ambos ejecutan código proporcionado por el usuario y requieren una configuración explícita por motivos de seguridad.
### Valores Predeterminados de Seguridad
**En producción (NODE_ENV=production):** Tanto las funciones de lógica como el intérprete de código tienen como valor predeterminado **Desactivado**. Debes habilitarlos explícitamente con `LOGIC_FUNCTION_TYPE` y `CODE_INTERPRETER_TYPE` si necesitas estas funciones.
**En desarrollo (NODE_ENV=development):** Ambos usan **LOCAL** de forma predeterminada para mayor comodidad al ejecutarse localmente.
<Warning>
**Aviso de seguridad:** El controlador local (`LOGIC_FUNCTION_TYPE=LOCAL` o `CODE_INTERPRETER_TYPE=LOCAL`) ejecuta código directamente en el host en un proceso de Node.js sin aislamiento. Solo debe utilizarse para código de confianza en desarrollo. Para implementaciones de producción que manejen código no confiable, use `LOGIC_FUNCTION_TYPE=LAMBDA` o `CODE_INTERPRETER_TYPE=E2B` (con sandboxing), o manténgalos deshabilitados.
</Warning>
### Funciones de lógica - Controladores disponibles
| Controlador | Variable de entorno | Caso de uso | Nivel de seguridad |
| ----------- | ------------------------------ | ------------------------------------------------ | -------------------------------------- |
| Desactivado | `LOGIC_FUNCTION_TYPE=DISABLED` | Desactivar completamente las funciones de lógica | N/A |
| Local | `LOGIC_FUNCTION_TYPE=LOCAL` | Entornos de desarrollo y de confianza | Bajo (sin aislamiento) |
| Lambda | `LOGIC_FUNCTION_TYPE=LAMBDA` | Producción con código no confiable | Alto (aislamiento a nivel de hardware) |
### Funciones de lógica - Configuración recomendada
**Para desarrollo:**
```bash
LOGIC_FUNCTION_TYPE=LOCAL # default when NODE_ENV=development
```
**Para producción (AWS):**
```bash
LOGIC_FUNCTION_TYPE=LAMBDA
LOGIC_FUNCTION_LAMBDA_REGION=us-east-1
LOGIC_FUNCTION_LAMBDA_ROLE=arn:aws:iam::123456789:role/your-lambda-role
LOGIC_FUNCTION_LAMBDA_ACCESS_KEY_ID=your-access-key
LOGIC_FUNCTION_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Para desactivar las funciones de lógica:**
```bash
LOGIC_FUNCTION_TYPE=DISABLED # default when NODE_ENV=production
```
### Intérprete de código - Controladores disponibles
| Controlador | Variable de entorno | Caso de uso | Nivel de seguridad |
| ----------- | -------------------------------- | ----------------------------------------- | ---------------------- |
| Desactivado | `CODE_INTERPRETER_TYPE=DISABLED` | Deshabilitar la ejecución de código de IA | N/A |
| Local | `CODE_INTERPRETER_TYPE=LOCAL` | Solo para desarrollo | Bajo (sin aislamiento) |
| E2B | `CODE_INTERPRETER_TYPE=E_2_B` | Producción con ejecución en sandbox | Alta (sandbox aislado) |
<Note>
Al usar `LOGIC_FUNCTION_TYPE=DISABLED` o `CODE_INTERPRETER_TYPE=DISABLED`, cualquier intento de ejecución devolverá un error. Esto es útil si desea ejecutar Twenty sin estas capacidades.
</Note>
## API y front-end en hosts separados
Solo es relevante si no permites que el back-end sirva el front-end. Las implementaciones de mismo origen
no necesitan nada aquí.
Declara cada origen de navegador que se comunique con la API, separados por comas. `SERVER_URL`
y `FRONTEND_URL` ya son de confianza. El servidor registra una advertencia cuando un navegador
lo llama desde un origen no declarado.
```bash
AUTH_COOKIE_ALLOWED_ORIGINS=https://app.example.com
```
<Warning>
El front-end envía credenciales en cada solicitud, y los navegadores rechazan una
respuesta con credenciales desde un origen no declarado, por lo que la aplicación no se carga hasta
que configures esto.
</Warning>
Si los dos hosts están en dominios registrables diferentes (no solo en
subdominios distintos), también establece `AUTH_COOKIE_SAME_SITE=none`, lo cual requiere HTTPS.
Con varios espacios de trabajo habilitados, no listes aquí todos los subdominios de los espacios de trabajo.
En su lugar, enruta las rutas de la API (`/graphql`, `/metadata`, `/rest`, `/auth/`,
`/client-config`, `/file`) al back-end en cada nombre de host de cada espacio de trabajo, de modo que cada
espacio de trabajo permanezca en el mismo origen — así es como funciona Twenty Cloud.

View File

@@ -0,0 +1,254 @@
---
title: Solución de problemas
icon: wrench
---
## Solución de Problemas
Si encuentra algún problema al configurar el entorno para el desarrollo, al actualizar su instancia o al autoalojar, aquí hay algunas soluciones para problemas comunes.
### Autoalojamiento
#### La primera instalación resulta en `fallo de autenticación de contraseña para el usuario "postgres"`
🚨 **IMPORTANTE: Esta solución es SOLO para instalaciones nuevas** 🚨
Si tiene una instancia de Twenty existente con datos de producción, **NO** siga estos pasos ya que borrarán permanentemente su base de datos.
Al instalar Twenty por primera vez, es posible que desee cambiar la contraseña predeterminada de la base de datos.
La contraseña que establezca durante la primera instalación se almacena permanentemente en el volumen de base de datos. Si más tarde intenta cambiar esta contraseña en su configuración sin eliminar el volumen anterior, obtendrá errores de autenticación porque la base de datos todavía está usando la contraseña original.
⚠️ ADVERTENCIA: ¡Seguir los pasos borrará PERMANENTEMENTE todos los datos de la base de datos! ⚠️
Prosiga solo si se trata de una instalación nueva sin datos importantes.
Para actualizar el `PG_DATABASE_PASSWORD`, necesita:
```sh
# Update the PG_DATABASE_PASSWORD in .env
docker compose down --volumes
docker compose up -d
```
#### Rupturas de línea de CR encontradas [Windows]
Esto sucede debido a los caracteres de fin de línea de Windows combinados con la configuración de Git. Intente ejecutar:
```
git config --global core.autocrlf false
```
Luego elimine el repositorio y clónelo de nuevo.
#### Esquema de metadatos faltante
Durante la instalación de Twenty, debe aprovisionar su base de datos postgres con los esquemas, extensiones y usuarios correctos.
Si ha ejecutado con éxito este aprovisionamiento, debería tener esquemas `default` y `metadata` en su base de datos.
Si no lo hace, asegúrese de que no tiene más de una instancia de PostgreSQL ejecutándose en su computadora.
#### No se puede encontrar el módulo 'twenty-emails' o sus declaraciones de tipo correspondientes.
Tienes que construir el paquete `twenty-emails` (`npx nx run twenty-emails:build`) antes de ejecutar la inicialización de la base de datos.
#### Falta el paquete twenty-x
Asegúrese de ejecutar yarn en el directorio raíz y luego ejecute `npx nx server:dev twenty-server`. Si esto aún no funciona, intente construir el paquete faltante manualmente.
#### Lint on Save no funciona
Esto debería funcionar sin configuración adicional con la extensión de Oxc (`oxc.oxc-vscode`) instalada. Si esto no funciona, intenta añadir esto a tu configuración de código VS (ámbito dev container):
```
"editor.codeActionsOnSave": {
"source.fixAll.oxc": "explicit"
}
```
#### Mientras se ejecuta `npx nx start` o `npx nx start twenty-front`, se produce un error fuera de memoria
Ejecute solo los servicios que necesite, en lugar de `npx nx start`. Por ejemplo, si trabaja en el servidor, ejecute solo `npx nx worker twenty-server`
**Si no funciona:**
Si intentó ejecutar solo `npx nx run twenty-server:start` en WSL y falla con el siguiente error de memoria:
`ERROR FATAL: Las marcas compactas ineficaces cercanas al límite del montón Falló la asignación - JavaScript heap out of memory`
Una solución temporal es ejecutar el siguiente comando en tu terminal, o añadirlo a tu perfil `.bashrc` para que se aplique automáticamente:
`export NODE_OPTIONS="--max-old-space-size=8192"`
La bandera --max-old-space-size=8192 establece un límite superior de 8GB para el montón de Node.js; su uso escala con la demanda de la aplicación.
Referencia: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
**Si no funciona:**
Investiga qué procesos están ocupando la mayoría de la RAM de tu máquina. En veinte, notamos que algunas extensiones de VS Code estaban ocupando un montón de RAM, por lo que las desactivamos temporalmente.
**Si no funciona:**
Reiniciar tu máquina ayuda a limpiar los procesos fantasma.
#### Mientras ejecuta `npx nx start` hay [0] y [1] extraños en los registros
Es esperado, ya que el comando `npx nx start` está ejecutando más comandos detrás de escena.
#### No se envían correos electrónicos
La mayoría de las veces, se debe a que el `worker` no se está ejecutando en segundo plano. Intente ejecutar
```
npx nx worker twenty-server
```
#### No se puede conectar mi cuenta Microsoft 365 a Veinte
La mayoría de las veces, se debe a que su administrador no ha habilitado la licencia de Microsoft 365 para su cuenta. Verifique [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
Si tiene un código de error `AADSTS50020`, probablemente significa que está usando una cuenta de Microsoft personal. Esto aún no es compatible. Más información [aquí](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
#### Mientras se ejecuta `yarn`, las advertencias aparecen en la consola
Las advertencias informan sobre la carga de dependencias adicionales que no están explicitadas en `package.json`, así que mientras no aparezca un error crítico, todo debería funcionar como se espera.
#### Cuando un usuario accede a la página de inicio de sesión, aparece un error sobre un usuario no autorizado que intenta acceder a un área de trabajo en los registros
Se espera que el usuario no esté autorizado cuando se cierre la sesión, ya que su identidad no ha sido verificada.
#### ¿Cómo comprobar si su worker está funcionando?
* Vaya a [webhook-test.com](https://webhook-test.com/) y copie **Su URL de Webhook Única**.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-test.jpg" alt="Prueba de webhook" />
</div>
* Abra la aplicación Twenty, navegue a `/settings` y active el interruptor **Avanzado** en la parte inferior izquierda de la pantalla.
* Cree un nuevo webhook.
* Pegue **Su URL de Webhook Única** en el campo **Url de EndPoint** en Twenty. Establezca los **Filtros** en `Companies` y `Created`.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-settings.jpg" alt="Configuraciones del webhook" />
</div>
* Vaya a `/objects/companies` y cree un nuevo registro de empresa.
* Regrese a [webhook-test.com](https://webhook-test.com/) y verifique si se ha recibido una nueva **solicitud POST**.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-test-result.jpg" alt="Resultado de la prueba del webhook" />
</div>
* Si se recibe una **solicitud POST**, su worker está funcionando con éxito. De lo contrario, debe solucionar problemas de su worker.
#### Front-end falla al inicio y devuelve el error TS5042: No se puede mezclar la opción 'proyecto' con los archivos fuente en la línea de comandos
Comenta el plugin de checker en `packages/twenty-ui/vite-config.ts`, como se muestra en el siguiente ejemplo:
```
plugins: [
react({ jsxImportSource: 'react' }),
tsconfigPaths(),
svgr(),
dts(dtsConfig),
// checker(checkersConfig),
wyw({
include: [
'**/OverflowingTextWithTooltip.tsx',
'**/Chip.tsx',
'**/Tag.tsx',
'**/Avatar.tsx',
'**/AvatarChip.tsx',
],
babelOptions: {
presets: ['@babel/preset-typescript', '@babel/preset-react'],
},
}),
],
```
#### Panel de administración no accesible
Ejecute `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` en el contenedor de base de datos para acceder al panel de administración.
#### Al ejecutar un flujo de trabajo, la ejecución del flujo de trabajo falla con "La ejecución de la función lógica está deshabilitada. Configura LOGIC_FUNCTION_TYPE en LOCAL o LAMBDA para habilitarlas."
En producción, las funciones lógicas están deshabilitadas de forma predeterminada. Configura la variable de entorno `LOGIC_FUNCTION_TYPE` en `LOCAL` o `LAMBDA` para habilitarlas. Esto se puede configurar mediante variables de entorno o a través de las variables de base de datos del panel de administración. Consulta la [guía de configuración de funciones lógicas](/l/es/developers/self-host/capabilities/setup#logic-functions-available-drivers) para obtener más detalles.
#### Cuando escribo un mensaje en un chat de IA, no responde inmediatamente y debo actualizar la página para ver la respuesta
Esto significa que a su proxy inverso le falta la configuración para las respuestas de API basadas en stream. A continuación hay un ejemplo de configuración de Nginx:
```
location ~* ^/api/.*stream|\/graphql\/stream {
proxy_pass http://twenty_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_request_buffering off;
proxy_cache off;
gzip off;
#chunked_transfer_encoding off;
add_header X-Accel-Buffering no always;
}
```
### Componer Docker con 1 clic
#### No se puede iniciar sesión
Si no puedes iniciar sesión después de la configuración:
1. Ejecución de los siguientes comandos:
```bash
docker exec -it twenty-server-1 yarn
docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
```
2. Reinicie los contenedores de Docker:
```bash
docker compose down
docker compose up -d
```
Ten en cuenta que el comando `database:reset` borrará completamente tu base de datos y la recreará desde cero.
#### Problemas de conexión detrás de un Proxy Reverso
Si está ejecutando Twenty detrás de un proxy inverso y experimenta problemas de conexión:
1. **Verifique SERVER_URL:**
Asegúrese de que `SERVER_URL` en su archivo `.env` coincida con su URL de acceso externa, incluyendo `https` si SSL está habilitado.
2. **Verifique la configuración del Proxy Reverso:**
* Confirme que su proxy reverso está reenviando correctamente las solicitudes al servidor de Twenty.
* Asegúrese de que los encabezados como `X-Forwarded-For` y `X-Forwarded-Proto` estén configurados correctamente.
3. **Reinicie los Servicios:**
Después de hacer cambios, reinicie tanto el proxy inverso como los contenedores de Twenty.
#### Error al cargar una imagen - permiso denegado
Cambiar la propiedad de la carpeta de datos en el host de raíz a otro usuario y grupo resuelve este problema.
#### Error "File Not Found" al probar la función Logic en el flujo de trabajo
Ejecute el comando `yarn command:prod application:rebuild-default-deps` en su contenedor twenty-server para solucionar el problema de dependencias faltantes.
## Obtención de Ayuda
Si enfrenta problemas no cubiertos en esta guía:
* Verifique los Registros:
Vea los registros del contenedor por mensajes de error:
```bash
docker compose logs
```
* Soporte Comunitario:
Póngase en contacto con la [comunidad de Twenty](https://github.com/twentyhq/twenty/issues) o [los canales de soporte](https://discord.gg/cx5n4Jzs57) para obtener asistencia.

View File

@@ -0,0 +1,106 @@
---
title: Guía de actualización
icon: arrow-up-right-dots
---
## Guías generales
**Haga siempre una copia de seguridad de su base de datos antes de iniciar el proceso de actualización** ejecutando:
```bash
docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql
```
Para restaurar desde la copia de seguridad:
```bash
cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}
```
Si usa Docker Compose, siga estos pasos:
1. Detenga Twenty: `docker compose down`
2. Cambie el valor de `TAG` en el archivo `.env` junto a su `docker-compose.yml`
3. Inicie Twenty: `docker compose up -d`
El servidor ejecuta automáticamente todas las migraciones de actualización necesarias al iniciarse. No se requiere ningún comando manual.
## Actualización a v2.34+ — PostgreSQL 15 como mínimo
Twenty v2.34 requiere PostgreSQL 15 o una versión posterior. La configuración oficial de Docker Compose utiliza PostgreSQL 16. Si tu instancia se conecta a una base de datos administrada externamente, actualízala antes de iniciar el servidor v2.34.
## Actualizaciones entre versiones (v1.23+)
A partir de la **v1.23**, Twenty admite actualizaciones entre versiones. Puede actualizar directamente desde cualquier versión compatible a la última versión sin tener que pasar por cada versión intermedia.
Por ejemplo, actualizar de la v1.23 directamente a la v2.0 está totalmente admitido.
## Actualización a v2.5+ — envoltura de cifrado de datos en reposo
A partir de la **v2.5**, Twenty almacena los secretos en reposo (tokens OAuth, variables de aplicación, claves privadas de firma, valores de configuración sensibles, secretos TOTP) dentro de una envoltura versionada `enc:v2:` cifrada con `ENCRYPTION_KEY` (o `APP_SECRET` si `ENCRYPTION_KEY` no está definido).
El primer arranque en la v2.5 ejecuta comandos de actualización lentos que **rellenan** las filas existentes en la nueva envoltura. Son idempotentes: si se interrumpe y se reinicia el servidor, se reanuda desde donde se quedó, pero pueden tardar un tiempo en bases de datos grandes. Puedes supervisar el progreso con `upgrade:status`.
Debes establecer una `ENCRYPTION_KEY` dedicada **antes** de la actualización a v2.5 para que el proceso de relleno escriba las filas bajo esa clave desde el principio. Cambiar de clave después del relleno requiere una [rotación](/l/es/developers/self-host/capabilities/key-rotation).
## Rotación de secretos y claves de firma
Para las tareas operativas del día a día, como rotar `ENCRYPTION_KEY`, rotar la clave de firma JWT o revocar una clave de firma filtrada, consulta la [Guía de rotación de claves](/l/es/developers/self-host/capabilities/key-rotation).
## Comprobación del estado de la actualización
El comando `upgrade:status` le permite inspeccionar el estado actual de su instancia y de las migraciones de los espacios de trabajo. Es útil para depurar problemas de actualización o al enviar una solicitud de soporte.
Ejecútelo desde el contenedor del servidor:
```bash
docker exec -it {server_container_name_or_id} yarn command:prod upgrade:status
```
Salida de ejemplo:
```sh
APP_VERSION: v1.23.0
Instance
Inferred version: 1.23.0
Latest command: 1.23.0_DropWorkspaceVersionColumnFastInstanceCommand_1785000000000
Status: Up to date
Executed by: v1.23.0
At: 2026-04-16T11:43:58.823Z
Workspace
Apple (20202020-1c25-4d02-bf25-6aeccf7ea419)
Inferred version: 1.23.0
Latest command: 1.23.0_UpdateGlobalObjectContextCommandMenuItemsCommand_1780000005000
Status: Up to date
Executed by: v1.23.0
At: 2026-04-16T11:44:09.361Z
Summary
Instance: Up to date
Workspaces: 1 up to date, 0 behind, 0 failed (1 total)
```
### Opciones
| Opción | Descripción |
| ------------------------- | -------------------------------------------------------------------------------------------------------- |
| `-w, --workspace-id <id>` | Filtra por un espacio de trabajo específico. Puede pasarse varias veces. |
| `-f, --failed-only` | Oculta los espacios de trabajo actualizados, y solo muestra los que están desactualizados o han fallado. |
## Solución de Problemas
Si la actualización falla en algunos espacios de trabajo, el servidor no avanzará más allá del paso con errores. Al reiniciar el servidor (`docker compose up -d`), se reintentará la actualización desde donde se detuvo.
Para identificar rápidamente los problemas, ejecute:
```bash
docker exec -it {server_container_name_or_id} yarn command:prod upgrade:status --failed-only
```
Esto muestra únicamente los espacios de trabajo que están desactualizados o han fallado, junto con el mensaje de error de cada fallo.
## Antes de la v1.23
Si su instancia es anterior a la v1.23, debe actualizar de forma incremental a través de cada versión principal etiquetada (de la v1.6 a la v1.7, luego de la v1.7 a la v1.8, y así sucesivamente) hasta llegar a la v1.23. A partir de ahí, puede actualizar directamente a la última versión.

View File

@@ -0,0 +1,26 @@
---
title: Autoalojamiento
description: Despliega y administra Twenty en tu propia infraestructura.
---
<Frame>
<img src="/images/user-guide/what-is-twenty/20.png" alt="IA" />
</Frame>
## Resumen
Puedes autoalojar Twenty en tu propia infraestructura, lo que te brinda control total sobre tus datos y el despliegue.
## ¿Por qué autoalojar?
* **Propiedad de los datos**: Mantén todos los datos de CRM en tus propios servidores
* **Cumplimiento**: Cumple los requisitos normativos de residencia de datos
* **Personalización**: Acceso completo para modificar y ampliar la plataforma
## Primeros pasos
<CardGroup cols={2}>
<Card title="Docker Compose" icon="docker" href="/l/es/developers/self-host/capabilities/docker-compose">
Configuración rápida con Docker
</Card>
</CardGroup>