#!/bin/bash # 颜色输出函数 print_message() { echo -e "\033[1;32m[INFO] $1\033[0m" } print_warning() { echo -e "\033[1;33m[WARNING] $1\033[0m" } print_error() { echo -e "\033[1;31m[ERROR] $1\033[0m" } # 设置项目名称 PROJECT_NAME="MyApp" # 检查Docker和Docker Compose是否安装 check_docker() { if ! command -v docker &> /dev/null; then print_error "Docker未安装,请先安装Docker" exit 1 fi if ! command -v docker-compose &> /dev/null; then print_error "Docker Compose未安装,请先安装Docker Compose" exit 1 fi } # 创建必要的目录结构 create_directories() { print_message "创建必要的目录结构..." mkdir -p docker/{logs/{nginx,mysql},data/{mysql,redis,node_modules},nginx/conf.d,php,mysql,redis} } # 检查并生成配置文件 check_config_files() { print_message "检查必要的配置文件..." # Nginx 主配置 if [ ! -f "docker/nginx/nginx.conf" ]; then print_warning "Nginx主配置文件不存在,创建默认配置..." cat > docker/nginx/nginx.conf << 'EOF' user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; client_max_body_size 20M; include /etc/nginx/conf.d/*.conf; } EOF fi # Nginx 站点配置 if [ ! -f "docker/nginx/conf.d/default.conf" ]; then print_warning "Nginx站点配置文件不存在,创建默认配置..." cat > docker/nginx/conf.d/default.conf << 'EOF' server { listen 80; server_name localhost; root /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } server { listen 8080; server_name localhost; root /var/www/admin; index index.html; location / { try_files $uri $uri/ /index.html; } } EOF fi # PHP 配置 if [ ! -f "docker/php/php.ini" ]; then print_warning "PHP配置文件不存在,创建默认配置..." cat > docker/php/php.ini << 'EOF' [PHP] memory_limit = 256M upload_max_filesize = 20M post_max_size = 20M max_execution_time = 300 date.timezone = Asia/Shanghai [opcache] opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 EOF fi # PHP-FPM 配置 if [ ! -f "docker/php/www.conf" ]; then print_warning "PHP-FPM配置文件不存在,创建默认配置..." cat > docker/php/www.conf << 'EOF' [www] user = www-data group = www-data listen = 9000 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 EOF fi # MySQL 配置 if [ ! -f "docker/mysql/my.cnf" ]; then print_warning "MySQL配置文件不存在,创建默认配置..." cat > docker/mysql/my.cnf << 'EOF' [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci default-authentication-plugin = mysql_native_password max_allowed_packet = 64M sql_mode = '' [client] default-character-set = utf8mb4 EOF fi # Redis 配置 if [ ! -f "docker/redis/redis.conf" ]; then print_warning "Redis配置文件不存在,创建默认配置..." cat > docker/redis/redis.conf << 'EOF' requirepass niucloud123456 appendonly yes EOF fi } # 启动服务 start_services() { print_message "启动 ${PROJECT_NAME} 服务..." docker-compose up -d } # 停止服务 stop_services() { print_message "停止 ${PROJECT_NAME} 服务..." docker-compose down } # 重启服务 restart_services() { print_message "重启 ${PROJECT_NAME} 服务..." docker-compose restart } # 查看状态 check_status() { print_message "${PROJECT_NAME} 服务状态:" docker-compose ps } # 查看日志 view_logs() { service=$1 if [ -z "$service" ]; then print_message "查看所有服务日志..." docker-compose logs else print_message "查看 $service 服务日志..." docker-compose logs $service fi } # 初始化项目 init_project() { print_message "初始化 ${PROJECT_NAME} 项目..." # 检查是否存在 docker-compose.yml if [ ! -f "docker-compose.yml" ]; then print_error "缺少 docker-compose.yml 文件,请先创建!" exit 1 fi create_directories check_config_files print_message "拉取Docker镜像..." docker-compose pull print_message "项目初始化完成,现在可以启动服务了" } # 显示帮助信息 show_help() { echo "用法: $0 [选项]" echo "" echo "选项:" echo " start 启动所有服务" echo " stop 停止所有服务" echo " restart 重启所有服务" echo " status 查看服务状态" echo " logs 查看所有服务日志" echo " logs <服务名> 查看指定服务日志" echo " init 初始化项目" echo " help 显示此帮助信息" } # 主程序入口 main() { check_docker case "$1" in start) start_services ;; stop) stop_services ;; restart) restart_services ;; status) check_status ;; logs) view_logs "$2" ;; init) init_project ;; help|*) show_help ;; esac } main "$@"