#Backup data

1 messages · Page 1 of 1 (latest)

mighty flintBOT
#
Searched restore backup database migration data
#
Searched import data workspace custom objects
#

Thinking...

#

Để restore file backup SQL từ server A vào máy local, bạn cần thực hiện các bước sau:

1. Dừng các services Twenty trên local:

docker compose stop twenty-server twenty-front

2. Restore database từ file backup:

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

3. Khởi động lại services:

docker compose up -d

Lưu ý quan trọng:

  • Phiên bản phải khớp: Máy local cần chạy cùng phiên bản v1.11.5 với server A. Nếu khác phiên bản, bạn cần upgrade/downgrade theo đúng thứ tự từng version một (không được skip version).

  • Kiểm tra version workspace: Sau khi restore, kiểm tra version trong bảng core.workspace để đảm bảo workspace đã được migrate đúng.

  • Environment variables: Đảm bảo các biến môi trường trên local (như APP_SECRET, PG_DATABASE_PASSWORD, REDIS_URL) được cấu hình đúng.

  • Flush cache nếu cần: Nếu gặp lỗi authorization sau khi restore, chạy:

docker exec -it twenty-server yarn command:prod cache:flush

Bạn đã cấu hình Twenty trên local chưa, hay cần hướng dẫn setup từ đầu?

tropic portal
#

Mình chạy twenty trên local bằng docker với 1 file docker-compose.yml rồi á

mighty flintBOT
#

Vậy bạn chỉ cần restore file backup vào database PostgreSQL của Docker.

1. Dừng services Twenty:

docker compose stop

2. Khởi động lại chỉ database:

docker compose up -d twenty-db

3. Restore database:

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

Lưu ý: Tên container có thể là twenty-db hoặc twenty-postgres tùy vào file docker-compose.yml của bạn. Kiểm tra bằng docker ps.

4. Khởi động lại toàn bộ services:

docker compose up -d

5. Kiểm tra logs nếu có lỗi:

docker compose logs -f twenty-server

Một số lưu ý:

  • Đảm bảo local đang chạy v1.11.5 giống server A
  • Nếu file backup chứa toàn bộ database (bao gồm cả schema), bạn có thể cần drop database cũ trước khi restore:
docker exec -i twenty-db psql -U postgres -c "DROP DATABASE IF EXISTS \"default\";"
docker exec -i twenty-db psql -U postgres -c "CREATE DATABASE \"default\";"
docker exec -i twenty-db psql -U postgres -d default < backup_full_workspace_20260127.sql

Chạy thử và cho mình biết kết quả nhé.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker compose up -d twenty-db
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
no such service: twenty-db

mighty flintBOT
#

Container database của bạn có tên khác. Kiểm tra tên service trong file docker-compose.yml:

cat docker-compose.yml | grep -A 2 "services:"

Hoặc liệt kê tất cả services:

docker compose config --services

Thông thường tên service database trong Twenty có thể là:

  • db
  • postgres
  • twenty-postgres

Sau khi biết tên đúng, thay thế vào lệnh:

docker compose up -d <tên-service-database>

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

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ cat docker-compose.yml | grep -A 2 "services:"
services:
db:
image: postgres:16
vanvo@LAPTOP-VAN:~/twenty-tc$ docker compose up -d postgres
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
no such service: postgres
vanvo@LAPTOP-VAN:~/twenty-tc$ docker compose up -d postgres:16
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
no such service: postgres:16
vanvo@LAPTOP-VAN:~/twenty-tc$ docker compose config --services
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
db
redis
server
worker

mighty flintBOT
#

Service database của bạn tên là db. Tiến hành restore như sau:

1. Dừng tất cả services:

docker compose stop

2. Khởi động chỉ database:

docker compose up -d db

3. Kiểm tra tên container đang chạy:

docker ps --format "table {{.Names}}"

4. Restore database (thay <container-name> bằng tên container từ bước 3):

docker exec -i <container-name> psql -U postgres -d default < backup_full_workspace_20260127.sql

Hoặc nếu cần drop database cũ trước:

docker exec -i <container-name> psql -U postgres -c "DROP DATABASE IF EXISTS \"default\";"
docker exec -i <container-name> psql -U postgres -c "CREATE DATABASE \"default\";"
docker exec -i <container-name> psql -U postgres -d default < backup_full_workspace_20260127.sql

5. Khởi động lại toàn bộ:

docker compose up -d

Chạy bước 2 và 3 trước, rồi cho mình biết tên container nhé.

tropic portal
#

khởi chạy rồi sao k thấy data từ file backup_full_workspace_20260127.sql nhỉ

mighty flintBOT
#

Có thể do một số nguyên nhân. Kiểm tra từng bước:

1. Kiểm tra database name trong file backup:

head -100 backup_full_workspace_20260127.sql | grep -i "connect\|database"

2. Kiểm tra database name trong docker-compose.yml:

cat docker-compose.yml | grep -i "POSTGRES_DB\|PG_DATABASE"

3. Liệt kê các database hiện có:

docker exec -i <container-name> psql -U postgres -c "\l"

4. Kiểm tra xem restore có lỗi không - chạy lại và xem output:

docker exec -i <container-name> psql -U postgres -d default < backup_full_workspace_20260127.sql 2>&1 | tail -50

Nguyên nhân phổ biến:

  • Database name không khớp: Server A có thể dùng database tên twenty thay vì default
  • File backup chứa schema khác: Backup có thể chỉ chứa data của workspace schema (ví dụ: workspace_xxx) chứ không phải toàn bộ database
  • Restore bị lỗi silent: Cần xem output của lệnh restore

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

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ head -100 backup_full_workspace_20260127.sql | grep -i "connect|database"
-- PostgreSQL database dump
-- Dumped from database version 16.11 (Debian 16.11-1.pgdg13+1)

mighty flintBOT
#

File backup được dump từ PostgreSQL nhưng không chỉ định database name cụ thể. Tiếp tục kiểm tra:

1. Xem database name trong docker-compose.yml:

cat docker-compose.yml | grep -i "POSTGRES_DB\|PG_DATABASE"

2. Liệt kê các database hiện có trong container:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "\l"

3. Kiểm tra file backup có những schema nào:

grep -i "CREATE SCHEMA\|SET search_path" backup_full_workspace_20260127.sql | head -20

4. Xem output khi restore có lỗi gì không:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default < backup_full_workspace_20260127.sql 2>&1 | grep -i "error\|fatal\|already exists"

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

  • Database name local đang dùng là gì
  • File backup chứa schema nào
  • Có lỗi gì khi restore không
tropic portal
#
  • vanvo@LAPTOP-VAN:~/twenty-tc$ cat docker-compose.yml | grep -i "POSTGRES_DB|PG_DATABASE"
    PG_DATABASE_URL: ${PG_DATABASE_URL}
    PG_DATABASE_URL: ${PG_DATABASE_URL}
  • vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") 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)
  • vanvo@LAPTOP-VAN:~/twenty-tc$ grep -i "CREATE SCHEMA|SET search_path" backup_full_workspace_20260127.sql | head -20
    CREATE SCHEMA core;
    CREATE SCHEMA workspace_e04r9377ecbknx3lq6bvij7w3;
mighty flintBOT
#

Đã rõ vấn đề. File backup chứa 2 schema:

  • core - schema chính của Twenty
  • workspace_e04r9377ecbknx3lq6bvij7w3 - schema workspace data

Kiểm tra xem data đã được restore chưa:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "\dn"

Kiểm tra tables trong workspace schema:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "\dt workspace_e04r9377ecbknx3lq6bvij7w3.*"

Kiểm tra workspace trong core schema:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, \"displayName\" FROM core.workspace;"

Vấn đề có thể là: Local của bạn đang có workspace ID khác với server A (workspace_e04r9377ecbknx3lq6bvij7w3). Khi login vào Twenty, nó sẽ load workspace của user hiện tại, không phải workspace từ backup.

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

tropic portal
#
  • vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "\dn"
    List of schemas
    Name | Owner
    -------------------------------------+-------------------
    core | postgres
    public | pg_database_owner
    workspace_62ci57mk3qjs59ivrdxms22ut | postgres
    workspace_e04r9377ecbknx3lq6bvij7w3 | postgres
    (4 rows)

  • Lệnh thứ 2 ra danh sách các bảng mình cần đúng rồi

  • vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, "displayName" FROM core.workspace;"
    id | displayName
    --------------------------------------+-------------
    6672d5f4-fdf7-4726-989a-e93e909a7ef5 | Tourchain
    (1 row)

mighty flintBOT
#

Đã thấy vấn đề rồi. Bạn có 2 workspace schema:

  • workspace_62ci57mk3qjs59ivrdxms22ut - workspace cũ của local
  • workspace_e04r9377ecbknx3lq6bvij7w3 - workspace từ backup (server A)

Nhưng trong core.workspace chỉ có 1 record (Tourchain). Cần kiểm tra workspace nào đang active.

1. Kiểm tra workspace ID đang được sử dụng:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, \"displayName\", \"subdomain\" FROM core.workspace;"

2. Kiểm tra user đang link với workspace nào:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT u.email, w.\"displayName\", w.id FROM core.\"user\" u JOIN core.\"userWorkspace\" uw ON u.id = uw.\"userId\" JOIN core.workspace w ON uw.\"workspaceId\" = w.id;"

3. Xem workspace ID trong backup tương ứng với schema nào:

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

Có thể file backup chỉ chứa schema data mà không update lại core.workspacecore.user để link đúng workspace. Bạn cần đảm bảo user login được map với workspace workspace_e04r9377ecbknx3lq6bvij7w3.

Chạy lệnh 1 và 2 rồi gửi kết quả cho mình nhé.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, "displayName", "subdomain" FROM core.workspace;"
id | displayName | subdomain
--------------------------------------+-------------+-----------
6672d5f4-fdf7-4726-989a-e93e909a7ef5 | Tourchain | apple
(1 row)

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT u.email, w."displayName", w.id FROM core."user" u JOIN core."userWorkspace" uw ON u.id = uw."userId" JOIN core.workspace w ON uw."workspaceId" = w.id;"
email | displayName | id
---------------+-------------+--------------------------------------
[email protected] | Tourchain | 6672d5f4-fdf7-4726-989a-e93e909a7ef5
(1 row)

mighty flintBOT
#

Đã rõ vấn đề. Workspace "Tourchain" từ backup đã được restore, nhưng schema ID không khớp.

Vấn đề:

  • Workspace ID: 6672d5f4-fdf7-4726-989a-e93e909a7ef5
  • Nhưng data nằm trong schema: workspace_e04r9377ecbknx3lq6bvij7w3

Cần kiểm tra workspace đang trỏ đến schema nào:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, \"displayName\", \"metadataVersion\" FROM core.workspace;"

Giải pháp: Rename schema cũ và đổi schema từ backup thành schema mà workspace đang sử dụng:

1. Xóa schema local cũ (không cần nữa):

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "DROP SCHEMA IF EXISTS workspace_62ci57mk3qjs59ivrdxms22ut CASCADE;"

2. Kiểm tra workspace cần schema tên gì (thường là dạng hash từ workspace ID). Chạy lệnh này để xem Twenty đang expect schema nào:

docker compose logs server 2>&1 | grep -i "schema\|workspace" | tail -20

Hoặc cách đơn giản hơn - restore lại toàn bộ database từ đầu:

docker compose stop
docker compose up -d db
docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "DROP DATABASE IF EXISTS \"default\";"
docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "CREATE DATABASE \"default\";"
docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default < backup_full_workspace_20260127.sql
docker compose up -d

Thử cách restore lại toàn bộ database và cho mình biết kết quả nhé.

tropic portal
#

ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.attachment" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.taskTarget" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.messageParticipant" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.taskTarget" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.calendarEventParticipant" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.opportunity" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.timelineActivity" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.attachment" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._issue" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.taskTarget" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._agencyevent" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.workflowRun" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.favorite" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.workflowAutomatedTrigger" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.taskTarget" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.favorite" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.timelineActivity" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.person" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.favorite" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.noteTarget" does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3.noteTarget" does not exist
Lỗi nhiều lắm

mighty flintBOT
#

File backup có vấn đề - nó chứa các lệnh INSERT nhưng không có lệnh CREATE TABLE. Có thể backup chỉ dump data mà không dump schema (cấu trúc bảng).

Kiểm tra file backup có chứa CREATE TABLE không:

grep -c "CREATE TABLE" backup_full_workspace_20260127.sql

Kiểm tra file backup được tạo bằng lệnh gì:

head -50 backup_full_workspace_20260127.sql

Nếu file backup thiếu schema, bạn cần backup lại từ server A với đầy đủ cả schema và data:

pg_dump -U postgres -d default --no-owner --no-acl > backup_full.sql

Hoặc nếu dùng Docker trên server A:

docker exec -i <container-db-server-A> pg_dump -U postgres -d default --no-owner --no-acl > backup_full.sql

Chạy 2 lệnh kiểm tra trên và cho mình biết kết quả nhé. Mình cần xác nhận file backup có đầy đủ không.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ grep -c "CREATE TABLE" backup_full_workspace_20260127.sql
91
vanvo@LAPTOP-VAN:~/twenty-tc$ head -50 backup_full_workspace_20260127.sql

-- PostgreSQL database dump

\restrict AToNoact6sUUSsYGFHhj9pogTqP8kVL9IVhRcS01VMpmu3kHc4mUJvM7ylihdAn

-- Dumped from database version 16.11 (Debian 16.11-1.pgdg13+1)
-- Dumped by pg_dump version 16.11 (Debian 16.11-1.pgdg13+1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: core; Type: SCHEMA; Schema: -; Owner: postgres

CREATE SCHEMA core;

ALTER SCHEMA core OWNER TO postgres;

--
-- Name: workspace_e04r9377ecbknx3lq6bvij7w3; Type: SCHEMA; Schema: -; Owner: postgres

CREATE SCHEMA workspace_e04r9377ecbknx3lq6bvij7w3;

ALTER SCHEMA workspace_e04r9377ecbknx3lq6bvij7w3 OWNER TO postgres;

--
-- Name: agentChatMessage_role_enum; Type: TYPE; Schema: core; Owner: postgres

CREATE TYPE core."agentChatMessage_role_enum" AS ENUM (
'user',
'assistant'
);

ALTER TYPE core."agentChatMessage_role_enum" OWNER TO postgres;

mighty flintBOT
#

Thấy vấn đề rồi. File backup có dòng lạ ở đầu:

\restrict AToNoact6sUUSsYGFHhj9pogTqP8kVL9IVhRcS01VMpmu3kHc4mUJvM7ylihdAn

Đây không phải lệnh PostgreSQL hợp lệ, có thể gây lỗi khi restore.

1. Tạo file backup sạch (bỏ dòng lỗi):

sed '1,/^--$/d' backup_full_workspace_20260127.sql > backup_clean.sql

2. Hoặc xóa dòng \restrict cụ thể:

grep -v "^\\\\restrict" backup_full_workspace_20260127.sql > backup_clean.sql

3. Drop và tạo lại database:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "DROP DATABASE IF EXISTS \"default\";"
docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "CREATE DATABASE \"default\";"

4. Restore với file sạch:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default < backup_clean.sql 2>&1 | grep -i "error" | head -20

5. Restart services:

docker compose up -d

Thử các bước trên và cho mình biết kết quả nhé.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default < backup_clean.sql 2>&1 | grep -i "error" | head -20
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.agent" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.agentChatMessage" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.agentChatMessagePart" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.agentChatThread" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.agentHandoff" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.apiKey" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.appToken" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.application" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.applicationVariable" does not exist
ERROR: function public.uuid_generate_v4() does not exist
ERROR: relation "core.approvedAccessDomain" does not exist

mighty flintBOT
#

Lỗi do thiếu extension uuid-ossp. Cần tạo extension trước khi restore.

1. Drop và tạo lại database:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "DROP DATABASE IF EXISTS \"default\";"
docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "CREATE DATABASE \"default\";"

2. Tạo extension uuid-ossp:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";"

3. Restore lại:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default < backup_clean.sql 2>&1 | grep -i "error" | head -20

4. Nếu không còn lỗi, restart services:

docker compose up -d

Chạy thử và cho mình biết kết quả nhé.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default < backup_clean.sql 2>&1 | grep -i "error" | head -20
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._affilate" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._agency" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._agencyNation" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._agencyevent" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._agent" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._bookingReport" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._emailoffice" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._issue" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._nation" does not exist
ERROR: function public.unaccent_immutable(text) does not exist
ERROR: relation "workspace_e04r9377ecbknx3lq6bvij7w3._networkAgency" does not exist

mighty flintBOT
#

Cần thêm extension unaccent và tạo function unaccent_immutable. Làm lại từ đầu:

1. Drop và tạo lại database:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "DROP DATABASE IF EXISTS \"default\";"
docker exec -i $(docker ps -qf "name=db") psql -U postgres -c "CREATE DATABASE \"default\";"

2. Tạo các extensions và function cần thiết:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default <<EOF
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "unaccent";
CREATE OR REPLACE FUNCTION public.unaccent_immutable(text)
RETURNS text AS \$\$
  SELECT public.unaccent('public.unaccent', \$1)
\$\$ LANGUAGE sql IMMUTABLE;
EOF

3. Restore lại:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default < backup_clean.sql 2>&1 | grep -i "error" | head -20

4. Nếu không còn lỗi, restart:

docker compose up -d

Chạy thử nhé.

tropic portal
#

Vào được rồi, nhưng vẫn không có data

mighty flintBOT
#

Kiểm tra xem data đã được restore chưa và workspace nào đang active:

1. Kiểm tra workspace hiện tại:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, \"displayName\", \"subdomain\" FROM core.workspace;"

2. Kiểm tra user đang link với workspace nào:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT u.email, w.\"displayName\" FROM core.\"user\" u JOIN core.\"userWorkspace\" uw ON u.id = uw.\"userId\" JOIN core.workspace w ON uw.\"workspaceId\" = w.id;"

3. Kiểm tra data trong workspace schema từ backup:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT COUNT(*) FROM workspace_e04r9377ecbknx3lq6bvij7w3.company;"

4. Bạn đang login bằng email nào? Kiểm tra email đó có trong database không:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT email FROM core.\"user\";"

Chạy các lệnh trên và cho mình biết:

  • Kết quả các lệnh
  • Email bạn đang dùng để login
tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, "displayName", "subdomain" FROM core.workspace;"
id | displayName | subdomain
--------------------------------------+-------------+-----------------------
ec89f003-0da7-4f86-b8b8-f714b6fe0cb3 | Tourchain | tourchain
0183af99-9b18-4223-8319-7413d1850095 | | cool-green-penguin
92494756-08ab-451b-9105-c7ec3118f948 | Tourchain | awesome-scarlet-hippo
(3 rows)
vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT u.email, w."displayName" FROM core."user" u JOIN core."userWorkspace" uw ON u.id = uw."userId" JOIN core.workspace w ON uw."workspaceId" = w.id;"
email | displayName
-------------------------+-------------
[email protected] | Tourchain
[email protected] | Tourchain
[email protected] | Tourchain
[email protected] | Tourchain
[email protected] | Tourchain
[email protected] | Tourchain
[email protected] | Tourchain
[email protected] |
[email protected] | Tourchain
(9 rows)

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT COUNT(*) FROM workspace_e04r9377ecbknx3lq6bvij7w3.company;"
count

 7

(1 row)
Mình đăng nhập bằng email [email protected]

mighty flintBOT
#

Data đã được restore. Vấn đề là email [email protected] đang link với workspace khác (không phải workspace chứa data workspace_e04r9377ecbknx3lq6bvij7w3).

Kiểm tra workspace nào chứa schema data:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, \"displayName\" FROM core.workspace WHERE id = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3';"

Kiểm tra user của bạn đang link workspace nào:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT w.id, w.\"displayName\", w.\"subdomain\" FROM core.\"user\" u JOIN core.\"userWorkspace\" uw ON u.id = uw.\"userId\" JOIN core.workspace w ON uw.\"workspaceId\" = w.id WHERE u.email = '[email protected]';"

Chạy 2 lệnh trên để xác nhận workspace ID của bạn, sau đó mình sẽ hướng dẫn cách chuyển sang đúng workspace có data.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, "displayName" FROM core.workspace WHERE id = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3';"
id | displayName
--------------------------------------+-------------
ec89f003-0da7-4f86-b8b8-f714b6fe0cb3 | Tourchain
(1 row)

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT w.id, w."displayName", w."subdomain" FROM core."user" u JOIN core."userWorkspace" uw ON u.id = uw."userId" JOIN core.workspace w ON uw."workspaceId" = w.id WHERE u.email = '[email protected]';"
id | displayName | subdomain
--------------------------------------+-------------+-----------------------
92494756-08ab-451b-9105-c7ec3118f948 | Tourchain | awesome-scarlet-hippo
(1 row)

mighty flintBOT
#

Đúng rồi. Email của bạn đang link với workspace 92494756-08ab-451b-9105-c7ec3118f948 (subdomain: awesome-scarlet-hippo), nhưng data nằm trong workspace ec89f003-0da7-4f86-b8b8-f714b6fe0cb3 (subdomain: tourchain).

Cách 1: Truy cập đúng subdomain có data

Thử truy cập URL: http://tourchain.localhost:3000 (hoặc domain tương ứng của bạn)

Cách 2: Chuyển user của bạn sang workspace có data

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "UPDATE core.\"userWorkspace\" SET \"workspaceId\" = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3' WHERE \"userId\" = (SELECT id FROM core.\"user\" WHERE email = '[email protected]');"

Sau đó restart và clear cache:

docker compose restart server

Logout rồi login lại và kiểm tra xem đã thấy data chưa nhé.

tropic portal
mighty flintBOT
#

Kiểm tra xem workspace ec89f003-0da7-4f86-b8b8-f714b6fe0cb3 đang trỏ đến schema nào:

1. Kiểm tra các schema hiện có:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "\dn"

2. Kiểm tra metadata của workspace có data:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, \"displayName\", \"metadataVersion\", \"databaseSchema\" FROM core.workspace WHERE id = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3';"

3. Nếu không có cột databaseSchema, kiểm tra cấu trúc bảng:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "\d core.workspace"

Chạy các lệnh trên để xem workspace đang được map với schema nào nhé.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "\dn"
List of schemas
Name | Owner
-------------------------------------+-------------------
core | postgres
public | pg_database_owner
workspace_8ns09x7vsg5mogz4y3kwiih54 | postgres
workspace_e04r9377ecbknx3lq6bvij7w3 | postgres
(4 rows)

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, "displayName", "metadataVersion", "databaseSchema" FROM core.workspace WHERE id = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3';"
id | displayName | metadataVersion | databaseSchema
--------------------------------------+-------------+-----------------+----------------
ec89f003-0da7-4f86-b8b8-f714b6fe0cb3 | Tourchain | 450 |
(1 row)

mighty flintBOT
#

Vấn đề đây rồi. Cột databaseSchema đang trống. Twenty không biết workspace này dùng schema nào.

Cập nhật databaseSchema để trỏ đến schema có data:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "UPDATE core.workspace SET \"databaseSchema\" = 'workspace_e04r9377ecbknx3lq6bvij7w3' WHERE id = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3';"

Restart server và clear cache:

docker compose restart server worker

Logout, login lại và truy cập http://tourchain.localhost:3000

Thử và cho mình biết kết quả nhé.

tropic portal
#

Vẫn k có data

mighty flintBOT
#

Kiểm tra thêm một số thứ:

1. Xác nhận update đã thành công:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, \"displayName\", \"databaseSchema\" FROM core.workspace;"

2. Kiểm tra user của bạn đang ở workspace nào sau khi update:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT u.email, w.id, w.\"databaseSchema\" FROM core.\"user\" u JOIN core.\"userWorkspace\" uw ON u.id = uw.\"userId\" JOIN core.workspace w ON uw.\"workspaceId\" = w.id WHERE u.email = '[email protected]';"

3. Kiểm tra logs server có lỗi gì không:

docker compose logs server 2>&1 | tail -50

Gửi kết quả cho mình nhé.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT id, "displayName", "databaseSchema" FROM core.workspace;"
id | displayName | databaseSchema
--------------------------------------+-------------+-------------------------------------
0183af99-9b18-4223-8319-7413d1850095 | |
92494756-08ab-451b-9105-c7ec3118f948 | Tourchain |
ec89f003-0da7-4f86-b8b8-f714b6fe0cb3 | Tourchain | workspace_e04r9377ecbknx3lq6bvij7w3
(3 rows)

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT u.email, w.id, w."databaseSchema" FROM core."user" u JOIN core."userWorkspace" uw ON u.id = uw."userId" JOIN core.workspace w ON uw."workspaceId" = w.id WHERE u.email = '[email protected]';"
email | id | databaseSchema
-------------------------+--------------------------------------+----------------
[email protected] | 92494756-08ab-451b-9105-c7ec3118f948 |
(1 row)

mighty flintBOT
#

Thấy rồi. User của bạn vẫn đang ở workspace 92494756-08ab-451b-9105-c7ec3118f948 (không có data), chưa được chuyển sang workspace ec89f003-0da7-4f86-b8b8-f714b6fe0cb3 (có data).

Chuyển user sang đúng workspace:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "UPDATE core.\"userWorkspace\" SET \"workspaceId\" = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3' WHERE \"userId\" = (SELECT id FROM core.\"user\" WHERE email = '[email protected]');"

Xác nhận đã update:

docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "SELECT u.email, w.id, w.\"databaseSchema\" FROM core.\"user\" u JOIN core.\"userWorkspace\" uw ON u.id = uw.\"userId\" JOIN core.workspace w ON uw.\"workspaceId\" = w.id WHERE u.email = '[email protected]';"

Restart server:

docker compose restart server worker

Sau đó logout, login lại và kiểm tra nhé.

tropic portal
#

vanvo@LAPTOP-VAN:~/twenty-tc$ docker exec -i $(docker ps -qf "name=db") psql -U postgres -d default -c "UPDATE core."userWorkspace" SET "workspaceId" = 'ec89f003-0da7-4f86-b8b8-f714b6fe0cb3' WHERE "userId" = (SELECT id FROM core."user" WHERE email = '[email protected]');"
ERROR: more than one row returned by a subquery used as an expression