This commit is contained in:
beabigegg
2025-08-28 08:59:46 +08:00
parent b9557250a4
commit 4f7f46b07a
42 changed files with 4992 additions and 494 deletions

368
start-linux.sh Normal file
View File

@@ -0,0 +1,368 @@
#!/bin/bash
# ========================================
# 暫時規範管理系統 V3 - Linux 啟動腳本
# ========================================
set -e # 遇到錯誤立即退出
echo
echo "====================================="
echo "暫時規範管理系統 V3 - Linux 啟動"
echo "====================================="
echo
# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 檢查 Python 是否已安裝
if ! command -v python3 &> /dev/null; then
echo -e "${RED}[錯誤]${NC} Python3 未安裝"
echo "請安裝 Python 3.8+ 後重新執行此腳本"
echo
echo "Ubuntu/Debian: sudo apt update && sudo apt install python3 python3-pip python3-venv"
echo "CentOS/RHEL: sudo yum install python3 python3-pip"
echo "或使用包管理器安裝"
exit 1
fi
# 檢查 Docker 是否已安裝
if ! command -v docker &> /dev/null; then
echo -e "${YELLOW}[警告]${NC} Docker 未安裝或未運行"
echo "如需使用 Docker 模式,請先安裝 Docker"
echo
USE_DOCKER=false
else
# 檢查 Docker 是否運行
if ! docker info &> /dev/null; then
echo -e "${YELLOW}[警告]${NC} Docker 未運行"
echo "請啟動 Docker 服務: sudo systemctl start docker"
USE_DOCKER=false
else
USE_DOCKER=true
fi
fi
# 檢查 docker-compose 是否存在
if [[ "$USE_DOCKER" == true ]] && ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
echo -e "${YELLOW}[警告]${NC} docker-compose 未安裝"
USE_DOCKER=false
fi
# 檢查 .env 檔案
if [[ ! -f ".env" ]]; then
echo -e "${BLUE}[提示]${NC} 未找到 .env 檔案,正在複製範例檔案..."
cp ".env.example" ".env"
echo
echo -e "${YELLOW}[重要]${NC} 請編輯 .env 檔案並設定正確的參數值:"
echo "- 資料庫連線資訊"
echo "- LDAP/AD 伺服器設定"
echo "- SMTP 郵件伺服器設定"
echo
read -p "是否已完成 .env 檔案設定?(y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "請先設定 .env 檔案後再執行此腳本"
exit 1
fi
fi
# 提供啟動選項
echo "請選擇啟動模式:"
echo
if [[ "$USE_DOCKER" == true ]]; then
echo "[1] Docker 容器化部署 (推薦)"
echo "[2] 本地 Python 直接執行"
echo "[3] 僅啟動外部服務 (MySQL + ONLYOFFICE)"
echo "[4] 生產環境部署 (含 Nginx)"
echo "[5] 系統服務安裝 (systemd)"
else
echo "[2] 本地 Python 直接執行"
echo "[5] 系統服務安裝 (systemd)"
echo
echo -e "${YELLOW}注意Docker 相關選項不可用${NC}"
fi
echo
read -p "請輸入選項: " choice
case $choice in
1)
if [[ "$USE_DOCKER" != true ]]; then
echo -e "${RED}[錯誤]${NC} Docker 不可用,請選擇其他選項"
exit 1
fi
start_docker
;;
2)
start_manual
;;
3)
if [[ "$USE_DOCKER" != true ]]; then
echo -e "${RED}[錯誤]${NC} Docker 不可用,請選擇其他選項"
exit 1
fi
start_services_only
;;
4)
if [[ "$USE_DOCKER" != true ]]; then
echo -e "${RED}[錯誤]${NC} Docker 不可用,請選擇其他選項"
exit 1
fi
start_production
;;
5)
install_systemd_service
;;
*)
if [[ "$USE_DOCKER" == true ]]; then
start_docker
else
start_manual
fi
;;
esac
function start_docker() {
echo
echo "================================="
echo "使用 Docker Compose 啟動系統..."
echo "================================="
echo
# 檢查 compose 命令
if command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
# 停止並清理舊的容器
echo -e "${BLUE}[步驟 1]${NC} 清理舊容器..."
$COMPOSE_CMD down
# 重新構建並啟動服務
echo -e "${BLUE}[步驟 2]${NC} 構建並啟動服務..."
$COMPOSE_CMD up --build -d
# 等待服務啟動
echo -e "${BLUE}[步驟 3]${NC} 等待服務啟動..."
sleep 30
# 初始化資料庫
echo -e "${BLUE}[步驟 4]${NC} 初始化資料庫..."
$COMPOSE_CMD exec -T app python init_db.py --auto-yes || true
# 顯示狀態
echo -e "${BLUE}[步驟 5]${NC} 檢查服務狀態..."
$COMPOSE_CMD ps
echo
echo -e "${GREEN}============================"
echo "系統啟動完成!"
echo "============================${NC}"
echo
echo "服務訪問地址:"
echo "- 主系統http://localhost:5000"
echo "- ONLYOFFICEhttp://localhost:8080"
echo "- MySQLlocalhost:3306"
echo
echo "管理命令:"
echo "- 查看日誌:$COMPOSE_CMD logs -f"
echo "- 停止服務:$COMPOSE_CMD down"
echo "- 重啟服務:$COMPOSE_CMD restart"
echo
}
function start_services_only() {
echo
echo "==============================="
echo "僅啟動外部服務..."
echo "==============================="
echo
if command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
$COMPOSE_CMD up -d mysql onlyoffice
echo
echo -e "${GREEN}外部服務已啟動!${NC}"
echo "- MySQLlocalhost:3306"
echo "- ONLYOFFICEhttp://localhost:8080"
echo
echo "請使用以下命令啟動 Flask 應用:"
echo "python3 app.py"
echo
}
function start_production() {
echo
echo "==============================="
echo "生產環境部署 (含 Nginx)..."
echo "==============================="
echo
if command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
COMPOSE_CMD="docker compose"
fi
$COMPOSE_CMD --profile production up --build -d
echo
echo -e "${GREEN}生產環境已啟動!${NC}"
echo "- 系統入口http://localhost (透過 Nginx)"
echo "- 直接訪問http://localhost:5000"
echo
}
function start_manual() {
echo
echo "==============================="
echo "本地 Python 環境啟動..."
echo "==============================="
echo
# 檢查虛擬環境
if [[ -d "venv" ]]; then
echo -e "${BLUE}[步驟 1]${NC} 啟用虛擬環境..."
source venv/bin/activate
else
echo -e "${YELLOW}[警告]${NC} 未找到虛擬環境,建議先建立:"
echo "python3 -m venv venv"
echo "source venv/bin/activate"
echo "pip install -r requirements.txt"
echo
read -p "是否立即建立虛擬環境?(y/N): " create_venv
if [[ "$create_venv" =~ ^[Yy]$ ]]; then
python3 -m venv venv
source venv/bin/activate
echo -e "${GREEN}虛擬環境已建立並啟用${NC}"
fi
fi
# 安裝依賴
echo -e "${BLUE}[步驟 2]${NC} 檢查並安裝依賴..."
pip install -r requirements.txt
# 檢查外部服務
echo -e "${BLUE}[步驟 3]${NC} 檢查外部服務..."
echo
echo -e "${YELLOW}[重要提醒]${NC} 請確保以下服務已啟動:"
echo
echo "1. MySQL 資料庫伺服器"
echo " - 可使用: docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0"
echo
echo "2. ONLYOFFICE Document Server"
echo " - 可使用: docker run -d -p 8080:80 onlyoffice/documentserver"
echo
echo "3. LDAP/AD 伺服器 (如果適用)"
echo "4. SMTP 郵件伺服器 (如果適用)"
echo
read -p "外部服務是否已準備就緒?(y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "請先啟動必要的外部服務"
exit 1
fi
# 初始化資料庫
echo -e "${BLUE}[步驟 4]${NC} 初始化資料庫..."
python3 init_db.py || python init_db.py
# 啟動應用
echo -e "${BLUE}[步驟 5]${NC} 啟動 Flask 應用..."
echo
echo "啟動中... (Ctrl+C 停止)"
echo "訪問地址: http://localhost:5000"
echo
# 根據系統環境選擇啟動方式
if command -v gunicorn &> /dev/null; then
echo "使用 Gunicorn 啟動生產模式..."
gunicorn -w 4 -b 0.0.0.0:5000 app:app
else
echo "使用 Flask 開發伺服器啟動..."
python3 app.py || python app.py
fi
}
function install_systemd_service() {
echo
echo "==============================="
echo "安裝為系統服務 (systemd)..."
echo "==============================="
echo
# 檢查是否為 root 用戶
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}[錯誤]${NC} 需要 root 權限安裝系統服務"
echo "請使用 sudo 執行此腳本"
exit 1
fi
# 獲取當前目錄和用戶
CURRENT_DIR=$(pwd)
CURRENT_USER=${SUDO_USER:-$USER}
echo "安裝目錄: $CURRENT_DIR"
echo "執行用戶: $CURRENT_USER"
echo
# 建立服務檔案
cat > /etc/systemd/system/tempspec.service << EOF
[Unit]
Description=Temp Spec System V3
After=network.target mysql.service
[Service]
Type=simple
User=$CURRENT_USER
Group=$CURRENT_USER
WorkingDirectory=$CURRENT_DIR
Environment=PATH=$CURRENT_DIR/venv/bin
ExecStart=$CURRENT_DIR/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app
ExecReload=/bin/kill -HUP \$MAINPID
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
# 重新載入 systemd
systemctl daemon-reload
# 啟用服務
systemctl enable tempspec.service
echo -e "${GREEN}系統服務安裝完成!${NC}"
echo
echo "管理命令:"
echo "- 啟動服務: sudo systemctl start tempspec"
echo "- 停止服務: sudo systemctl stop tempspec"
echo "- 重啟服務: sudo systemctl restart tempspec"
echo "- 查看狀態: sudo systemctl status tempspec"
echo "- 查看日誌: sudo journalctl -u tempspec -f"
echo
read -p "是否立即啟動服務?(y/N): " start_now
if [[ "$start_now" =~ ^[Yy]$ ]]; then
systemctl start tempspec
systemctl status tempspec --no-pager
fi
}
# 捕捉 Ctrl+C
trap 'echo -e "\n${YELLOW}操作已取消${NC}"; exit 130' INT
echo
echo -e "${GREEN}腳本執行完成!${NC}"