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的数据对接
This commit is contained in:
126
redcap-docker-dev/config/apache/redcap.conf
Normal file
126
redcap-docker-dev/config/apache/redcap.conf
Normal file
@@ -0,0 +1,126 @@
|
||||
# REDCap Apache虚拟主机配置
|
||||
# 版本:v1.0
|
||||
# 日期:2026-01-01
|
||||
# 适用:开发/测试/生产环境
|
||||
|
||||
<VirtualHost *:80>
|
||||
ServerName localhost
|
||||
ServerAdmin admin@localhost
|
||||
DocumentRoot /var/www/html/redcap
|
||||
|
||||
# ========== 目录配置 ==========
|
||||
<Directory /var/www/html/redcap>
|
||||
# 禁止目录浏览(安全)
|
||||
Options -Indexes +FollowSymLinks
|
||||
|
||||
# 允许.htaccess覆盖
|
||||
AllowOverride All
|
||||
|
||||
# 访问权限
|
||||
Require all granted
|
||||
|
||||
# 默认首页
|
||||
DirectoryIndex index.php index.html
|
||||
</Directory>
|
||||
|
||||
# ========== 限制特定目录访问(安全) ==========
|
||||
# 禁止直接访问temp目录
|
||||
<Directory /var/www/html/redcap/temp>
|
||||
Require all denied
|
||||
</Directory>
|
||||
|
||||
# 禁止直接访问modules源码(仅允许通过REDCap访问)
|
||||
<DirectoryMatch "^/var/www/html/redcap/modules/.*/.*\.php$">
|
||||
Require all denied
|
||||
</DirectoryMatch>
|
||||
|
||||
# ========== 日志配置 ==========
|
||||
ErrorLog ${APACHE_LOG_DIR}/redcap-error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/redcap-access.log combined
|
||||
|
||||
# 日志级别(开发环境:info,生产环境:warn)
|
||||
LogLevel warn
|
||||
|
||||
# ========== 安全头(推荐) ==========
|
||||
# 防止点击劫持
|
||||
Header always set X-Frame-Options "SAMEORIGIN"
|
||||
|
||||
# 防止MIME类型嗅探
|
||||
Header always set X-Content-Type-Options "nosniff"
|
||||
|
||||
# XSS保护
|
||||
Header always set X-XSS-Protection "1; mode=block"
|
||||
|
||||
# Referrer策略
|
||||
Header always set Referrer-Policy "strict-origin-when-cross-origin"
|
||||
|
||||
# ========== PHP配置覆盖 ==========
|
||||
# 文件上传限制
|
||||
php_value upload_max_filesize 32M
|
||||
php_value post_max_size 32M
|
||||
|
||||
# 执行时间限制(数据导出需要)
|
||||
php_value max_execution_time 300
|
||||
php_value max_input_time 300
|
||||
|
||||
# 内存限制
|
||||
php_value memory_limit 256M
|
||||
|
||||
# ========== 性能优化 ==========
|
||||
# 启用gzip压缩(暂时禁用,解决浏览器解码问题)
|
||||
# <IfModule mod_deflate.c>
|
||||
# AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
|
||||
# </IfModule>
|
||||
|
||||
# 浏览器缓存(静态资源)
|
||||
<IfModule mod_expires.c>
|
||||
ExpiresActive On
|
||||
ExpiresByType image/jpg "access plus 1 month"
|
||||
ExpiresByType image/jpeg "access plus 1 month"
|
||||
ExpiresByType image/png "access plus 1 month"
|
||||
ExpiresByType image/gif "access plus 1 month"
|
||||
ExpiresByType text/css "access plus 1 week"
|
||||
ExpiresByType application/javascript "access plus 1 week"
|
||||
</IfModule>
|
||||
</VirtualHost>
|
||||
|
||||
# ========== HTTPS配置(生产环境) ==========
|
||||
# 生产环境应启用HTTPS,取消下方注释并配置SSL证书:
|
||||
|
||||
# <VirtualHost *:443>
|
||||
# ServerName redcap.yourdomain.com
|
||||
# ServerAdmin admin@yourdomain.com
|
||||
# DocumentRoot /var/www/html/redcap
|
||||
#
|
||||
# # SSL证书配置
|
||||
# SSLEngine on
|
||||
# SSLCertificateFile /etc/ssl/certs/redcap.crt
|
||||
# SSLCertificateKeyFile /etc/ssl/private/redcap.key
|
||||
# # 如有中间证书:
|
||||
# # SSLCertificateChainFile /etc/ssl/certs/intermediate.crt
|
||||
#
|
||||
# # SSL安全配置
|
||||
# SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
|
||||
# SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
|
||||
# SSLHonorCipherOrder on
|
||||
#
|
||||
# # HSTS(强制HTTPS)
|
||||
# Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||||
#
|
||||
# # 其他配置同上(Directory、Log等)
|
||||
# <Directory /var/www/html/redcap>
|
||||
# Options -Indexes +FollowSymLinks
|
||||
# AllowOverride All
|
||||
# Require all granted
|
||||
# </Directory>
|
||||
#
|
||||
# ErrorLog ${APACHE_LOG_DIR}/redcap-ssl-error.log
|
||||
# CustomLog ${APACHE_LOG_DIR}/redcap-ssl-access.log combined
|
||||
# </VirtualHost>
|
||||
|
||||
# ========== HTTP强制跳转HTTPS(生产环境启用) ==========
|
||||
# <VirtualHost *:80>
|
||||
# ServerName redcap.yourdomain.com
|
||||
# Redirect permanent / https://redcap.yourdomain.com/
|
||||
# </VirtualHost>
|
||||
|
||||
137
redcap-docker-dev/config/database.php
Normal file
137
redcap-docker-dev/config/database.php
Normal file
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
/**
|
||||
* REDCap数据库连接配置
|
||||
* 版本:v1.0
|
||||
* 日期:2026-01-01
|
||||
* 适用:Docker开发/测试/生产环境
|
||||
*
|
||||
* 重要说明:
|
||||
* 1. 此文件需要复制到REDCap源码的redcap/目录下
|
||||
* 2. 开发环境使用Docker MySQL容器
|
||||
* 3. 生产环境应使用阿里云RDS MySQL
|
||||
* 4. Salt值一旦设置永远不可更改!
|
||||
*/
|
||||
|
||||
// ========== 错误日志配置 ==========
|
||||
global $log_all_errors;
|
||||
$log_all_errors = TRUE; // 开发环境开启详细日志,生产环境改为FALSE
|
||||
|
||||
// ========== MYSQL DATABASE CONNECTION ==========
|
||||
// Docker容器内连接配置
|
||||
// 注意:容器服务名不是localhost!
|
||||
|
||||
$hostname = 'redcap-db'; // Docker Compose服务名(开发环境)
|
||||
// 生产环境改为:rm-xxx.mysql.rds.aliyuncs.com
|
||||
|
||||
$db = 'redcap'; // 数据库名
|
||||
// 生产环境可能是:redcap_prod
|
||||
|
||||
$username = 'redcap_user'; // 数据库用户名
|
||||
// 生产环境使用RDS创建的用户
|
||||
|
||||
$password = 'redcap_pass_dev_456'; // 数据库密码
|
||||
// ⚠️ 生产环境必须修改为强密码!
|
||||
|
||||
// ========== SSL/TLS连接(可选,生产环境推荐) ==========
|
||||
// 阿里云RDS支持SSL连接,增强安全性
|
||||
$db_ssl_key = ''; // e.g., '/etc/mysql/ssl/client-key.pem'
|
||||
$db_ssl_cert = ''; // e.g., '/etc/mysql/ssl/client-cert.pem'
|
||||
$db_ssl_ca = ''; // e.g., '/etc/mysql/ssl/ca-cert.pem'
|
||||
$db_ssl_capath = NULL;
|
||||
$db_ssl_cipher = NULL;
|
||||
$db_ssl_verify_server_cert = false; // 生产环境可设为TRUE
|
||||
|
||||
// ========== SALT VARIABLE(⚠️ 极其重要!) ==========
|
||||
/**
|
||||
* Salt值用于REDCap数据导出时的去标识化哈希
|
||||
*
|
||||
* 重要规则:
|
||||
* 1. ⚠️ 一旦设置,永远不可更改!
|
||||
* 2. 修改会导致历史去标识化数据无法解密
|
||||
* 3. 必须妥善备份(丢失会导致数据无法恢复)
|
||||
*
|
||||
* 开发环境建议:
|
||||
* - 使用固定的Salt值(便于重建环境)
|
||||
* - 至少8个字符,建议20+字符
|
||||
*
|
||||
* 生产环境要求:
|
||||
* - 必须使用强随机Salt(32+字符)
|
||||
* - 包含大小写字母、数字、特殊字符
|
||||
* - 生成方法:
|
||||
* PowerShell: -join ((65..90) + (97..122) + (48..57) + (33..47) | Get-Random -Count 32 | % {[char]$_})
|
||||
* Linux/Mac: openssl rand -base64 32
|
||||
*/
|
||||
|
||||
// 开发环境Salt
|
||||
$salt = 'iit_dev_salt_2026_redcap_v15_do_not_change';
|
||||
|
||||
// 生产环境Salt示例(必须修改!)
|
||||
// $salt = 'Your_Strong_Random_Salt_32_Chars_Min_With_Special_Chars_!@#$%';
|
||||
|
||||
// ========== DATA TRANSFER SERVICES (DTS) ==========
|
||||
// 如使用REDCap DTS功能,取消下方注释并配置
|
||||
// DTS用于多个REDCap实例之间的数据传输
|
||||
|
||||
// $dtsHostname = 'your_dts_host_name';
|
||||
// $dtsDb = 'your_dts_db_name';
|
||||
// $dtsUsername = 'your_dts_db_username';
|
||||
// $dtsPassword = 'your_dts_db_password';
|
||||
|
||||
// ========== 外部数据库连接(可选,替代默认配置) ==========
|
||||
// 如需将数据库配置放在外部文件(安全考虑),取消下方注释
|
||||
// 外部文件应放在Web根目录之外,无法通过HTTP访问
|
||||
|
||||
// include '/path/outside/web/root/db_conn_file.php';
|
||||
|
||||
// ========== 配置验证(开发环境调试用) ==========
|
||||
// 开发环境可以启用此段代码验证配置
|
||||
// 生产环境必须删除或注释此段代码!
|
||||
|
||||
if (FALSE) { // 调试时改为TRUE
|
||||
echo "=== REDCap Database Configuration ===\n";
|
||||
echo "Hostname: $hostname\n";
|
||||
echo "Database: $db\n";
|
||||
echo "Username: $username\n";
|
||||
echo "Password: " . str_repeat('*', strlen($password)) . "\n";
|
||||
echo "Salt Length: " . strlen($salt) . " characters\n";
|
||||
echo "=====================================\n";
|
||||
|
||||
// 测试数据库连接
|
||||
$test_conn = @mysqli_connect($hostname, $username, $password, $db);
|
||||
if ($test_conn) {
|
||||
echo "✅ Database connection successful!\n";
|
||||
mysqli_close($test_conn);
|
||||
} else {
|
||||
echo "❌ Database connection failed: " . mysqli_connect_error() . "\n";
|
||||
}
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
// ========== 环境切换说明 ==========
|
||||
/**
|
||||
* 开发环境 → 生产环境迁移清单:
|
||||
*
|
||||
* 1. 修改$hostname为RDS地址
|
||||
* - 开发:redcap-db
|
||||
* - 生产:rm-xxx.mysql.rds.aliyuncs.com
|
||||
*
|
||||
* 2. 修改$db数据库名
|
||||
* - 开发:redcap
|
||||
* - 生产:redcap_prod(建议区分)
|
||||
*
|
||||
* 3. 修改$username和$password
|
||||
* - 必须使用强密码(32+字符)
|
||||
*
|
||||
* 4. 设置生产环境Salt
|
||||
* - 必须使用强随机值
|
||||
* - 设置后永远不可更改
|
||||
*
|
||||
* 5. 关闭调试
|
||||
* - $log_all_errors = FALSE
|
||||
* - 删除配置验证代码
|
||||
*
|
||||
* 6. 配置SSL连接(推荐)
|
||||
* - RDS提供SSL证书
|
||||
* - 增强数据传输安全
|
||||
*/
|
||||
137
redcap-docker-dev/config/php/php.ini
Normal file
137
redcap-docker-dev/config/php/php.ini
Normal file
@@ -0,0 +1,137 @@
|
||||
; REDCap PHP配置文件
|
||||
; 版本:v1.0
|
||||
; 日期:2026-01-01
|
||||
; 适用:开发/测试/生产环境
|
||||
|
||||
; ========== 文件上传配置(REDCap必需) ==========
|
||||
; REDCap允许上传临床试验文件、影像资料等
|
||||
upload_max_filesize = 32M
|
||||
post_max_size = 32M
|
||||
max_file_uploads = 20
|
||||
|
||||
; ========== 执行时间配置 ==========
|
||||
; 数据导出和复杂查询需要更长时间
|
||||
max_execution_time = 300
|
||||
max_input_time = 300
|
||||
default_socket_timeout = 60
|
||||
|
||||
; ========== 内存限制 ==========
|
||||
; REDCap推荐最低256MB
|
||||
memory_limit = 256M
|
||||
|
||||
; ========== 时区配置 ==========
|
||||
; 非常重要!影响数据时间戳
|
||||
date.timezone = Asia/Shanghai
|
||||
|
||||
; ========== 错误报告(开发环境) ==========
|
||||
; 开发环境:显示所有错误
|
||||
; 临时关闭 display_errors 避免干扰压缩输出流(ERR_CONTENT_DECODING_FAILED)
|
||||
display_errors = Off
|
||||
display_startup_errors = Off
|
||||
error_reporting = E_ALL
|
||||
|
||||
; 生产环境应修改为:
|
||||
; display_errors = Off
|
||||
; display_startup_errors = Off
|
||||
; error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
|
||||
; log_errors = On
|
||||
; error_log = /var/log/php/error.log
|
||||
|
||||
; ========== Session配置 ==========
|
||||
; REDCap使用Session管理用户登录状态
|
||||
session.save_handler = files
|
||||
session.save_path = "/tmp"
|
||||
session.gc_maxlifetime = 3600
|
||||
session.cookie_lifetime = 0
|
||||
session.cookie_httponly = 1
|
||||
session.cookie_secure = 0 ; 生产环境HTTPS启用时改为1
|
||||
session.use_strict_mode = 1
|
||||
session.use_cookies = 1
|
||||
session.use_only_cookies = 1
|
||||
|
||||
; ========== 安全配置 ==========
|
||||
; 禁止危险函数(生产环境推荐)
|
||||
; disable_functions = exec,passthru,shell_exec,system,proc_open,popen
|
||||
|
||||
; 允许URL文件访问(REDCap的Web Service功能需要)
|
||||
allow_url_fopen = On
|
||||
|
||||
; 禁止URL文件包含(安全)
|
||||
allow_url_include = Off
|
||||
|
||||
; 隐藏PHP版本信息(安全)
|
||||
expose_php = Off
|
||||
|
||||
; ========== 数据库配置 ==========
|
||||
; MySQL连接超时
|
||||
mysqli.default_socket =
|
||||
mysqli.connect_timeout = 60
|
||||
mysqli.reconnect = On
|
||||
|
||||
; ========== OPcache配置(性能优化) ==========
|
||||
; 生产环境强烈推荐启用OPcache
|
||||
opcache.enable = 1
|
||||
opcache.enable_cli = 0
|
||||
opcache.memory_consumption = 128
|
||||
opcache.interned_strings_buffer = 8
|
||||
opcache.max_accelerated_files = 10000
|
||||
opcache.revalidate_freq = 2
|
||||
opcache.fast_shutdown = 1
|
||||
|
||||
; 开发环境可能需要禁用缓存验证
|
||||
; opcache.validate_timestamps = 0
|
||||
|
||||
; ========== 字符编码 ==========
|
||||
; 确保UTF-8编码(支持中文)
|
||||
default_charset = "UTF-8"
|
||||
mbstring.language = UTF-8
|
||||
mbstring.internal_encoding = UTF-8
|
||||
|
||||
; ========== 邮件配置 ==========
|
||||
; SMTP配置(REDCap调查邀请等功能需要)
|
||||
; 通常在REDCap控制中心配置,这里可留空
|
||||
SMTP = localhost
|
||||
smtp_port = 25
|
||||
sendmail_from = noreply@localhost
|
||||
|
||||
; ========== 输出缓冲 ==========
|
||||
; REDCap数据导出需要
|
||||
; 临时禁用输出缓冲,解决 ERR_CONTENT_DECODING_FAILED
|
||||
output_buffering = Off
|
||||
|
||||
; ========== 禁用 zlib 压缩(解决 ERR_CONTENT_DECODING_FAILED)==========
|
||||
; REDCap 内部会控制输出压缩,必须禁用 PHP 层面的压缩避免冲突
|
||||
zlib.output_compression = Off
|
||||
zlib.output_compression_level = -1
|
||||
zlib.output_handler =
|
||||
|
||||
; ========== 其他配置 ==========
|
||||
; 最大输入变量数(复杂表单需要)
|
||||
max_input_vars = 3000
|
||||
|
||||
; 最大输入嵌套层级
|
||||
max_input_nesting_level = 64
|
||||
|
||||
; 日志配置
|
||||
log_errors = On
|
||||
log_errors_max_len = 1024
|
||||
|
||||
; ========== 扩展配置 ==========
|
||||
; 确保以下扩展已启用(在Dockerfile中已安装)
|
||||
; extension=mysqli
|
||||
; extension=pdo_mysql
|
||||
; extension=gd
|
||||
; extension=zip
|
||||
; extension=soap
|
||||
; extension=ldap
|
||||
; extension=mbstring
|
||||
; extension=calendar
|
||||
; extension=bcmath
|
||||
|
||||
; ========== 注释说明 ==========
|
||||
; 1. 此配置适用于REDCap 15.8.0
|
||||
; 2. 生产环境应关闭display_errors
|
||||
; 3. 生产环境应启用OPcache
|
||||
; 4. 文件上传大小可根据需求调整
|
||||
; 5. 时区配置必须正确,影响数据时间戳
|
||||
|
||||
Reference in New Issue
Block a user