ติดตั้ง 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
ขั้นตอนที่ 5: ตั้งค่าข้อมูลให้อ่านง่าย
ขั้นตอนนี้คือสิ่งที่ทำให้ทีมงานที่ไม่รู้ SQL ใช้งานได้จริง ที่ Admin settings แล้ว Table Metadata
- เปลี่ยนชื่อตารางและคอลัมน์เป็นภาษาไทยที่คนทั่วไปเข้าใจ เช่น
created_atเป็น วันที่สั่งซื้อ - ซ่อนตารางและคอลัมน์ที่ไม่เกี่ยวข้องกับงาน เช่น ตารางระบบและคอลัมน์รหัสภายใน
- ตั้งชนิดของคอลัมน์ให้ถูกต้อง เช่น ระบุว่าคอลัมน์นี้เป็นสกุลเงิน เปอร์เซ็นต์ หรืออีเมล
- เพิ่มคำอธิบายให้คอลัมน์ที่ความหมายไม่ชัดเจน
เวลาที่ลงทุนในขั้นตอนนี้ลดคำถามที่ทีมงานจะถามกลับมาได้มากที่สุด
ขั้นตอนที่ 6: สร้างคำถามและ Dashboard
กด New แล้ว Question เลือกตาราง แล้วใช้หน้าจอกำหนดเงื่อนไข จัดกลุ่ม และสรุปผล โดยไม่ต้องเขียน SQL
สำหรับคำถามที่ซับซ้อน ใช้ SQL ได้โดยตรงพร้อมตัวแปรที่ผู้ใช้เลือกได้
SELECT DATE(created_at) AS วันที่,
COUNT(*) AS จำนวนออเดอร์,
SUM(total) AS ยอดขาย
FROM orders
WHERE created_at BETWEEN {{start_date}} AND {{end_date}}
[[AND status = {{status}}]]
GROUP BY DATE(created_at)
ORDER BY 1
ส่วนที่อยู่ในวงเล็บเหลี่ยมสองชั้นคือเงื่อนไขที่จะถูกตัดออกอัตโนมัติหากผู้ใช้ไม่ได้เลือกค่า ทำให้คำถามเดียวใช้ได้หลายแบบ
รวมคำถามหลายข้อเป็น Dashboard แล้วเพิ่มตัวกรองที่ใช้ร่วมกันทุกแผง
ขั้นตอนที่ 7: ส่งรายงานอัตโนมัติ
ตั้งอีเมลก่อนที่ Admin settings แล้ว Email
SMTP Host: smtp.example.com
SMTP Port: 587
SMTP Security: STARTTLS
SMTP Username: [email protected]
From Address: [email protected]
จากนั้นที่ Dashboard กดไอคอนนาฬิกาแล้วตั้ง Subscription เลือกความถี่และผู้รับ ระบบจะส่งรายงานพร้อมกราฟเข้าอีเมลตามเวลาที่กำหนด
ส่งเข้าแชทของทีมได้ด้วยผ่าน Webhook ในเมนูเดียวกัน
ขั้นตอนที่ 8: กำหนดสิทธิ์
ที่ Admin settings แล้ว Permissions ตั้งได้สามระดับ
- ระดับฐานข้อมูล ใครเห็นฐานข้อมูลไหนได้
- ระดับตาราง ภายในฐานข้อมูลเดียวกัน แต่ละกลุ่มเห็นตารางต่างกันได้
- ระดับแถว ด้วย Sandbox ที่กรองข้อมูลตามผู้ใช้ เช่น พนักงานขายเห็นเฉพาะลูกค้าของตัวเอง
สร้างกลุ่มตามหน้าที่ เช่น ฝ่ายขาย ฝ่ายบัญชี แล้วกำหนดสิทธิ์ที่กลุ่ม ไม่ใช่รายบุคคล
ปัญหาที่พบบ่อย
เชื่อมต่อฐานข้อมูลไม่ได้
ตรวจว่าฐานข้อมูลอนุญาตให้เชื่อมต่อจาก IP ของเซิร์ฟเวอร์ Metabase และผู้ใช้มีสิทธิ์ ทดสอบจากในคอนเทนเนอร์ด้วย sudo docker compose exec metabase bash -c "timeout 3 bash -c '</dev/tcp/10.0.0.21/3306' && echo ok"
รายงานช้ามาก
Query ที่สร้างอาจสแกนทั้งตาราง ตรวจที่ฝั่งฐานข้อมูลด้วย Slow Query Log แล้วเพิ่ม Index ที่จำเป็น และใช้ฟีเจอร์ Caching ใน Metabase สำหรับรายงานที่ไม่ต้องการข้อมูลสดทันที
ภาษาไทยแสดงไม่ถูกต้องในไฟล์ที่ส่งออก
ส่งออกเป็น CSV แล้วเปิดด้วยการนำเข้าข้อมูลแบบระบุการเข้ารหัส UTF-8 แทนการดับเบิลคลิก หรือส่งออกเป็น Excel ซึ่งไม่มีปัญหานี้
ผู้ใช้เห็นข้อมูลที่ไม่ควรเห็น
ตรวจสิทธิ์ทั้งสามระดับตามขั้นตอนที่ 8 และจำไว้ว่าคำถามที่เขียนด้วย SQL โดยตรงจะข้ามการจำกัดระดับตารางได้ จึงควรให้สิทธิ์เขียน SQL เฉพาะกลุ่มที่ไว้ใจ
ต้องการวางระบบรายงานสำหรับผู้บริหารบนคลาวด์ไทย ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี








