feat(deploy): 增强 deploy.sh 日志和服务管理功能

新增选项:
- --logs [N]     查看后端日志(默认50行)
- --tail [N]     实时跟踪后端日志(Ctrl+C 退出)
- --status       查看服务状态
- --post-logs    部署后自动显示日志

改进:
- 修复 --help 选项无法正确处理的 bug
- 优化参数解析逻辑(先选项后位置参数)
This commit is contained in:
2026-04-19 17:40:23 +08:00
parent 14c2ef25de
commit 45ed78a883

144
deploy.sh
View File

@@ -18,7 +18,7 @@ set -euo pipefail
PROJECT_NAME="rust-backend"
REMOTE_USER="root"
REMOTE_HOST="1panel-server"
APP_ENV="${1:-production}"
APP_ENV="production"
# 默认选项
DRY_RUN=false
@@ -26,12 +26,16 @@ SKIP_CONFIRM=false
SKIP_TESTS=false
ROLLBACK=false
LIST_BACKUPS=false
VIEW_LOGS=false
TAIL_LOGS=false
LOG_LINES=50
VIEW_STATUS=false
POST_DEPLOY_LOGS=false
# 全局变量(部署流程中使用)
BACKUP_PATH=""
# 解析选项
shift 2>/dev/null || true
# 解析选项(先处理选项,再处理位置参数)
while [[ $# -gt 0 ]]; do
case "$1" in
--dry-run)
@@ -49,6 +53,26 @@ while [[ $# -gt 0 ]]; do
--backup-list)
LIST_BACKUPS=true
;;
--logs)
VIEW_LOGS=true
;;
--tail)
TAIL_LOGS=true
;;
--logs=*)
VIEW_LOGS=true
LOG_LINES="${1#*=}"
;;
--tail=*)
TAIL_LOGS=true
LOG_LINES="${1#*=}"
;;
--status)
VIEW_STATUS=true
;;
--post-logs)
POST_DEPLOY_LOGS=true
;;
--help|-h)
echo "用法: $0 [development|production] [options]"
echo ""
@@ -58,11 +82,21 @@ while [[ $# -gt 0 ]]; do
echo " --skip-tests 跳过部署后测试"
echo " --rollback 回滚到上一个备份版本"
echo " --backup-list 列出可用备份"
echo " --logs [N] 查看后端日志默认50行"
echo " --tail [N] 实时跟踪后端日志Ctrl+C 退出)"
echo " --status 查看服务状态"
echo " --post-logs 部署后自动显示日志"
exit 0
;;
*)
echo "未知选项: $1"
exit 1
# 位置参数development 或 production
if [[ "$1" == "development" || "$1" == "production" ]]; then
APP_ENV="$1"
else
echo "未知选项: $1"
echo "用法: $0 [development|production] [options]"
exit 1
fi
;;
esac
shift
@@ -185,6 +219,82 @@ list_backups() {
echo ""
}
# 查看后端日志
view_logs() {
local lines="${LOG_LINES:-50}"
log_step "查看后端日志(最后 ${lines} 行)..."
echo ""
if [ "$DRY_RUN" = true ]; then
log_dry "ssh ${REMOTE_USER}@${REMOTE_HOST} 'tail -${lines} ${REMOTE_DIR}/logs/rust-backend.*.log'"
return 0
fi
# 获取最新的日志文件
local log_file
log_file=$(ssh "${REMOTE_USER}@${REMOTE_HOST}" "ls -t ${REMOTE_DIR}/logs/rust-backend.*.log 2>/dev/null | head -1" || echo "")
if [ -z "$log_file" ]; then
log_warn "未找到日志文件: ${REMOTE_DIR}/logs/"
return 1
fi
echo -e "${BLUE}=== ${log_file} ===${NC}"
echo ""
ssh "${REMOTE_USER}@${REMOTE_HOST}" "tail -${lines} \"${log_file}\""
echo ""
}
# 实时跟踪后端日志
tail_logs() {
local lines="${LOG_LINES:-100}"
log_step "实时跟踪后端日志(最后 ${lines} 行,按 Ctrl+C 退出)..."
echo ""
if [ "$DRY_RUN" = true ]; then
log_dry "ssh ${REMOTE_USER}@${REMOTE_HOST} 'tail -f -n ${lines} ${REMOTE_DIR}/logs/rust-backend.*.log'"
return 0
fi
# 获取最新的日志文件
local log_file
log_file=$(ssh "${REMOTE_USER}@${REMOTE_HOST}" "ls -t ${REMOTE_DIR}/logs/rust-backend.*.log 2>/dev/null | head -1" || echo "")
if [ -z "$log_file" ]; then
log_warn "未找到日志文件: ${REMOTE_DIR}/logs/"
return 1
fi
echo -e "${BLUE}=== 实时日志: ${log_file} ===${NC}"
echo -e "${YELLOW}按 Ctrl+C 退出${NC}"
echo ""
ssh -t "${REMOTE_USER}@${REMOTE_HOST}" "tail -f -n ${lines} \"${log_file}\""
}
# 查看服务状态
status() {
log_step "服务状态..."
echo ""
if [ "$DRY_RUN" = true ]; then
log_dry "ssh ${REMOTE_USER}@${REMOTE_HOST} 'systemctl status ${SERVICE_NAME}'"
return 0
fi
echo -e "${BLUE}=== ${SERVICE_NAME} ===${NC}"
ssh "${REMOTE_USER}@${REMOTE_HOST}" "systemctl status ${SERVICE_NAME} --no-pager"
echo ""
echo -e "${BLUE}=== 最近日志 ===${NC}"
local log_file
log_file=$(ssh "${REMOTE_USER}@${REMOTE_HOST}" "ls -t ${REMOTE_DIR}/logs/rust-backend.*.log 2>/dev/null | head -1" || echo "")
if [ -n "$log_file" ]; then
echo -e "${BLUE}=== ${log_file} ===${NC}"
ssh "${REMOTE_USER}@${REMOTE_HOST}" "tail -20 \"${log_file}\""
fi
echo ""
}
# 回滚(手动触发)
rollback() {
log_step "查找最新备份..."
@@ -922,6 +1032,24 @@ main() {
exit 0
fi
if [ "$VIEW_LOGS" = true ]; then
ssh_connect
view_logs
exit 0
fi
if [ "$TAIL_LOGS" = true ]; then
ssh_connect
tail_logs
exit 0
fi
if [ "$VIEW_STATUS" = true ]; then
ssh_connect
status
exit 0
fi
if [ "$ROLLBACK" = true ]; then
ssh_connect
rollback
@@ -953,6 +1081,12 @@ main() {
echo -e " Git: ${GIT_VERSION}"
echo -e " 环境: ${APP_ENV}"
echo ""
if [ "$POST_DEPLOY_LOGS" = true ]; then
echo ""
log_step "显示最近日志..."
view_logs
fi
else
log_error "========== 部署失败,已自动回滚 =========="
echo -e " Git: ${GIT_VERSION}"