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>
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>

View File

@@ -0,0 +1,60 @@
---
title: Rotirea cheilor
icon: rotate
---
Twenty are două familii de chei independente:
* **Chei de semnare JWT** — perechi de chei asimetrice ES256 (etichetate cu `kid`) stocate în `core."signingKey"`, folosite pentru a semna și verifica tokenurile de acces / reîmprospătare.
* **Cheia de criptare pentru date în repaus** — `ENCRYPTION_KEY`, folosită pentru a cripta token-urile OAuth, variabilele aplicației, cheile private de semnare, valorile de configurare sensibile și secretele TOTP în interiorul unui înveliș `enc:v2:`.
`APP_SECRET` este un secret vechi păstrat pentru compatibilitate retroactivă: când `ENCRYPTION_KEY` nu este setată, acționează ca mecanism de rezervă pentru criptarea datelor în repaus / cookie-urile de sesiune și încă verifică token-urile de acces HS256 existente anterior. Va fi marcat ca învechit.
## Chei de semnare JWT
Fiecare cheie are un `publicKey` (păstrat pe termen nelimitat pentru a putea verifica token-urile emise anterior), un `privateKey` criptat (folosit doar cât timp cheia este curentă), un indicator `isCurrent` (exact un rând la un moment dat) și un câmp opțional `revokedAt`.
### Rotește cheia curentă
Setați `SIGNING_KEY_ROTATION_DAYS` pentru a activa rotația automată: un job cron zilnic va emite o nouă cheie curentă odată ce cea existentă este mai veche decât acest prag. Cheile anterioare *nu* sunt revocate, astfel încât token-urile semnate cu ele continuă să fie verificate. Lăsați variabila nesetată pentru a dezactiva rotația automată.
<Note>Rotația automată este disponibilă începând cu versiunea v2.6+.</Note>
### Revocă o cheie (numai în caz de scurgere / urgență)
**Settings → Admin Panel → Signing keys → Revoke** pe un rând care nu este curent. Șterge materialul privat criptat, setează `revokedAt` și respinge fiecare token existent semnat sub acel `kid`.
## Rotește `ENCRYPTION_KEY`
<Note>Comanda `secret-encryption:rotate` descrisă mai jos este disponibilă în v2.6+.</Note>
Fiecare valoare criptată este încapsulată ca `enc:v2:\<keyId>:\<payload>`, unde `\<keyId>` este un prefix hexazecimal de 8 caractere derivat din cheia brută. Rotirea are loc online și poate fi reluată.
1. **Generează o cheie nouă**: `openssl rand -base64 32`.
2. **Configurează ambele chei în paralel** în `.env`, apoi repornește:
```ini
ENCRYPTION_KEY=NEW_VALUE
FALLBACK_ENCRYPTION_KEY=OLD_VALUE
```
Noile scrieri folosesc noua cheie, rândurile existente încă sunt decriptate prin mecanismul de rezervă.
3. **Re-criptează rândurile existente**:
```bash
docker exec -it {server_container} yarn command:prod secret-encryption:rotate
```
Comanda parcurge șase locații (`connected-account-tokens`, `application-variable`, `application-registration-variable`, `signing-key-private-keys`, `sensitive-config-storage`, `totp-secrets`). Un filtru SQL omite rândurile care sunt deja pe noul `\<keyId>`, astfel încât comanda este idempotentă: întrerupe și rulează din nou după nevoie. Iese cu un cod de eroare nenul dacă vreun rând eșuează — rulează din nou pentru a reîncerca.
| Opțiune | Descriere |
| ---------------------------------------- | ------------------------------------------------------ |
| `-s, --site \<site>` | Limitează la o singură locație. |
| `-b, --batch-size \<n>` | Rânduri per lot (implicit `200`, maxim `5000`). |
| `-d, --dry-run` | Decriptează + re-criptează în memorie, omite `UPDATE`. |
4. **Elimină mecanismul de rezervă** odată ce `--dry-run` arată zero rânduri rămase: elimină `FALLBACK_ENCRYPTION_KEY` și repornește.
## Compatibilitate veche pentru `APP_SECRET`
Instanțele mai vechi care nu au setat niciodată `ENCRYPTION_KEY` folosesc `APP_SECRET` ca cheie de criptare pentru date în repaus (și ca secret pentru cookie-urile de sesiune, derivat din aceasta). Acest mecanism este păstrat pentru compatibilitate retroactivă, dar este **învechit** — setează o `ENCRYPTION_KEY` dedicată și urmează procedura de rotire de mai sus pentru a migra de la el. `APP_SECRET` în sine rămâne în uz pentru a verifica token-urile de acces HS256 vechi.

View File

@@ -0,0 +1,414 @@
---
title: Configurare
icon: gear
---
# Gestionarea configurației
<Warning>
**Prima instalare?** Urmați [ghidul de instalare Docker Compose](/l/ro/developers/self-host/capabilities/docker-compose) pentru a rula Twenty, apoi reveniți aici pentru configurare.
</Warning>
Twenty oferă **două moduri de configurare** pentru a se potrivi nevoilor diferite de implementare:
**Acces la panoul de administrare:** Doar utilizatorii cu privilegii de administrator (`canAccessFullAdminPanel: true`) pot accesa interfața de configurare.
## 1. Configurare Panou Admin (Implicită)
```bash
IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
```
**Majoritatea configurărilor se fac prin UI** după instalare:
1. Accesați instanța dumneavoastră Twenty (de obicei `http://localhost:3000`)
2. Mergeți la **Setări / Panou Admin / Variabile de Configurare**
3. Configurați integrările, e-mailul, stocarea și multe altele
4. Schimbările intră în vigoare imediat (în termen de 15 secunde pentru implementări cu mai multe containere)
<Warning>
**Implementări Multi-Container:** Când utilizați configurarea bazei de date (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), atât serverul cât și containerele worker citesc din aceeași bază de date. Modificările din panoul de administrare afectează ambele automat, eliminând necesitatea duplicării variabilelor de mediu între containere (cu excepția variabilelor de infrastructură).
</Warning>
**Ce puteți configura prin panoul de administrare:**
* **Autentificare** - OAuth Google/Microsoft, setări parole
* **E-mail** - setări SMTP, șabloane, verificare
* **Stocare** - configurație S3, căi stocare locală
* **Integrări** - Gmail, Google Calendar, servicii Microsoft
* **Flux de lucru și limitarea ratei** - limite de execuție, limitarea ratei pentru API
* **Și multe altele...**
![Variabile de Configurare Panou Admin](/images/user-guide/setup/admin-panel-config-variables.png)
<Warning>
Fiecare variabilă este documentată cu descrieri în panoul dvs. de administrare la **Setări → Panou Admin → Variabile de Configurare**.
Unele setări de infrastructură, cum ar fi conexiunile la baze de date (`PG_DATABASE_URL`), URL-urile serverului (`SERVER_URL`) și secretele (`ENCRYPTION_KEY`, `FALLBACK_ENCRYPTION_KEY`) pot fi configurate doar prin fișierul `.env`.
[Referință tehnică completă →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
</Warning>
## Chei de criptare
Twenty folosește două chei de criptare disponibile doar prin variabile de mediu:
| Variabilă | Scop | Obligatoriu |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| `ENCRYPTION_KEY` | Cheia principală folosită pentru a cripta secretele în repaus (token-uri OAuth, variabile de aplicație, chei private de semnare, secrete TOTP, valori de configurare sensibile). | Da, pentru instalările noi (instalările vechi se pot baza în schimb pe `APP_SECRET` — vezi mai jos) |
| `FALLBACK_ENCRYPTION_KEY` | Cheie folosită doar pentru verificare. Setată în timpul unei rotații la *precedenta* `ENCRYPTION_KEY` astfel încât rândurile existente să rămână decriptabile. | Doar în timpul rotației |
Pentru compatibilitate cu versiunile anterioare, dacă `ENCRYPTION_KEY` nu este setată, Twenty revine la `APP_SECRET` pentru criptarea în repaus — respectând comportamentul moștenit pentru implementările mai vechi. Instalările noi ar trebui să seteze întotdeauna o `ENCRYPTION_KEY` dedicată.
Generează valori cu `openssl rand -base64 32` și stochează-le într-un loc sigur (un manager de secrete, configurație sigilată etc.). Pierderea `ENCRYPTION_KEY` înseamnă pierderea accesului la fiecare secret stocat în baza de date.
Pentru a roti `ENCRYPTION_KEY` fără timp de nefuncționare, vezi [Ghidul de rotație a cheilor](/l/ro/developers/self-host/capabilities/key-rotation).
## 2. Configurare Doar Mediu
```bash
IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
```
**Toate configurațiile gestionate prin fișiere `.env`:**
1. Setați `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` în fișierul dvs. `.env`
2. Adăugați toate variabilele de configurare în fișierul dvs. `.env`
3. Reporniți containerele pentru ca schimbările să aibă efect
4. Panoul de administrare va afișa valorile curente, dar nu le poate modifica
## Mod cu mai multe spații de lucru
În mod implicit, Twenty rulează în **modul cu un singur spațiu de lucru** — ideal pentru majoritatea implementărilor auto-găzduite în care aveți nevoie de o singură instanță CRM pentru organizația dvs.
### Modul cu un singur spațiu de lucru (implicit)
```bash
IS_MULTIWORKSPACE_ENABLED=false # default
```
* Un spațiu de lucru pentru fiecare instanță Twenty
* Primul utilizator devine automat administrator cu privilegii complete (`canImpersonate` și `canAccessFullAdminPanel`)
* Înregistrările noi sunt dezactivate după crearea primului spațiu de lucru
* Structură URL simplă: `https://your-domain.com`
### Activarea modului cu mai multe spații de lucru
```bash
IS_MULTIWORKSPACE_ENABLED=true
DEFAULT_SUBDOMAIN=app # default value
```
Activați modul cu mai multe spații de lucru pentru implementări de tip SaaS, în care mai multe echipe independente au nevoie de propriile spații de lucru pe aceeași instanță Twenty.
**Diferențe cheie față de modul cu un singur spațiu de lucru:**
* Pe aceeași instanță pot fi create mai multe spații de lucru
* Fiecare spațiu de lucru primește propriul subdomeniu (de ex., `sales.your-domain.com`, `marketing.your-domain.com`)
* Utilizatorii se înregistrează și se autentifică la `{DEFAULT_SUBDOMAIN}.your-domain.com` (de ex., `app.your-domain.com`)
* Fără privilegii administrative automate — primul utilizator din fiecare spațiu de lucru este un utilizator obișnuit
* Setări specifice spațiului de lucru, precum subdomeniu și domeniu personalizat, devin disponibile în setările spațiului de lucru
<Warning>
**Setare exclusiv de mediu:** `IS_MULTIWORKSPACE_ENABLED` poate fi configurată doar prin fișierul `.env` și necesită o repornire. Nu poate fi modificată prin panoul de administrare.
</Warning>
### Configurarea DNS pentru modul cu mai multe spații de lucru
Când folosiți modul cu mai multe spații de lucru, configurați DNS-ul cu o înregistrare wildcard pentru a permite crearea dinamică de subdomenii:
```
*.your-domain.com -> your-server-ip
```
Acest lucru permite rutarea automată a subdomeniilor pentru spațiile de lucru noi, fără configurare DNS manuală.
### Restricționarea creării de spații de lucru
În modul cu mai multe spații de lucru, este posibil să doriți să limitați cine poate crea spații de lucru noi:
```bash
IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
```
Când este activată, doar utilizatorii cu `canAccessFullAdminPanel` pot crea spații de lucru suplimentare. Utilizatorii își pot crea în continuare primul spațiu de lucru în timpul înregistrării inițiale.
## Integrare Gmail & Google Calendar
### Creați Proiect Google Cloud
1. Mergeți la [Google Cloud Console](https://console.cloud.google.com/)
2. Creați un proiect nou sau selectați unul existent
3. Activați aceste API-uri:
* [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)
### Configurați OAuth
1. Mergeți la [Credentials](https://console.cloud.google.com/apis/credentials)
2. Creați Client ID OAuth 2.0
3. Adăugați aceste URI-uri de redirecționare:
* `https://{your-domain}/auth/google/redirect` (pentru SSO)
* `https://{your-domain}/auth/google-apis/get-access-token` (pentru integrări)
### Configurați în Twenty
1. Mergeți la **Setări → Panou Admin → Variabile de Configurare**
2. Găsiți secțiunea **Autentificare Google**
3. Setați aceste variabile:
* `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>
**Mod doar pentru mediu:** Dacă setați `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, adăugați aceste variabile în fișierul dvs. `.env` în schimb.
</Warning>
**Domenii necesare** (configurate automat):
[Consultați codul sursă relevant](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`
### Dacă aplicația dvs. este în modul de test
Dacă aplicația dvs. este în modul de test, va trebui să adăugați utilizatori de test în proiectul dvs.
În [ecranul de consimțământ OAuth](https://console.cloud.google.com/apis/credentials/consent), adăugați utilizatorii dvs. de test în secțiunea "Utilizatori de test".
## Integrare Microsoft 365
<Warning>
Utilizatorii trebuie să aibă un [Licență Microsoft 365](https://admin.microsoft.com/Adminportal/Home) pentru a putea utiliza API-ul Calendar și Mesagerie. Nu vor putea sincroniza contul lor pe Twenty fără una.
</Warning>
### Creați un proiect în Microsoft Azure
Va trebui să creați un proiect în [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) și să obțineți acreditările.
### Activați API-urile
În Microsoft Azure Console activați următoarele API-uri în "Permisiuni":
* Graph Microsoft: Mail.ReadWrite
* Graph Microsoft: Mail.Send
* Graph Microsoft: Calendars.Read
* Graph Microsoft: User.Read
* Graph Microsoft: openid
* Graph Microsoft: email
* Graph Microsoft: profile
* Graph Microsoft: offline_access
<Note>
"Mail.ReadWrite" și "Mail.Send" sunt obligatorii doar dacă doriți să trimiteți e-mailuri utilizând acțiunile noastre de flux de lucru. Puteți utiliza "Mail.Read" dacă doriți doar să primiți e-mailuri.
</Note>
<Note>
"Calendars.ReadWrite" este obligatoriu dacă doriți să creați evenimente de calendar utilizând acțiunile noastre de flux de lucru. Dacă doriți doar să sincronizați evenimente de calendar, utilizați "Calendars.Read".
</Note>
### URIs de redirecționare autorizate
Trebuie să adăugați următoarele URI-uri de redirecționare în proiectul dvs.:
* `https://{your-domain}/auth/microsoft/redirect` dacă doriți să utilizați SSO Microsoft
* `https://{your-domain}/auth/microsoft-apis/get-access-token`
### Configurați în Twenty
1. Mergeți la **Setări → Panou Admin → Variabile de Configurare**
2. Găsiți secțiunea **Autentificare Microsoft**
3. Setați aceste variabile:
* `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>
**Mod doar pentru mediu:** Dacă setați `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, adăugați aceste variabile în fișierul dvs. `.env` în schimb.
</Warning>
### Configurați scopurile
[Consultați codul sursă relevant](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'
* 'email'
* 'profil'
* 'offline_access'
* 'Mail.ReadWrite'
* 'Mail.Send'
* 'Calendars.Read'
### Dacă aplicația dvs. este în modul de test
Dacă aplicația dvs. este în modul de test, va trebui să adăugați utilizatori de test în proiectul dvs.
Adăugați utilizatorii de test în secțiunea "Utilizatori și grupuri".
## Procese în fundal pentru Calendar și Mesagerie
După configurarea integrărilor Gmail, Google Calendar, sau Microsoft 365, trebuie să porniți joburile de fundal care sincronizează datele.
Înregistrați următoarele joburi recurente în containerul dvs. worker:
```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
```
## Configurare Email
1. Mergeți la **Setări → Panou Admin → Variabile de Configurare**
2. Găsiți secțiunea **Email**
3. Configurați setările dvs. SMTP:
<Tabs>
<Tab title="Gmail">
Va trebui să provisionați o [Parolă de Aplicație](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">
**smtp4dev** este un server SMTP fals pentru dezvoltare și testare.
* 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** este un server SMTP fals pentru dezvoltare și testare.
* Rulați imaginea smtp4dev: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
* Accesați interfața smtp4dev aici: [http://localhost:8090](http://localhost:8090)
* Setați următoarele variabile:
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=localhost
* EMAIL_SMTP_PORT=2525
</Tab>
</Tabs>
<Warning>
**Mod doar pentru mediu:** Dacă setați `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, adăugați aceste variabile în fișierul dvs. `.env` în schimb.
</Warning>
## Stocare S3
<Warning>
În mod implicit, Twenty stochează fișierele încărcate în sistemul de fișiere local. Pentru implementări în producție, utilizați S3 sau un serviciu compatibil cu S3 (MinIO, DigitalOcean Spaces etc.). pentru a vă asigura că fișierele persistă între repornirile containerelor și se scalează pe mai multe instanțe de server.
</Warning>
Setați `STORAGE_TYPE=S_3` și configurați variabilele `STORAGE_S3_*` prin panoul de administrare sau `.env`. Consultați [referința config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) pentru lista completă a variabilelor S3.
Când utilizați S3 cu funcționalități dependente de CORS (de ex., descărcări de fișiere în browser), asigurați-vă că bucketul permite originea frontend-ului Twenty în configurația sa CORS.
## Funcții logice și interpretor de cod
Twenty acceptă funcții logice pentru fluxuri de lucru și interpretorul de cod pentru analiza datelor cu AI. Ambele rulează cod furnizat de utilizator și necesită o configurare explicită din motive de securitate.
### Valori implicite de securitate
**În producție (NODE_ENV=production):** Atât funcțiile logice, cât și interpretorul de cod au implicit valoarea **Dezactivat**. Trebuie să le activezi explicit cu `LOGIC_FUNCTION_TYPE` și `CODE_INTERPRETER_TYPE` dacă ai nevoie de aceste funcționalități.
**În dezvoltare (NODE_ENV=development):** Ambele au implicit valoarea **LOCAL** pentru comoditate când rulezi local.
<Warning>
**Atenționare de securitate:** Driverul local (`LOGIC_FUNCTION_TYPE=LOCAL` sau `CODE_INTERPRETER_TYPE=LOCAL`) rulează codul direct pe gazdă într-un proces Node.js, fără sandboxing. Ar trebui utilizat doar pentru cod de încredere, în dezvoltare. Pentru implementări în producție care gestionează cod neverificat, folosiți `LOGIC_FUNCTION_TYPE=LAMBDA` sau `CODE_INTERPRETER_TYPE=E2B` (cu sandboxing) ori păstrați-le dezactivate.
</Warning>
### Funcții logice - Drivere disponibile
| Driver | Variabilă de mediu | Caz de utilizare | Nivel de securitate |
| ---------- | ------------------------------ | ------------------------------------- | -------------------------------------- |
| Dezactivat | `LOGIC_FUNCTION_TYPE=DISABLED` | Dezactivează complet funcțiile logice | N/A |
| Local | `LOGIC_FUNCTION_TYPE=LOCAL` | Dezvoltare și medii de încredere | Scăzut (fără sandboxing) |
| Lambda | `LOGIC_FUNCTION_TYPE=LAMBDA` | Producție cu cod neverificat | Ridicat (izolare la nivel de hardware) |
### Funcții logice - Configurare recomandată
**Pentru dezvoltare:**
```bash
LOGIC_FUNCTION_TYPE=LOCAL # default when NODE_ENV=development
```
**Pentru producție (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
```
**Pentru a dezactiva funcțiile logice:**
```bash
LOGIC_FUNCTION_TYPE=DISABLED # default when NODE_ENV=production
```
### Interpretor de cod - Drivere disponibile
| Driver | Variabilă de mediu | Caz de utilizare | Nivel de securitate |
| ---------- | -------------------------------- | ---------------------------------------- | ------------------------ |
| Dezactivat | `CODE_INTERPRETER_TYPE=DISABLED` | Dezactivați execuția codului de către AI | N/A |
| Local | `CODE_INTERPRETER_TYPE=LOCAL` | Doar pentru dezvoltare | Scăzut (fără sandboxing) |
| E2B | `CODE_INTERPRETER_TYPE=E_2_B` | Producție cu execuție în sandbox | Ridicat (sandbox izolat) |
<Note>
Când utilizați `LOGIC_FUNCTION_TYPE=DISABLED` sau `CODE_INTERPRETER_TYPE=DISABLED`, orice încercare de execuție va returna o eroare. Acest lucru este util dacă doriți să rulați Twenty fără aceste capabilități.
</Note>
## API și interfața front-end pe gazde separate
Este relevant doar dacă nu lași back-end-ul să servească front-end-ul. Implementările cu aceeași origine
nu au nevoie de nimic aici.
Declară fiecare origine de browser care comunică cu API-ul, separate prin virgulă. `SERVER_URL`
și `FRONTEND_URL` sunt deja de încredere. Serverul înregistrează un avertisment în jurnale atunci când un browser
îl apelează dintr-o origine nedeclarată.
```bash
AUTH_COOKIE_ALLOWED_ORIGINS=https://app.example.com
```
<Warning>
Partea de front-end trimite datele de autentificare la fiecare cerere, iar browserele resping un răspuns cu date de autentificare
provenit de la o origine nedeclarată, astfel încât aplicația nu se încarcă până când nu configurați această opțiune.
</Warning>
Dacă cele două gazde se află pe domenii înregistrabile diferite (nu doar pe
subdomenii diferite), setați, de asemenea, `AUTH_COOKIE_SAME_SITE=none`, ceea ce necesită HTTPS.
Cu multi-workspace activat, nu listați aici fiecare subdomeniu de workspace.
În schimb, direcționați căile API (`/graphql`, `/metadata`, `/rest`, `/auth/`,
`/client-config`, `/file`) către back-end pe fiecare hostname de workspace, astfel încât fiecare
workspace să rămână de aceeași origine — acesta este modul în care rulează Twenty Cloud.

View File

@@ -0,0 +1,255 @@
---
title: Depanare
icon: wrench
---
## Depanare
Dacă întâmpinați orice problemă în timp ce configurați mediul pentru dezvoltare, actualizați instanța dvs. sau găzduiți pe cont propriu,
iată câteva soluții la problemele comune.
### Găzduire proprie
#### Prima instalare rezultă în `autentificare parola eșuată pentru utilizatorul "postgres"`
🚨 **IMPORTANT: Această soluție este DOAR pentru instalările noi** 🚨
Dacă aveți deja o instanță Twenty cu date de producție, **NU** urmați acești pași deoarece vor șterge permanent baza dvs. de date!
În timp ce instalați Twenty pentru prima dată, este posibil să doriți să schimbați parola implicită a bazei de date.
Parola pe care o setați în timpul primei instalări devine stocată permanent în volumul bazei de date. Dacă mai târziu încercați să schimbați această parolă în configurația dvs. fără a elimina vechiul volum, veți obține erori de autentificare deoarece baza de date folosește încă parola originală.
⚠️ AVERTIZARE: Următorii pași vor ȘTERGE PERMANENT toate datele din baza de date! ⚠️
Continuați doar dacă aceasta este o instalare recentă fără date importante.
Pentru a actualiza `PG_DATABASE_PASSWORD`, trebuie să:
```sh
# Update the PG_DATABASE_PASSWORD in .env
docker compose down --volumes
docker compose up -d
```
#### S-au găsit întreruperi de linie CR [Windows]
Acest lucru se întâmplă din cauza caracterelor de terminare a liniei Windows, combinate cu configurația Git. Încercați să rulați:
```
git config --global core.autocrlf false
```
Apoi ștergeți depozitul și clonați-l din nou.
#### Schema de metadate lipsă
În timpul instalării Twenty, trebuie să aprovizionați baza de date postgres cu schemele, extensiile și utilizatorii corecți.
Dacă reușiți să executați această aprovizionare, ar trebui să aveți schemele `default` și `metadata` în baza dvs. de date.
Dacă nu, asigură-te că nu ai mai mult de o instanță PostgreSQL care rulează pe calculatorul tău.
#### Nu se poate găsi modulul 'twenty-emails' sau declarațiile de tip corespunzătoare.
Trebuie să construiți pachetul `douăzeci și două de e-mailuri` (`npx nx execută douăzeci de email-uri:build`) înainte de a rula inițializarea bazei de date.
#### Pachetul twenty-x lipsă
Asigurați-vă că rulați yarn în directorul rădăcină și apoi rulați `npx nx server:dev twenty-server`. Dacă acest lucru nu funcționează, încercați să construiți manual pachetul lipsă.
#### Lint la salvare nu funcționează
Acest lucru ar trebui să fie finalizat cu extensia Oxc (`oxc.oxc-vscode`) instalată. Dacă acest lucru nu funcționează, încercați să adăugați acest lucru la setările VS Code (scara containerului de volum):
```
"editor.codeActionsOnSave": {
"source.fixAll.oxc": "explicit"
}
```
#### În timp ce rulați `npx nx start` sau `npx nx start twenty-front`, o eroare în afara memoriei este aruncată
Rulați doar serviciile de care aveți nevoie, în loc de `npx nx start`. De exemplu, dacă lucrați la server, rulați doar `npx nx worker twenty-server`
**Dacă nu funcționează:**
Dacă ați încercat să rulați doar `npx nx run twenty-server:start` pe WSL și nu reușește cu eroarea de memorie de mai jos:
`EROARE FATALĂ: Mark-compacts ineficiente lângă limita heap-ului Alocarea a eșuat - JavaScript heap out of memory`
Un workaround este să rulezi următoarea comandă în terminal, sau să o adaugi la profilul `.bashrc` astfel încât să fie aplicată automat:
`export NODE_OPTIONS="--max-old-space-size=8192"`
Flag-ul --max-old-space-size=8192 setează o limită superioară de 8 GB pentru heap-ul Node.js; utilizarea se adaptează la cerințele aplicației.
Referință: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
**Dacă nu funcționează:**
investighează ce procese preiau cea mai mare parte a RAM al mașinii tale. La douăzeci de ani, am observat că unele extensii VS Code au preluat o mulțime de RAM, așa că le-am dezactivat temporar.
**Dacă nu funcționează:**
Repornirea mașinăriei ajută la curățarea proceselor fantomă.
#### În timp ce rulați `npx nx start` apar [0] și [1] ciudate în jurnale
Acest lucru este de așteptat deoarece comanda `npx nx start` rulează mai multe comenzi în fundal
#### Nu sunt trimise e-mailuri
De cele mai multe ori, este deoarece `worker` nu rulează în fundal. Încercați să rulați
```
npx nx worker twenty-server
```
#### Nu se poate conecta contul meu Microsoft 365 la 20
De cele mai multe ori, este deoarece administratorul dvs. nu a activat licența Microsoft 365 pentru contul dvs. Verificați [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
Dacă aveți un cod de eroare `AADSTS50020`, probabil înseamnă că utilizați un cont personal Microsoft. Aceasta nu este încă suportată. Mai multe informații [aici](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
#### În timpul rulării `yarn`, avertismentele apar în consolă
Avertismentele informă despre tragerea de dependențe suplimentare care nu sunt specificate explicit în `package.json`, așa că atâta timp cât nu apare o eroare de întrerupere, totul ar trebui să funcționeze conform așteptărilor.
#### Când un utilizator accesează pagina de autentificare, o eroare despre un utilizator neautorizat care încearcă să acceseze un spațiu de lucru apare în jurnale
Acest lucru este așteptat deoarece utilizatorul nu este autorizat atunci când se deconectează, deoarece identitatea sa nu a fost verificată.
#### Cum să verificați dacă worker-ul dvs. rulează?
* Accesați [webhook-test.com](https://webhook-test.com/) și copiați **Your Unique Webhook URL**.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-test.jpg" alt="Test de webhook" />
</div>
* Deschideți aplicația Twenty, navigați la `/settings` și activați comutatorul **Avansat** în colțul din stânga jos al ecranului.
* Creați un nou webhook.
* Lipiți **Your Unique Webhook URL** în câmpul **Endpoint Url** din Twenty. Setați **Filtrele** pe `Companii` și `Create`.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-settings.jpg" alt="Setări webhook" />
</div>
* Accesați `/objects/companies` și creați un nou registru de companie.
* Întoarceți-vă la [webhook-test.com](https://webhook-test.com/) și verificați dacă a fost primit un nou **POST request**.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-test-result.jpg" alt="Rezultatul testului webhook" />
</div>
* Dacă este primit un **POST request**, worker-ul dvs. rulează cu succes. În caz contrar, trebuie să depanați worker-ul dvs.
#### Front-end nu reușește să pornească și returnează eroarea TS5042: Opțiunea 'proiect' nu poate fi amestecată cu fișierele sursă pe linia de comandă
Comentează plugin-ul de verificator în `packes/twenty-ui/vite-config.ts`, așa cum se arată în exemplul de mai jos:
```
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'],
},
}),
],
```
#### Panoul de administrare nu este accesibil
Executați \`UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE e-mail = 'you@yourdomain.com';' în containerul bazei de date pentru a avea acces la panoul de administrare.
#### Când rulați un flux de lucru, rularea fluxului de lucru eșuează cu "Execuția funcțiilor logice este dezactivată. Setați LOGIC_FUNCTION_TYPE la LOCAL sau LAMBDA pentru a le activa."
În producție, funcțiile logice sunt dezactivate în mod implicit. Setați variabila de mediu `LOGIC_FUNCTION_TYPE` la `LOCAL` sau `LAMBDA` pentru a le activa. Acest lucru poate fi configurat prin variabile de mediu sau prin variabilele bazei de date din panoul de administrare. Consultați [Ghidul de configurare a funcțiilor logice](/l/ro/developers/self-host/capabilities/setup#logic-functions-available-drivers) pentru detalii.
#### Când tastez un mesaj în chat-ul AI, acesta nu răspunde imediat și trebuie să reîmprospătez pagina pentru a vedea răspunsul
Acest lucru înseamnă că proxy-ului dvs. îi lipsește configurația pentru răspunsurile API bazate pe stream. Mai jos este un exemplu de configurare 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;
}
```
### Compunere Docker cu 1 clic
#### Nu se poate conecta
Dacă nu vă puteți conecta după configurare:
1. Rulați următoarele comenzi:
```bash
docker exec -it twenty-server-1 yarn
docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
```
2. Reporniți containerele Docker:
```bash
docker compose down
docker compose up -d
```
Țineți cont că comanda `database:reset` va șterge complet baza de date și o va recrea de la zero.
#### Probleme de conexiune în spatele unui proxy invers
Dacă rulați Twenty în spatele unui proxy invers și întâmpinați probleme de conexiune:
1. **Verificați SERVER_URL:**
Asigurați-vă că `SERVER_URL` din fișierul dvs. `.env` corespunde cu URL-ul dvs. de acces extern, inclusiv `https` dacă SSL este activat.
2. **Verificați Setările Proxy-ului Invers:**
* Confirmați că proxy-ul invers transmite corect cererile către serverul Twenty.
* Asigurați-vă că headerele precum `X-Forwarded-For` și `X-Forwarded-Proto` sunt setate corect.
3. **Reporniți Serviciile:**
După ce faceți schimbări, reporniți atât proxy-ul invers, cât și containerele Twenty.
#### Eroare la încărcarea unei imagini - permisiune refuzată
Schimbarea proprietății folderului de date pe gazdă de la root la un alt utilizator și grup rezolvă această problemă.
#### Eroare „Fișier negăsit” la testarea funcției Logic într-un flux de lucru.
Rulați comanda `yarn command:prod application:rebuild-default-deps` în containerul twenty-server pentru a remedia problema dependențelor lipsă.
## Obținerea de ajutor
Dacă întâmpinați probleme care nu sunt acoperite în acest ghid:
* Verificați jurnalele:
Vizualizați jurnalele containerului pentru mesaje de eroare:
```bash
docker compose logs
```
* Suport Comunitar:
Contactați [comunitatea Twenty](https://github.com/twentyhq/twenty/issues) sau [canalele de suport](https://discord.gg/cx5n4Jzs57) pentru asistență.

View File

@@ -0,0 +1,106 @@
---
title: Ghid de actualizare
icon: arrow-up-right-dots
---
## Linii directoare generale
**Faceți întotdeauna o copie de rezervă a bazei de date înainte de a începe procesul de actualizare** rulând:
```bash
docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql
```
Pentru a restaura din copia de rezervă:
```bash
cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}
```
Dacă utilizați Docker Compose, urmați acești pași:
1. Opriți Twenty: `docker compose down`
2. Modificați valoarea `TAG` în fișierul `.env` de lângă `docker-compose.yml`
3. Porniți Twenty: `docker compose up -d`
Serverul rulează automat toate migrațiile de actualizare necesare la pornire. Nu este necesară nicio comandă manuală.
## Actualizarea la v2.34+ — PostgreSQL 15 este versiunea minimă
Twenty v2.34 necesită PostgreSQL 15 sau o versiune mai nouă. Configurația oficială Docker Compose utilizează PostgreSQL 16. Dacă instanța dvs. se conectează la o bază de date administrată extern, actualizați-o înainte de a porni serverul v2.34.
## Actualizări între versiuni (v1.23+)
Începând cu **v1.23**, Twenty suportă actualizări între versiuni. Puteți trece direct de la orice versiune acceptată la cea mai recentă versiune, fără a parcurge fiecare versiune intermediară.
De exemplu, actualizarea de la v1.23 direct la v2.0 este pe deplin suportată.
## Actualizare la v2.5+ — înveliș de criptare pentru date în repaus
Începând cu **v2.5**, Twenty stochează secretele aflate în repaus (tokenuri OAuth, variabile de aplicație, chei private de semnare, valori de configurare sensibile, secrete TOTP) într-un înveliș versionat `enc:v2:` criptat cu `ENCRYPTION_KEY` (sau `APP_SECRET` dacă `ENCRYPTION_KEY` nu este setată).
Prima pornire în v2.5 rulează comenzi lente de upgrade care populează retroactiv rândurile existente în noul înveliș. Aceste comenzi sunt idempotente — întreruperea și repornirea serverului reiau procesul de unde a rămas — dar pot dura ceva timp pe baze de date mari. Poți monitoriza progresul cu `upgrade:status`.
Ar trebui să setezi un `ENCRYPTION_KEY` dedicat **înainte** de upgrade-ul la v2.5, astfel încât procesul de populare retroactivă să scrie rândurile sub acesta încă de la început. Schimbarea cheilor după popularea retroactivă necesită o [rotație](/l/ro/developers/self-host/capabilities/key-rotation).
## Rotația secretelor și a cheilor de semnare
Pentru sarcini operaționale de zi cu zi, precum rotația `ENCRYPTION_KEY`, rotația cheii de semnare JWT sau revocarea unei chei de semnare compromise, consultă [Ghidul de rotație a cheilor](/l/ro/developers/self-host/capabilities/key-rotation).
## Verificarea stării actualizării
Comanda `upgrade:status` vă permite să inspectați starea curentă a instanței și a migrațiilor spațiilor de lucru. Este utilă pentru depanarea problemelor de actualizare sau când trimiteți o solicitare de asistență.
Rulați comanda din containerul serverului:
```bash
docker exec -it {server_container_name_or_id} yarn command:prod upgrade:status
```
Exemplu de rezultat:
```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)
```
### Opțiuni
| Opțiune | Descriere |
| ------------------------- | --------------------------------------------------------------------------------------- |
| `-w, --workspace-id <id>` | Filtrați după un spațiu de lucru specific. Poate fi specificată de mai multe ori. |
| `-f, --failed-only` | Ascunde spațiile de lucru la zi, afișând doar pe cele rămase în urmă și pe cele eșuate. |
## Depanare
Dacă actualizarea eșuează pe unele spații de lucru, serverul nu va trece de pasul care a eșuat. Repornirea serverului (`docker compose up -d`) va reîncerca actualizarea de unde a rămas.
Pentru a identifica rapid problemele, rulați:
```bash
docker exec -it {server_container_name_or_id} yarn command:prod upgrade:status --failed-only
```
Aceasta afișează doar spațiile de lucru care sunt rămase în urmă sau au eșuat, împreună cu mesajul de eroare pentru fiecare eșec.
## Înainte de v1.23
Dacă instanța dvs. este mai veche decât v1.23, trebuie să actualizați incremental prin fiecare versiune majoră etichetată (de la v1.6 la v1.7, apoi de la v1.7 la v1.8 și așa mai departe) până ajungeți la v1.23. De acolo, puteți sări direct la cea mai recentă versiune.