13 changed files with 3867 additions and 3356 deletions
File diff suppressed because it is too large
@ -0,0 +1,119 @@ |
|||
version: '3.8' |
|||
|
|||
services: |
|||
# PHP 服务 |
|||
php: |
|||
image: php:8.2-fpm |
|||
container_name: niucloud_php |
|||
volumes: |
|||
- ./niucloud:/var/www/html |
|||
- ./docker/php/php.ini:/usr/local/etc/php/php.ini |
|||
- ./docker/php/www.conf:/usr/local/etc/php-fpm.d/www.conf |
|||
working_dir: /var/www/html |
|||
depends_on: |
|||
- mysql |
|||
- redis |
|||
environment: |
|||
- PHP_IDE_CONFIG=serverName=niucloud |
|||
command: > |
|||
bash -c " |
|||
apt-get update && |
|||
apt-get install -y libzip-dev zip unzip git libpng-dev libjpeg-dev libfreetype6-dev && |
|||
docker-php-ext-configure gd --with-freetype --with-jpeg && |
|||
docker-php-ext-install pdo pdo_mysql mysqli zip gd && |
|||
pecl install redis && |
|||
docker-php-ext-enable redis && |
|||
php-fpm |
|||
" |
|||
networks: |
|||
- niucloud_network |
|||
|
|||
# Nginx 服务 |
|||
nginx: |
|||
image: nginx:alpine |
|||
container_name: niucloud_nginx |
|||
ports: |
|||
- "20080:80" # 原本是 80 映射到 20080 |
|||
- "20081:8080" # 原本是 8080 映射到 20081 |
|||
volumes: |
|||
- ./niucloud:/var/www/html |
|||
- ./admin/dist:/var/www/admin |
|||
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf |
|||
- ./docker/nginx/conf.d:/etc/nginx/conf.d |
|||
- ./docker/logs/nginx:/var/log/nginx |
|||
depends_on: |
|||
- php |
|||
- node |
|||
networks: |
|||
- niucloud_network |
|||
|
|||
# MySQL 数据库 |
|||
mysql: |
|||
image: mysql:8.0 |
|||
container_name: niucloud_mysql |
|||
ports: |
|||
- "23306:3306" # 原本是 3306 映射到 23306 |
|||
environment: |
|||
MYSQL_ROOT_PASSWORD: root123456 |
|||
MYSQL_DATABASE: niucloud |
|||
MYSQL_USER: niucloud |
|||
MYSQL_PASSWORD: niucloud123 |
|||
volumes: |
|||
- ./docker/data/mysql:/var/lib/mysql |
|||
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf |
|||
- ./docker/logs/mysql:/var/log/mysql |
|||
command: --default-authentication-plugin=mysql_native_password |
|||
networks: |
|||
- niucloud_network |
|||
|
|||
# Redis 缓存 |
|||
redis: |
|||
image: redis:alpine |
|||
container_name: niucloud_redis |
|||
ports: |
|||
- "26379:6379" # 原本是 6379 映射到 26379 |
|||
volumes: |
|||
- ./docker/data/redis:/data |
|||
- ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf |
|||
command: redis-server /usr/local/etc/redis/redis.conf |
|||
networks: |
|||
- niucloud_network |
|||
|
|||
# Node.js 服务 (用于构建前端) |
|||
node: |
|||
image: node:18-alpine |
|||
container_name: niucloud_node |
|||
working_dir: /app |
|||
volumes: |
|||
- ./admin:/app |
|||
- ./docker/data/node_modules:/app/node_modules |
|||
ports: |
|||
- "23000:3000" # 原本是 3000 映射到 23000 |
|||
command: > |
|||
sh -c " |
|||
npm config set registry https://registry.npmmirror.com && |
|||
npm install && |
|||
npm run dev |
|||
" |
|||
networks: |
|||
- niucloud_network |
|||
|
|||
# Composer 服务 (用于 PHP 依赖管理) |
|||
composer: |
|||
image: composer:latest |
|||
container_name: niucloud_composer |
|||
volumes: |
|||
- ./niucloud:/app |
|||
working_dir: /app |
|||
command: install --ignore-platform-reqs |
|||
networks: |
|||
- niucloud_network |
|||
|
|||
networks: |
|||
niucloud_network: |
|||
driver: bridge |
|||
|
|||
volumes: |
|||
mysql_data: |
|||
redis_data: |
|||
node_modules: |
|||
@ -0,0 +1,268 @@ |
|||
#!/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 "$@" |
|||
Loading…
Reference in new issue