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
9.0 KiB
Plaintext
263 lines
9.0 KiB
Plaintext
---
|
|
title: Docker Compose
|
|
icon: docker
|
|
---
|
|
|
|
<Warning>
|
|
Containerele Docker sunt destinate găzduirii în producție sau auto-găzduirii. Pentru a contribui, consultați [Configurarea locală](/l/ro/developers/contribute/capabilities/local-setup).
|
|
</Warning>
|
|
|
|
## Prezentare generală
|
|
|
|
Acest ghid oferă instrucțiuni pas cu pas pentru a instala și configura aplicația Twenty folosind Docker Compose. Scopul este de a face procesul direct și de a preveni capcanele comune care ar putea deteriora configurarea dvs.
|
|
|
|
**Important:** Modificați numai setările menționate explicit în acest ghid. Modificarea altor configurații poate duce la probleme.
|
|
|
|
Consultați [Setup Environment Variables](/l/ro/developers/self-host/capabilities/setup) pentru configurare avansată. Toate variabilele de mediu trebuie declarate în fișierul `docker-compose.yml` la nivel de server și/sau de lucru, în funcție de variabilă.
|
|
|
|
## Cerințe de Sistem
|
|
|
|
* RAM: Asigurați-vă că mediul dvs. are cel puțin 2 GB de RAM. Memoria insuficientă poate provoca prăbușirea proceselor.
|
|
* Docker & Docker Compose: Asigurați-vă că ambele sunt instalate și la zi.
|
|
|
|
## Opțiunea 1: Script într-o singură linie
|
|
|
|
Instalați cea mai recentă versiune stabilă a Twenty cu o singură comandă:
|
|
|
|
```bash
|
|
bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
|
|
```
|
|
|
|
Pentru a instala o versiune sau ramură specifică:
|
|
|
|
```bash
|
|
VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
|
|
```
|
|
|
|
* Înlocuiți x.y.z cu numărul versiunii dorite.
|
|
* Înlocuiți branch-name cu numele ramurii pe care doriți să o instalați.
|
|
|
|
## Opțiunea 2: Pași manuali
|
|
|
|
Urmați acești pași pentru o configurare manuală.
|
|
|
|
### Pasul 1: Configurați Fișierul de Mediu
|
|
|
|
1. **Creați Fișierul .env**
|
|
|
|
Copiați exemplul de fișier de mediu într-un fișier .env nou în directorul de lucru:
|
|
|
|
```bash
|
|
curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
|
|
```
|
|
|
|
2. **Generează o cheie de criptare**
|
|
|
|
Rulați următoarea comandă pentru a genera un șir unic aleatoriu:
|
|
|
|
```bash
|
|
openssl rand -base64 32
|
|
```
|
|
|
|
**Important:** Păstrați această valoare secretă / nu o împărtășiți. Pierderea `ENCRYPTION_KEY` înseamnă pierderea accesului la toate secretele stocate în baza de date (tokenuri OAuth, variabile de aplicație, secrete TOTP etc.).
|
|
|
|
3. **Actualizați `.env`**
|
|
|
|
Înlocuiți valoarea substituentului în fișierul dvs. .env cu tokenul generat:
|
|
|
|
```ini
|
|
ENCRYPTION_KEY=random_string
|
|
```
|
|
|
|
Vezi [ghidul pentru rotația cheii](/l/ro/developers/self-host/capabilities/key-rotation) pentru instrucțiuni despre cum să o rotești fără întreruperi.
|
|
|
|
4. **Setați Parola pentru Postgres**
|
|
|
|
Actualizați valoarea `PG_DATABASE_PASSWORD` în fișierul .env cu o parolă puternică fără caractere speciale.
|
|
|
|
```ini
|
|
PG_DATABASE_PASSWORD=my_strong_password
|
|
```
|
|
|
|
### Pasul 2: Obțineți Fișierul Docker Compose
|
|
|
|
Descărcați fișierul `docker-compose.yml` în directorul de lucru:
|
|
|
|
```bash
|
|
curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
|
|
```
|
|
|
|
### Pasul 3: Lansați Aplicația
|
|
|
|
Porniți containerele Docker:
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
### Pasul 4: Accesați Aplicația
|
|
|
|
Dacă găzduiți twentyCRM pe propriul computer, deschideți browserul și navigați la [http://localhost:3000](http://localhost:3000).
|
|
|
|
Dacă îl găzduiți pe un server, verificați că serverul rulează și că totul este în regulă cu
|
|
|
|
```bash
|
|
curl http://localhost:3000
|
|
```
|
|
|
|
## Configurație
|
|
|
|
### Expuneți Twenty pentru Acces Extern
|
|
|
|
Implicit, Twenty rulează pe `localhost` la portul `3000`. Interfața de utilizator accesează API-ul folosind originea proprie a browserului, astfel încât se poate încărca de pe orice nume de gazdă care ajunge la container — totuși setează `SERVER_URL` la URL-ul tău public: serverul îl folosește pentru linkuri generate (e-mailuri, callback-uri OAuth) și pentru a detecta utilizarea HTTPS, necesară pentru cookie-uri securizate.
|
|
|
|
#### Înțelegerea `SERVER_URL`
|
|
|
|
* **Protocol:** Utilizați `http` sau `https`, în funcție de configurarea dvs.
|
|
* Utilizați `http` dacă nu ați configurat SSL.
|
|
* Utilizați `https` dacă aveți SSL configurat.
|
|
* **Domeniu/IP:** Acesta este numele domeniului sau adresa IP unde aplicația dvs. este accesibilă.
|
|
* **Port:** Includeți numărul portului dacă nu utilizați porturile implicite (`80` pentru `http`, `443` pentru `https`).
|
|
|
|
### Cerințe SSL
|
|
|
|
SSL (HTTPS) este necesar pentru funcționarea corespunzătoare a anumitor funcții ale browserului. Deși aceste funcții pot funcționa în timpul dezvoltării locale (deoarece browserele tratează localhost diferit), o configurare SSL corespunzătoare este necesară când găzduiți Twenty pe un domeniu obișnuit.
|
|
|
|
De exemplu, API-ul pentru clipboard ar putea necesita un context securizat - unele funcții precum butoanele de copiere din aplicație ar putea să nu funcționeze fără HTTPS activat.
|
|
|
|
Recomandăm cu tărie configurarea Twenty din spatele unui proxy revers cu terminare SSL pentru securitate și funcționalitate optimă.
|
|
|
|
#### Configurarea `SERVER_URL`
|
|
|
|
1. **Stabiliți Adresa dvs. de Acces**
|
|
* **Fără Proxy Revers (Acces Direct):**
|
|
|
|
Dacă accesați aplicația direct, fără un proxy revers:
|
|
|
|
```ini
|
|
SERVER_URL=http://your-domain-or-ip:3000
|
|
```
|
|
|
|
* **Cu Proxy Revers (Porturi Standard):**
|
|
|
|
Dacă utilizați un proxy revers precum Nginx sau Traefik și aveți configurat SSL:
|
|
|
|
```ini
|
|
SERVER_URL=https://your-domain-or-ip
|
|
```
|
|
|
|
* **Cu Proxy Revers (Porturi Custom):**
|
|
|
|
Dacă utilizați porturi non-standard:
|
|
|
|
```ini
|
|
SERVER_URL=https://your-domain-or-ip:custom-port
|
|
```
|
|
|
|
2. **Actualizați Fișierul `.env`**
|
|
|
|
Deschideți fișierul dvs. `.env` și actualizați `SERVER_URL`:
|
|
|
|
```ini
|
|
SERVER_URL=http(s)://your-domain-or-ip:your-port
|
|
```
|
|
|
|
**Exemple:**
|
|
|
|
* Acces direct fără SSL:
|
|
```ini
|
|
SERVER_URL=http://123.45.67.89:3000
|
|
```
|
|
* Acces prin domeniu cu SSL:
|
|
```ini
|
|
SERVER_URL=https://mytwentyapp.com
|
|
```
|
|
|
|
3. **Reporniți Aplicația**
|
|
|
|
Pentru ca modificările să intre în vigoare, reporniți containerele Docker:
|
|
|
|
```bash
|
|
docker compose down
|
|
docker compose up -d
|
|
```
|
|
|
|
#### Considerații
|
|
|
|
* **Configurarea Proxy-ului Invers:**
|
|
|
|
Asigurați-vă că proxy-ul invers transmite cererile către portul intern corect (`3000` în mod implicit). Configurați finalizarea SSL și toate headerele necesare.
|
|
|
|
* **Setările Firewall-ului:**
|
|
|
|
Deschideți porturile necesare în firewall-ul dvs. pentru a permite accesul extern.
|
|
|
|
* **Consistență:**
|
|
|
|
`SERVER_URL` trebuie să corespundă modului în care utilizatorii accesează aplicația dvs. în browserele lor.
|
|
|
|
#### Persistență
|
|
|
|
* **Volume de Date:**
|
|
|
|
Configurația Docker Compose folosește volume pentru a persista datele pentru baza de date și stocarea serverului.
|
|
|
|
* **Mediile Fără Stare:**
|
|
|
|
Dacă se utilizează un mediu fără stare (de ex., anumite servicii de cloud), configurați stocarea externă pentru a persista datele.
|
|
|
|
## Copiere de rezervă și restaurare
|
|
|
|
Copiile de rezervă regulate vă protejează datele CRM împotriva pierderii.
|
|
|
|
### Creați o copie de rezervă a bazei de date
|
|
|
|
```bash
|
|
docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
|
|
```
|
|
|
|
### Automatizați copiile de rezervă zilnice
|
|
|
|
Adăugați în crontab-ul dvs. (`crontab -e`):
|
|
|
|
```bash
|
|
0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
|
|
```
|
|
|
|
### Restaurare din copie de rezervă
|
|
|
|
1. Opriți aplicația:
|
|
|
|
```bash
|
|
docker compose stop server worker
|
|
```
|
|
|
|
2. Restaurați baza de date:
|
|
|
|
```bash
|
|
docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
|
|
```
|
|
|
|
3. Reporniți serviciile:
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
### Cele mai bune practici pentru copiile de rezervă
|
|
|
|
* **Testați restaurările în mod regulat** — verificați că copiile de rezervă chiar funcționează
|
|
* **Stocați copiile de rezervă în afara sediului** — utilizați stocarea în cloud (S3, GCS, etc.)
|
|
* **Criptați datele sensibile** — protejați copiile de rezervă cu criptare
|
|
* **Păstrați mai multe copii** — mențineți copii de rezervă zilnice, săptămânale și lunare
|
|
|
|
## Depanare
|
|
|
|
Dacă întâmpinați vreo problemă, verificați [Depanare](/l/ro/developers/self-host/capabilities/troubleshooting) pentru soluții.
|
|
|
|
## Găzduire gestionată
|
|
|
|
<Tip>
|
|
Preferiți să nu rulați și să nu întrețineți Twenty chiar dumneavoastră? [Găsiți un partener Twenty certificat pentru găzduire](https://twenty.com/partners/list?categories=HOSTING\&ref=docs-docker-compose) care să vă implementeze, găzduiască și gestioneze instanța de la un capăt la altul. *(Sau contactați echipa noastră: [contact@twenty.com](mailto:contact@twenty.com).)*
|
|
</Tip>
|