Files
AIclinicalresearch/docs/03-业务模块/Redcap/03-REDCap本地Docker开发环境部署方案.md
HaHafeng 38d9bf99d6 feat(redcap): REDCap 15.8.0 Docker本地开发环境部署完成
核心成果:
- REDCap 15.8.0成功部署在Docker环境
- 登录功能正常,管理员账户: Admin/Admin123!
- MySQL 8.0 + PHP 8.1 + Apache 2.4环境验证通过

问题解决:
1. 修复ERR_CONTENT_DECODING_FAILED错误
   - 强制禁用Apache deflate模块
   - PHP配置关闭zlib.output_compression
   - 自动注释REDCap源码中的压缩设置

2. 修复Base URL配置错误
   - 更新redcap_config表中的redcap_base_url
   - 统一DocumentRoot与访问路径

3. 修复登录失败问题(CRLF污染)
   - 删除database.php末尾的PHP结束标签
   - 创建.gitattributes规范换行符
   - 验证REDCap官方源码无此问题

技术改进:
- 添加密码重置工具脚本
- 完善docker-entrypoint.sh启动脚本
- 创建详细的部署问题解决记录
- 建立PHP配置文件最佳实践

部署文档:
- REDCap本地Docker开发环境部署方案
- REDCap生产环境部署决策报告(ECS vs SAE)
- 部署问题解决记录(含根因分析)

下一步:
- Day 2: 开发REDCap API Adapter
- 实现与IIT Manager Agent的数据对接
2026-01-02 10:02:46 +08:00

1852 lines
46 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# REDCap Docker部署方案开发/生产一致性架构)
> **文档版本:** v2.0
> **创建日期:** 2026-01-01
> **最后更新:** 2026-01-01根据ECS决议报告修订
> **文档目的:** 指导IIT Manager Agent项目的REDCap Docker环境搭建开发/生产架构一致)
> **阅读时间:** 25分钟
> **重要性:** ⭐⭐⭐⭐⭐ **Day 2开发前必读**
> **预计部署时间:** 1.5小时
> **架构决策依据:** [REDCap生产环境部署ECS vs SAE深度决议报告](./REDCap%20生产环境部署ECS%20vs%20SAE%20深度决议报告.md)
---
## 📋 文档说明
### 核心理念:**本地开发即生产环境** 🎯
本文档基于IIT Manager Agent项目的**混合架构决策**采用Docker容器化部署REDCap实现
-**开发环境 = 测试环境 = 生产环境**(无环境漂移)
-**Docker配置可直接用于阿里云ECS生产部署**
-**Docker配置可直接用于医院内网私有化部署**
-**2人团队可维护的简单架构**
### 架构定位
```yaml
数据平面 (Data Layer) - REDCap部署策略
├─ 本地开发Docker Compose (Windows/Mac)
├─ 阿里云测试/生产ECS + Docker + RDS MySQL
└─ 医院私有化:服务器 + Docker + 本地MySQL
控制平面 (AI Agent Layer) - 部署策略:
├─ Node.js后端阿里云SAE (Serverless)
├─ Python微服务阿里云SAE
└─ React前端阿里云SAE
为什么REDCap用ECS而不是SAE
❌ REDCap有三个"致命特性"不适合Serverless
1. Cron依赖心跳任务
2. Session粘滞本地会话
3. POSIX文件系统依赖本地存储
详见REDCap生产环境部署ECS vs SAE深度决议报告.md
```
### 适用场景
**本地开发环境**
- ✅ REDCap API Adapter开发与测试
- ✅ External Module开发与调试
- ✅ IIT试验项目原型验证
- ✅ API Token测试和数据格式验证
**生产环境**相同Docker配置 + 额外配置):
- ✅ 阿里云ECS生产部署+ RDS + OSS + SLB
- ✅ 医院内网私有化部署(+ SSL + 备份)
- ✅ 多院区标准化交付
---
## 🎯 一、核心架构设计
### 1.1 容器架构(开发/生产一致)
#### 生产级核心容器(必需)
```
REDCap Docker环境开发/生产通用)
├─ 容器1: MySQL 8.0 数据库 【redcap-db】
│ ├─ 本地开发Docker容器
│ └─ 生产环境阿里云RDS MySQL推荐或Docker容器
└─ 容器2: Apache + PHP 8.1 + REDCap 【redcap-web】
├─ 包含Cron定时任务
├─ 包含External Modules
└─ 本地存储edocs/、modules/、temp/
网络redcap-networkbridge模式
存储Docker命名卷持久化数据
```
#### 开发辅助容器(仅开发环境,生产禁用)
```
⚠️ 以下容器仅用于本地开发调试,生产环境出于安全考虑应禁用:
容器3: phpMyAdmin可选 【phpmyadmin】
├─ 用途:数据库可视化管理、调试
├─ 端口8081
└─ 生产环境:❌ 不部署(安全风险)
说明:
生产环境数据库管理应通过:
✅ 阿里云RDS控制台
✅ MySQL命令行SSH连接
✅ 受限的DMS数据管理服务
```
### 1.2 架构优势
```
✅ 开发/生产环境一致(消除"在我机器上能跑"问题)
✅ MySQL在Docker内无需本机安装开发环境
✅ 可无缝切换到RDS MySQL生产环境
✅ 所有依赖隔离,不污染主机环境
✅ 一键启动/停止2人团队可维护
✅ 环境可重复构建(容器化标准交付)
✅ 易于销毁重建(测试友好)
✅ 数据持久化Docker卷 或 RDS
✅ 支持多版本并存(不同端口)
✅ 直接可用于医院内网部署(离线交付)
```
### 1.3 端口分配
| 服务 | 容器端口 | 主机端口 | 访问地址 | 生产环境 |
|------|---------|---------|---------|---------|
| REDCap Web | 80 | 8080 | http://localhost:8080 | ✅ 部署端口80 |
| MySQL | 3306 | 3306 | localhost:3306 | ⚠️ 或使用RDS |
| phpMyAdmin | 80 | 8081 | http://localhost:8081 | ❌ 禁用 |
**生产环境端口调整**
- REDCap Web使用标准80/443端口通过SLB
- MySQL如使用RDS无需暴露端口内网连接
- phpMyAdmin不部署
---
## 🗂️ 二、文件结构规划
### 2.1 项目目录结构
```
AIclinicalresearch/
├─ redcap15.8.0/ # ✅ 已有REDCap源码
│ └─ redcap/ # REDCap核心文件
├─ redcap-docker-dev/ # 🆕 Docker部署目录需创建
│ ├─ docker-compose.yml # Docker编排配置核心
│ ├─ Dockerfile.redcap # REDCap容器镜像定义
│ ├─ .env # 环境变量(数据库密码等)
│ │
│ ├─ config/ # 配置文件目录
│ │ ├─ apache/
│ │ │ └─ redcap.conf # Apache虚拟主机配置
│ │ ├─ php/
│ │ │ └─ php.ini # PHP配置
│ │ └─ database.php # REDCap数据库连接配置
│ │
│ ├─ scripts/ # 自动化脚本
│ │ ├─ setup-redcap.ps1 # 🔧 一键部署脚本PowerShell
│ │ ├─ start-redcap.ps1 # 🚀 启动脚本
│ │ ├─ stop-redcap.ps1 # ⏹️ 停止脚本
│ │ ├─ logs-redcap.ps1 # 📝 查看日志
│ │ └─ clean-redcap.ps1 # 🗑️ 清理环境
│ │
│ └─ README.md # 部署文档
```
### 2.2 目录说明
| 目录/文件 | 用途 | 开发环境 | 生产环境 |
|----------|------|---------|---------|
| `docker-compose.yml` | 定义多容器应用 | ✅ 必需 | ✅ 必需(需调整) |
| `Dockerfile.redcap` | 自定义REDCap镜像 | ✅ 必需 | ✅ 必需 |
| `.env` | 敏感信息(密码) | ✅ 必需 | ✅ 必需(强密码) |
| `config/apache/` | Web服务器配置 | ✅ 必需 | ✅ 必需(+SSL |
| `config/php/` | PHP运行时配置 | ✅ 必需 | ✅ 必需 |
| `config/database.php` | REDCap数据库连接 | ✅ 必需 | ✅ 必需RDS连接 |
| `scripts/` | 运维脚本 | ⭐ 推荐 | ✅ 必需 |
**生产环境额外需要**
- SSL证书文件Let's Encrypt或商业证书
- 备份脚本(数据库 + 文件)
- 监控配置CloudMonitor Agent
- 日志轮转配置
---
## 🔧 三、关键配置说明
### 3.1 MySQL配置容器内
#### 3.1.1 基本配置
```yaml
# docker-compose.yml - MySQL服务
services:
redcap-db:
image: mysql:8.0
container_name: redcap-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- redcap-db-data:/var/lib/mysql # 数据持久化
ports:
- "3306:3306"
networks:
- redcap-network
command: --default-authentication-plugin=mysql_native_password
```
#### 3.1.2 环境变量(.env文件
```bash
# 数据库配置(开发环境)
MYSQL_ROOT_PASSWORD=redcap_root_123
MYSQL_DATABASE=redcap
MYSQL_USER=redcap_user
MYSQL_PASSWORD=redcap_pass_456
# ⚠️ 警告:这些是开发环境密码!
# 生产环境必须使用强密码!
```
#### 3.1.3 认证插件说明
```bash
# 为什么使用 mysql_native_password
# REDCap 15.8.0兼容性要求
# 如果使用MySQL 8.0默认的caching_sha2_password会导致连接失败
```
---
### 3.2 PHP + Apache配置
#### 3.2.1 PHP配置php.ini
```ini
# config/php/php.ini
# ========== 文件上传REDCap必需==========
upload_max_filesize = 32M # REDCap文件上传限制
post_max_size = 32M # 表单提交大小
max_file_uploads = 20 # 同时上传文件数
# ========== 执行时间(数据导出需要)==========
max_execution_time = 300 # 5分钟大数据导出
max_input_time = 300 # 输入解析时间
# ========== 内存REDCap最低要求==========
memory_limit = 256M # REDCap推荐256MB
# ========== 时区(重要!)==========
date.timezone = Asia/Shanghai # 北京时间
# ========== 错误报告(开发环境)==========
display_errors = On # 开发环境显示错误
error_reporting = E_ALL # 报告所有错误
# ========== Session配置 ==========
session.gc_maxlifetime = 3600 # Session过期时间1小时
session.cookie_lifetime = 0 # Cookie浏览器关闭时过期
```
#### 3.2.2 PHP扩展必需
```dockerfile
# Dockerfile.redcap 中安装扩展
# 核心扩展REDCap必需
RUN docker-php-ext-install \
mysqli # MySQL连接必需
pdo_mysql # PDO支持必需
gd # 图片处理(验证码、图表)
zip # 数据导出压缩
mbstring # 多字节字符串UTF-8
curl # API调用
soap # Web Service集成可选
ldap # LDAP认证可选
# Apache模块
RUN a2enmod rewrite ssl headers
```
#### 3.2.3 Apache配置redcap.conf
```apache
# config/apache/redcap.conf
<VirtualHost *:80>
ServerName localhost
DocumentRoot /var/www/html/redcap
<Directory /var/www/html/redcap>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# 防止目录遍历
Options -Indexes
# 允许.htaccess
AllowOverride All
</Directory>
# 日志配置
ErrorLog ${APACHE_LOG_DIR}/redcap-error.log
CustomLog ${APACHE_LOG_DIR}/redcap-access.log combined
# 安全头(开发环境可选)
# Header always set X-Frame-Options "SAMEORIGIN"
# Header always set X-Content-Type-Options "nosniff"
</VirtualHost>
```
---
### 3.3 REDCap database.php配置
#### 3.3.1 数据库连接配置
```php
<?php
// config/database.php
/**
* REDCap数据库连接配置Docker环境
* 此文件需要复制到REDCap源码的redcap/目录下
*/
global $log_all_errors;
$log_all_errors = TRUE; // 开发环境开启详细日志
// ========== MYSQL DATABASE CONNECTION ==========
// Docker容器内连接配置
$hostname = 'redcap-db'; # 容器服务名不是localhost
$db = 'redcap'; # 数据库名
$username = 'redcap_user'; # 用户名
$password = 'redcap_pass_456'; # 密码
// ========== SALT VARIABLE重要==========
// 用于数据去标识化哈希
// ⚠️ 一旦设置,永远不可更改!
$salt = 'iit_dev_salt_2026_redcap_v15'; // 至少8个字符
// ========== SSL连接开发环境不需要==========
$db_ssl_key = '';
$db_ssl_cert = '';
$db_ssl_ca = '';
$db_ssl_capath = NULL;
$db_ssl_cipher = NULL;
$db_ssl_verify_server_cert = false;
?>
```
#### 3.3.2 Salt值说明
```
什么是Salt
- 用于REDCap数据导出时的去标识化
- 影响哈希数据的生成
- 一旦设置后不可更改(会导致历史数据无法解密)
开发环境建议:
- 使用固定的Salt值便于多次重建环境
- 包含项目标识(如'iit_dev_salt_2026'
- 至少8个字符建议20+字符
生产环境要求:
- 使用强随机Salt32+字符)
- 包含大小写字母、数字、特殊字符
- 妥善备份(丢失会导致数据无法解密)
```
---
## 📧 四、邮件服务配置策略
### 4.1 三种配置方案对比
| 方案 | 复杂度 | 功能 | 推荐场景 |
|------|--------|------|---------|
| **方案A跳过配置** | ⭐ 最简单 | 无邮件功能 | ✅ Day 2-8 API开发 |
| **方案BMailHog** | ⭐⭐ 简单 | 本地邮件拦截 | Day 9-10 邮件测试 |
| **方案C真实SMTP** | ⭐⭐⭐ 复杂 | 真实邮件发送 | 后期集成测试 |
### 4.2 方案A跳过配置推荐用于Day 2-8
```yaml
优势:
✅ 配置最简单
✅ 启动最快
✅ 不影响API开发
✅ REDCap可正常运行
限制:
❌ 无法发送调查邀请
❌ 无法发送密码重置邮件
❌ 无法发送系统通知
实施方法:
1. REDCap安装时跳过SMTP配置步骤
2. 控制中心 → Email & Notification → 留空
3. 直接进行API开发
适用于:
✅ REDCap API Adapter开发
✅ External Module开发不涉及邮件
✅ 数据导入导出测试
```
### 4.3 方案BMailHog本地邮件测试
```yaml
# docker-compose.yml 添加MailHog服务
services:
mailhog:
image: mailhog/mailhog
container_name: redcap-mailhog
ports:
- "1025:1025" # SMTP端口
- "8025:8025" # Web UI端口
networks:
- redcap-network
# REDCap SMTP配置
SMTP Host: mailhog
SMTP Port: 1025
SMTP Auth: 无需认证
# 访问Web界面查看邮件
http://localhost:8025
```
**使用场景**:测试调查邀请、密码重置等邮件功能
### 4.4 方案C真实SMTPGmail/Outlook
```yaml
# REDCap控制中心配置
# Gmail示例
SMTP Host: smtp.gmail.com
SMTP Port: 587
SMTP Auth: TLS
Username: your-email@gmail.com
Password: app-specific-password # 不是Gmail密码
# 限制
- Gmail每天100封免费账户
- Outlook每天300封
- 需要开启"不够安全的应用访问"或使用应用专用密码
```
**推荐策略**
- **Day 2-8**使用方案A跳过
- **Day 9-10**如需测试邮件临时切换到方案B
- **生产环境**使用企业SMTP或云服务SendGrid、阿里云DirectMail
---
## 🌐 五、本地 vs 云端部署
### 5.1 Docker镜像可移植性分析
#### 本地Docker → 阿里云ECS是否可以
```
答案:可以,但不推荐直接迁移!
可以这样做:
1. 导出Docker镜像
docker save redcap-local:1.0 -o redcap.tar
2. 上传到ECS
scp redcap.tar user@ecs-ip:/tmp/
3. 在ECS导入
docker load -i /tmp/redcap.tar
4. 运行容器
docker run -d -p 80:80 redcap-local:1.0
但为什么不推荐?
❌ 性能Docker多一层虚拟化损失10-20%性能
❌ 稳定性:容器层增加复杂度和故障点
❌ 运维:医疗系统需要最大可控性
❌ 备份:容器数据备份更复杂
❌ 监控:直接部署更易于监控和调试
```
### 5.2 推荐的云端部署策略
```
本地开发Docker→ 云端生产(标准部署)
阶段1本地Docker开发当前
- 目的API Adapter开发、External Module开发
- 环境Windows + Docker Desktop
- 数据:测试数据(可随时销毁)
阶段2ECS标准部署未来
- 目的:生产环境、真实医疗数据
- 环境Ubuntu 22.04 + LAMP
- 数据RDS MySQL高可用+ OSS存储
迁移路径:
1. 在本地Docker完成External Module开发
2. 验证API Adapter功能
3. 在ECS上标准安装REDCapLAMP
4. 复制External Module代码到ECS
5. 配置生产级数据库和SMTP
6. 配置SSL证书和域名
```
### 5.3 环境对比表
| 对比项 | 本地Docker | 阿里云ECS标准部署 |
|--------|-----------|---------------------|
| **部署方式** | Docker Compose | LAMP手动安装 |
| **访问地址** | localhost:8080 | https://redcap.domain.com |
| **数据库** | Docker容器 | RDS MySQL推荐或本地 |
| **存储** | Docker卷 | OSS或本地磁盘 |
| **邮件** | 跳过或MailHog | 阿里云DirectMail/SendGrid |
| **SSL** | 不需要 | Let's Encrypt证书 |
| **性能** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| **稳定性** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| **成本** | $0 | $50-200/月 |
| **适用场景** | 开发测试 | 生产环境 |
---
## 🔑 六、关键注意事项
### 6.1 坑点1文件权限问题 ⚠️
#### 症状
```bash
安装时提示:
"Unable to write to /var/www/html/edocs directory"
"Unable to write to /var/www/html/temp directory"
```
#### 原因
```
Apache运行用户www-data对目录无写权限
Docker容器内文件权限与主机不同步
```
#### 解决方案
```bash
# 方法1启动后手动修复推荐
docker exec -it redcap-web chown -R www-data:www-data /var/www/html/edocs
docker exec -it redcap-web chown -R www-data:www-data /var/www/html/temp
docker exec -it redcap-web chown -R www-data:www-data /var/www/html/modules
# 方法2在Dockerfile中预先配置
RUN mkdir -p /var/www/html/edocs /var/www/html/temp /var/www/html/modules && \
chown -R www-data:www-data /var/www/html
```
#### 预防措施
```bash
# 检查权限
docker exec -it redcap-web ls -la /var/www/html/
# 应该看到:
drwxr-xr-x www-data www-data edocs
drwxr-xr-x www-data www-data temp
drwxr-xr-x www-data www-data modules
```
---
### 6.2 坑点2数据库连接失败 ⚠️
#### 症状
```bash
安装页面提示:
"Cannot connect to database"
"Access denied for user 'redcap_user'@'redcap-web.redcap-network'"
```
#### 原因
```
原因1: MySQL容器未完全启动
原因2: database.php配置错误hostname
原因3: 认证插件不兼容caching_sha2_password
```
#### 解决方案
**问题1MySQL未就绪**
```bash
# 查看MySQL日志等待"ready for connections"
docker-compose logs redcap-db | grep "ready for connections"
# 输出示例:
# 2026-01-01 10:00:00 [Server] /usr/sbin/mysqld: ready for connections.
# 建议等待30秒后再访问install.php
```
**问题2hostname配置错误**
```php
// ❌ 错误配置
$hostname = 'localhost'; // 容器内localhost不是MySQL
$hostname = '127.0.0.1'; // 同上
$hostname = 'redcap-mysql'; // 容器名,但应使用服务名
// ✅ 正确配置
$hostname = 'redcap-db'; // Docker Compose服务名
```
**问题3认证插件**
```bash
# 确保docker-compose.yml中包含
command: --default-authentication-plugin=mysql_native_password
# 或在MySQL容器内手动修改用户
docker exec -it redcap-mysql mysql -uroot -p
ALTER USER 'redcap_user'@'%' IDENTIFIED WITH mysql_native_password BY 'redcap_pass_456';
FLUSH PRIVILEGES;
```
---
### 6.3 坑点3PHP扩展缺失 ⚠️
#### 症状
```bash
install.php检查页面提示
"The GD extension is not loaded"
"The ZIP extension is not loaded"
"The MySQLi extension is not loaded"
```
#### 原因
```
php:8.1-apache基础镜像只包含核心扩展
REDCap需要额外安装10+个扩展
```
#### 解决方案
**Dockerfile中预装推荐**
```dockerfile
FROM php:8.1-apache
# 安装系统依赖
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libzip-dev \
libldap2-dev \
&& rm -rf /var/lib/apt/lists/*
# 安装PHP扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg && \
docker-php-ext-install -j$(nproc) \
mysqli \
pdo_mysql \
gd \
zip \
mbstring \
curl \
soap \
ldap
# 启用Apache模块
RUN a2enmod rewrite ssl headers
```
**验证安装**
```bash
# 进入容器检查
docker exec -it redcap-web php -m | grep -E '(mysqli|gd|zip|mbstring)'
# 应该看到:
gd
mbstring
mysqli
zip
```
---
### 6.4 坑点4Windows路径映射 ⚠️
#### 症状
```bash
容器启动失败或无法访问文件
Error: "no such file or directory"
```
#### 原因
```
Windows路径格式与Linux不兼容
反斜杠(\)与正斜杠(/)冲突
绝对路径在Docker Desktop中可能有问题
```
#### 解决方案
**使用相对路径(推荐)**
```yaml
# ✅ 正确:相对路径
volumes:
- ../redcap15.8.0/redcap:/var/www/html/redcap
- ./config/apache/redcap.conf:/etc/apache2/sites-available/000-default.conf
# ❌ 错误Windows绝对路径
volumes:
- D:\MyCursor\AIclinicalresearch\redcap15.8.0\redcap:/var/www/html/redcap
# 🟡 可能可以WSL路径如果使用WSL2后端
volumes:
- /mnt/d/MyCursor/AIclinicalresearch/redcap15.8.0/redcap:/var/www/html/redcap
```
**PowerShell中转换路径**
```powershell
# 获取当前目录的相对路径
$currentDir = Get-Location
$redcapSource = Join-Path $currentDir.Parent.FullName "redcap15.8.0\redcap"
Write-Host "REDCap Source: $redcapSource"
```
---
### 6.5 坑点5端口冲突 ⚠️
#### 症状
```bash
docker-compose up -d 失败
Error: "Bind for 0.0.0.0:8080 failed: port is already allocated"
```
#### 原因
```
本机已有服务占用相同端口
- 8080: 可能有其他Web服务
- 3306: 可能已安装本地MySQL
- 8081: 可能有其他管理工具
```
#### 解决方案
**检查端口占用Windows**
```powershell
# 检查8080端口
netstat -ano | findstr :8080
# 输出示例:
# TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 1234
# 查看占用进程
tasklist | findstr 1234
# 结束进程(谨慎!)
taskkill /F /PID 1234
```
**修改端口映射**
```yaml
# 如果8080被占用改用8888
services:
redcap-web:
ports:
- "8888:80" # 主机8888 → 容器80
# 如果3306被占用改用3307
redcap-db:
ports:
- "3307:3306"
```
**最佳实践**
```bash
# 预先检查所有端口
netstat -ano | findstr :8080
netstat -ano | findstr :3306
netstat -ano | findstr :8081
# 如果都空闲,使用默认端口
# 如果有冲突提前修改docker-compose.yml
```
---
### 6.6 坑点6数据持久化误区 ⚠️
#### 症状
```bash
容器删除后,数据丢失
docker-compose down 后无法恢复项目
```
#### 原因
```
误用了--volumes参数删除了数据卷
没有理解Docker命名卷的概念
```
#### 正确理解
**Docker数据卷类型**
```yaml
# 类型1命名卷推荐开发环境
volumes:
- redcap-db-data:/var/lib/mysql
# 特点Docker管理跨容器持久化删除容器不影响
# 类型2绑定挂载不推荐Windows性能差
volumes:
- ./mysql-data:/var/lib/mysql
# 特点:主机目录,可见但性能差
# 类型3tmpfs临时不持久化
tmpfs:
- /var/lib/mysql
# 特点:内存存储,容器停止即丢失
```
**安全操作**
```bash
# ✅ 停止容器(保留数据)
docker-compose stop
# ✅ 停止并删除容器(保留数据)
docker-compose down
# ⚠️ 删除容器和网络,但保留卷(安全)
docker-compose down --volumes=false
# ❌ 删除所有(包括数据卷,危险!)
docker-compose down --volumes
docker-compose down -v # 同上
```
**数据备份**
```bash
# 备份MySQL数据卷
docker run --rm -v redcap-db-data:/data -v $(pwd):/backup \
ubuntu tar czf /backup/redcap-db-backup.tar.gz /data
# 恢复数据卷
docker run --rm -v redcap-db-data:/data -v $(pwd):/backup \
ubuntu tar xzf /backup/redcap-db-backup.tar.gz -C /
```
---
## 🚀 七、部署流程(详细步骤)
### 7.1 阶段1准备配置文件15分钟
#### 步骤1创建项目目录
```powershell
# 进入项目根目录
cd D:\MyCursor\AIclinicalresearch
# 创建Docker部署目录
New-Item -ItemType Directory -Path "redcap-docker-dev" -Force
cd redcap-docker-dev
# 创建子目录
New-Item -ItemType Directory -Path "config\apache" -Force
New-Item -ItemType Directory -Path "config\php" -Force
New-Item -ItemType Directory -Path "scripts" -Force
```
#### 步骤2生成配置文件
```powershell
# 此步骤将由自动化脚本完成,生成:
# - docker-compose.yml
# - Dockerfile.redcap
# - .env
# - config/apache/redcap.conf
# - config/php/php.ini
# - config/database.php
# - scripts/*.ps1
```
#### 步骤3验证REDCap源码
```powershell
# 确认源码存在
Test-Path ..\redcap15.8.0\redcap\install.php
# 输出True表示源码存在
```
---
### 7.2 阶段2启动容器10分钟
#### 步骤1构建镜像
```powershell
# 构建自定义REDCap镜像
docker-compose build
# 输出示例:
# Building redcap-web...
# Step 1/10 : FROM php:8.1-apache
# ...
# Successfully built abc123def456
# Successfully tagged redcap-docker-dev_redcap-web:latest
```
#### 步骤2启动所有容器
```powershell
# 后台启动
docker-compose up -d
# 输出示例:
# Creating network "redcap-docker-dev_redcap-network" ... done
# Creating volume "redcap-docker-dev_redcap-db-data" ... done
# Creating redcap-mysql ... done
# Creating redcap-web ... done
# Creating redcap-phpmyadmin ... done
```
#### 步骤3等待MySQL就绪
```powershell
# 查看MySQL日志
docker-compose logs redcap-db | Select-String "ready for connections"
# 等待看到:
# [Server] /usr/sbin/mysqld: ready for connections.
# 建议等待30秒
Start-Sleep -Seconds 30
```
#### 步骤4修复文件权限
```powershell
# 自动修复权限脚本已包含在setup-redcap.ps1中
docker exec -it redcap-web chown -R www-data:www-data /var/www/html/edocs
docker exec -it redcap-web chown -R www-data:www-data /var/www/html/temp
docker exec -it redcap-web chown -R www-data:www-data /var/www/html/modules
```
#### 步骤5验证容器状态
```powershell
# 检查所有容器运行状态
docker-compose ps
# 应该看到:
# Name State Ports
# redcap-mysql Up 0.0.0.0:3306->3306/tcp
# redcap-web Up 0.0.0.0:8080->80/tcp
# redcap-phpmyadmin Up 0.0.0.0:8081->80/tcp
```
---
### 7.3 阶段3REDCap安装30分钟
#### 步骤1访问安装向导
```
打开浏览器访问:
http://localhost:8080/install.php
```
#### 步骤2系统要求检查
```
REDCap会自动检查
✅ PHP版本 8.1.x
✅ MySQL连接
✅ PHP扩展mysqli, gd, zip, etc.
✅ 文件权限edocs, temp可写
如果有红叉❌,根据提示修复
```
#### 步骤3数据库配置
```
MySQL Hostname: redcap-db
MySQL Database: redcap
MySQL Username: redcap_user
MySQL Password: redcap_pass_456
Table Prefix: (留空,使用默认)
Salt: iit_dev_salt_2026_redcap_v15
```
#### 步骤4管理员账户
```
Username: admin
Password: Admin@123456 # 开发环境密码
Email: dev@example.com
First Name: Admin
Last Name: User
```
#### 步骤5SMTP配置
```
选择Skip SMTP Configuration跳过
原因Day 2-8不需要邮件功能
```
#### 步骤6完成安装
```
点击 "Complete Installation"
等待数据库表创建约2-3分钟
看到 "Installation Complete!" 消息
```
#### 步骤7首次登录
```
访问http://localhost:8080/
用户名admin
密码Admin@123456
✅ 登录成功看到REDCap主页
```
---
### 7.4 阶段4创建测试项目30分钟
#### 步骤1新建项目
```
1. 点击 "New Project"
2. 项目标题IIT Test Project
3. 项目目的Research
4. 模板Empty Project从头创建
5. 点击 "Create Project"
```
#### 步骤2设计数据字典
**创建表单1患者信息Demographics**
```
字段列表:
1. record_id (Record ID)
- 类型Text Box
- 验证Integer
- 标识符Yes
2. patient_name (患者姓名)
- 类型Text Box
- 标识符Yes
3. age (年龄)
- 类型Text Box
- 验证Integer
- 范围1-120
4. gender (性别)
- 类型Radio Buttons
- 选项1, 男 | 2, 女
5. enrollment_date (入组日期)
- 类型Text Box
- 验证Date (Y-M-D)
```
**创建表单2随访记录Follow-up**
```
字段列表:
1. followup_date (随访日期)
- 类型Text Box
- 验证Date (Y-M-D)
2. followup_type (随访类型)
- 类型Dropdown
- 选项1, 门诊 | 2, 电话 | 3, 线上
3. adverse_event (不良事件)
- 类型Yes-No
- 默认No
4. notes (备注)
- 类型Notes Box (Paragraph Text)
```
#### 步骤3创建测试数据
```
添加5条测试受试者记录
Record 1:
- patient_name: 张三
- age: 45
- gender: 男
- enrollment_date: 2025-12-01
Record 2:
- patient_name: 李四
- age: 52
- gender: 女
- enrollment_date: 2025-12-05
... (省略3条)
```
#### 步骤4启用API访问
```
1. 进入项目
2. 左侧菜单 → Applications → API
3. 点击 "Enable API Access"
4. 勾选 "Export"、"Import" 权限
5. 点击 "Request API Token"
6. 系统生成Token自动批准因为是管理员
7. 复制Token保存
示例A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6
```
#### 步骤5测试API调用
```bash
# PowerShell测试导出数据
$apiUrl = "http://localhost:8080/api/"
$token = "YOUR_API_TOKEN_HERE"
$body = @{
token = $token
content = 'record'
format = 'json'
type = 'flat'
}
Invoke-RestMethod -Uri $apiUrl -Method Post -Body $body
# 应该返回JSON数组包含5条测试数据
```
---
### 7.5 阶段5配置后端环境变量15分钟
#### 步骤1更新后端.env
```bash
# AIclinicalresearch/backend/.env
# ========== REDCap配置新增==========
REDCAP_API_URL=http://localhost:8080/api/
REDCAP_API_TOKEN=A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6
REDCAP_PROJECT_ID=1
# 注意localhost在Docker容器内需要改为host.docker.internal
# 如果后端也在Docker内应使用容器IP或服务名
```
#### 步骤2创建API测试脚本
```typescript
// backend/src/modules/iit-manager/test-redcap-api.ts
import axios from 'axios';
const REDCAP_API_URL = process.env.REDCAP_API_URL || 'http://localhost:8080/api/';
const REDCAP_API_TOKEN = process.env.REDCAP_API_TOKEN || '';
async function testREDCapAPI() {
console.log('🔍 Testing REDCap API Connection...');
try {
const response = await axios.post(REDCAP_API_URL, new URLSearchParams({
token: REDCAP_API_TOKEN,
content: 'record',
format: 'json',
type: 'flat'
}));
console.log('✅ API Connection Successful!');
console.log(`📊 Retrieved ${response.data.length} records`);
console.log('Sample Record:', response.data[0]);
} catch (error: any) {
console.error('❌ API Connection Failed:', error.message);
}
}
testREDCapAPI();
```
#### 步骤3运行测试
```powershell
cd D:\MyCursor\AIclinicalresearch\backend
npx ts-node src/modules/iit-manager/test-redcap-api.ts
# 预期输出:
# 🔍 Testing REDCap API Connection...
# ✅ API Connection Successful!
# 📊 Retrieved 5 records
# Sample Record: { record_id: '1', patient_name: '张三', ... }
```
---
### 7.6 部署完成验证清单
```
验证项 状态
─────────────────────────────────────────────────
✅ Docker容器全部运行 [ ]
✅ MySQL数据库可连接 [ ]
✅ REDCap安装成功 [ ]
✅ 管理员账户可登录 [ ]
✅ 测试项目已创建 [ ]
✅ API Token已生成 [ ]
✅ API调用测试通过 [ ]
✅ 后端环境变量已配置 [ ]
✅ phpMyAdmin可访问可选 [ ]
全部勾选✅,表示部署成功!
```
---
## 💡 八、运维管理脚本
### 8.1 启动脚本start-redcap.ps1
```powershell
#!/usr/bin/env pwsh
# start-redcap.ps1 - 启动REDCap开发环境
Write-Host "🚀 Starting REDCap Development Environment..." -ForegroundColor Cyan
# 检查Docker是否运行
$dockerRunning = docker info 2>&1 | Select-String "Server Version"
if (-not $dockerRunning) {
Write-Host "❌ Docker is not running. Please start Docker Desktop." -ForegroundColor Red
exit 1
}
# 启动容器
docker-compose up -d
# 等待MySQL就绪
Write-Host "⏳ Waiting for MySQL to be ready..." -ForegroundColor Yellow
Start-Sleep -Seconds 10
docker-compose logs redcap-db | Select-String "ready for connections"
# 显示服务状态
Write-Host ""
Write-Host "✅ REDCap Environment Started!" -ForegroundColor Green
Write-Host ""
Write-Host "📋 Service URLs:" -ForegroundColor Cyan
Write-Host " REDCap: http://localhost:8080" -ForegroundColor White
Write-Host " phpMyAdmin: http://localhost:8081" -ForegroundColor White
Write-Host ""
Write-Host "📊 Container Status:" -ForegroundColor Cyan
docker-compose ps
```
### 8.2 停止脚本stop-redcap.ps1
```powershell
#!/usr/bin/env pwsh
# stop-redcap.ps1 - 停止REDCap开发环境
Write-Host "⏹️ Stopping REDCap Development Environment..." -ForegroundColor Yellow
# 停止容器(保留数据)
docker-compose stop
Write-Host "✅ REDCap Environment Stopped!" -ForegroundColor Green
Write-Host ""
Write-Host "💡 Data volumes are preserved." -ForegroundColor Cyan
Write-Host " Run 'start-redcap.ps1' to restart." -ForegroundColor Cyan
```
### 8.3 查看日志脚本logs-redcap.ps1
```powershell
#!/usr/bin/env pwsh
# logs-redcap.ps1 - 查看REDCap日志
param(
[string]$Service = "",
[switch]$Follow
)
Write-Host "📝 REDCap Container Logs" -ForegroundColor Cyan
Write-Host ""
if ($Follow) {
# 实时跟踪日志
if ($Service) {
docker-compose logs -f $Service
} else {
docker-compose logs -f
}
} else {
# 显示最近日志
if ($Service) {
docker-compose logs --tail=50 $Service
} else {
docker-compose logs --tail=50
}
}
```
### 8.4 清理脚本clean-redcap.ps1
```powershell
#!/usr/bin/env pwsh
# clean-redcap.ps1 - 清理REDCap环境危险操作
Write-Host "🗑️ REDCap Environment Cleanup" -ForegroundColor Red
Write-Host ""
Write-Host "⚠️ WARNING: This will DELETE ALL DATA!" -ForegroundColor Red
Write-Host ""
$confirm = Read-Host "Type 'YES' to confirm deletion"
if ($confirm -ne "YES") {
Write-Host "❌ Cleanup cancelled." -ForegroundColor Yellow
exit 0
}
Write-Host ""
Write-Host "🗑️ Removing containers..." -ForegroundColor Yellow
docker-compose down
Write-Host "🗑️ Removing volumes (DATA LOSS!)..." -ForegroundColor Red
docker-compose down --volumes
Write-Host "🗑️ Removing images..." -ForegroundColor Yellow
docker rmi redcap-docker-dev_redcap-web
Write-Host ""
Write-Host "✅ Cleanup Complete!" -ForegroundColor Green
Write-Host " Run 'setup-redcap.ps1' to redeploy." -ForegroundColor Cyan
```
---
## 🎯 九、决策清单
在实施部署前,请确认以下决策:
### 9.1 必需决策
| 决策项 | 选项 | 推荐 | 您的选择 |
|--------|------|------|---------|
| **部署位置** | `redcap-docker-dev/` | ✅ 推荐 | [ ] |
| **REDCap端口** | 8080 / 其他 | 8080 | [ ] |
| **MySQL端口** | 3306 / 其他 | 3306 | [ ] |
| **phpMyAdmin** | 需要 / 不需要 | 需要 | [ ] |
| **SMTP配置** | 跳过 / 配置 | 跳过 | [ ] |
| **数据持久化** | 命名卷 / 绑定挂载 | 命名卷 | [ ] |
### 9.2 环境变量
```bash
# 确认以下密码(开发环境)
MYSQL_ROOT_PASSWORD=redcap_root_123 # 同意 [ ]
MYSQL_DATABASE=redcap # 同意 [ ]
MYSQL_USER=redcap_user # 同意 [ ]
MYSQL_PASSWORD=redcap_pass_456 # 同意 [ ]
# Salt值重要一旦设置不可更改
REDCAP_SALT=iit_dev_salt_2026_redcap_v15 # 同意 [ ]
```
### 9.3 端口冲突检查
```powershell
# 请先运行以下命令检查端口
netstat -ano | findstr :8080 # REDCap
netstat -ano | findstr :3306 # MySQL
netstat -ano | findstr :8081 # phpMyAdmin
# 如果有冲突,记录需要修改的端口:
# REDCap端口改为_______
# MySQL端口改为_______
# phpMyAdmin端口改为_______
```
---
## 📝 十、后续步骤
### 10.1 Day 2开发准备
部署完成后,立即可以开始:
```
✅ REDCap API Adapter开发
- exportRecords() 实现
- importRecords() 实现
- exportMetadata() 实现
✅ 真实API测试
- 使用实际API Token
- 验证JSON响应格式
- 测试错误处理
✅ SyncManager开发
- 混合同步模式Webhook + Polling
- 数据增量拉取
- pg-boss任务调度
```
### 10.2 External Module开发Day 8
```
当需要开发External Module时
1. 在 redcap15.8.0/redcap/modules/ 创建模块目录
2. 编写 config.json 和 Module.php
3. 容器会自动挂载(因为使用卷映射)
4. REDCap控制中心启用模块
```
### 10.3 迁移到生产环境(未来)
```
本地开发验证通过后:
1. 在阿里云ECS标准安装REDCapLAMP
2. 配置RDS MySQL高可用
3. 配置OSS存储edocs目录
4. 配置SSL证书Let's Encrypt
5. 配置SMTP阿里云DirectMail
6. 复制External Module到生产环境
7. 导入测试项目(或从头创建)
```
---
## 🔗 十一、相关文档
### 11.1 项目文档
- [REDCap二次开发深度指南](./REDCap%20二次开发深度指南.md) - REDCap架构和EM开发
- [REDCap部署指南与环境要求](./02-REDCap部署指南与环境要求.md) - 生产环境部署
- [IIT Manager Agent技术方案 V1.1](../IIT%20Manager%20Agent/02-技术设计/IIT%20Manager%20Agent%20完整技术开发方案%20(V1.1).md) - REDCap集成方案
- [MVP开发任务清单](../IIT%20Manager%20Agent/04-开发计划/MVP开发任务清单.md) - Day 2任务
### 11.2 官方文档
- REDCap官网https://projectredcap.org/
- REDCap API文档https://redcap.vanderbilt.edu/api/help/
- External Module文档https://github.com/vanderbilt-redcap/external-module-framework-docs
### 11.3 Docker文档
- Docker Composehttps://docs.docker.com/compose/
- Docker PHP镜像https://hub.docker.com/_/php
- Docker MySQL镜像https://hub.docker.com/_/mysql
---
## 📞 十二、故障排查
### 12.1 容器无法启动
```powershell
# 检查Docker状态
docker info
# 查看容器日志
docker-compose logs
# 检查端口占用
netstat -ano | findstr :8080
netstat -ano | findstr :3306
# 重建容器
docker-compose down
docker-compose up -d --force-recreate
```
### 12.2 无法访问REDCap
```powershell
# 检查容器运行状态
docker-compose ps
# 检查Apache日志
docker-compose logs redcap-web
# 进入容器诊断
docker exec -it redcap-web bash
curl localhost
```
### 12.3 数据库连接失败
```powershell
# 检查MySQL日志
docker-compose logs redcap-db
# 测试MySQL连接
docker exec -it redcap-mysql mysql -uredcap_user -predcap_pass_456 -e "SHOW DATABASES;"
# 检查database.php配置
docker exec -it redcap-web cat /var/www/html/redcap/database.php
```
### 12.4 API调用失败
```powershell
# 验证API Token
# REDCap → Applications → API → 查看Token
# 测试API连接
curl -X POST http://localhost:8080/api/ `
-d "token=YOUR_TOKEN" `
-d "content=version"
# 应该返回REDCap版本号
```
---
## ✅ 十三、部署成功标志
当您看到以下所有指标时,表示部署成功:
```
✅ 核心容器状态(必需)
- redcap-mysql: Up
- redcap-web: Up
⭐ 辅助容器状态(可选,仅开发环境)
- redcap-phpmyadmin: Up可选生产环境禁用
✅ 服务可访问
- http://localhost:8080 → REDCap登录页核心
- http://localhost:8081 → phpMyAdmin界面可选调试用
✅ 功能验证
- 管理员登录成功
- 测试项目已创建
- API Token已生成
- API调用返回数据
✅ 后端集成
- .env配置完成
- API测试脚本通过
- Node.js可访问REDCap
说明:
- phpMyAdmin是可选的开发调试工具
- 生产环境出于安全考虑应禁用
- 不影响REDCap核心功能
```
---
## 🏗️ 十四、生产环境部署指南
### 14.1 本地开发 → 生产环境迁移路径
```yaml
阶段1: 本地开发环境(当前)
├─ 目的API开发、EM调试
├─ 环境Windows/Mac + Docker Desktop
├─ 数据库Docker MySQL容器
├─ 辅助工具phpMyAdmin调试
└─ 成本:$0
阶段2: 阿里云测试环境
├─ 目的:集成测试、性能测试
├─ 服务器阿里云ECS2核4GB
├─ 数据库阿里云RDS MySQL基础版
├─ 存储云盘40GB ESSD
├─ 域名test-redcap.yourdomain.com
└─ 成本¥500-700/月
阶段3: 阿里云生产环境
├─ 目的:正式生产运行
├─ 服务器阿里云ECS4核8GB
├─ 数据库阿里云RDS MySQL高可用版
├─ 存储云盘100GB ESSD + OSS备份
├─ 负载均衡阿里云SLB + SSL证书
├─ 监控CloudMonitor + 日志服务
├─ 域名redcap.yourdomain.com
└─ 成本¥1500-2000/月
阶段4: 医院私有化部署
├─ 目的:医院内网运行
├─ 服务器:医院提供服务器
├─ 数据库Docker MySQL 或 医院MySQL服务器
├─ 部署方式Docker离线镜像包
├─ 交付物:一键部署脚本 + 培训手册
└─ 成本:一次性部署费用
```
### 14.2 生产环境Docker配置调整
#### 调整1移除phpMyAdmin
```yaml
# docker-compose.yml 生产环境版本
services:
redcap-db:
# ... MySQL配置保持不变
redcap-web:
# ... REDCap配置保持不变
# ❌ 移除phpMyAdmin安全考虑
# phpmyadmin:
# ...
# 生产环境数据库管理方式:
# 1. 使用阿里云RDS控制台
# 2. SSH连接ECS后使用mysql命令行
# 3. 受限的DMS数据管理服务
```
#### 调整2使用RDS MySQL
```yaml
# docker-compose.yml 生产环境版本
services:
# ❌ 移除redcap-db容器使用RDS
# redcap-db:
# ...
redcap-web:
image: redcap-web:v1.0
environment:
# 连接阿里云RDS
REDCAP_DB_HOST: rm-xxxxxx.mysql.rds.aliyuncs.com
REDCAP_DB_PORT: 3306
REDCAP_DB_NAME: redcap_prod
REDCAP_DB_USER: redcap_user
REDCAP_DB_PASS: ${MYSQL_PASSWORD} # 从环境变量读取
# ... 其他配置
```
#### 调整3配置SSL证书
```yaml
# docker-compose.yml 生产环境版本
services:
redcap-web:
volumes:
# 挂载SSL证书
- ./ssl/cert.pem:/etc/ssl/certs/redcap.crt:ro
- ./ssl/key.pem:/etc/ssl/private/redcap.key:ro
ports:
- "80:80"
- "443:443" # HTTPS端口
```
#### 调整4资源限制
```yaml
# docker-compose.yml 生产环境版本
services:
redcap-web:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
restart: always # 自动重启
```
#### 调整5日志管理
```yaml
# docker-compose.yml 生产环境版本
services:
redcap-web:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
```
### 14.3 生产环境安全加固
```yaml
必做项:
├─ 修改所有默认密码MySQL、REDCap admin
├─ 启用HTTPS强制
├─ 配置防火墙规则仅开放80/443端口
├─ 禁用phpMyAdmin移除容器
├─ 配置定期自动备份(数据库 + 文件)
├─ 配置监控告警CPU、内存、磁盘、服务状态
├─ 限制SSH访问密钥认证 + IP白名单
└─ 定期更新安全补丁
推荐项:
├─ 使用阿里云SLB做负载均衡和SSL卸载
├─ 配置WAFWeb应用防火墙
├─ 启用RDS自动备份每日备份保留7天
├─ 配置OSS存储备份异地容灾
└─ 使用CloudMonitor实时监控
```
### 14.4 生产环境成本估算
```yaml
阿里云生产环境配置:
计算资源:
├─ ECS 4核8GB¥400/月
├─ 云盘 100GB ESSD¥50/月
└─ 小计¥450/月
数据库:
├─ RDS MySQL高可用版 2核4GB¥600/月
├─ 存储 100GB包含
└─ 小计¥600/月
网络与安全:
├─ SLB负载均衡¥60/月
├─ SSL证书¥100/年Let's Encrypt免费
├─ 公网流量¥0.8/GB估算¥50/月)
└─ 小计¥110/月
存储与备份:
├─ OSS存储 100GB¥10/月
├─ OSS流量¥10/月
└─ 小计¥20/月
监控与日志:
├─ CloudMonitor免费
├─ 日志服务 10GB¥5/月
└─ 小计¥5/月
总计¥1185/月约¥14,220/年)
优化方案(包年):
├─ ECS 4核8GB3年¥3600/年¥300/月)
├─ RDS MySQL高可用版¥600/月
├─ 其他¥135/月
└─ 总计¥1035/月约¥12,420/年)
```
### 14.5 医院私有化部署交付清单
```yaml
交付物清单:
1. Docker镜像包
├─ redcap-web:v1.0.tar导出的镜像文件
├─ mysql:8.0.tar如医院无数据库
└─ docker-compose.yml配置文件
2. 部署脚本:
├─ install-docker.shDocker安装脚本
├─ setup-redcap.sh一键部署脚本
├─ start-redcap.sh启动脚本
├─ stop-redcap.sh停止脚本
└─ backup-redcap.sh备份脚本
3. 文档:
├─ 部署指南.pdf医院IT版
├─ 运维手册.pdf日常操作
├─ 故障排查手册.pdf问题诊断
└─ 安全加固指南.pdf合规要求
4. 配置模板:
├─ database.php.template数据库配置
├─ php.ini.templatePHP配置
├─ apache.conf.templateApache配置
└─ .env.template环境变量
5. 培训材料:
├─ 系统架构说明.pptx
├─ 日常运维培训.pptx
└─ 操作演示视频.mp4
部署流程:
Step 1: 医院IT安装Docker30分钟
Step 2: 导入Docker镜像10分钟
Step 3: 配置环境变量10分钟
Step 4: 启动容器5分钟
Step 5: 初始化REDCap30分钟
Step 6: 验证功能30分钟
总计约2小时
```
### 14.6 生产环境监控方案
```yaml
监控指标:
系统层:
├─ CPU使用率告警阈值>80% 持续5分钟
├─ 内存使用率(告警阈值:>85%
├─ 磁盘使用率(告警阈值:>80%
└─ 网络流量(异常流量告警)
应用层:
├─ REDCap可用性HTTP健康检查5分钟间隔
├─ 响应时间(告警阈值:>3秒
├─ 错误率(告警阈值:>1%
└─ 并发用户数
数据库层:
├─ RDS连接数告警阈值>80%
├─ 慢查询数(>1秒的查询
├─ 磁盘IOPS使用率
└─ CPU使用率
容器层:
├─ 容器运行状态(自动重启监控)
├─ 容器资源使用(内存泄漏检测)
└─ 容器日志错误率
告警方式:
├─ 短信(紧急告警)
├─ 邮件(一般告警)
├─ 钉钉/企业微信(团队通知)
└─ CloudMonitor控制台
```
---
## 🎉 结语
### 本地开发环境部署完成 ✅
**恭喜您已掌握REDCap Docker部署方案。**
这套Docker配置具有以下特点
-**开发/生产架构一致**:消除环境漂移
-**可直接用于生产**:经过少量调整即可
-**支持离线交付**:医院私有化部署
-**2人团队可维护**:简单、透明、可控
### 下一步行动
**立即开始**
- Day 2开始REDCap API Adapter开发
- 参考:[MVP开发任务清单](../IIT%20Manager%20Agent/04-开发计划/MVP开发任务清单.md)
**未来规划**
- Week 2-3阿里云ECS测试环境部署
- Month 1-2医院试点部署
- Month 3+:标准化交付流程
### 需要帮助?
- 查看本文档的"故障排查"章节
- 查看Docker容器日志`docker-compose logs`
- 参考REDCap官方文档https://projectredcap.org/
- 参考ECS决议报告[REDCap生产环境部署ECS vs SAE深度决议报告](./REDCap%20生产环境部署ECS%20vs%20SAE%20深度决议报告.md)
---
> **文档维护**本文档随IIT Manager Agent项目持续更新
> **版本历史**
> - v1.0 (2026-01-01): 初始版本
> - v2.0 (2026-01-01): 根据ECS决议报告修订强调开发/生产一致性
> **最后更新**2026-01-01
> **下次审查**:生产环境首次部署后