Build internal admin dashboard với Retool self-host trên VPS

Chia sẻ bài viết

Mục lục
TL;DR
  • Retool = low-code platform để build admin dashboard, internal tool trong vài giờ thay vì vài tuần code.
  • Community edition self-host miễn phí (cap 5 users), trả phí khi vượt - hoặc dùng alternatives như Appsmith.
  • Drag-drop component, connect Postgres/MySQL/MongoDB/REST/GraphQL, viết JS transform giữa các step.
  • Phù hợp build admin user management, order processing, content moderation, sales dashboard.
  • 1 VPS 4-8 GB RAM đủ cho team 5-20 maker, deploy 30 phút bằng docker compose chính thức.

Startup 20 người, có Postgres user 50k record. Customer support cần xem profile user, edit địa chỉ, refund order. Operations cần dashboard đếm đơn pending. Marketing cần export user theo cohort gửi mail. Mỗi yêu cầu = 1 ticket dev xây tool nội bộ. 1 tool đơn giản mất 1 tuần frontend + backend. Dev thấy chán làm CRUD admin lặp đi lặp lại. Retool là answer: PM/ops kéo thả tool trong 30 phút, dev chỉ cấp credentials database.

Bài này hướng dẫn deploy Retool self-host community edition, kết nối Postgres, build dashboard mẫu, set role permission, kèm so sánh với alternatives open source (Appsmith, ToolJet, NocoDB) khi nào nên chọn cái nào.

Retool community vs cloud vs alternatives

OptionCostLimitTốt cho
Retool Cloud10-65 USD/user/thángKhông giới hạnTeam không có DevOps
Retool Self-host CE05 usersTest, MVP, dev solo
Retool Self-host paid~50 USD/user/thángKhông giới hạnCompliance, scale
Appsmith0 self-host unlimited usersFeature giới hạn paidOpen source, team trung
ToolJet0 self-host unlimitedTương tự AppsmithCộng đồng đang mạnh
NocoDB0 self-host unlimitedFocus DB UI, ít workflowSpreadsheet-style

Bài này tập trung Retool self-host. Nếu team vượt 5 user và không muốn trả phí Retool, đề xuất chuyển sang Appsmith hoặc ToolJet - 90% feature tương đương, miễn phí unlimited.

Yêu cầu VPS

Quy mô maker / appRAMvCPUSSD
1-3 maker, 5 app4 GB2 vCPU40 GB
5-10 maker, 20 app8 GB4 vCPU80 GB
10-30 maker, 50+ app16 GB4-6 vCPU160 GB

Retool stack: api-service (Node) + frontend (React) + workflow-service + Postgres + Redis. Khoảng 5-7 container, RAM khoảng 2-4 GB lúc idle, vọt khi nhiều user truy cập đồng thời.

Deploy Retool community edition

# Cài Docker + Compose
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker

# Clone repo Retool on-premise
cd /srv
sudo git clone https://github.com/tryretool/retool-onpremise.git retool
cd retool

# Generate JWT secret và encryption key
openssl rand -hex 256
openssl rand -hex 16
# Lưu lại 2 chuỗi này, paste vào docker.env

Sửa file docker.env:

NODE_ENV=production
SERVICE_TYPE=MAIN_BACKEND,DB_CONNECTOR,DB_SSH_CONNECTOR

JWT_SECRET=paste-chuoi-256-bit-here
ENCRYPTION_KEY=paste-chuoi-16-bit-here

POSTGRES_DB=hammerhead_production
POSTGRES_USER=retool_internal_user
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_PASSWORD=strong-postgres-pw

DOMAINS=retool.your-domain.com
COOKIE_INSECURE=false
TRUST_PROXY=true

# Tắt analytics gửi về Retool
DISABLE_INTERCOM=true
sudo docker compose up -d
# Đợi 2-3 phút cho images pull + DB init
sudo docker compose ps

# Xem log nếu lỗi
sudo docker compose logs -f api

Đặt Caddy reverse proxy trước port 3000:

retool.your-domain.com {
  reverse_proxy 127.0.0.1:3000
  encode gzip
}

Vào retool.your-domain.com, đăng ký tài khoản admin đầu tiên. Tạo org name, password mạnh.

Kết nối Postgres production của bạn

  1. Vào Resources -> Create New -> Resource -> PostgreSQL.
  2. Name: "Prod DB Read-only".
  3. Host: db.your-domain.com (hoặc IP private nếu cùng VPN).
  4. Port 5432, Database: production, Username: retool_readonly, Password.
  5. SSL: enable (production luôn).
  6. Test query: SELECT 1.
  7. Save.

Best practice: tạo user Postgres riêng retool_readonly với grant SELECT trên các bảng cần thiết. Tạo user retool_writer riêng cho action mutate, dùng resource riêng có additional approval workflow.

Build dashboard mẫu: user management

  1. Create New -> App -> Blank.
  2. Đặt tên "User Management".
  3. Drag Table component vào canvas.
  4. Click Table -> Data -> Query: tạo query mới get_users: SELECT id, email, name, created_at, plan FROM users ORDER BY id DESC LIMIT {{ pageSize.value }} OFFSET {{ (pageIndex.value-1)*pageSize.value }}
  5. Bind data Table = {{ get_users.data }}.
  6. Drag Text Input "Search" + Button "Run". Set Button onClick: trigger get_users với param từ Search.
  7. Drag Modal Edit User. Inside modal đặt form input bind với selected row của Table.
  8. Tạo query update_user: UPDATE users SET name=$1, plan=$2 WHERE id=$3 với param từ form.
  9. Button Save trong modal trigger update_user và refresh get_users sau.

30 phút xong 1 admin tool xem user, search, edit. So với code Next.js + Tailwind + Prisma làm tương tự: 1-2 ngày. Lợi ích Retool rõ nhất ở ROI thời gian này.

Tích hợp REST API nội bộ

Resources -> REST API. Base URL https://api.your-domain.com. Auth: API key trong header. Trong app, query mới chọn resource này, gọi GET /orders?status=pending, bind response vào table. Có thể chain: kết quả call A là input call B (transformer JavaScript).

Transformer mạnh: viết JavaScript thuần sandbox để xử lý data trước render. Ví dụ format ngày, tính tổng, group by:

const orders = data.orders;
const grouped = orders.reduce((acc, o) => {
  acc[o.status] = (acc[o.status] || 0) + o.total_vnd;
  return acc;
}, {});
return Object.entries(grouped).map(([status, total]) => ({ status, total }));

Role và permission

Vào Settings -> Groups, tạo group: admins, support, marketing. Mỗi group có quyền truy cập tới apps cụ thể. Trong app, từng component có thể có permission per group (vd "Refund button" chỉ admins thấy). Audit log ghi mọi action: ai gọi query nào, sửa user nào, lúc nào - hữu ích compliance.

SSO với Google Workspace

Community edition không có SSO native. Workaround: đặt Authelia/Authentik trước Retool, login qua SSO rồi forward header. Hoặc upgrade lên Retool paid để có SSO official. Đối với 5 user team, manual create user là OK.

Backup và restore

  • Backup Postgres hammerhead_production hằng đêm - chứa toàn bộ app definition, query, resource credentials (encrypted).
  • Export app dạng JSON qua Retool UI cho version control: Settings -> Export App.
  • Sync app JSON vào Git repo nội bộ để track change, review PR.
  • Test restore VPS staging hằng quý.

Khi nào chuyển sang Appsmith hoặc ToolJet?

  • Khi team vượt 5 user và không muốn trả ~50 USD/user/tháng.
  • Khi cần extension custom component sâu (Appsmith open hơn).
  • Khi cần data sovereignty tuyệt đối (Retool source code không 100% open).
  • Khi build app cho khách hàng (white-label) - Retool license cấm.

Appsmith và ToolJet đang tăng tốc nhanh, gần parity Retool. UI ToolJet thoáng hơn, Appsmith JS API mạnh hơn.

Bẫy thường gặp

Triệu chứngCách fix
Login lỗi cookieSet TRUST_PROXY=true, COOKIE_INSECURE=false, dùng HTTPS
Query Postgres timeoutTăng query timeout trong resource settings, optimize SQL
App load chậmTách query thành nhiều cái nhỏ, dùng pagination
Vượt 5 user CEUpgrade paid, hoặc migrate sang Appsmith/ToolJet
Cập nhật phá vỡ appSnapshot VPS + backup DB trước upgrade major
Cloud VPS cho vibe coder

VPS đủ chỗ cho Retool + Postgres + Redis admin nội bộ

Cloud VPS TND sẵn AlmaLinux 9, Ubuntu 22/24, Debian 12/13. SSD CEPH, snapshot 1-click, backup hằng ngày, network 200Mbps trong nước. Gói 8GB RAM thoải mái chạy Retool + DB + reverse proxy cho team 10 maker xây dashboard nội bộ.

Xem 8 cấu hình Cloud VPS →

FAQ

Retool CE có thật sự miễn phí mãi mãi không?

Có, miễn phí cho tối đa 5 end-users (developer + viewer). Không giới hạn số app, query, resource. Đủ cho team founder + 2 cofounder + 2 ops. Khi vượt, hoặc upgrade paid hoặc migrate.

Có thể version control app bằng Git không?

Có. Retool paid có Git Sync built-in. CE thì manual: export app JSON, commit vào Git, khi rollback thì import lại. Khuyến nghị review thay đổi app qua PR như code thường.

Performance Retool có đủ cho 1M record bảng không?

Có nếu phân trang đúng. Query với LIMIT/OFFSET, table component dùng server-side pagination. Tránh load 1M record vào client cùng lúc - browser sẽ lag. Index Postgres trên column hay filter giúp query < 200ms ngay cả với 10M record.

Có chống được SQL injection trong query Retool không?

Có, Retool dùng prepared statement với placeholder {{ var }}. Tránh dùng template literal raw concatenate. Cấu hình query để chỉ đọc với user Postgres readonly là an toàn nhất. Cấp write permission từng query khi cần.

Khi nào không nên dùng Retool?

Khi xây user-facing app cho khách hàng cuối (Retool license cấm, performance không tối ưu cho hàng triệu user). Khi cần UX cực kỳ tinh chỉnh (component Retool có giới hạn theme). Khi đã có team frontend mạnh và workflow CI/CD ổn định cho admin tool - dev tự xây nhanh không kém.