政府数字档案馆对系统的稳定性和安全性要求极高,我们采用Linux CentOS 7作为基础操作系统,并使用Docker进行容器化部署,以确保环境的一致性和易于维护。执行以下命令完成系统基础环境的配置。
1. 安装Docker及Docker Compose
使用以下脚本一键安装Docker,该脚本适用于CentOS 7系统,会自动处理依赖关系:
```bash curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun systemctl start docker systemctl enable docker ```接着安装Docker Compose编排工具,这是后续一键启动所有服务的关键:
```bash sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version ```2. 系统内核参数优化
为了支持高并发文件上传下载,需修改系统内核参数。编辑/etc/sysctl.conf文件,添加以下内容:
```bash fs.file-max = 2097152 fs.inotify.max_user_instances = 8192 fs.inotify.max_user_watches = 524288 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 ```执行命令使配置生效:
```bash sysctl -p ```数字档案馆的核心是非结构化数据(电子档案原文)的存储。MinIO是一款高性能的分布式对象存储服务,完全兼容S3接口,非常适合作为归档系统的存储底座。
1. 创建数据持久化目录
```bash mkdir -p /data/archives/minio/data ```2. 编写MinIO部署配置
创建docker-compose.yml文件,加入MinIO服务定义。注意控制台端口设为9001,API端口设为9000。
```yaml version: '3.8' services: minio: image: minio/minio:latest container_name: gov-archive-minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: govadmin MINIO_ROOT_PASSWORD: GovArchive@2024Secure volumes: - /data/archives/minio/data:/data command: server /data --console-address ":9001" restart: always ```3. 启动服务并初始化Bucket
执行启动命令:
```bash docker-compose up -d minio ```服务启动后,需要创建一个专门用于存放永久档案的存储桶。我们可以使用MinIO的Client工具(mc)进行操作。首先配置mc别名:
```bash docker run --rm -it --entrypoint=/bin/sh minio/mc mc alias set local http://<你的服务器IP>:9000 govadmin GovArchive@2024Secure ```创建名为permanent-archives的桶,并开启版本控制以防止误删:
```bash mc mb local/permanent-archives mc version enable local/permanent-archives ```档案的题名、文号、责任者、归档时间等结构化数据需要关系型数据库进行管理。PostgreSQL以其强大的ACID特性和JSON支持,成为首选。
1. 持久化目录创建
```bash mkdir -p /data/archives/postgres/data ```2. 扩展docker-compose.yml
在之前的docker-compose.yml文件中追加PostgreSQL服务:
```yaml postgres: image: postgres:15-alpine container_name: gov-archive-db ports: - "5432:5432" environment: POSTGRES_DB: archive_db POSTGRES_USER: archive_user POSTGRES_PASSWORD: ArchivePass@Secure volumes: - /data/archives/postgres/data:/var/lib/postgresql/data - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql restart: always ```
3. 初始化数据库表结构
在docker-compose.yml同级目录下创建init-db.sql文件,写入以下建表语句。该表包含档案基本信息及存储对象ID的关联:
```sql CREATE TABLE IF NOT EXISTS t_archive_record ( id BIGSERIAL PRIMARY KEY, archive_code VARCHAR(50) NOT NULL UNIQUE, -- 档案编号 title VARCHAR(255) NOT NULL, -- 题名 org_name VARCHAR(100), -- 立档单位 create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, security_level VARCHAR(20), -- 密级 file_size BIGINT, -- 文件大小 object_key VARCHAR(255), -- 对应MinIO中的对象Key retention_period INT DEFAULT -1 -- 保管期限,-1代表永久 ); -- 创建索引以加速检索 CREATE INDEX idx_archive_code ON t_archive_record(archive_code); CREATE INDEX idx_create_time ON t_archive_record(create_time); ```执行更新命令启动数据库:
```bash docker-compose up -d postgres ```本节演示如何通过Java代码实现档案的“归档”动作,即同时将文件存入MinIO并将元数据存入PostgreSQL。假设使用Spring Boot框架。
1. Maven依赖
在pom.xml中添加MinIO和PostgreSQL的驱动依赖:
```xml2. 配置文件
在application.yml中配置连接信息:
```yaml spring: datasource: url: jdbc:postgresql://localhost:5432/archive_db username: archive_user password: ArchivePass@Secure driver-class-name: org.postgresql.Driver minio: endpoint: http://localhost:9000 access-key: govadmin secret-key: GovArchive@2024Secure bucket-name: permanent-archives ```3. 归档服务核心代码
创建ArchiveService.java,实现文件上传与数据库事务的一致性处理:
```java import io.minio.MinioClient; import io.minio.PutObjectArgs; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.time.LocalDateTime; import java.util.UUID; @Service public class ArchiveService { @Autowired private JdbcTemplate jdbcTemplate; private final MinioClient minioClient; public ArchiveService() { this.minioClient = MinioClient.builder() .endpoint("http://localhost:9000") .credentials("govadmin", "GovArchive@2024Secure") .build(); } @Transactional(rollbackFor = Exception.class) public void archiveDocument(MultipartFile file, String title, String orgName, String securityLevel) throws Exception { // 1. 生成唯一的档案编号和对象存储Key String archiveCode = "ARC-" + System.currentTimeMillis() + "-" + UUID.randomUUID().toString().substring(0, 8); String objectKey = "2024/" + archiveCode + "/" + file.getOriginalFilename(); // 2. 上传文件到MinIO try (InputStream inputStream = file.getInputStream()) { minioClient.putObject( PutObjectArgs.builder() .bucket("permanent-archives") .object(objectKey) .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build() ); } // 3. 插入元数据到PostgreSQL String sql = "INSERT INTO t_archive_record (archive_code, title, org_name, security_level, file_size, object_key, create_time) VALUES (?, ?, ?, ?, ?, ?, ?)"; jdbcTemplate.update(sql, archiveCode, title, orgName, securityLevel, file.getSize(), objectKey, LocalDateTime.now() ); } } ```这段代码确保了:如果数据库插入失败,文件上传的事务也会回滚;如果文件上传失败,数据库操作不会执行。这是数字档案馆数据一致性的关键。
政府系统必须通过HTTPS协议对外提供服务,并限制非授权IP的访问。我们使用Nginx作为反向代理。
1. 生成自签名SSL证书
生产环境请替换为正式机构颁发的CA证书。此处生成测试用证书:
```bash mkdir -p /data/archives/nginx/cert openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /data/archives/nginx/cert/gov.key \ -out /data/archives/nginx/cert/gov.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=GovArchive/OU=IT/CN=localhost" ```2. 配置Nginx
创建/data/archives/nginx/nginx.conf文件:
```nginx events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 443 ssl; server_name localhost; ssl_certificate /etc/nginx/cert/gov.crt; ssl_certificate_key /etc/nginx/cert/gov.key; 安全头设置 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "SAMEORIGIN" always; 代理MinIO控制台 location /minio-console/ { proxy_pass http://localhost:9001/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; } 代理后端归档API location /api/ { proxy_pass http://localhost:8080/; 假设Spring Boot运行在8080 proxy_set_header Host $http_host; 仅允许内网IP访问(示例配置) allow 192.168.1.0/24; deny all; } } } ```3. 启动Nginx容器
在docker-compose.yml中追加Nginx服务:
```yaml nginx: image: nginx:alpine container_name: gov-archive-gateway ports: - "443:443" volumes: - /data/archives/nginx/nginx.conf:/etc/nginx/nginx.conf - /data/archives/nginx/cert:/etc/nginx/cert depends_on: - minio restart: always ```启动整个系统栈:
```bash docker-compose up -d ```此时,你可以通过https://服务器IP/minio-console访问存储管理界面,通过https://服务器IP/api调用归档接口。至此,一套符合政府数字档案馆标准的底层存储与归档系统已搭建完成。