Hướng dẫn chi tiết cái đặt và sử dụng Supabase bằng Docker Compose trên Ubuntu
Bạn đang tìm kiếm một giải pháp Backend-as-a-Service (BaaS) mã nguồn mở, mạnh mẽ và dễ tự host? Supabase chính là lựa chọn hoàn hảo! Trong bài viết này, mình sẽ chia sẻ toàn bộ kinh nghiệm từ A-Z về cách cài đặt và sử dụng Supabase bằng Docker Compose trên Ubuntu. Từ những bước chuẩn bị ban đầu đến việc xử lý các lỗi thường gặp – tất cả đều được trình bày một cách chi tiết và dễ hiểu nhất.
Supabase là gì? Tại sao nên chọn thay thế Firebase?
Supabase là một nền tảng Backend-as-a-Service (BaaS) mã nguồn mở, được xây dựng như một giải pháp thay thế mạnh mẽ cho Firebase. Điểm khác biệt lớn nhất của Supabase so với Firebase chính là việc sử dụng PostgreSQL – một hệ quản trị cơ sở dữ liệu quan hệ ổn định với hơn 30 năm phát triển.
Tính năng chính của Supabase
- Cơ sở dữ liệu PostgreSQL: Mỗi project là một cơ sở dữ liệu PostgreSQL đầy đủ tính năng, cho phép thực hiện các truy vấn SQL phức tạp.
- API tự động: Supabase tự động tạo REST API và GraphQL từ schema cơ sở dữ liệu mà không cần viết một dòng code nào.
- Xác thực người dùng: Hỗ trợ đăng nhập qua email/mật khẩu, OAuth (Google, GitHub, Facebook, v.v.), và magic links.
- Thời gian thực (Realtime): Lắng nghe thay đổi dữ liệu qua WebSockets, hỗ trợ xây dựng ứng dụng multiplayer.
- Lưu trữ (Storage): Quản lý file (hình ảnh, video) với tích hợp S3, bao gồm image transformations.
- Edge Functions: Chạy logic backend tùy chỉnh gần người dùng mà không cần deploy server riêng.
- Vector Embeddings: Hỗ trợ ứng dụng AI với khả năng lưu trữ và tìm kiếm vector.
Lý do nên tự host Supabase bằng Docker Compose
Việc tự host Supabase mang lại nhiều lợi ích vượt trội:
- Kiểm soát hoàn toàn: Bạn sở hữu dữ liệu và có thể tùy chỉnh theo nhu cầu
- Tiết kiệm chi phí: Không bị giới hạn bởi pricing plans của cloud service
- Bảo mật cao: Dữ liệu được lưu trữ trên infrastructure của chính bạn
- Linh hoạt triển khai: Có thể deploy trên bất kỳ server nào
Chuẩn bị: Cài đặt Docker & Docker Compose
Trước khi bắt đầu với Supabase, chúng ta cần cài đặt Docker và Docker Compose trên Ubuntu. Đây là bước quan trọng để đảm bảo môi trường containerized hoạt động ổn định.
Kiểm tra hệ thống
Đầu tiên, hãy cập nhật hệ thống và kiểm tra phiên bản Ubuntu:
sudo apt update
sudo apt upgrade -y
lsb_release -a
Bước 1: Cài đặt các gói phụ thuộc
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
Bước 2: Thêm GPG Key và Repository của Docker
# Thêm Docker's official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Thêm Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Bước 3: Cài đặt Docker Engine
# Cập nhật package list
sudo apt update
# Cài đặt Docker
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Bước 4: Khởi động và kiểm tra Docker
# Khởi động Docker service
sudo systemctl enable docker
sudo systemctl start docker
# Kiểm tra trạng thái
sudo systemctl status docker
# Test với hello-world image
sudo docker run hello-world
Bước 5: Thêm User vào Docker Group (Tùy chọn)
Để chạy Docker commands mà không cần sudo:
sudo usermod -aG docker $USER
# Logout và login lại để apply changes
newgrp docker
Bước 6: Kiểm tra Docker Compose
Docker Compose hiện đã được tích hợp sẵn trong Docker Engine:
docker compose version
Tải và cấu hình Supabase
Bây giờ chúng ta sẽ tải source code Supabase và chuẩn bị cấu hình cho môi trường self-hosted.
Bước 1: Clone Repository Supabase
# Clone repository chính thức
git clone --depth 1 https://github.com/supabase/supabase
# Tạo thư mục project riêng
mkdir supabase-project
# Copy các file Docker cần thiết
cp -rf supabase/docker/* supabase-project/
# Copy file cấu hình mẫu
cp supabase/docker/.env.example supabase-project/.env
# Di chuyển vào thư mục project
cd supabase-project
Bước 2: Cấu hình file Environment
Mở file .env
và cập nhật các thông số quan trọng:
nano .env
Các biến môi trường cần thay đổi:
# Secrets - PHẢI THAY ĐỔI TRƯỚC KHI PRODUCTION
############
POSTGRES_PASSWORD=your-super-secret-postgres-password
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long
ANON_KEY=your-anon-key
SERVICE_ROLE_KEY=your-service-role-key
############
# Dashboard Authentication
############
DASHBOARD_USERNAME=your-username
DASHBOARD_PASSWORD=your-secure-password
############
# Database
############
POSTGRES_HOST=db
POSTGRES_DB=postgres
POSTGRES_PORT=5432
############
# API Gateway
############
KONG_HTTP_PORT=8000
KONG_HTTPS_PORT=8443
############
# Site Configuration
############
SITE_URL=http://localhost:8000
SUPABASE_PUBLIC_URL=http://localhost:8000
LƯU Ý QUAN TRỌNG:
Tuyệt đối không sử dụng các giá trị mặc định trong production. Hãy tạo JWT secrets mạnh và unique cho mỗi deployment.
Tạo và chạy Supabase Container
Với cấu hình đã sẵn sàng, chúng ta có thể khởi động toàn bộ stack Supabase.
Bước 1: Pull các Docker Images
# Tải các images mới nhất
docker compose pull
Bước 2: Khởi động Services
# Start tất cả services trong chế độ detached
docker compose up -d
Bước 3: Kiểm tra trạng thái Services
# Xem danh sách containers đang chạy
docker compose ps
# Kiểm tra logs nếu cần
docker compose logs -f
Tất cả services nên có status running (healthy)
. Nếu thấy status created
nhưng không running
, hãy thử khởi động service đó thủ công:
docker compose start <service-name>
Truy cập Supabase Studio & APIs
Sau khi toàn bộ stack đã khởi động thành công, bạn có thể truy cập các dịch vụ của Supabase.
Truy cập Supabase Studio (Dashboard)
Mở trình duyệt và truy cập: http://localhost:8000
hoặc http://<your-server-ip>:8000
Thông tin đăng nhập mặc định:
- Username:
supabase
(hoặc giá trị trongDASHBOARD_USERNAME
) - Password:
this_password_is_insecure_and_should_be_updated
(hoặc giá trị trongDASHBOARD_PASSWORD
)
Quan trọng: Đổi username/password ngay sau khi đăng nhập lần đầu!
Truy cập các APIs
Supabase cung cấp nhiều endpoints API thông qua Kong gateway:
- REST API:
http://localhost:8000/rest/v1/
- Authentication API:
http://localhost:8000/auth/v1/
- Storage API:
http://localhost:8000/storage/v1/
- Realtime API:
http://localhost:8000/realtime/v1/
Kết nối Database Postgres
Supabase sử dụng Supavisor connection pooler để quản lý kết nối database hiệu quả:
Session-based connections:
psql 'postgres://postgres.your-tenant-id:your-super-secret-and-long-postgres-password@localhost:5432/postgres'
Pooled transactional connections:
psql 'postgres://postgres.your-tenant-id:your-super-secret-and-long-postgres-password@localhost:6543/postgres'
Bảo mật & cấu hình nâng cao
Để đảm bảo an toàn cho production environment, cần thực hiện một số bước bảo mật quan trọng.
Tạo JWT Keys bảo mật
Sử dụng một JWT Secret mạnh (ít nhất 32 ký tự) và tạo các API keys tương ứng. Bạn có thể sử dụng các công cụ online để generate JWT tokens hoặc tạo bằng Node.js:
const jwt = require('jsonwebtoken');
const secret = 'your-super-secret-jwt-token-with-at-least-32-characters-long';
// Tạo anon key
const anonToken = jwt.sign({ role: 'anon' }, secret);
console.log('ANON_KEY:', anonToken);
// Tạo service role key
const serviceToken = jwt.sign({ role: 'service_role' }, secret);
console.log('SERVICE_ROLE_KEY:', serviceToken);
Cấu hình SMTP Server
Để gửi email xác thực, cấu hình SMTP server trong file .env
:
[email protected]
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
[email protected]
SMTP_PASS=your-app-password
SMTP_SENDER_NAME=Your App Name
Cập nhật và Restart Services
Sau khi thay đổi cấu hình, restart toàn bộ stack:
# Stop và remove containers
docker compose down
# Recreate và start lại
docker compose up -d
Lỗi thường gặp & cách xử lý
Dựa trên kinh nghiệm thực tế, đây là những lỗi phổ biến và cách khắc phục:
Lỗi port đã được sử dụng
- Hiện tượng:
Error: bind: address already in use
- Nguyên nhân: Port 8000 hoặc 5432 đã bị service khác chiếm dụng
- Cách khắc phục:
# Kiểm tra port đang được sử dụng
sudo netstat -tulpn | grep :8000
sudo netstat -tulpn | grep :5432
# Đổi port trong file .env
KONG_HTTP_PORT=8001 # Thay vì 8000
POSTGRES_PORT=5433 # Thay vì 5432
# Restart services
docker compose down && docker compose up -d
Lỗi Container Supabase-Vector Exited (0)
- Hiện tượng: Container
supabase-vector
thoát với code 0 - Nguyên nhân: Docker socket location không đúng với rootless docker
- Cách khắc phục:
# Chỉnh DOCKER_SOCKET_LOCATION trong .env
DOCKER_SOCKET_LOCATION=/run/user/1000/docker.sock
# Hoặc nếu dùng root docker
DOCKER_SOCKET_LOCATION=/var/run/docker.sock
Lỗi Database Connection
- Hiện tượng: Không thể kết nối database từ applications
- Nguyên nhân: Sai thông tin connection string hoặc chưa expose port
- Cách khắc phục:
# Kiểm tra container đang chạy
docker compose ps
# Xem logs database service
docker compose logs db
# Kiểm tra connection string format
postgres://postgres:[POSTGRES_PASSWORD]@[your-server-ip]:5432/[POSTGRES_DB]
Lỗi Authentication Email Links bị Broken
- Hiện tượng: Links trong email xác thực không hoạt động
- Nguyên nhân: Bug trong Supabase khi sử dụng SMTP
- Cách khắc phục:
# Thêm biến môi trường vào docker-compose.yml
# Trong service auth/gotrue section:
API_EXTERNAL_URL: ${SITE_URL}
Lỗi Permission Denied với Volumes
- Hiện tượng: Container không thể ghi vào mounted volumes
- Nguyên nhân: User/group permissions không đúng
- Cách khắc phục:
# Kiểm tra ownership của volumes directory
ls -la volumes/
# Thay đổi ownership nếu cần
sudo chown -R $USER:$USER volumes/
# Hoặc set permissions rộng hơn
sudo chmod -R 755 volumes/
Tips & kinh nghiệm thực tế
Monitoring & Maintenance
Backup định kỳ: Luôn backup database và volumes directory
# Backup database
docker exec -t $(docker compose ps -q db) pg_dumpall -c -U postgres > backup_$(date +%Y%m%d_%H%M%S).sql
# Backup volumes
tar -czf volumes_backup_$(date +%Y%m%d_%H%M%S).tar.gz volumes/
Cập nhật services: Theo dõi Supabase Docker Hub để cập nhật các image mới
# Update specific service (ví dụ: studio)
# Sửa version trong docker-compose.yml
# image: supabase/studio:latest -> supabase/studio:20241029-46e1e40
docker compose pull studio
docker compose up -d studio
Performance Optimization
Tăng memory limit cho database:
# Trong docker-compose.yml
db:
image: supabase/postgres:latest
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 1G
Cấu hình connection pooling:
# Trong .env file
POOLER_DEFAULT_POOL_SIZE=25
POOLER_MAX_CLIENT_CONN=100
Security Best Practices
- Thay đổi tất cả passwords và secrets mặc định
- Sử dụng firewall để restrict access đến ports
- Enable SSL/TLS cho production
- Regularly update các Docker images
- Monitor logs để phát hiện suspicious activities
Tự host Supabase bằng Docker Compose trên Ubuntu không chỉ mang lại sự kiểm soát hoàn toàn mà còn tiết kiệm đáng kể chi phí so với việc sử dụng cloud services. Với hướng dẫn chi tiết này, bạn đã có thể:
- Hiểu rõ về Supabase và lý do nên chọn nó thay thế Firebase
- Cài đặt thành công Docker và Docker Compose trên Ubuntu
- Deploy một Supabase stack hoàn chỉnh với tất cả tính năng
- Xử lý các lỗi thường gặp và tối ưu hóa performance
- Áp dụng các best practices về bảo mật
Supabase với sức mạnh của PostgreSQL, tính năng realtime, authentication system mạnh mẽ và ecosystem mã nguồn mở sẽ là nền tảng lý tưởng cho các dự án từ startup đến enterprise. Hãy bắt đầu xây dựng ứng dụng của bạn và trải nghiệm sự linh hoạt của việc self-hosting!
Chúc bạn thành công với Supabase! Nếu gặp khó khăn trong quá trình triển khai, đừng ngần ngại tham khảo documentation chính thức hoặc community forum để được hỗ trợ kịp thời.