diff --git a/.gitignore b/.gitignore index 7eaa209..a539c28 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ qa/ ./vscode/ .tmp* .codex/ +docker/.env.server diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 08ca3a1..a1b4127 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -11,13 +11,11 @@ services: <<: *php-image working_dir: /likeadmin_php/server restart: unless-stopped - depends_on: - mysql: - condition: service_healthy - redis: - condition: service_healthy volumes: - ../server:/likeadmin_php/server + - ./.env.server:/likeadmin_php/server/.env:ro + extra_hosts: + - "host.docker.internal:host-gateway" networks: - sport-era-dev @@ -25,15 +23,13 @@ services: <<: *php-image working_dir: /likeadmin_php/server restart: unless-stopped - depends_on: - mysql: - condition: service_healthy - redis: - condition: service_healthy command: >- sh -c "while true; do php think crontab; sleep 60; done" volumes: - ../server:/likeadmin_php/server + - ./.env.server:/likeadmin_php/server/.env:ro + extra_hosts: + - "host.docker.internal:host-gateway" networks: - sport-era-dev @@ -85,45 +81,6 @@ services: networks: - sport-era-dev - mysql: - image: mysql:8.2 - restart: unless-stopped - environment: - MYSQL_ROOT_PASSWORD: ${SPORT_ERA_MYSQL_ROOT_PASSWORD:-root} - MYSQL_DATABASE: ${SPORT_ERA_MYSQL_DATABASE:-sbnews} - MYSQL_USER: ${SPORT_ERA_MYSQL_USER:-sbnews} - MYSQL_PASSWORD: ${SPORT_ERA_MYSQL_PASSWORD:-sbnews} - TZ: Asia/Shanghai - ports: - - "${SPORT_ERA_MYSQL_PORT:-3307}:3306" - volumes: - - ./data/mysql:/var/lib/mysql - healthcheck: - test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD --silent"] - interval: 10s - timeout: 5s - retries: 10 - start_period: 30s - networks: - - sport-era-dev - - redis: - image: registry.cn-guangzhou.aliyuncs.com/likeadmin/redis:7.4.0 - restart: unless-stopped - command: redis-server --appendonly yes - ports: - - "${SPORT_ERA_REDIS_PORT:-6379}:6379" - volumes: - - ./data/redis:/data - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 10 - start_period: 10s - networks: - - sport-era-dev - volumes: admin-node-modules: uniapp-node-modules: diff --git a/docs/业务进度管理.md b/docs/业务进度管理.md index 46f15cc..6affa06 100644 --- a/docs/业务进度管理.md +++ b/docs/业务进度管理.md @@ -13,6 +13,24 @@ ## 一、已完成事项 +### 93. Docker 测试环境改用宿主机 MySQL 与 Redis + +- 状态:代码已修改,待部署测试服验证 - 时间:2026-08-01 + +完成内容: +- `docker/docker-compose.dev.yml` 移除本地 MySQL、Redis 服务及后端对它们的启动依赖。 +- Docker 后端和定时任务通过独立的 `docker/.env.server` 连接测试服宿主机上的 MySQL `test_sbnews` 与 Redis `6377/DB4`。 +- `docker/.env.server` 作为私有运行配置,不进入 Git 或服务器代码部署包;容器通过 `host.docker.internal` 访问宿主机服务。 + +涉及模块: +- `docker/docker-compose.dev.yml` +- `.gitignore` +- `scripts/deploy-server.ps1` +- `qa/backend/test_local_docker_php_performance_static.php` + +验证说明: +- 已先执行静态检查,确认旧 compose 仍包含 MySQL/Redis 服务并按预期失败;修改完成后需重新执行静态检查、Compose 配置检查和测试服容器启动验证。 + ### 92. 本地 Docker PHP 接口性能修复 - 状态:代码已修改,待重新构建容器并验证 - 时间:2026-08-01 diff --git a/qa/backend/test_local_docker_php_performance_static.php b/qa/backend/test_local_docker_php_performance_static.php index 357b79d..4771b5e 100644 --- a/qa/backend/test_local_docker_php_performance_static.php +++ b/qa/backend/test_local_docker_php_performance_static.php @@ -24,6 +24,8 @@ $uniappConfig = file_get_contents($files['uniapp_config']); $expectations = [ [$compose, 'sport-era-dev-php:local', 'server 和 scheduler 应使用本地 PHP 镜像'], [$compose, 'docker/Dockerfile.php', '本地 PHP 镜像应由 Dockerfile 构建'], + [$compose, './.env.server:/likeadmin_php/server/.env:ro', 'Docker 后端应使用独立的服务器环境文件'], + [$compose, 'host.docker.internal:host-gateway', 'Docker 后端应能访问宿主机上的数据库与 Redis'], [$dockerfile, 'docker-php-ext-install', '本地 PHP 镜像必须安装 OPcache'], [$dockerfile, 'opcache', '本地 PHP 镜像必须安装 OPcache'], [$dockerfile, 'zz-opcache.ini', '本地 PHP 镜像必须载入 OPcache 配置'], @@ -33,6 +35,20 @@ $expectations = [ [$uniappConfig, 'http://127.0.0.1:8000', 'H5 本地 API 应使用 IPv4 回环地址'], ]; +foreach (['mysql:', 'redis:'] as $removedService) { + if (preg_match('/^ ' . preg_quote(rtrim($removedService, ':'), '/') . ':\s*$/m', $compose)) { + fwrite(STDERR, "本地 compose 不应再启动 {$removedService} 服务\n"); + exit(1); + } +} + +foreach (['depends_on:\n mysql:', 'depends_on:\n redis:'] as $removedDependency) { + if (strpos($compose, $removedDependency) !== false) { + fwrite(STDERR, "后端服务不应依赖已移除的本地服务\n"); + exit(1); + } +} + foreach ($expectations as [$haystack, $needle, $message]) { if (strpos($haystack, $needle) === false) { fwrite(STDERR, $message . "\n"); diff --git a/scripts/deploy-server.ps1 b/scripts/deploy-server.ps1 index 48e4023..63dc3eb 100644 --- a/scripts/deploy-server.ps1 +++ b/scripts/deploy-server.ps1 @@ -260,7 +260,8 @@ function Get-ArchiveExcludePatterns { $patterns += @( "server/.env", "docker/.env", - "docker/.env.docker" + "docker/.env.docker", + "docker/.env.server" ) } if (-not $IncludeVendor) {