Przeglądaj źródła

更新项目文件

gengjunfang 1 miesiąc temu
rodzic
commit
a9a437b798

+ 483 - 190
README.md

@@ -1,126 +1,237 @@
-# pacsonline  容器化 部署方案
+# PACSONLINE Docker 容器化部署方案
 
-基于 Docker Compose 的 MySQL 8.0 、 Redis 7 、 php-fpm 7.4 、nginx 一键部署方案,支持离线部署。
+基于 Docker Compose 的 MySQL 8.0、Redis、PHP-FPM 7.4、Nginx 一键部署方案,支持多项目统一管理和部署。
+
+## 系统架构
+
+```
+┌─────────────────────────────────────────────────────────────────┐
+│                         宿主机 (Host)                            │
+│                                                                   │
+│  ┌──────────────────────────────────────────────────────────┐   │
+│  │                    Nginx (80, 443, 9600, 196xx)          │   │
+│  │  ├─ 19620 → zskk_new_manage (管理后台)                   │   │
+│  │  ├─ 19602 → ris (RIS医生端前端)                          │   │
+│  │  ├─ 19600 → zskk_new_server (RIS医生端后端API)           │   │
+│  │  ├─ 19603 → pacs (阅片器)                                │   │
+│  │  └─ 9600  → API网关 (路由分发)                           │   │
+│  └──────────────────────────────────────────────────────────┘   │
+│                           ↓                                      │
+│  ┌──────────────────────────────────────────────────────────┐   │
+│  │              PHP-FPM:9000                                │   │
+│  │  ├─ zskk_new_manage (ThinkPHP)                           │   │
+│  │  └─ zskk_new_server (ThinkPHP)                           │   │
+│  └──────────────────────────────────────────────────────────┘   │
+│                           ↓                                      │
+│  ┌────────────────────┐        ┌──────────────────────────┐     │
+│  │  MySQL:3306        │        │   Redis:6379             │     │
+│  │  DB: pacsonline    │        │   Auth: zskk@2025        │     │
+│  └────────────────────┘        └──────────────────────────┘     │
+│                                                                   │
+│  Docker Network: app_network (bridge)                            │
+└─────────────────────────────────────────────────────────────────┘
+```
 
 ## 项目结构
 
 ```
-deploy-test/
-├── docker-compose.yml          # Docker Compose 编排文件
-├── deploy.sh                   # 一键部署脚本
-├── README.md                   # 说明文档
-├── mysql-init.sql              # MySQL 初始化脚本(用户自定义)
-├── mysql-image.tar             # MySQL 8.0 原始镜像包
-├── redis-image.tar             # Redis 7 镜像包
+deploy/
+├── docker-compose.yml              # Docker Compose 编排文件
+├── deploy.sh                       # 一键部署脚本
+├── README.md                       # 说明文档
+│
 ├── mysql/
-│   ├── init/                   # MySQL 初始化 SQL 脚本目录(可选)
-│   └── conf/                   # MySQL 配置文件目录(可选)
+│   ├── data/                       # MySQL 数据持久化目录
+│   ├── conf/                       # MySQL 配置文件目录
+│   └── init/                       # MySQL 初始化 SQL 脚本目录
+│
 ├── redis/
-│   └── redis.conf             # Redis 配置文件
-└── data/
-    ├── mysql/                  # MySQL 数据持久化目录
-    └── redis/                  # Redis 数据持久化目录
+│   ├── data/                       # Redis 数据持久化目录
+│   └── conf/
+│       └── redis.conf              # Redis 配置文件
+│
+├── php-fpm/
+│   ├── docker/                     # PHP-FPM Dockerfile
+│   └── conf/                       # PHP 配置文件目录
+│
+├── nginx/
+│   ├── conf/                       # Nginx 配置目录
+│   │   ├── default.conf            # 主配置(加载子目录)
+│   │   ├── server.d/               # Server 块配置
+│   │   │   ├── zskk-manage.conf    # 管理后台配置
+│   │   │   ├── zskk-server.conf    # 后端API配置
+│   │   │   ├── zskk-ris.conf       # RIS前端配置
+│   │   │   └── zskk-pacs.conf      # PACS配置
+│   │   ├── upstreams.d/            # Upstream 配置
+│   │   │   ├── php-fpm.conf        # PHP-FPM upstream
+│   │   │   ├── zskk-server.conf    # 后端服务 upstream
+│   │   │   └── zskk-manage.conf    # 管理服务 upstream
+│   │   └── out.d/                  # 代理和路由配置
+│   │       └── out.conf            # API 网关配置
+│   └── logs/                       # Nginx 日志目录
+│
+├── projects/
+│   └── www/                        # 项目代码目录
+│       ├── zskk_new_manage/        # 管理后台 (ThinkPHP)
+│       ├── zskk_new_server/        # RIS后端API (ThinkPHP)
+│       ├── ris/                    # RIS医生端前端 (Vue)
+│       └── pacs/                   # PACS阅片器前端
+│
+└── images/                         # Docker 镜像文件目录(离线部署用)
 ```
 
 ## 服务配置
 
 ### MySQL 8.0
-- **容器名称**: mysql8_deploy
-- **端口**: 3306
-- **数据库**: ris
-- **用户**: ris
-- **密码**: zskk8888
-- **Root 密码**: zskk8888
-- **初始化**: 部署时自动执行 `mysql-init.sql` 脚本(如果存在)
-
-### Redis 7
-- **容器名称**: redis7_deploy
-- **端口**: 6379
-- **密码**: zskk8888
-- **持久化**: 启用 RDB + AOF 双重持久化
-- **最大内存**: 256MB(可在 redis.conf 中修改)
+- **容器名称**: `mysql`
+- **端口**: `3306`
+- **数据库**: `pacsonline`
+- **用户**: `zskk`
+- **密码**: `zskk@2025`
+- **Root 密码**: `Zskk@2025`
+- **认证插件**: `mysql_native_password`
+
+### Redis
+- **容器名称**: `redis`
+- **端口**: `6379`
+- **密码**: `zskk@2025`
+- **持久化**: RDB + AOF
+
+### PHP-FPM 7.4
+- **容器名称**: `php_fpm`
+- **端口**: `9000`
+- **项目路径**: `/var/www/html`
+- **扩展**: MySQL, Redis, GD, etc.
+
+### Nginx
+- **容器名称**: `nginx`
+- **镜像**: `nginx:alpine`
+
+## 端口映射
+
+| 端口  | 服务           | 说明                          |
+|-------|----------------|-------------------------------|
+| 80    | Nginx          | HTTP 默认端口                 |
+| 443   | Nginx          | HTTPS 端口                    |
+| 3306  | MySQL          | MySQL 数据库                  |
+| 6379  | Redis          | Redis 缓存                    |
+| 9000  | PHP-FPM        | PHP-FPM 服务(内部通信)      |
+| 9600  | Nginx          | API 网关(路由分发)          |
+| 19600 | Nginx          | RIS 后端 Server API           |
+| 19602 | Nginx          | RIS 医生端前端                |
+| 19603 | Nginx          | PACS 阅片器前端               |
+| 19620 | Nginx          | 管理后台                      |
+
+### API 网关路由规则 (端口 9600)
+
+```nginx
+http://127.0.0.1:9600/             → zskk-manage (管理后台)
+http://127.0.0.1:9600/zskkapi/     → zskk-server (后端API)
+```
 
 ## 快速开始
 
-### 方法一:使用部署脚本(推荐)
+### 1. 启动所有服务
 
 ```bash
-# 1. 进入项目目录
-cd deploy-test
+cd /path/to/deploy
+docker compose up -d
+```
 
-# 2. (可选)放置自定义的 MySQL 初始化脚本
-# 将你的 SQL 文件命名为 mysql-init.sql 放在当前目录
+### 2. 检查服务状态
 
-# 3. 运行部署脚本
-./deploy.sh
+```bash
+docker compose ps
 ```
 
-**说明**:
-- 如果存在 `mysql-init.sql` 文件,脚本会自动执行该文件初始化数据库
-- 如果不存在,则跳过初始化步骤
+预期输出:
+```
+NAME       IMAGE                       STATUS
+mysql      mysql:8.0                   Up
+nginx      nginx:alpine                Up
+php_fpm    php-fpm-mysql:7.4-arm64     Up
+redis      my-redis:v1.0               Up
+```
 
-### 方法二:手动部署
+### 3. 查看日志
 
 ```bash
-# 1. 进入项目目录
-cd deploy-test
+# 查看所有服务日志
+docker compose logs -f
 
-# 2. 启动服务
-docker compose up -d
+# 查看特定服务日志
+docker compose logs -f nginx
+docker compose logs -f php_fpm
+```
 
-# 3. 查看服务状态
-docker compose ps
+### 4. 访问服务
 
-# 4. 查看日志
-docker compose logs -f
-```
+- 管理后台: http://127.0.0.1:19620
+- RIS 医生端: http://127.0.0.1:19602
+- PACS 阅片器: http://127.0.0.1:19603
 
-## 离线部署
+## 项目配置
 
-### 准备镜像包(在有网络的机器上)
+### 配置数据库连接
 
-```bash
-# 1. 拉取并导出 MySQL 原始镜像
-docker pull mysql:8.0
-docker save -o mysql-image.tar mysql:8.0
+每个 PHP 项目需要配置正确的数据库连接信息。
+
+#### zskk_new_manage 配置
 
-# 2. 拉取并导出 Redis 镜像
-docker pull redis:7-alpine
-docker save -o redis-image.tar redis:7-alpine
+编辑 `projects/www/zskk_new_manage/.env`:
 
-# 3. 打包部署文件
-tar -czf deploy-package.tar.gz \
-    docker-compose.yml \
-    deploy.sh \
-    README.md \
-    mysql/ \
-    redis/ \
-    mysql-image.tar \
-    redis-image.tar \
-    mysql-init.sql  # 如果有自定义初始化脚本
+```ini
+[database]
+hostname = mysql
+database = pacsonline
+username = zskk
+password = zskk@2025
+hostport = 3306
 ```
 
-### 目标服务器部署(无网络环境)
+#### zskk_new_server 配置
 
-```bash
-# 1. 传输部署包到目标服务器
-# 使用 scp、U盘等方式
+编辑 `projects/www/zskk_new_server/.env`:
 
-# 2. 解压部署包
-tar -xzf deploy-package.tar.gz
-cd deploy-test
+```ini
+[database]
+hostname = mysql
+database = pacsonline
+username = zskk
+password = zskk@2025
+hostport = 3306
+```
 
-# 3. (可选)放置自定义的 MySQL 初始化脚本
-# 如果在打包时没有包含,可以在此步骤添加 mysql-init.sql
+**重要提示**:
+- ✅ `hostname` 必须使用容器名 `mysql`(不是 `127.0.0.1` 或 `localhost`)
+- ✅ 用户名必须是 `zskk`(不是 `pacsonline` 或其他)
+- ✅ 端口必须是 `3306`
 
-# 4. 运行部署脚本
-./deploy.sh
+### Nginx 配置说明
+
+#### default.conf - 主配置加载器
+```nginx
+# 加载所有子目录中的配置文件
+include /etc/nginx/conf.d/server.d/*.conf;
+include /etc/nginx/conf.d/upstreams.d/*.conf;
+include /etc/nginx/conf.d/out.d/*.conf;
 ```
 
-**说明**:
-- 镜像文件:`mysql-image.tar` (~757MB) + `redis-image.tar` (~41MB)
-- 部署脚本会自动检测并加载镜像文件
-- 如果存在 `mysql-init.sql`,会自动执行数据库初始化
+#### server.d/ - 各项目 Server 配置
+每个项目的 server 块独立配置,便于管理。
+
+#### upstreams.d/ - Upstream 配置
+定义后端服务地址:
+- `php-fpm.conf`: PHP-FPM 服务地址 `php_fpm:9000`
+- `zskk-server.conf`: 后端 API 地址 `127.0.0.1:19600`
+- `zskk-manage.conf`: 管理后台地址 `127.0.0.1:19620`
+
+**关键配置**:
+```nginx
+upstream php-fpm {
+    server php_fpm:9000;  # 必须使用容器名,不能用 127.0.0.1
+}
+```
 
 ## 常用命令
 
@@ -136,208 +247,390 @@ docker compose stop
 # 重启服务
 docker compose restart
 
-# 删除服务(保留数据)
+# 重启单个服务
+docker compose restart nginx
+docker compose restart php_fpm
+
+# 停止并删除容器(保留数据)
 docker compose down
 
-# 删除服务及数据卷
+# 停止并删除容器和数据卷
 docker compose down -v
 ```
 
 ### 查看状态和日志
 
 ```bash
+# 查看容器状态
+docker ps
+
 # 查看服务状态
 docker compose ps
 
-# 查看所有日志
-docker compose logs
+# 查看实时日志
+docker compose logs -f
 
-# 查看 MySQL 日志
-docker compose logs -f mysql
+# 查看特定服务日志
+docker logs nginx --tail 100 -f
+docker logs php_fpm --tail 100 -f
 
-# 查看 Redis 日志
-docker compose logs -f redis
+# 查看 Nginx 访问日志
+tail -f nginx/logs/access.log
 
-# 查看最近 100 行日志
-docker compose logs --tail=100
+# 查看应用错误日志
+docker exec php_fpm tail -f /var/www/html/zskk_new_manage/runtime/log/*/**.log
+docker exec php_fpm tail -f /var/www/html/zskk_new_server/server/runtime/log/**.log
 ```
 
-### 连接服务
-
-**MySQL 连接**
+### 进入容器
 
 ```bash
-# 方法 1: 从容器内连接
-docker exec -it mysql8_deploy mysql -uris -pzskk8888 -D ris
+# 进入 Nginx 容器
+docker exec -it nginx sh
+
+# 进入 PHP-FPM 容器
+docker exec -it php_fpm bash
 
-# 方法 2: 从容器内使用 root 连接
-docker exec -it mysql8_deploy mysql -uroot -pzskk8888
+# 进入 MySQL 容器
+docker exec -it mysql bash
 
-# 方法 3: 从宿主机连接(需安装 mysql 客户端)
-mysql -h 127.0.0.1 -P 3306 -uris -pzskk8888 -D ris
+# 进入 Redis 容器
+docker exec -it redis sh
 ```
 
-**Redis 连接**
+### 数据库操作
 
 ```bash
-# 方法 1: 从容器内连接
-docker exec -it redis7_deploy redis-cli -a zskk8888
+# 连接 MySQL
+docker exec -it mysql mysql -uzskk -pzskk@2025 -D pacsonline
 
-# 方法 2: 从宿主机连接(需安装 redis-cli)
-redis-cli -h 127.0.0.1 -p 6379 -a zskk8888
+# 使用 root 连接
+docker exec -it mysql mysql -uroot -pZskk@2025
 
-# 测试连接
-docker exec -it redis7_deploy redis-cli -a zskk8888 ping
-# 应该返回: PONG
-```
+# 导出数据库
+docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backup.sql
 
-### 数据备份
+# 导入数据库
+docker exec -i mysql mysql -uzskk -pzskk@2025 pacsonline < backup.sql
 
-**MySQL 备份**
+# 查看数据库列表
+docker exec mysql mysql -uroot -pZskk@2025 -e "SHOW DATABASES;"
+```
+
+### Redis 操作
 
 ```bash
-# 备份单个数据库
-docker exec mysql8_deploy mysqldump -uroot -pzskk8888 ris > backup_ris.sql
+# 连接 Redis
+docker exec -it redis redis-cli -a zskk@2025
 
-# 备份所有数据库
-docker exec mysql8_deploy mysqldump -uroot -pzskk8888 --all-databases > backup_all.sql
+# 测试连接
+docker exec redis redis-cli -a zskk@2025 ping
+
+# 查看 Redis 信息
+docker exec redis redis-cli -a zskk@2025 INFO
 
-# 恢复数据库
-docker exec -i mysql8_deploy mysql -uroot -pzskk8888 ris < backup_ris.sql
+# 清空 Redis 缓存
+docker exec redis redis-cli -a zskk@2025 FLUSHALL
 ```
 
-**Redis 备份**
+### Nginx 配置测试
 
 ```bash
-# 手动触发 RDB 快照
-docker exec redis7_deploy redis-cli -a zskk8888 BGSAVE
+# 测试 Nginx 配置语法
+docker exec nginx nginx -t
 
-# 备份 RDB 文件
-docker cp redis7_deploy:/data/dump.rdb ./backup_redis_dump.rdb
+# 重新加载 Nginx 配置(不重启)
+docker exec nginx nginx -s reload
 
-# 备份 AOF 文件
-docker cp redis7_deploy:/data/appendonly.aof ./backup_redis_aof.aof
+# 查看 Nginx 配置
+docker exec nginx nginx -T
 ```
 
-## 自定义配置
+## 故障排查
 
-### 修改 MySQL 配置
+### 1. 容器无法启动
 
-在 `mysql/conf/` 目录下创建 `.cnf` 配置文件,例如 `my.cnf`:
+**检查容器状态:**
+```bash
+docker compose ps
+docker logs <container_name>
+```
 
-```ini
-[mysqld]
-max_connections = 200
-character-set-server = utf8mb4
-collation-server = utf8mb4_unicode_ci
+**常见问题:**
+- 端口被占用:`lsof -i:<port>` 或 `netstat -tulnp | grep <port>`
+- 权限问题:检查数据目录权限 `ls -la mysql/data redis/data`
+- 配置错误:检查 docker-compose.yml 语法
+
+### 2. Nginx 无法启动
+
+**查看错误日志:**
+```bash
+docker logs nginx
+tail -50 nginx/logs/error.log
 ```
 
-### 修改 Redis 配置
+**常见错误及解决:**
+
+#### 错误:`host not found in upstream`
+```
+nginx: [emerg] host not found in upstream "xxx"
+```
+**原因**:upstream 配置中的主机名不存在
+**解决**:检查 `nginx/conf/upstreams.d/*.conf`,确保 upstream 名称和服务名称匹配
+
+#### 错误:`open() failed (2: No such file or directory)`
+```
+nginx: [emerg] open() "/data/logs/nginx/xxx.log" failed
+```
+**原因**:日志路径不存在
+**解决**:修改配置文件中的日志路径为 `/var/log/nginx/xxx.log`
+
+#### 错误:`unexpected "}"`
+```
+nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/xxx.conf:10
+```
+**原因**:配置文件语法错误(通常是缺少分号)
+**解决**:检查配置文件每行末尾是否有分号
 
-编辑 `redis/redis.conf` 文件,修改后重启容器:
+### 3. PHP 项目 500 错误
 
+**查看 PHP 错误日志:**
 ```bash
-docker compose restart redis
+# 查看 PHP-FPM 日志
+docker logs php_fpm
+
+# 查看项目运行日志
+docker exec php_fpm tail -100 /var/www/html/zskk_new_manage/runtime/log/202510/21.log
+```
+
+**常见错误:**
+
+#### 数据库连接失败
+```
+SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
+```
+**原因**:.env 文件中数据库主机名配置错误
+**解决**:
+1. 检查 `.env` 文件中 `hostname = mysql`(必须是容器名)
+2. 确认用户名密码正确
+3. 重启 PHP-FPM: `docker compose restart php_fpm`
+
+#### 数据库用户权限错误
+```
+SQLSTATE[HY000] [1045] Access denied for user 'xxx'@'xxx' (using password: YES)
 ```
+**原因**:数据库用户名或密码错误
+**解决**:检查 `.env` 文件配置是否与 docker-compose.yml 一致
 
-### MySQL 初始化脚本
+#### 类属性不存在
+```
+类的属性不存在:app\api\model\doctor\DoctorModel->message_voice
+```
+**原因**:数据库表结构缺少字段,或模型定义不完整
+**解决**:检查数据库表结构,或更新模型类
 
-**方法 1: 使用 mysql-init.sql(推荐)**
+### 4. 端口访问不通
 
-将你的初始化 SQL 文件命名为 `mysql-init.sql` 放在项目根目录,部署脚本会自动执行:
+**检查端口映射:**
+```bash
+docker ps --format "table {{.Names}}\t{{.Ports}}"
+```
 
+**检查容器网络:**
 ```bash
-# 部署时自动执行
-./deploy.sh
+docker network inspect deploy_app_network
 ```
 
-**方法 2: 使用 mysql/init/ 目录**
+**测试端口连通性:**
+```bash
+# 测试 Web 端口
+curl -I http://127.0.0.1:19620
+
+# 测试 MySQL 端口
+telnet 127.0.0.1 3306
 
-将 `.sql` 文件放入 `mysql/init/` 目录,容器首次启动时会自动执行(按字母顺序)。
+# 测试 Redis 端口
+telnet 127.0.0.1 6379
+```
 
-**注意**:
-- 方法 1 每次部署都会执行(适合测试环境)
-- 方法 2 只在首次启动时执行,如需重新初始化需删除数据卷:
+### 5. 修改配置后不生效
 
+**重启容器使配置生效:**
 ```bash
-# 删除数据卷
-docker compose down -v
+# Nginx 配置修改后
+docker compose restart nginx
 
-# 重新启动
+# PHP 配置或项目 .env 修改后
+docker compose restart php_fpm
+
+# docker-compose.yml 修改后(端口映射、环境变量等)
 docker compose up -d
 ```
 
-## 多架构支持
+## 配置修改指南
+
+### 修改数据库密码
 
-如果需要在不同 CPU 架构的服务器上部署(x86_64、ARM64),需分别构建镜像:
+1. 编辑 `docker-compose.yml`:
+```yaml
+services:
+  mysql:
+    environment:
+      MYSQL_ROOT_PASSWORD: 新密码
+      MYSQL_PASSWORD: 新密码
+```
 
+2. 更新项目 `.env` 文件
+3. 重建容器:
 ```bash
-# 在 x86_64 机器上构建
-docker buildx build --platform linux/amd64 -t my-mysql:v1.0-amd64 .
-docker save -o mysql-redis-amd64.tar my-mysql:v1.0-amd64 my-redis:v1.0-amd64
+docker compose down
+docker volume rm deploy_mysql_data  # 仅首次修改密码时需要
+docker compose up -d
+```
+
+### 添加新项目
+
+1. 将项目代码放入 `projects/www/新项目名/`
+2. 在 `nginx/conf/server.d/` 创建新的配置文件
+3. 如需代理,在 `nginx/conf/upstreams.d/` 添加 upstream 配置
+4. 重启 Nginx:`docker compose restart nginx`
 
-# 在 ARM64 机器上构建
-docker buildx build --platform linux/arm64 -t my-mysql:v1.0-arm64 .
-docker save -o mysql-redis-arm64.tar my-mysql:v1.0-arm64 my-redis:v1.0-arm64
+### 修改 Nginx 日志路径
+
+所有 server 配置中的日志路径必须使用 `/var/log/nginx/`,因为这是容器内挂载的日志目录:
+```nginx
+access_log /var/log/nginx/项目名.access.log;
+error_log /var/log/nginx/项目名.error.log;
 ```
 
-## 故障排查
+## 数据备份
 
-### 容器无法启动
+### MySQL 备份
 
 ```bash
-# 查看详细日志
-docker compose logs mysql
-docker compose logs redis
+# 备份单个数据库
+docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backup_$(date +%Y%m%d).sql
 
-# 检查端口占用
-lsof -i:3306
-lsof -i:6379
+# 备份所有数据库
+docker exec mysql mysqldump -uroot -pZskk@2025 --all-databases > backup_all_$(date +%Y%m%d).sql
 
-# 检查权限
-ls -la data/mysql
-ls -la data/redis
+# 定时备份(添加到 crontab)
+0 2 * * * cd /path/to/deploy && docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backups/backup_$(date +\%Y\%m\%d).sql
 ```
 
-### MySQL 连接失败
+### Redis 备份
 
 ```bash
-# 检查容器状态
-docker compose ps
+# 触发 RDB 快照
+docker exec redis redis-cli -a zskk@2025 BGSAVE
 
-# 测试网络连接
-docker exec mysql8_deploy mysqladmin -uroot -pzskk8888 ping
+# 备份 RDB 文件
+docker cp redis:/data/dump.rdb ./backup_redis_$(date +%Y%m%d).rdb
 
-# 检查用户权限
-docker exec -it mysql8_deploy mysql -uroot -pzskk8888 -e "SELECT user, host FROM mysql.user;"
+# 备份 AOF 文件
+docker cp redis:/data/appendonly.aof ./backup_redis_$(date +%Y%m%d).aof
 ```
 
-### Redis 连接失败
+### 项目代码备份
 
 ```bash
-# 测试 Redis 连接
-docker exec redis7_deploy redis-cli -a zskk8888 ping
+# 备份整个项目目录
+tar -czf projects_backup_$(date +%Y%m%d).tar.gz projects/
 
-# 检查密码配置
-docker exec redis7_deploy redis-cli -a zskk8888 CONFIG GET requirepass
+# 备份配置文件
+tar -czf config_backup_$(date +%Y%m%d).tar.gz nginx/ php-fpm/ mysql/conf/ redis/conf/
+```
+
+## 性能优化
+
+### PHP-FPM 优化
+
+编辑 `php-fpm/conf/www.conf`(如果存在):
+```ini
+pm = dynamic
+pm.max_children = 50
+pm.start_servers = 10
+pm.min_spare_servers = 5
+pm.max_spare_servers = 20
+pm.max_requests = 500
+```
+
+### Nginx 优化
+
+在 server 配置中添加:
+```nginx
+# 启用 Gzip 压缩
+gzip on;
+gzip_types text/plain text/css application/json application/javascript;
+
+# 静态文件缓存
+location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
+    expires 30d;
+    add_header Cache-Control "public, immutable";
+}
+```
+
+### MySQL 优化
+
+在 `mysql/conf/my.cnf` 中添加:
+```ini
+[mysqld]
+max_connections = 200
+innodb_buffer_pool_size = 256M
+innodb_log_file_size = 64M
 ```
 
 ## 安全建议
 
-1. **修改默认密码**: 部署到生产环境前,请修改 `docker-compose.yml` 中的所有密码
-2. **限制访问**: 如果不需要外部访问,可以移除端口映射或使用防火墙限制
-3. **定期备份**: 建议定期备份数据库和 Redis 数据
-4. **更新镜像**: 定期更新到最新的稳定版本以获取安全补丁
+1. **修改默认密码**:生产环境必须修改所有默认密码
+2. **限制端口访问**:使用防火墙限制数据库端口仅允许内部访问
+3. **启用 HTTPS**:配置 SSL 证书,启用 HTTPS
+4. **定期备份**:设置定时备份任务
+5. **更新镜像**:定期更新 Docker 镜像以获取安全补丁
+6. **日志审计**:定期检查日志文件,监控异常访问
+
+## 离线部署
+
+### 导出镜像
+
+```bash
+# 导出所有镜像
+docker save -o images/all-images.tar \
+    mysql:8.0 \
+    my-redis:v1.0 \
+    php-fpm-mysql:7.4-arm64 \
+    nginx:alpine
+```
+
+### 导入镜像
+
+```bash
+# 导入镜像
+docker load -i images/all-images.tar
+
+# 启动服务
+docker compose up -d
+```
 
 ## 技术支持
 
-- Docker 官方文档: https://docs.docker.com/
-- MySQL 官方文档: https://dev.mysql.com/doc/
-- Redis 官方文档: https://redis.io/documentation
+- Docker 文档: https://docs.docker.com/
+- Docker Compose 文档: https://docs.docker.com/compose/
+- Nginx 文档: https://nginx.org/en/docs/
+- PHP 文档: https://www.php.net/docs.php
+- MySQL 文档: https://dev.mysql.com/doc/
+- Redis 文档: https://redis.io/documentation
 
 ## 版本信息
 
-- Docker Compose: 3.8+
+- Docker Compose: 2.0+
 - MySQL: 8.0
-- Redis: 7-alpine
+- Redis: 7
+- PHP-FPM: 7.4
+- Nginx: Alpine
 - 创建日期: 2025-10-15
+- 最后更新: 2025-10-21
+
+## 许可证
+
+内部项目,仅供团队使用。

+ 2 - 1
deploy.sh

@@ -201,7 +201,8 @@ echo ""
 echo -e "${YELLOW}查看日志:${NC}"
 echo "  MySQL: $COMPOSE_CMD logs -f mysql"
 echo "  Redis: $COMPOSE_CMD logs -f redis"
-echo "  MinIO: $COMPOSE_CMD logs -f minio"
+echo "  php-fpm: $COMPOSE_CMD logs -f php-fpm"
+echo "  nginx: $COMPOSE_CMD logs -f nginx"
 echo ""
 echo -e "${YELLOW}停止服务:${NC}"
 echo "  $COMPOSE_CMD stop"

+ 11 - 6
docker-compose.yml

@@ -1,7 +1,7 @@
 services:
   mysql:
     image: mysql:8.0
-    container_name: mysql8_deploy
+    container_name: mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: Zskk@2025
@@ -20,14 +20,14 @@ services:
 
   redis:
     image: my-redis:v1.0
-    container_name: redis7_deploy
+    container_name: redis
     restart: always
     command: redis-server /etc/redis/redis.conf --requirepass zskk@2025
     ports:
       - "6379:6379"
     volumes:
       - ./redis/data:/data
-      - ./redis/redis.conf:/etc/redis/redis.conf
+      - ./redis/conf/redis.conf:/etc/redis/redis.conf
     networks:
       - app_network
 
@@ -60,12 +60,12 @@ services:
     #     - linux/amd64
     #     - linux/arm64
     image: php-fpm-mysql:7.4-arm64
-    container_name: php_fpm_deploy
+    container_name: php_fpm
     restart: always
     ports:
       - "9000:9000"  # PHP-FPM 端口(与 Nginx 通信)
     volumes:
-      - ./projects/php:/var/www/html  # PHP 代码目录
+      - ./projects/www:/var/www/html  # PHP 代码目录
       - ./php-fpm/conf:/usr/local/etc/php/conf.d  # PHP 配置目录
     networks:
       - app_network
@@ -75,11 +75,16 @@ services:
 
   nginx:
     image: nginx:alpine
-    container_name: nginx_deploy
+    container_name: nginx
     restart: always
     ports:
       - "80:80"
       - "443:443"
+      - "19620:19620"  # manage 后台管理
+      - "19603:19603"  # pacs 阅片器
+      - "19602:19602"  # ris医生端
+      - "19600:19600"  # ris医生端server
+      - "9600:9600"    # ris-api
     volumes:
       - ./nginx/conf:/etc/nginx/conf.d  # Nginx 配置目录
       - ./nginx/logs:/var/log/nginx  # Nginx 日志目录

BIN
images/php-fpm-image-amd64.tar


+ 0 - 0
redis/data/appendonlydir/appendonly.aof.1.incr.aof → mysql/conf/test


+ 24 - 24
nginx/conf/out.d/out.conf

@@ -325,30 +325,30 @@ server {
         
     }
 
-    server {
-        listen       9604;
-        #ssl on;
-        server_name  _;#www.kunl-healthcare.com;
-        location / {
-            proxy_pass              http://zskk-wechat/;# 
-            # proxy_pass              https://ris4.pacsonline.cn/;# ris3.0前端
-
-                #proxy_set_header        Host $host;
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            client_max_body_size    2000m;
-            proxy_http_version 1.1;
-            proxy_set_header Connection "";
-            client_body_buffer_size 128k;
-            proxy_connect_timeout   90;
-            proxy_send_timeout      90;
-            proxy_read_timeout      90;
-            proxy_buffer_size       4k;
-            proxy_buffers           4 32k;
-            proxy_busy_buffers_size 64k;
-            proxy_temp_file_write_size 64k;
-        }
-    }
+    # server {
+    #     listen       9604;
+    #     #ssl on;
+    #     server_name  _;#www.kunl-healthcare.com;
+    #     location / {
+    #         proxy_pass              http://zskk-wechat/;#
+    #         # proxy_pass              https://ris4.pacsonline.cn/;# ris3.0前端
+
+    #             #proxy_set_header        Host $host;
+    #         proxy_set_header        X-Real-IP $remote_addr;
+    #         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+    #         client_max_body_size    2000m;
+    #         proxy_http_version 1.1;
+    #         proxy_set_header Connection "";
+    #         client_body_buffer_size 128k;
+    #         proxy_connect_timeout   90;
+    #         proxy_send_timeout      90;
+    #         proxy_read_timeout      90;
+    #         proxy_buffer_size       4k;
+    #         proxy_buffers           4 32k;
+    #         proxy_busy_buffers_size 64k;
+    #         proxy_temp_file_write_size 64k;
+    #     }
+    # }
 server {
         # dcm下载端口配置
         listen       9999;

+ 5 - 4
nginx/conf/server.d/zskk-manage.conf

@@ -2,10 +2,11 @@ server {
     listen 19620;
     server_name _;
     charset utf-8;
-    access_log /data/logs/nginx/manage.access.log;
-    error_log /data/logs/nginx/manage.error.log;
+    access_log /var/log/nginx/manage.access.log;
+    error_log /var/log/nginx/manage.error.log;
     index index.html index.htm;
-    root /data/code/manage_dm/zskk_new_manage/public;
+    #root /data/code/manage_dm/zskk_new_manage/public;
+    root /var/www/html/zskk_new_manage/public;
     
     location / {
         index index.php index.html index.htm;
@@ -20,7 +21,7 @@ server {
  
 	
     location ~ .php($|/) {
-        fastcgi_pass    php_fpm_deploy:9000;
+        # fastcgi_pass    127.0.0.1:9000;
         fastcgi_connect_timeout 300s;
         fastcgi_send_timeout 300s;
         fastcgi_read_timeout 300s;

+ 4 - 3
nginx/conf/server.d/zskk-pacs.conf

@@ -2,8 +2,9 @@ server {
     listen 19603;
     server_name _;
     charset utf-8;
-    access_log /data/logs/nginx/pacs.access.log;
-    error_log /data/logs/nginx/pacs.error.log;
+    access_log /var/log/nginx/pacs.access.log;
+    error_log /var/log/nginx/pacs.error.log;
     index index.html index.htm;
-    root /data/www/pacs;
+    #root /data/www/pacs;
+    root /var/www/html/pacs;
 }

+ 3 - 3
nginx/conf/server.d/zskk-ris.conf

@@ -2,8 +2,8 @@ server {
     listen 19602;
     server_name _;
     charset utf-8;
-    access_log /data/logs/nginx/ris.access.log;
-    error_log /data/logs/nginx/ris.error.log;
+    access_log /var/log/nginx/ris.access.log;
+    error_log /var/log/nginx/ris.error.log;
     index index.html index.htm;
-    root /data/www/ris;
+    root /var/www/html/ris;
 }

+ 6 - 5
nginx/conf/server.d/zskk-server.conf

@@ -3,21 +3,22 @@ server {
     listen 19600;
     server_name _;
     charset utf-8;
-    access_log /data/logs/nginx/server.access.log main;
-    error_log /data/logs/nginx/server.error.log;
+    access_log /var/log/nginx/server.access.log main;
+    error_log /var/log/nginx/server.error.log;
     index index.html index.htm;
-    root /data/code/ris_dm/server/public;
+    #root /data/code/ris_dm/server/public;
+    root  /var/www/html/zskk_new_server/server/public;
     
     client_max_body_size    1024m;
     proxy_ignore_client_abort on;
         
 	
     location  ~ .(js|css|gif|jpg|jpeg|png|html)$ {
-        root /data/code/ris_dm/server/public;
+        root /var/www/html/zskk_new_server/server/public;
     }
 	
     location ^~ /uploads/ {
-        root /data/code/ris_dm/server/public;
+        root /var/www/html/zskk_new_server/server/public;
     }
 	
     location / {

+ 0 - 44
nginx/conf/server.d/zskk-wechat-server.conf

@@ -1,44 +0,0 @@
-
-server {
-    listen 19614;
-    server_name _;
-    charset utf-8;
-    access_log /data/logs/nginx/wechat-server.access.log main;
-    error_log /data/logs/nginx/wechat-server.error.log;
-    index index.html index.htm;
-    root /data/wechat/public;
-    
-    client_max_body_size    1024m;
-    proxy_ignore_client_abort on;
-        
-	
-    location  ~ .(js|css|gif|jpg|jpeg|png|html)$ {
-        root /data/wechat/public;
-    }
-	
-    location ^~ /uploads/ {
-        root /data/wechat/public;
-    }
-	
-    location / {
-        index index.php index.html index.htm;
-        if (!-e $request_filename) {
-            rewrite ^(.*)$ /index.php?s=/$1 last;
-            break;
-        }
-        if ( -f $request_filename) {
-            break;
-        }
-    }
- 
-	
-    location ~ .php($|/) {
-        # fastcgi_pass    127.0.0.1:9000;
-        fastcgi_pass    php-fpm;
-        fastcgi_index   index.php;
-        fastcgi_split_path_info ^(.+.php)(.*)$;
-        fastcgi_param   PATH_INFO $fastcgi_path_info;
-        fastcgi_param   SCRIPT_FILENAME $document_root/$fastcgi_script_name;
-        include         fastcgi_params;
-    }
-}

+ 0 - 37
nginx/conf/server.d/zskk-wechat.conf

@@ -1,37 +0,0 @@
-server {
-    listen 19604;
-    server_name _;
-    charset utf-8;
-    access_log /data/logs/nginx/wechat.access.log;
-    error_log /data/logs/nginx/wechat.error.log;
-    index index.html index.htm;
-    root /data/www/wechat;
-
-    location /wechat-server/ {
-        # access_log /Users/fuyu/etc/nginx/logs/access.log;
-        # access_log /Users/fuyu/etc/nginx/logs/error.log;
-
-        # add_header Access-Control-Allow-Origin '*';
-        # add_header Access-Control-Allow-Headers 'X-Requested-With,Content-Type';
-        # add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
-        proxy_pass              http://zskk-wechat-server/;
-        # proxy_pass              https://risserver3.pacsonline.cn/;#ris3.0后台
-        # proxy_pass              http://172.16.100.90:9600/zskkapi/; # ris3.0管理后台
-
-        #proxy_set_header        Host $host;
-        proxy_set_header        X-Real-IP $remote_addr;
-        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-        # proxy_set_header HTTP_ZSKK_CRB_NETWORK INNER;
-        client_max_body_size    2000m;
-        proxy_http_version 1.1;
-        proxy_set_header Connection "";
-        client_body_buffer_size 128k;
-        proxy_connect_timeout   90;
-        proxy_send_timeout      90;
-        proxy_read_timeout      90;
-        proxy_buffer_size       4k;
-        proxy_buffers           4 32k;
-        proxy_busy_buffers_size 64k;
-        proxy_temp_file_write_size 64k;
-    }
-}

+ 1 - 1
nginx/conf/upstreams.d/php-fpm.conf

@@ -1,3 +1,3 @@
 upstream php-fpm {
-    server 127.0.0.1:9000;
+    server php_fpm:9000;
 }

+ 0 - 3
nginx/conf/upstreams.d/zskk-wechat-server.conf

@@ -1,3 +0,0 @@
-upstream zskk-wechat-server {
-    server 127.0.0.1:19614;
-}

+ 0 - 3
nginx/conf/upstreams.d/zskk-wechat.conf

@@ -1,3 +0,0 @@
-upstream zskk-wechat {
-    server 127.0.0.1:19604;
-}

+ 0 - 13
php-fpm/conf/php.ini

@@ -1,13 +0,0 @@
-; ./php/conf/php.ini
-[PHP]
-; 设置错误日志路径(容器内的路径,确保 PHP 有权限写入)
-error_log = /var/log/php/error.log
-; 显示所有错误(开发环境用,生产环境关闭)
-display_errors = On
-display_startup_errors = On
-; 报告所有错误,但排除 deprecated 警告(解决 PHP 8.2 兼容性问题)
-error_reporting = E_ALL & ~E_DEPRECATED
-; 其他必要配置(根据项目需求添加)
-memory_limit = 128M
-upload_max_filesize = 2M
-post_max_size = 8M

+ 0 - 0
projects/www/静态项目(比如pacs项目)


+ 0 - 0
projects/www/静态项目(比如vue项目的dist)


+ 0 - 0
redis/redis.conf → redis/conf/redis.conf


BIN
redis/data/appendonlydir/appendonly.aof.1.base.rdb


+ 0 - 2
redis/data/appendonlydir/appendonly.aof.manifest

@@ -1,2 +0,0 @@
-file appendonly.aof.1.base.rdb seq 1 type b
-file appendonly.aof.1.incr.aof seq 1 type i

BIN
redis/data/dump.rdb