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

用MinIO+定时计费脚本搭建数字档案馆系统按存储用后付费原型

发布时间:2026年09月19日 12:00:24 浏览量:0

前置准备

本次搭建使用Ubuntu 22.04 LTS(云服务器或本地虚拟机均可,配置1核2G起),所有操作基于命令行,先完成以下3项基础依赖配置

安装Node.js 18.x LTS

复制以下命令一键安装:

```bash curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs ```

验证安装:

```bash node -v npm -v ```

若输出版本号(Node 18.x.x、npm 9.x.x),则安装成功。

安装MinIO

复制以下命令下载并安装对应版本的MinIO Server:

```bash wget https://dl.min.io/server/minio/release/linux-amd64/minio_20240528171904.0.0_amd64.deb sudo dpkg -i minio_20240528171904.0.0_amd64.deb ```

创建存储目录(数字档案馆文件默认存这里):

```bash sudo mkdir -p /data/archive ```

配置MinIO的用户名(ACCESS_KEY)、密码(SECRET_KEY)、访问端口:

```bash sudo nano /etc/default/minio ```

在打开的文件末尾粘贴完整配置,修改ACCESS_KEY和SECRET_KEY为自己的强密码(长度≥8位,含字母+数字+符号):

``` MINIO_ROOT_USER=your_archive_access_key MINIO_ROOT_PASSWORD=your_archive_secret_key MINIO_VOLUMES="/data/archive" MINIO_OPTS="--address :9000 --console-address :9001" ```

按Ctrl+O保存,Ctrl+X退出nano,然后启动MinIO并设置开机自启:

```bash sudo systemctl enable --now minio sudo systemctl status minio ```

浏览器访问`http://你的服务器IP:9001`,用配置的用户名密码登录,进入MinIO控制台。

MinIO数字档案馆基础配置

创建专属存储桶

在MinIO控制台点击左侧「Buckets」→「Create Bucket」,填写以下信息:

点击「Create Bucket」完成创建。

生成上传/下载/统计权限的API密钥

点击左侧「Access Keys」→「Create Access Key」,记住弹出的ACCESS_KEY和SECRET_KEY(仅显示一次),点击「Download for import」保存备用,关闭弹窗。

按存储用后付费核心模块开发

创建Node.js项目目录与依赖

执行以下命令创建项目并安装依赖:

```bash mkdir -p ~/archive-billing && cd ~/archive-billing npm init -y npm install minio dayjs csv-writer ```

用MinIO+定时计费脚本搭建数字档案馆系统按存储用后付费原型

依赖说明:minio是MinIO官方Node.js SDK,dayjs处理日期,csv-writer生成CSV账单。

文件上传测试脚本(非必要但用于验证)

创建`upload-test.js`:

```bash nano ~/archive-billing/upload-test.js ```

粘贴完整可复制代码,替换对应部分为你的配置:

```javascript const Minio = require('minio'); const fs = require('fs'); const path = require('path'); // 配置MinIO客户端 const minioClient = new Minio.Client({ endPoint: '你的服务器IP', port: 9000, useSSL: false, // 云服务器建议绑定域名后开启,本地/内网测试关闭 accessKey: '刚才生成的专属API密钥的ACCESS_KEY', secretKey: '刚才生成的专属API密钥的SECRET_KEY' }); // 测试文件内容 const testContent = '数字档案馆测试文件,用于验证存储计费'; const testFileName = `test-archive-${Date.now()}.txt`; const testFilePath = path.join(__dirname, testFileName); // 写入测试文件 fs.writeFileSync(testFilePath, testContent); // 上传到MinIO minioClient.fPutObject('archive-files', testFileName, testFilePath, (err, etag) => { if (err) return console.error('上传失败:', err); console.log('上传成功,ETag:', etag); // 删除本地临时测试文件 fs.unlinkSync(testFilePath); }); ```

按Ctrl+O、Ctrl+X保存退出,执行测试:

```bash node ~/archive-billing/upload-test.js ```

若显示「上传成功」,可在MinIO控制台「Buckets」→「archive-files」中看到文件。

存储统计与CSV账单生成脚本

创建`billing-script.js`:

```bash nano ~/archive-billing/billing-script.js ```

粘贴完整可复制代码,替换配置部分,同时设置存储单价(示例为0.001元/GB/小时,可自行调整):

```javascript const Minio = require('minio'); const dayjs = require('dayjs'); const createCsvWriter = require('csv-writer').createObjectCsvWriter; const path = require('path'); // 配置MinIO客户端 const minioClient = new Minio.Client({ endPoint: '你的服务器IP', port: 9000, useSSL: false, accessKey: '刚才生成的专属API密钥的ACCESS_KEY', secretKey: '刚才生成的专属API密钥的SECRET_KEY' }); // 核心配置:可修改 const BUCKET_NAME = 'archive-files'; const PRICE_PER_GB_HOUR = 0.001; // 存储单价:0.001元/GB/小时 const BILLING_DIR = path.join(__dirname, 'bills'); // 账单保存目录 const TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'; const FILENAME_FORMAT = 'YYYY-MM-DD_HH-mm-ss'; // 确保账单目录存在 const fs = require('fs'); if (!fs.existsSync(BILLING_DIR)) fs.mkdirSync(BILLING_DIR); // 统计存储桶总容量(字节) async function getTotalStorage() { let totalBytes = 0; const stream = minioClient.listObjects(BUCKET_NAME, '', true); for await (const obj of stream) { totalBytes += obj.size; } return totalBytes; } // 生成账单 async function generateBill() { try { const now = dayjs(); const lastHourStart = now.subtract(1, 'hour').startOf('hour'); const lastHourEnd = now.startOf('hour'); const totalBytes = await getTotalStorage(); const totalGB = totalBytes / (1024 3); const totalCost = totalGB PRICE_PER_GB_HOUR; // 账单数据 const billData = [{ billingPeriodStart: lastHourStart.format(TIME_FORMAT), billingPeriodEnd: lastHourEnd.format(TIME_FORMAT), totalStorageBytes: totalBytes, totalStorageGB: totalGB.toFixed(6), pricePerGBHour: PRICE_PER_GB_HOUR.toFixed(6), totalCost: totalCost.toFixed(4) }]; // CSV写入器配置 const csvWriter = createCsvWriter({ path: path.join(BILLING_DIR, `bill-${lastHourEnd.format(FILENAME_FORMAT)}.csv`), header: [ { id: 'billingPeriodStart', title: '计费周期开始时间' }, { id: 'billingPeriodEnd', title: '计费周期结束时间' }, { id: 'totalStorageBytes', title: '总存储字节数' }, { id: 'totalStorageGB', title: '总存储GB数' }, { id: 'pricePerGBHour', title: '单价(元/GB/小时)' }, { id: 'totalCost', title: '本期费用(元)' } ] }); // 写入账单 await csvWriter.writeRecords(billData); console.log(`账单生成成功:bill-${lastHourEnd.format(FILENAME_FORMAT)}.csv`); } catch (err) { console.error('账单生成失败:', err); } } // 执行主函数 generateBill(); ```

按Ctrl+O、Ctrl+X保存退出,手动测试生成一次账单:

```bash node ~/archive-billing/billing-script.js ```

执行后会在`~/archive-billing/bills`目录下生成CSV文件,打开可查看测试账单。

设置定时计费任务

使用Linux自带的Crontab每小时触发一次账单生成,执行:

```bash crontab -e ```

首次打开会让你选择编辑器,输入数字2选nano(最常用),在文件末尾粘贴完整定时任务

``` 0 /usr/bin/node ~/archive-billing/billing-script.js >> ~/archive-billing/billing.log 2>&1 ```

说明:每小时第0分钟执行脚本,标准输出和错误都写入`billing.log`日志文件,方便排查问题。

按Ctrl+O、Ctrl+X保存退出,验证定时任务是否生效:

```bash crontab -l ```

若显示刚才添加的任务,则设置成功。

落地后注意事项

微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818