赣州数字档案馆系统从零到一部署与运维实战指南
一、系统架构设计与技术选型
本系统采用微服务架构,确保高可用性和可扩展性。核心组件包括:
- 前端: Vue 3 + Element Plus
- 后端: Spring Boot 2.7 + MyBatis Plus
- 数据库: MySQL 8.0(业务数据)+ MongoDB 5.0(非结构化档案数据)
- 文件存储: MinIO(对象存储,用于存储扫描件、音视频等)
- 搜索引擎: Elasticsearch 8.5(全文检索)
- 部署与编排: Docker 20.10 + Docker Compose 2.17
二、基础环境准备与依赖安装
2.1 服务器初始化配置
使用CentOS 7.9操作系统,执行以下命令完成基础环境配置:
1. 关闭防火墙与SELinux(生产环境请按需配置安全策略):
``` systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config ```2. 安装必要工具:
``` yum install -y wget vim net-tools epel-release ```2.2 Docker与Docker Compose安装
1. 安装Docker:
``` 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-20.10.23 docker-ce-cli-20.10.23 containerd.io systemctl start docker systemctl enable docker ```2. 安装Docker Compose:
``` curl -L "https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose ```三、核心服务容器化部署
3.1 创建项目目录与编排文件
1. 创建项目目录结构:
``` mkdir -p /opt/gz-archive/{mysql,minio,es,mongo,app} cd /opt/gz-archive ```2. 创建docker-compose.yml文件:
``` version: '3.8' services: mysql: image: mysql:8.0 container_name: gz-mysql restart: always environment: MYSQL_ROOT_PASSWORD: YourStrong@Pass123 MYSQL_DATABASE: gz_archive ports: - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d command: --default-authentication-plugin=mysql_native_password minio: image: minio/minio:latest container_name: gz-minio restart: always ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: YourMinioPass123 volumes: - ./minio/data:/data command: server /data --console-address ":9001" elasticsearch: image: elasticsearch:8.5.3 container_name: gz-es restart: always environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - "9200:9200" volumes: - ./es/data:/usr/share/elasticsearch/data mongo: image: mongo:5.0 container_name: gz-mongo restart: always ports: - "27017:27017" volumes: - ./mongo/data:/data/db ```3. 启动基础服务:
``` docker-compose up -d ```3.2 数据库初始化
1. 进入MySQL容器创建业务表:
``` docker exec -it gz-mysql mysql -uroot -pYourStrong@Pass123 ```2. 执行以下SQL创建核心表:
``` USE gz_archive; CREATE TABLE `archive_category` ( `id` bigint NOT NULL AUTO_INCREMENT, `category_name` varchar(100) NOT NULL COMMENT '档案分类名称', `parent_id` bigint DEFAULT '0' COMMENT '父级ID', `sort_order` int DEFAULT '0' COMMENT '排序', `created_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `archive_document` ( `id` bigint NOT NULL AUTO_INCREMENT, `doc_number` varchar(50) NOT NULL COMMENT '档案编号', `title` varchar(500) NOT NULL COMMENT '档案标题', `category_id` bigint NOT NULL COMMENT '分类ID', `keywords` varchar(500) DEFAULT NULL COMMENT '关键词', `storage_path` varchar(1000) NOT NULL COMMENT '文件存储路径', `file_size` bigint DEFAULT '0' COMMENT '文件大小(字节)', `file_type` varchar(50) DEFAULT NULL COMMENT '文件类型', `created_by` varchar(50) DEFAULT NULL COMMENT '创建人', `created_time` datetime DEFAULT CURRENT_TIMESTAMP, `updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_doc_number` (`doc_number`), KEY `idx_category` (`category_id`), KEY `idx_keywords` (`keywords`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```四、后端服务部署与配置
4.1 应用配置文件
在/opt/gz-archive/app目录下创建application.yml:
``` server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://gz-mysql:3306/gz_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: YourStrong@Pass123 data: mongodb: uri: mongodb://gz-mongo:27017/gz_archive elasticsearch: uris: http://gz-es:9200 minio: endpoint: http://gz-minio:9000 accessKey: admin secretKey: YourMinioPass123 bucketName: gz-archive-bucket mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ```4.2 构建Docker镜像并部署
1. 创建Dockerfile:
``` FROM openjdk:11-jre-slim WORKDIR /app COPY gz-archive-backend.jar app.jar COPY application.yml application.yml EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar", "--spring.config.location=application.yml"] ```2. 构建镜像(假设已打包好gz-archive-backend.jar):
``` docker build -t gz-archive-backend:1.0 . ```3. 在docker-compose.yml中添加应用服务:
``` app-backend: image: gz-archive-backend:1.0 container_name: gz-app-backend restart: always ports: - "8080:8080" depends_on: - mysql - minio - elasticsearch - mongo volumes: - ./app/application.yml:/app/application.yml ```4. 重新启动所有服务:
``` docker-compose down docker-compose up -d ```五、前端服务部署
5.1 Nginx配置与部署

1. 创建前端部署目录:
``` mkdir -p /opt/gz-archive/nginx/{conf,html} ```2. 创建nginx.conf:
``` user nginx; worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://gz-app-backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ```3. 在docker-compose.yml中添加Nginx服务:
``` nginx: image: nginx:1.23 container_name: gz-nginx restart: always ports: - "80:80" volumes: - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf - ./dist:/usr/share/nginx/html depends_on: - app-backend ```4. 将Vue项目构建的dist目录复制到/opt/gz-archive/nginx/,并重命名为dist
5. 重启服务:
``` docker-compose restart nginx ```六、系统初始化与测试
6.1 MinIO存储桶创建
1. 访问MinIO控制台:http://服务器IP:9001
2. 使用admin/YourMinioPass123登录
3. 点击"Create Bucket",输入gz-archive-bucket创建存储桶
6.2 系统功能验证
1. 访问系统前端:http://服务器IP
2. 测试档案上传功能:
- 上传PDF文件,观察MinIO控制台文件存储情况
- 检查MySQL中archive_document表记录
- 验证Elasticsearch中是否建立索引:curl http://localhost:9200/gz_archive/_search
3. 测试全文检索功能:
- 在搜索框输入关键词,确认能检索到相关档案
七、运维与监控配置
7.1 日志收集配置
1. 修改docker-compose.yml为所有服务添加日志驱动:
``` services: mysql: ... 其他配置 logging: driver: "json-file" options: max-size: "10m" max-file: "3" ```2. 查看容器日志:
``` docker logs -f gz-app-backend --tail 100 ```7.2 数据备份脚本
创建/opt/gz-archive/backup.sh:
``` !/bin/bash BACKUP_DIR="/opt/gz-archive/backup/$(date +%Y%m%d)" mkdir -p $BACKUP_DIR 备份MySQL docker exec gz-mysql mysqldump -uroot -pYourStrong@Pass123 gz_archive > $BACKUP_DIR/gz_archive.sql 备份MongoDB docker exec gz-mongo mongodump --out $BACKUP_DIR/mongodb/ 备份Elasticsearch索引 curl -X GET "localhost:9200/_snapshot/backup_repository" > $BACKUP_DIR/es_indices.json echo "Backup completed at $(date)" >> $BACKUP_DIR/backup.log ```设置定时任务:
``` crontab -e 添加以下内容,每天凌晨2点执行备份 0 2 /bin/bash /opt/gz-archive/backup.sh ```7.3 服务健康检查
在docker-compose.yml中添加健康检查:
``` services: app-backend: ... 其他配置 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s ```