#!/bin/bash set -euo pipefail PROJECT_NAME="rust-backend" REMOTE_USER="root" REMOTE_HOST="1panel-server" APP_ENV="${1:-production}" # 根据环境选择远程目录和服务 case "${APP_ENV}" in development) REMOTE_DIR="/root/rust/rust_backend_dev" SERVICE_NAME="rust-backend-dev.service" ;; production) REMOTE_DIR="/root/rust/rust_backend" SERVICE_NAME="rust-backend.service" ;; *) echo "无效的环境: ${APP_ENV}" echo "支持的環境: development, production" exit 1 ;; esac log_info() { echo -e "\033[32m[INFO]\033[0m $1" } log_error() { echo -e "\033[31m[ERROR]\033[0m $1" >&2 exit 1 } check_dependencies() { local deps=("cargo" "rsync" "ssh") for cmd in "${deps[@]}"; do if ! command -v "$cmd" &> /dev/null; then log_error "依赖命令 '$cmd' 未找到,请先安装。" fi done log_info "所有依赖项检查通过。" } build_project() { log_info "开始编译项目 (release模式),环境=${APP_ENV}..." if APP_ENV="${APP_ENV}" cargo build --release; then log_info "项目编译成功。" else log_error "项目编译失败!" fi } upload_binary() { local binary_path="./target/release/${PROJECT_NAME}" if [ ! -f "$binary_path" ]; then log_error "编译产物未找到: $binary_path" fi log_info "正在上传二进制文件到 ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}..." rsync -avzP --progress "$binary_path" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/" log_info "文件上传成功。" } upload_config() { log_info "正在上传配置文件到 ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/config/..." rsync -avzP --progress ./config/ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/config/" log_info "配置文件上传成功。" } restart_remote_service() { log_info "正在重启远程服务 '${SERVICE_NAME}'..." if ssh "${REMOTE_USER}@${REMOTE_HOST}" "systemctl restart ${SERVICE_NAME}"; then log_info "远程服务重启成功。" else log_error "远程服务重启失败!请检查服务状态和日志。" fi } main() { log_info "========== 开始部署 (环境: ${APP_ENV}) ==========" log_info "远程目录: ${REMOTE_DIR}" log_info "服务名称: ${SERVICE_NAME}" check_dependencies build_project upload_binary upload_config restart_remote_service log_info "========== 部署完成! ==========" } main