Tài liệu này hướng dẫn cài Shiny, R và các thư viện cần thiết trên EC2 Ubuntu (private) để chạy app:
- Shiny dashboard:
SBW Clickstream Dashboard - Database: PostgreSQL
clickstream_dwtrên cùng EC2 (127.0.0.1) - Bảng DWH:
clickstream_eventsvới các cộtevent_timestamp,event_name,user_login_state,context_product_*…
🔐 Lưu ý: EC2 ở private subnet → để chạy
apt-getvàinstall.packages()bắt buộc phải tạm thời cho EC2 ra Internet (NAT Gateway) hoặc gắn ra public trong thời gian cài đặt, sau đó tắt lại.
- OS: Ubuntu 22.04 (Jammy) – AWS EC2
- PostgreSQL: v18 (cài từ repo
apt.postgresql.org) - Shiny Server: cài theo hướng dẫn RStudio (binary
.deb) - User chạy Shiny:
shiny - App path:
/srv/shiny-server/sbw_dashboard/app.R
Đăng nhập EC2 bằng SSM Session Manager hoặc SSH, sau đó chạy:
# 1) Update danh sách package
sudo apt-get update
# 2) Cài R (nếu chưa cài)
sudo apt-get install -y r-base
# 3) Cài Postgres client & dev headers (cho RPostgres)
# Nếu DB của bạn là PG 18 thì dùng postgresql-server-dev-18
# (nếu version khác thì đổi số 18 -> 14, 15, ...)
sudo apt-get install -y postgresql-client-18 postgresql-server-dev-18
# 4) Cài libpq + libssl (bắt buộc để build RPostgres)
sudo apt-get install -y libpq-dev libssl-dev
# 5) (Nếu chưa cài Shiny Server)
# Tùy theo cách bạn đã cài, ở đây chỉ ghi nhớ:
# - shiny-server service: /etc/systemd/system/shiny-server.service
# - thư mục app: /srv/shiny-server/
# - user chạy: shinyKiểm tra lại libpq và dev headers đã có:
dpkg -l | grep -E 'libpq-dev|postgresql-server-dev' || echo "MISSING_LIBS"
ls -l /usr/include/postgresql/libpq-fe.h || echo "NO_LIBPQ_HEADER"Nếu không thấy lỗi → OK.
Để Shiny Server load được các package R, ta cài package dưới user shiny và dùng thư mục:
/home/shiny/R/x86_64-pc-linux-gnu-library/4.1
Chạy:
sudo -u shiny R --vanilla <<'EOF'
# Tạo thư mục library cho user shiny nếu chưa có
dir.create(Sys.getenv("R_LIBS_USER"), recursive = TRUE, showWarnings = FALSE)
# Đưa R_LIBS_USER lên đầu .libPaths()
.libPaths(c(Sys.getenv("R_LIBS_USER"), .libPaths()))
cat("LIBPATHS:\n"); print(.libPaths())
q("no")
EOFBạn sẽ thấy LIBPATHS có dòng 1 là /home/shiny/R/x86_64-pc-linux-gnu-library/4.1.
Các package cần cho dashboard:
shinyDBIRPostgresdplyrggplot2lubridatepool
Cài tất cả dưới user shiny:
sudo -u shiny R --vanilla <<'EOF'
dir.create(Sys.getenv("R_LIBS_USER"), recursive = TRUE, showWarnings = FALSE)
.libPaths(c(Sys.getenv("R_LIBS_USER"), .libPaths()))
cat("LIBPATHS:\n"); print(.libPaths())
install.packages(
c("shiny", "DBI", "RPostgres", "dplyr", "ggplot2", "lubridate", "pool"),
repos = "https://cloud.r-project.org"
)
q("no")
EOF💡 Nếu gặp lỗi liên quan tới
libpq-fe.hhoặclibpq:
- Kiểm tra lại đã cài
libpq-dev,postgresql-server-dev-XX,libssl-devchưa.- Chạy lại đoạn
install.packages("RPostgres", ...)sau khi cài đủ libs.
Kiểm tra lại việc load package:
sudo -u shiny R --vanilla <<'EOF'
.libPaths(c(Sys.getenv("R_LIBS_USER"), .libPaths()))
cat("LIBPATHS:\n"); print(.libPaths())
library(shiny)
library(DBI)
library(RPostgres)
library(dplyr)
library(ggplot2)
library(lubridate)
library(pool)
cat("All packages loaded OK\n")
q("no")
EOFNếu không có error → môi trường R đã OK.
sudo mkdir -p /srv/shiny-server/sbw_dashboard
sudo chown -R shiny:shiny /srv/shiny-server/sbw_dashboardTạo (hoặc thay) file app:
sudo nano /srv/shiny-server/sbw_dashboard/app.R
# DÁN TOÀN BỘ CODE app.R (bản full mà bạn đang dùng)
# Ctrl+O, Enter, Ctrl+X để lưuĐảm bảo quyền:
sudo chown shiny:shiny /srv/shiny-server/sbw_dashboard/app.R
sudo chmod 644 /srv/shiny-server/sbw_dashboard/app.Rsudo systemctl restart shiny-server
sudo systemctl status shiny-serverTừ session SSM trên EC2:
# Check trang welcome Shiny
curl -m 5 -sS -o /dev/null -w "WELCOME HTTP %{http_code}\n" \
http://127.0.0.1:3838/
# Check app SBW dashboard
curl -m 10 -sS -o /dev/null -w "DASHBOARD HTTP %{http_code}\n" \
http://127.0.0.1:3838/sbw_dashboard/Nếu trả về DASHBOARD HTTP 200 → app chạy OK.
Nếu 500:
LATEST=$(ls -1t /var/log/shiny-server/sbw_dashboard-shiny-*.log | head -n 1)
echo "LATEST=$LATEST"
sudo tail -n 100 "$LATEST"Xem error log để debug.
Vì EC2 ở private subnet, bạn dùng SSM port-forwarding:
# Ví dụ dùng AWS CLI v2 trên máy local:
aws ssm start-session \
--target <INSTANCE_ID_PRIVATE> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["127.0.0.1"],"portNumber":["3838"],"localPortNumber":["3838"]}'Sau đó, trên máy local mở:
http://127.0.0.1:3838/sbw_dashboard/
Dashboard sẽ hiển thị với:
- KPI cards
- Biểu đồ events over time, event mix, events by login state
- Tab Products & Raw sample (phân trang, newest trước, auto refresh mỗi 10s)
# Cài system libs
sudo apt-get update
sudo apt-get install -y r-base postgresql-client-18 postgresql-server-dev-18 libpq-dev libssl-dev
# Cài R packages cho user shiny
sudo -u shiny R --vanilla <<'EOF'
dir.create(Sys.getenv("R_LIBS_USER"), recursive = TRUE, showWarnings = FALSE)
.libPaths(c(Sys.getenv("R_LIBS_USER"), .libPaths()))
install.packages(
c("shiny", "DBI", "RPostgres", "dplyr", "ggplot2", "lubridate", "pool"),
repos = "https://cloud.r-project.org"
)
q("no")
EOF
# Deploy app
sudo mkdir -p /srv/shiny-server/sbw_dashboard
sudo nano /srv/shiny-server/sbw_dashboard/app.R # dán code
sudo chown -R shiny:shiny /srv/shiny-server/sbw_dashboard
sudo systemctl restart shiny-server
# Kiểm tra
curl -m 10 -sS -o /dev/null -w "DASHBOARD HTTP %{http_code}\n" \
http://127.0.0.1:3838/sbw_dashboard/