2ND
This commit is contained in:
368
start-linux.sh
Normal file
368
start-linux.sh
Normal 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 "- ONLYOFFICE:http://localhost:8080"
|
||||
echo "- MySQL:localhost: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 "- MySQL:localhost:3306"
|
||||
echo "- ONLYOFFICE:http://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}"
|
Reference in New Issue
Block a user