Việc vận hành một hệ thống Supabase Self-Hosted mang lại cho bạn quyền kiểm soát tuyệt đối về dữ liệu và chi phí. Tuy nhiên, đến một lúc nào đó, chiếc VPS hiện tại của bạn có thể trở nên quá tải, hoặc bạn tìm được một nhà cung cấp VPS khác có hiệu năng tốt hơn với giá hời hơn. Đó là lúc bạn cần nghĩ đến việc Migrate (Di dời) hệ thống của mình sang một ngôi nhà mới.
Rất nhiều bạn lo lắng rằng việc di chuyển này sẽ phức tạp, dễ gây mất mát dữ liệu hoặc làm hỏng các cấu hình đã chạy ổn định. Đặc biệt là khi bạn đã có một lượng dữ liệu người dùng (Users), Database và Storage đáng kể. Thêm vào đó là nỗi lo về việc downtime (gián đoạn dịch vụ) quá lâu trong quá trình chuyển đổi.
Đừng lo lắng! Bài viết này sẽ là kim chỉ nam chi tiết nhất, hướng dẫn bạn từng bước cách di dời Supabase Docker từ VPS cũ sang VPS mới một cách an toàn nhất. Đặc biệt, chúng ta sẽ sử dụng phương pháp VPS-to-VPS transfer để đảm bảo tốc độ nhanh nhất, và thiết lập Nginx Proxy Manager để quản lý domain cũng như bảo mật cho Dashboard (Studio) của bạn.
Bước 1: Hiểu Rõ “Trái Tim” Của Supabase Self-Hosted
Trước khi bắt tay vào làm, bạn cần hiểu rõ cấu trúc file của Supabase để biết mình cần copy cái gì và có thể bỏ qua cái gì. Khi bạn cài đặt Supabase bằng Docker, bạn có thể thấy trong thư mục /opt/supabase có rất nhiều folder con như apps, packages, examples…

Thực tế là: 99% những thứ quan trọng nhất nằm gói gọn trong folder docker. Những folder còn lại hầu hết là source code của dự án Supabase (Next.js apps, thư viện…) mà Docker Container không hề sử dụng trực tiếp để chạy. Docker chạy dựa trên các “Image” đã được build sẵn (ví dụ supabase/studio:latest, supabase/postgres:15), nên việc copy source code là không cần thiết.
Trong folder docker, chúng ta có 3 thành phần “bất khả xâm phạm”:
docker-compose.yml: Đây là bản thiết kế của hệ thống. Nó quy định các service nào sẽ chạy (Database, Auth, Storage, Realtime…), port nào được mở, và các volume nào được mount..env: Đây là nơi chứa toàn bộ bí mật của bạn. Mật khẩu Database (POSTGRES_PASSWORD), JWT Secret (để tạo token), các API Keys (Anon Key, Service Role Key). Mất file này coi như mất quyền kiểm soát hệ thống.volumes/: Quan trọng nhất làvolumes/db/data. Đây là nơi chứa dữ liệu sống của PostgreSQL. Nếu bạn chỉ copy file cấu hình mà quên folder này, bạn sẽ có một Supabase mới tinh nhưng… trống rỗng.
Bước 2: Chuẩn Bị “Nhà Mới” (VPS Đích)
Bạn cần chuẩn bị một VPS mới sạch sẽ (Fresh Install). Hệ điều hành khuyến nghị là Ubuntu 20.04 LTS hoặc 22.04 LTS để đảm bảo tính ổn định và tương thích tốt nhất với Docker.
Đầu tiên, hãy SSH vào VPS mới và cập nhật hệ thống:
sudo apt update && sudo apt upgrade -yTiếp theo, cài đặt Docker và Docker Compose plugin. Cách nhanh nhất và chuẩn nhất là dùng script cài đặt tự động của chính Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.shSau khi cài xong, hãy kiểm tra xem Docker đã chạy chưa:
sudo docker --version
sudo docker compose versionNếu thấy hiện version đầy đủ nghĩa là bạn đã sẵn sàng đế đón nhận dữ liệu.
Bước 3: Chuyển Dữ Liệu (“Bắn” Data Qua Rsync)
Thay vì cách truyền thống là: Download 10GB dữ liệu về máy tính cá nhân (mạng chậm) -> Upload 10GB lên VPS mới (mạng chậm), chúng ta sẽ dùng Rsync để chuyển dữ liệu trực tiếp giữa 2 VPS. Tốc độ sẽ cực nhanh vì tận dụng băng thông datacenter.

Tại sao lại dùng Rsync thay vì SCP?
- Resume (Tiếp tục): Nếu đang copy được 90% mà rớt mạng, chạy lại lệnh Rsync nó sẽ chạy tiếp từ 90%. SCP sẽ phải chạy lại từ đầu.
- Bảo toàn thuộc tính: Rsync giữ nguyên quyền (permissions), thời gian (timestamps) của file, rất quan trọng với các file Database.
- Nén dữ liệu: Cờ
-zgiúp nén dữ liệu khi truyền, tiết kiệm băng thông.
Thực hiện:
1. Trên VPS Mới: Hãy tạo trước thư mục cha để tránh việc copy nhầm đường dẫn:
# Tạo thư mục /opt/supabase
mkdir -p /opt/supabase2. Trên VPS Cũ: Chạy lệnh Rsync sau. Lệnh này sẽ yêu cầu nhập mật khẩu root của VPS mới.
# Chạy lệnh này TỪ VPS CŨ
# IP_VPS_MOI: Thay bằng IP của server mới (VD: 116.118.x.x)
rsync -avzP /opt/supabase/docker/ root@IP_VPS_MOI:/opt/supabase/docker/Lưu ý dấu / ở cuối đường dẫn nguồn rất quan trọng. Nếu bạn viết sai, có thể folder docker sẽ bị lồng vào nhau (ví dụ docker/docker). Lệnh trên là chuẩn nhất.
Bước 4: Khởi Chạy Supabase Ở Nhà Mới
Sau khi thanh progress bar của Rsync chạy xong (đạt 100%), chúc mừng bạn, toàn bộ linh hồn của hệ thống cũ đã sang nhà mới. Giờ hãy đánh thức nó dậy.
Trên VPS Mới:
cd /opt/supabase/docker
# (Tùy chọn) Kiểm tra lại file .env xem có cần chỉnh sửa gì không
cat .env
# Khởi chạy các container
docker compose up -dLần chạy đầu tiên sẽ mất vài phút để Docker pull các images về. Hãy kiên nhẫn. Sau khi xong, hãy kiểm tra logs để chắc chắn không có lỗi:
docker compose logs -fBước 5: Cấu Hình Nginx Proxy Manager & SSL
Supabase mặc định chỉ mở các port local (như 8000, 3000) hoặc port nội bộ. Để người dùng truy cập được qua domain đẹp (https://api.your-domain.com) và bảo mật SSL, bạn cần một Reverse Proxy. Nginx Proxy Manager (NPM) là lựa chọn tuyệt vời vì có giao diện trực quan.

Bạn cần tạo 2 Proxy Hosts riêng biệt:
1. API Gateway (Quan trọng nhất)
- Domain Names:
api.your-domain.com(hoặc domain API của bạn) - Forward Hostname / IP:
172.17.0.1(Đây là IP Gateway mặc định của Docker, giúp NPM trỏ ngược về container trên cùng host). - Forward Port:
8008(Đây là port của Kong/API Gateway trong Supabase). - Websockets Support: BẮT BUỘC BẬT (Supabase Realtime dùng cái này).
- SSL Tab: Request a new Let’s Encrypt Certificate, Force SSL, HTTP/2 Support.
2. Studio Dashboard (Giao diện quản lý)
- Domain Names:
studio.your-domain.com - Forward Hostname / IP:
172.17.0.1 - Forward Port:
3003(Port mặc định của Studio). - Websockets Support: Bật.
- SSL Tab: Cấu hình tương tự như trên.
Sau khi cấu hình xong NPM, việc cuối cùng là vào trang quản lý tên miền (DNS) của bạn, trỏ 2 sub-domain trên về IP của VPS Mới. Đợi khoảng 5-10 phút để DNS cập nhật.
Bước 6: Bảo Mật Cấp Cao (Access Lists)
Một lỗ hổng lớn của Supabase Self-Hosted bản community là phần Studio Dashboard không có trang đăng nhập. Bất kỳ ai biết đường dẫn studio.your-domain.com đều có thể vào xem và sửa dữ liệu của bạn. Điều này cực kỳ nguy hiểm.
Nhưng với Nginx Proxy Manager, chúng ta có thể vá lỗ hổng này dễ dàng bằng tính năng Access Lists (Giới hạn truy cập).

Cách thực hiện:
- Trong NPM, vào tab Access Lists, bấm Add Access List.
- Đặt tên là
Admin-Only. - Ở tab Authorization, hãy thêm Username và Password mà chỉ mình bạn biết.
- (Mẹo nâng cao) Ở tab Access, bạn có thể điền IP tĩnh của công ty/nhà riêng vào và chọn Action: Allow. Sau đó bật tùy chọn Satisfy Any.
- Nghĩa là: Nếu đúng IP “nhà”, vào thẳng không hỏi han gì.
- Nếu IP lạ (ra quán cafe), hệ thống sẽ hiện popup hỏi mật khẩu.
- Lưu lại (Save).
- Quay lại Proxy Hosts, sửa dòng
studio.your-domain.com. Tại tab Details, mục Access List, chọnAdmin-Only.
Lời Kết
Việc di dời server không đáng sợ như bạn nghĩ nếu chúng ta hiểu rõ bản chất của Docker và biết cách sử dụng các công cụ như Rsync. Với hướng dẫn trên, bạn không chỉ chuyển nhà thành công mà còn nâng cấp được hệ thống bảo mật cho Supabase của mình.
Hãy nhớ luôn backup dữ liệu định kỳ (cronjob backup folder docker) để đề phòng bất trắc. Chúc các bạn thành công!

