herdux-cli 0.7.0 → 0.9.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.
Files changed (50) hide show
  1. package/README.md +81 -25
  2. package/README.pt-BR.md +81 -25
  3. package/dist/commands/backup.d.ts.map +1 -1
  4. package/dist/commands/backup.js +29 -2
  5. package/dist/commands/backup.js.map +1 -1
  6. package/dist/commands/cloud.d.ts +3 -0
  7. package/dist/commands/cloud.d.ts.map +1 -0
  8. package/dist/commands/cloud.js +322 -0
  9. package/dist/commands/cloud.js.map +1 -0
  10. package/dist/commands/restore.d.ts.map +1 -1
  11. package/dist/commands/restore.js +33 -1
  12. package/dist/commands/restore.js.map +1 -1
  13. package/dist/core/interfaces/database-engine.interface.d.ts +1 -1
  14. package/dist/core/interfaces/database-engine.interface.d.ts.map +1 -1
  15. package/dist/index.js +4 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/infra/cloud/cloud-credential.d.ts +4 -0
  18. package/dist/infra/cloud/cloud-credential.d.ts.map +1 -0
  19. package/dist/infra/cloud/cloud-credential.js +16 -0
  20. package/dist/infra/cloud/cloud-credential.js.map +1 -0
  21. package/dist/infra/cloud/s3.service.d.ts +23 -0
  22. package/dist/infra/cloud/s3.service.d.ts.map +1 -0
  23. package/dist/infra/cloud/s3.service.js +114 -0
  24. package/dist/infra/cloud/s3.service.js.map +1 -0
  25. package/dist/infra/config/config.service.d.ts +11 -0
  26. package/dist/infra/config/config.service.d.ts.map +1 -1
  27. package/dist/infra/config/config.service.js +16 -0
  28. package/dist/infra/config/config.service.js.map +1 -1
  29. package/dist/infra/docker/docker.service.d.ts.map +1 -1
  30. package/dist/infra/docker/docker.service.js.map +1 -1
  31. package/dist/infra/engines/engine-factory.d.ts.map +1 -1
  32. package/dist/infra/engines/engine-factory.js +3 -0
  33. package/dist/infra/engines/engine-factory.js.map +1 -1
  34. package/dist/infra/engines/inspect-backup.d.ts +1 -0
  35. package/dist/infra/engines/inspect-backup.d.ts.map +1 -1
  36. package/dist/infra/engines/inspect-backup.js +14 -1
  37. package/dist/infra/engines/inspect-backup.js.map +1 -1
  38. package/dist/infra/engines/mongodb/mongodb-env.d.ts +11 -0
  39. package/dist/infra/engines/mongodb/mongodb-env.d.ts.map +1 -0
  40. package/dist/infra/engines/mongodb/mongodb-env.js +32 -0
  41. package/dist/infra/engines/mongodb/mongodb-env.js.map +1 -0
  42. package/dist/infra/engines/mongodb/mongodb.engine.d.ts +21 -0
  43. package/dist/infra/engines/mongodb/mongodb.engine.d.ts.map +1 -0
  44. package/dist/infra/engines/mongodb/mongodb.engine.js +282 -0
  45. package/dist/infra/engines/mongodb/mongodb.engine.js.map +1 -0
  46. package/dist/infra/engines/resolve-connection.d.ts +17 -0
  47. package/dist/infra/engines/resolve-connection.d.ts.map +1 -1
  48. package/dist/infra/engines/resolve-connection.js +4 -4
  49. package/dist/infra/engines/resolve-connection.js.map +1 -1
  50. package/package.json +7 -1
package/README.md CHANGED
@@ -12,12 +12,13 @@
12
12
 
13
13
  A fast, interactive CLI that removes friction from daily local database workflows, especially when juggling multiple instances and large datasets.
14
14
 
15
- ![Version](https://img.shields.io/badge/version-0.7.0-blue.svg)
15
+ ![Version](https://img.shields.io/badge/version-0.9.0-blue.svg)
16
16
  ![License](https://img.shields.io/badge/license-MIT-green.svg)
17
17
  ![Node](https://img.shields.io/badge/node-18%2B-43853d.svg)
18
18
  ![PostgreSQL](https://img.shields.io/badge/PostgreSQL-316192?style=flat&logo=postgresql&logoColor=white)
19
19
  ![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=flat&logo=mysql&logoColor=white)
20
20
  ![SQLite](https://img.shields.io/badge/SQLite-003B57?style=flat&logo=sqlite&logoColor=white)
21
+ ![MongoDB](https://img.shields.io/badge/MongoDB-47A248?style=flat&logo=mongodb&logoColor=white)
21
22
  [![GitHub Sponsors](https://img.shields.io/badge/Sponsor-%E2%9D%A4-pink?style=flat&logo=github)](https://github.com/sponsors/eduardozaniboni)
22
23
  [![Buy Me A Coffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=flat&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/eduardozaniboni)
23
24
 
@@ -39,11 +40,12 @@ herdux list
39
40
 
40
41
  ## Supported Engines
41
42
 
42
- | Engine | Status | Client Tools Required |
43
- | ---------- | ------ | ------------------------------- |
44
- | PostgreSQL | ✅ | `psql`, `pg_dump`, `pg_restore` |
45
- | MySQL | ✅ | `mysql`, `mysqldump` |
46
- | SQLite | ✅ | `sqlite3` |
43
+ | Engine | Status | Client Tools Required |
44
+ | ---------- | ------ | -------------------------------------- |
45
+ | PostgreSQL | ✅ | `psql`, `pg_dump`, `pg_restore` |
46
+ | MySQL | ✅ | `mysql`, `mysqldump` |
47
+ | SQLite | ✅ | `sqlite3` |
48
+ | MongoDB | ✅ | `mongosh`, `mongodump`, `mongorestore` |
47
49
 
48
50
  Use `--engine <name>` or configure the engine in a saved profile. PostgreSQL is the default.
49
51
 
@@ -51,6 +53,7 @@ Use `--engine <name>` or configure the engine in a saved profile. PostgreSQL is
51
53
  herdux list # PostgreSQL (default)
52
54
  herdux --engine mysql list # MySQL
53
55
  herdux --engine sqlite list # SQLite (file-based, no server required)
56
+ herdux --engine mongodb list # MongoDB
54
57
  herdux list -s my-profile # Using a saved server profile
55
58
  ```
56
59
 
@@ -91,6 +94,7 @@ Same commands. Any engine. Fewer flags. Fewer mistakes. Zero terminal fatigue.
91
94
  - **For PostgreSQL:** `psql`, `pg_dump`, `pg_restore` installed and in your `PATH`
92
95
  - **For MySQL:** `mysql`, `mysqldump` installed and in your `PATH`
93
96
  - **For SQLite:** `sqlite3` installed and in your `PATH`
97
+ - **For MongoDB:** `mongosh`, `mongodump`, `mongorestore` installed and in your `PATH`
94
98
 
95
99
  > [!TIP]
96
100
  > Run `herdux doctor` after installation to verify everything is correctly set up.
@@ -191,19 +195,23 @@ Aborts immediately if any safety backup fails. No data is dropped without a conf
191
195
  Creates a timestamped backup in `~/.herdux/backups/` by default.
192
196
 
193
197
  ```bash
194
- herdux backup mydb # Engine-native format (.dump for PG, .db for SQLite, .sql for MySQL)
195
- herdux backup mydb --format plain # Plain SQL (.sql)
196
- herdux backup mydb --drop # Backup, then prompt to drop
197
- herdux backup mydb --drop --yes # Backup + drop, no confirmation
198
- herdux backup mydb -o ./my-backups # Custom output directory
198
+ herdux backup mydb # Engine-native format (.dump for PG, .db for SQLite, .sql for MySQL, .mongodump for MongoDB)
199
+ herdux backup mydb --format plain # Plain SQL (.sql) — not supported by MongoDB
200
+ herdux backup mydb --drop # Backup, then prompt to drop
201
+ herdux backup mydb --drop --yes # Backup + drop, no confirmation
202
+ herdux backup mydb -o ./my-backups # Custom output directory
203
+ herdux backup mydb --upload backups/ # Backup and upload to S3 prefix backups/
204
+ herdux backup mydb --upload backups/ --no-keep # Backup, upload, then delete local file
199
205
  ```
200
206
 
201
- | Option | Description |
202
- | --------------------- | ----------------------------------------------------- |
203
- | `-F, --format <type>` | `custom` (default, engine-native) or `plain` (SQL) |
204
- | `-d, --drop` | Prompt to drop the database after a successful backup |
205
- | `-y, --yes` | Skip drop confirmation (requires `--drop`) |
206
- | `-o, --output <dir>` | Output directory (default: `~/.herdux/backups`) |
207
+ | Option | Description |
208
+ | --------------------- | ----------------------------------------------------------------- |
209
+ | `-F, --format <type>` | `custom` (default, engine-native) or `plain` (SQL) |
210
+ | `-d, --drop` | Prompt to drop the database after a successful backup |
211
+ | `-y, --yes` | Skip drop confirmation (requires `--drop`) |
212
+ | `-o, --output <dir>` | Output directory (default: `~/.herdux/backups`) |
213
+ | `--upload [prefix]` | Upload backup to S3 after creation (requires cloud config) |
214
+ | `--no-keep` | Delete local backup after successful upload (requires `--upload`) |
207
215
 
208
216
  ---
209
217
 
@@ -228,16 +236,20 @@ The target database is automatically created if it does not exist.
228
236
 
229
237
  Inspects the contents of a backup file without connecting to a database. Completely offline.
230
238
 
231
- | Extension | Output |
232
- | ----------------- | ---------------------------------------------------------------------- |
233
- | `.dump` | PostgreSQL custom format: full Table of Contents (`pg_restore --list`) |
234
- | `.sql` | Plain SQL (any engine): CREATE TABLE, VIEW, INDEX, SEQUENCE statements |
235
- | `.db` / `.sqlite` | SQLite database file: schema (`sqlite3 .schema`) |
239
+ | Extension | Output |
240
+ | ----------------- | ---------------------------------------------------------------------------- |
241
+ | `.dump` | PostgreSQL custom format: full Table of Contents (`pg_restore --list`) |
242
+ | `.tar` | PostgreSQL tar format: full Table of Contents (`pg_restore --list`) |
243
+ | `.sql` | Plain SQL (any engine): CREATE TABLE, VIEW, INDEX, SEQUENCE statements |
244
+ | `.db` / `.sqlite` | SQLite database file: schema (`sqlite3 .schema`) |
245
+ | `.mongodump` | MongoDB archive: collection list dry-run (`mongorestore --archive --dryRun`) |
236
246
 
237
247
  ```bash
238
- hdx inspect backup.dump # Table of Contents of a PostgreSQL custom dump
239
- hdx inspect export.sql # CREATE statements extracted from plain SQL
240
- hdx inspect mydb.db # SQLite schema
248
+ hdx inspect backup.dump # Table of Contents of a PostgreSQL custom dump
249
+ hdx inspect backup.tar # Table of Contents of a PostgreSQL tar dump
250
+ hdx inspect export.sql # CREATE statements extracted from plain SQL
251
+ hdx inspect mydb.db # SQLite schema
252
+ hdx inspect mydb_2026-03-04.mongodump # MongoDB archive collection listing
241
253
  ```
242
254
 
243
255
  ---
@@ -256,6 +268,50 @@ hdx docker stop pg-dev --remove # Stop and remove the container
256
268
 
257
269
  ---
258
270
 
271
+ ### `herdux cloud`
272
+
273
+ Manages backup files in S3-compatible cloud storage (AWS S3, Cloudflare R2, MinIO, DigitalOcean Spaces, and others).
274
+
275
+ ```bash
276
+ # Configure
277
+ hdx cloud config bucket my-bucket
278
+ hdx cloud config region us-east-1
279
+ hdx cloud config access-key AKIAIO...
280
+ hdx cloud config secret-key wJalrX...
281
+ hdx cloud config endpoint https://account.r2.cloudflarestorage.com # optional, for non-AWS providers
282
+
283
+ # Browse and manage backups in the bucket
284
+ hdx cloud list # Directory mode: list immediate children at root
285
+ hdx cloud list backups/mydb/ # List immediate children at path (positional)
286
+ hdx cloud list --prefix backups/mydb/ # Same as above (flag form)
287
+ hdx cloud list --recursive # List all objects in the bucket
288
+ hdx cloud list backups/ --recursive # List all objects under a prefix
289
+ hdx cloud download backups/mydb_2026-03-03.dump # Save to ~/.herdux/backups/
290
+ hdx cloud download backups/mydb_2026-03-03.dump -o /tmp/ # Save to custom directory
291
+ hdx cloud upload ./mydb_2026-03-03.dump # Upload file to bucket root
292
+ hdx cloud upload ./mydb_2026-03-03.dump --prefix backups/ # Upload under a prefix
293
+ hdx cloud delete backups/mydb_2026-03-03.dump # Verifies existence, then asks for confirmation
294
+ hdx cloud delete backups/mydb_2026-03-03.dump --yes
295
+
296
+ # Backup directly to S3
297
+ hdx backup mydb --upload backups/ # Backup and upload to prefix backups/
298
+ hdx backup mydb --upload # Backup and upload to bucket root
299
+ hdx backup mydb --upload backups/ --no-keep # Backup, upload, then delete local file
300
+
301
+ # Restore directly from S3
302
+ hdx restore s3://my-bucket/backups/mydb_2026-03-03.dump --db mydb
303
+ ```
304
+
305
+ Credentials can also be provided via env vars (recommended for CI/production):
306
+
307
+ ```bash
308
+ export AWS_ACCESS_KEY_ID=AKIAIO...
309
+ export AWS_SECRET_ACCESS_KEY=wJalrX...
310
+ export AWS_DEFAULT_REGION=us-east-1
311
+ ```
312
+
313
+ ---
314
+
259
315
  ## Configuration & Server Profiles
260
316
 
261
317
  Configuration is stored at `~/.herdux/config.json`.
package/README.pt-BR.md CHANGED
@@ -12,12 +12,13 @@
12
12
 
13
13
  Uma CLI rápida e interativa que remove a fricção dos workflows diários com bancos de dados locais, especialmente ao lidar com múltiplas instâncias e grandes datasets.
14
14
 
15
- ![Version](https://img.shields.io/badge/version-0.7.0-blue.svg)
15
+ ![Version](https://img.shields.io/badge/version-0.9.0-blue.svg)
16
16
  ![License](https://img.shields.io/badge/license-MIT-green.svg)
17
17
  ![Node](https://img.shields.io/badge/node-18%2B-43853d.svg)
18
18
  ![PostgreSQL](https://img.shields.io/badge/PostgreSQL-316192?style=flat&logo=postgresql&logoColor=white)
19
19
  ![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=flat&logo=mysql&logoColor=white)
20
20
  ![SQLite](https://img.shields.io/badge/SQLite-003B57?style=flat&logo=sqlite&logoColor=white)
21
+ ![MongoDB](https://img.shields.io/badge/MongoDB-47A248?style=flat&logo=mongodb&logoColor=white)
21
22
  [![GitHub Sponsors](https://img.shields.io/badge/Sponsor-%E2%9D%A4-pink?style=flat&logo=github)](https://github.com/sponsors/eduardozaniboni)
22
23
  [![Buy Me A Coffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=flat&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/eduardozaniboni)
23
24
 
@@ -39,11 +40,12 @@ herdux list
39
40
 
40
41
  ## Engines Suportadas
41
42
 
42
- | Engine | Status | Ferramentas Cliente Necessárias |
43
- | ---------- | ------ | ------------------------------- |
44
- | PostgreSQL | ✅ | `psql`, `pg_dump`, `pg_restore` |
45
- | MySQL | ✅ | `mysql`, `mysqldump` |
46
- | SQLite | ✅ | `sqlite3` |
43
+ | Engine | Status | Ferramentas Cliente Necessárias |
44
+ | ---------- | ------ | -------------------------------------- |
45
+ | PostgreSQL | ✅ | `psql`, `pg_dump`, `pg_restore` |
46
+ | MySQL | ✅ | `mysql`, `mysqldump` |
47
+ | SQLite | ✅ | `sqlite3` |
48
+ | MongoDB | ✅ | `mongosh`, `mongodump`, `mongorestore` |
47
49
 
48
50
  Use `--engine <nome>` ou configure a engine em um perfil salvo. PostgreSQL é o padrão.
49
51
 
@@ -51,6 +53,7 @@ Use `--engine <nome>` ou configure a engine em um perfil salvo. PostgreSQL é o
51
53
  herdux list # PostgreSQL (padrão)
52
54
  herdux --engine mysql list # MySQL
53
55
  herdux --engine sqlite list # SQLite (baseado em arquivos, sem servidor)
56
+ herdux --engine mongodb list # MongoDB
54
57
  herdux list -s meu-perfil # Usando um perfil de servidor salvo
55
58
  ```
56
59
 
@@ -91,6 +94,7 @@ Mesmos comandos. Qualquer engine. Menos flags. Menos erros. Zero fadiga de termi
91
94
  - **Para PostgreSQL:** `psql`, `pg_dump`, `pg_restore` instalados e no `PATH`
92
95
  - **Para MySQL:** `mysql`, `mysqldump` instalados e no `PATH`
93
96
  - **Para SQLite:** `sqlite3` instalado e no `PATH`
97
+ - **Para MongoDB:** `mongosh`, `mongodump`, `mongorestore` instalados e no `PATH`
94
98
 
95
99
  > [!TIP]
96
100
  > Execute `herdux doctor` após a instalação para verificar se tudo está configurado corretamente.
@@ -191,19 +195,23 @@ Aborta imediatamente se algum backup de segurança falhar. Nenhum dado é removi
191
195
  Cria um backup com timestamp em `~/.herdux/backups/` por padrão.
192
196
 
193
197
  ```bash
194
- herdux backup mydb # Formato nativo da engine (.dump para PG, .db para SQLite, .sql para MySQL)
195
- herdux backup mydb --format plain # SQL puro (.sql)
196
- herdux backup mydb --drop # Backup e depois pergunta se quer dropar
197
- herdux backup mydb --drop --yes # Backup + drop sem confirmação
198
- herdux backup mydb -o ./meus-backups # Diretório de saída personalizado
198
+ herdux backup mydb # Formato nativo da engine (.dump para PG, .db para SQLite, .sql para MySQL, .mongodump para MongoDB)
199
+ herdux backup mydb --format plain # SQL puro (.sql)
200
+ herdux backup mydb --drop # Backup e depois pergunta se quer dropar
201
+ herdux backup mydb --drop --yes # Backup + drop sem confirmacao
202
+ herdux backup mydb -o ./meus-backups # Diretorio de saida personalizado
203
+ herdux backup mydb --upload backups/ # Backup e upload para o prefixo backups/ no S3
204
+ herdux backup mydb --upload backups/ --no-keep # Backup, upload e deleta o arquivo local
199
205
  ```
200
206
 
201
- | Opção | Descrição |
202
- | --------------------- | ---------------------------------------------------------- |
203
- | `-F, --format <tipo>` | `custom` (padrão, nativo da engine) ou `plain` (SQL) |
204
- | `-d, --drop` | Pergunta se quer dropar o banco após o backup bem-sucedido |
205
- | `-y, --yes` | Pula a confirmação de drop (requer `--drop`) |
206
- | `-o, --output <dir>` | Diretório de saída (padrão: `~/.herdux/backups`) |
207
+ | Opcao | Descricao |
208
+ | --------------------- | ------------------------------------------------------------------- |
209
+ | `-F, --format <tipo>` | `custom` (padrao, nativo da engine) ou `plain` (SQL) |
210
+ | `-d, --drop` | Pergunta se quer dropar o banco apos o backup bem-sucedido |
211
+ | `-y, --yes` | Pula a confirmacao de drop (requer `--drop`) |
212
+ | `-o, --output <dir>` | Diretorio de saida (padrao: `~/.herdux/backups`) |
213
+ | `--upload [prefix]` | Faz upload do backup para o S3 apos a criacao (requer cloud config) |
214
+ | `--no-keep` | Deleta o arquivo local apos upload bem-sucedido (requer `--upload`) |
207
215
 
208
216
  ---
209
217
 
@@ -228,16 +236,20 @@ O banco de dados é criado automaticamente se não existir.
228
236
 
229
237
  Inspeciona o conteúdo de um arquivo de backup sem se conectar ao banco de dados. Funciona completamente offline.
230
238
 
231
- | Extensão | Output |
232
- | ----------------- | ------------------------------------------------------------------------------ |
233
- | `.dump` | Formato custom do PostgreSQL: Table of Contents completo (`pg_restore --list`) |
234
- | `.sql` | SQL puro (qualquer engine): declarações CREATE TABLE, VIEW, INDEX, SEQUENCE |
235
- | `.db` / `.sqlite` | Arquivo SQLite: schema (`sqlite3 .schema`) |
239
+ | Extensão | Output |
240
+ | ----------------- | ---------------------------------------------------------------------------------------- |
241
+ | `.dump` | Formato custom do PostgreSQL: Table of Contents completo (`pg_restore --list`) |
242
+ | `.tar` | Formato tar do PostgreSQL: Table of Contents completo (`pg_restore --list`) |
243
+ | `.sql` | SQL puro (qualquer engine): declarações CREATE TABLE, VIEW, INDEX, SEQUENCE |
244
+ | `.db` / `.sqlite` | Arquivo SQLite: schema (`sqlite3 .schema`) |
245
+ | `.mongodump` | Archive MongoDB: listagem de collections via dry-run (`mongorestore --archive --dryRun`) |
236
246
 
237
247
  ```bash
238
- hdx inspect backup.dump # Table of Contents de um dump custom do PostgreSQL
239
- hdx inspect export.sql # CREATE statements extraídos de SQL puro
240
- hdx inspect mydb.db # Schema do SQLite
248
+ hdx inspect backup.dump # Table of Contents de um dump custom do PostgreSQL
249
+ hdx inspect backup.tar # Table of Contents de um dump tar do PostgreSQL
250
+ hdx inspect export.sql # CREATE statements extraídos de SQL puro
251
+ hdx inspect mydb.db # Schema do SQLite
252
+ hdx inspect mydb_2026-03-04.mongodump # Listagem de collections do archive MongoDB
241
253
  ```
242
254
 
243
255
  ---
@@ -256,6 +268,50 @@ hdx docker stop pg-dev --remove # Para e remove o container
256
268
 
257
269
  ---
258
270
 
271
+ ### `herdux cloud`
272
+
273
+ Gerencia arquivos de backup em cloud storage S3-compatible (AWS S3, Cloudflare R2, MinIO, DigitalOcean Spaces e outros).
274
+
275
+ ```bash
276
+ # Configurar
277
+ hdx cloud config bucket meu-bucket
278
+ hdx cloud config region us-east-1
279
+ hdx cloud config access-key AKIAIO...
280
+ hdx cloud config secret-key wJalrX...
281
+ hdx cloud config endpoint https://account.r2.cloudflarestorage.com # opcional, para provedores nao-AWS
282
+
283
+ # Navegar e gerenciar backups no bucket
284
+ hdx cloud list # Modo diretorio: lista filhos imediatos na raiz
285
+ hdx cloud list backups/mydb/ # Lista filhos imediatos no caminho (posicional)
286
+ hdx cloud list --prefix backups/mydb/ # Mesmo que acima (forma de flag)
287
+ hdx cloud list --recursive # Lista todos os objetos no bucket
288
+ hdx cloud list backups/ --recursive # Lista todos os objetos sob um prefixo
289
+ hdx cloud download backups/mydb_2026-03-03.dump # Salva em ~/.herdux/backups/
290
+ hdx cloud download backups/mydb_2026-03-03.dump -o /tmp/ # Salva em diretorio personalizado
291
+ hdx cloud upload ./mydb_2026-03-03.dump # Envia arquivo local para a raiz do bucket
292
+ hdx cloud upload ./mydb_2026-03-03.dump --prefix backups/ # Envia sob um prefixo
293
+ hdx cloud delete backups/mydb_2026-03-03.dump # Verifica existencia e pede confirmacao
294
+ hdx cloud delete backups/mydb_2026-03-03.dump --yes
295
+
296
+ # Backup direto para o S3
297
+ hdx backup mydb --upload backups/ # Backup e upload para o prefixo backups/
298
+ hdx backup mydb --upload # Backup e upload para a raiz do bucket
299
+ hdx backup mydb --upload backups/ --no-keep # Backup, upload e deleta o arquivo local
300
+
301
+ # Restore direto do S3
302
+ hdx restore s3://meu-bucket/backups/mydb_2026-03-03.dump --db mydb
303
+ ```
304
+
305
+ As credenciais tambem podem ser fornecidas via variaveis de ambiente (recomendado para CI/producao):
306
+
307
+ ```bash
308
+ export AWS_ACCESS_KEY_ID=AKIAIO...
309
+ export AWS_SECRET_ACCESS_KEY=wJalrX...
310
+ export AWS_DEFAULT_REGION=us-east-1
311
+ ```
312
+
313
+ ---
314
+
259
315
  ## Configuração e Perfis de Servidor
260
316
 
261
317
  A configuração é armazenada em `~/.herdux/config.json`.
@@ -1 +1 @@
1
- {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+G5D"}
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8J5D"}
@@ -3,8 +3,11 @@ import ora from "ora";
3
3
  import prompts from "prompts";
4
4
  import { resolveEngineAndConnection } from "../infra/engines/resolve-connection.js";
5
5
  import * as config from "../infra/config/config.service.js";
6
- import { join } from "path";
6
+ import { resolveCloudCredentials } from "../infra/cloud/cloud-credential.js";
7
+ import { uploadFile } from "../infra/cloud/s3.service.js";
8
+ import { basename, join } from "path";
7
9
  import { homedir } from "os";
10
+ import { unlinkSync } from "fs";
8
11
  export function registerBackupCommand(program) {
9
12
  program
10
13
  .command("backup <database>")
@@ -15,11 +18,16 @@ Examples:
15
18
  hdx backup mydb --output /tmp/backups
16
19
  hdx backup mydb --format plain
17
20
  hdx backup mydb --drop --yes # Backup then drop without confirmation
18
- hdx backup mydb --engine mysql`)
21
+ hdx backup mydb --engine mysql
22
+ hdx backup mydb --upload backups/
23
+ hdx backup mydb --upload # Upload to bucket root
24
+ hdx backup mydb --upload --no-keep # Upload and delete local file`)
19
25
  .option("-o, --output <dir>", "Output directory for the backup (overrides global config)")
20
26
  .option("-d, --drop", "Ask to drop the database after a successful backup")
21
27
  .option("-y, --yes", "Skip confirmation when dropping (requires --drop)")
22
28
  .option("-F, --format <type>", "Backup format format (custom, plain)", "custom")
29
+ .option("-u, --upload [prefix]", "Upload backup to configured S3 bucket after backup")
30
+ .option("--no-keep", "Delete local backup after successful upload (requires --upload)")
23
31
  .action(async (database, cmdOpts) => {
24
32
  if (/[\s;|&`$<>(){}\\]/.test(database)) {
25
33
  console.error(chalk.red(`\n✖ Invalid database name "${database}". Avoid spaces and special characters (; | & \` $ < > ( ) { } \\).\n`));
@@ -43,6 +51,25 @@ Examples:
43
51
  const spinner = ora(`Generating backup for "${database}"...`).start();
44
52
  const outputPath = await engine.backupDatabase(database, finalOutputDir, opts, cmdOpts.format);
45
53
  spinner.succeed(`Backup saved at ${chalk.cyan(outputPath)}\n`);
54
+ if (cmdOpts.upload !== undefined) {
55
+ const cloud = config.getCloudConfig();
56
+ if (!cloud.bucket) {
57
+ console.error(chalk.red("✖ Bucket not configured. Run: hdx cloud config bucket NAME\n"));
58
+ process.exit(1);
59
+ }
60
+ const creds = resolveCloudCredentials(cloud);
61
+ const prefix = typeof cmdOpts.upload === "string" ? cmdOpts.upload : "";
62
+ const key = prefix
63
+ ? `${prefix.replace(/\/$/, "")}/${basename(outputPath)}`
64
+ : basename(outputPath);
65
+ const uploadSpinner = ora(`Uploading to s3://${cloud.bucket}/${key}...`).start();
66
+ const s3Url = await uploadFile(outputPath, cloud.bucket, key, creds);
67
+ uploadSpinner.succeed(`Uploaded: ${chalk.cyan(s3Url)}\n`);
68
+ if (!cmdOpts.keep) {
69
+ unlinkSync(outputPath);
70
+ console.log(chalk.gray(` Local backup deleted.\n`));
71
+ }
72
+ }
46
73
  if (cmdOpts.drop) {
47
74
  let shouldDrop = cmdOpts.yes;
48
75
  if (!shouldDrop) {
@@ -1 +1 @@
1
- {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerCloudCommand(program: Command): void;
3
+ //# sourceMappingURL=cloud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyDzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0Y3D"}