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.
- package/README.md +19 -1
- package/db.js +23 -1
- package/index.js +9 -0
- 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` |
|
|
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
|
-
|
|
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';
|