Triển khai Snipe-IT trên Docker: Quản lý tài sản IT cho HomeLab của bạn

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Bối cảnh & Lý do: “Điểm mù” quản lý thiết bị trong HomeLab

Hầu hết homelab đều khởi đầu khá khiêm tốn. Bạn có thể bắt đầu với một chiếc Lenovo ThinkCentre Tiny thanh lý hoặc một chiếc Dell OptiPlex cũ để chạy Pi-hole và vài container Docker. Chẳng mấy chốc, hệ thống nhỏ gọn ấy bắt đầu phình to. Bạn thấy mình đang quản lý cả một cụm Proxmox 3 node, một switch PoE doanh nghiệp, một khay đĩa DAS, cùng hàng đống thanh RAM DDR4 ECC và card mạng PCIe dự phòng cất trong ngăn kéo. Tài sản số cũng tăng nhanh không kém, từ license của hypervisor, gia hạn tên miền cho đến các chứng chỉ TLS nội bộ.

Và rồi thực tế ập đến. Một ổ cứng bất ngờ báo lỗi SMART lúc 2 giờ sáng, hoặc một node hypervisor đột ngột mất kết nối. Đột nhiên, bạn phải bới tung các bảng tính cũ kỹ và những ghi chú vội trên Discord. Node nào đang gắn thanh RAM Micron 32GB đó? Ổ SSD enterprise 1.92TB mua lại kia có phải đã hết hạn bảo hành vào tháng trước không? Ngày mua lúc nào?

Các bảng tính thông thường nhanh chóng bộc lộ hạn chế. Chúng không thể biểu diễn mối quan hệ phụ thuộc giữa khung máy (chassis), linh kiện tháo lắp và số lượng bản quyền phần mềm đang sử dụng.

Các trung tâm dữ liệu giải quyết vấn đề này bằng phần mềm Quản lý Tài sản IT (ITAM) chuyên dụng. Snipe-IT là một nền tảng ITAM nguồn mở nền web, được xây dựng chuyên biệt để theo dõi vòng đời phần cứng, linh kiện có thể tháo rời, vật tư tiêu hao và lịch sử bảo trì. Vận hành Snipe-IT qua Docker Compose mang lại cho bạn một hệ thống quản lý tập trung, tự host gọn gàng mà không bị cồng kềnh như các giải pháp doanh nghiệp nặng nề.

Vận hành lab nghiêm túc như môi trường production đồng nghĩa với việc bạn phải biết rõ mình sở hữu phần cứng gì, chúng nằm ở đâu và khi nào cần phải thay thế.

Cài đặt: Thiết lập Snipe-IT với Docker Compose

Chúng ta sẽ triển khai Snipe-IT dưới dạng mô hình hai tầng bằng Docker Compose. Container thứ nhất chạy dịch vụ ứng dụng Snipe-IT chính thức trên nền Apache và PHP. Container thứ hai chạy phiên bản MariaDB 10.11 để lưu trữ dữ liệu quan hệ.

1. Chuẩn bị cấu trúc thư mục

Tạo một thư mục riêng biệt trên máy chủ Docker để lưu trữ volume ứng dụng lâu dài và các bản sao lưu:

mkdir -p ~/snipe-it/data ~/snipe-it/dumps
cd ~/snipe-it

2. Tạo khóa mã hóa ứng dụng (Application Encryption Key)

Snipe-IT yêu cầu một khóa ứng dụng base64 dài 32 ký tự (APP_KEY). Khóa này dùng để mã hóa dữ liệu nhạy cảm trong cơ sở dữ liệu, bao gồm các trường mật khẩu và khóa bản quyền phần mềm. Hãy tạo khóa này bằng image chính thức trước khi khởi chạy hệ thống:

docker run --rm snipe/snipe-it:latest php artisan key:generate --show

Lưu chuỗi kết quả đầu ra (có định dạng base64:...). Bạn sẽ dán giá trị này vào file cấu hình môi trường ở bước tiếp theo.

3. Tạo file cấu hình môi trường

Tạo file .env trong thư mục làm việc ~/snipe-it. Thay thế các giá trị mẫu bằng khóa vừa tạo, địa chỉ IP mạng nội bộ của homelab (chẳng hạn như 192.168.1.50) và mật khẩu cơ sở dữ liệu đủ mạnh:

cat <<'EOF' > ~/snipe-it/.env
# Cấu hình ứng dụng
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:PASTE_YOUR_GENERATED_KEY_HERE=
APP_URL=http://192.168.1.50:8080
APP_TIMEZONE=UTC
APP_LOCALE=en-US

# Cấu hình cơ sở dữ liệu
DB_CONNECTION=mysql
DB_HOST=snipe-db
DB_PORT=3306
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=SecureAppPass_2026!

# Mật khẩu Root của MariaDB
MYSQL_ROOT_PASSWORD=RootSecretPass_2026!

# Cấu hình thông báo (Đặt là 'log' hoặc điền thông tin SMTP relay của bạn)
MAIL_DRIVER=log

# Thời gian duy trì phiên đăng nhập theo phút (12000 = ~8 ngày)
SESSION_LIFETIME=12000
EXPIRE_ON_CLOSE=false
EOF

4. Khai báo file Docker Compose

Tạo file docker-compose.yml. Cấu hình này bao gồm các named volume để duy trì dữ liệu, một mạng bridge biệt lập và một healthcheck rõ ràng cho MariaDB để container ứng dụng chỉ khởi động khi cơ sở dữ liệu đã sẵn sàng nhận truy vấn:

cat <<'EOF' > ~/snipe-it/docker-compose.yml
services:
  snipe-db:
    image: mariadb:10.11
    container_name: snipeit-db
    restart: unless-stopped
    env_file: .env
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s
    networks:
      - snipeit-net

  snipe-app:
    image: snipe/snipe-it:latest
    container_name: snipeit-app
    restart: unless-stopped
    depends_on:
      snipe-db:
        condition: service_healthy
    env_file: .env
    ports:
      - "8080:80"
    volumes:
      - snipe_data:/var/lib/snipeit
      - snipe_dumps:/var/lib/snipeit/dumps
    networks:
      - snipeit-net

volumes:
  db_data:
  snipe_data:
  snipe_dumps:

networks:
  snipeit-net:
    driver: bridge
EOF

5. Khởi chạy hệ thống

Khởi chạy cả hai container ở chế độ chạy ngầm (detached mode):

docker compose up -d

Theo dõi log của container để quan sát quá trình chạy migration cơ sở dữ liệu ban đầu:

docker compose logs -f snipe-app

Web server đã sẵn sàng hoạt động khi log hiển thị dòng Apache/2.4... configured -- resuming normal operations.

Cấu hình: Thiết lập ban đầu và mô hình hóa tài sản

Truy cập http://192.168.1.50:8080 trên trình duyệt để mở giao diện cài đặt.

1. Hoàn tất thiết lập ban đầu trên giao diện web

  1. Kiểm tra môi trường (Pre-Flight Check): Đảm bảo toàn bộ extension PHP, thư mục lưu trữ và quyền ghi đường dẫn đều có dấu tích xanh. Nhấp vào Next: Create Database Tables.
  2. Khởi tạo bảng cơ sở dữ liệu (Create Database Tables): Snipe-IT sẽ tự động tạo schema cần thiết. Nhấp vào Next: Create User.
  3. Tài khoản quản trị & Nhận diện thương hiệu (Admin Account & Branding): Nhập tiêu đề trang (ví dụ: Lab Ops Inventory). Điền tên đăng nhập quản trị viên, email và mật khẩu an toàn.

2. Mô hình hóa danh mục phần cứng và linh kiện

Snipe-IT phân biệt rất rành mạch giữa Assets (Tài sản) và Components (Linh kiện). Assets là các thiết bị độc lập có định danh riêng biệt, chẳng hạn như máy chủ dạng rack 1U hoặc switch được quản lý (managed switch). Components là các bộ phận lắp bên trong những tài sản đó, như thanh RAM, ổ cứng SSD hay card mở rộng PCIe.

  • Danh mục (Settings > Categories): Tạo các nhóm riêng biệt như Rack Servers, Network Switches và Storage Components. Đối với các linh kiện tháo lắp, đặt loại danh mục trực tiếp thành Component.
  • Nhãn trạng thái (Settings > Status Labels): Theo dõi chính xác các giai đoạn triển khai. Một số trạng thái mặc định hữu ích gồm: Active / In Rack (Có thể triển khai), Cold Spare / Shelf (Có thể triển khai), Bench Testing (Chờ xử lý) và Defective / RMA (Không thể triển khai).
  • Model tài sản (Settings > Asset Models): Nhập thông số phần cứng cụ thể (ví dụ: Dell PowerEdge R730xd, Minisforum MS-01 hoặc Ubiquiti USW-Pro-24-PoE). Đính kèm các trường tùy chỉnh (custom fieldset) cho loại socket CPU, số làn mở rộng PCIe và công suất nguồn.

3. Nhập và liên kết phần cứng

Bắt đầu bằng cách tạo thiết bị chính của bạn tại Assets > Create New (ví dụ: pve-node-01 với số serial 4HK9Z22 và địa chỉ MAC 00:1E:67:D2:AB:34). Tiếp theo, chuyển sang Components > Create New và thêm kit RAM: Samsung 32GB DDR4 2666MHz ECC RDIMM với tổng số lượng là 4.

Nhấp vào Check Out trên linh kiện đó và gán toàn bộ 4 thanh RAM vào máy pve-node-01.

Sau này, khi hoán đổi hoặc nâng cấp phần cứng, bạn chỉ cần check out các thanh RAM đó sang một máy khác. Snipe-IT sẽ tự động lưu lại toàn bộ ngày giờ luân chuyển cùng các ghi chú liên quan.

4. Quản lý bản quyền phần mềm (Licenses)

Truy cập Licenses > Create New. Thêm các gói đăng ký và key bản quyền cho Proxmox VE cộng đồng, gia hạn tên miền và key kích hoạt hệ điều hành. Thiết lập số lượng bản quyền (seat count – ví dụ: 2 socket CPU hoặc 10 máy ảo đang chạy) và gán (check out) các bản quyền đó cho máy đang sử dụng. Snipe-IT sẽ cảnh báo trước khi các dịch vụ đến hạn hết hạn.

Kiểm tra & Giám sát: Tình trạng hoạt động, sao lưu và bảo trì

Một công cụ quản lý tài sản chỉ thực sự hữu dụng khi dữ liệu bên trong vẫn an toàn nguyên vẹn sau sự cố hỏng ổ cứng hay những đợt nâng cấp container định kỳ.

1. Kiểm tra trạng thái dịch vụ và Healthcheck

Đảm bảo cả hai container đều báo trạng thái healthy (khỏe mạnh):

docker compose ps

Truy vấn trực tiếp daemon cơ sở dữ liệu để xác nhận dịch vụ đang tiếp nhận kết nối:

docker exec -it snipeit-db mariadb-admin ping -u root -p

2. Tự động hóa sao lưu cơ sở dữ liệu hằng ngày

Đừng bao giờ chỉ dựa vào volume container cục bộ làm phương án an toàn duy nhất. Hãy viết một script sao lưu ở cấp độ máy chủ để dump cơ sở dữ liệu MariaDB và nén lưu trữ các hóa đơn cũng như ảnh chụp tài sản đã tải lên:

cat <<'EOF' > ~/snipe-it/backup-snipeit.sh
#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/var/backups/snipe-it"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
mkdir -p "${BACKUP_DIR}"

# Lấy thông tin xác thực DB từ file .env cục bộ
export $(grep -E '^(DB_DATABASE|DB_USERNAME|DB_PASSWORD)=' ~/snipe-it/.env | xargs)

# Dump cơ sở dữ liệu trực tiếp từ container đang chạy
docker exec snipeit-db mariadb-dump -u "${DB_USERNAME}" -p"${DB_PASSWORD}" "${DB_DATABASE}" \
  | gzip > "${BACKUP_DIR}/snipeit_db_${TIMESTAMP}.sql.gz"

# Nén lưu trữ hóa đơn và ảnh chụp tài sản đã tải lên
docker run --rm \
  -v snipe_data:/source:ro \
  -v "${BACKUP_DIR}:/backup" \
  alpine tar -czf "/backup/snipeit_data_${TIMESTAMP}.tar.gz" -C /source .

# Lưu trữ bản sao lưu trong vòng 30 ngày gần nhất
find "${BACKUP_DIR}" -type f -name "snipeit_*.*" -mtime +30 -delete

echo "[$(date)] Sao lưu hoàn tất thành công: ${TIMESTAMP}"
EOF
chmod +x ~/snipe-it/backup-snipeit.sh

Thiết lập cron job chạy hằng đêm bằng lệnh crontab -e:

0 3 * * * /home/ubuntu/snipe-it/backup-snipeit.sh >> /var/log/snipeit-backup.log 2>&1

3. Tối ưu hóa kiểm kê bằng mã vạch

Snipe-IT hỗ trợ sẵn tính năng tạo mã QR và mã vạch 1D. Truy cập Settings > Barcodes và chọn QRcode hoặc Code 128. Bạn có thể in tem nhãn lên giấy in decal tiêu chuẩn, dán lên khay caddy máy chủ và mặt trước switch, rồi dùng điện thoại quét mã mỗi khi thao tác bảo trì tại tủ rack.

Chỉ với thao tác quét 10 giây, toàn bộ thông số phần cứng, phiên bản firmware và thời hạn bảo hành sẽ hiển thị ngay tại chỗ.

Share: