网站首页/ 信息中心/ 档案百科/

学校数字档案馆系统:从零到一搭建实操指南

发布时间:2026年09月13日 00:55:29 浏览量:0

一、系统架构与核心组件

学校数字档案馆系统采用微服务架构,核心组件包括文件存储服务、元数据管理服务、检索服务和Web管理界面。系统整体架构如下图所示:

二、环境准备与依赖安装

2.1 服务器环境要求

操作系统:Ubuntu 22.04 LTS

内存:最低8GB,推荐16GB

存储:根据档案数量确定,建议使用SSD存储

2.2 安装Docker和Docker Compose

执行以下命令安装Docker:

``` curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER ```

安装Docker Compose:

``` sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ```

三、核心服务部署

3.1 创建项目目录结构

创建以下目录结构:

``` mkdir -p school-archive/{config,data,logs,backup} cd school-archive ```

3.2 配置Docker Compose文件

创建docker-compose.yml文件:

``` version: '3.8' services: postgres: image: postgres:15-alpine environment: POSTGRES_DB: school_archive POSTGRES_USER: archive_admin POSTGRES_PASSWORD: YourSecurePassword123! volumes: - ./data/postgres:/var/lib/postgresql/data ports: - "5432:5432" minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin123 volumes: - ./data/minio:/data ports: - "9000:9000" - "9001:9001" elasticsearch: image: elasticsearch:8.10.0 environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - ./data/elasticsearch:/usr/share/elasticsearch/data ports: - "9200:9200" archive-service: build: ./archive-service depends_on: - postgres - minio - elasticsearch environment: DATABASE_URL: postgresql://archive_admin:YourSecurePassword123!@postgres:5432/school_archive MINIO_ENDPOINT: minio:9000 MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin123 ports: - "8080:8080" volumes: - ./logs:/app/logs ```

3.3 创建档案服务应用

创建archive-service目录和Dockerfile:

``` mkdir archive-service cd archive-service ```

创建Dockerfile:

``` FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"] ```

3.4 编写核心应用代码

创建requirements.txt:

``` fastapi==0.104.1 uvicorn==0.24.0 sqlalchemy==2.0.23 psycopg2-binary==2.9.9 minio==7.2.1 elasticsearch==8.11.0 python-multipart==0.0.6 ```

创建main.py文件:

``` from fastapi import FastAPI, UploadFile, File, HTTPException from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from datetime import datetime from minio import Minio from minio.error import S3Error import elasticsearch import uuid import os app = FastAPI() 数据库配置 DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://archive_admin:YourSecurePassword123!@localhost:5432/school_archive") engine = create_engine(DATABASE_URL) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() MinIO配置 minio_client = Minio( os.getenv("MINIO_ENDPOINT", "localhost:9000"), access_key=os.getenv("MINIO_ACCESS_KEY", "minioadmin"), secret_key=os.getenv("MINIO_SECRET_KEY", "minioadmin123"), secure=False ) Elasticsearch配置 es = elasticsearch.Elasticsearch( os.getenv("ELASTICSEARCH_HOST", "http://localhost:9200") ) 数据模型 class ArchiveDocument(Base): __tablename__ = "archive_documents" id = Column(Integer, primary_key=True, index=True) document_id = Column(String, unique=True, index=True) title = Column(String, nullable=False) description = Column(Text) file_name = Column(String) file_size = Column(Integer) mime_type = Column(String) department = Column(String) category = Column(String) academic_year = Column(String) upload_time = Column(DateTime, default=datetime.utcnow) uploader = Column(String) 创建数据库表 Base.metadata.create_all(bind=engine) @app.post("/upload/") async def upload_document( file: UploadFile = File(...), title: str = "", department: str = "", category: str = "", academic_year: str = "", uploader: str = "" ): try: 生成唯一文档ID document_id = str(uuid.uuid4()) 保存文件到MinIO bucket_name = "school-archive" if not minio_client.bucket_exists(bucket_name): minio_client.make_bucket(bucket_name) file_content = await file.read() file_size = len(file_content) minio_client.put_object( bucket_name, f"{document_id}/{file.filename}", file.file, file_size, content_type=file.content_type ) 保存元数据到数据库 db = SessionLocal() db_document = ArchiveDocument( document_id=document_id, title=title or file.filename, description="", file_name=file.filename, file_size=file_size, mime_type=file.content_type, department=department, category=category, academic_year=academic_year, uploader=uploader ) db.add(db_document) db.commit() db.refresh(db_document) 索引到Elasticsearch es.index( index="archive_documents", id=document_id, document={ "title": title or file.filename, "description": "", "department": department, "category": category, "academic_year": academic_year, "content": "" 实际应用中需要提取文本内容 } ) return {"document_id": document_id, "message": "上传成功"} except S3Error as e: raise HTTPException(status_code=500, detail=f"存储服务错误: {str(e)}") except Exception as e: raise HTTPException(status_code=500, detail=f"上传失败: {str(e)}") finally: db.close() @app.get("/search/") async def search_documents(query: str, department: str = None): try: Elasticsearch搜索 search_body = { "query": { "bool": { "must": [ {"multi_match": { "query": query, "fields": ["title^2", "description", "content"] }} ] } } } if department: search_body["query"]["bool"]["filter"] = [ {"term": {"department": department}} ] response = es.search(index="archive_documents", body=search_body) results = [] for hit in response["hits"]["hits"]: results.append({ "document_id": hit["_id"], "title": hit["_source"]["title"], "department": hit["_source"]["department"], "score": hit["_score"] }) return {"results": results} except Exception as e: raise HTTPException(status_code=500, detail=f"搜索失败: {str(e)}") if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8080) ```

四、系统初始化与配置

4.1 启动所有服务

在项目根目录执行:

``` docker-compose up -d ```

学校数字档案馆系统:从零到一搭建实操指南

等待所有容器启动完成,使用以下命令检查服务状态:

``` docker-compose ps ```

4.2 创建MinIO存储桶

访问MinIO管理界面:http://服务器IP:9001

使用账号minioadmin,密码minioadmin123登录

点击"Create Bucket",输入bucket名称:school-archive

4.3 初始化数据库表

应用启动时会自动创建数据库表,可以通过以下命令验证:

``` docker-compose exec postgres psql -U archive_admin -d school_archive -c "\dt" ```

五、Web管理界面部署

5.1 创建前端项目

创建frontend目录:

``` mkdir frontend cd frontend ```

创建index.html:

``` 学校数字档案馆
学校数字档案馆系统

上传档案

搜索档案

```

六、系统配置与优化

6.1 配置Nginx反向代理

安装Nginx:

``` sudo apt update sudo apt install nginx ```

创建配置文件/etc/nginx/sites-available/school-archive:

``` server { listen 80; server_name 你的域名或IP; 前端静态文件 location / { root /path/to/school-archive/frontend; index index.html; try_files $uri $uri/ =404; } API反向代理 location /api/ { proxy_pass http://localhost:808
2024益阳档案培训推荐:懂这些能少跑10趟政务窗口
2024益阳档案培训推荐:懂这些能少跑10趟政务窗口
最近不少益阳本地做行政、管企业档案的朋友找我吐槽:档案整理不懂规范,跑政务窗口补材料都要排队好几天,遇到资质审核还得反复返工。其实找对益阳档案培训,把实操细节摸透,能少走好多弯路。这次结合身边同事参加...
2026年09月13日 00:55:29
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818