#!/bin/bash
# Docker环境日系动漫风格404页面一键部署脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查Docker环境
check_docker_nginx() {
log_info "检查Docker Nginx容器..."
# 查找运行的Nginx容器
local nginx_container=$(docker ps --filter "name=nginx" --format "{{.Names}}" | head -1)
if [ -z "$nginx_container" ]; then
nginx_container=$(docker ps --filter "publish=80" --format "{{.Names}}" | head -1)
fi
if [ -z "$nginx_container" ]; then
nginx_container=$(docker ps --filter "publish=443" --format "{{.Names}}" | head -1)
fi
if [ -n "$nginx_container" ]; then
log_success "找到Nginx容器: $nginx_container"
echo "$nginx_container"
return 0
else
log_error "未找到运行的Nginx容器"
return 1
fi
}
# 创建404页面到宿主机目录
create_404_page() {
local host_data_dir="/boot/data/dataxn"
log_info "正在创建日系动漫风格404页面..."
# 检查宿主机目录是否存在
if [ ! -d "$host_data_dir" ]; then
log_warning "目录 $host_data_dir 不存在,正在创建..."
mkdir -p "$host_data_dir"
fi
local html_path="$host_data_dir/404.html"
cat > "$html_path" << 'EOF'
页面未找到 - 404错误
404
おっと!ページが見つかりません
申し訳ありませんが、お探しのページは存在しないか、移動した可能性があります。
迷子になったキャラクターのように、ページもどこかへ行ってしまったようです。
EOF
log_success "404页面已创建: $html_path"
}
# 为Docker容器创建Nginx配置
create_nginx_config() {
local container_name="$1"
log_info "为容器 $container_name 创建Nginx配置..."
# 检查容器内的Nginx配置路径
local nginx_conf_path="/etc/nginx/conf.d/custom_404.conf"
# 创建配置内容
local config_content=$(cat << 'EOF'
# 自定义404错误页面配置
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
internal;
allow all;
}
EOF
)
# 将配置写入容器
echo "$config_content" | docker exec -i "$container_name" tee "$nginx_conf_path" > /dev/null
if [ $? -eq 0 ]; then
log_success "Nginx配置已写入容器: $nginx_conf_path"
else
log_error "无法写入容器配置,请检查容器权限"
return 1
fi
}
# 测试Nginx配置
test_nginx_config() {
local container_name="$1"
log_info "测试容器Nginx配置..."
if docker exec "$container_name" nginx -t; then
log_success "Nginx配置测试通过"
return 0
else
log_error "Nginx配置测试失败"
return 1
fi
}
# 重新加载Nginx
reload_nginx() {
local container_name="$1"
log_info "重新加载容器Nginx配置..."
if docker exec "$container_name" nginx -s reload; then
log_success "Nginx配置已重新加载"
return 0
else
log_error "Nginx重新加载失败"
return 1
fi
}
# 显示Docker特定信息
show_docker_info() {
local container_name="$1"
echo
log_success "日系动漫风格404页面部署完成!"
echo
log_info "部署详情:"
log_info "- 宿主机404页面: /boot/data/dataxn/404.html"
log_info "- Nginx容器: $container_name"
log_info "- 容器内配置: /etc/nginx/conf.d/custom_404.conf"
echo
log_info "目录映射关系:"
log_info "- 宿主机: /boot/data/dataxn → 容器: (请检查您的具体映射路径)"
echo
log_info "测试方法:"
log_info "1. 访问一个不存在的页面: curl http://your-domain/not-exist-page"
log_info "2. 或直接在浏览器中访问不存在的URL"
echo
log_warning "如果您的目录映射不是默认的/usr/share/nginx/html,请手动调整配置"
}
# 主函数
main() {
echo
log_info "开始为Docker Nginx部署日系动漫风格404页面..."
echo
# 检查Docker环境
local container_name=$(check_docker_nginx)
if [ $? -ne 0 ]; then
exit 1
fi
# 执行部署步骤
create_404_page
create_nginx_config "$container_name"
# 测试并重新加载Nginx
if test_nginx_config "$container_name"; then
reload_nginx "$container_name"
show_docker_info "$container_name"
else
log_error "部署失败,请检查Nginx配置"
exit 1
fi
}
# 显示使用说明
usage() {
echo "Docker环境日系动漫风格404页面一键部署脚本"
echo
echo "使用方法: $0 [选项]"
echo
echo "选项:"
echo " -h, --help 显示此帮助信息"
echo " -i, --install 执行安装部署"
echo
echo "示例:"
echo " $0 --install 部署404页面"
}
# 参数处理
case "${1:-}" in
-h|--help)
usage
exit 0
;;
-i|--install|"")
main
;;
*)
log_error "未知选项: $1"
usage
exit 1
;;
esac