feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,97 +1,97 @@
# REDCap Docker部署操作手册
**<EFBFBD><EFBFBD>𧋦嚗?* v1.0
**版本:** v1.0
**最后更新:** 2026-01-02
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?* Windows/Linux/Mac + Docker
**REDCap<EFBFBD><EFBFBD>𧋦嚗?* 15.8.0
**撉諹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>** <20>?撌脣銁<E884A3>砍𧑐Windows<77><EFBFBD>撉諹<E69289><E8ABB9><EFBFBD>
**适用环境:** Windows/Linux/Mac + Docker
**REDCap版本:** 15.8.0
**验证状态:** ✅ 已在本地Windows环境验证通过
---
## 📋 文档目标
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>靘𢡱EDCap<EFBFBD><EFBFBD>Docker<EFBFBD>?*<2A><><EFBFBD><EFBFBD><EFBFBD>蝵脫<E89DB5>蝔?*嚗屸<E59A97><E5B1B8>鍂鈭𠬍<E988AD>
- <EFBFBD>?<3F>砍𧑐撘<F0A79190><E69298>𤑳㴓憓?
- <EFBFBD>?<3F><EFBFBD>鈭䫿CS<43>煺漣<E785BA><EFBFBD>
- <EFBFBD>?<3F>駁堺蝘<E5A0BA><E89D98><EFBFBD>𡝗<EFBFBD><F0A19D97>
本手册提供REDCap基于Docker的**标准化部署流程**,适用于:
- ✅ 本地开发环境
- ✅ 阿里云ECS生产环境
- ✅ 医院私有化服务器
**<EFBFBD><EFBFBD>隡睃飵嚗?*
- <EFBFBD><EFBFBD> **<EFBFBD><EFBFBD><EFBFBD>?*嚗鋽ocker<65>滨蔭<E6BBA8><E894AD><EFBFBD>臬銁銝滚<E98A9D><E6BB9A><EFBFBD><E887AC>湔𦻖雿輻鍂
- <EFBFBD>𣑐 **銝<><E98A9D><EFBFBD>?*嚗𡁜<E59A97><F0A1819C>𤑳㴓憓?<3F>煺漣<E785BA><EFBFBD>嚗屸<E59A97><E5B1B8>滨㴓憓<E3B493>榆撘?
- <EFBFBD><EFBFBD> **敹恍<E695B9><EFBFBD>蝵?*嚗?0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵?
- <EFBFBD>椘儭?**<2A><EFBFBD><EFBFBD><E996AB>**嚗𡁜抅鈭𤾸<E988AD><F0A4BEB8><EFBFBD><EFBFBD>𤑳<EFBFBD>撉䕘<E69289><EFBFBD>俈撣貉<E692A3><E8B289><EFBFBD>
**核心优势:**
- 🔄 **可复用**Docker配置文件可在不同环境直接使用
- 📦 **一致性**:开发环境=生产环境,避免环境差异
- 🚀 **快速部署**30分钟内完成部署
- 🛡️ **问题规避**:基于实际踩坑经验,预防常见问题
---
## 🎯 部署架构
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?銝枋ocker摰孵膥嚗?
### 标准架构3个Docker容器
```
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? REDCap Docker <EFBFBD>函蔡<EFBFBD><EFBFBD> <EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<EFBFBD>? <20>? redcap-apache (Web摰孵膥) <EFBFBD>? <20>?
<EFBFBD>? <20>? - PHP 8.1 + Apache 2.4 <EFBFBD>? <20>?
<EFBFBD>? <20>? - REDCap 15.8.0 皞鞟<EFBFBD> <EFBFBD>? <20>?
<EFBFBD>? <20>? - Cron摰𡁏𧒄隞餃𦛚 <EFBFBD>? <20>?
<EFBFBD>? <20>? Port: 8080 <EFBFBD>?80 <EFBFBD>? <20>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<EFBFBD>? <EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<EFBFBD>? <20>? redcap-mysql (<EFBFBD>唳旿摨枏捆<EFBFBD>? <EFBFBD>? <20>?
<EFBFBD>? <20>? - MySQL 8.0 <EFBFBD>? <20>?
<EFBFBD>? <20>? - <20>唳旿<E594B3><E697BF><EFBFBD><EFBFBD>?Volume) <EFBFBD>? <20>?
<EFBFBD>? <20>? Port: 3306 (<EFBFBD><EFBFBD><EFBFBD>) <EFBFBD>? <20>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<EFBFBD>? <EFBFBD>? <EFBFBD>?
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<EFBFBD>? <20>? redcap-phpmyadmin (蝞∠<EFBFBD>撌亙<EFBFBD>) <20>? <20>?
<EFBFBD>? <20>? - phpMyAdmin 5 <EFBFBD>? <20>?
<EFBFBD>? <20>? Port: 8081 <EFBFBD>?80 <EFBFBD>? <20>?
<EFBFBD>? <20>? (<28><EFBFBD><EFBFBD><EFBFBD><E99A9E><EFBFBD>𤑳㴓憓? <EFBFBD>? <20>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
┌─────────────────────────────────────────┐
REDCap Docker 部署架构
├─────────────────────────────────────────┤
│ ┌──────────────────────────────────┐ │
│ │ redcap-apache (Web容器) │ │
│ │ - PHP 8.1 + Apache 2.4 │ │
│ │ - REDCap 15.8.0 源码 │ │
│ │ - Cron定时任务 │ │
│ │ Port: 8080 80 │ │
│ └──────────────────────────────────┘ │
│ ┌──────────────────────────────────┐ │
│ │ redcap-mysql (数据库容器) │ │
│ │ - MySQL 8.0 │ │
│ │ - 数据持久化(Volume) │ │
│ │ Port: 3306 (内部) │ │
│ └──────────────────────────────────┘ │
│ ┌──────────────────────────────────┐ │
│ │ redcap-phpmyadmin (管理工具) │ │
│ │ - phpMyAdmin 5 │ │
│ │ Port: 8081 80 │ │
│ │ (可选,仅开发环境) │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
---
## 📦 可复用的Docker文件清单
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>湔𦻖憭滨鍂嚗?
### 核心文件(必需,可直接复用)
| <EFBFBD><EFBFBD>辣頝臬<EFBFBD> | 霂湔<E99C82> | <20><EFBFBD>撌桀<E6928C> | 憭滨鍂<E6BBA8>?|
| 文件路径 | 说明 | 环境差异 | 复用性 |
|---------|------|---------|--------|
| `Dockerfile.redcap` | REDCap<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣 | <20>惩榆撘?| <20>?100%<25><EFBFBD><E887AC>?|
| `docker-compose.yml` | <EFBFBD><EFBFBD>𤑳㴓憓<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞?| <20><><EFBFBD>㟲蝡臬藁/<2F>瑁楝敺?| <20>𩤃<EFBFBD> <20><>敺株<E695BA> |
| `docker-compose.prod.yml` | <EFBFBD>煺漣<EFBFBD><EFBFBD>蝻𡝗<EFBFBD><EFBFBD><EFBFBD>辣 | <20><><EFBFBD>滨蔭RDS | <20>𩤃<EFBFBD> <20><>靽格㺿<E6A0BC>唳旿摨㯄<E691A8>蝵?|
| `docker-entrypoint.sh` | 摰孵膥<EFBFBD>臬𢆡<EFBFBD>𡁏𧋦 | <20>惩榆撘?| <20>?100%<25><EFBFBD><E887AC>?|
| `Dockerfile.redcap` | REDCap镜像构建文件 | 无差异 | ✅ 100%可复用 |
| `docker-compose.yml` | 开发环境编排文件 | 需调整端口/卷路径 | ⚠️ 需微调 |
| `docker-compose.prod.yml` | 生产环境编排文件 | 需配置RDS | ⚠️ 需修改数据库配置 |
| `docker-entrypoint.sh` | 容器启动脚本 | 无差异 | ✅ 100%可复用 |
| `config/apache/redcap.conf` | Apache虚拟主机配置 | 需调整域名 | ⚠️ 需修改域名 |
| `config/php/php.ini` | PHP餈鞱<EFBFBD><EFBFBD><EFBFBD>蝵?| <20>惩榆撘?| <20>?100%<25><EFBFBD><E887AC>?|
| `config/database.php` | REDCap<EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>仿<EFBFBD>蝵?| **敹<>◆靽格㺿** | <20>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰𡁜<E691B0> |
| `.gitattributes` | Git<EFBFBD><EFBFBD>蝚西<EFBFBD><EFBFBD>?| <20>惩榆撘?| <20>?100%<25><EFBFBD><E887AC>?|
| `config/php/php.ini` | PHP运行时配置 | 无差异 | ✅ 100%可复用 |
| `config/database.php` | REDCap数据库连接配置 | **必须修改** | ❌ 需针对环境定制 |
| `.gitattributes` | Git换行符规范 | 无差异 | ✅ 100%可复用 |
### 辅助脚本(可选)
| 文件路径 | 说明 | 适用场景 |
|---------|------|---------|
| `scripts/setup-redcap.ps1` | <EFBFBD><EFBFBD><EFBFBD>蝵脰<EFBFBD><EFBFBD>穿<EFBFBD>Windows嚗?| <20>砍𧑐撘<F0A79190><E69298>?|
| `scripts/start-redcap.ps1` | <EFBFBD>臬𢆡<EFBFBD>滚𦛚 | <20>砍𧑐撘<F0A79190><E69298>?|
| `scripts/stop-redcap.ps1` | <EFBFBD>𨀣迫<EFBFBD>滚𦛚 | <20>砍𧑐撘<F0A79190><E69298>?|
| `scripts/clean-redcap.ps1` | <EFBFBD><EFBFBD><EFBFBD><EFBFBD> | <20>砍𧑐撘<F0A79190><E69298>?|
| `scripts/create-redcap-password.php` | <EFBFBD><EFBFBD><EFBFBD>滨蔭撌亙<EFBFBD> | 撘<><E69298>?餈鞟輕 |
| `scripts/setup-redcap.ps1` | 一键部署脚本Windows | 本地开发 |
| `scripts/start-redcap.ps1` | 启动服务 | 本地开发 |
| `scripts/stop-redcap.ps1` | 停止服务 | 本地开发 |
| `scripts/clean-redcap.ps1` | 清理环境 | 本地开发 |
| `scripts/create-redcap-password.php` | 密码重置工具 | 开发/运维 |
---
## <EFBFBD><EFBFBD> <20>函蔡瘚<E894A1><E7989A><EFBFBD><E59A97>0<EFBFBD>?嚗?
## 🚀 部署流程从0到1
### <EFBFBD>嗆挾1嚗𡁶㴓憓<EFBFBD><EFBFBD>憭?
### 阶段1环境准备
#### 1.1 安装Docker
**Windows/Mac嚗?*
**Windows/Mac**
```bash
# 下载并安装Docker Desktop
# https://www.docker.com/products/docker-desktop/
@@ -121,22 +121,22 @@ docker-compose --version
#### 1.2 获取REDCap源码
**<EFBFBD><EFBFBD>霂湔<EFBFBD>嚗?* REDCap<61><EFBFBD>銝朞蔓隞塚<E99A9E><E5A19A><EFBFBD><EFBFBD><E996AC>
**重要说明:** REDCap是商业软件需要
1. 访问 https://projectredcap.org/
2. 注册并申请社区版或商业版
3. 銝贝蝸REDCap 15.8.0皞鞟<EFBFBD><EFBFBD><EFBFBD><EFBFBD>redcap15.8.0.zip嚗?
3. 下载REDCap 15.8.0源码包(redcap15.8.0.zip
**<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>嚗?*
**目录结构:**
```
your-project/
├── redcap-docker-dev/ # Docker配置目录
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> Dockerfile.redcap
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> docker-compose.yml
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> docker-entrypoint.sh
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> config/
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> scripts/
<EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> redcap15.8.0/ # REDCap皞鞟<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
│ ├── Dockerfile.redcap
│ ├── docker-compose.yml
│ ├── docker-entrypoint.sh
│ ├── config/
│ └── scripts/
└── redcap15.8.0/ # REDCap源码(解压后)
├── redcap_v15.8.0/
├── install.php
├── index.php
@@ -153,7 +153,7 @@ your-project/
# 创建目录结构
mkdir -p redcap-docker-dev/config/{apache,php}
mkdir -p redcap-docker-dev/scripts
mkdir -p redcap-docker-dev/data/mysql # MySQL<EFBFBD>唳旿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
mkdir -p redcap-docker-dev/data/mysql # MySQL数据持久化
mkdir -p redcap-docker-dev/logs # 日志目录
```
@@ -162,7 +162,7 @@ mkdir -p redcap-docker-dev/logs # 日志目录
**从我们的项目中复制以下文件:**
```bash
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣嚗<EFBFBD><EFBFBD>湔𦻖憭滨鍂嚗峕<EFBFBD><EFBFBD><EFBFBD>靽格㺿嚗?
# 核心文件(可直接复用,无需修改)
cp AIclinicalresearch/redcap-docker-dev/Dockerfile.redcap ./
cp AIclinicalresearch/redcap-docker-dev/docker-entrypoint.sh ./
cp AIclinicalresearch/redcap-docker-dev/config/php/php.ini ./config/php/
@@ -195,16 +195,16 @@ MYSQL_PORT=3306
PHPMYADMIN_PORT=8081
```
#### 2.4 靽格㺿database.php<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
#### 2.4 修改database.php(重要!)
编辑`config/database.php`,根据环境修改:
**开发环境Docker MySQL**
```php
$hostname = 'redcap-mysql'; // Docker Compose<EFBFBD>滚𦛚<EFBFBD>?
$hostname = 'redcap-mysql'; // Docker Compose服务名
$db = 'redcap';
$username = 'redcap_user';
$password = 'your_password'; // 銝?env靽脲<EFBFBD><EFBFBD><EFBFBD>?
$password = 'your_password'; // 与.env保持一致
$salt = 'dev_salt_2026'; // 开发环境固定salt
```
@@ -214,13 +214,13 @@ $hostname = 'rm-xxx.mysql.rds.aliyuncs.com'; // RDS内网地址
$db = 'redcap_prod';
$username = 'redcap_admin';
$password = 'your_strong_prod_password'; // 强密码!
$salt = 'your_random_32_chars_salt'; // <EFBFBD>𩤃<EFBFBD> 瘞訾<E7989E><E8A8BE><EFBFBD>嚗?
$salt = 'your_random_32_chars_salt'; // ⚠️ 永不可变!
```
**<2A>𩤃<EFBFBD> <20>喲睸瘜冽<E7989C>鈭钅★嚗?*
1. <20>?**<2A>𣳇膄<F0A3B387><E88684><EFBFBD>怠偏<E680A0><E5818F>?>`<EFBFBD>𣬚征銵?*嚗<>俈甇RLF瘙⊥<E79899>嚗?
2. <EFBFBD>?**Salt<EFBFBD><EFBFBD><EFBFBD>西挽蝵格偶銝滚虾<EFBFBD>?*嚗<><EFBFBD>齿㺭<E9BDBF>桀縧<E6A180><E7B8A7><EFBFBD><EFBFBD><EFBFBD>
3. <EFBFBD>?**<2A>煺漣<E785BA><EFBFBD>雿輻鍂撘箏<E69298><E7AE8F>?*嚗?2+摮㛖泵嚗?
**⚠️ 关键注意事项:**
1.**删除文件末尾的`?>`和空行**防止CRLF污染
2. **Salt值一旦设置永不可改**(影响数据去标识化)
3. **生产环境使用强密码**32+字符)
---
@@ -234,37 +234,37 @@ $salt = 'your_random_32_chars_salt'; // ⚠️ 永不可变
services:
redcap-web:
volumes:
# <EFBFBD>EDCap皞鞟<EFBFBD><EFBFBD><EFBFBD><EFBFBD>啣捆<EFBFBD>?
# 将REDCap源码挂载到容器
- ../redcap15.8.0:/var/www/html/redcap:ro # 只读挂载
# <EFBFBD>atabase.php憭滚<EFBFBD><EFBFBD>啣捆<EFBFBD><EFBFBD>霂餃<EFBFBD>嚗?
# 将database.php复制到容器(读写)
- ./config/database.php:/var/www/html/redcap/database.php
```
**頝臬<EFBFBD>霂湔<EFBFBD>嚗?*
**路径说明:**
- `../redcap15.8.0`:相对于`redcap-docker-dev`目录
- 如果源码在其他位置,修改为绝对路径:`D:/path/to/redcap15.8.0`
#### 3.2 <EFBFBD><EFBFBD>遣撟嗅鍳<EFBFBD>典捆<EFBFBD>?
#### 3.2 构建并启动容器
```bash
# 进入Docker配置目录
cd redcap-docker-dev
# <EFBFBD><EFBFBD>REDCap<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>甈⊿<EFBFBD>蝵脤<EFBFBD><EFBFBD><EFBFBD>蝥?-10<31><30><EFBFBD>嚗?
# 构建REDCap镜像首次部署需要约5-10分钟
docker-compose build
# <EFBFBD>臬𢆡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
# 启动所有服务
docker-compose up -d
# <EFBFBD><EFBFBD>摰孵膥<EFBFBD><EFBFBD>?
# 查看容器状态
docker-compose ps
# 查看日志(排查问题)
docker-compose logs -f redcap-web
```
**<EFBFBD><EFBFBD>颲枏枂嚗?*
**预期输出:**
```
NAME IMAGE STATUS PORTS
redcap-apache redcap-custom:15.8.0 Up 10 seconds 0.0.0.0:8080->80/tcp
@@ -278,7 +278,7 @@ redcap-phpmyadmin phpmyadmin/phpmyadmin Up 10 seconds 0.0.0.0:8081->80/tcp
1. 访问 `http://localhost:8080/install.php`
2. 按照向导完成安装
3. <EFBFBD>𥕦遣蝞∠<EFBFBD><EFBFBD>䁅揭<EFBFBD>?
3. 创建管理员账户
**方法2导入SQL文件**
@@ -286,72 +286,72 @@ redcap-phpmyadmin phpmyadmin/phpmyadmin Up 10 seconds 0.0.0.0:8081->80/tcp
# 如果有现成的redcap_install.sql
docker exec -i redcap-mysql mysql -uredcap_user -p'your_password' redcap < redcap_install.sql
# <EFBFBD>滨蔭蝞∠<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
# 重置管理员密码
docker cp scripts/create-redcap-password.php redcap-apache:/tmp/
docker exec redcap-apache php /tmp/create-redcap-password.php
```
---
### <EFBFBD>嗆挾4嚗𡁻<EFBFBD><EFBFBD><EFBFBD>蝵?
### 阶段4验证部署
#### 4.1 访问REDCap
**銝駁△嚗?* http://localhost:8080/
**主页:** http://localhost:8080/
**<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>嚗?*
- <EFBFBD>?憿菟𢒰甇<F0A292B0><EFBFBD>曄內嚗峕<E59A97>REDCap Logo
- <EFBFBD>?CSS/JS<EFBFBD>㰘蝸甇<EFBFBD>虜嚗峕<EFBFBD>404<EFBFBD>躰秤
- <EFBFBD>?<3F><EFBFBD><EFBFBD>虾閫?
**预期结果:**
- ✅ 页面正常显示,有REDCap Logo
- CSS/JS加载正常无404错误
- ✅ 登录框可见
**<EFBFBD><EFBFBD>憿菟𢒰<EFBFBD><EFBFBD><EFBFBD>嗘僚嚗?* <20><><EFBFBD>銝𧢲䲮"<22><EFBFBD><E6A185>埝䰻"蝡㰘<E89DA1>
**如果页面样式错乱:** 参见下方"问题排查"章节
#### 4.2 测试登录
**暺䁅恕韐行<EFBFBD>嚗?*
**默认账户:**
- Username: `Admin`
- Password: `Admin123!`<EFBFBD><EFBFBD>雿㰘挽蝵桃<EFBFBD><EFBFBD><EFBFBD>嚗?
- Password: `Admin123!`(或你设置的密码)
**<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>嚗?*
- <EFBFBD>?<3F><EFBFBD><E9A483>𣂼<EFBFBD>嚗諹歲頧砍<E9A0A7>銝駁△
- <EFBFBD>?<3F>臭誑<E887AD><EFBFBD>"Control Center"<EFBFBD>?My Projects"蝑㕑<EFBFBD><EFBFBD>?
**预期结果:**
- ✅ 登录成功,跳转到主页
- ✅ 可以看到"Control Center"、"My Projects"等菜单
#### 4.3 访问phpMyAdmin
**<EFBFBD><EFBFBD>嚗?* http://localhost:8081/
**地址:** http://localhost:8081/
**<EFBFBD><EFBFBD>靽⊥<EFBFBD>嚗?*
**登录信息:**
- 服务器:`redcap-mysql`
- 用户名:`redcap_user`
- 密码与database.php中的密码一致
**验证数据库:**
- <EFBFBD>?<3F>臭誑<E887AD><EFBFBD>`redcap`<EFBFBD>唳旿摨?
- <EFBFBD>?<3F>?00+撘㰘”嚗<E2809D><E59A97>`redcap_config`, `redcap_user_information`蝑㚁<EFBFBD>
- ✅ 可以看到`redcap`数据库
- ✅ 有100+张表(如`redcap_config`, `redcap_user_information`等)
---
## <EFBFBD>𩤃<EFBFBD> 撣貉<E692A3><E8B289><EFBFBD>銝舘圾<E88898>單䲮獢?
## ⚠️ 常见问题与解决方案
### 问题1ERR_CONTENT_DECODING_FAILED
**<EFBFBD>啗情嚗?*
**现象:**
- 浏览器访问REDCap时报错`net::ERR_CONTENT_DECODING_FAILED 200 (OK)`
- CSS/JS文件加载失败
**<EFBFBD>寞𧋦<EFBFBD><EFBFBD>嚗?*
Apache<EFBFBD><EFBFBD>mod_deflate`璅<E79285>銝窰HP<48><50>zlib.output_compression`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>湔㺭<EFBFBD>株◤<EFBFBD><EFBFBD><EFBFBD>讠憬<EFBFBD>?
**根本原因:**
Apache`mod_deflate`模块与PHP的`zlib.output_compression`冲突,导致数据被重复压缩。
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
**解决方案:**
<EFBFBD>?**<2A>睲賑<E79DB2><E8B391>ocker<65>滨蔭撌脰䌊<E884B0>其耨憭齿迨<E9BDBF><EFBFBD>嚗?*
**我们的Docker配置已自动修复此问题**
1. `docker-entrypoint.sh`<EFBFBD>芸𢆡蝳<EFBFBD>`deflate`<EFBFBD>嚗?
1. `docker-entrypoint.sh`自动禁用`deflate`模块:
```bash
a2dismod -f deflate
```
2. `php.ini`銝剖歇<EFBFBD>喲𡡒<EFBFBD>讠憬嚗?
2. `php.ini`中已关闭压缩:
```ini
zlib.output_compression = Off
output_buffering = Off
@@ -359,9 +359,9 @@ Apache的`mod_deflate`模块与PHP的`zlib.output_compression`冲突,导致数
3. `redcap.conf`中注释掉了`mod_deflate`配置
**<EFBFBD><EFBFBD>餈䀹<EFBFBD><EFBFBD><EFBFBD>嚗?*
**如果还有问题:**
```bash
# 餈𥕦<E9A488>摰孵膥璉<E886A5><E79289>?
# 进入容器检查
docker exec redcap-apache bash -c "apache2ctl -M | grep deflate"
# 应该没有输出
@@ -371,60 +371,60 @@ docker-compose restart redcap-web
---
### <EFBFBD><EFBFBD>2嚗𡁶蒈敶訫仃韐?- <20><EFBFBD><E4ADBE>㰘蝸<E3B098><EFBFBD><E6BB9A>唳旿
### 问题2登录失败 - 无法加载响应数据
**<EFBFBD>啗情嚗?*
**现象:**
- 输入用户名密码后,页面不跳转
- Network面板显示POST请求返回200但"无法加载响应数据"
**<EFBFBD>寞𧋦<EFBFBD><EFBFBD>嚗?*
`database.php`<EFBFBD><EFBFBD><EFBFBD>怠偏<EFBFBD>头?>`PHP蝏𤘪<E89D8F><F0A498AA><EFBFBD><EFBFBD>𣬚征銵䕘<E98AB5>撖潸稲CRLF<4C><EFBFBD>蝚行情<E8A18C>鐈TTP<54><EFBFBD><E6BB9A>?
**根本原因:**
`database.php`文件末尾有`?>`PHP结束标签和空行导致CRLF换行符污染HTTP响应。
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
**解决方案:**
<EFBFBD>?**<2A>睲賑<E79DB2>𣂷<EFBFBD><F0A382B7><EFBFBD>database.php`璅⊥踎撌脖耨憭齿迨<EFBFBD><EFBFBD>嚗?*
✅ **我们提供的`database.php`模板已修复此问题:**
1. <20>?<3F><><EFBFBD>怠偏**瘝⊥<E7989D>`?>`**
2. <20>?<3F><><EFBFBD>怠偏**瘝⊥<E7989D>蝛箄<E89D9B>**
3. <20>?`.gitattributes`撘箏<EFBFBD>PHP<EFBFBD><EFBFBD>辣雿輻鍂LF<EFBFBD><EFBFBD>蝚?
1. ✅ 文件末尾**没有`?>`**
2. ✅ 文件末尾**没有空行**
3. ✅ `.gitattributes`强制PHP文件使用LF换行符
**<EFBFBD><EFBFBD><EFBFBD>芸楛<EFBFBD>𥕦遣database.php嚗?*
**如果自己创建database.php**
```php
<?php
// <EFBFBD>唳旿摨㯄<EFBFBD>蝵?..
// 数据库配置...
$hostname = 'redcap-mysql';
$db = 'redcap';
// ...
// <EFBFBD>?<3F>躰秤<E8BAB0><EFBFBD>嚗?
// ❌ 错误写法:
?>
// <EFBFBD>?甇<><EFBFBD><EFBFBD>嚗𡁏<E59A97>隞嗆錰撠曉蘨<E69B89>㗇釣<E39787><EFBFBD>蝏𤘪<E89D8F>蝚佗<E89D9A>瘝⊥<E7989D>?>
// ✅ 正确写法:文件末尾只有注释的结束符,没有?>
```
**撉諹<EFBFBD><EFBFBD><EFBFBD>嚗?*
**验证方法:**
```bash
# 璉<><E79289><EFBFBD>隞嗆錰撠橘<E692A0><E6A998><EFBFBD><EFBFBD>餈𥕦<E9A488>嚗?
# 检查文件末尾(十六进制)
docker exec redcap-apache bash -c "tail -c 50 /var/www/html/redcap/database.php | xxd"
# 摨磰砲<EFBFBD><EFBFBD>嚗?
# 00000030: 2a2f 0a # */ <EFBFBD>峕揢銵𣬚泵嚗峕瓷<EFBFBD>??> <20><><EFBFBD>雿嗵<E99BBF>0d0a
# 应该看到:
# 00000030: 2a2f 0a # */ 和换行符,没有 ?> 和多余的0d0a
```
---
### 问题3Base URL配置错误
**<EFBFBD>啗情嚗?*
**现象:**
- CSS/JS文件路径错误例如`http://localhost:8080/redcap/redcap_v15.8.0/Resources/...`
- 实际路径应该是:`http://localhost:8080/redcap_v15.8.0/Resources/...`
**<EFBFBD>寞𧋦<EFBFBD><EFBFBD>嚗?*
REDCap<EFBFBD>唳旿摨㮖葉<EFBFBD><EFBFBD>redcap_base_url`<EFBFBD>滨蔭銝垾pache<EFBFBD><EFBFBD>DocumentRoot`銝滚龪<EFBFBD><EFBFBD>?
**根本原因:**
REDCap数据库中的`redcap_base_url`配置与Apache的`DocumentRoot`不匹配。
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
**解决方案:**
```sql
-- 连接到MySQL容器
@@ -444,30 +444,30 @@ WHERE field_name = 'redcap_base_url';
-- WHERE field_name = 'redcap_base_url';
```
**<EFBFBD><EFBFBD>芣鴌嚗?*
- 摰㕑<E691B0><E39591>靽𨈚ase URL銝舘挪<E88898>桀𧑐<E6A180><F0A79190><EFBFBD><E98A9D>?
- 靽格㺿<E6A0BC>𡡞<EFBFBD><F0A1A19E><EFBFBD><EFBFBD><EFBFBD>𡝗<EFBFBD><F0A19D97><EFBFBD>摮?
**预防措施:**
- 安装时确保Base URL与访问地址一致
- 修改后重启浏览器或清除缓存
---
### <EFBFBD><EFBFBD>4嚗𡁜捆<EFBFBD>典鍳<EFBFBD>典仃韐?
### 问题4容器启动失败
**常见原因与解决方案:**
**4.1 蝡臬藁鋡怠<EFBFBD><EFBFBD>?*
**4.1 端口被占用**
```bash
# 璉<><E79289>亦垢<E4BAA6><E59EA2><EFBFBD><EFBFBD>?
# 检查端口占用
netstat -ano | findstr ":8080" # Windows
lsof -i :8080 # Linux/Mac
# 解决方案1修改docker-compose.yml端口映射
ports:
- "8090:80" # <EFBFBD>嫣蛹8090<EFBFBD><EFBFBD>隞𣇉垢<EFBFBD>?
- "8090:80" # 改为8090或其他端口
# 解决方案2停止占用端口的程序
```
**4.2 <EFBFBD><EFBFBD>頧質楝敺<EFBFBD><EFBFBD>霂?*
**4.2 卷挂载路径错误**
```bash
# 检查REDCap源码路径是否存在
ls -la ../redcap15.8.0
@@ -477,7 +477,7 @@ volumes:
- /absolute/path/to/redcap15.8.0:/var/www/html/redcap:ro
```
**4.3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𡿨inux嚗?*
**4.3 权限问题Linux**
```bash
# 给予Docker目录适当权限
sudo chown -R $(whoami):$(whoami) redcap-docker-dev/
@@ -488,14 +488,14 @@ chmod +x docker-entrypoint.sh
### 问题5MySQL连接失败
**<EFBFBD>啗情嚗?*
**现象:**
- REDCap显示"Database connection failed"
- 日志中有MySQL连接错误
**<EFBFBD>埝䰻甇仿炊嚗?*
**排查步骤:**
```bash
# 1. <EFBFBD><EFBFBD>仗ySQL摰孵膥<EFBFBD><EFBFBD>?
# 1. 检查MySQL容器状态
docker-compose ps redcap-mysql
# 2. 查看MySQL日志
@@ -508,40 +508,40 @@ docker exec -it redcap-mysql mysql -uredcap_user -p'your_password'
docker exec redcap-apache cat /var/www/html/redcap/database.php | grep hostname
```
**撣貉<EFBFBD><EFBFBD>躰秤嚗?*
- `$hostname`<EFBFBD><EFBFBD><EFBFBD>localhost`<EFBFBD><EFBFBD>霂交糓`redcap-mysql`嚗?
**常见错误:**
- `$hostname`写成了`localhost`(应该是`redcap-mysql`
- 密码不匹配(与`.env`或`docker-compose.yml`不一致)
- MySQL容器未完全启动等待30秒再试
---
## <EFBFBD><EFBFBD> 銝滚<E98A9D><E6BB9A><EFBFBD><E887AC><EFBFBD><EFBFBD>蝵桀榆撘?
## 🔄 不同环境的配置差异
### <EFBFBD>砍𧑐撘<EFBFBD><EFBFBD>𤑳㴓憓?
### 本地开发环境
**<EFBFBD><EFBFBD>嚗?*
**特点:**
- 使用Docker MySQL容器
- 包含phpMyAdmin
- 端口映射到localhost
-<><E69298>𤏸<EFBFBD>霂閙芋撘?
- 开发调试模式
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滨蔭嚗?*
1. `docker-compose.yml`嚗帋蝙<EFBFBD><EFBFBD>霈日<EFBFBD>蝵?
**需要修改的配置:**
1. `docker-compose.yml`:使用默认配置
2. `database.php``$hostname = 'redcap-mysql'`
---
### 阿里云ECS生产环境
**<EFBFBD><EFBFBD>嚗?*
**特点:**
- 使用阿里云RDS MySQL
- 銝滚<E98A9D><E6BB9A>厚hpMyAdmin嚗<6E><E59A97><EFBFBD><EFBFBD><E588BB><EFBFBD>嚗?
- 不包含phpMyAdmin安全考虑
- 使用域名+SSL证书
- 生产优化配置
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滨蔭嚗?*
**需要修改的配置:**
1. **雿輻鍂`docker-compose.prod.yml`嚗?*
1. **使用`docker-compose.prod.yml`**
```yaml
services:
redcap-web:
@@ -551,36 +551,36 @@ docker exec redcap-apache cat /var/www/html/redcap/database.php | grep hostname
# 移除redcap-mysql和redcap-phpmyadmin服务
```
2. **靽格㺿`database.php`嚗?*
2. **修改`database.php`**
```php
$hostname = 'rm-xxx.mysql.rds.aliyuncs.com'; // RDS内网地址
$db = 'redcap_prod';
$username = 'redcap_admin';
$password = 'your_strong_password_32_chars_min'; // 撘箏<EFBFBD><EFBFBD>?
$password = 'your_strong_password_32_chars_min'; // 强密码
$salt = 'your_random_salt_never_change'; // 永不可变
// <EFBFBD>舐鍂SSL餈墧𦻖嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
// 启用SSL连接可选但推荐
$db_ssl_ca = '/path/to/rds-ca.pem';
$db_ssl_verify_server_cert = true;
```
3. **靽格㺿`redcap.conf`嚗?*
3. **修改`redcap.conf`**
```apache
ServerName redcap.yourdomain.com
```
4. **<EFBFBD><EFBFBD>遣撟嗆綫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACR嚗?*
4. **构建并推送镜像到ACR**
```bash
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭穃捆<EFBFBD><EFBFBD><EFBFBD>𤩺<EFBFBD><EFBFBD>?
# 登录阿里云容器镜像服务
docker login --username=your_username registry.cn-hangzhou.aliyuncs.com
# 构建镜像
docker build -f Dockerfile.redcap -t redcap-custom:15.8.0 .
# <EFBFBD>𤘪<EFBFBD>蝑?
# 打标签
docker tag redcap-custom:15.8.0 registry.cn-hangzhou.aliyuncs.com/your-namespace/redcap:15.8.0
# <EFBFBD><EFBFBD>?
# 推送
docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/redcap:15.8.0
```
@@ -595,19 +595,19 @@ docker exec redcap-apache cat /var/www/html/redcap/database.php | grep hostname
---
### <EFBFBD>駁堺蝘<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵?
### 医院私有化部署
**<EFBFBD><EFBFBD>嚗?*
**特点:**
- 内网环境,无外网访问
- 可能无法使用Docker Hub
- 需要数据安全与合规
- 可能需要集成医院HIS系统
**<EFBFBD>函蔡甇仿炊嚗?*
**部署步骤:**
1. **蝳餌瑪<EFBFBD><EFBFBD><EFBFBD>Docker<EFBFBD>𨅯<EFBFBD>嚗?*
1. **离线准备Docker镜像:**
```bash
# <EFBFBD><EFBFBD>蝵𤑳<EFBFBD><EFBFBD><EFBFBD>㴓憓<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
# 在有网络的环境导出镜像
docker save redcap-custom:15.8.0 mysql:8.0 phpmyadmin/phpmyadmin:latest > redcap-images.tar
# 传输到医院服务器
@@ -618,10 +618,10 @@ docker exec redcap-apache cat /var/www/html/redcap/database.php | grep hostname
```
2. **配置内网数据库:**
- 雿輻鍂<EFBFBD>駁堺<EFBFBD>芸楛<EFBFBD><EFBFBD>ySQL<EFBFBD>滚𦛚<EFBFBD>?
- <EFBFBD><EFBFBD>蝵脩𡠺蝡讠<EFBFBD>MySQL摰孵膥嚗<EFBFBD><EFBFBD>桃𤌍敶閙<EFBFBD>頧賢<EFBFBD><EFBFBD>駁堺摮睃<EFBFBD>嚗?
- 使用医院自己的MySQL服务器
- 或部署独立的MySQL容器数据目录挂载到医院存储
3. **<EFBFBD>唳旿摰匧<EFBFBD><EFBFBD>滨蔭嚗?*
3. **数据安全配置:**
- 启用数据库SSL连接
- 配置定期备份
- 日志审计
@@ -629,45 +629,45 @@ docker exec redcap-apache cat /var/www/html/redcap/database.php | grep hostname
---
## <EFBFBD><EFBFBD> <20>函蔡璉<E894A1><E79289><EFBFBD><E4BAA4>?
## 📋 部署检查清单
### <EFBFBD>函蔡<EFBFBD>齿<EFBFBD><EFBFBD>?
### 部署前检查
- [ ] Docker撌脣<EFBFBD><EFBFBD>僎餈鞱<EFBFBD>嚗Ǒdocker --version`嚗?
- [ ] Docker Compose撌脣<EFBFBD><EFBFBD><EFBFBD>`docker-compose --version`嚗?
- [ ] Docker已安装并运行(`docker --version`
- [ ] Docker Compose已安装(`docker-compose --version`
- [ ] REDCap源码已下载并解压
- [ ] 已复制所有Docker配置文件
- [ ] `database.php`撌脫覔<EFBFBD>桃㴓憓<EFBFBD><EFBFBD>?
- [ ] `database.php`<EFBFBD>怠偏**瘝⊥<E7989D>`?>`<EFBFBD>𣬚征銵?*
- [ ] `database.php`已根据环境修改
- [ ] `database.php`末尾**没有`?>`和空行**
- [ ] `.env`文件已创建(如使用)
- [ ] 蝡臬藁<E887AC><EFBFBD><EFBFBD><E89D92>8080, 3306, 8081嚗?
- [ ] 端口无冲突(8080, 3306, 8081
### <EFBFBD>函蔡<EFBFBD>𡡞<EFBFBD>霂?
### 部署后验证
- [ ] 摰孵膥<E5ADB5><EFBFBD><E588B8>臬𢆡嚗Ǒdocker-compose ps`嚗?
- [ ] <20>臭誑霈輸䔮REDCap擐㚚△嚗áttp://localhost:8080/嚗?
- [ ] 容器全部启动(`docker-compose ps`
- [ ] 可以访问REDCap首页http://localhost:8080/
- [ ] 页面样式正常无404错误
- [ ] 可以成功登录
- [ ] phpMyAdmin<EFBFBD>航挪<EFBFBD><EFBFBD>http://localhost:8081/嚗?
- [ ] <20>唳旿摨栞”撌脣<E6928C>撱綽<E692B1>100+撘㰘”嚗?
- [ ] phpMyAdmin可访问(http://localhost:8081/
- [ ] 数据库表已创建100+张表)
- [ ] 可以创建项目
- [ ] 可以创建表单
- [ ] 数据可以正常保存
### <EFBFBD>煺漣<EFBFBD><EFBFBD>憸嘥<EFBFBD><EFBFBD><EFBFBD>?
### 生产环境额外检查
- [ ] 雿輻鍂撘箏<E69298><E7AE8F><EFBFBD><EFBFBD>32+摮㛖泵嚗?
- [ ] Salt<EFBFBD>澆歇霈曄蔭銝𥪜<EFBFBD>隞?
- [ ] 使用强密码32+字符)
- [ ] Salt值已设置且备份
- [ ] 使用HTTPS + SSL证书
- [ ] 防火墙规则已配置
- [ ] 数据库定期备份已配置
- [ ] <20><EFBFBD><E4BA99>烐綉撌脤<E6928C>蝵?
- [ ] <20><EFBFBD>DNS撌脰圾<E884B0>?
- [ ] 日志监控已配置
- [ ] 域名DNS已解析
- [ ] 邮件服务已配置(可选)
---
## <EFBFBD><EFBFBD>儭?<3F>亙虜蝏湔擪<E6B994>賭誘
## 🛠️ 日常维护命令
### 容器管理
@@ -681,10 +681,10 @@ docker-compose stop
# 重启服务
docker-compose restart
# <EFBFBD>𨀣迫撟嗅<EFBFBD><EFBFBD>文捆<EFBFBD><EFBFBD><EFBFBD>唳旿靽萘<EFBFBD>嚗?
# 停止并删除容器(数据保留)
docker-compose down
# <EFBFBD>𨀣迫撟嗅<EFBFBD><EFBFBD>文捆<EFBFBD>?<3F>唳旿嚗<E697BF><EFBFBD><EFBFBD>嚗?
# 停止并删除容器+数据(危险!)
docker-compose down -v
# 查看日志
@@ -696,13 +696,13 @@ docker exec -it redcap-apache bash
docker exec -it redcap-mysql bash
```
### <EFBFBD>遢銝擧<EFBFBD>憭?
### 备份与恢复
```bash
# 憭<><EFBFBD>唳旿摨?
# 备份数据库
docker exec redcap-mysql mysqldump -uredcap_user -p'password' redcap > backup_$(date +%Y%m%d).sql
# <EFBFBD><EFBFBD><EFBFBD>唳旿摨?
# 恢复数据库
docker exec -i redcap-mysql mysql -uredcap_user -p'password' redcap < backup_20260102.sql
# 备份edocs和temp目录
@@ -710,10 +710,10 @@ docker cp redcap-apache:/var/www/html/redcap/edocs ./backup_edocs
docker cp redcap-apache:/var/www/html/redcap/temp ./backup_temp
```
### <EFBFBD>滨蔭蝞∠<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### 重置管理员密码
```bash
# 雿輻鍂<E8BCBB>睲賑<E79DB2>𣂷<EFBFBD><F0A382B7><EFBFBD><EFBFBD><EFBFBD>?
# 使用我们提供的脚本
docker cp scripts/create-redcap-password.php redcap-apache:/tmp/
docker exec redcap-apache php /tmp/create-redcap-password.php
@@ -725,25 +725,25 @@ docker exec redcap-apache php /tmp/create-redcap-password.php
## 📚 相关文档
- **问题排查详解**[13-部署问题排查手册.md](./13-部署问题排查手册.md)
- **API<EFBFBD><EFBFBD>?*嚗靀../03-API撖寞𦻖銝𤾸<EFBFBD><EFBFBD>?30-REDCap_API雿輻鍂<EFBFBD><EFBFBD><EFBFBD>.md](../03-API撖寞𦻖銝𤾸<EFBFBD><EFBFBD>?30-REDCap_API雿輻鍂<EFBFBD><EFBFBD><EFBFBD>.md)
- **蝟餌<E89D9F><E9A48C>滨蔭**嚗靀../02-蝟餌<E89D9F><E9A48C>滨蔭銝舘<E98A9D>蝏?20-REDCap蝟餌<E89D9F><E9A48C>滨蔭<E6BBA8><EFBFBD>.md](../02-蝟餌<E89D9F><E9A48C>滨蔭銝舘<E98A9D>蝏?20-REDCap蝟餌<E89D9F><E9A48C>滨蔭<E6BBA8><EFBFBD>.md)
- **API开发**[../03-API对接与开发/30-REDCap_API使用指南.md](../03-API对接与开发/30-REDCap_API使用指南.md)
- **系统配置**[../02-系统配置与运维/20-REDCap系统配置手册.md](../02-系统配置与运维/20-REDCap系统配置手册.md)
- **REDCap官方文档**https://projectredcap.org/
---
## <EFBFBD>?<3F><EFBFBD>
## ✅ 总结
**我们提供的Docker配置文件经过实战验证已解决所有常见问题**
1. <20>?**Gzip<EFBFBD>讠憬<EFBFBD><EFBFBD>** <20>?<3F>芸𢆡蝳<F0A286A1>deflate<EFBFBD>
2. <20>?**CRLF瘙⊥<EFBFBD>** <EFBFBD>?database.php<EFBFBD>?>`嚗?gitattributes<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝚?
3. <EFBFBD>?**Base URL<EFBFBD>躰秤** <20>?<3F><><EFBFBD>𡒊霂湔<E99C82><E6B994>滨蔭<E6BBA8><EFBFBD>
4. <EFBFBD>?**頝典像<E585B8><EFBFBD>摰?* <20>?Windows/Linux/Mac<EFBFBD><EFBFBD>虾雿輻鍂
1.**Gzip压缩冲突** → 自动禁用deflate模块
2.**CRLF污染** database.php无`?>`.gitattributes规范换行符
3. **Base URL错误** → 文档明确说明配置方法
4. **跨平台兼容**Windows/Linux/Mac均可使用
**可复用性:**
- <EFBFBD><EFBFBD> **Dockerfile.redcap**嚗?00%<25><EFBFBD><E887AC><EFBFBD><E58981>𣳇<EFBFBD>隞颱<E99A9E>靽格㺿
- <EFBFBD><EFBFBD> **docker-entrypoint.sh**嚗?00%<25><EFBFBD><E887AC>?
- <EFBFBD><EFBFBD> **php.ini**嚗?00%<25><EFBFBD><E887AC>?
- 🔄 **Dockerfile.redcap**100%可复用,无需任何修改
- 🔄 **docker-entrypoint.sh**100%可复用
- 🔄 **php.ini**100%可复用
- ⚠️ **docker-compose.yml**:需根据环境调整端口和卷路径
- ⚠️ **database.php**:必须根据环境定制数据库连接信息
@@ -754,8 +754,7 @@ docker exec redcap-apache php /tmp/create-redcap-password.php
---
**<EFBFBD>厰䔮憸矋<EFBFBD>** <20><EFBFBD> [13-<2D>函蔡<E587BD><EFBFBD><E6A185>埝䰻<E59F9D><EFBFBD>.md](./13-<2D>函蔡<E587BD><EFBFBD><E6A185>埝䰻<E59F9D><EFBFBD>.md) <EFBFBD>𡝗<EFBFBD>Issue嚗?
**有问题?** 查看 [13-部署问题排查手册.md](./13-部署问题排查手册.md) 或提Issue