Cấu hình bảo mật: Quản lý Role và Permissions
Tạo người dùng và cấp quyền truy cập
Bước này tạo một role (người dùng) mới cho ứng dụng hoặc quản trị viên phụ, giúp tách biệt quyền hạn so với admin mặc định. Việc này đảm bảo nguyên tắc least privilege.
Chúng ta sẽ tạo một role tên là "app_user" với mật khẩu mạnh và cấp quyền "SELECT" cho tất cả các module trong database.
edgedb create-role app_user --password="YourStrongPasswordHere123!"
Kết quả mong đợi: Terminal hiển thị thông báo "Role 'app_user' created successfully".
Sau khi tạo role, ta cần cấp quyền truy cập cụ thể. Ở đây ta cấp quyền đọc (SELECT) cho toàn bộ schema.
edgedb grant SELECT ON ALL TO app_user
Kết quả mong đợi: Không có lỗi, terminal trở về dấu nhắc lệnh ngay lập tức.
Chuyển đổi sang quyền hạn mới để kiểm tra
Để verify quyền hạn đã được cấp chính xác, ta cần đăng nhập lại dưới vai trò của user vừa tạo và thử truy vấn.
edgedb cli --role=app_user --password="YourStrongPasswordHere123!"
Kết quả mong đợi: Terminal hiển thị prompt của EdgeDB CLI, thường có tên database và tên role hiện tại.
Trong CLI, thực hiện truy vấn đơn giản để kiểm tra quyền đọc.
SELECT User LIMIT 1;
Kết quả mong đợi: Trả về dữ liệu mẫu nếu có, hoặc trả về tập rỗng nếu chưa có dữ liệu, nhưng KHÔNG báo lỗi "Permission denied".
Thử thực hiện lệnh xóa (DELETE) để xác nhận quyền hạn bị giới hạn đúng ý muốn.
DELETE User;
Kết quả mong đợi: Báo lỗi "PermissionError" hoặc "AccessError" với thông báo user không có quyền DELETE.
Thoát khỏi CLI để quay lại shell.
\q
Kết quả mong đợi: Trả về shell của hệ điều hành.
Chiến lược sao lưu và khôi phục dữ liệu (Backup & Restore)
Tạo điểm sao lưu dữ liệu (Snapshot)
EdgeDB sử dụng cơ chế snapshot để tạo bản sao lưu nhất quán của dữ liệu mà không làm gián đoạn dịch vụ. Ta sẽ lưu snapshot vào một file cụ thể.
edgedb backup create --path=/var/backup/edgedb-snapshot-$(date +%F).backup
Kết quả mong đợi: Hệ thống tạo file .backup và hiển thị thông báo "Backup created successfully" kèm đường dẫn file.
Để đảm bảo file backup được tạo đúng, kiểm tra kích thước file.
ls -lh /var/backup/edgedb-snapshot-*.backup
Kết quả mong đợi: Hiển thị danh sách file backup với kích thước > 0 KB.
Khôi phục dữ liệu từ Backup
Khôi phục dữ liệu sẽ ghi đè toàn bộ dữ liệu hiện tại của database bằng nội dung trong file backup. Thao tác này cần thực hiện khi máy bị lỗi hoặc cần revert về trạng thái trước đó.
edgedb restore --path=/var/backup/edgedb-snapshot-2024-01-01.backup
Kết quả mong đợi: Quá trình chạy xong và hiển thị "Restore completed successfully". Database sẽ khởi động lại.
Cấu hình sao lưu tự động qua Cron
Để tự động hóa việc sao lưu hàng ngày, ta sẽ tạo một script bash và thêm vào crontab của hệ thống.
Trước tiên, tạo thư mục chứa script nếu chưa có.
sudo mkdir -p /opt/scripts/edgedb
Kết quả mong đợi: Thư mục được tạo thành công.
Tạo file script sao lưu tự động với đầy đủ logic tạo file và xóa file cũ.
cat > /opt/scripts/edgedb/backup.sh > /var/log/edgedb-backup.log
EOF
Kết quả mong đợi: File script được tạo tại /opt/scripts/edgedb/backup.sh.
Cấp quyền thực thi cho script.
sudo chmod +x /opt/scripts/edgedb/backup.sh
Kết quả mong đợi: Không có lỗi.
Thêm task vào crontab để chạy script mỗi ngày lúc 2 giờ sáng.
(crontab -l 2>/dev/null; echo "0 2 * * * /opt/scripts/edgedb/backup.sh") | crontab -
Kết quả mong đợi: Không có lỗi, task đã được thêm vào crontab.
Verify crontab đã được thêm đúng chưa.
crontab -l
Kết quả mong đợi: Hiển thị dòng lệnh backup.sh trong danh sách cron jobs.
Phân tích Log và Giám sát lỗi
Định vị và cấu hình Log của EdgeDB
EdgeDB trên Ubuntu 24.04 (khi cài qua snap hoặc systemd service) thường ghi log vào thư mục systemd journal hoặc file log riêng. Ta cần xác định chính xác nơi ghi log để debug.
Kiểm tra log thông qua journal của systemd.
journalctl -u edgedb --no-pager -n 50
Kết quả mong đợi: Hiển thị 50 dòng log mới nhất của service edgedb, bao gồm trạng thái start, stop, và các lỗi runtime.
Tìm kiếm lỗi cụ thể trong Log
Khi hệ thống gặp sự cố, ta cần lọc các dòng chứa từ khóa "ERROR" hoặc "CRITICAL" để tìm nguyên nhân nhanh chóng.
journalctl -u edgedb --since "1 hour ago" | grep -i "error"
Kết quả mong đợi: Danh sách các dòng log chứa lỗi trong vòng 1 giờ qua. Nếu không có lỗi, terminal không hiển thị gì.
Để xem log chi tiết hơn về quá trình khởi động (startup) nếu service bị crash ngay khi chạy.
journalctl -u edgedb --since "boot" | grep -A 5 "Failed to start"
Kết quả mong đợi: Hiển thị thông báo lỗi và 5 dòng sau đó giải thích lý do thất bại (ví dụ: bind port conflict, permission denied).
Chuyển đổi chế độ debug trong EdgeDB
Nếu log mặc định không đủ chi tiết, ta cần chỉnh sửa file cấu hình systemd để tăng mức độ debug của EdgeDB lên "DEBUG" hoặc "TRACE".
Chỉnh sửa file service override để thêm biến môi trường.
sudo systemctl edit edgedb
Kết quả mong đợi: Mở trình soạn thảo nano/vim với file cấu hình override.
Thêm nội dung sau vào file soạn thảo để bật debug log.
[Service]
Environment="EDGEDB_LOG_LEVEL=DEBUG"
Environment="EDGEDB_DEBUG=true"
Kết quả mong đợi: Lưu file và thoát trình soạn thảo.
Reload và restart service để áp dụng cấu hình mới.
sudo systemctl daemon-reload && sudo systemctl restart edgedb
Kết quả mong đợi: Service khởi động lại.
Khởi động lại và kiểm tra log để xem chi tiết hơn.
journalctl -u edgedb --no-pager -n 20
Kết quả mong đợi: Log hiện nhiều dòng hơn, chi tiết về query plan, kết nối, và internal state.
Khắc phục sự cố phổ biến trên Ubuntu 24.04
Xử lý lỗi Port Conflict (Cổng bị chiếm)
EdgeDB mặc định chạy trên cổng 5656. Nếu có ứng dụng khác chiếm cổng này, service sẽ không khởi động được.
Trước tiên, kiểm tra xem cổng 5656 đang được ai sử dụng.
sudo ss -tlnp | grep 5656
Kết quả mong đợi: Hiển thị quy trình (PID) đang listen trên cổng 5656, hoặc không có gì nếu cổng trống.
Nếu có xung đột, ta cần đổi cổng của EdgeDB. Sửa file service override để thay đổi biến môi trường EDGEDB_PORT.
sudo systemctl edit edgedb
Kết quả mong đợi: Mở trình soạn thảo.
Thêm dòng sau để đổi sang cổng 5657.
[Service]
Environment="EDGEDB_PORT=5657"
Kết quả mong đợi: Lưu file và thoát.
Restart service để áp dụng cổng mới.
sudo systemctl restart edgedb
Kết quả mong đợi: Service chạy thành công.
Verify bằng cách kiểm tra cổng mới.
sudo ss -tlnp | grep 5657
Kết quả mong đợi: Hiển thị edgedb đang listen trên cổng 5657.
Xử lý lỗi Permission Denied khi truy cập thư mục data
Trên Ubuntu 24.04, quyền sở hữu thư mục dữ liệu (/var/lib/edgedb) có thể bị sai nếu cài đặt thủ công hoặc sau khi upgrade, gây ra lỗi "Permission denied" khi service chạy.
Đảm bảo thư mục dữ liệu thuộc về user "edgedb".
sudo chown -R edgedb:edgedb /var/lib/edgedb
Kết quả mong đợi: Không có lỗi.
Cấp quyền ghi đúng cho thư mục log và backup nếu cần.
sudo chown -R edgedb:edgedb /var/log/edgedb /var/backup
Kết quả mong đợi: Không có lỗi.
Restart service để kiểm tra.
sudo systemctl restart edgedb && sudo systemctl status edgedb
Kết quả mong đợi: Trạng thái service là "active (running)".
Xử lý lỗi Out of Memory (OOM) Kill
Nếu server có ít RAM và EdgeDB bị kill đột ngột do bộ nhớ đầy, ta cần kiểm tra log của kernel (dmesg) để xác nhận.
dmesg | grep -i "killed process" | grep edgedb
Kết quả mong đợi: Hiển thị dòng log "Out of memory: Kill process ... (edgedb)".
Để khắc phục, ta cần giới hạn bộ nhớ của service hoặc tăng swap. Ở đây ta giới hạn bộ nhớ để tránh làm sập toàn bộ hệ thống.
sudo systemctl edit edgedb
Kết quả mong đợi: Mở trình soạn thảo.
Thêm giới hạn bộ nhớ (ví dụ: 2GB) vào file override.
[Service]
MemoryMax=2G
Kết quả mong đợi: Lưu file và thoát.
Reload và restart service.
sudo systemctl daemon-reload && sudo systemctl restart edgedb
Kết quả mong đợi: Service chạy với giới hạn bộ nhớ mới.
Verify giới hạn bộ nhớ đã áp dụng.
systemctl show edgedb | grep MemoryMax
Kết quả mong đợi: Hiển thị giá trị MemoryMax=2G.
Điều hướng series:
Mục lục: Series: Triển khai Database Edge-native với EdgeDB trên Ubuntu 24.04
« Phần 4: Tích hợp EdgeDB với ứng dụng Python và Node.js