NFCcreate-web/install.sh
2025-09-25 19:04:00 +08:00

265 lines
6.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# NFC 生產工具 - Linux 安裝腳本
# 適用於 Ubuntu/Debian/CentOS/RHEL
set -e
# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日誌函數
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 檢測作業系統
detect_os() {
if [[ -f /etc/os-release ]]; then
. /etc/os-release
OS=$NAME
VER=$VERSION_ID
else
log_error "無法檢測作業系統"
exit 1
fi
log_info "檢測到作業系統: $OS $VER"
}
# 安裝系統依賴
install_system_deps() {
log_info "安裝系統依賴套件..."
case $OS in
*"Ubuntu"*|*"Debian"*)
sudo apt update
sudo apt install -y python3 python3-pip python3-venv gcc make curl wget
;;
*"CentOS"*|*"Red Hat"*|*"Rocky"*|*"AlmaLinux"*)
sudo yum update -y
sudo yum install -y python3 python3-pip gcc make curl wget
;;
*)
log_error "不支援的作業系統: $OS"
exit 1
;;
esac
log_success "系統依賴安裝完成"
}
# 設定 USB 權限
setup_usb_permissions() {
log_info "設定 USB 裝置權限..."
# 創建 udev 規則
sudo tee /etc/udev/rules.d/99-ufr.rules << EOF
# uFR NFC 讀卡機權限規則
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="0666"
EOF
# 重新載入 udev 規則
sudo udevadm control --reload-rules
sudo udevadm trigger
# 將使用者加入 dialout 群組
if ! groups $USER | grep -q dialout; then
sudo usermod -a -G dialout $USER
log_info "已將使用者 $USER 加入 dialout 群組"
log_warning "請重新登入以套用群組變更"
fi
log_success "USB 權限設定完成"
}
# 設定 Python 虛擬環境
setup_python_env() {
log_info "設定 Python 虛擬環境..."
# 檢查 Python 版本
if ! python3 -c "import sys; exit(0 if sys.version_info >= (3, 7) else 1)" 2>/dev/null; then
log_error "需要 Python 3.7 或以上版本"
exit 1
fi
# 如果虛擬環境已存在但損壞,先刪除
if [[ -d "myenv" ]]; then
log_warning "發現現有虛擬環境,正在重新創建..."
rm -rf myenv
fi
# 創建虛擬環境
python3 -m venv myenv
log_success "Python 虛擬環境創建完成"
# 啟動虛擬環境並安裝依賴
source myenv/bin/activate
# 確保 pip 是最新版本
log_info "升級 pip..."
python -m pip install --upgrade pip
# 安裝依賴套件
log_info "安裝 Python 套件..."
pip install -r requirements.txt
log_success "Python 環境設定完成"
}
# 設定檔案權限
setup_file_permissions() {
log_info "設定檔案權限..."
# 設定執行權限
chmod +x start.sh
chmod +x install.sh
if [[ -f "linux64_release/nt4h_c_example" ]]; then
chmod +x linux64_release/nt4h_c_example
fi
if [[ -f "linux64_release/libnt4h_c.so" ]]; then
chmod +x linux64_release/libnt4h_c.so
fi
# 設定設定檔權限
if [[ -f "linux64_release/keys.txt" ]]; then
chmod 666 linux64_release/keys.txt
fi
if [[ -f "linux64_release/urls.txt" ]]; then
chmod 666 linux64_release/urls.txt
fi
log_success "檔案權限設定完成"
}
# 創建 systemd 服務(可選)
create_systemd_service() {
# 檢查並刪除現有的 NFCapp.service
if [[ -f "/etc/systemd/system/NFCapp.service" ]]; then
log_warning "發現現有的 NFCapp.service正在刪除..."
sudo systemctl stop NFCapp.service 2>/dev/null || true
sudo systemctl disable NFCapp.service 2>/dev/null || true
sudo rm -f /etc/systemd/system/NFCapp.service
sudo systemctl daemon-reload
log_success "現有的 NFCapp.service 已刪除"
fi
read -p "是否要創建 systemd 服務?(y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
log_info "創建 systemd 服務..."
# 獲取當前目錄的絕對路徑
CURRENT_DIR=$(pwd)
sudo tee /etc/systemd/system/NFCapp.service << EOF
[Unit]
Description=NFC App
After=network.target
[Service]
Type=simple
User=digitalent
WorkingDirectory=/home/digitalent/ufr_zero
ExecStart=/home/digitalent/ufr_zero/myenv/bin/python /home/digitalent/ufr_zero/app.py
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 重新載入 systemd
sudo systemctl daemon-reload
log_success "systemd 服務創建完成"
log_info "使用以下命令管理服務:"
echo " 啟動服務: sudo systemctl start NFCapp.service"
echo " 停止服務: sudo systemctl stop NFCapp.service"
echo " 啟用開機自啟: sudo systemctl enable NFCapp.service"
echo " 查看狀態: sudo systemctl status NFCapp.service"
echo " 查看日誌: sudo journalctl -u NFCapp.service -f"
fi
}
# 顯示安裝完成資訊
show_completion_info() {
echo
log_success "=== NFC 生產工具安裝完成 ==="
echo
log_info "安裝位置: $(pwd)"
log_info "Python 虛擬環境: myenv/"
echo
log_info "啟動方式:"
echo " 1. 直接啟動: ./start.sh"
echo " 2. 背景執行: nohup ./start.sh > app.log 2>&1 &"
echo " 3. systemd 服務: sudo systemctl start nfc-web.service"
echo
log_info "Web 介面: http://localhost:5000"
echo
log_info "重要提醒:"
echo " - 請確保 uFR NFC 讀卡機已正確連接"
echo " - 檢查 keys.txt 和 urls.txt 檔案內容"
echo " - 設定 API URL 以啟用資料庫上傳功能"
echo
log_warning "如果重新登入後仍有 USB 權限問題,請執行:"
echo " sudo udevadm control --reload-rules"
echo " sudo udevadm trigger"
echo
}
# 主安裝流程
main() {
echo "=========================================="
echo " NFC 生產工具 - Linux 安裝腳本"
echo "=========================================="
echo
# 檢查是否為 root 使用者
if [[ $EUID -eq 0 ]]; then
log_error "請勿使用 root 使用者執行此腳本"
exit 1
fi
# 檢查必要檔案
if [[ ! -f "app.py" ]] || [[ ! -f "requirements.txt" ]]; then
log_error "請在專案根目錄執行此腳本"
exit 1
fi
# 執行安裝步驟
detect_os
install_system_deps
setup_usb_permissions
setup_python_env
setup_file_permissions
create_systemd_service
# 顯示完成資訊
show_completion_info
}
# 執行主函數
main "$@"