https://mmwave.duckdns.org/mmwave/login ============================================ python3 -m venv venv # 在目前資料夾產生一個 venv 資料夾 source venv/bin/activate pip install flask flask-socketio flask-sqlalchemy pymysql nohup python3 app.py > flask_log.txt 2>&1 & sudo fuser -k 5000/tcp && python3 app.py # 快速重啟指令 sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf sudo mkdir -p /var/log/mysql sudo chown -R mysql:mysql /var/log/mysql sudo chmod 750 /var/log/mysql sudo systemctl restart mariadb systemctl status mariadb ============================================ /mmwave │── app.py # 專案入口,負責啟動與整合 │── database.py # 專案共用的資料庫連線邏輯 │── /blueprints # 存放各個功能模組 │ │── auth.py # 登入、註冊、使用者管理 │ │── main.py # 儀表板、WebSocket 邏輯 │ └── line.py # Line Webhook、綁定功能 │── /templates # HTML 檔案 │── /static # CSS, JS, 圖片檔案 └── venv/ # 虛擬環境 ============================================ 方法三:使用 Systemd (最專業、開機自動啟動) 如果你希望 GCP VM 萬一「自動重啟(例如維護)」後,Flask 能自動跑起來,這才是最終解決方案。 建立設定檔:sudo nano /etc/systemd/system/mmwave.service 貼入以下內容(請修改路徑): Ini, TOML [Unit] Description=Gunicorn instance to serve mmWave Flask App After=network.target [Service] User=mmwave Group=www-data WorkingDirectory=/home/mmwave/public_html/mmwave Environment="PATH=/home/mmwave/public_html/mmwave/venv/bin" ExecStart=/home/mmwave/public_html/mmwave/venv/bin/python3 app.py [Install] WantedBy=multi-user.target 啟動服務: Bash sudo systemctl start mmwave sudo systemctl enable mmwave # 設定開機自啟 sudo systemctl start mmwave # 查看狀態 ================================= # 1. 讓系統讀取新的 service 設定 sudo systemctl daemon-reload # 2. 殺掉可能殘留的 Port 5000 進程 sudo fuser -k 5000/tcp # 3. 重新啟動服務 sudo systemctl restart mmwave # 4. 檢查是否變成綠色的 Active: active (running) sudo systemctl status mmwave 重開: sudo systemctl stop mmwave sudo pkill -9 -f gunicorn sudo pkill -9 -f flask sudo pkill -9 -f python # 進入虛擬環境 source /home/mmwave/public_html/mmwave/venv/bin/activate # 離開虛擬環境 deactivate ===========資料庫MariaDB================= mysql -u webuser -p -h 127.0.0.1 mmwave_v2 U1224006 資料庫權限:GRANT SELECT, INSERT, UPDATE, DELETE, TRIGGER ON `mmwave_v3`.* TO 'webuser'@'%' IDENTIFIED BY 'U1224006'; ===0525 資料庫關聯架構圖============================= cat mmwave_v3_schema.sql dbdiagram.io // ⚡ 居家監測系統 (mmwave_v3) 資料庫關聯架構圖 Table rooms { room_id int [pk, note: '房間識別編碼'] room_name varchar [note: '房間名稱'] last_activity enum [note: '最後偵測動作'] last_x float [note: '最後 X 座標'] last_y float [note: '最後 Y 座標'] last_confidence float [note: '最後信心水準'] current_act_start datetime [note: '目前動作開始時間'] last_seen_activity datetime [note: '最後活動更新時間'] last_seen_position datetime [note: '最後座標更新時間'] } Table radar_devices { device_id int [pk, note: '雷達設備識別編碼'] room_id int [note: '所屬 rooms 表的識別編碼'] device_name varchar [note: '設備名稱'] device_role enum [note: '設備職責 (position/activity/all)'] status enum [note: '設備狀態 (active/inactive)'] } Table activity_logs { log_id bigint [pk, note: '活動紀錄識別編碼'] device_id int [note: '所屬 radar_devices 表的識別編碼'] activity_type enum [note: '動作類型'] x_coord float [note: 'X 座標位置'] y_coord float [note: 'Y 座標位置'] confidence float [note: '數值信心水準'] record_time datetime [note: '紀錄發生時間'] } Table event_logs { event_id int [pk, note: '異常事件識別編碼'] device_id int [note: '所屬 radar_devices 表的識別編碼'] event_type enum [note: '警報類型 (fall/no_move/no_home)'] event_time datetime [note: '警報發生時間'] handled tinyint [note: '處理狀態 (0=未處理, 1=已處理)'] handled_by varchar [note: '解除警報的處理人姓名'] } Table users { user_id int [pk, note: '使用者識別編碼'] username varchar [note: '登入帳號'] password_hash varchar [note: '加密密碼'] name varchar [note: '使用者真實姓名'] role enum [note: '系統角色 (admin/family/caregiver)'] line_user_id varchar [note: '綁定的 LINE ID'] bind_code varchar [note: 'LINE 綁定碼'] is_active tinyint [note: '帳號是否啟用 (1=啟用, 0=停用)'] created_at timestamp [note: '帳號建立時間'] last_login datetime [note: '最後登入時間'] notify_enabled tinyint [note: 'LINE推播通知開關 (1=開, 0=關)'] } Table notifications { notify_id int [pk, note: '推播紀錄識別編碼'] event_id int [note: '所屬 event_logs 表的識別編碼'] user_id int [note: '所屬 users 表的識別編碼 (接收人)'] sent_time datetime [note: '推播發送時間'] } Table system_settings { setting_key varchar [pk, note: '系統設定鍵名'] setting_value varchar [note: '設定數值 (例如分鐘數)'] } // 🔗 建立資料表之間的關聯性 (Foreign Keys) // 語法: Ref: 子表.外鍵 > 主表.主鍵 (多對一關係) Ref: radar_devices.room_id > rooms.room_id Ref: activity_logs.device_id > radar_devices.device_id Ref: event_logs.device_id > radar_devices.device_id Ref: notifications.event_id > event_logs.event_id Ref: notifications.user_id > users.user_id