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
263 lines
8.9 KiB
Plaintext
263 lines
8.9 KiB
Plaintext
---
|
|
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>
|