- 使用 toml crate 替代 config crate 直接读取配置文件 - 创建 config/default.toml、config/development.toml、config/production.toml - 重写 config.rs 支持多环境配置加载 - 增强 deploy.sh 支持 development/production 环境参数 - 更新 IMPROVEMENTS.md 标记环境区分完成
99 lines
2.7 KiB
Bash
Executable File
99 lines
2.7 KiB
Bash
Executable File
#!/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() {
|
||
# development 环境跳过(远程已有正确配置,使用 localhost 连接)
|
||
if [ "${APP_ENV}" = "development" ]; then
|
||
log_info "跳过配置文件上传(development 环境使用远程已有配置)..."
|
||
return 0
|
||
fi
|
||
|
||
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 |