# 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-network(bridge模式?存储:Docker命名卷(持久化数据) ``` #### 开发辅助容器(仅开发环境,生产禁用? ``` ⚠️ 以下容器仅用于本地开发调试,生产环境出于安全考虑应禁用: 容器3: phpMyAdmin(可选) 【phpmyadmin?├─ 用途:数据库可视化管理、调?├─ 端口?081 └─ 生产环境:❌ 不部署(安全风险? 说明?生产环境数据库管理应通过??阿里云RDS控制??MySQL命令行(SSH连接??受限的DMS数据管理服务 ``` ### 1.2 架构优势 ``` ?开?生产环境一致(消除"在我机器上能?问题??MySQL在Docker内,无需本机安装(开发环境) ?可无缝切换到RDS MySQL(生产环境) ?所有依赖隔离,不污染主机环??一键启?停止?人团队可维护 ?环境可重复构建(容器化标准交付) ?易于销毁重建(测试友好??数据持久化(Docker??RDS??支持多版本并存(不同端口??直接可用于医院内网部署(离线交付?``` ### 1.3 端口分配 | 服务 | 容器端口 | 主机端口 | 访问地址 | 生产环境 | |------|---------|---------|---------|---------| | REDCap Web | 80 | 8080 | http://localhost:8080 | ?部署(端?0?| | MySQL | 3306 | 3306 | localhost:3306 | ⚠️ 或使用RDS | | phpMyAdmin | 80 | 8081 | http://localhost:8081 | ?禁用 | **生产环境端口调整**?- REDCap Web:使用标?0/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过期时间?小时?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 ServerName localhost DocumentRoot /var/www/html/redcap Options -Indexes +FollowSymLinks AllowOverride All Require all granted # 防止目录遍历 Options -Indexes # 允许.htaccess AllowOverride All # 日志配置 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" ``` --- ### 3.3 REDCap database.php配置 #### 3.3.1 数据库连接配? ```php ``` #### 3.3.2 Salt值说? ``` 什么是Salt?- 用于REDCap数据导出时的去标识化 - 影响哈希数据的生?- 一旦设置后不可更改(会导致历史数据无法解密? 开发环境建议: - 使用固定的Salt值(便于多次重建环境?- 包含项目标识(如'iit_dev_salt_2026'?- 至少8个字符,建议20+字符 生产环境要求?- 使用强随机Salt?2+字符?- 包含大小写字母、数字、特殊字?- 妥善备份(丢失会导致数据无法解密?``` --- ## 📧 四、邮件服务配置策? ### 4.1 三种配置方案对比 | 方案 | 复杂?| 功能 | 推荐场景 | |------|--------|------|---------| | **方案A:跳过配?* | ?最简?| 无邮件功?| ?Day 2-8 API开?| | **方案B:MailHog** | ⭐⭐ 简?| 本地邮件拦截 | 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 方案B:MailHog(本地邮件测试) ```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:真实SMTP(Gmail/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:每?00封(免费账户?- Outlook:每?00?- 需要开?不够安全的应用访?或使用应用专用密?``` **推荐策略**?- **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多一层虚拟化,损?0-20%性能 ?稳定性:容器层增加复杂度和故障点 ?运维:医疗系统需要最大可控??备份:容器数据备份更复杂 ?监控:直接部署更易于监控和调?``` ### 5.2 推荐的云端部署策? ``` 本地开发(Docker)→ 云端生产(标准部署) 阶段1:本地Docker开发(当前?- 目的:API Adapter开发、External Module开?- 环境:Windows + Docker Desktop - 数据:测试数据(可随时销毁) 阶段2:ECS标准部署(未来) - 目的:生产环境、真实医疗数?- 环境:Ubuntu 22.04 + LAMP - 数据:RDS MySQL(高可用? OSS存储 迁移路径?1. 在本地Docker完成External Module开?2. 验证API Adapter功能 3. 在ECS上标准安装REDCap(LAMP?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?``` #### 解决方案 **问题1:MySQL未就?* ```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 ``` **问题2:hostname配置错误** ```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 坑点3:PHP扩展缺失 ⚠️ #### 症状 ```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需要额外安?0+个扩?``` #### 解决方案 **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 坑点4:Windows路径映射 ⚠️ #### 症状 ```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 # 检?080端口 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 # 特点:主机目录,可见但性能? # 类型3:tmpfs(临时,不持久化?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 阶段3:REDCap安装?0分钟? #### 步骤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 ``` #### 步骤5:SMTP配置 ``` 选择: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 - 范围?-120 4. gender (性别) - 类型:Radio Buttons - 选项?, ?| 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 - 选项?, 门诊 | 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数组,包?条测试数?``` --- ### 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标准安装REDCap(LAMP?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 Compose:https://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: 阿里云测试环?├─ 目的:集成测试、性能测试 ├─ 服务器:阿里云ECS??GB?├─ 数据库:阿里云RDS MySQL基础?├─ 存储:云盘(40GB ESSD?├─ 域名:test-redcap.yourdomain.com └─ 成本:?00-700/? 阶段3: 阿里云生产环?├─ 目的:正式生产运?├─ 服务器:阿里云ECS??GB?├─ 数据库:阿里云RDS MySQL高可用版 ├─ 存储:云盘(100GB ESSD?+ OSS备份 ├─ 负载均衡:阿里云SLB + SSL证书 ├─ 监控:CloudMonitor + 日志服务 ├─ 域名:redcap.yourdomain.com └─ 成本:?500-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(强制) ├─ 配置防火墙规则(仅开?0/443端口?├─ 禁用phpMyAdmin(移除容器) ├─ 配置定期自动备份(数据库 + 文件?├─ 配置监控告警(CPU、内存、磁盘、服务状态) ├─ 限制SSH访问(密钥认?+ IP白名单) └─ 定期更新安全补丁 推荐项: ├─ 使用阿里云SLB做负载均衡和SSL卸载 ├─ 配置WAF(Web应用防火墙) ├─ 启用RDS自动备份(每日备份,保留7天) ├─ 配置OSS存储备份(异地容灾) └─ 使用CloudMonitor实时监控 ``` ### 14.4 生产环境成本估算 ```yaml 阿里云生产环境配置: 计算资源?├─ ECS 4?GB:?00/?├─ 云盘 100GB ESSD:?0/?└─ 小计:?50/? 数据库: ├─ RDS MySQL高可用版 2?GB:?00/?├─ 存储 100GB:包?└─ 小计:?00/? 网络与安全: ├─ SLB负载均衡:?0/?├─ SSL证书:?00/年(Let's Encrypt免费?├─ 公网流量:?.8/GB(估算?0/月) └─ 小计:?10/? 存储与备份: ├─ OSS存储 100GB:?0/?├─ OSS流量:?0/?└─ 小计:?0/? 监控与日志: ├─ CloudMonitor:免?├─ 日志服务 10GB:?/?└─ 小计:?/? 总计:?185/月(约?4,220/年) 优化方案(包年)?├─ ECS 4?GB?年):?600/年(¥300/月) ├─ RDS MySQL高可用版:?00/?├─ 其他:?35/?└─ 总计:?035/月(约?2,420/年) ``` ### 14.5 医院私有化部署交付清? ```yaml 交付物清单: 1. Docker镜像包: ├─ redcap-web:v1.0.tar(导出的镜像文件? ├─ mysql:8.0.tar(如医院无数据库? └─ docker-compose.yml(配置文件) 2. 部署脚本? ├─ install-docker.sh(Docker安装脚本? ├─ setup-redcap.sh(一键部署脚本) ├─ start-redcap.sh(启动脚本) ├─ stop-redcap.sh(停止脚本) └─ backup-redcap.sh(备份脚本) 3. 文档? ├─ 部署指南.pdf(医院IT版) ├─ 运维手册.pdf(日常操作) ├─ 故障排查手册.pdf(问题诊断) └─ 安全加固指南.pdf(合规要求) 4. 配置模板? ├─ database.php.template(数据库配置? ├─ php.ini.template(PHP配置? ├─ apache.conf.template(Apache配置? └─ .env.template(环境变量) 5. 培训材料? ├─ 系统架构说明.pptx ├─ 日常运维培训.pptx └─ 操作演示视频.mp4 部署流程?Step 1: 医院IT安装Docker?0分钟?Step 2: 导入Docker镜像?0分钟?Step 3: 配置环境变量?0分钟?Step 4: 启动容器?分钟?Step 5: 初始化REDCap?0分钟?Step 6: 验证功能?0分钟?总计:约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决议报告修订,强调开?生产一致? > **最后更?*?026-01-01 > **下次审查**:生产环境首次部署后