#Đưa data cũ lên server mới

1 messages · Page 1 of 1 (latest)

finite bronzeBOT
#
Searched migrate data between servers database migration
#
Searched backup restore database export import data
#

Thinking...

#
Searched upgrade version migration custom objects workspace sync metadata
#

Đây là một trường hợp phức tạp vì bạn đang migrate giữa hai phiên bản cách xa nhau (v1.11.0 → v1.16.3). Dựa trên tài liệu, đây là cách tiếp cận:

Vấn đề chính:
Twenty không hỗ trợ migrate trực tiếp giữa các phiên bản cách xa nhau. Bạn cần upgrade tuần tự qua từng phiên bản major.minor.

Quy trình đề xuất:

Bước 1: Backup database Server A

docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql

Bước 2: Upgrade Server A tuần tự đến v1.16.3

Bạn cần upgrade từng bước: v1.11 → v1.12 → v1.13 → v1.14 → v1.15 → v1.16

Với mỗi bước:

  1. docker compose down
  2. Thay đổi TAG trong file .env sang version tiếp theo
  3. docker compose up -d

Từ v0.53 trở đi, migrations tự động chạy khi khởi động container.

Bước 3: Sau khi Server A đã ở v1.16.3

Export database từ Server A:

docker exec twenty-postgres pg_dump -U postgres twenty > backup_full.sql

Bước 4: Restore vào Server B

  1. Stop Server B services:
docker compose stop twenty-server twenty-front
  1. Restore database:
docker exec -i twenty-postgres psql -U postgres twenty < backup_full.sql
  1. Restart services:
docker compose up -d

Lưu ý quan trọng:

  • Không skip version: Việc nhảy từ v1.11 thẳng sang v1.16 có thể gây lỗi workspace version desync
  • Kiểm tra workspace version trong table core.workspace sau mỗi lần upgrade
  • Đảm bảo backup không bị corrupt sau mỗi bước upgrade

Nếu bạn muốn giữ Server A nguyên trạng (v1.11.0), bạn có thể clone database sang một môi trường test, upgrade tuần tự ở đó, rồi mới restore vào Server B.

Tham khảo thêm:

pure schooner
#

root@cs-linux-20251025133135236:~/twenty# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05ab7b63d0bd redis:6.2-alpine "docker-entrypoint.s…" 5 weeks ago Up 5 days frappe_docker-redis-cache-1
fe8aaceb59b8 twentycrm/twenty:v1.11.5 "/app/entrypoint.sh …" 8 weeks ago Up 3 days twenty-worker-1
42aac80ddfae twentycrm/twenty:v1.11.5 "/app/entrypoint.sh …" 8 weeks ago Up 2 days (healthy) 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp twenty-server-1
eab04c079a05 postgres:16 "docker-entrypoint.s…" 8 weeks ago Up 5 days (healthy) 5432/tcp twenty-db-1
69a19d792038 redis "docker-entrypoint.s…" 8 weeks ago Up 4 days (healthy) 6379/tcp twenty-redis-1
32daba8a387f jc21/nginx-proxy-manager:latest "/init" 2 months ago Up 5 days 0.0.0.0:80-81->80-81/tcp, [::]:80-81->80-81/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp npm-nginxproxymanager-1
Bước 1 trước nha, làm sao để backup

finite bronzeBOT
#
Searched backup database postgres docker twenty
#

Dựa vào docker ps của bạn, container database tên là twenty-db-1. Chạy lệnh sau để backup:

docker exec twenty-db-1 pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql

Lệnh này sẽ tạo file backup với tên dạng backup_20260127.sql trong thư mục hiện tại (~/twenty).

Kiểm tra file backup đã tạo thành công:

ls -lh backup_*.sql

Lưu ý:

  • Nếu bạn đã đổi user postgres thành tên khác, thay -U postgres bằng user tương ứng
  • File backup sẽ chứa toàn bộ data và schema của database twenty, bao gồm cả 20+ custom tables của bạn

Sau khi backup xong, cho mình biết để tiếp tục bước upgrade nhé.

pure schooner
#

root@cs-linux-20251025133135236:~/twenty# docker exec twenty-db-1 pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
pg_dump: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: database "twenty" does not exist

finite bronzeBOT
#

Database không tên là twenty. Kiểm tra tên database thực tế:

docker exec twenty-db-1 psql -U postgres -c "\l"

Chạy lệnh này và paste kết quả, mình sẽ xác định đúng tên database để backup.

pure schooner
#

root@cs-linux-20251025133135236:~/twenty# docker exec twenty-db-1 psql -U postgres -c "\l"
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+------------+------------+------------+-----------+-----------------------
default | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
postgres | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(4 rows)

finite bronzeBOT
#

Database của bạn tên là default. Chạy lệnh backup sau:

docker exec twenty-db-1 pg_dump -U postgres default > backup_$(date +%Y%m%d).sql

Kiểm tra file backup:

ls -lh backup_*.sql

Cho mình biết kết quả nhé.

pure schooner
#

Làm sao để biết trong database này chứa đủ dữ liệu của bảng mình chưa

finite bronzeBOT
#

Kiểm tra nội dung database bằng các lệnh sau:

1. Xem danh sách tất cả tables:

docker exec twenty-db-1 psql -U postgres default -c "\dt *.*"

2. Đếm số tables trong các schema:

docker exec twenty-db-1 psql -U postgres default -c "SELECT schemaname, COUNT(*) as table_count FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') GROUP BY schemaname;"

3. Xem số records trong từng table (ví dụ với custom objects):

docker exec twenty-db-1 psql -U postgres default -c "SELECT relname as table_name, n_tup_ins as row_count FROM pg_stat_user_tables ORDER BY n_tup_ins DESC LIMIT 30;"

Chạy các lệnh trên và paste kết quả, mình sẽ giúp bạn xác nhận data đã đủ chưa.

pure schooner
#

vì server này theo kiểu 3 workspace mà mình chỉ lấy mỗi workspace này thôi
workspace_e04r9377ecbknx3lq6bvij7w3 | _affilate | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _agency | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _agencyNation | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _agencyevent | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _agent | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _bookingReport | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _emailoffice | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _issue | table | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | _nation | table | postgres

finite bronzeBOT
#

Hiểu rồi, bạn chỉ muốn backup workspace workspace_e04r9377ecbknx3lq6bvij7w3.

Backup chỉ schema của workspace đó:

docker exec twenty-db-1 pg_dump -U postgres -n workspace_e04r9377ecbknx3lq6bvij7w3 default > backup_workspace_$(date +%Y%m%d).sql

Tuy nhiên, bạn cũng cần backup thêm data từ schema core (chứa thông tin workspace, users, metadata) và metadata (chứa cấu trúc custom objects):

docker exec twenty-db-1 pg_dump -U postgres -n core -n metadata -n workspace_e04r9377ecbknx3lq6bvij7w3 default > backup_full_workspace_$(date +%Y%m%d).sql

Kiểm tra file backup:

ls -lh backup_*workspace*.sql

Xác nhận số tables trong workspace:

docker exec twenty-db-1 psql -U postgres default -c "SELECT COUNT(*) as total_tables FROM pg_tables WHERE schemaname = 'workspace_e04r9377ecbknx3lq6bvij7w3';"

Chạy các lệnh trên và cho mình biết kết quả nhé.

pure schooner
#

root@cs-linux-20251025133135236:~/twenty# ls -lh backup_workspace.sql
-rw-r--r-- 1 root root 37M Jan 27 11:05 backup_full_workspace_20260127.sql
Đây rồi, nhưng có thể banh file này ra để xem có những bảng nào k

finite bronzeBOT
#

Có thể kiểm tra nội dung file backup:

1. Xem danh sách tất cả tables trong file backup:

grep -E "^CREATE TABLE" backup_full_workspace_20260127.sql | head -50

2. Đếm tổng số tables:

grep -c "^CREATE TABLE" backup_full_workspace_20260127.sql

3. Xem chỉ các tables của workspace:

grep -E "^CREATE TABLE workspace_e04r9377ecbknx3lq6bvij7w3" backup_full_workspace_20260127.sql

4. Xem tổng quan file (10 dòng đầu và cuối):

head -100 backup_full_workspace_20260127.sql
tail -50 backup_full_workspace_20260127.sql

Chạy lệnh 1 và 2 trước để xem có bao nhiêu tables và tên gì nhé.

pure schooner
#

Sao k thấy bảng agency,.. nhỉ toàn mấy bảng gì k à

finite bronzeBOT
#

Có thể format trong file khác. Thử tìm kiếm trực tiếp:

1. Tìm tất cả tables có trong file:

grep -i "CREATE TABLE" backup_full_workspace_20260127.sql | head -50

2. Tìm cụ thể bảng agency:

grep -i "agency" backup_full_workspace_20260127.sql | head -20

3. Tìm theo tên workspace:

grep -i "workspace_e04r9377ecbknx3lq6bvij7w3" backup_full_workspace_20260127.sql | head -30

4. Xem cấu trúc file chi tiết hơn:

grep -E "(CREATE TABLE|CREATE SCHEMA)" backup_full_workspace_20260127.sql

Paste kết quả để mình kiểm tra xem file backup có đầy đủ không nhé.

pure schooner
#

à có rồi nó nằm từ bảng 60 trở đi, oke ổn

finite bronzeBOT
#

Tốt, file backup đã đầy đủ data của workspace.

Bước tiếp theo: Bạn cần upgrade Server A từ v1.11.5 lên v1.16.3 tuần tự.

Trước khi upgrade, cho mình biết:

  • Server B (v1.16.3) đang trống hoàn toàn hay đã có workspace nào chưa?
  • Bạn muốn upgrade Server A lên v1.16.3 rồi restore, hay muốn giữ Server A nguyên v1.11.5?

Nếu muốn giữ Server A nguyên trạng, mình sẽ hướng dẫn cách restore backup vào Server B và upgrade trực tiếp trên đó.

pure schooner
#

GGiữ nguyên hiện trạng của server A

finite bronzeBOT
#

OK, vậy mình sẽ restore backup vào Server B và upgrade trên đó.

Trên Server B (v1.16.3):

Bước 1: Copy file backup từ Server A sang Server B

scp backup_full_workspace_20260127.sql user@server-b-ip:~/twenty/

Bước 2: Trên Server B, downgrade về v1.11.5 trước

Vì backup từ v1.11.5, bạn cần Server B cũng ở v1.11.5 để restore, sau đó upgrade tuần tự.

Trong file .env của Server B, đổi:

TAG=v1.11.5

Sau đó:

docker compose down
docker compose up -d

Bước 3: Restore database

docker exec -i twenty-db-1 psql -U postgres default < backup_full_workspace_20260127.sql

Bước 4: Upgrade tuần tự
Sau khi restore xong, upgrade từng bước:

  • v1.11.5 → v1.12.0 → v1.13.0 → v1.14.0 → v1.15.0 → v1.16.3

Mỗi bước: đổi TAG trong .envdocker compose downdocker compose up -d


Bạn đã có file .envdocker-compose.yml trên Server B chưa? Paste nội dung để mình kiểm tra trước khi bắt đầu.

pure schooner
finite bronzeBOT
#

Copy file backup sang Server B:

scp -P 22800 backup_full_workspace_20260127.sql [email protected]:~/tourchaincrm/

Chạy lệnh này trên Server A và cho mình biết kết quả nhé.

pure schooner
#

Hay là chạy trước trên local đi

finite bronzeBOT
#

Được, chạy trên local an toàn hơn để test trước.

Trên local, bạn cần:

  1. Cài đặt Twenty v1.11.5 với Docker Compose
  2. Restore backup vào
  3. Upgrade tuần tự lên v1.16.3
  4. Test xong mới đưa lên Server B

Bạn đã có Docker và Docker Compose trên local chưa? Nếu có, mình sẽ hướng dẫn setup Twenty v1.11.5 trên local để test.

pure schooner
#

có rồi nè, chưa có file backup trên local thôi

finite bronzeBOT
#

Copy file backup từ Server A về local:

scp root@server-a-ip:~/twenty/backup_full_workspace_20260127.sql ./

Thay server-a-ip bằng IP của Server A. Nếu Server A dùng port SSH khác 22, thêm -P port_number.

Sau khi copy xong, cho mình biết để tiếp tục setup Twenty v1.11.5 trên local nhé.

pure schooner
#

copy về local rồi nè

finite bronzeBOT
#

Tốt. Giờ setup Twenty v1.11.5 trên local.

Bước 1: Tạo thư mục project

mkdir twenty-local && cd twenty-local

Bước 2: Tạo file .env

cat > .env << 'EOF'
TAG=v1.11.5
POSTGRES_ADMIN_PASSWORD=postgres
PG_DATABASE_URL=postgres://postgres:postgres@db:5432/default
SERVER_URL=http://localhost:3000
REDIS_URL=redis://redis:6379
STORAGE_TYPE=local
STORAGE_LOCAL_PATH=.local-storage
ACCESS_TOKEN_SECRET=your-access-token-secret-change-me
LOGIN_TOKEN_SECRET=your-login-token-secret-change-me
REFRESH_TOKEN_SECRET=your-refresh-token-secret-change-me
FILE_TOKEN_SECRET=your-file-token-secret-change-me
EOF

Bước 3: Tạo file docker-compose.yml

cat > docker-compose.yml << 'EOF'
version: "3.9"
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_ADMIN_PASSWORD}
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 5s
      retries: 5

  server:
    image: twentycrm/twenty:${TAG}
    environment:
      PG_DATABASE_URL: ${PG_DATABASE_URL}
      SERVER_URL: ${SERVER_URL}
      REDIS_URL: ${REDIS_URL}
      STORAGE_TYPE: ${STORAGE_TYPE}
      STORAGE_LOCAL_PATH: ${STORAGE_LOCAL_PATH}
      ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
      LOGIN_TOKEN_SECRET: ${LOGIN_TOKEN_SECRET}
      REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
      FILE_TOKEN_SECRET: ${FILE_TOKEN_SECRET}
    ports:
      - "3000:3000"
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

  worker:
    image: twentycrm/twenty:${TAG}
    command: ["yarn", "worker:prod"]
    environment:
      PG_DATABASE_URL: ${PG_DATABASE_URL}
      SERVER_URL: ${SERVER_URL}
      REDIS_URL: ${REDIS_URL}
      STORAGE_TYPE: ${STORAGE_TYPE}
#

STORAGE_LOCAL_PATH: ${STORAGE_LOCAL_PATH}
ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
LOGIN_TOKEN_SECRET: ${LOGIN_TOKEN_SECRET}
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
FILE_TOKEN_SECRET: ${FILE_TOKEN_SECRET}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy

volumes:
db-data:
EOF


**Bước 4: Khởi động**
```bash
docker compose up -d

Chạy xong cho mình biết kết quả docker ps nhé.

pure schooner
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker compose up -d
yaml: line 7: could not find expected ':'

finite bronzeBOT
#

File .env bị lỗi format. Tạo lại:

rm .env
echo 'TAG=v1.11.5' > .env
echo 'POSTGRES_ADMIN_PASSWORD=postgres' >> .env
echo 'PG_DATABASE_URL=postgres://postgres:postgres@db:5432/default' >> .env
echo 'SERVER_URL=http://localhost:3000' >> .env
echo 'REDIS_URL=redis://redis:6379' >> .env
echo 'STORAGE_TYPE=local' >> .env
echo 'STORAGE_LOCAL_PATH=.local-storage' >> .env
echo 'ACCESS_TOKEN_SECRET=your-access-token-secret-change-me' >> .env
echo 'LOGIN_TOKEN_SECRET=your-login-token-secret-change-me' >> .env
echo 'REFRESH_TOKEN_SECRET=your-refresh-token-secret-change-me' >> .env
echo 'FILE_TOKEN_SECRET=your-file-token-secret-change-me' >> .env

Sau đó chạy lại:

docker compose up -d
pure schooner
#

yaml: line 7: could not find expected ':'
Vẫn lỗi, hay là mình cat cho bạn xem

finite bronzeBOT
#

Đúng rồi, paste nội dung cả 2 file cho mình xem:

cat .env
cat docker-compose.yml
pure schooner
#

TAG=v1.11.5
POSTGRES_ADMIN_PASSWORD=postgres
PG_DATABASE_URL=postgres://postgres:postgres@db:5432/default
SERVER_URL=http://localhost:3000
REDIS_URL=redis://redis:6379
STORAGE_TYPE=local
STORAGE_LOCAL_PATH=.local-storage
ACCESS_TOKEN_SECRET=fq6zNoVyAA
LOGIN_TOKEN_SECRET=fq6zNoVyAA
REFRESH_TOKEN_SECRET=fq6zNoVyAA
FILE_TOKEN_SECRET=fq6zNoVyAA

version: "3.9"
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: ${POSTGRES_ADMIN_PASSWORD}
volumes:db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5

redis:
image: redis
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 5

server:
image: twentycrm/twenty:${TAG}
environment:
PG_DATABASE_URL: ${PG_DATABASE_URL}
SERVER_URL: ${SERVER_URL}
REDIS_URL: ${REDIS_URL}
STORAGE_TYPE: ${STORAGE_TYPE}
STORAGE_LOCAL_PATH: ${STORAGE_LOCAL_PATH}
ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
LOGIN_TOKEN_SECRET: ${LOGIN_TOKEN_SECRET}
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
FILE_TOKEN_SECRET: ${FILE_TOKEN_SECRET}
ports:"3000:3000"
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy

worker:
image: twentycrm/twenty:${TAG}
command: ["yarn", "worker:prod"]
environment:
PG_DATABASE_URL: ${PG_DATABASE_URL}
SERVER_URL: ${SERVER_URL}
REDIS_URL: ${REDIS_URL}
STORAGE_TYPE: ${STORAGE_TYPE}
STORAGE_LOCAL_PATH: ${STORAGE_LOCAL_PATH}
ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
LOGIN_TOKEN_SECRET: ${LOGIN_TOKEN_SECRET}
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
FILE_TOKEN_SECRET: ${FILE_TOKEN_SECRET}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy

volumes:
db-data:

finite bronzeBOT
#

File docker-compose.yml bị lỗi format ở nhiều chỗ. Tạo lại file:

rm docker-compose.yml
cat > docker-compose.yml << 'ENDOFFILE'
version: "3.9"
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_ADMIN_PASSWORD}
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 5s
      retries: 5

  server:
    image: twentycrm/twenty:${TAG}
    environment:
      PG_DATABASE_URL: ${PG_DATABASE_URL}
      SERVER_URL: ${SERVER_URL}
      REDIS_URL: ${REDIS_URL}
      STORAGE_TYPE: ${STORAGE_TYPE}
      STORAGE_LOCAL_PATH: ${STORAGE_LOCAL_PATH}
      ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
      LOGIN_TOKEN_SECRET: ${LOGIN_TOKEN_SECRET}
      REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
      FILE_TOKEN_SECRET: ${FILE_TOKEN_SECRET}
    ports:
      - "3000:3000"
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

  worker:
    image: twentycrm/twenty:${TAG}
    command: ["yarn", "worker:prod"]
    environment:
      PG_DATABASE_URL: ${PG_DATABASE_URL}
      SERVER_URL: ${SERVER_URL}
      REDIS_URL: ${REDIS_URL}
      STORAGE_TYPE: ${STORAGE_TYPE}
      STORAGE_LOCAL_PATH: ${STORAGE_LOCAL_PATH}
      ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
      LOGIN_TOKEN_SECRET: ${LOGIN_TOKEN_SECRET}
      REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
      FILE_TOKEN_SECRET: ${FILE_TOKEN_SECRET}
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

volumes:
  db-data:
ENDOFFILE

Sau đó chạy:

docker compose up -d
pure schooner
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f11f4c16dca postgres:16 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes (healthy) 5432/tcp twenty-tc-db-1
e3103f16f572 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes (healthy) 6379/tcp twenty-tc-redis-1

finite bronzeBOT
#

Database và Redis đã chạy. Nhưng thiếu serverworker. Kiểm tra logs:

docker compose logs server

Paste kết quả để mình xem lỗi gì nhé.

pure schooner
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker compose logs server
WARN[0000] /home/vanvo/twenty-tc/docker-compose.yml: the attribute version is obsolete, it will be ignored, please remove it to avoid potential confusion
server-1 | Running database setup and migrations...
server-1 | psql: error: connection to server at "db" (172.19.0.3), port 5432 failed: FATAL: database "default" does not exist

finite bronzeBOT
#

Database default chưa được tạo. Tạo database trước:

docker exec twenty-tc-db-1 psql -U postgres -c "CREATE DATABASE \"default\";"

Sau đó restart services:

docker compose up -d

Kiểm tra lại:

docker ps
pure schooner
#

server-1 | Successfully registered all background sync jobs!
server-1 | /app/packages/twenty-server/dist/engine/core-modules/session-storage/session-storage.module-factory.js:25
server-1 | throw new Error('APP_SECRET is not set');
server-1 | ^
server-1 |
server-1 | Error: APP_SECRET is not set
server-1 | at getSessionStorageOptions (/app/packages/twenty-server/dist/engine/core-modules/session-storage/session-storage.module-factory.js:25:15)
server-1 | at bootstrap (/app/packages/twenty-server/dist/main.js:40:100)
server-1 | at process.processTicksAndRejections (node:internal/process/task_queues:103:5)

finite bronzeBOT
#

Cần thêm APP_SECRET vào file .env:

echo 'APP_SECRET=your-app-secret-change-me' >> .env

Sau đó restart:

docker compose down
docker compose up -d

Kiểm tra lại:

docker ps
pure schooner
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
838b12a691af twentycrm/twenty:v1.11.5 "/app/entrypoint.sh …" 8 minutes ago Up About a minute twenty-tc-worker-1
9f11f4c16dca postgres:16 "docker-entrypoint.s…" 8 minutes ago Up 8 minutes (healthy) 5432/tcp twenty-tc-db-1
e3103f16f572 redis "docker-entrypoint.s…" 8 minutes ago Up 8 minutes (healthy) 6379/tcp twenty-tc-redis-1