คำตอบสั้น ๆ: ติดตั้ง Metabase ให้ทีมงานสร้างรายงานและ Dashboard จากฐานข้อมูลได้เองโดยไม่ต้องเขียน SQL และไม่ต้องให้สิทธิ์เข้าฐานข้อมูลโดยตรง
คู่มือนี้อธิบาย Metabase ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
คำถามที่ฝ่าย IT ได้รับซ้ำ ๆ คือขอตัวเลขยอดขายเดือนนี้ ขอรายชื่อลูกค้าที่ไม่ได้สั่งซื้อเกินสามเดือน ซึ่งแต่ละครั้งต้องเขียน SQL แล้วส่งไฟล์ให้ Metabase แก้ปัญหานี้โดยให้ทีมงานสร้างคำถามเองผ่านหน้าจอลากวาง
ข้อดีด้านความปลอดภัยคือทีมงานไม่ต้องได้สิทธิ์เข้าฐานข้อมูลโดยตรง Metabase เป็นตัวกลางที่ควบคุมได้ว่าใครเห็นตารางไหนและแถวไหน
สิ่งที่ต้องเตรียม
- Cloud VPS ที่มี RAM อย่างน้อย 2 GB
- ฐานข้อมูลที่ต้องการทำรายงาน และสิทธิ์อ่านข้อมูลนั้น
- โดเมนย่อยสำหรับเข้าหน้าจอ
ขั้นตอนที่ 1: ติดตั้ง
sudo mkdir -p /opt/metabase/db
cd /opt/metabase
sudo nano .env
MB_DB_TYPE=postgres
MB_DB_DBNAME=metabase
MB_DB_PORT=5432
MB_DB_USER=metabase
MB_DB_PASS=รหัสผ่านที่ยาวและสุ่ม
MB_DB_HOST=db
sudo nano docker-compose.yml
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${MB_DB_USER}
POSTGRES_PASSWORD: ${MB_DB_PASS}
POSTGRES_DB: ${MB_DB_DBNAME}
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${MB_DB_USER}"]
interval: 10s
retries: 5
metabase:
image: metabase/metabase:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:3000:3000"
environment:
MB_DB_TYPE: ${MB_DB_TYPE}
MB_DB_DBNAME: ${MB_DB_DBNAME}
MB_DB_PORT: ${MB_DB_PORT}
MB_DB_USER: ${MB_DB_USER}
MB_DB_PASS: ${MB_DB_PASS}
MB_DB_HOST: ${MB_DB_HOST}
JAVA_TIMEZONE: Asia/Bangkok
MB_SITE_LOCALE: th
sudo docker compose up -d
sudo docker compose logs -f metabase
อย่าใช้ฐานข้อมูลภายในแบบ H2 ที่เป็นค่าเริ่มต้นสำหรับงานจริง เพราะเสียหายง่ายและสำรองข้อมูลยาก การตั้ง PostgreSQL แยกตามคู่มือนี้คือแนวทางที่ถูกต้อง
ขั้นตอนที่ 2: ตั้ง Nginx และ SSL
sudo nano /etc/nginx/sites-available/metabase
server {
listen 80;
server_name bi.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s;
}
}
sudo ln -s /etc/nginx/sites-available/metabase /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d bi.example.com --agree-tos -m [email protected] --redirect
ขั้นตอนที่ 3: สร้างผู้ใช้ฐานข้อมูลแบบอ่านอย่างเดียว
อย่าให้ Metabase ใช้บัญชีที่เขียนข้อมูลได้ สร้างผู้ใช้ที่อ่านได้อย่างเดียวเสมอ
-- MySQL
CREATE USER 'metabase_ro'@'10.0.0.%' IDENTIFIED BY 'รหัสผ่าน';
GRANT SELECT, SHOW VIEW ON shop.* TO 'metabase_ro'@'10.0.0.%';
FLUSH PRIVILEGES;
-- PostgreSQL
CREATE ROLE metabase_ro LOGIN PASSWORD 'รหัสผ่าน';
GRANT CONNECT ON DATABASE shop TO metabase_ro;
GRANT USAGE ON SCHEMA public TO metabase_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO metabase_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO metabase_ro;
บรรทัดสุดท้ายของ PostgreSQL สำคัญ มันทำให้ตารางที่สร้างใหม่ในอนาคตได้สิทธิ์อ่านอัตโนมัติ ไม่ต้องมาสั่งใหม่ทุกครั้ง
ขั้นตอนที่ 4: เชื่อมต่อฐานข้อมูล
เข้าหน้าเว็บ สร้างบัญชีผู้ดูแล แล้วเพิ่มฐานข้อมูลที่ Admin settings แล้ว Databases
- เลือกชนิด MySQL หรือ PostgreSQL
- Host ใส่ IP ภายในของเซิร์ฟเวอร์ฐานข้อมูล
- Username ใส่ผู้ใช้ที่อ่านอย่างเดียวที่สร้างไว้
- เปิดตัวเลือกให้สแกนโครงสร้างใหม่เป็นระยะ
หลังเชื่อมต่อแล้ว Metabase จะสแกนโครงสร้างและตัวอย่างข้อมูล ซึ่งใช้เวลาสักครู่ จากนั้นจะเข้าใจความสัมพันธ์ระหว่างตารางเองจาก Foreign Key