Umami: เก็บสถิติผู้เข้าชมเว็บไซต์แบบไม่ใช้คุกกี้ด้วย Docker
คำตอบสั้น ๆ: ติดตั้ง Umami ด้วย Docker Compose คู่กับ PostgreSQL เก็บสถิติผู้เข้าชมเว็บไซต์บนเซิร์ฟเวอร์ของตัวเองโดยไม่ใช้คุกกี้ เปลี่ยนรหัส admin ติดสคริปต์ และนับ event
คู่มือนี้อธิบาย Umami ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Umami คือระบบวัดสถิติผู้เข้าชมเว็บไซต์แบบโอเพนซอร์สที่เน้นความเป็นส่วนตัว ใช้สคริปต์ขนาดเล็ก ไม่ใช้คุกกี้ และเก็บข้อมูลไว้บนเซิร์ฟเวอร์ขององค์กรเอง แสดงจำนวนผู้เข้าชม หน้าเว็บยอดนิยม แหล่งที่มา แคมเปญ UTM อุปกรณ์ และประเทศในแดชบอร์ดหน้าเดียวที่อ่านง่าย เหมาะกับบริษัทที่ต้องการตัวเลขสำคัญของเว็บไซต์โดยไม่ส่งข้อมูลผู้เข้าชมให้บุคคลภายนอก
เมื่อทำตามคู่มือนี้จบ คุณจะมี Umami รุ่น 3 ที่รันด้วย Docker Compose คู่กับ PostgreSQL ใช้งานผ่าน HTTPS เปลี่ยนรหัสผ่านเริ่มต้นแล้ว ติดสคริปต์ติดตามบนเว็บไซต์แรก และรู้วิธีนับการคลิกปุ่มสำคัญเป็น event
สิ่งที่ต้องเตรียม
- Cloud VPS ที่ใช้ Ubuntu 24.04 พร้อม Docker Engine และ Compose plugin ขนาดเริ่มต้น 1–2 vCPU / RAM 2 GB สำหรับเว็บไซต์ขนาดเล็กถึงกลาง เป็นค่าประมาณ ขนาดฐานข้อมูลจะโตตามจำนวนผู้เข้าชม
- ซับโดเมน เช่น
stats.example.com และ Nginx Proxy Manager พร้อมเครือข่าย proxy
- สิทธิ์แก้ไขส่วน
<head> ของเว็บไซต์ หรือปลั๊กอินที่ใส่โค้ดในส่วนนั้นได้
- ผู้รับผิดชอบนโยบายความเป็นส่วนตัวของบริษัท เพื่อปรับข้อความแจ้งผู้ใช้
ผู้เข้าชมทุกคนต้องเข้าถึง script.js และ /api/send ได้ ส่วนทีมงานดูแดชบอร์ดผ่านโดเมนเดียวกัน
ขั้นตอนที่ 1: สร้างโฟลเดอร์และค่าลับใน .env
sudo install -d -o $USER /opt/stats
cd /opt/stats
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_SECRET=$(openssl rand -hex 32)
TWO_FACTOR_ENCRYPTION_KEY=$(openssl rand -hex 32)
EOF
chmod 600 .env
ใช้ openssl rand -hex เพราะรหัสผ่านฐานข้อมูลจะไปอยู่ใน DATABASE_URL ตัวอักษรอย่าง @ หรือ / จะทำให้ URL ผิดรูป APP_SECRET ใช้ลงนาม token การล็อกอิน ส่วน TWO_FACTOR_ENCRYPTION_KEY ต้องมีก่อนผู้ใช้คนใดเปิดการยืนยันตัวตนสองขั้น
ขั้นตอนที่ 2: เขียน compose.yaml แล้วเริ่มระบบ
services:
umami:
image: ghcr.io/umami-software/umami:latest
container_name: umami
restart: unless-stopped
init: true
environment:
DATABASE_URL: postgresql://stats:${POSTGRES_PASSWORD}@db:5432/stats
APP_SECRET: ${APP_SECRET}
TWO_FACTOR_ENCRYPTION_KEY: ${TWO_FACTOR_ENCRYPTION_KEY}
DISABLE_TELEMETRY: 1
depends_on:
db:
condition: service_healthy
networks:
- default
- proxy
db:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: stats
POSTGRES_USER: stats
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U stats -d stats"]
interval: 5s
retries: 10
networks:
proxy:
external: true
รุ่น 3 รองรับเฉพาะ PostgreSQL การเริ่มครั้งแรกจะสร้างตารางและบัญชีผู้ดูแลให้เอง DISABLE_TELEMETRY ปิดการส่งสถิติการใช้งานแบบไม่ระบุตัวตนกลับไปที่ผู้พัฒนา
docker compose up -d
docker compose logs -f umami
ขั้นตอนที่ 3: เปิด HTTPS ด้วย Proxy Host
ใน Nginx Proxy Manager เพิ่ม Proxy Host กรอก Domain Names stats.example.com, Forward Hostname umami, Forward Port 3000 เปิด Block Common Exploits ขอใบรับรองพร้อม Force SSL และ HTTP/2
อย่าผูก Access List กับ Proxy Host นี้ เพราะเบราว์เซอร์ของผู้เข้าชมทุกคนต้องโหลด script.js และส่งข้อมูลไปที่ /api/send ได้ ถ้าจำกัด IP สถิติจะหายทั้งหมด ให้ป้องกันหน้าแดชบอร์ดด้วยรหัสผ่านที่แข็งแรงและ 2FA แทน
ขั้นตอนที่ 4: ล็อกอินครั้งแรกและเปลี่ยนรหัสผ่าน admin
เปิด https://stats.example.com ล็อกอินด้วยบัญชีเริ่มต้น Username admin รหัสผ่าน umami แล้วเปลี่ยนรหัสผ่านทันที กดปุ่มโปรไฟล์ในเมนูด้านข้าง เลือก Settings → Profile แล้วกด Change password จากนั้นเปิดการยืนยันตัวตนสองขั้นในหน้า Settings → Security
ถ้ามีคนอื่นต้องดูรายงาน ให้สร้างบัญชีแยกในส่วน Admin → Users และเลือกบทบาทที่ดูได้อย่างเดียว ไม่แชร์บัญชี admin ให้หลายคนใช้ร่วมกัน
หลังกด Save ให้กด Edit ของเว็บไซต์เพื่อคัดลอก Tracking code (ภาพจำลอง)
ขั้นตอนที่ 5: เพิ่มเว็บไซต์และติดสคริปต์ติดตาม
คลิก Websites ในเมนูด้านข้าง กด Add website ใส่ Name เป็นชื่อที่จำง่าย และ Domain เป็นโดเมนจริงของเว็บ เช่น www.example.com แล้วกด Save จากนั้นกด Edit ของเว็บไซต์นั้น คัดลอกโค้ดจากส่วน Tracking code ไปวางในส่วน <head> ของทุกหน้า
<script defer src="https://stats.example.com/script.js"
data-website-id="a1b2c3d4-0000-4000-8000-123456789abc"
data-domains="www.example.com"></script>
data-website-id ใช้ค่าที่ระบบให้มา ส่วน data-domains เป็นตัวเลือกที่ทำให้นับเฉพาะเมื่อสคริปต์ทำงานบนโดเมนที่ระบุ ไม่นับตอนทดสอบบนเครื่องนักพัฒนา เปิดเว็บไซต์ของคุณแล้วกลับไปดูหน้า Realtime ของเว็บไซต์นั้นจะเห็นผู้เข้าชมขึ้นภายในไม่กี่วินาที
นับการคลิกปุ่มสำคัญได้โดยเพิ่ม attribute data-umami-event ที่ปุ่มนั้น เช่น <button data-umami-event="contact-submit"> หรือเรียก umami.track('contact-submit') จาก JavaScript ผลจะแสดงในส่วน Events ของแดชบอร์ด
ขั้นตอนที่ 6: สำรองข้อมูลและอัปเดต
sudo mkdir -p /var/backups/stats
docker compose exec -T db pg_dump -U stats -Fc stats \
| sudo tee /var/backups/stats/db-$(date +%F).dump > /dev/null
ข้อมูลทั้งหมดอยู่ในฐานข้อมูล จึงสำรองแค่ไฟล์ dump กับ .env ก็กู้คืนได้ครบ ส่งไฟล์ออกนอกเครื่องทุกวัน อัปเดตด้วย docker compose pull && docker compose up -d หลังสำรองข้อมูล ระบบจะย้ายโครงสร้างฐานข้อมูลให้เองตอนเริ่ม และอ่าน release notes ก่อนขึ้นเวอร์ชันหลักใหม่ทุกครั้ง
script.js ต้องเปิดได้จากทุกที่ ถ้าได้ 403 แปลว่ามี Access List ผูกอยู่และสถิติจะไม่ถูกบันทึก
ปัญหาที่พบบ่อยเกี่ยวกับ Umami
ติดสคริปต์แล้วแต่แดชบอร์ดไม่มีข้อมูลเลย?
เปิด Developer Tools แท็บ Network บนเว็บไซต์ของคุณ ตรวจว่าโหลด script.js ได้และคำขอไปที่ /api/send ได้สถานะ 2xx ถ้าไม่มีคำขอ ให้ตรวจ data-website-id, ค่า data-domains และ Content-Security-Policy ของเว็บที่อาจบล็อกโดเมน stats ถ้าคำขอถูกบล็อก ให้ตรวจว่าไม่ได้ผูก Access List ไว้กับ Proxy Host
ทำไมตัวเลขน้อยกว่า Google Analytics หรือระบบอื่น?
แต่ละระบบนิยามผู้เข้าชมและ session ต่างกัน และส่วนขยายบล็อกโฆษณาบางตัวบล็อกสคริปต์สถิติ ตั้งตัวแปร TRACKER_SCRIPT_NAME เพื่อเปลี่ยนชื่อไฟล์สคริปต์จาก script.js ช่วยลดการถูกบล็อกได้บางส่วน ให้ดูแนวโน้มในระบบเดียวกันมากกว่าเทียบตัวเลขข้ามระบบ
ใช้ Umami แล้วไม่ต้องแจ้งผู้ใช้ตาม PDPA ใช่ไหม?
การไม่ใช้คุกกี้ไม่ได้แปลว่าไม่ต้องแจ้งอะไรเลย ระบบยังประมวลผลข้อมูลการเข้าชม เช่น หน้าเว็บ อุปกรณ์ และประเทศ แม้จะออกแบบให้ไม่เก็บข้อมูลที่ระบุตัวบุคคลโดยตรง ควรระบุในนโยบายความเป็นส่วนตัวว่าเก็บข้อมูลใด เพื่อวัตถุประสงค์อะไร เก็บที่ไหนและนานเท่าไร แล้วให้ผู้รับผิดชอบด้าน PDPA ขององค์กรพิจารณาว่าต้องขอความยินยอมหรือไม่
จะให้ผู้บริหารดูรายงานโดยไม่ต้องสร้างบัญชีได้ไหม?
ได้ ในหน้าตั้งค่าของเว็บไซต์มีส่วน Share สำหรับสร้างลิงก์แดชบอร์ดแบบอ่านอย่างเดียว ใครมีลิงก์ก็ดูได้ จึงควรส่งเฉพาะคนที่เกี่ยวข้อง และปิดลิงก์เมื่อไม่ใช้แล้ว ดูรายละเอียดเพิ่มเติมที่ เอกสารทางการของ Umami
เลือกตามความต้องการ บางองค์กรใช้ทั้งสองแบบคู่กัน
ต้องการเซิร์ฟเวอร์สำหรับเก็บสถิติเว็บไซต์ขององค์กรเอง ดู Cloud VPS App Plus หรือ ติดต่อทีมงาน THAI DATA CLOUD เพื่อขอคำแนะนำในการติดตั้งและดูแลระบบ
อ่านเพิ่มเติมเกี่ยวกับ Umami