1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#!/bin/bash

# ================================
# 博客自动部署脚本
# 文件名:blog_deploy.sh
# 作用:一键部署Hexo博客到Nginx
# 作者:lifeu
# 版本:1.0
# 日期:2025-10-23
# ================================

#颜色定义(让输出更美观)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'
#No Color

#配置变量
BLOG_DIR="/root/myblog"
WEB_DIR="/usr/share/nginx/html"
BACKUP_DIR="/backup/blog"
LOG_FILE="/var/log/blog_deploy.log"

#日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC}$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}

log_warn() {
echo -e "${YELLOW}[WARN]${NC}$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}

log_error() {
echo -e "${RED}[ERROR]${NC}$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}

#检查环境函数
check_environment() {
log_info "开始环境检查..."

#检查博客目录
if [ ! -d "$BLOG_DIR" ]; then
log_error "博客目录不存在: $BLOG_DIR"
exit 1
fi

#检查Hexo命令
if ! command -v hexo &> /dev/null; then
log_error "Hexo命令未找到,请先安装Hexo"
exit 1
fi

#检查Nginx服务
if ! systemctl is-active --quiet nginx; then
log_warn "Nginx服务未运行,尝试启动..."
sudo systemctl start nginx
if [ $? -ne 0 ]; then
log_error "无法启动Nginx服务"
exit 1
fi
fi

log_info "环境检查完成"
}


#备份现有网站函数
backup_website() {
log_info "开始备份现有网站"

#创建备份目录
BACKUP_PATH="$BACKUP_DIR/$(date '+%Y%m%d_%H%M%S')"
sudo mkdir -p "$BACKUP_PATH"

#备份现有文件
if [ "$(ls -A $WEB_DIR)" ];then
sudo cp -r "$WEB_DIR"/* "$BACKUP_PATH"/
else
log_warn "Web目录为空,跳过备份"
fi
}


#生成博客函数
generate_blog() {
log_info "开始生成博客静态文件..."

cd "$BLOG_DIR"

#清理缓存
log_info "清理Hexo缓存..."
hexo clean
if [ $? -ne 0 ]; then
log_error "清理缓存失败"
exit 1
fi

#生成静态文件
log_info "生成静态文件..."
hexo generate
if [ $? -ne 0 ]; then
log_error "生成静态文件失败"
exit 1
fi

#检查生成结果
if [ ! -d "$BLOG_DIR/public" ] || [ -z "$(ls -A $BLOG_DIR/public)" ]; then
log_error "静态文件生成失败或为空"
exit 1
fi

log_info "博客生成完成"
}

#部署网站函数
deploy_website() {
log_info "开始部署网站..."

#清空Wbe目录
sudo rm -rf "$WEB_DIR"/*

#复制新文件
sudo cp -r "$BLOG_DIR/public"/* "$WEB_DIR"/
if [ $? -ne 0 ]; then
log_error "文件复制失败"
exit 1
fi

#设置文件权限
sudo chown -R nginx:nginx "$WEB_DIR"
sudo chmod -R 644 "$WEB_DIR"
sudo find "$WEB_DIR" -type d -exec chmod 755 {} \;

log_info "网站部署完成"
}

#重启服务函数
restart_services() {
log_info "重启相关服务..."

#测试Nginx配置
sudo nginx -t
if [ $? -ne 0 ]; then
log_error "Nginx配置测试失败"
exit 1
fi

#重新加载Nginx
sudo systemctl reload nginx
if [ $? -ne 0 ]; then
log_error "Nginx重新加载失败"
exit 1
fi

log_info "服务重启完成"
}

#验证部署函数
verify_deployment() {
log_info "验证部署结果..."

#检查网站文件
if [ ! -f "$WEB_DIR/index.html" ]; then
log_error "网站首页文件不存在"
exit 1
fi


#测试HTTP响应
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost)
if [ "$HTTP_CODE" != "200" ]; then
log_error "网站HTTP响应异常: $HTTP_CODE"
exit 1
fi

log_info "部署验证成功"
}

#显示部署信息函数
show_deployment_info() {
echo ""
echo -e "${BLUE}================================================${NC}"
echo -e "${BLUE} 博客部署成功!${NC}"
echo -e "${BLUE}================================================${NC}"
echo ""
echo -e "博客地址:${GREEN}<http://$>(curl -s ifconfig.me)${NC}"
echo -e "本地预览:${GREEN}<http://localhost>${NC}"
echo -e "部署时间:${GREEN}$(date '+%Y-%m-%d %H:%M:%S')${NC}"
echo -e "日志文件:${GREEN}$LOG_FILE${NC}"
echo ""
echo -e "${YELLOW}提示:可以通过浏览器访问上述地址查看博客${NC}"
echo ""
}

#主函数
main() {
echo -e "${BLUE}开始执行博客自动部署脚本...${NC}"
echo ""

#创建日志目录
sudo mkdir -p "$(dirname $LOG_FILE)"

#执行部署流程
check_environment
backup_website
generate_blog
deploy_website
restart_services
verify_deployment
show_deployment_info

log_info "博客部署脚本执行完成"
}

#脚本入口点
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi