Skip to content

Latest commit

 

History

History
322 lines (319 loc) · 9.01 KB

File metadata and controls

322 lines (319 loc) · 9.01 KB

diff --git a/.gitignore b/.gitignore index 1b1ae84..c028921 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ pids *.pid *.seed .pid.lock +.py

Directory for instrumented libs generated by jscoverage/JSCover

lib-cov diff --git a/README.md b/README.md index 7c398c9..610a2e3 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,61 @@ docker stop mineru-api docker rm mineru-api


+### 使用 Docker Compose(更简单)
+
+项目提供了 `docker-compose.yml` 文件,可以更方便地管理容器:
+
+```bash
+# 1. 克隆项目
+git clone <repository-url>
+cd mineru-api
+
+# 2. 配置认证token
+# 编辑 config.json 文件,替换其中的 authToken
+
+# 3. 修改 docker-compose.yml 中的挂载路径(可选)
+# 默认挂载路径为 /root/mineru/,根据实际情况修改
+
+# 4. 构建并启动服务
+docker-compose up -d --build
+
+# 5. 查看日志
+docker-compose logs -f
+
+# 6. 停止服务
+docker-compose down
+```
+
+**docker-compose.yml 配置说明**:
+
+```yaml
+version: '3.8'
+
+services:
+  mineru-api:
+    container_name: mineru-api
+    build:
+      context: .
+      dockerfile: Dockerfile
+    image: mineru-api
+    ports:
+      - "8000:8000"
+    volumes:
+      - /root/mineru/config.json:/app/config.json  # 配置文件挂载
+      - /root/mineru/output:/app/output            # 输出目录挂载
+    restart: unless-stopped
+```
+
+**自定义配置**:
+
+根据实际部署环境,修改 `volumes` 中的挂载路径:
+
+```yaml
+volumes:
+  - ./config.json:/app/config.json      # 使用当前目录的配置文件
+  - ./output:/app/output                # 使用当前目录的输出目录
+```
+
### 健康检查

容器启动后,可以通过以下命令检查服务状态:
@@ -185,7 +240,6 @@ POST /api/convert
  "is_ocr": false,           // 是否启用OCR(图片推荐true)
  "enable_formula": true,    // 是否识别数学公式
  "enable_table": true,      // 是否识别表格
-  "language": "zh-CN",       // 语言设置
  "is_chem": false          // 是否为化学文档
}

diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0cde96d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.8' + +services:

  • mineru-api:
  • 指定容器名称,对应 --name mineru-api

  • container_name: mineru-api
  • 构建上下文,假设 Dockerfile 在当前目录

  • build:
  •  context: .
    
  •  dockerfile: Dockerfile
    
  • 镜像名称

  • image: mineru-api
  • 端口映射,对应 -p 8000:8000

  • ports:
  •  - "8000:8000"
    
  • 挂载卷,对应 -v 选项

  • volumes:
  •  - /root/mineru/config.json:/app/config.json
    
  •  - /root/mineru/output:/app/output
    
  • 重启策略,对应 --restart unless-stopped

  • restart: unless-stopped diff --git a/examples/test-api.js b/examples/test-api.js deleted file mode 100644 index becec73..0000000 --- a/examples/test-api.js +++ /dev/null @@ -1,198 +0,0 @@ -/**
    • MinerU API Server 测试脚本
    • 演示如何使用 API 接口进行文档转换
  • */

-const axios = require('axios'); -const FormData = require('form-data'); -const fs = require('fs'); -const path = require('path');

-// API 服务器地址 -const API_BASE_URL = process.env.API_BASE_URL || 'http://localhost:3000';

-/**

    • 测试健康检查接口
  • */ -async function testHealthCheck() {
  • try {
  •    console.log('🔍 测试健康检查接口...');
    
  •    const response = await axios.get(`${API_BASE_URL}/health`);
    
  •    console.log('✅ 健康检查成功:', response.data);
    
  •    return true;
    
  • } catch (error) {
  •    console.error('❌ 健康检查失败:', error.message);
    
  •    return false;
    
  • } -}

-/**

    • 测试支持的文件类型接口
  • */ -async function testSupportedTypes() {
  • try {
  •    console.log('\n🔍 测试支持的文件类型接口...');
    
  •    const response = await axios.get(`${API_BASE_URL}/api/supported-types`);
    
  •    console.log('✅ 支持的文件类型:', response.data.data.description);
    
  •    console.log('📋 文件扩展名:', response.data.data.extensions.join(', '));
    
  •    return true;
    
  • } catch (error) {
  •    console.error('❌ 获取支持的文件类型失败:', error.message);
    
  •    return false;
    
  • } -}

-/**

    • 测试文档转换接口
    • @param {string} filePath - 测试文件路径
    • @param {object} options - 转换选项
  • */ -async function testConvertDocument(filePath, options = {}) {
  • try {
  •    // 检查文件是否存在
    
  •    if (!fs.existsSync(filePath)) {
    
  •        console.error(`❌ 测试文件不存在: ${filePath}`);
    
  •        return false;
    
  •    }
    
  •    console.log(`\n🔍 测试文档转换: ${path.basename(filePath)}`);
    
  •    // 创建表单数据
    
  •    const formData = new FormData();
    
  •    formData.append('file', fs.createReadStream(filePath));
    
  •    // 添加转换选项
    
  •    if (Object.keys(options).length > 0) {
    
  •        formData.append('options', JSON.stringify(options));
    
  •    }
    
  •    // 发送请求
    
  •    const response = await axios.post(`${API_BASE_URL}/api/convert`, formData, {
    
  •        headers: {
    
  •            ...formData.getHeaders()
    
  •        },
    
  •        timeout: 1800000, // 30分钟超时
    
  •        maxContentLength: 100 * 1024 * 1024, // 100MB
    
  •        maxBodyLength: 100 * 1024 * 1024
    
  •    });
    
  •    if (response.data.success) {
    
  •        console.log('✅ 文档转换成功!');
    
  •        console.log(`📄 文件名: ${response.data.data.filename}`);
    
  •        console.log(`📋 文件类型: ${response.data.data.fileType}`);
    
  •        console.log(`🆔 任务ID: ${response.data.data.taskId}`);
    
  •        console.log(`🔗 Markdown链接: ${response.data.data.markdownUrl}`);
    
  •        if (response.data.data.layoutUrl) {
    
  •            console.log(`📐 布局文件: ${response.data.data.layoutUrl}`);
    
  •        }
    
  •        if (response.data.data.markdownContent) {
    
  •            console.log(`📝 Markdown内容长度: ${response.data.data.markdownContent.length} 字符`);
    
  •        }
    
  •        return true;
    
  •    } else {
    
  •        console.error('❌ 文档转换失败:', response.data.message);
    
  •        return false;
    
  •    }
    
  • } catch (error) {
  •    console.error('❌ 文档转换请求失败:', error.message);
    
  •    if (error.response) {
    
  •        console.error('响应状态:', error.response.status);
    
  •        console.error('响应数据:', error.response.data);
    
  •    }
    
  •    return false;
    
  • } -}

-/**

    • 主测试函数
  • */ -async function runTests() {
  • console.log('🚀 开始 MinerU API Server 测试...\n');
  • let passedTests = 0;
  • let totalTests = 0;
  • // 测试1: 健康检查
  • totalTests++;
  • if (await testHealthCheck()) {
  •    passedTests++;
    
  • }
  • // 测试2: 支持的文件类型
  • totalTests++;
  • if (await testSupportedTypes()) {
  •    passedTests++;
    
  • }
  • // 测试3: 文档转换 - PDF
  • const testFiles = [
  •    // 在这里添加你的测试文件路径
    
  •    '../mineru/111.pdf',
    
  •    '../mineru/111.docx',
    
  •    '../mineru/111.png'
    
  • ];
  • for (const filePath of testFiles) {
  •    const fullPath = path.resolve(__dirname, filePath);
    
  •    if (fs.existsSync(fullPath)) {
    
  •        totalTests++;
    
  •        // 根据文件类型设置不同的转换选项
    
  •        let options = {};
    
  •        const ext = path.extname(fullPath).toLowerCase();
    
  •        if (['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp'].includes(ext)) {
    
  •            // 图片文件启用 OCR
    
  •            options = {
    
  •                is_ocr: true,
    
  •                enable_formula: true,
    
  •                enable_table: true
    
  •            };
    
  •        } else {
    
  •            // 文档文件
    
  •            options = {
    
  •                is_ocr: false,
    
  •                enable_formula: true,
    
  •                enable_table: true,
    
  •                language: 'zh-CN'
    
  •            };
    
  •        }
    
  •        if (await testConvertDocument(fullPath, options)) {
    
  •            passedTests++;
    
  •        }
    
  •    } else {
    
  •        console.log(`⚠️ 跳过测试文件(不存在): ${filePath}`);
    
  •    }
    
  • }
  • // 输出测试结果
  • console.log(\n📊 测试完成: ${passedTests}/${totalTests} 通过);
  • if (passedTests === totalTests) {
  •    console.log('🎉 所有测试通过!');
    
  •    process.exit(0);
    
  • } else {
  •    console.log('❌ 部分测试失败');
    
  •    process.exit(1);
    
  • } -}

-// 如果直接运行此脚本 -if (require.main === module) {

  • runTests().catch(error => {
  •    console.error('❌ 测试过程中发生错误:', error);
    
  •    process.exit(1);
    
  • }); -}

-module.exports = {

  • testHealthCheck,
  • testSupportedTypes,
  • testConvertDocument,
  • runTests -};