#!/bin/bash # Common Nginx + PHP-FPM Docker 快速启动脚本 # 使用方法: ./start.sh [dev|prod|stop|logs|status] set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 项目名称 PROJECT_NAME="common-nginx-fpm" # 打印带颜色的消息 print_message() { local color=$1 local message=$2 echo -e "${color}[$(date '+%Y-%m-%d %H:%M:%S')] ${message}${NC}" } # 检查Docker和Docker Compose check_requirements() { if ! command -v docker &> /dev/null; then print_message $RED "错误: Docker 未安装或未在PATH中" exit 1 fi if ! command -v docker-compose &> /dev/null; then print_message $RED "错误: Docker Compose 未安装或未在PATH中" exit 1 fi } # 创建必要的目录 create_directories() { print_message $BLUE "创建必要的目录..." mkdir -p src logs config/mysql config/postgres # 如果src目录为空,创建示例文件 if [ ! -f "src/index.php" ]; then print_message $YELLOW "创建示例 index.php 文件..." # index.php 已经存在,这里不需要重复创建 fi } # 设置环境变量 setup_env() { local env_type=$1 if [ ! -f ".env" ]; then print_message $BLUE "复制环境变量文件..." cp .env.example .env fi case $env_type in "dev") print_message $BLUE "配置开发环境..." sed -i.bak 's/PROJECT_NAME=.*/PROJECT_NAME=dev-webapp/' .env sed -i.bak 's/WEB_PORT=.*/WEB_PORT=8000/' .env sed -i.bak 's/CODE_MOUNT_MODE=.*/CODE_MOUNT_MODE=rw/' .env sed -i.bak 's/READ_ONLY=.*/READ_ONLY=false/' .env sed -i.bak 's/MEMORY_LIMIT=.*/MEMORY_LIMIT=1G/' .env sed -i.bak 's/CPU_LIMIT=.*/CPU_LIMIT=2.0/' .env rm -f .env.bak ;; "prod") print_message $BLUE "配置生产环境..." sed -i.bak 's/PROJECT_NAME=.*/PROJECT_NAME=prod-webapp/' .env sed -i.bak 's/WEB_PORT=.*/WEB_PORT=80/' .env sed -i.bak 's/CODE_MOUNT_MODE=.*/CODE_MOUNT_MODE=ro/' .env sed -i.bak 's/READ_ONLY=.*/READ_ONLY=true/' .env sed -i.bak 's/MEMORY_LIMIT=.*/MEMORY_LIMIT=512M/' .env sed -i.bak 's/CPU_LIMIT=.*/CPU_LIMIT=1.0/' .env rm -f .env.bak print_message $YELLOW "请确保已设置强密码!" ;; esac } # 启动服务 start_services() { local env_type=$1 print_message $BLUE "构建镜像..." docker-compose build case $env_type in "dev") print_message $GREEN "启动开发环境..." docker-compose up -d ;; "prod") print_message $GREEN "启动生产环境..." docker-compose up -d ;; esac # 等待服务启动 print_message $BLUE "等待服务启动..." sleep 10 # 健康检查 local port=$(grep WEB_PORT .env | cut -d'=' -f2) if curl -s "http://localhost:${port}/health" > /dev/null; then print_message $GREEN "✅ 服务启动成功!" print_message $GREEN "🌐 访问地址: http://localhost:${port}" else print_message $RED "❌ 服务启动失败,请检查日志" docker-compose logs web fi } # 停止服务 stop_services() { print_message $YELLOW "停止所有服务..." docker-compose down print_message $GREEN "✅ 服务已停止" } # 查看日志 show_logs() { print_message $BLUE "显示服务日志..." docker-compose logs -f --tail=100 } # 查看状态 show_status() { print_message $BLUE "服务状态:" docker-compose ps print_message $BLUE "资源使用:" docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}" } # 显示帮助 show_help() { echo "Common Nginx + PHP-FPM Docker 快速启动脚本" echo "" echo "使用方法:" echo " $0 dev - 启动开发环境 (端口8000)" echo " $0 prod - 启动生产环境 (端口80)" echo " $0 stop - 停止所有服务" echo " $0 logs - 查看服务日志" echo " $0 status - 查看服务状态" echo " $0 help - 显示此帮助信息" echo "" echo "示例:" echo " $0 dev # 启动开发环境" echo " $0 prod # 启动生产环境" echo " $0 logs # 查看日志" } # 主函数 main() { local command=${1:-help} case $command in "dev"|"prod") check_requirements create_directories setup_env $command start_services $command ;; "stop") stop_services ;; "logs") show_logs ;; "status") show_status ;; "help"|*) show_help ;; esac } # 执行主函数 main "$@"