ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

ติดตั้ง Metabase ทำรายงานจากฐานข้อมูลของคุณ
Home ติดตั้ง Metabase ทำรายงานจากฐานข้อมูลของคุณ

ติดตั้ง 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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security