@lenne.tech/cli 1.6.7 → 1.6.8
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/build/commands/config/validate.js +15 -1
- package/build/commands/directus/directus.js +27 -0
- package/build/commands/directus/docker-setup.js +471 -0
- package/build/commands/directus/remove.js +131 -0
- package/build/commands/directus/typegen.js +164 -0
- package/build/commands/git/update.js +2 -2
- package/build/commands/qdrant/delete.js +2 -1
- package/build/commands/qdrant/stats.js +2 -1
- package/build/templates/directus/.env.ejs +26 -0
- package/build/templates/directus/README.md.ejs +159 -0
- package/build/templates/directus/docker-compose.yml.ejs +81 -0
- package/docs/commands.md +124 -0
- package/package.json +1 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
/**
|
|
14
|
+
* Remove a Directus Docker instance
|
|
15
|
+
*/
|
|
16
|
+
const NewCommand = {
|
|
17
|
+
alias: ['rm'],
|
|
18
|
+
description: 'Remove Directus instance',
|
|
19
|
+
hidden: false,
|
|
20
|
+
name: 'remove',
|
|
21
|
+
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
|
+
var _a, _b, _c;
|
|
23
|
+
const { config, filesystem, parameters, print: { error, info, spin, success, warning }, prompt, system, } = toolbox;
|
|
24
|
+
// Load configuration
|
|
25
|
+
const ltConfig = config.loadConfig();
|
|
26
|
+
// Determine noConfirm
|
|
27
|
+
const noConfirm = config.getNoConfirm({
|
|
28
|
+
cliValue: parameters.options.noConfirm,
|
|
29
|
+
commandConfig: (_b = (_a = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _a === void 0 ? void 0 : _a.directus) === null || _b === void 0 ? void 0 : _b.remove,
|
|
30
|
+
config: ltConfig,
|
|
31
|
+
});
|
|
32
|
+
// Get instance name from argument or prompt
|
|
33
|
+
const cliName = parameters.first;
|
|
34
|
+
let instanceName;
|
|
35
|
+
const directusBaseDir = (0, path_1.join)(filesystem.homedir(), '.lt', 'directus');
|
|
36
|
+
// Check if directus directory exists
|
|
37
|
+
if (!filesystem.exists(directusBaseDir)) {
|
|
38
|
+
error('No Directus instances found.');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Get list of existing instances
|
|
42
|
+
const instances = ((_c = filesystem
|
|
43
|
+
.list(directusBaseDir)) === null || _c === void 0 ? void 0 : _c.filter((item) => filesystem.isDirectory((0, path_1.join)(directusBaseDir, item)))) || [];
|
|
44
|
+
if (instances.length === 0) {
|
|
45
|
+
error('No Directus instances found.');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (cliName) {
|
|
49
|
+
instanceName = cliName;
|
|
50
|
+
}
|
|
51
|
+
else if (noConfirm) {
|
|
52
|
+
error('Instance name is required (provide as first argument)');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Show available instances for selection
|
|
57
|
+
info('Available instances:');
|
|
58
|
+
instances.forEach((instance) => {
|
|
59
|
+
info(` - ${instance}`);
|
|
60
|
+
});
|
|
61
|
+
info('');
|
|
62
|
+
const nameResponse = yield prompt.ask({
|
|
63
|
+
message: 'Enter instance name to remove:',
|
|
64
|
+
name: 'name',
|
|
65
|
+
type: 'input',
|
|
66
|
+
});
|
|
67
|
+
instanceName = nameResponse.name;
|
|
68
|
+
}
|
|
69
|
+
if (!instanceName) {
|
|
70
|
+
error('Instance name is required!');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const instanceDir = (0, path_1.join)(directusBaseDir, instanceName);
|
|
74
|
+
// Check if instance exists
|
|
75
|
+
if (!filesystem.exists(instanceDir)) {
|
|
76
|
+
error(`Instance "${instanceName}" not found.`);
|
|
77
|
+
info('Available instances:');
|
|
78
|
+
instances.forEach((instance) => {
|
|
79
|
+
info(` - ${instance}`);
|
|
80
|
+
});
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Confirm deletion
|
|
84
|
+
if (!noConfirm) {
|
|
85
|
+
warning(`This will permanently delete instance "${instanceName}" and all its data!`);
|
|
86
|
+
const shouldDelete = yield prompt.confirm('Are you sure you want to continue?');
|
|
87
|
+
if (!shouldDelete) {
|
|
88
|
+
info('Operation cancelled.');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Stop and remove containers
|
|
93
|
+
const composePath = (0, path_1.join)(instanceDir, 'docker-compose.yml');
|
|
94
|
+
if (filesystem.exists(composePath)) {
|
|
95
|
+
const stopSpin = spin('Stopping and removing containers');
|
|
96
|
+
try {
|
|
97
|
+
yield system.run(`cd ${instanceDir} && docker-compose down -v`);
|
|
98
|
+
stopSpin.succeed();
|
|
99
|
+
}
|
|
100
|
+
catch (stopError) {
|
|
101
|
+
stopSpin.fail('Failed to stop containers');
|
|
102
|
+
if (stopError instanceof Error) {
|
|
103
|
+
warning(stopError.message);
|
|
104
|
+
}
|
|
105
|
+
warning('Continuing with directory removal...');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Remove instance directory
|
|
109
|
+
const removeSpin = spin('Removing instance directory');
|
|
110
|
+
try {
|
|
111
|
+
filesystem.remove(instanceDir);
|
|
112
|
+
removeSpin.succeed();
|
|
113
|
+
}
|
|
114
|
+
catch (removeError) {
|
|
115
|
+
removeSpin.fail('Failed to remove instance directory');
|
|
116
|
+
if (removeError instanceof Error) {
|
|
117
|
+
error(removeError.message);
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
success(`Instance "${instanceName}" removed successfully!`);
|
|
122
|
+
// Exit if not running from menu
|
|
123
|
+
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
124
|
+
process.exit();
|
|
125
|
+
}
|
|
126
|
+
// For tests
|
|
127
|
+
return `removed directus instance ${instanceName}`;
|
|
128
|
+
}),
|
|
129
|
+
};
|
|
130
|
+
exports.default = NewCommand;
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2RpcmVjdHVzL3JlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBLCtCQUE0QjtBQUk1Qjs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFtQjtJQUNqQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDYixXQUFXLEVBQUUsMEJBQTBCO0lBQ3ZDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxHQUFHLEVBQUUsQ0FBTyxPQUErQixFQUFFLEVBQUU7O1FBQzdDLE1BQU0sRUFDSixNQUFNLEVBQ04sVUFBVSxFQUNWLFVBQVUsRUFDVixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQzlDLE1BQU0sRUFDTixNQUFNLEdBQ1AsR0FBRyxPQUFPLENBQUM7UUFFWixxQkFBcUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXJDLHNCQUFzQjtRQUN0QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDdEMsYUFBYSxFQUFFLE1BQUEsTUFBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsUUFBUSwwQ0FBRSxRQUFRLDBDQUFFLE1BQU07WUFDbkQsTUFBTSxFQUFFLFFBQVE7U0FDakIsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxZQUFvQixDQUFDO1FBRXpCLE1BQU0sZUFBZSxHQUFHLElBQUEsV0FBSSxFQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7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
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/**
|
|
13
|
+
* Generate TypeScript types from Directus collections
|
|
14
|
+
*/
|
|
15
|
+
const NewCommand = {
|
|
16
|
+
alias: ['t'],
|
|
17
|
+
description: 'Generate TypeScript types',
|
|
18
|
+
hidden: false,
|
|
19
|
+
name: 'typegen',
|
|
20
|
+
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
22
|
+
// Retrieve the tools we need
|
|
23
|
+
const { config, parameters, print: { error, info, spin, success }, prompt, system, } = toolbox;
|
|
24
|
+
// Load configuration
|
|
25
|
+
const ltConfig = config.loadConfig();
|
|
26
|
+
// Parse CLI arguments
|
|
27
|
+
const cliUrl = parameters.options.url || parameters.options.u;
|
|
28
|
+
const cliToken = parameters.options.token || parameters.options.t;
|
|
29
|
+
const cliOutput = parameters.options.output || parameters.options.o;
|
|
30
|
+
// Determine noConfirm with priority: CLI > command > global > default
|
|
31
|
+
const noConfirm = config.getNoConfirm({
|
|
32
|
+
cliValue: parameters.options.noConfirm,
|
|
33
|
+
commandConfig: (_b = (_a = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _a === void 0 ? void 0 : _a.directus) === null || _b === void 0 ? void 0 : _b.typegen,
|
|
34
|
+
config: ltConfig,
|
|
35
|
+
});
|
|
36
|
+
// Get configuration values
|
|
37
|
+
const configUrl = (_e = (_d = (_c = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _c === void 0 ? void 0 : _c.directus) === null || _d === void 0 ? void 0 : _d.typegen) === null || _e === void 0 ? void 0 : _e.url;
|
|
38
|
+
const configToken = (_h = (_g = (_f = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _f === void 0 ? void 0 : _f.directus) === null || _g === void 0 ? void 0 : _g.typegen) === null || _h === void 0 ? void 0 : _h.token;
|
|
39
|
+
const configOutput = (_l = (_k = (_j = ltConfig === null || ltConfig === void 0 ? void 0 : ltConfig.commands) === null || _j === void 0 ? void 0 : _j.directus) === null || _k === void 0 ? void 0 : _k.typegen) === null || _l === void 0 ? void 0 : _l.output;
|
|
40
|
+
// Determine values with priority: CLI > config > default/interactive
|
|
41
|
+
let url;
|
|
42
|
+
let token;
|
|
43
|
+
let output;
|
|
44
|
+
if (cliUrl) {
|
|
45
|
+
url = cliUrl;
|
|
46
|
+
}
|
|
47
|
+
else if (configUrl) {
|
|
48
|
+
url = configUrl;
|
|
49
|
+
info(`Using Directus URL from lt.config: ${url}`);
|
|
50
|
+
}
|
|
51
|
+
else if (noConfirm) {
|
|
52
|
+
url = 'http://localhost:8055';
|
|
53
|
+
info(`Using default Directus URL: ${url}`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const urlResponse = yield prompt.ask({
|
|
57
|
+
initial: 'http://localhost:8055',
|
|
58
|
+
message: 'Enter Directus API URL:',
|
|
59
|
+
name: 'url',
|
|
60
|
+
type: 'input',
|
|
61
|
+
});
|
|
62
|
+
url = urlResponse.url;
|
|
63
|
+
}
|
|
64
|
+
if (!url) {
|
|
65
|
+
error('Directus URL is required!');
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (cliToken) {
|
|
69
|
+
token = cliToken;
|
|
70
|
+
}
|
|
71
|
+
else if (configToken) {
|
|
72
|
+
token = configToken;
|
|
73
|
+
info('Using Directus token from lt.config');
|
|
74
|
+
}
|
|
75
|
+
else if (noConfirm) {
|
|
76
|
+
error('Directus token is required (use --token or configure in lt.config)!');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const tokenResponse = yield prompt.ask({
|
|
81
|
+
message: 'Enter Directus API token (needs Administrator permissions):',
|
|
82
|
+
name: 'token',
|
|
83
|
+
type: 'password',
|
|
84
|
+
});
|
|
85
|
+
token = tokenResponse.token;
|
|
86
|
+
}
|
|
87
|
+
if (!token) {
|
|
88
|
+
error('Directus token is required!');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (cliOutput) {
|
|
92
|
+
output = cliOutput;
|
|
93
|
+
}
|
|
94
|
+
else if (configOutput) {
|
|
95
|
+
output = configOutput;
|
|
96
|
+
info(`Using output path from lt.config: ${output}`);
|
|
97
|
+
}
|
|
98
|
+
else if (noConfirm) {
|
|
99
|
+
output = './directus-schema.ts';
|
|
100
|
+
info(`Using default output path: ${output}`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const outputResponse = yield prompt.ask({
|
|
104
|
+
initial: './directus-schema.ts',
|
|
105
|
+
message: 'Enter output file path:',
|
|
106
|
+
name: 'output',
|
|
107
|
+
type: 'input',
|
|
108
|
+
});
|
|
109
|
+
output = outputResponse.output;
|
|
110
|
+
}
|
|
111
|
+
if (!output) {
|
|
112
|
+
error('Output path is required!');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Check if directus-sdk-typegen is installed globally
|
|
116
|
+
const hasTypegen = system.which('directus-sdk-typegen');
|
|
117
|
+
let useGlobalTypegen = Boolean(hasTypegen);
|
|
118
|
+
if (!hasTypegen) {
|
|
119
|
+
info('directus-sdk-typegen is not installed globally.');
|
|
120
|
+
if (noConfirm) {
|
|
121
|
+
info('Installing directus-sdk-typegen globally...');
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const shouldInstall = yield prompt.confirm('Would you like to install directus-sdk-typegen globally?');
|
|
125
|
+
if (!shouldInstall) {
|
|
126
|
+
info('Using npx instead...');
|
|
127
|
+
useGlobalTypegen = false;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const installSpin = spin('Installing directus-sdk-typegen');
|
|
131
|
+
yield system.run('npm install -g directus-sdk-typegen');
|
|
132
|
+
installSpin.succeed();
|
|
133
|
+
useGlobalTypegen = true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Generate types
|
|
138
|
+
const generateSpin = spin('Generating TypeScript types from Directus');
|
|
139
|
+
const command = useGlobalTypegen
|
|
140
|
+
? `directus-sdk-typegen -u "${url}" -t "${token}" -o "${output}"`
|
|
141
|
+
: `npx directus-sdk-typegen -u "${url}" -t "${token}" -o "${output}"`;
|
|
142
|
+
try {
|
|
143
|
+
yield system.run(command);
|
|
144
|
+
generateSpin.succeed();
|
|
145
|
+
success(`TypeScript types generated successfully at ${output}`);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
generateSpin.fail();
|
|
149
|
+
error('Failed to generate types. Please check your URL and token.');
|
|
150
|
+
if (err instanceof Error) {
|
|
151
|
+
error(err.message);
|
|
152
|
+
}
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Exit if not running from menu
|
|
156
|
+
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
157
|
+
process.exit();
|
|
158
|
+
}
|
|
159
|
+
// For tests
|
|
160
|
+
return `generated directus types at ${output}`;
|
|
161
|
+
}),
|
|
162
|
+
};
|
|
163
|
+
exports.default = NewCommand;
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWdlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9kaXJlY3R1cy90eXBlZ2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBSUE7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ1osV0FBVyxFQUFFLDJCQUEyQjtJQUN4QyxNQUFNLEVBQUUsS0FBSztJQUNiLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFOztRQUM3Qyw2QkFBNkI7UUFDN0IsTUFBTSxFQUNKLE1BQU0sRUFDTixVQUFVLEVBQ1YsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQ3JDLE1BQU0sRUFDTixNQUFNLEdBQ1AsR0FBRyxPQUFPLENBQUM7UUFFWixxQkFBcUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXJDLHNCQUFzQjtRQUN0QixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsRSxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVwRSxzRUFBc0U7UUFDdEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUNwQyxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ3RDLGFBQWEsRUFBRSxNQUFBLE1BQUEsUUFBUSxhQUFSLFFBQVEsdUJB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
|
|
@@ -77,7 +77,7 @@ const NewCommand = {
|
|
|
77
77
|
const timer = startTimer();
|
|
78
78
|
// Update
|
|
79
79
|
const updateSpin = spin(`Update branch ${branch}`);
|
|
80
|
-
yield run('git fetch && git pull');
|
|
80
|
+
yield run('git fetch && git pull --rebase');
|
|
81
81
|
updateSpin.succeed();
|
|
82
82
|
// Install npm packages (unless skipped)
|
|
83
83
|
if (!skipInstall) {
|
|
@@ -95,4 +95,4 @@ const NewCommand = {
|
|
|
95
95
|
}),
|
|
96
96
|
};
|
|
97
97
|
exports.default = NewCommand;
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2dpdC91cGRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQTs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFtQjtJQUNqQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDYixXQUFXLEVBQUUsZUFBZTtJQUM1QixNQUFNLEVBQUUsS0FBSztJQUNiLElBQUksRUFBRSxRQUFRO0lBQ2QsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFOztRQUM3Qyw2QkFBNkI7UUFDN0IsTUFBTSxFQUNKLE1BQU0sRUFDTixHQUFHLEVBQ0gsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQ3ZDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FDNUIsR0FBRyxPQUFPLENBQUM7UUFFWiwyQkFBMkI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUxRSxZQUFZO1FBQ1osSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQyxNQUFNLGlCQUFpQixHQUFHLE1BQUEsTUFBQSxNQUFBLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxRQUFRLDBDQUFFLEdBQUcsMENBQUUsTUFBTSwwQ0FBRSxXQUFXLENBQUM7UUFDdkUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQVUsUUFBUSxF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
|
|
@@ -19,6 +19,7 @@ const command = {
|
|
|
19
19
|
const qdrantApi = http.create({
|
|
20
20
|
baseURL: 'http://localhost:6333',
|
|
21
21
|
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
timeout: 5000,
|
|
22
23
|
});
|
|
23
24
|
// 1. Fetch all collections
|
|
24
25
|
const collectionsResponse = yield qdrantApi.get('/collections');
|
|
@@ -74,4 +75,4 @@ const command = {
|
|
|
74
75
|
}),
|
|
75
76
|
};
|
|
76
77
|
exports.default = command;
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3FkcmFudC9kZWxldGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFjQSxNQUFNLE9BQU8sR0FBbUI7SUFDOUIsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ1osV0FBVyxFQUFFLDZCQUE2QjtJQUMxQyxJQUFJLEVBQUUsUUFBUTtJQUNkLEdBQUcsRUFBRSxDQUFPLE9BQStCLEVBQUUsRUFBRTs7UUFDN0MsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXhDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDNUIsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQzdDLGNBQWMsQ0FDZixDQUFDO1FBRUYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7WUFDdkUsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFBLE1BQUEsbUJBQW1CLENBQUMsSUFBSSwwQ0FBRSxNQUFNLDBDQUFFLFdBQVcsQ0FBQztRQUNsRSxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRCxxQ0FBcUM7UUFDckMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQzlDLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSx5Q0FBeUM7WUFDbEQsSUFBSSxFQUFFLG9CQUFvQjtZQUMxQixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUVsRCx3QkFBd0I7UUFDeEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUNuQyxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSwrQ0FBK0Msa0JBQWtCLGtDQUFrQztZQUM1RyxJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixrQkFBa0IsTUFBTSxDQUFDLENBQUM7UUFFN0UsMkJBQTJCO1FBQzNCLE1BQU0sY0FBYyxHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FDM0MsZ0JBQWdCLGtCQUFrQixFQUFFLENBQ3JDLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLGtCQUFrQixJQUFJLENBQUMsQ0FBQztZQUNuRSxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsb0NBQW9DLGtCQUFrQixJQUFJLENBQUMsQ0FBQztRQUU1RSxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBRUQsWUFBWTtRQUNaLE9BQU8sa0JBQWtCLGtCQUFrQixFQUFFLENBQUM7SUFDaEQsQ0FBQyxDQUFBO0NBQ0YsQ0FBQztBQUVGLGtCQUFlLE9BQU8sQ0FBQyJ9
|
|
@@ -19,6 +19,7 @@ const command = {
|
|
|
19
19
|
const qdrantApi = http.create({
|
|
20
20
|
baseURL: 'http://localhost:6333',
|
|
21
21
|
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
timeout: 5000,
|
|
22
23
|
});
|
|
23
24
|
const spinner = print.spin('Fetching Qdrant statistics...');
|
|
24
25
|
// 1. Fetch all collections
|
|
@@ -72,4 +73,4 @@ const command = {
|
|
|
72
73
|
}),
|
|
73
74
|
};
|
|
74
75
|
exports.default = command;
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvcWRyYW50L3N0YXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBMEJBLE1BQU0sT0FBTyxHQUFtQjtJQUM5QixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNEJBQTRCO0lBQ3pDLElBQUksRUFBRSxPQUFPO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFOztRQUM3QyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUVoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzVCLE9BQU8sRUFBRSx1QkFBdUI7WUFDaEMsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBRTVELDJCQUEyQjtRQUMzQixNQUFNLG1CQUFtQixHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDN0MsY0FBYyxDQUNmLENBQUM7UUFFRixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1lBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsMERBQTBELENBQUMsQ0FBQztZQUN2RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLE1BQUEsTUFBQSxtQkFBbUIsQ0FBQyxJQUFJLDBDQUFFLE1BQU0sMENBQUUsV0FBVyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxPQUFPLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDbkQsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFFbEQsTUFBTSxTQUFTLEdBQUc7WUFDaEI7Z0JBQ0UsWUFBWTtnQkFDWixRQUFRO2dCQUNSLFNBQVM7Z0JBQ1QsVUFBVTtnQkFDVixlQUFlO2dCQUNmLGdCQUFnQjthQUNqQjtTQUNGLENBQUM7UUFFRixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sWUFBWSxHQUNkLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDbkIsZ0JBQWdCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FDbEMsQ0FBQztZQUVKLElBQUksWUFBWSxDQUFDLEVBQUUsS0FBSSxNQUFBLFlBQVksQ0FBQyxJQUFJLDBDQUFFLE1BQU0sQ0FBQSxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUNiLFVBQVUsQ0FBQyxJQUFJO29CQUNmLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO29CQUM5QixNQUFBLE1BQU0sQ0FBQyxhQUFhLDBDQUFFLFFBQVEsRUFBRTtvQkFDaEMsTUFBQSxNQUFNLENBQUMsY0FBYywwQ0FBRSxRQUFRLEVBQUU7b0JBQ2pDLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDMUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUM1QyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakYsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUNyQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsQ0FBQztRQUVELFlBQVk7UUFDWixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUE7Q0FDRixDQUFDO0FBRUYsa0JBQWUsT0FBTyxDQUFDIn0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Directus Configuration
|
|
2
|
+
# Generated by lenne.tech CLI
|
|
3
|
+
# DO NOT COMMIT THIS FILE TO VERSION CONTROL
|
|
4
|
+
|
|
5
|
+
# Directus Version
|
|
6
|
+
DIRECTUS_VERSION='<%=props.version%>'
|
|
7
|
+
|
|
8
|
+
# Directus Port
|
|
9
|
+
DIRECTUS_PORT='<%=props.port%>'
|
|
10
|
+
|
|
11
|
+
# Directus Security Keys (KEEP THESE SECRET)
|
|
12
|
+
KEY='<%=props.keySecret%>'
|
|
13
|
+
SECRET='<%=props.adminSecret%>'
|
|
14
|
+
|
|
15
|
+
# Admin Credentials (CHANGE AFTER FIRST LOGIN)
|
|
16
|
+
ADMIN_EMAIL='<%=props.adminEmail%>'
|
|
17
|
+
ADMIN_PASSWORD='<%=props.adminPassword%>'
|
|
18
|
+
|
|
19
|
+
# Database Configuration
|
|
20
|
+
DB_FILENAME='<%=props.dbType === "sqlite" ? props.dbConfig.database : ""%>'
|
|
21
|
+
DB_DATABASE='<%=props.dbType !== "sqlite" ? props.dbConfig.database : ""%>'
|
|
22
|
+
DB_USER='<%=props.dbType !== "sqlite" ? props.dbConfig.user : ""%>'
|
|
23
|
+
DB_PASSWORD='<%=props.dbType !== "sqlite" ? props.dbConfig.password : ""%>'
|
|
24
|
+
|
|
25
|
+
# MySQL Root Password
|
|
26
|
+
MYSQL_ROOT_PASSWORD='<%=props.dbType === "mysql" ? props.dbConfig.adminPassword : ""%>'
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Directus Instance: <%= props.instanceName %>
|
|
2
|
+
|
|
3
|
+
Generated by [lenne.tech CLI](https://github.com/lenneTech/cli)
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
Start the Directus instance:
|
|
8
|
+
```bash
|
|
9
|
+
docker-compose up -d
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Stop the instance:
|
|
13
|
+
```bash
|
|
14
|
+
docker-compose down
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Restart the instance:
|
|
18
|
+
```bash
|
|
19
|
+
docker-compose restart
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
View logs:
|
|
23
|
+
```bash
|
|
24
|
+
docker-compose logs -f
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
View only Directus logs:
|
|
28
|
+
```bash
|
|
29
|
+
docker-compose logs -f directus
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Access
|
|
33
|
+
|
|
34
|
+
- **URL**: http://localhost:<%= props.port %>
|
|
35
|
+
- **Admin Email**: admin@example.com
|
|
36
|
+
- **Admin Password**: admin
|
|
37
|
+
|
|
38
|
+
**⚠️ IMPORTANT**: Change the admin password after first login!
|
|
39
|
+
|
|
40
|
+
## Configuration
|
|
41
|
+
|
|
42
|
+
All configuration is stored in the `.env` file. You can modify:
|
|
43
|
+
- Directus version (`DIRECTUS_VERSION`)
|
|
44
|
+
- Admin credentials
|
|
45
|
+
- Database settings
|
|
46
|
+
|
|
47
|
+
After modifying `.env`, restart the instance:
|
|
48
|
+
```bash
|
|
49
|
+
docker-compose down
|
|
50
|
+
docker-compose up -d
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Security
|
|
54
|
+
|
|
55
|
+
The `.env` file contains sensitive information:
|
|
56
|
+
- Security keys (KEY, SECRET)
|
|
57
|
+
- Admin credentials
|
|
58
|
+
- Database passwords
|
|
59
|
+
|
|
60
|
+
**Never commit the `.env` file to version control!**
|
|
61
|
+
|
|
62
|
+
## Volumes
|
|
63
|
+
|
|
64
|
+
The following Docker volumes are created for persistent data:
|
|
65
|
+
- `uploads` - User uploaded files
|
|
66
|
+
- `extensions` - Directus extensions
|
|
67
|
+
<% if (props.dbType === 'sqlite') { -%>
|
|
68
|
+
- `database` - SQLite database file
|
|
69
|
+
<% } else { -%>
|
|
70
|
+
- `db-data` - Database data
|
|
71
|
+
<% } -%>
|
|
72
|
+
|
|
73
|
+
## Backup
|
|
74
|
+
|
|
75
|
+
To backup your Directus instance:
|
|
76
|
+
|
|
77
|
+
1. **Backup volumes**:
|
|
78
|
+
```bash
|
|
79
|
+
docker-compose down
|
|
80
|
+
docker run --rm -v <%= props.instanceName %>-uploads:/data -v $(pwd):/backup alpine tar czf /backup/uploads-backup.tar.gz /data
|
|
81
|
+
docker run --rm -v <%= props.instanceName %>-extensions:/data -v $(pwd):/backup alpine tar czf /backup/extensions-backup.tar.gz /data
|
|
82
|
+
<% if (props.dbType === 'sqlite') { -%>
|
|
83
|
+
docker run --rm -v <%= props.instanceName %>-database:/data -v $(pwd):/backup alpine tar czf /backup/database-backup.tar.gz /data
|
|
84
|
+
<% } else if (props.dbType === 'postgres') { -%>
|
|
85
|
+
docker run --rm -v <%= props.instanceName %>-db-data:/data -v $(pwd):/backup alpine tar czf /backup/db-backup.tar.gz /data
|
|
86
|
+
<% } else if (props.dbType === 'mysql') { -%>
|
|
87
|
+
docker run --rm -v <%= props.instanceName %>-db-data:/data -v $(pwd):/backup alpine tar czf /backup/db-backup.tar.gz /data
|
|
88
|
+
<% } -%>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
2. **Backup `.env` file**:
|
|
92
|
+
```bash
|
|
93
|
+
cp .env .env.backup
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Troubleshooting
|
|
97
|
+
|
|
98
|
+
### Port already in use
|
|
99
|
+
If the port is already in use, update `DIRECTUS_PORT` in `.env`, then restart:
|
|
100
|
+
```bash
|
|
101
|
+
docker-compose down
|
|
102
|
+
docker-compose up -d
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Database connection issues
|
|
106
|
+
Check if the database container is healthy:
|
|
107
|
+
```bash
|
|
108
|
+
docker-compose ps
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
View database logs:
|
|
112
|
+
```bash
|
|
113
|
+
docker-compose logs <%= props.dbType %>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Reset instance
|
|
117
|
+
To completely reset the instance (⚠️ DELETES ALL DATA):
|
|
118
|
+
```bash
|
|
119
|
+
docker-compose down -v
|
|
120
|
+
docker-compose up -d
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Update Directus Version
|
|
124
|
+
|
|
125
|
+
**⚠️ WARNING**: Changing Directus versions may require database migrations. Major version changes often need a fresh database.
|
|
126
|
+
|
|
127
|
+
### For minor/patch updates (e.g., 10.0.0 → 10.0.1):
|
|
128
|
+
1. Edit `.env` and change `DIRECTUS_VERSION`
|
|
129
|
+
2. Pull the new image and restart:
|
|
130
|
+
```bash
|
|
131
|
+
docker-compose pull
|
|
132
|
+
docker-compose down
|
|
133
|
+
docker-compose up -d
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### For major updates (e.g., 10.x → 11.x):
|
|
137
|
+
**Recommended**: Create a backup first, then recreate with fresh volumes:
|
|
138
|
+
```bash
|
|
139
|
+
# Backup (see Backup section above)
|
|
140
|
+
docker-compose down -v
|
|
141
|
+
# Edit .env with new version
|
|
142
|
+
docker-compose up -d
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Note**: This will delete all data. Always backup before major version changes!
|
|
146
|
+
|
|
147
|
+
## Remove Instance
|
|
148
|
+
|
|
149
|
+
To completely remove this instance:
|
|
150
|
+
```bash
|
|
151
|
+
docker-compose down -v
|
|
152
|
+
cd ..
|
|
153
|
+
rm -rf <%= props.instanceName %>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## More Information
|
|
157
|
+
|
|
158
|
+
- [Directus Documentation](https://docs.directus.io/)
|
|
159
|
+
- [Docker Compose Documentation](https://docs.docker.com/compose/)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
version: "3.8"
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
<% if (props.dbType !== 'sqlite') { -%>
|
|
5
|
+
<%= props.dbType %>:
|
|
6
|
+
image: <%= props.dbConfig.image %>
|
|
7
|
+
container_name: <%= props.instanceName %>-<%= props.dbType %>
|
|
8
|
+
environment:
|
|
9
|
+
<% if (props.dbType === 'postgres') { -%>
|
|
10
|
+
POSTGRES_USER: ${DB_USER}
|
|
11
|
+
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
12
|
+
POSTGRES_DB: ${DB_DATABASE}
|
|
13
|
+
<% } else if (props.dbType === 'mysql') { -%>
|
|
14
|
+
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
|
15
|
+
MYSQL_DATABASE: ${DB_DATABASE}
|
|
16
|
+
MYSQL_USER: ${DB_USER}
|
|
17
|
+
MYSQL_PASSWORD: ${DB_PASSWORD}
|
|
18
|
+
<% } -%>
|
|
19
|
+
volumes:
|
|
20
|
+
- db-data:<%= props.dbType === 'postgres' ? '/var/lib/postgresql/data' : '/var/lib/mysql' %>
|
|
21
|
+
networks:
|
|
22
|
+
- directus-net
|
|
23
|
+
restart: unless-stopped
|
|
24
|
+
healthcheck:
|
|
25
|
+
<% if (props.dbType === 'postgres') { -%>
|
|
26
|
+
test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"]
|
|
27
|
+
<% } else if (props.dbType === 'mysql') { -%>
|
|
28
|
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
|
29
|
+
<% } -%>
|
|
30
|
+
interval: 10s
|
|
31
|
+
timeout: 5s
|
|
32
|
+
retries: 5
|
|
33
|
+
|
|
34
|
+
<% } -%>
|
|
35
|
+
directus:
|
|
36
|
+
image: directus/directus:${DIRECTUS_VERSION}
|
|
37
|
+
container_name: <%= props.instanceName %>
|
|
38
|
+
ports:
|
|
39
|
+
- "${DIRECTUS_PORT}:8055"
|
|
40
|
+
environment:
|
|
41
|
+
KEY: ${KEY}
|
|
42
|
+
SECRET: ${SECRET}
|
|
43
|
+
ADMIN_EMAIL: ${ADMIN_EMAIL}
|
|
44
|
+
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
|
|
45
|
+
DB_CLIENT: <%= props.dbConfig.client %>
|
|
46
|
+
<% if (props.dbType === 'sqlite') { -%>
|
|
47
|
+
DB_FILENAME: ${DB_FILENAME}
|
|
48
|
+
<% } else { -%>
|
|
49
|
+
DB_HOST: <%= props.dbType %>
|
|
50
|
+
DB_PORT: <%= props.dbConfig.port %>
|
|
51
|
+
DB_DATABASE: ${DB_DATABASE}
|
|
52
|
+
DB_USER: ${DB_USER}
|
|
53
|
+
DB_PASSWORD: ${DB_PASSWORD}
|
|
54
|
+
<% } -%>
|
|
55
|
+
WEBSOCKETS_ENABLED: true
|
|
56
|
+
volumes:
|
|
57
|
+
- uploads:/directus/uploads
|
|
58
|
+
- extensions:/directus/extensions
|
|
59
|
+
<% if (props.dbType === 'sqlite') { -%>
|
|
60
|
+
- database:/directus/database
|
|
61
|
+
<% } -%>
|
|
62
|
+
networks:
|
|
63
|
+
- directus-net
|
|
64
|
+
<% if (props.dbType !== 'sqlite') { -%>
|
|
65
|
+
depends_on:
|
|
66
|
+
<%= props.dbType %>:
|
|
67
|
+
condition: service_healthy
|
|
68
|
+
<% } -%>
|
|
69
|
+
restart: unless-stopped
|
|
70
|
+
|
|
71
|
+
volumes:
|
|
72
|
+
<% if (props.dbType !== 'sqlite') { -%>
|
|
73
|
+
db-data:
|
|
74
|
+
<% } else { -%>
|
|
75
|
+
database:
|
|
76
|
+
<% } -%>
|
|
77
|
+
uploads:
|
|
78
|
+
extensions:
|
|
79
|
+
|
|
80
|
+
networks:
|
|
81
|
+
directus-net:
|