@oktis-works/cms 0.1.14 → 0.2.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/dist/assets.d.ts +94 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +671 -0
- package/dist/assets.js.map +1 -0
- package/dist/bluegreen.d.ts +121 -0
- package/dist/bluegreen.d.ts.map +1 -0
- package/dist/bluegreen.js +393 -0
- package/dist/bluegreen.js.map +1 -0
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +116 -61
- package/dist/commands.js.map +1 -1
- package/dist/config-wizard.d.ts +39 -0
- package/dist/config-wizard.d.ts.map +1 -0
- package/dist/config-wizard.js +308 -0
- package/dist/config-wizard.js.map +1 -0
- package/dist/docker.d.ts +148 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +324 -0
- package/dist/docker.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +51 -0
- package/dist/doctor.js.map +1 -1
- package/dist/env-file.d.ts +45 -0
- package/dist/env-file.d.ts.map +1 -0
- package/dist/env-file.js +200 -0
- package/dist/env-file.js.map +1 -0
- package/dist/env-schema.d.ts +28 -0
- package/dist/env-schema.d.ts.map +1 -0
- package/dist/env-schema.js +497 -0
- package/dist/env-schema.js.map +1 -0
- package/dist/guards.d.ts +40 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +159 -0
- package/dist/guards.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +12 -3
- package/dist/parser.js.map +1 -1
- package/dist/project-config.js +2 -2
- package/dist/prompt.d.ts +81 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +379 -0
- package/dist/prompt.js.map +1 -0
- package/dist/redeploy.d.ts +109 -0
- package/dist/redeploy.d.ts.map +1 -0
- package/dist/redeploy.js +363 -0
- package/dist/redeploy.js.map +1 -0
- package/dist/scaffold-docs.d.ts +25 -6
- package/dist/scaffold-docs.d.ts.map +1 -1
- package/dist/scaffold-docs.js +711 -33
- package/dist/scaffold-docs.js.map +1 -1
- package/dist/scaffold.d.ts +17 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +77 -14
- package/dist/scaffold.js.map +1 -1
- package/dist/theme-build.d.ts +35 -0
- package/dist/theme-build.d.ts.map +1 -0
- package/dist/theme-build.js +86 -0
- package/dist/theme-build.js.map +1 -0
- package/dist/update.d.ts +51 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +210 -0
- package/dist/update.js.map +1 -0
- package/package.json +7 -7
package/dist/docker.js
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
// @oktis-works/cms - Camada Docker/Compose da CLI
|
|
2
|
+
//
|
|
3
|
+
// Toda a execução passa por um `Runner` injetável. Isso não é "teste por
|
|
4
|
+
// teste": blue/green tem passos que NÃO podem ser re-executados às cegas
|
|
5
|
+
// (migrar duas vezes, derrubar a lane certa), então os testes precisam
|
|
6
|
+
// inspecionar exatamente qual comando foi montado — e um runner falso é a
|
|
7
|
+
// única forma de fazer isso sem subir containers.
|
|
8
|
+
//
|
|
9
|
+
// Superfície de rede desta camada: `docker` e `docker compose` no socket
|
|
10
|
+
// local. Nenhuma URL é aberta aqui (o `bun add` do update fica isolado em
|
|
11
|
+
// `guards.ts` + allowlist do registry).
|
|
12
|
+
import { spawnSync } from 'node:child_process';
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import { dirname, join } from 'node:path';
|
|
15
|
+
import { DEPLOY_PATHS, renderUpstreams, portsFromEnv } from './assets.js';
|
|
16
|
+
function format(command, args) {
|
|
17
|
+
return [command, ...args].join(' ');
|
|
18
|
+
}
|
|
19
|
+
export const defaultRunner = (command, args, opts = {}) => {
|
|
20
|
+
const result = spawnSync(command, args, {
|
|
21
|
+
cwd: opts.cwd,
|
|
22
|
+
env: opts.env ?? process.env,
|
|
23
|
+
encoding: 'utf-8',
|
|
24
|
+
timeout: opts.timeoutMs,
|
|
25
|
+
stdio: opts.inherit ? 'inherit' : 'pipe',
|
|
26
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
ok: result.status === 0 && !result.error,
|
|
30
|
+
code: result.status,
|
|
31
|
+
stdout: result.stdout ?? '',
|
|
32
|
+
stderr: result.error ? `${result.stderr ?? ''}\n${result.error.message}` : (result.stderr ?? ''),
|
|
33
|
+
command: format(command, args),
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/** Comando que falhou por timeout (o spawnSync devolve error, não mensagem legível). */
|
|
37
|
+
export function failure(command, args, reason) {
|
|
38
|
+
return { ok: false, code: null, stdout: '', stderr: reason, command: format(command, args) };
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Disponibilidade
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
export function dockerAvailable(runner = defaultRunner) {
|
|
44
|
+
return runner('docker', ['version', '--format', '{{.Server.Version}}'], { timeoutMs: 15_000 }).ok;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* `docker compose` (v2, plugin) — o `docker-compose` legado (v1, Python) não
|
|
48
|
+
* é suportado: os arquivos usam `x-` extensions, `name:` e healthcheck
|
|
49
|
+
* `condition`, que só o v2 entende.
|
|
50
|
+
*/
|
|
51
|
+
export function composeAvailable(runner = defaultRunner) {
|
|
52
|
+
const result = runner('docker', ['compose', 'version', '--short'], { timeoutMs: 15_000 });
|
|
53
|
+
if (!result.ok)
|
|
54
|
+
return { ok: false, version: '' };
|
|
55
|
+
return { ok: true, version: result.stdout.trim() };
|
|
56
|
+
}
|
|
57
|
+
const SERVICE_KEYS = ['container_name', 'okcms.role', 'okcms.lane'];
|
|
58
|
+
/**
|
|
59
|
+
* Parser por indentação — não um YAML completo.
|
|
60
|
+
*
|
|
61
|
+
* O compose que a CLI lê é gerada por ela mesma; um parser de verdade
|
|
62
|
+
* (js-yaml) seria uma dependência nova num pacote que hoje não tem nenhuma,
|
|
63
|
+
* para extrair três campos. A restrição (chave em `services:` com indent 2,
|
|
64
|
+
* campos com indent maior) é verificada pelos testes contra o arquivo real.
|
|
65
|
+
*/
|
|
66
|
+
export function parseComposeServices(yaml) {
|
|
67
|
+
const services = [];
|
|
68
|
+
const lines = yaml.split(/\r?\n/);
|
|
69
|
+
let inServices = false;
|
|
70
|
+
let current = null;
|
|
71
|
+
for (const line of lines) {
|
|
72
|
+
if (/^services:\s*$/.test(line)) {
|
|
73
|
+
inServices = true;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// fim do bloco services: chave de nível 0 (networks:, volumes:, x-*)
|
|
77
|
+
if (inServices && /^[A-Za-z_-][\w-]*:\s*$/.test(line)) {
|
|
78
|
+
if (current)
|
|
79
|
+
services.push(current);
|
|
80
|
+
current = null;
|
|
81
|
+
inServices = false;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (!inServices)
|
|
85
|
+
continue;
|
|
86
|
+
const serviceMatch = /^ {2}([A-Za-z0-9][\w.-]*):\s*$/.exec(line);
|
|
87
|
+
if (serviceMatch) {
|
|
88
|
+
if (current)
|
|
89
|
+
services.push(current);
|
|
90
|
+
current = {
|
|
91
|
+
name: serviceMatch[1],
|
|
92
|
+
containerName: '',
|
|
93
|
+
role: 'unknown',
|
|
94
|
+
lane: null,
|
|
95
|
+
};
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (!current)
|
|
99
|
+
continue;
|
|
100
|
+
for (const key of SERVICE_KEYS) {
|
|
101
|
+
const match = new RegExp(`^\\s+${key.replace('.', '\\.')}:\\s*(\\S+)\\s*$`).exec(line);
|
|
102
|
+
if (!match)
|
|
103
|
+
continue;
|
|
104
|
+
const value = match[1].replace(/^["']|["']$/g, '');
|
|
105
|
+
if (key === 'container_name')
|
|
106
|
+
current.containerName = value;
|
|
107
|
+
else if (key === 'okcms.role')
|
|
108
|
+
current.role = value;
|
|
109
|
+
else
|
|
110
|
+
current.lane = value;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (current)
|
|
114
|
+
services.push(current);
|
|
115
|
+
return services;
|
|
116
|
+
}
|
|
117
|
+
export function classifyServices(services, lane) {
|
|
118
|
+
return {
|
|
119
|
+
edge: services.filter((service) => service.role === 'edge' && service.lane === lane),
|
|
120
|
+
worker: services.filter((service) => service.role === 'worker' && service.lane === lane),
|
|
121
|
+
untouched: services.filter((service) => service.role === 'data' || service.role === 'proxy'),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// Compose
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
export const INFRA_PROJECT = 'okcms';
|
|
128
|
+
export const infraProject = () => INFRA_PROJECT;
|
|
129
|
+
export const laneProject = (lane) => `okcms-${lane}`;
|
|
130
|
+
export const otherLane = (lane) => (lane === 'blue' ? 'green' : 'blue');
|
|
131
|
+
export const COMPOSE_INFRA_FILE = 'docker-compose.infra.yml';
|
|
132
|
+
export const COMPOSE_DEPLOY_FILE = 'docker-compose.deploy.yml';
|
|
133
|
+
/** `docker compose -p <projeto> -f <arquivo> ...` — a única forma montada aqui. */
|
|
134
|
+
export function composeArgs(call) {
|
|
135
|
+
const args = ['compose'];
|
|
136
|
+
if (call.project)
|
|
137
|
+
args.push('-p', call.project);
|
|
138
|
+
if (call.file)
|
|
139
|
+
args.push('-f', call.file);
|
|
140
|
+
args.push(...call.args);
|
|
141
|
+
return args;
|
|
142
|
+
}
|
|
143
|
+
export function runCompose(cwd, call, runner = defaultRunner) {
|
|
144
|
+
return runner('docker', composeArgs(call), {
|
|
145
|
+
cwd,
|
|
146
|
+
inherit: call.inherit ?? false,
|
|
147
|
+
timeoutMs: call.timeoutMs,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
export const infraCompose = (cwd, args, runner, inherit) => runCompose(cwd, { project: INFRA_PROJECT, file: COMPOSE_INFRA_FILE, args, inherit }, runner);
|
|
151
|
+
export const laneCompose = (cwd, lane, args, runner, inherit) => runCompose(cwd, { project: laneProject(lane), file: COMPOSE_DEPLOY_FILE, args, inherit }, runner);
|
|
152
|
+
/**
|
|
153
|
+
* `okcms-net` é declarada como `external: true` no compose das lanes — se ela
|
|
154
|
+
* não existir, o `up` falha com um erro obscuro. Criar antes torna o fluxo
|
|
155
|
+
* independente da ordem em que o operador rodou a infra.
|
|
156
|
+
*/
|
|
157
|
+
export function ensureNetwork(cwd, runner = defaultRunner) {
|
|
158
|
+
const inspect = runner('docker', ['network', 'inspect', 'okcms-net'], { timeoutMs: 15_000 });
|
|
159
|
+
if (inspect.ok)
|
|
160
|
+
return inspect;
|
|
161
|
+
return runner('docker', ['network', 'create', '--driver', 'bridge', 'okcms-net'], {
|
|
162
|
+
cwd,
|
|
163
|
+
timeoutMs: 30_000,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
// Estado da lane
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
export const LANE_STATE_PATH = '.deploy/state.json';
|
|
170
|
+
export function readLaneState(cwd) {
|
|
171
|
+
const path = join(cwd, LANE_STATE_PATH);
|
|
172
|
+
if (!existsSync(path))
|
|
173
|
+
return null;
|
|
174
|
+
try {
|
|
175
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
176
|
+
if (parsed.lane !== 'blue' && parsed.lane !== 'green')
|
|
177
|
+
return null;
|
|
178
|
+
return parsed;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// arquivo corrompido não pode derrubar o deploy: o fallback é o docker
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export function writeLaneState(cwd, state) {
|
|
186
|
+
const path = join(cwd, LANE_STATE_PATH);
|
|
187
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
188
|
+
writeFileSync(path, `${JSON.stringify(state, null, 2)}\n`, 'utf-8');
|
|
189
|
+
}
|
|
190
|
+
export function pushLaneState(previous, lane, version) {
|
|
191
|
+
const now = new Date().toISOString();
|
|
192
|
+
const history = [...(previous?.history ?? [])];
|
|
193
|
+
if (previous)
|
|
194
|
+
history.push({ lane: previous.lane, version: previous.version, at: previous.at });
|
|
195
|
+
return {
|
|
196
|
+
lane,
|
|
197
|
+
previousLane: previous?.lane ?? null,
|
|
198
|
+
version,
|
|
199
|
+
at: now,
|
|
200
|
+
// histórico é diagnóstico, não log infinito
|
|
201
|
+
history: history.slice(-20),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Containers de uma lane com `okcms.role=edge` em execução.
|
|
206
|
+
* Usado quando não há `.deploy/state.json` (primeira execução / clone limpo).
|
|
207
|
+
*/
|
|
208
|
+
export function edgeContainers(runner, lane) {
|
|
209
|
+
const result = runner('docker', [
|
|
210
|
+
'ps',
|
|
211
|
+
'--filter', `label=okcms.lane=${lane}`,
|
|
212
|
+
'--filter', 'label=okcms.role=edge',
|
|
213
|
+
'--format', '{{.Names}}',
|
|
214
|
+
], { timeoutMs: 15_000 });
|
|
215
|
+
if (!result.ok)
|
|
216
|
+
return [];
|
|
217
|
+
return result.stdout.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
218
|
+
}
|
|
219
|
+
/** Estado do file é a fonte de verdade; o docker é o fallback. */
|
|
220
|
+
export function detectActiveLane(cwd, runner = defaultRunner) {
|
|
221
|
+
const state = readLaneState(cwd);
|
|
222
|
+
if (state)
|
|
223
|
+
return state.lane;
|
|
224
|
+
if (edgeContainers(runner, 'blue').length > 0)
|
|
225
|
+
return 'blue';
|
|
226
|
+
if (edgeContainers(runner, 'green').length > 0)
|
|
227
|
+
return 'green';
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
export const STOPPED = { exists: false, running: false, health: null };
|
|
231
|
+
export function inspectContainer(runner, name) {
|
|
232
|
+
const result = runner('docker', [
|
|
233
|
+
'inspect',
|
|
234
|
+
'--format',
|
|
235
|
+
'{{.State.Status}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}',
|
|
236
|
+
name,
|
|
237
|
+
], { timeoutMs: 15_000 });
|
|
238
|
+
if (!result.ok)
|
|
239
|
+
return STOPPED;
|
|
240
|
+
const [status, health] = result.stdout.trim().split('|');
|
|
241
|
+
return {
|
|
242
|
+
exists: true,
|
|
243
|
+
running: status === 'running',
|
|
244
|
+
health: health ?? 'none',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
248
|
+
/** Aguarda um predicado sobre o estado do container; false = timeout. */
|
|
249
|
+
export async function waitForContainer(runner, name, predicate, opts = {}) {
|
|
250
|
+
const timeoutMs = opts.timeoutMs ?? 120_000;
|
|
251
|
+
const intervalMs = opts.intervalMs ?? 2_000;
|
|
252
|
+
const started = Date.now();
|
|
253
|
+
for (;;) {
|
|
254
|
+
const state = inspectContainer(runner, name);
|
|
255
|
+
if (predicate(state))
|
|
256
|
+
return true;
|
|
257
|
+
const elapsed = Date.now() - started;
|
|
258
|
+
if (elapsed >= timeoutMs)
|
|
259
|
+
return false;
|
|
260
|
+
opts.onTick?.(elapsed);
|
|
261
|
+
await sleep(Math.min(intervalMs, timeoutMs - elapsed));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** Container destruído ou sem healthcheck = "não está servindo". */
|
|
265
|
+
export const isServing = (state) => state.running && state.health !== 'unhealthy';
|
|
266
|
+
/**
|
|
267
|
+
* Pronto para receber tráfego: rodando e (quando tem healthcheck) healthy.
|
|
268
|
+
* `none` = serviço sem healthcheck definido — não dá para esperar mais nada.
|
|
269
|
+
*/
|
|
270
|
+
export const isHealthy = (state) => state.running && (state.health === 'healthy' || state.health === 'none');
|
|
271
|
+
export const isStopped = (state) => !state.running;
|
|
272
|
+
/**
|
|
273
|
+
* Espera ativa: o processo saiu da lista (`docker ps` não o mostra mais).
|
|
274
|
+
* `docker stop` já bloqueia até o `stop_grace_period`, então isto é um
|
|
275
|
+
* cinto e suspensório para o caso de o dreno estourar o tempo.
|
|
276
|
+
*/
|
|
277
|
+
export const waitStopped = (runner, name, opts = {}) => waitForContainer(runner, name, isStopped, { timeoutMs: 60_000, ...opts });
|
|
278
|
+
// ---------------------------------------------------------------------------
|
|
279
|
+
// Upstreams do proxy
|
|
280
|
+
// ---------------------------------------------------------------------------
|
|
281
|
+
export function upstreamsPath(cwd) {
|
|
282
|
+
return join(cwd, DEPLOY_PATHS.nginxUpstreams);
|
|
283
|
+
}
|
|
284
|
+
/** Grava os upstreams apontando para `lane` e devolve o texto. */
|
|
285
|
+
export function writeUpstreams(cwd, lane, record = {}) {
|
|
286
|
+
const ports = portsFromEnv(record);
|
|
287
|
+
const content = renderUpstreams(lane, ports);
|
|
288
|
+
const path = upstreamsPath(cwd);
|
|
289
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
290
|
+
writeFileSync(path, content, 'utf-8');
|
|
291
|
+
return content;
|
|
292
|
+
}
|
|
293
|
+
/** Lane que os upstreams atuais apontam — usada em doctor/rollback. */
|
|
294
|
+
export function readUpstreamsLane(cwd) {
|
|
295
|
+
const path = upstreamsPath(cwd);
|
|
296
|
+
if (!existsSync(path))
|
|
297
|
+
return null;
|
|
298
|
+
const text = readFileSync(path, 'utf-8');
|
|
299
|
+
if (/okcms-(?:api|web|admin)-blue\b/.test(text))
|
|
300
|
+
return 'blue';
|
|
301
|
+
if (/okcms-(?:api|web|admin)-green\b/.test(text))
|
|
302
|
+
return 'green';
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
export const PROXY_CONTAINER = 'okcms-proxy';
|
|
306
|
+
export function proxyRunning(runner = defaultRunner) {
|
|
307
|
+
return inspectContainer(runner, PROXY_CONTAINER).running;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* `nginx -s reload` é o coração do swap: re-lê a configuração nova com as
|
|
311
|
+
* conexões existentes vivas. Nunca `restart` — isso derrubaria o proxy (e o
|
|
312
|
+
* TLS/rotas junto) no meio do deploy.
|
|
313
|
+
*/
|
|
314
|
+
export function reloadProxy(cwd, runner = defaultRunner) {
|
|
315
|
+
return runner('docker', ['exec', PROXY_CONTAINER, 'nginx', '-s', 'reload'], {
|
|
316
|
+
cwd,
|
|
317
|
+
timeoutMs: 30_000,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/** Sobrescrita total da config do proxy (só quando `reload` falha). */
|
|
321
|
+
export function restartProxy(cwd, runner = defaultRunner) {
|
|
322
|
+
return runner('docker', ['restart', PROXY_CONTAINER], { cwd, timeoutMs: 60_000 });
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Runner } from './docker.js';
|
|
1
2
|
export interface CheckResult {
|
|
2
3
|
name: string;
|
|
3
4
|
ok: boolean;
|
|
@@ -18,5 +19,6 @@ export interface DoctorEnv {
|
|
|
18
19
|
export declare function runDoctorChecks(opts?: {
|
|
19
20
|
tcpProbe?: typeof checkTcp;
|
|
20
21
|
env?: DoctorEnv;
|
|
22
|
+
runner?: Runner;
|
|
21
23
|
}): Promise<CheckResult[]>;
|
|
22
24
|
//# sourceMappingURL=doctor.d.ts.map
|
package/dist/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAcrG;AAeD,8CAA8C;AAC9C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAYvF;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,eAAe,CACnC,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,SAAS,CAAA;CAAO,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAcrG;AAeD,8CAA8C;AAC9C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAYvF;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,eAAe,CACnC,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1E,OAAO,CAAC,WAAW,EAAE,CAAC,CAkIxB"}
|
package/dist/doctor.js
CHANGED
|
@@ -113,6 +113,57 @@ export async function runDoctorChecks(opts = {}) {
|
|
|
113
113
|
detail: configPath,
|
|
114
114
|
required: true,
|
|
115
115
|
});
|
|
116
|
+
// --- Deploy blue/green ---------------------------------------------------
|
|
117
|
+
// Nada aqui é `required: true`: projeto rodando local (`okcms start`) não
|
|
118
|
+
// precisa de Docker. O que importa é DIZER ao operador por que o deploy
|
|
119
|
+
// não vai funcionar, em vez de ele descobrir no meio de um swap.
|
|
120
|
+
//
|
|
121
|
+
// O módulo entra por dynamic import porque `env-schema` importa este
|
|
122
|
+
// arquivo — carregar os templates de deploy em `okcms config` seria peso
|
|
123
|
+
// morto em todo start de wizard.
|
|
124
|
+
const docker = await import('./docker.js');
|
|
125
|
+
const runner = opts.runner ?? docker.defaultRunner;
|
|
126
|
+
const dockerOk = docker.dockerAvailable(runner);
|
|
127
|
+
results.push({
|
|
128
|
+
name: 'docker',
|
|
129
|
+
ok: dockerOk,
|
|
130
|
+
detail: dockerOk
|
|
131
|
+
? 'daemon acessível'
|
|
132
|
+
: 'ausente ou parado — só afeta `okcms update --mode deploy`',
|
|
133
|
+
required: false,
|
|
134
|
+
});
|
|
135
|
+
const compose = docker.composeAvailable(runner);
|
|
136
|
+
results.push({
|
|
137
|
+
name: 'compose',
|
|
138
|
+
ok: compose.ok,
|
|
139
|
+
detail: compose.ok
|
|
140
|
+
? `plugin v2 (${compose.version || 'ok'})`
|
|
141
|
+
: 'plugin v2 ausente — `docker compose version` falhou (legado v1 não serve)',
|
|
142
|
+
required: false,
|
|
143
|
+
});
|
|
144
|
+
// Lane ativa: o estado salvo em .deploy/state.json, senão quem está no ar.
|
|
145
|
+
const lane = dockerOk ? docker.detectActiveLane(cwd, runner) : null;
|
|
146
|
+
results.push({
|
|
147
|
+
name: 'lane',
|
|
148
|
+
ok: dockerOk,
|
|
149
|
+
detail: !dockerOk
|
|
150
|
+
? 'docker indisponível'
|
|
151
|
+
: lane
|
|
152
|
+
? `lane ${lane} ativa (rollback: ${docker.otherLane(lane)})`
|
|
153
|
+
: 'nenhuma lane no ar — primeiro deploy',
|
|
154
|
+
required: false,
|
|
155
|
+
});
|
|
156
|
+
const proxy = dockerOk && docker.proxyRunning(runner);
|
|
157
|
+
results.push({
|
|
158
|
+
name: 'proxy',
|
|
159
|
+
ok: proxy || lane === null,
|
|
160
|
+
detail: proxy
|
|
161
|
+
? 'okcms-proxy no ar'
|
|
162
|
+
: lane === null
|
|
163
|
+
? 'ainda não implantado em Docker (uso local não precisa)'
|
|
164
|
+
: 'okcms-proxy parado com lane ativa — site inacessível',
|
|
165
|
+
required: false,
|
|
166
|
+
});
|
|
116
167
|
return results;
|
|
117
168
|
}
|
|
118
169
|
//# sourceMappingURL=doctor.js.map
|
package/dist/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface EnvLine {
|
|
2
|
+
/** `assign` = KEY=value; `raw` = comentário, linha em branco ou lixo. */
|
|
3
|
+
kind: 'assign' | 'raw';
|
|
4
|
+
raw: string;
|
|
5
|
+
key?: string;
|
|
6
|
+
value?: string;
|
|
7
|
+
/** Prefixo antes da chave (` ` ou `export `). */
|
|
8
|
+
prefix?: string;
|
|
9
|
+
/** Separador ao redor do `=` (ex.: `=`, ` = `). */
|
|
10
|
+
sep?: string;
|
|
11
|
+
/** Comentario final da linha, já sem a `#` (ex.: ` # nota`). */
|
|
12
|
+
suffix?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Volta a serializar um valor para o formato dotenv: cru quando não ambíguo,
|
|
16
|
+
* com aspas duplas quando contém espaço, `#`, aspas ou expansão de variável.
|
|
17
|
+
*/
|
|
18
|
+
export declare function serializeEnvValue(value: string): string;
|
|
19
|
+
export declare class EnvFile {
|
|
20
|
+
lines: EnvLine[];
|
|
21
|
+
readonly path: string | null;
|
|
22
|
+
constructor(text?: string, path?: string | null);
|
|
23
|
+
/** Linhas exatamente como estão no disco. */
|
|
24
|
+
toString(): string;
|
|
25
|
+
get(key: string): string | undefined;
|
|
26
|
+
/** Valor bruto (com aspas/comentário removidos apenas das pontas). */
|
|
27
|
+
has(key: string): boolean;
|
|
28
|
+
keys(): string[];
|
|
29
|
+
/** Todas as chaves → valor (sem aspas). */
|
|
30
|
+
toRecord(): Record<string, string>;
|
|
31
|
+
/**
|
|
32
|
+
* Define/insere uma chave. Na substituição preserva prefixo, separador e
|
|
33
|
+
* comentário final — é o que faz o wizard não "sujar" o arquivo.
|
|
34
|
+
*/
|
|
35
|
+
set(key: string, value: string): boolean;
|
|
36
|
+
/** Remove a linha de uma chave (mantém comentários em volta). */
|
|
37
|
+
delete(key: string): boolean;
|
|
38
|
+
/** Cria a chave abaixo do último comentário de uma seção (`# --- Foo ---`). */
|
|
39
|
+
setInSection(key: string, value: string, sectionHint: string): boolean;
|
|
40
|
+
save(path?: string | null, mode?: number): void;
|
|
41
|
+
}
|
|
42
|
+
export declare function parseEnv(text: string): EnvFile;
|
|
43
|
+
/** Lê `.env` (ou `.env.example` como fallback) — nunca lança se não existe. */
|
|
44
|
+
export declare function loadEnvFile(path: string): EnvFile;
|
|
45
|
+
//# sourceMappingURL=env-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-file.d.ts","sourceRoot":"","sources":["../src/env-file.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,OAAO;IACtB,yEAAyE;IACzE,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA+CD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,qBAAa,OAAO;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEjB,IAAI,SAAK,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW;IAOjD,6CAA6C;IAC7C,QAAQ,IAAI,MAAM;IAIlB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAMpC,sEAAsE;IACtE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,IAAI,IAAI,MAAM,EAAE;IAQhB,2CAA2C;IAC3C,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQlC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IA2BxC,iEAAiE;IACjE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM5B,+EAA+E;IAC/E,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IA2BtE,IAAI,CAAC,IAAI,gBAAY,EAAE,IAAI,SAAQ,GAAG,IAAI;CAW3C;AAWD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD"}
|