chore(base): 同步dev关于Docker及.env 的配置
This commit is contained in:
27
.env.development
Normal file
27
.env.development
Normal file
@@ -0,0 +1,27 @@
|
||||
# 项目配置, 请根据实际情况修改
|
||||
PROJECT_NAME=newshop
|
||||
|
||||
# ThinkPHP 6.x 配置, 请根据实际情况修改
|
||||
APP_ENV=development
|
||||
|
||||
# PHP/PHP-FPM 配置
|
||||
PHP_VERSION=7.4
|
||||
PHP_FPM_VERSION=7.4-fpm
|
||||
PHP_FPM_PORT=9105
|
||||
XDEBUG_POST=9108
|
||||
|
||||
# 数据库配置
|
||||
MYSQL_ROOT_HOST=%
|
||||
MYSQL_DATABASE=shop_mallnew
|
||||
MYSQL_USER=shop_mallnew
|
||||
MYSQL_PASSWORD=shop_mallnew
|
||||
MYSQL_PORT=3326
|
||||
|
||||
# Redis 绑定端口及密码
|
||||
REDIS_PASSWORD=luckyshop123!@#
|
||||
REDIS_PORT=6499
|
||||
|
||||
# Nginx 暴漏端口
|
||||
NGINX_PORT=8050
|
||||
NGINX_SSL_PORT=8052
|
||||
|
||||
16
.env.example
16
.env.example
@@ -1,24 +1,26 @@
|
||||
# 项目配置, 请根据实际情况修改
|
||||
PROJECT_NAME=newshop
|
||||
|
||||
# ThinkPHP 6.x 配置, 请根据实际情况修改
|
||||
APP_ENV=development
|
||||
|
||||
# PHP/PHP-FPM 配置
|
||||
PHP_VERSION=7.4
|
||||
PHP_FPM_VERSION=7.4-fpm
|
||||
PHP_FPM_PORT=9000
|
||||
XDEBUG_POST=9003
|
||||
PHP_FPM_PORT=9100
|
||||
XDEBUG_POST=9103
|
||||
|
||||
# 数据库配置
|
||||
MYSQL_ROOT_HOST=%
|
||||
MYSQL_DATABASE=shop_mallnew
|
||||
MYSQL_USER=shop_mallnew
|
||||
MYSQL_PASSWORD=shop_mallnew
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_PORT=3316
|
||||
|
||||
# Redis 配置
|
||||
REDIS_PASSWORD=luckyshop123!@#
|
||||
REDIS_PORT=6379
|
||||
REDIS_PORT=6399
|
||||
|
||||
# Nginx 配置
|
||||
NGINX_PORT=80
|
||||
NGINX_SSL_PORT=443
|
||||
|
||||
NGINX_PORT=8010
|
||||
NGINX_SSL_PORT=8012
|
||||
|
||||
27
.env.local
Normal file
27
.env.local
Normal file
@@ -0,0 +1,27 @@
|
||||
# 项目配置, 请根据实际情况修改
|
||||
PROJECT_NAME=newshop
|
||||
|
||||
# ThinkPHP 6.x 配置, 请根据实际情况修改
|
||||
APP_ENV=local
|
||||
|
||||
# PHP/PHP-FPM 配置
|
||||
PHP_VERSION=7.4
|
||||
PHP_FPM_VERSION=7.4-fpm
|
||||
PHP_FPM_PORT=9100
|
||||
XDEBUG_POST=9103
|
||||
|
||||
# 数据库配置
|
||||
MYSQL_ROOT_HOST=%
|
||||
MYSQL_DATABASE=shop_dev
|
||||
MYSQL_USER=shop_mallnew
|
||||
MYSQL_PASSWORD=shop_mallnew
|
||||
MYSQL_PORT=3316
|
||||
|
||||
# Redis 配置
|
||||
REDIS_PASSWORD=luckyshop123!@#
|
||||
REDIS_PORT=6399
|
||||
|
||||
# Nginx 配置
|
||||
NGINX_PORT=8010
|
||||
NGINX_SSL_PORT=8012
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -18,6 +18,9 @@ __pycache__
|
||||
.idea
|
||||
.vscode
|
||||
|
||||
# 环境变量
|
||||
.env
|
||||
|
||||
# 源码结构
|
||||
debug.txt
|
||||
.travis.yml
|
||||
|
||||
138
README.md
Normal file
138
README.md
Normal file
@@ -0,0 +1,138 @@
|
||||
# 在线商城PHP项目
|
||||
|
||||
## Git 分支策略
|
||||
|
||||
| 环境 | 推荐分支 | 备选分支 | 说明 |
|
||||
|------|----------|----------|------|
|
||||
| local | `dev` | `develop` | 本地开发环境 |
|
||||
| development | `dev` | `development` | 开发测试环境 |
|
||||
| test | `test` | `staging` | 测试环境 |
|
||||
| staging | `staging` | `pre-release` | 预发布环境 |
|
||||
| production | `master` | `main` | 生产环境 |
|
||||
|
||||
**部署建议**:
|
||||
- 每个环境部署前请先切换到对应的Git分支
|
||||
- 确保代码版本与目标环境匹配
|
||||
- 生产环境部署前建议先在staging环境验证
|
||||
|
||||
## Docker 部署
|
||||
|
||||
```bash
|
||||
cp .env.example .env.development
|
||||
```
|
||||
|
||||
**注意**
|
||||
|
||||
- 在同一目录下面,执行 `docker-compose` 命令时,需要指定项目名称。用来区分不同的环境。如 `shop_local`、`shop_dev` 等。
|
||||
- 本地部署时,需要将 `APP_ENV` 设置为 `local`。
|
||||
- 开发环境部署时,需要将 `APP_ENV` 设置为 `development`。
|
||||
|
||||
|
||||
|
||||
## 环境变量
|
||||
|
||||
- `APP_ENV`: 应用环境,默认值为 `development`。
|
||||
|
||||
## 开发环境-local 部署
|
||||
|
||||
**对应Git分支**: `main` 或 `develop`
|
||||
|
||||
```bash
|
||||
# 切换到本地开发分支
|
||||
git checkout main # 或 develop
|
||||
|
||||
# 本地部署时,需要将 APP_ENV 设置为 local, 并指定 docker-compose.local.yml 文件
|
||||
docker-compose --env-file .env.local -f docker-compose.local.yml up -d
|
||||
# docker-compose --project-name shop_local --env-file .env.local -f docker-compose.local.yml up -d
|
||||
|
||||
# docker-compose down 命令,用来停止并删除容器
|
||||
docker-compose -f docker-compose.local.yml down -v
|
||||
# docker-compose --project-name shop_local down -v
|
||||
```
|
||||
|
||||
|
||||
## 开发环境-development 部署
|
||||
|
||||
**对应Git分支**: `dev` 或 `development`
|
||||
|
||||
```bash
|
||||
# 切换到开发分支
|
||||
git checkout dev # 或 development
|
||||
|
||||
# 默认使用 docker-compose.yml 文件
|
||||
docker-compose --project-name shop_development --env-file .env.development up -d
|
||||
|
||||
# docker-compose down 命令,用来停止并删除容器
|
||||
docker-compose --project-name shop_development down -v
|
||||
```
|
||||
|
||||
## 开发环境-test 部署 (测试环境)
|
||||
|
||||
**对应Git分支**: `test` 或 `staging`
|
||||
|
||||
```bash
|
||||
# 切换到测试分支
|
||||
git checkout test # 或 staging
|
||||
|
||||
# 默认使用 docker-compose.yml 文件
|
||||
docker-compose --project-name shop_test --env-file .env.test up -d
|
||||
|
||||
# docker-compose down 命令,用来停止并删除容器
|
||||
docker-compose --project-name shop_test down -v
|
||||
```
|
||||
|
||||
## 开发环境-staging 部署(预发布环境)
|
||||
|
||||
**对应Git分支**: `staging` 或 `pre-release`
|
||||
|
||||
```bash
|
||||
# 切换到预发布分支
|
||||
git checkout staging # 或 pre-release
|
||||
|
||||
# 默认使用 docker-compose.yml 文件
|
||||
docker-compose --project-name shop_staging --env-file .env.staging up -d
|
||||
|
||||
# docker-compose down 命令,用来停止并删除容器
|
||||
docker-compose --project-name shop_staging down -v
|
||||
```
|
||||
|
||||
## 生产环境-production 部署
|
||||
|
||||
**对应Git分支**: `master` 或 `main` 或 `production`
|
||||
|
||||
```bash
|
||||
# 切换到生产分支
|
||||
git checkout main
|
||||
|
||||
# 确保代码是最新的生产版本
|
||||
git pull origin main
|
||||
|
||||
# 默认使用 docker-compose.yml 文件
|
||||
docker-compose --project-name shop_production --env-file .env.production up -d
|
||||
|
||||
# docker-compose down 命令,用来停止并删除容器
|
||||
docker-compose --project-name shop_production down -v
|
||||
```
|
||||
|
||||
## 便捷部署脚本
|
||||
|
||||
### 环境切换与部署脚本
|
||||
|
||||
- `deploy.sh` 脚本:
|
||||
|
||||
|
||||
### 使用方法
|
||||
|
||||
```bash
|
||||
# 赋予执行权限
|
||||
chmod +x deploy.sh
|
||||
|
||||
# 部署到开发环境
|
||||
./deploy.sh development
|
||||
|
||||
# 部署到测试环境
|
||||
./deploy.sh test
|
||||
|
||||
# 部署到生产环境
|
||||
./deploy.sh production
|
||||
```
|
||||
100
deploy.sh
Normal file
100
deploy.sh
Normal file
@@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
|
||||
# deploy.sh - 环境切换与部署脚本
|
||||
# 使用方法: ./deploy.sh <environment>
|
||||
# 示例: ./deploy.sh development
|
||||
|
||||
ENVIRONMENT=$1
|
||||
PROJECT_NAME="shop_${ENVIRONMENT}"
|
||||
BRANCH=""
|
||||
COMPOSE_FILE="docker-compose.yml"
|
||||
ENV_FILE=".env.${ENVIRONMENT}"
|
||||
|
||||
# 现实运行中的服务器网站,数据库备份目录
|
||||
RUN_SERVER_WEB_ROOT="/data/wwwroot/shop-projects"
|
||||
RUN_SERVER_DB_BACKUP_DIR="/data/backup/shop-projects"
|
||||
|
||||
case $ENVIRONMENT in
|
||||
"local")
|
||||
BRANCH="dev"
|
||||
COMPOSE_FILE="docker-compose.local.yml"
|
||||
ENV_FILE=".env.local"
|
||||
;;
|
||||
"development")
|
||||
BRANCH="dev"
|
||||
;;
|
||||
"test")
|
||||
BRANCH="test"
|
||||
;;
|
||||
"staging")
|
||||
BRANCH="staging"
|
||||
;;
|
||||
"production")
|
||||
BRANCH="main"
|
||||
;;
|
||||
*)
|
||||
echo "错误: 不支持的环境 '$ENVIRONMENT'"
|
||||
echo "支持的环境: local, development, test, staging, production"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "=========================================="
|
||||
echo "部署环境: $ENVIRONMENT"
|
||||
echo "项目名称: $PROJECT_NAME"
|
||||
echo "Git分支: $BRANCH"
|
||||
echo "配置文件: $COMPOSE_FILE"
|
||||
echo "环境文件: $ENV_FILE"
|
||||
echo "=========================================="
|
||||
|
||||
# 切换分支
|
||||
echo "切换到Git分支: $BRANCH"
|
||||
git checkout $BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "错误: 无法切换到分支 $BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 拉取最新代码
|
||||
echo "拉取最新代码..."
|
||||
git pull origin $BRANCH
|
||||
|
||||
# 根据不同的环境,执行不同的操作
|
||||
# 预发布环境、生产环境都需要使用运行服务上的用户文件,将用户文件复制到指定目录
|
||||
|
||||
|
||||
|
||||
# 根据不同的环境,执行不同的操作
|
||||
# 预发布环境、生产环境都需要还原数据库,使用数据库备份文件,并尝试使用数据库升级
|
||||
if [ "$ENVIRONMENT" = "local" ]; then
|
||||
echo "本地环境,跳过数据库还原"
|
||||
else
|
||||
echo "还原数据库..."
|
||||
# 还原数据库
|
||||
docker-compose --project-name $PROJECT_NAME exec -T db bash -c "mysql -uroot -p$DB_ROOT_PASSWORD shop < $DB_BACKUP_DIR/shop.sql"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "错误: 数据库还原失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 尝试使用数据库升级脚本
|
||||
echo "尝试使用数据库升级..."
|
||||
docker-compose --project-name $PROJECT_NAME exec -T db bash -c "php artisan migrate --force"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "数据库升级失败"
|
||||
else
|
||||
echo "数据库升级成功"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 构建并启动容器
|
||||
echo "构建并启动Docker容器..."
|
||||
if [ "$ENVIRONMENT" = "local" ]; then
|
||||
docker-compose --env-file $ENV_FILE -f $COMPOSE_FILE up -d
|
||||
else
|
||||
docker-compose --project-name $PROJECT_NAME --env-file $ENV_FILE up -d
|
||||
fi
|
||||
|
||||
echo "部署完成!"
|
||||
echo "查看容器状态: docker-compose --project-name $PROJECT_NAME ps"
|
||||
echo "查看日志: docker-compose --project-name $PROJECT_NAME logs -f"
|
||||
126
docker-compose.local.yml
Normal file
126
docker-compose.local.yml
Normal file
@@ -0,0 +1,126 @@
|
||||
# 特别说明,本地local环境,方便操作,所以未使用的统一的docker-compose.yml文件,只保留了local环境的配置
|
||||
|
||||
x-shared-env: &shared-api-env
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword}
|
||||
MYSQL_ROOT_HOST: ${MYSQL_ROOT_HOST:-'%'} # 允许root从任何主机连接
|
||||
MYSQL_DATABASE: ${MYSQL_DATABASE:-shop_mallnew}
|
||||
MYSQL_USER: ${MYSQL_USER:-shop_mallnew}
|
||||
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-shop_mallnew}
|
||||
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
|
||||
REDIS_PORT: ${REDIS_PORT:-6379}
|
||||
|
||||
# 将服务归类到目录 A 中
|
||||
services:
|
||||
php-fpm:
|
||||
build:
|
||||
context: ./docker/php
|
||||
dockerfile: Dockerfile
|
||||
container_name: ${PROJECT_NAME}_php
|
||||
restart: always
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway" # 支持主机名解析
|
||||
environment:
|
||||
PHP_ENV: ${PHP_ENV:-development}
|
||||
# 环境变量, APP_ENV 应用于 ThinkPHP 6.x 框架, .env.local 要想启用,需要在项目根目录下创建 .env.local 文件,并将 APP_ENV 设置为 local
|
||||
# 同理,如果要启用开发环境,则将 APP_ENV 设置为 development,如果要启用生产环境,则将 APP_ENV 设置为 production
|
||||
# 不然,ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效
|
||||
APP_ENV: ${APP_ENV:-local}
|
||||
APP_DEBUG: ${APP_DEBUG:-true}
|
||||
XDEBUG_CONFIG: ${XDEBUG_CONFIG:-client_host=host.docker.internal client_port=9003}
|
||||
PHP_IDE_CONFIG: serverName=docker-php
|
||||
ports:
|
||||
- "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM
|
||||
- "${XDEBUG_POST:-9003}:9003" # Xdebug
|
||||
volumes:
|
||||
- ./:/var/www/all_source
|
||||
- ./src:/var/www/html
|
||||
# 更新下载源列表以加速apt-get
|
||||
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
|
||||
- ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
|
||||
- ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
|
||||
- xdebug_logs:/tmp # Xdebug 日志目录
|
||||
depends_on:
|
||||
- db
|
||||
healthcheck:
|
||||
test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status && ps aux | grep '[p]hp think cron:schedule'"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
networks:
|
||||
- sass-platform-net
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
|
||||
nginx:
|
||||
build:
|
||||
context: ./docker/nginx
|
||||
dockerfile: Dockerfile
|
||||
container_name: ${PROJECT_NAME}_nginx
|
||||
restart: always
|
||||
ports:
|
||||
- "${NGINX_PORT:-80}:80"
|
||||
- "${NGINX_SSL_PORT:-443}:443"
|
||||
volumes:
|
||||
# 挂载项目代码到 Nginx 容器中
|
||||
- ./src:/var/www/html:rw
|
||||
# 更新下载源列表以加速apt-get
|
||||
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
|
||||
# 创建临时目录
|
||||
- /var/www/server/nginx/proxy_temp_dir
|
||||
- /var/www/server/nginx/proxy_cache_dir
|
||||
depends_on:
|
||||
- php-fpm
|
||||
networks:
|
||||
- sass-platform-net
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
|
||||
db:
|
||||
image: mysql:5.7.44
|
||||
container_name: ${PROJECT_NAME}_mysql
|
||||
environment:
|
||||
<<: *shared-api-env
|
||||
volumes:
|
||||
- mysql_db_data:/var/lib/mysql
|
||||
- ./docker/mysql/init:/docker-entrypoint-initdb.d
|
||||
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/custom.cnf
|
||||
ports:
|
||||
- ${MYSQL_PORT:-3306}:3306
|
||||
networks:
|
||||
- sass-platform-net
|
||||
restart: unless-stopped
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
- --innodb_buffer_pool_size=256M
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
|
||||
# Redis 服务(可选)
|
||||
redis:
|
||||
image: redis:8.2
|
||||
container_name: ${PROJECT_NAME}_redis
|
||||
environment:
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
|
||||
REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#}
|
||||
ports:
|
||||
- "${REDIS_PORT:-6379}:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
- ./docker/redis/redis.conf:/etc/redis/redis.conf
|
||||
networks:
|
||||
- sass-platform-net
|
||||
restart: unless-stopped
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
|
||||
volumes:
|
||||
mysql_db_data:
|
||||
redis_data:
|
||||
xdebug_logs:
|
||||
|
||||
networks:
|
||||
sass-platform-net:
|
||||
driver: bridge
|
||||
@@ -14,7 +14,7 @@ services:
|
||||
build:
|
||||
context: ./docker/php
|
||||
dockerfile: Dockerfile
|
||||
container_name: ${PROJECT_NAME}_php
|
||||
container_name: ${PROJECT_NAME}_${APP_ENV}_php
|
||||
restart: always
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway" # 支持主机名解析
|
||||
@@ -49,18 +49,19 @@ services:
|
||||
networks:
|
||||
- sass-platform-net
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
|
||||
|
||||
nginx:
|
||||
build:
|
||||
context: ./docker/nginx
|
||||
dockerfile: Dockerfile
|
||||
container_name: ${PROJECT_NAME}_nginx
|
||||
container_name: ${PROJECT_NAME}_${APP_ENV}_nginx
|
||||
restart: always
|
||||
ports:
|
||||
- "${NGINX_PORT:-80}:80"
|
||||
- "${NGINX_SSL_PORT:-443}:443"
|
||||
volumes:
|
||||
# 挂载项目代码到 Nginx 容器中
|
||||
- ./src:/var/www/html:rw
|
||||
# 更新下载源列表以加速apt-get
|
||||
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
|
||||
@@ -72,11 +73,11 @@ services:
|
||||
networks:
|
||||
- sass-platform-net
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
|
||||
|
||||
db:
|
||||
image: mysql:5.7.44
|
||||
container_name: ${PROJECT_NAME}_mysql
|
||||
container_name: ${PROJECT_NAME}_${APP_ENV}_mysql
|
||||
environment:
|
||||
<<: *shared-api-env
|
||||
volumes:
|
||||
@@ -93,12 +94,12 @@ services:
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
- --innodb_buffer_pool_size=256M
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
|
||||
|
||||
# Redis 服务(可选)
|
||||
redis:
|
||||
image: redis:8.2
|
||||
container_name: ${PROJECT_NAME}_redis
|
||||
container_name: ${PROJECT_NAME}_${APP_ENV}_redis
|
||||
environment:
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
|
||||
REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#}
|
||||
@@ -111,13 +112,32 @@ services:
|
||||
- sass-platform-net
|
||||
restart: unless-stopped
|
||||
labels:
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
|
||||
- "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
|
||||
|
||||
volumes:
|
||||
mysql_db_data:
|
||||
name: ${PROJECT_NAME}_${APP_ENV}_mysql_db_data
|
||||
driver: local
|
||||
driver_opts:
|
||||
type: none
|
||||
o: bind
|
||||
device: ./docker/mysql_db_data/${APP_ENV}
|
||||
redis_data:
|
||||
name: ${PROJECT_NAME}_${APP_ENV}_redis_data
|
||||
driver: local
|
||||
driver_opts:
|
||||
type: none
|
||||
o: bind
|
||||
device: ./docker/redis_data/${APP_ENV}
|
||||
xdebug_logs:
|
||||
name: ${PROJECT_NAME}_${APP_ENV}_xdebug_logs
|
||||
driver: local
|
||||
driver_opts:
|
||||
type: none
|
||||
o: bind
|
||||
device: ./docker/xdebug_logs/${APP_ENV}
|
||||
|
||||
networks:
|
||||
sass-platform-net:
|
||||
name: ${PROJECT_NAME}_${APP_ENV}_net
|
||||
driver: bridge
|
||||
File diff suppressed because one or more lines are too long
@@ -2,6 +2,8 @@
|
||||
# 字符集设置
|
||||
character-set-server=utf8mb4
|
||||
collation-server=utf8mb4_unicode_ci
|
||||
init_connect='SET NAMES utf8mb4'
|
||||
|
||||
|
||||
# 连接设置
|
||||
max_connections=100
|
||||
@@ -22,6 +24,3 @@ sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
|
||||
|
||||
[client]
|
||||
default-character-set=utf8mb4
|
||||
|
||||
[mysql]
|
||||
default-character-set=utf8mb4
|
||||
10
docker/mysql_db_data/.gitignore
vendored
Normal file
10
docker/mysql_db_data/.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# 忽略目录下所有文件和子目录
|
||||
*
|
||||
# 忽略所有子目录
|
||||
*/
|
||||
# 但不忽略 .gitkeep 文件
|
||||
!.gitkeep
|
||||
# 不忽略 .gitignore 文件自身
|
||||
!.gitignore
|
||||
# 不忽略 development/.gitkeep 文件
|
||||
!development/.gitkeep
|
||||
0
docker/mysql_db_data/.gitkeep
Normal file
0
docker/mysql_db_data/.gitkeep
Normal file
@@ -27,6 +27,7 @@ RUN apt-get update && apt-get install -y \
|
||||
libfreetype6-dev \
|
||||
libjpeg62-turbo-dev \
|
||||
libpng-dev \
|
||||
iputils-ping \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# 安装 PHP 扩展
|
||||
@@ -66,21 +67,9 @@ RUN echo "zend_extension=xdebug.so" > /usr/local/etc/php/conf.d/xdebug.ini
|
||||
# RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
|
||||
# RUN composer install --no-dev --optimize-autoloader --working-dir=/var/www/html
|
||||
|
||||
# # 创建非 root 用户
|
||||
# RUN useradd -m -u 1000 phpuser && chown -R phpuser:phpuser /var/www/html
|
||||
|
||||
# 设置权限, 防止以下目录无法写入的问题
|
||||
RUN chmod -R a+rw /var/www/html/runtime
|
||||
RUN chmod -R a+rw /var/www/html/uploads
|
||||
RUN chmod -R a+rw /var/www/html/tmp
|
||||
RUN chmod -R a+rw /var/www/html/temp
|
||||
|
||||
# USER phpuser
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 9000 9003
|
||||
|
||||
|
||||
############ 查看 cron 进程
|
||||
## 查看 cron 进程
|
||||
# ps aux | grep "think cron:schedule"
|
||||
@@ -95,4 +84,10 @@ EXPOSE 9000 9003
|
||||
#######################################
|
||||
|
||||
# 启动Supervisor
|
||||
# 添加在Dockerfile末尾,CMD命令之前
|
||||
COPY ./entrypoint.sh /usr/local/bin/
|
||||
RUN chmod +x /usr/local/bin/entrypoint.sh
|
||||
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
||||
|
||||
# 修改CMD命令
|
||||
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
||||
113
docker/php/entrypoint.sh
Normal file
113
docker/php/entrypoint.sh
Normal file
@@ -0,0 +1,113 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
echo "=== ThinkPHP Docker权限初始化 ==="
|
||||
|
||||
# 定义应用根目录
|
||||
APP_ROOT="/var/www/html"
|
||||
|
||||
# 获取正确的用户和组
|
||||
if [ -n "$USER_ID" ] && [ -n "$GROUP_ID" ]; then
|
||||
# 如果指定了用户ID,修改www-data
|
||||
usermod -u $USER_ID www-data
|
||||
groupmod -g $GROUP_ID www-data
|
||||
fi
|
||||
|
||||
echo "当前用户: $(whoami)"
|
||||
echo "UID: $(id -u), GID: $(id -g)"
|
||||
|
||||
# 修复目录所有权和权限
|
||||
fix_directory_permissions() {
|
||||
local dir=$1
|
||||
echo "修复PHP目录权限: $dir"
|
||||
|
||||
# 确保目录存在
|
||||
mkdir -p "$dir"
|
||||
|
||||
# 设置所有权
|
||||
chown -R www-data:www-data "$dir"
|
||||
|
||||
# 设置权限
|
||||
chmod -R 775 "$dir"
|
||||
|
||||
# 设置setgid权限
|
||||
chmod g+s "$dir"
|
||||
|
||||
# 尝试设置ACL(如果支持)
|
||||
if command -v setfacl >/dev/null 2>&1; then
|
||||
setfacl -dR -m u:www-data:rwx "$dir"
|
||||
fi
|
||||
|
||||
find "$dir" -type d -exec chmod 775 {} \;
|
||||
find "$dir" -type f -exec chmod 775 {} \;
|
||||
find "$dir" -type d -exec chmod g+s {} \;
|
||||
find "$dir" -type f -exec chmod g+s {} \;
|
||||
|
||||
# 设置umask
|
||||
umask 0002
|
||||
|
||||
echo "✅ $dir 权限设置完成, 目录权限: $(stat -c '%a %n' "$dir"), setgid权限: $(stat -c '%a %n' "$dir" | grep 's')"
|
||||
}
|
||||
|
||||
# 处理所有需要权限的目录
|
||||
directories=("runtime" "upload" "runtime/log" "runtime/cache" "runtime/temp")
|
||||
for dir in "${directories[@]}"; do
|
||||
fix_directory_permissions "$APP_ROOT/$dir"
|
||||
done
|
||||
|
||||
|
||||
# 验证权限
|
||||
echo "=== 权限验证 ==="
|
||||
echo "当前用户: $(whoami)"
|
||||
echo "当前UID: $(id -u), GID: $(id -g)"
|
||||
echo "当前umask: $(umask)"
|
||||
|
||||
# 验证www-data用户是否可以在runtime和upload目录下新建子目录
|
||||
|
||||
# 方法1:使用sudo
|
||||
if command -v sudo >/dev/null 2>&1; then
|
||||
echo "使用sudo测试..."
|
||||
if sudo -u www-data mkdir -p $APP_ROOT/runtime/log/test_dir 2>/dev/null; then
|
||||
echo "✅ sudo: runtime目录创建子目录成功 [使用www-data用户]"
|
||||
rm -rf $APP_ROOT/runtime/log/test_dir
|
||||
else
|
||||
echo "❌ sudo: runtime目录创建子目录失败 [使用www-data用户]"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 方法2:使用su
|
||||
echo "使用su测试..."
|
||||
if su -s /bin/sh -c "mkdir -p $APP_ROOT/runtime/log/test_dir" www-data 2>/dev/null; then
|
||||
echo "✅ su: runtime目录创建子目录成功 [使用www-data用户]"
|
||||
rm -rf $APP_ROOT/runtime/log/test_dir
|
||||
else
|
||||
echo "❌ su: runtime目录创建子目录失败 [使用www-data用户]"
|
||||
fi
|
||||
|
||||
# 方法3:使用runuser
|
||||
if command -v runuser >/dev/null 2>&1; then
|
||||
echo "使用runuser测试..."
|
||||
if runuser -u www-data -- mkdir -p $APP_ROOT/runtime/log/test_dir 2>/dev/null; then
|
||||
echo "✅ runuser: runtime目录创建子目录成功 [使用www-data用户]"
|
||||
rm -rf $APP_ROOT/runtime/log/test_dir
|
||||
else
|
||||
echo "❌ runuser: runtime目录创建子目录失败 [使用www-data用户]"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 检查www-data用户和组
|
||||
echo "检查www-data用户..."
|
||||
id www-data
|
||||
groups www-data
|
||||
|
||||
# 检查目录的实际权限
|
||||
echo "检查目录权限..."
|
||||
ls -ld $APP_ROOT/runtime/log
|
||||
ls -ld $APP_ROOT/runtime/cache
|
||||
ls -ld $APP_ROOT/runtime/temp
|
||||
ls -ld $APP_ROOT/upload
|
||||
|
||||
echo "=== 启动应用 ==="
|
||||
|
||||
# 执行原有的启动命令
|
||||
exec "$@"
|
||||
@@ -6,25 +6,40 @@ logfile_backups=10
|
||||
loglevel=info
|
||||
pidfile=/var/run/supervisord.pid
|
||||
|
||||
[program:chmod]
|
||||
command=/bin/bash -c "while true; do chmod -R 775 /var/www/html/runtime/ /var/www/html/upload/ 2>/dev/null || true; sleep 30; done"
|
||||
autostart=true
|
||||
autorestart=true
|
||||
stopasgroup=true
|
||||
killasgroup=true
|
||||
|
||||
[program:php-fpm]
|
||||
command=php-fpm
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startretries=3
|
||||
startsecs=1
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
stopasgroup=true
|
||||
killasgroup=true
|
||||
stdout_logfile=/var/log/supervisor/php-fpm.log
|
||||
stdout_logfile_maxbytes=10MB
|
||||
stdout_logfile_backups=10
|
||||
stderr_logfile=/var/log/supervisor/php-fpm-error.log
|
||||
stderr_logfile_maxbytes=10MB
|
||||
stderr_logfile_backups=10
|
||||
|
||||
[program:think-cron]
|
||||
command=php /var/www/html/think cron:schedule
|
||||
environment=APP_ENV=local
|
||||
process_name=%(program_name)s_%(process_num)02d
|
||||
numprocs=1
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startretries=5
|
||||
startsecs=2
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes=0
|
||||
stderr_logfile=/dev/stderr
|
||||
stderr_logfile_maxbytes=0
|
||||
startretries=3
|
||||
stdout_logfile=/var/log/supervisor/think-cron.log
|
||||
stdout_logfile_maxbytes=10MB
|
||||
stdout_logfile_backups=10
|
||||
stderr_logfile=/var/log/supervisor/think-cron-error.log
|
||||
stderr_logfile_maxbytes=10MB
|
||||
stderr_logfile_backups=10
|
||||
startsecs=3
|
||||
stopwaitsecs=10
|
||||
10
docker/redis_data/.gitignore
vendored
Normal file
10
docker/redis_data/.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# 忽略目录下所有文件和子目录
|
||||
*
|
||||
# 忽略所有子目录
|
||||
*/
|
||||
# 但不忽略 .gitkeep 文件
|
||||
!.gitkeep
|
||||
# 不忽略 .gitignore 文件自身
|
||||
!.gitignore
|
||||
# 不忽略 development/.gitkeep 文件
|
||||
!development/.gitkeep
|
||||
0
docker/redis_data/.gitkeep
Normal file
0
docker/redis_data/.gitkeep
Normal file
10
docker/xdebug_logs/.gitignore
vendored
Normal file
10
docker/xdebug_logs/.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# 忽略目录下所有文件和子目录
|
||||
*
|
||||
# 忽略所有子目录
|
||||
*/
|
||||
# 但不忽略 .gitkeep 文件
|
||||
!.gitkeep
|
||||
# 不忽略 .gitignore 文件自身
|
||||
!.gitignore
|
||||
# 不忽略 development/.gitkeep 文件
|
||||
!development/.gitkeep
|
||||
0
docker/xdebug_logs/.gitkeep
Normal file
0
docker/xdebug_logs/.gitkeep
Normal file
@@ -1,25 +1,26 @@
|
||||
APP_DEBUG = true
|
||||
APP_TRACE = true
|
||||
# 项目配置, 请根据实际情况修改
|
||||
PROJECT_NAME=newshop
|
||||
|
||||
[APP]
|
||||
DEFAULT_TIMEZONE = Asia/Shanghai
|
||||
ENV_MODE = development
|
||||
# ThinkPHP 6.x 配置, 请根据实际情况修改
|
||||
APP_ENV=development
|
||||
|
||||
[LANG]
|
||||
default_lang = zh-cn
|
||||
# PHP/PHP-FPM 配置
|
||||
PHP_VERSION=7.4
|
||||
PHP_FPM_VERSION=7.4-fpm
|
||||
PHP_FPM_PORT=9105
|
||||
XDEBUG_POST=9108
|
||||
|
||||
[DATABASE]
|
||||
TYPE = mysql
|
||||
HOSTNAME = 127.0.0.1
|
||||
DATABASE = shop_mallnew_dev
|
||||
USERNAME = root
|
||||
PASSWORD = root
|
||||
HOSTPORT = 3306
|
||||
CHARSET = utf8
|
||||
DEBUG = true
|
||||
# 数据库配置
|
||||
MYSQL_ROOT_HOST=%
|
||||
MYSQL_DATABASE=shop_mallnew
|
||||
MYSQL_USER=shop_mallnew
|
||||
MYSQL_PASSWORD=shop_mallnew
|
||||
MYSQL_PORT=3326
|
||||
|
||||
[redis]
|
||||
HOST = 127.0.0.1
|
||||
PORT = 6379
|
||||
PASSWORD = ''
|
||||
EXPIRY = 604800
|
||||
# Redis 绑定端口及密码
|
||||
REDIS_PASSWORD=luckyshop123!@#
|
||||
REDIS_PORT=6499
|
||||
|
||||
# Nginx 暴漏端口
|
||||
NGINX_PORT=8050
|
||||
NGINX_SSL_PORT=8052
|
||||
147
src/config/database.php
Normal file
147
src/config/database.php
Normal file
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
use think\facade\Env;
|
||||
|
||||
return [
|
||||
// 默认使用的数据库连接配置
|
||||
'default' => 'mysql',
|
||||
|
||||
// 自定义时间查询规则
|
||||
'time_query_rule' => [],
|
||||
|
||||
// 自动写入时间戳字段
|
||||
// true为自动识别类型 false关闭
|
||||
// 字符串则明确指定时间字段类型 支持 int timestamp datetime date
|
||||
'auto_timestamp' => true,
|
||||
|
||||
// 时间字段取出后的默认时间格式
|
||||
'datetime_format' => 'Y-m-d H:i:s',
|
||||
|
||||
// 数据库连接配置信息
|
||||
'connections' => [
|
||||
'mysql' => [
|
||||
// 数据库类型
|
||||
'type' => 'mysql',
|
||||
// 服务器地址
|
||||
'hostname' => env('database.hostname', 'localhost'),
|
||||
// 数据库名
|
||||
'database' => env('database.database', 'shop_mallnew'),
|
||||
// 用户名
|
||||
'username' => env('database.username', 'shop_mallnew'),
|
||||
// 密码
|
||||
'password' => env('database.password', 'shop_mallnew'),
|
||||
// 端口
|
||||
'hostport' => env('database.hostport', '3306'),
|
||||
// 数据库连接参数
|
||||
'params' => [],
|
||||
// 数据库编码默认采用utf8
|
||||
'charset' => env('database.charset', 'utf8mb4'),
|
||||
// 数据库表前缀
|
||||
'prefix' => 'lucky_',
|
||||
|
||||
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
|
||||
'deploy' => 0,
|
||||
// 数据库读写是否分离 主从式有效
|
||||
'rw_separate' => false,
|
||||
// 读写分离后 主服务器数量
|
||||
'master_num' => 1,
|
||||
// 指定从服务器序号
|
||||
'slave_no' => '',
|
||||
// 是否严格检查字段是否存在
|
||||
'fields_strict' => false,
|
||||
// 是否需要断线重连
|
||||
'break_reconnect' => false,
|
||||
// 监听SQL
|
||||
'trigger_sql' => true,
|
||||
// 开启字段缓存
|
||||
'fields_cache' => false,
|
||||
// 字段缓存路径
|
||||
'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
|
||||
],
|
||||
'rrdata' => [//旧版人人商城数据库
|
||||
// 数据库类型
|
||||
'type' => 'mysql',
|
||||
|
||||
/*新服务器*/
|
||||
'hostname' => env('rrdatabase.hostname', 'localhost'),
|
||||
/*旧服务器*/
|
||||
// 'hostname' => '47.110.82.193',
|
||||
// 数据库名
|
||||
'database' => '5g',
|
||||
// 用户名
|
||||
'username' => '5g',
|
||||
// 密码
|
||||
'password' => '123456',
|
||||
|
||||
|
||||
|
||||
// 端口
|
||||
'hostport' => '3306',
|
||||
// 数据库连接参数
|
||||
'params' => [],
|
||||
// 数据库编码默认采用utf8
|
||||
'charset' => 'utf8',
|
||||
// 数据库表前缀
|
||||
'prefix' => 'ims_',
|
||||
|
||||
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
|
||||
'deploy' => 0,
|
||||
// 数据库读写是否分离 主从式有效
|
||||
'rw_separate' => false,
|
||||
// 读写分离后 主服务器数量
|
||||
'master_num' => 1,
|
||||
// 指定从服务器序号
|
||||
'slave_no' => '',
|
||||
// 是否严格检查字段是否存在
|
||||
'fields_strict' => false,
|
||||
// 是否需要断线重连
|
||||
'break_reconnect' => false,
|
||||
// 监听SQL
|
||||
'trigger_sql' => false,
|
||||
// 开启字段缓存
|
||||
'fields_cache' => false,
|
||||
// 字段缓存路径
|
||||
'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
|
||||
],
|
||||
/* 'v3' => [
|
||||
// 数据库类型
|
||||
'type' => 'mysql',
|
||||
// 服务器地址
|
||||
'hostname' => '',
|
||||
// 数据库名
|
||||
'database' => '',
|
||||
// 用户名
|
||||
'username' => '',
|
||||
// 密码
|
||||
'password' => '',
|
||||
// 端口
|
||||
'hostport' => '3306',
|
||||
// 数据库连接参数
|
||||
'params' => [],
|
||||
// 数据库编码默认采用utf8
|
||||
'charset' => 'utf8',
|
||||
// 数据库表前缀
|
||||
'prefix' => '',
|
||||
|
||||
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
|
||||
'deploy' => 0,
|
||||
// 数据库读写是否分离 主从式有效
|
||||
'rw_separate' => false,
|
||||
// 读写分离后 主服务器数量
|
||||
'master_num' => 1,
|
||||
// 指定从服务器序号
|
||||
'slave_no' => '',
|
||||
// 是否严格检查字段是否存在
|
||||
'fields_strict' => false,
|
||||
// 是否需要断线重连
|
||||
'break_reconnect' => false,
|
||||
// 监听SQL
|
||||
'trigger_sql' => false,
|
||||
// 开启字段缓存
|
||||
'fields_cache' => true,
|
||||
// 字段缓存路径
|
||||
'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,
|
||||
],*/
|
||||
// 更多的数据库配置信息
|
||||
],
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user