针对档案培训网络系统的需求,核心痛点在于课程资源的长期存储、学习进度的精确追踪以及数据的安全性。本文采用 Docker + Docker Compose 进行容器化部署,将 Moodle(最流行的开源学习管理系统)作为核心应用,配合 MariaDB 数据库和 Nginx 反向代理。这套架构具备高可用性、易迁移和零依赖的特点,能够完美支持SCORM标准档案课件,满足档案培训的合规性要求。
在开始部署前,请准备一台配置至少为 2核4G 的云服务器(推荐CentOS 7.9或Ubuntu 20.04及以上版本)。首先执行以下命令安装Docker及Docker Compose环境。
如果是CentOS系统,请先执行:
```bash yum update -y yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io ```如果是Ubuntu系统,请执行:
```bash apt-get update apt-get install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt-get install -y docker-ce docker-ce-cli containerd.io ```安装完成后,启动Docker并安装Compose插件:
```bash systemctl start docker systemctl enable docker curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ```为了保证容器重启后档案数据不丢失,我们需要在宿主机创建专门的数据目录,并配置正确的权限。Moodle容器内部通常以 www-data 用户(UID/GID通常为33)运行,或者根据镜像不同有所变化,这里我们统一设置为 1000:1000 或 999:999,并在配置文件中指定。
执行以下命令创建目录结构:
```bash mkdir -p /data/moodle/moodle_data mkdir -p /data/moodle/moodle_html mkdir -p /data/moodle/mariadb_data ```在 /data/moodle 目录下创建 docker-compose.yml 文件。该文件定义了数据库、Web应用和反向代理服务。请直接复制以下完整内容,注意修改 MYSQL_ROOT_PASSWORD 为强密码。
```yaml version: '3' services: 数据库服务 mariadb: image: docker.io/bitnami/mariadb:10.6 container_name: moodle_db environment: - MARIADB_ROOT_PASSWORD=your_secure_root_password_here - MARIADB_USER=bn_moodle - MARIADB_PASSWORD=your_secure_moodle_password_here - MARIADB_DATABASE=bitnami_moodle volumes: - /data/moodle/mariadb_data:/bitnami/mariadb networks: - moodle_network Moodle应用服务 moodle: image: docker.io/bitnami/moodle:4 container_name: moodle_app environment: - MOODLE_DATABASE_HOST=mariadb - MOODLE_DATABASE_PORT_NUMBER=3306 - MOODLE_DATABASE_USER=bn_moodle - MOODLE_DATABASE_PASSWORD=your_secure_moodle_password_here - MOODLE_DATABASE_NAME=bitnami_moodle 允许通过外部访问(如Nginx代理) - MOODLE_EXTERNAL_URL=https://your-domain.com volumes: - /data/moodle/moodle_data:/bitnami/moodle/data - /data/moodle/moodle_html:/bitnami/moodle depends_on: - mariadb ports: - '8080:8080' - '8443:8443' networks: - moodle_network Nginx反向代理(可选,推荐用于生产环境SSL配置) nginx: image: nginx:latest container: moodle_nginx ports: - "80:80" - "443:443" volumes: - /data/moodle/nginx.conf:/etc/nginx/nginx.conf:ro - /data/moodle/ssl:/etc/nginx/ssl:ro depends_on: - moodle networks: - moodle_network networks: moodle_network: driver: bridge ```档案培训系统通常涉及敏感数据,必须配置HTTPS。在 /data/moodle 目录下创建 nginx.conf。由于档案课件可能包含视频或PDF,我们需要调大 client_max_body_size。
```nginx user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; 增加上传限制,适应大体积档案视频课件 client_max_body_size 500M; server { listen 80; server_name your-domain.com; 强制跳转HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name your-domain.com; SSL证书配置(需自行申请证书放入ssl目录) ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://moodle_app:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; 针对长连接和SCORM课件的优化 proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; } } } ``>
注意:在执行启动命令前,请确保已在 /data/moodle/ssl 目录下放置了有效的SSL证书文件(fullchain.pem 和 privkey.pem)。如果是测试环境,可以先注释掉SSL相关配置块,仅使用80端口。
配置文件准备就绪后,在 /data/moodle 目录下执行以下命令拉取镜像并启动服务:
```bash docker-compose up -d ```首次启动时,Moodle会自动进行数据库初始化,这可能需要1-3分钟。可以通过以下命令查看日志确认启动状态:
```bash docker-compose logs -f moodle ```当日志中出现 moodleapp ready to start 或类似字样时,表示服务已就绪。此时在浏览器中访问 https://your-domain.com(或服务器IP:8080),你将看到Moodle安装向导。
进入安装界面后,由于我们在环境变量中已配置数据库连接,Moodle会自动检测并跳过数据库配置步骤,直接进入管理员账号创建页面。
档案培训数据涉及学员学籍和成绩,必须建立自动化备份机制。我们在 /data/moodle 下创建一个 backup.sh 脚本:
```bash !/bin/bash 定义备份目录 BACKUP_DIR="/data/moodle/backups" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR 备份数据库 docker exec moodle_db /usr/bin/mysqldump -u root -pyour_secure_root_password_here bitnami_moodle > $BACKUP_DIR/moodle_db_$DATE.sql 打包Moodle数据目录 tar -czf $BACKUP_DIR/moodle_data_$DATE.tar.gz /data/moodle/moodle_data 删除7天前的备份 find $BACKUP_DIR -type f -mtime +7 -name ".sql" -exec rm {} \; find $BACKUP_DIR -type f -mtime +7 -name ".tar.gz" -exec rm {} \; echo "Backup completed: $DATE" ```赋予脚本执行权限并设置定时任务:
```bash chmod +x /data/moodle/backup.sh crontab -e ```在Crontab中添加每天凌晨2点执行备份:
```text 0 2 /data/moodle/backup.sh >> /data/moodle/backup.log 2>&1 ``>在部署过程中,如果遇到页面无法加载或CSS样式丢失,通常是 proxy_set_header 配置问题,请检查Nginx配置中是否正确传递了 X-Forwarded-Proto。如果上传课件时提示“文件过大”,除了Nginx的配置外,还需检查PHP配置。Bitnami镜像默认配置较高,如需调整,可在docker-compose.yml中添加环境变量:
```yaml - PHP_UPLOAD_MAX_FILESIZE=500M - PHP_POST_MAX_SIZE=500M ```通过以上步骤,一个符合档案培训标准、支持大文件课件、具备HTTPS安全防护的网络培训平台即可交付使用。管理员可直接登录后台,添加部门、用户并上传SCORM档案课件开展培训。