为了满足海关档案管理的安全性、合规性及长期保存需求,本指南采用轻量级且高可用的技术栈进行构建。系统核心采用 Django 框架提供管理后台,PostgreSQL 作为结构化数据存储,MinIO 作为非结构化文件(电子档案原文)的私有化对象存储服务。所有组件通过 Docker Compose 进行编排,确保一键部署和环境一致性。
在开始操作前,请确保服务器已安装 Docker 和 Docker Compose。以下是基于 CentOS 7/8 或 Ubuntu 20.04+ 的环境准备命令。
执行以下命令安装 Docker:
```bash curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun systemctl start docker systemctl enable docker ```在服务器上创建标准化目录,用于存放配置文件、代码及持久化数据:
```bash mkdir -p /data/customs_archive/{src,data/{postgres,minio},static} cd /data/customs_archive ```本环节将海关档案管理制度中的核心要素转化为代码模型。我们需要创建 Django 应用来定义档案的必填字段、保管期限和密级。
首先创建项目并安装必要的依赖包(数据库驱动及 MinIO 客户端):
```bash docker run --rm -v $(pwd)/src:/app -w /app python:3.9-slim bash -c "pip install django django-minio-storage psycopg2-binary && django-admin startproject config . && python manage.py startapp archives" ```编辑 src/archives/models.py,完整代码如下。该模型严格遵循海关档案分类标准,包含报关单号、进出境标识、密级及保管期限关键字段。
```python from django.db import models from django.contrib.auth.models import User class CustomsArchive(models.Model): """ 海关档案核心数据模型 对应制度:海关档案分类大纲、电子文件归档规范 """ ENTRY_TYPE_CHOICES = [ ('import', '进口'), ('export', '出口'), ('transit', '过境'), ] SECURITY_LEVEL_CHOICES = [ ('public', '公开'), ('internal', '内部'), ('secret', '机密'), ('confidential', '绝密'), ] RETENTION_PERIOD_CHOICES = [ ('10', '10年'), ('30', '30年'), ('permanent', '永久'), ] 基础信息 archive_id = models.CharField("档案编号", max_length=50, unique=True, primary_key=True) title = models.CharField("题名", max_length=200) entry_type = models.CharField("进出境类型", max_length=10, choices=ENTRY_TYPE_CHOICES) customs_declare_no = models.CharField("报关单号", max_length=50, db_index=True) 归属与责任 department = models.CharField("归档部门", max_length=100) creator = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="创建人") 安全与期限 security_level = models.CharField("密级", max_length=20, choices=SECURITY_LEVEL_CHOICES, default='internal') retention_period = models.CharField("保管期限", max_length=20, choices=RETENTION_PERIOD_CHOICES) 文件存储 file_path = models.CharField("文件存储路径", max_length=255, blank=True) file_size = models.BigIntegerField("文件大小(字节)", default=0) file_hash = models.CharField("文件校验码(SHA256)", max_length=64, blank=True) 审计字段 created_at = models.DateTimeField("归档时间", auto_now_add=True) updated_at = models.DateTimeField("修改时间", auto_now=True) class Meta: db_table = 'customs_archives' verbose_name = "海关档案" verbose_name_plural = "海关档案" ordering = ['-created_at'] def __str__(self): return f"{self.archive_id} - {self.title}" ```编辑 src/archives/admin.py,配置后台展示列和搜索功能,方便海关工作人员快速检索:
```python from django.contrib import admin from .models import CustomsArchive @admin.register(CustomsArchive) class CustomsArchiveAdmin(admin.ModelAdmin): list_display = ('archive_id', 'title', 'customs_declare_no', 'entry_type', 'security_level', 'created_at') search_fields = ('archive_id', 'customs_declare_no', 'title') list_filter = ('entry_type', 'security_level', 'retention_period', 'department') readonly_fields = ('created_at', 'updated_at', 'file_hash') ```
为了实现档案文件的分布式存储和高可用性,我们配置 MinIO 作为后端存储,并修改 Django 设置以对接 MinIO。
编辑 src/config/settings.py,在文件末尾添加以下存储配置。注意:MINIO_ENDPOINT 将在 Docker Compose 中通过服务名解析。
```python ... 其他设置保持不变 ... import os MinIO 对象存储配置 USE_MINIO = True if USE_MINIO: MINIO_ENDPOINT = os.environ.get('MINIO_ENDPOINT', 'minio:9000') MINIO_ACCESS_KEY = os.environ.get('MINIO_ROOT_USER', 'admin') MINIO_SECRET_KEY = os.environ.get('MINIO_ROOT_PASSWORD', 'admin123456') MINIO_USE_HTTPS = False MINIO_MEDIA_BUCKET_NAME = 'customs-docs' 默认文件存储引擎配置 DEFAULT_FILE_STORAGE = 'minio_storage.storage.MinioMediaStorage' 静态文件收集配置 STATIC_ROOT = '/app/static' 允许的主机 ALLOWED_HOSTS = [''] 数据库配置(从环境变量读取,适配 Docker Compose) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('POSTGRES_DB', 'customs_db'), 'USER': os.environ.get('POSTGRES_USER', 'customs_user'), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD', 'customs_pass'), 'HOST': os.environ.get('POSTGRES_HOST', 'db'), 'PORT': '5432', } } ```这是落地的关键步骤。我们将编写 docker-compose.yml 文件和 Dockerfile,将数据库、对象存储和 Web 服务串联起来。
在 /data/customs_archive 目录下创建 Dockerfile:
```dockerfile FROM python:3.9-slim WORKDIR /app 安装系统依赖 RUN apt-get update && apt-get install -y \ gcc \ postgresql-client \ && rm -rf /var/lib/apt/lists/ 复制依赖文件并安装(为了演示方便,直接安装 requirements) RUN pip install --no-cache-dir django==4.2 django-minio-storage psycopg2-binary gunicorn 复制项目代码 COPY src/ /app/ 暴露端口 EXPOSE 8000 启动脚本:迁移数据库并启动服务 CMD bash -c "python manage.py migrate && python manage.py createsuperuser --noinput --username admin --email admin@customs.gov || true && gunicorn config.wsgi:application -b 0.0.0.0:8000" ```在 /data/customs_archive 目录下创建 docker-compose.yml。该文件定义了三个服务:Web、PostgreSQL 和 MinIO。
```yaml version: '3.8' services: db: image: postgres:15-alpine volumes: - ./data/postgres:/var/lib/postgresql/data environment: POSTGRES_DB: customs_db POSTGRES_USER: customs_user POSTGRES_PASSWORD: customs_pass restart: always minio: image: minio/minio:latest command: server /data --console-address ":9001" volumes: - ./data/minio:/data environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: admin123456 ports: - "9000:9000" - "9001:9001" restart: always web: build: . volumes: - ./src:/app - ./static:/app/static environment: POSTGRES_HOST: db POSTGRES_DB: customs_db POSTGRES_USER: customs_user POSTGRES_PASSWORD: customs_pass MINIO_ENDPOINT: minio:9000 MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: admin123456 ports: - "8000:8000" depends_on: - db - minio restart: always ```配置完成后,执行以下命令启动系统。这将自动拉取镜像、构建容器、初始化数据库表结构并启动服务。
系统启动后,需要手动在 MinIO 中创建一个 Bucket 用于存放档案文件。我们可以使用 MinIO Client (mc) 或直接访问控制台操作。这里使用命令行快速创建:
```bash 配置 mc 客户端别名 docker run --rm --network customs_archive_default minio/mc alias set myminio http://minio:9000 admin admin123456 创建存储桶 docker run --rm --network customs_archive_default minio/mc mb myminio/customs-docs 设置存储桶策略为私有(符合海关保密要求) docker run --rm --network customs_archive_default minio/mc policy set download myminio/customs-docs ``>执行重启命令,验证数据是否丢失:
```bash docker-compose restart ``>重启完成后,再次访问后台,确认刚才录入的 ARCH-2023-001 档案依然存在,且所有字段完整无误。至此,一套符合海关档案制度基础的数字化归档系统已成功落地。
档案整理行业认证,这玩意儿到底是不是你的职场“硬通货”?