Searched migrate data between servers database migration
Found 9 results
1 messages · Page 1 of 1 (latest)
Thinking...
Đâ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:
docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql
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:
docker compose downTAG trong file .env sang version tiếp theodocker compose up -dTừ v0.53 trở đi, migrations tự động chạy khi khởi động container.
Export database từ Server A:
docker exec twenty-postgres pg_dump -U postgres twenty > backup_full.sql
docker compose stop twenty-server twenty-front
docker exec -i twenty-postgres psql -U postgres twenty < backup_full.sql
docker compose up -d
Lưu ý quan trọng:
core.workspace sau mỗi lần upgradeNế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:
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
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 ý:
-U postgres bằng user tương ứngtwenty, bao gồm cả 20+ custom tables của bạnSau khi backup xong, cho mình biết để tiếp tục bước upgrade nhé.
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
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.
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)
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é.
Làm sao để biết trong database này chứa đủ dữ liệu của bảng mình chưa
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.
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
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é.
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
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é.
Sao k thấy bảng agency,.. nhỉ toàn mấy bảng gì k à
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é.
à có rồi nó nằm từ bảng 60 trở đi, oke ổn
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:
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 đó.
GGiữ nguyên hiện trạng của server A
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:
Mỗi bước: đổi TAG trong .env → docker compose down → docker compose up -d
Bạn đã có file .env và docker-compose.yml trên Server B chưa? Paste nội dung để mình kiểm tra trước khi bắt đầu.
Bước 1 nè :
server B là port 22800 [email protected]:~/tourchaincrm/
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é.
Hay là chạy trước trên local đi
Được, chạy trên local an toàn hơn để test trước.
Trên local, bạn cần:
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.
có rồi nè, chưa có file backup trên local thôi
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é.
copy về local rồi nè
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é.
vanvo@LAPTOP-VAN:~/twenty-tc$ docker compose up -d
yaml: line 7: could not find expected ':'
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
yaml: line 7: could not find expected ':'
Vẫn lỗi, hay là mình cat cho bạn xem
Đúng rồi, paste nội dung cả 2 file cho mình xem:
cat .env
cat docker-compose.yml
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
và
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:
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
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
Database và Redis đã chạy. Nhưng thiếu server và worker. Kiểm tra logs:
docker compose logs server
Paste kết quả để mình xem lỗi gì nhé.
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
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
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)
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
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