@hypnosis/docker-mcp-server 1.0.0
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/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/adapters/adapter-registry.d.ts +29 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +47 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/database-adapter.d.ts +33 -0
- package/dist/adapters/database-adapter.d.ts.map +1 -0
- package/dist/adapters/database-adapter.js +6 -0
- package/dist/adapters/database-adapter.js.map +1 -0
- package/dist/adapters/postgresql.d.ts +42 -0
- package/dist/adapters/postgresql.d.ts.map +1 -0
- package/dist/adapters/postgresql.js +202 -0
- package/dist/adapters/postgresql.js.map +1 -0
- package/dist/adapters/redis.d.ts +46 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +202 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/sqlite.d.ts +34 -0
- package/dist/adapters/sqlite.d.ts.map +1 -0
- package/dist/adapters/sqlite.js +126 -0
- package/dist/adapters/sqlite.js.map +1 -0
- package/dist/adapters/types.d.ts +53 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +5 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +319 -0
- package/dist/cli.js.map +1 -0
- package/dist/discovery/compose-parser.d.ts +35 -0
- package/dist/discovery/compose-parser.d.ts.map +1 -0
- package/dist/discovery/compose-parser.js +126 -0
- package/dist/discovery/compose-parser.js.map +1 -0
- package/dist/discovery/config-merger.d.ts +19 -0
- package/dist/discovery/config-merger.d.ts.map +1 -0
- package/dist/discovery/config-merger.js +60 -0
- package/dist/discovery/config-merger.js.map +1 -0
- package/dist/discovery/project-discovery.d.ts +53 -0
- package/dist/discovery/project-discovery.d.ts.map +1 -0
- package/dist/discovery/project-discovery.js +252 -0
- package/dist/discovery/project-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +47 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +6 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/compose-manager.d.ts +30 -0
- package/dist/managers/compose-manager.d.ts.map +1 -0
- package/dist/managers/compose-manager.js +70 -0
- package/dist/managers/compose-manager.js.map +1 -0
- package/dist/managers/container-manager.d.ts +81 -0
- package/dist/managers/container-manager.d.ts.map +1 -0
- package/dist/managers/container-manager.js +278 -0
- package/dist/managers/container-manager.js.map +1 -0
- package/dist/managers/env-manager.d.ts +37 -0
- package/dist/managers/env-manager.d.ts.map +1 -0
- package/dist/managers/env-manager.js +124 -0
- package/dist/managers/env-manager.js.map +1 -0
- package/dist/security/sql-validator.d.ts +23 -0
- package/dist/security/sql-validator.d.ts.map +1 -0
- package/dist/security/sql-validator.js +44 -0
- package/dist/security/sql-validator.js.map +1 -0
- package/dist/tools/container-tools.d.ts +31 -0
- package/dist/tools/container-tools.d.ts.map +1 -0
- package/dist/tools/container-tools.js +366 -0
- package/dist/tools/container-tools.js.map +1 -0
- package/dist/tools/database-tools.d.ts +22 -0
- package/dist/tools/database-tools.d.ts.map +1 -0
- package/dist/tools/database-tools.js +264 -0
- package/dist/tools/database-tools.js.map +1 -0
- package/dist/tools/env-tools.d.ts +52 -0
- package/dist/tools/env-tools.d.ts.map +1 -0
- package/dist/tools/env-tools.js +318 -0
- package/dist/tools/env-tools.js.map +1 -0
- package/dist/tools/executor-tool.d.ts +18 -0
- package/dist/tools/executor-tool.d.ts.map +1 -0
- package/dist/tools/executor-tool.js +95 -0
- package/dist/tools/executor-tool.js.map +1 -0
- package/dist/tools/mcp-health-tool.d.ts +65 -0
- package/dist/tools/mcp-health-tool.d.ts.map +1 -0
- package/dist/tools/mcp-health-tool.js +126 -0
- package/dist/tools/mcp-health-tool.js.map +1 -0
- package/dist/utils/cache.d.ts +43 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +77 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/compose-exec.d.ts +13 -0
- package/dist/utils/compose-exec.d.ts.map +1 -0
- package/dist/utils/compose-exec.js +33 -0
- package/dist/utils/compose-exec.js.map +1 -0
- package/dist/utils/docker-client.d.ts +33 -0
- package/dist/utils/docker-client.d.ts.map +1 -0
- package/dist/utils/docker-client.js +59 -0
- package/dist/utils/docker-client.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Adapter
|
|
3
|
+
* Реализация DatabaseAdapter для Redis
|
|
4
|
+
*/
|
|
5
|
+
import type { DatabaseAdapter } from './database-adapter.js';
|
|
6
|
+
import type { QueryOptions, BackupOptions, RestoreOptions, DBStatus, ConnectionInfo } from './types.js';
|
|
7
|
+
import type { ServiceConfig } from '../discovery/types.js';
|
|
8
|
+
export declare class RedisAdapter implements DatabaseAdapter {
|
|
9
|
+
private containerManager;
|
|
10
|
+
private projectDiscovery;
|
|
11
|
+
private envManager;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Выполнить Redis команду
|
|
15
|
+
*/
|
|
16
|
+
query(service: string, query: string, options?: QueryOptions): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Создать backup (RDB snapshot)
|
|
19
|
+
*/
|
|
20
|
+
backup(service: string, options: BackupOptions): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Восстановить из backup
|
|
23
|
+
*/
|
|
24
|
+
restore(service: string, backupPath: string, options?: RestoreOptions): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Получить статус БД
|
|
27
|
+
*/
|
|
28
|
+
status(service: string): Promise<DBStatus>;
|
|
29
|
+
/**
|
|
30
|
+
* Получить connection info из environment
|
|
31
|
+
*/
|
|
32
|
+
getConnectionInfo(service: ServiceConfig, env: Record<string, string>): ConnectionInfo;
|
|
33
|
+
/**
|
|
34
|
+
* Ждать завершения BGSAVE
|
|
35
|
+
*/
|
|
36
|
+
private waitForBgsave;
|
|
37
|
+
/**
|
|
38
|
+
* Парсит Redis INFO output
|
|
39
|
+
*/
|
|
40
|
+
private parseRedisInfo;
|
|
41
|
+
/**
|
|
42
|
+
* Форматирует uptime в человекочитаемый формат
|
|
43
|
+
*/
|
|
44
|
+
private formatUptime;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAM3D,qBAAa,YAAa,YAAW,eAAe;IAClD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,UAAU,CAAa;;IAQ/B;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BpF;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCtE;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2BhD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc;IAUtF;;OAEG;YACW,aAAa;IAsC3B;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;IACH,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Adapter
|
|
3
|
+
* Реализация DatabaseAdapter для Redis
|
|
4
|
+
*/
|
|
5
|
+
import { ContainerManager } from '../managers/container-manager.js';
|
|
6
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
7
|
+
import { EnvManager } from '../managers/env-manager.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
export class RedisAdapter {
|
|
10
|
+
containerManager;
|
|
11
|
+
projectDiscovery;
|
|
12
|
+
envManager;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.containerManager = new ContainerManager();
|
|
15
|
+
this.projectDiscovery = new ProjectDiscovery();
|
|
16
|
+
this.envManager = new EnvManager();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Выполнить Redis команду
|
|
20
|
+
*/
|
|
21
|
+
async query(service, query, options) {
|
|
22
|
+
const project = await this.projectDiscovery.findProject();
|
|
23
|
+
const serviceConfig = project.services[service];
|
|
24
|
+
if (!serviceConfig) {
|
|
25
|
+
throw new Error(`Service '${service}' not found in project`);
|
|
26
|
+
}
|
|
27
|
+
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
28
|
+
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
29
|
+
// Строим команду redis-cli
|
|
30
|
+
let cmd = ['redis-cli'];
|
|
31
|
+
// Пароль (если нужен)
|
|
32
|
+
if (conn.password) {
|
|
33
|
+
cmd.push('-a', conn.password);
|
|
34
|
+
}
|
|
35
|
+
// Команда Redis
|
|
36
|
+
const commandParts = query.trim().split(/\s+/);
|
|
37
|
+
cmd.push(...commandParts);
|
|
38
|
+
logger.debug(`Executing Redis command in ${service}: ${query}`);
|
|
39
|
+
const output = await this.containerManager.exec(service, project.name, cmd);
|
|
40
|
+
return output;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Создать backup (RDB snapshot)
|
|
44
|
+
*/
|
|
45
|
+
async backup(service, options) {
|
|
46
|
+
const project = await this.projectDiscovery.findProject();
|
|
47
|
+
const serviceConfig = project.services[service];
|
|
48
|
+
if (!serviceConfig) {
|
|
49
|
+
throw new Error(`Service '${service}' not found in project`);
|
|
50
|
+
}
|
|
51
|
+
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
52
|
+
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
53
|
+
const output = options.output || `/backups/redis-backup-${Date.now()}.rdb`;
|
|
54
|
+
// 1. Создать snapshot (BGSAVE - фоновый, не блокирует)
|
|
55
|
+
logger.info('Creating Redis snapshot (BGSAVE)...');
|
|
56
|
+
let cmd = ['redis-cli'];
|
|
57
|
+
if (conn.password) {
|
|
58
|
+
cmd.push('-a', conn.password);
|
|
59
|
+
}
|
|
60
|
+
cmd.push('BGSAVE');
|
|
61
|
+
await this.containerManager.exec(service, project.name, cmd);
|
|
62
|
+
// 2. Ждем завершения BGSAVE
|
|
63
|
+
await this.waitForBgsave(service, conn.password);
|
|
64
|
+
// 3. Копируем dump.rdb в output (обычно /data/dump.rdb в контейнере)
|
|
65
|
+
logger.info(`Copying dump.rdb to ${output}...`);
|
|
66
|
+
const copyCmd = ['cp', '/data/dump.rdb', output];
|
|
67
|
+
await this.containerManager.exec(service, project.name, copyCmd);
|
|
68
|
+
return output;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Восстановить из backup
|
|
72
|
+
*/
|
|
73
|
+
async restore(service, backupPath, options) {
|
|
74
|
+
const project = await this.projectDiscovery.findProject();
|
|
75
|
+
logger.info(`Restoring Redis from backup: ${backupPath}`);
|
|
76
|
+
// 1. Остановить контейнер
|
|
77
|
+
logger.info('Stopping Redis container...');
|
|
78
|
+
await this.containerManager.stopContainer(service, project.name);
|
|
79
|
+
// 2. Копировать backup файл в место где Redis его найдет
|
|
80
|
+
logger.info('Copying backup file...');
|
|
81
|
+
const copyCmd = ['cp', backupPath, '/data/dump.rdb'];
|
|
82
|
+
await this.containerManager.exec(service, project.name, copyCmd);
|
|
83
|
+
// 3. Запустить контейнер (Redis автоматически загрузит dump.rdb)
|
|
84
|
+
logger.info('Starting Redis container...');
|
|
85
|
+
await this.containerManager.startContainer(service, project.name);
|
|
86
|
+
logger.info('Redis restore completed');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Получить статус БД
|
|
90
|
+
*/
|
|
91
|
+
async status(service) {
|
|
92
|
+
const project = await this.projectDiscovery.findProject();
|
|
93
|
+
const serviceConfig = project.services[service];
|
|
94
|
+
if (!serviceConfig) {
|
|
95
|
+
throw new Error(`Service '${service}' not found in project`);
|
|
96
|
+
}
|
|
97
|
+
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
98
|
+
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
99
|
+
// Получаем INFO
|
|
100
|
+
const infoOutput = await this.query(service, 'INFO');
|
|
101
|
+
const info = this.parseRedisInfo(infoOutput);
|
|
102
|
+
return {
|
|
103
|
+
type: 'redis',
|
|
104
|
+
version: info.redis_version || 'unknown',
|
|
105
|
+
status: 'healthy',
|
|
106
|
+
memory: info.used_memory_human || 'unknown',
|
|
107
|
+
uptime: this.formatUptime(parseInt(info.uptime_in_seconds || '0')),
|
|
108
|
+
additional: {
|
|
109
|
+
keys: parseInt(info.db0?.keys || '0'),
|
|
110
|
+
clients: parseInt(info.connected_clients || '0'),
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Получить connection info из environment
|
|
116
|
+
*/
|
|
117
|
+
getConnectionInfo(service, env) {
|
|
118
|
+
return {
|
|
119
|
+
host: 'localhost',
|
|
120
|
+
port: 6379,
|
|
121
|
+
user: '',
|
|
122
|
+
password: env.REDIS_PASSWORD,
|
|
123
|
+
database: '0',
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Ждать завершения BGSAVE
|
|
128
|
+
*/
|
|
129
|
+
async waitForBgsave(service, password) {
|
|
130
|
+
const project = await this.projectDiscovery.findProject();
|
|
131
|
+
let attempts = 0;
|
|
132
|
+
const maxAttempts = 30; // 30 секунд максимум
|
|
133
|
+
while (attempts < maxAttempts) {
|
|
134
|
+
let cmd = ['redis-cli'];
|
|
135
|
+
if (password) {
|
|
136
|
+
cmd.push('-a', password);
|
|
137
|
+
}
|
|
138
|
+
cmd.push('LASTSAVE');
|
|
139
|
+
const output = await this.containerManager.exec(service, project.name, cmd);
|
|
140
|
+
const lastsave = parseInt(output.trim());
|
|
141
|
+
// Проверяем что BGSAVE завершен
|
|
142
|
+
cmd = ['redis-cli'];
|
|
143
|
+
if (password) {
|
|
144
|
+
cmd.push('-a', password);
|
|
145
|
+
}
|
|
146
|
+
cmd.push('INFO', 'persistence');
|
|
147
|
+
const persistenceInfo = await this.containerManager.exec(service, project.name, cmd);
|
|
148
|
+
const info = this.parseRedisInfo(persistenceInfo);
|
|
149
|
+
if (info.rdb_bgsave_in_progress === '0') {
|
|
150
|
+
logger.debug('BGSAVE completed');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// Ждем 1 секунду перед следующей проверкой
|
|
154
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
155
|
+
attempts++;
|
|
156
|
+
}
|
|
157
|
+
throw new Error('BGSAVE timeout: backup did not complete in 30 seconds');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Парсит Redis INFO output
|
|
161
|
+
*/
|
|
162
|
+
parseRedisInfo(info) {
|
|
163
|
+
const result = {};
|
|
164
|
+
info.split('\n').forEach((line) => {
|
|
165
|
+
if (line.includes(':')) {
|
|
166
|
+
const [key, ...valueParts] = line.split(':');
|
|
167
|
+
const value = valueParts.join(':').trim();
|
|
168
|
+
// Специальная обработка для db0 (keys)
|
|
169
|
+
if (key.startsWith('db0')) {
|
|
170
|
+
if (!result.db0) {
|
|
171
|
+
result.db0 = {};
|
|
172
|
+
}
|
|
173
|
+
const dbKey = key.replace('db0', '').trim();
|
|
174
|
+
if (dbKey) {
|
|
175
|
+
result.db0[dbKey] = value;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
result[key.trim()] = value;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Форматирует uptime в человекочитаемый формат
|
|
187
|
+
*/
|
|
188
|
+
formatUptime(seconds) {
|
|
189
|
+
const days = Math.floor(seconds / 86400);
|
|
190
|
+
const hours = Math.floor((seconds % 86400) / 3600);
|
|
191
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
192
|
+
const parts = [];
|
|
193
|
+
if (days > 0)
|
|
194
|
+
parts.push(`${days} day${days !== 1 ? 's' : ''}`);
|
|
195
|
+
if (hours > 0)
|
|
196
|
+
parts.push(`${hours} hour${hours !== 1 ? 's' : ''}`);
|
|
197
|
+
if (minutes > 0)
|
|
198
|
+
parts.push(`${minutes} minute${minutes !== 1 ? 's' : ''}`);
|
|
199
|
+
return parts.join(' ') || '0 minutes';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Adapter
|
|
3
|
+
* Реализация DatabaseAdapter для SQLite
|
|
4
|
+
*/
|
|
5
|
+
import type { DatabaseAdapter } from './database-adapter.js';
|
|
6
|
+
import type { QueryOptions, BackupOptions, RestoreOptions, DBStatus, ConnectionInfo } from './types.js';
|
|
7
|
+
import type { ServiceConfig } from '../discovery/types.js';
|
|
8
|
+
export declare class SQLiteAdapter implements DatabaseAdapter {
|
|
9
|
+
private containerManager;
|
|
10
|
+
private projectDiscovery;
|
|
11
|
+
private envManager;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Выполнить SQL query или мета-команду
|
|
15
|
+
*/
|
|
16
|
+
query(service: string, query: string, options?: QueryOptions): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Создать backup
|
|
19
|
+
*/
|
|
20
|
+
backup(service: string, options: BackupOptions): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Восстановить из backup
|
|
23
|
+
*/
|
|
24
|
+
restore(service: string, backupPath: string, options?: RestoreOptions): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Получить статус БД
|
|
27
|
+
*/
|
|
28
|
+
status(service: string): Promise<DBStatus>;
|
|
29
|
+
/**
|
|
30
|
+
* Получить connection info из environment
|
|
31
|
+
*/
|
|
32
|
+
getConnectionInfo(service: ServiceConfig, env: Record<string, string>): ConnectionInfo;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAO3D,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,UAAU,CAAa;;IAQ/B;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCpF;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBtE;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiChD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc;CAQvF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Adapter
|
|
3
|
+
* Реализация DatabaseAdapter для SQLite
|
|
4
|
+
*/
|
|
5
|
+
import { ContainerManager } from '../managers/container-manager.js';
|
|
6
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
7
|
+
import { EnvManager } from '../managers/env-manager.js';
|
|
8
|
+
import { sqlValidator } from '../security/sql-validator.js';
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
10
|
+
export class SQLiteAdapter {
|
|
11
|
+
containerManager;
|
|
12
|
+
projectDiscovery;
|
|
13
|
+
envManager;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.containerManager = new ContainerManager();
|
|
16
|
+
this.projectDiscovery = new ProjectDiscovery();
|
|
17
|
+
this.envManager = new EnvManager();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Выполнить SQL query или мета-команду
|
|
21
|
+
*/
|
|
22
|
+
async query(service, query, options) {
|
|
23
|
+
// Валидация SQL (если включена, только для SQL запросов, не для мета-команд)
|
|
24
|
+
if (!query.startsWith('.')) {
|
|
25
|
+
sqlValidator.validate(query);
|
|
26
|
+
}
|
|
27
|
+
const project = await this.projectDiscovery.findProject();
|
|
28
|
+
const serviceConfig = project.services[service];
|
|
29
|
+
if (!serviceConfig) {
|
|
30
|
+
throw new Error(`Service '${service}' not found in project`);
|
|
31
|
+
}
|
|
32
|
+
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
33
|
+
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
34
|
+
const dbPath = conn.database;
|
|
35
|
+
// Строим команду sqlite3
|
|
36
|
+
let cmd;
|
|
37
|
+
if (query.startsWith('.')) {
|
|
38
|
+
// Мета-команда (например, .tables, .schema)
|
|
39
|
+
cmd = ['sqlite3', dbPath, query];
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// SQL запрос
|
|
43
|
+
cmd = ['sqlite3', dbPath, query];
|
|
44
|
+
}
|
|
45
|
+
logger.debug(`Executing SQLite query in ${service}: ${query}`);
|
|
46
|
+
const output = await this.containerManager.exec(service, project.name, cmd);
|
|
47
|
+
return output;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Создать backup
|
|
51
|
+
*/
|
|
52
|
+
async backup(service, options) {
|
|
53
|
+
const project = await this.projectDiscovery.findProject();
|
|
54
|
+
const serviceConfig = project.services[service];
|
|
55
|
+
if (!serviceConfig) {
|
|
56
|
+
throw new Error(`Service '${service}' not found in project`);
|
|
57
|
+
}
|
|
58
|
+
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
59
|
+
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
60
|
+
const dbPath = conn.database;
|
|
61
|
+
const output = options.output || `/backups/sqlite-backup-${Date.now()}.db`;
|
|
62
|
+
// Используем .backup команду (безопасно, работает даже если БД используется)
|
|
63
|
+
logger.info(`Creating SQLite backup: ${output}`);
|
|
64
|
+
const cmd = ['sqlite3', dbPath, `.backup ${output}`];
|
|
65
|
+
await this.containerManager.exec(service, project.name, cmd);
|
|
66
|
+
return output;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Восстановить из backup
|
|
70
|
+
*/
|
|
71
|
+
async restore(service, backupPath, options) {
|
|
72
|
+
const project = await this.projectDiscovery.findProject();
|
|
73
|
+
const serviceConfig = project.services[service];
|
|
74
|
+
if (!serviceConfig) {
|
|
75
|
+
throw new Error(`Service '${service}' not found in project`);
|
|
76
|
+
}
|
|
77
|
+
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
78
|
+
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
79
|
+
const dbPath = conn.database;
|
|
80
|
+
logger.info(`Restoring SQLite from backup: ${backupPath}`);
|
|
81
|
+
// Простое копирование файла (SQLite - это файловая БД)
|
|
82
|
+
const cmd = ['cp', backupPath, dbPath];
|
|
83
|
+
await this.containerManager.exec(service, project.name, cmd);
|
|
84
|
+
logger.info('SQLite restore completed');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Получить статус БД
|
|
88
|
+
*/
|
|
89
|
+
async status(service) {
|
|
90
|
+
const project = await this.projectDiscovery.findProject();
|
|
91
|
+
const serviceConfig = project.services[service];
|
|
92
|
+
if (!serviceConfig) {
|
|
93
|
+
throw new Error(`Service '${service}' not found in project`);
|
|
94
|
+
}
|
|
95
|
+
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
96
|
+
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
97
|
+
const dbPath = conn.database;
|
|
98
|
+
// Получаем версию SQLite
|
|
99
|
+
const versionOutput = await this.query(service, 'SELECT sqlite_version();');
|
|
100
|
+
const version = versionOutput.trim();
|
|
101
|
+
// Получаем количество таблиц
|
|
102
|
+
const tablesOutput = await this.query(service, "SELECT COUNT(*) FROM sqlite_master WHERE type='table';");
|
|
103
|
+
const tables = parseInt(tablesOutput.trim() || '0');
|
|
104
|
+
return {
|
|
105
|
+
type: 'sqlite',
|
|
106
|
+
version,
|
|
107
|
+
status: 'healthy',
|
|
108
|
+
additional: {
|
|
109
|
+
tables,
|
|
110
|
+
database_path: dbPath,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Получить connection info из environment
|
|
116
|
+
*/
|
|
117
|
+
getConnectionInfo(service, env) {
|
|
118
|
+
return {
|
|
119
|
+
host: 'localhost',
|
|
120
|
+
port: 0,
|
|
121
|
+
user: '',
|
|
122
|
+
database: env.SQLITE_DATABASE || '/app/db.sqlite3',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types для Database Adapters
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Опции для query
|
|
6
|
+
*/
|
|
7
|
+
export interface QueryOptions {
|
|
8
|
+
database?: string;
|
|
9
|
+
user?: string;
|
|
10
|
+
format?: 'table' | 'json' | 'csv';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Опции для backup
|
|
14
|
+
*/
|
|
15
|
+
export interface BackupOptions {
|
|
16
|
+
output?: string;
|
|
17
|
+
format?: 'sql' | 'custom' | 'tar' | 'directory';
|
|
18
|
+
compress?: boolean;
|
|
19
|
+
tables?: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Опции для restore
|
|
23
|
+
*/
|
|
24
|
+
export interface RestoreOptions {
|
|
25
|
+
database?: string;
|
|
26
|
+
clean?: boolean;
|
|
27
|
+
dataOnly?: boolean;
|
|
28
|
+
schemaOnly?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Статус БД
|
|
32
|
+
*/
|
|
33
|
+
export interface DBStatus {
|
|
34
|
+
type: string;
|
|
35
|
+
version: string;
|
|
36
|
+
status: 'healthy' | 'unhealthy';
|
|
37
|
+
size?: string;
|
|
38
|
+
connections?: number;
|
|
39
|
+
uptime?: string;
|
|
40
|
+
memory?: string;
|
|
41
|
+
additional?: Record<string, any>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Connection Info для БД
|
|
45
|
+
*/
|
|
46
|
+
export interface ConnectionInfo {
|
|
47
|
+
host: string;
|
|
48
|
+
port: number;
|
|
49
|
+
user: string;
|
|
50
|
+
password?: string;
|
|
51
|
+
database: string;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,WAAW,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|