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:
@@ -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>Z<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>單䲮獢?
|
||||
## ⚠️ 常见问题与解决方案
|
||||
|
||||
### 问题1:ERR_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>Z<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>Z<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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 问题3:Base 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
|
||||
|
||||
### 问题5:MySQL连接失败
|
||||
|
||||
**<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>W<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>Z<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!
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user