exflower-license-server 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +19 -1
  2. package/db.js +23 -1
  3. package/index.js +9 -0
  4. package/package.json +1 -1
package/README.md CHANGED
@@ -10,6 +10,10 @@ ExFlower 在线授权验证服务。管理 License Key、企业授权、实例
10
10
  # 安装
11
11
  npm install -g exflower-license-server
12
12
 
13
+ # 查看版本
14
+ exflower-license-server --version
15
+ # 输出: 1.0.2
16
+
13
17
  # 运行
14
18
  exflower-license-server
15
19
 
@@ -119,9 +123,23 @@ sudo systemctl enable --now exflower-license-server
119
123
  |------|--------|------|
120
124
  | `PORT` | `4001` | 服务端口 |
121
125
  | `ADMIN_TOKEN` | `exflower-admin-2026` | 管理后台鉴权 Token |
122
- | `LICENSE_DATA_DIR` | `./data` | 数据库持久化目录 |
126
+ | `LICENSE_DATA_DIR` | 见下方 | 数据库持久化目录 |
123
127
  | `NODE_ENV` | `production` | 运行环境 |
124
128
 
129
+ ### 数据持久化目录
130
+
131
+ 数据库文件 `license.db` 默认存储在以下位置(按优先级):
132
+
133
+ 1. **`LICENSE_DATA_DIR` 环境变量** — 如果设置,直接使用该路径
134
+ 2. **系统级目录**(推荐生产环境)
135
+ - Linux: `/var/lib/exflower/license-server/`
136
+ - Windows: `C:\ProgramData\exflower\license-server\`
137
+ - 需要进程对该目录有写入权限
138
+ 3. **用户目录 fallback**(无系统权限时自动使用)
139
+ - `~/.exflower/license-server/`
140
+
141
+ **⚠️ 重要**:npm 全局安装(`npm install -g`)或更新时,安装目录会被完全替换。默认不再将数据存放在包安装目录内,升级不会丢失已有数据。
142
+
125
143
  ## 管理后台
126
144
 
127
145
  启动后访问 `http://localhost:4001/admin`,使用 `ADMIN_TOKEN` 登录。
package/db.js CHANGED
@@ -6,8 +6,30 @@
6
6
  const Database = require('better-sqlite3');
7
7
  const path = require('path');
8
8
  const fs = require('fs');
9
+ const os = require('os');
9
10
 
10
- const DATA_DIR = process.env.LICENSE_DATA_DIR || path.join(__dirname, 'data');
11
+ function getDataDir() {
12
+ // 1. 环境变量优先
13
+ if (process.env.LICENSE_DATA_DIR) return process.env.LICENSE_DATA_DIR;
14
+
15
+ // 2. 尝试系统级持久化目录
16
+ const sysDir = process.platform === 'win32'
17
+ ? path.join(process.env.PROGRAMDATA || 'C:\\ProgramData', 'exflower', 'license-server')
18
+ : '/var/lib/exflower/license-server';
19
+
20
+ try {
21
+ if (!fs.existsSync(sysDir)) {
22
+ fs.mkdirSync(sysDir, { recursive: true });
23
+ }
24
+ fs.accessSync(sysDir, fs.constants.W_OK);
25
+ return sysDir;
26
+ } catch {
27
+ // 3. 无权限时 fallback 到用户目录
28
+ return path.join(os.homedir(), '.exflower', 'license-server');
29
+ }
30
+ }
31
+
32
+ const DATA_DIR = getDataDir();
11
33
  const DB_FILE = path.join(DATA_DIR, 'license.db');
12
34
 
13
35
  if (!fs.existsSync(DATA_DIR)) {
package/index.js CHANGED
@@ -14,8 +14,17 @@
14
14
  const express = require('express');
15
15
  const cors = require('cors');
16
16
  const path = require('path');
17
+ const fs = require('fs');
17
18
  const { setupRoutes } = require('./routes');
18
19
 
20
+ const args = process.argv.slice(2);
21
+ if (args.includes('--version') || args.includes('-v')) {
22
+ const pkgPath = path.join(__dirname, 'package.json');
23
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
24
+ console.log(pkg.version);
25
+ process.exit(0);
26
+ }
27
+
19
28
  const app = express();
20
29
  const PORT = process.env.PORT || 4001;
21
30
  const ADMIN_TOKEN = process.env.ADMIN_TOKEN || 'exflower-admin-2026';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exflower-license-server",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "ExFlower License Server - 在线授权验证服务",
5
5
  "main": "index.js",
6
6
  "bin": {