smoonb 0.0.56 → 0.0.58

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 ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) Goalmoon Tecnologia Ltda.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md CHANGED
@@ -1,32 +1,43 @@
1
- # smoonb
1
+ # Supa Moonbase (smoonb)
2
2
 
3
3
  **Complete Supabase backup and migration tool**
4
4
 
5
- ## ⚠️ EXPERIMENTAL VERSION - NÃO TESTADA - USE POR SUA CONTA E RISCO
5
+ A primeira ferramenta CLI completa para backup e migração de projetos Supabase. Resolve o problema de backup incompleto das ferramentas existentes.
6
6
 
7
- **🚨 AVISO IMPORTANTE:**
8
- - Este software **NUNCA** foi testado em produção
9
- - **USE POR SUA CONTA E RISCO** - Pode causar perda irreparável de dados
10
- - **NÃO NOS RESPONSABILIZAMOS** por qualquer perda de dados
11
- - **NENHUM SUPORTE** é oferecido nesta fase - apenas aceitamos contribuições
7
+ > **Nota sobre acesso comercial:** o Supa Moonbase passará a exigir validação de conta antes de executar operações (login + verificação de assinatura) em fase futura. Nesta versão, não há autenticação implementada — este README apenas apresenta a base legal/comercial. O uso operacional será regido pelos [Termos de Serviço](https://smoonb.com/terms) e pela [Política de Privacidade](https://smoonb.com/privacy).
12
8
 
13
- **Desenvolvido por:** Goalmoon Tecnologia LTDA (https://goalmoon.com)
9
+ **Desenvolvido por:** Goalmoon Tecnologia LTDA
10
+ **Website:** https://smoonb.com
11
+ **GitHub:** https://github.com/almmello/smoonb
14
12
 
15
13
  ## 🎯 Objetivo
16
14
 
17
- O **smoonb** resolve o problema das ferramentas existentes que fazem backup apenas da database PostgreSQL, ignorando componentes críticos do Supabase:
15
+ O **smoonb** resolve o problema das ferramentas existentes que fazem backup apenas da database PostgreSQL, ignorando componentes críticos do Supabase.
16
+
17
+ ## 📦 Componentes de Backup
18
18
 
19
- - **Database PostgreSQL** (backup completo via `pg_dumpall`, idêntico ao Dashboard)
20
- - ✅ **Database SQL Separado** (schema, data, roles em arquivos separados para troubleshooting)
19
+ O smoonb faz backup completo de todos os componentes do seu projeto Supabase:
20
+
21
+ - ✅ **Database PostgreSQL** (backup completo via `pg_dumpall` + SQL separados, idêntico ao Dashboard)
21
22
  - ✅ **Database Extensions and Settings** (extensões PostgreSQL e configurações)
23
+ - ✅ **Custom Roles** (roles personalizados do PostgreSQL)
22
24
  - ✅ **Edge Functions** (download automático do servidor)
23
25
  - ✅ **Auth Settings** (configurações de autenticação via Management API)
24
26
  - ✅ **Storage Buckets** (metadados e configurações via Management API)
25
- - ✅ **Realtime Settings** (publicações e configurações capturadas interativamente)
26
- - ✅ **Custom Roles** (roles personalizados do PostgreSQL)
27
+ - ✅ **Realtime Settings** (7 parâmetros capturados interativamente)
27
28
  - ✅ **Supabase .temp** (arquivos temporários do Supabase CLI)
28
29
  - ✅ **Migrations** (todas as migrations do projeto via `supabase migration fetch`)
29
30
 
31
+ ## ⚠️ Termo de Uso e Aviso de Risco
32
+
33
+ Ao usar o smoonb, você reconhece e concorda que o smoonb é fornecido "NO ESTADO EM QUE SE ENCONTRA" ("AS IS") e "CONFORME DISPONIBILIDADE", sem garantias de qualquer natureza—expressas, implícitas ou legais—incluindo, sem limitação, garantias de comercialização, adequação a um fim específico e não violação, na máxima extensão permitida pela lei aplicável.
34
+
35
+ Operações de backup e restauração envolvem riscos, os ambientes variam amplamente e não é possível prever ou validar todas as configurações dos usuários. Você é o único responsável por validar seu ambiente, manter cópias independentes e verificar os resultados antes de utilizá-los em produção.
36
+
37
+ **Limitação de responsabilidade (PT-BR)** — Na máxima extensão permitida por lei, a Goalmoon, seus contribuidores e licenciadores não serão responsáveis por danos indiretos, incidentais, especiais, consequentes, exemplares ou punitivos (incluindo perda de dados, interrupção de negócios ou lucros cessantes) decorrentes do uso, incapacidade de uso, das operações de backup/restauração realizadas com, ou dos resultados gerados pelo smoonb.
38
+
39
+ **Observação para consumidores no Brasil (PT-BR)** — Para consumidores brasileiros, este aviso não afasta direitos irrenunciáveis previstos no Código de Defesa do Consumidor (CDC); qualquer limitação aqui prevista só se aplica nos limites da lei e não impede a indenização obrigatória quando cabível.
40
+
30
41
  ## 🚀 Instalação
31
42
 
32
43
  **⚠️ IMPORTANTE: Instale APENAS localmente no projeto!**
@@ -42,6 +53,17 @@ npx smoonb --help
42
53
  npm install -g smoonb # ← Isso será bloqueado!
43
54
  ```
44
55
 
56
+ ### 🔄 Atualizar para a Última Versão
57
+
58
+ Para atualizar o smoonb para a versão mais recente disponível:
59
+
60
+ ```bash
61
+ # Atualizar no projeto atual
62
+ npm install smoonb@latest
63
+ ```
64
+
65
+ **⚠️ IMPORTANTE:** O smoonb deve ser instalado localmente no projeto. Não é permitido usar sem instalar (ex.: `npx smoonb@latest`).
66
+
45
67
  **💡 Por que apenas local?**
46
68
  - **🔒 Segurança**: Evita conflitos de versão
47
69
  - **📦 Isolamento**: Cada projeto usa sua versão
@@ -96,18 +118,18 @@ touch .env.local
96
118
 
97
119
  ```env
98
120
  # URLs e Chaves do Supabase
99
- NEXT_PUBLIC_SUPABASE_URL=https://seu-project-id.supabase.co
100
- NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
101
- SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
121
+ NEXT_PUBLIC_SUPABASE_URL=[sua-supabase-url]
122
+ NEXT_PUBLIC_SUPABASE_ANON_KEY=[sua-anon-key]
123
+ SUPABASE_SERVICE_ROLE_KEY=e[sua-service-role]
102
124
 
103
125
  # Database Connection
104
- SUPABASE_DB_URL=postgresql://postgres:[senha]@db.seu-project-id.supabase.co:5432/postgres
126
+ SUPABASE_DB_URL=postgresql://postgres:[sua-database-password]@db.[seu-project-id].supabase.co:5432/postgres
105
127
 
106
128
  # Identificação do Projeto
107
- SUPABASE_PROJECT_ID=seu-project-id
129
+ SUPABASE_PROJECT_ID=[seu-project-id]
108
130
 
109
131
  # Personal Access Token (OBRIGATÓRIO para Management API)
110
- SUPABASE_ACCESS_TOKEN=sbp_1234567890abcdef1234567890abcdef
132
+ SUPABASE_ACCESS_TOKEN=[seu-access-token]]
111
133
 
112
134
  # Diretório de Backups (opcional, padrão: ./backups)
113
135
  SMOONB_OUTPUT_DIR=./backups
@@ -131,10 +153,6 @@ Valor atual: https://abc123.supabase.co
131
153
  Este é o valor correto do projeto alvo? (S/n): S
132
154
  ```
133
155
 
134
- ### Método Legado: `.smoonbrc` (DEPRECADO)
135
-
136
- ⚠️ **Nota:** O arquivo `.smoonbrc` ainda é suportado para compatibilidade, mas é **recomendado migrar para `.env.local`**.
137
-
138
156
  ```bash
139
157
  npx smoonb config --init
140
158
  ```
@@ -157,21 +175,21 @@ npx smoonb backup
157
175
  - ⚡ Edge Functions (explicação sobre reset de link e download)
158
176
  - 📦 Storage (explicação sobre metadados)
159
177
  - 🔐 Auth Settings (explicação sobre configurações)
160
- - 🔄 Realtime Settings (explicação sobre captura interativa)
178
+ - 🔄 Realtime Settings (explicação sobre captura interativa de 7 parâmetros)
161
179
  - 🗑️ Opções de limpeza (functions, .temp, migrations após backup)
162
180
  6. **Resumo de Configurações** - Mostra tudo que será feito
163
181
  7. **Confirmação Final** - Confirma antes de iniciar
164
182
  8. **Execução das Etapas:**
165
- - 📊 1/11 - Backup Database via `pg_dumpall` (Docker)
166
- - 📊 2/11 - Backup Database SQL separado (schema, data, roles)
167
- - 🔧 3/11 - Backup Database Extensions and Settings
168
- - 🔐 4/11 - Backup Auth Settings (se selecionado)
169
- - 🔄 5/11 - Backup Realtime Settings (se selecionado)
170
- - 📦 6/11 - Backup Storage (se selecionado)
171
- - 👥 7/11 - Backup Custom Roles
172
- - ⚡ 8/11 - Backup Edge Functions (se selecionado)
173
- - 📁 9/11 - Backup Supabase .temp
174
- - 📋 10/11 - Backup Migrations
183
+ - 📊 1/10 - Backup Database via `pg_dumpall` (Docker)
184
+ - 📊 2/10 - Backup Database SQL separado (schema, data, roles)
185
+ - 🔧 3/10 - Backup Database Extensions and Settings
186
+ - 🔐 4/10 - Backup Auth Settings (se selecionado)
187
+ - 🔄 5/10 - Backup Realtime Settings (se selecionado) - 7 parâmetros capturados interativamente
188
+ - 📦 6/10 - Backup Storage (se selecionado)
189
+ - 👥 7/10 - Backup Custom Roles
190
+ - ⚡ 8/10 - Backup Edge Functions (se selecionado)
191
+ - 📁 9/10 - Backup Supabase .temp (se selecionado)
192
+ - 📋 10/10 - Backup Migrations (se selecionado)
175
193
 
176
194
  **Resultado:**
177
195
  ```
@@ -259,8 +277,6 @@ npx smoonb functions push
259
277
  | `npx smoonb backup` | Backup completo interativo usando Docker |
260
278
  | `npx smoonb restore` | Restauração interativa usando psql (Docker) |
261
279
  | `npx smoonb check` | Verificação de integridade pós-restore |
262
- | `npx smoonb functions` | Gerenciar Edge Functions |
263
- | `npx smoonb config` | Configurar credenciais (legado) |
264
280
 
265
281
  ## 🏗️ Arquitetura Técnica
266
282
 
@@ -328,6 +344,14 @@ restore/
328
344
  #### Auth, Storage, Realtime
329
345
  - **Management API**: Usa Personal Access Token
330
346
  - **JSON Export**: Configurações exportadas como JSON
347
+ - **Realtime Settings**: Captura interativa de 7 parâmetros:
348
+ 1. Enable Realtime service
349
+ 2. Allow public access
350
+ 3. Database connection pool size
351
+ 4. Max concurrent clients
352
+ 5. Max events per second
353
+ 6. Max presence events per second
354
+ 7. Max payload size in KB
331
355
  - **Manual para alguns**: Alguns settings precisam ser aplicados manualmente por segurança
332
356
 
333
357
  ### Restore Strategy
@@ -471,28 +495,51 @@ Se houver problemas:
471
495
  - **Sem Dados Sensíveis**: Nenhum dado sensível é enviado para fora do seu ambiente
472
496
  - **Docker Isolado**: Operações de database via Docker (isolamento)
473
497
 
474
- ## 📝 Licença
498
+ ## 💼 Modelo de Acesso e Assinatura
475
499
 
476
- **Versões 0.x.x**: Uso gratuito (experimental)
477
- **Versões 1.0.0+**: Licença comercial (anúncio com 90 dias de antecedência)
500
+ O código do Supa Moonbase é disponibilizado sob licença MIT (ver `LICENSE`). Em fase futura, a execução do CLI será vinculada a uma assinatura por conta, permitindo uso associado a uma conta válida. A validação de conta ocorrerá antes de qualquer operação sensível (ex.: backup e restore).
478
501
 
479
- Veja [LICENSE.md](LICENSE.md) para mais detalhes.
502
+ Até que a validação esteja ativa, a ferramenta pode ser utilizada sem login.
480
503
 
481
- ## 🤝 Contribuição
504
+ Saiba mais em [Pricing](https://smoonb.com/pricing) e [FAQ Comercial](https://smoonb.com/faq).
482
505
 
483
- Contribuições são bem-vindas! Este é um projeto experimental e precisamos de feedback da comunidade.
506
+ ## 🎁 Grandfathering (conceito)
507
+
508
+ Contas criadas durante o período inicial de disponibilização comercial poderão manter condições de acesso diferenciadas enquanto permanecerem ativas. O objetivo é reconhecer os primeiros usuários. Detalhes específicos constarão nos [Termos de Serviço](https://smoonb.com/terms) e no [Pricing](https://smoonb.com/pricing).
509
+
510
+ ## 🔒 Privacidade e LGPD (resumo)
511
+
512
+ O Supa Moonbase adota o princípio de minimização de dados. Quando a validação de conta estiver ativa, trataremos apenas informações estritamente necessárias para controle de acesso e faturamento (por exemplo, identificador de conta e contato). Os propósitos, bases legais e direitos do titular serão descritos na [Política de Privacidade](https://smoonb.com/privacy).
513
+
514
+ ## 📋 Termos de Serviço e Uso de Marca
515
+
516
+ A licença de código (MIT) não substitui os Termos de Serviço que regerão o acesso operacional por conta e a validação de assinatura.
517
+
518
+ "Supa Moonbase" e elementos de identidade visual são marcas da Goalmoon Tecnologia Ltda.; o uso de marca e assets de branding é restrito, conforme os [Termos de Serviço](https://smoonb.com/terms).
519
+
520
+ ## ❓ FAQ Comercial
521
+
522
+ **Por que assinatura se o código é MIT?**
484
523
 
485
- ## 📚 Versão
524
+ > O código permanece aberto para auditoria e contribuições. O acesso operacional será condicionado à validação de conta, conforme Termos de Serviço.
486
525
 
487
- **Versão Atual:** 0.0.48
526
+ **O que significa grandfathering?**
488
527
 
489
- ## Apoie o Projeto
528
+ > Contas do período inicial poderão manter condições diferenciadas enquanto ativas; detalhes estarão nos Termos.
529
+
530
+
531
+
532
+ ## 📝 Licença
533
+
534
+ O código do Supa Moonbase é disponibilizado sob licença MIT. Veja [LICENSE](LICENSE) para o texto completo da licença.
535
+
536
+ ## 🤝 Contribuição
537
+
538
+ Contribuições são bem-vindas! Este é um projeto experimental e precisamos de feedback da comunidade.
490
539
 
491
- Se este projeto for útil para você, considere comprar um café:
492
- [Compre um café](https://pag.ae/7Yj8QjQjQ)
493
540
 
494
541
  ---
495
542
 
496
543
  **Desenvolvido por:** Goalmoon Tecnologia LTDA
497
- **Website:** https://goalmoon.com
544
+ **Website:** https://smoonb.com
498
545
  **GitHub:** https://github.com/almmello/smoonb
package/bin/smoonb.js CHANGED
@@ -31,37 +31,12 @@ program
31
31
  })
32
32
  .addHelpText('after', () => {
33
33
  return chalk.cyan.bold(`
34
- 📋 CONFIGURAÇÃO AUTOMÁTICA:
35
- npx smoonb config --init # Cria .smoonbrc com projectId, URLs, etc.
36
- # Edite o arquivo com suas credenciais Supabase
37
- npx smoonb backup # Funciona sem --project-id!
38
-
39
- 📝 EXEMPLO DE CONFIGURAÇÃO (.smoonbrc):
40
- {
41
- "supabase": {
42
- "projectId": "abc123def456",
43
- "url": "https://abc123def456.supabase.co",
44
- "serviceKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
45
- "anonKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
46
- "databaseUrl": "postgresql://postgres:[senha]@db.abc123def456.supabase.co:5432/postgres"
47
- },
48
- "backup": {
49
- "includeFunctions": true,
50
- "includeStorage": true,
51
- "includeAuth": true,
52
- "includeRealtime": true,
53
- "outputDir": "./backups"
54
- },
55
- "restore": {
56
- "cleanRestore": false,
57
- "verifyAfterRestore": true
58
- }
59
- }
60
-
61
- 🔧 COMO CONFIGURAR:
62
- 1. npx smoonb config --init
63
- 2. Edite .smoonbrc com suas credenciais
64
- 3. npx smoonb backup (funciona automaticamente!)
34
+ 📋 CONFIGURAÇÃO:
35
+ Configure o arquivo .env.local na raiz do projeto com suas credenciais Supabase.
36
+ O smoonb irá mapear as variáveis interativamente na primeira execução.
37
+
38
+ 🔄 ATUALIZAR PARA ÚLTIMA VERSÃO:
39
+ npm install smoonb@latest
65
40
  `);
66
41
  });
67
42
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smoonb",
3
- "version": "0.0.56",
3
+ "version": "0.0.58",
4
4
  "description": "Complete Supabase backup and migration tool - EXPERIMENTAL VERSION - USE AT YOUR OWN RISK",
5
5
  "preferGlobal": false,
6
6
  "preventGlobalInstall": true,
@@ -49,8 +49,7 @@
49
49
  "bugs": {
50
50
  "url": "https://github.com/almmello/smoonb/issues"
51
51
  },
52
- "homepage": "https://github.com/almmello/smoonb#readme"
53
- ,
52
+ "homepage": "https://github.com/almmello/smoonb#readme",
54
53
  "files": [
55
54
  "bin/",
56
55
  "src/",
@@ -2,7 +2,6 @@ const chalk = require('chalk');
2
2
  const path = require('path');
3
3
  const fs = require('fs').promises;
4
4
  const { ensureDir, writeJson } = require('../../utils/fsx');
5
- const { readConfig, validateFor } = require('../../utils/config');
6
5
  const { showBetaBanner } = require('../../utils/banner');
7
6
  const { getDockerVersion } = require('../../utils/docker');
8
7
  const { readEnvFile, writeEnvFile, backupEnvFile } = require('../../utils/env');
@@ -28,6 +27,18 @@ module.exports = async (options) => {
28
27
  showBetaBanner();
29
28
 
30
29
  try {
30
+ // Termo de uso e aviso de risco
31
+ console.log(chalk.yellow.bold('\n⚠️ TERMO DE USO E AVISO DE RISCO\n'));
32
+ console.log(chalk.white('Ao prosseguir, você reconhece e concorda que o Supa Moonbase (smoonb) é fornecido "NO ESTADO EM QUE SE ENCONTRA" ("AS IS") e "CONFORME DISPONIBILIDADE", sem garantias de qualquer natureza—expressas, implícitas ou legais—incluindo, sem limitação, garantias de comercialização, adequação a um fim específico e não violação, na máxima extensão permitida pela lei aplicável. Operações de backup e restauração envolvem riscos, os ambientes variam amplamente e não é possível prever ou validar todas as configurações dos usuários. Você é o único responsável por validar seu ambiente, manter cópias independentes e verificar os resultados antes de utilizá-los em produção. O Supa Moonbase (smoonb) é construído com repositórios públicos, auditáveis e software livre, para auxiliar pessoas a simplificar seus fluxos, sem com isso criar qualquer garantia, promessa de suporte ou compromisso de nível de serviço.\n'));
33
+ console.log(chalk.white('Limitação de responsabilidade (PT-BR) — Na máxima extensão permitida por lei, a Goalmoon, seus contribuidores e licenciadores não serão responsáveis por danos indiretos, incidentais, especiais, consequentes, exemplares ou punitivos (incluindo perda de dados, interrupção de negócios ou lucros cessantes) decorrentes do uso, incapacidade de uso, das operações de backup/restauração realizadas com, ou dos resultados gerados pelo Supa Moonbase (smoonb). Em qualquer hipótese, a responsabilidade total por todas as reivindicações relacionadas ao Supa Moonbase (smoonb) não excederá o valor pago por você pelo Supa Moonbase (smoonb) nos 12 meses anteriores ao evento. Nada neste aviso exclui ou limita responsabilidades onde tais limites sejam proibidos por lei, incluindo (conforme aplicável) dolo ou culpa grave.\n'));
34
+ console.log(chalk.white('Observação para consumidores no Brasil (PT-BR) — Para consumidores brasileiros, este aviso não afasta direitos irrenunciáveis previstos no Código de Defesa do Consumidor (CDC); qualquer limitação aqui prevista só se aplica nos limites da lei e não impede a indenização obrigatória quando cabível.\n'));
35
+
36
+ const termsAccepted = await confirm('Você aceita os Termos de Uso e o Aviso de Risco de Backup?', true);
37
+ if (!termsAccepted) {
38
+ console.log(chalk.red('🚫 Operação cancelada pelo usuário.'));
39
+ process.exit(1);
40
+ }
41
+
31
42
  // Executar validação Docker ANTES de tudo
32
43
  await step00DockerValidation();
33
44
 
@@ -42,9 +53,8 @@ module.exports = async (options) => {
42
53
  process.exit(1);
43
54
  }
44
55
 
45
- // Carregar configuração existente apenas para defaults de diretório
46
- const config = await readConfig().catch(() => ({ backup: { outputDir: './backups' }, supabase: {} }));
47
- validateFor(config, 'backup');
56
+ // Diretório de backup padrão
57
+ const defaultOutputDir = './backups';
48
58
 
49
59
  // Pré-passo de ENV: criar diretório de backup com timestamp já no início
50
60
  const now = new Date();
@@ -56,7 +66,7 @@ module.exports = async (options) => {
56
66
  const second = String(now.getSeconds()).padStart(2, '0');
57
67
 
58
68
  // Resolver diretório de saída
59
- const defaultOutput = options.output || config.backup?.outputDir || './backups';
69
+ const defaultOutput = options.output || defaultOutputDir;
60
70
  const backupDir = path.join(defaultOutput, `backup-${year}-${month}-${day}-${hour}-${minute}-${second}`);
61
71
  await ensureDir(backupDir);
62
72
 
@@ -88,7 +98,7 @@ module.exports = async (options) => {
88
98
  }
89
99
 
90
100
  // Recalcular outputDir a partir do ENV mapeado
91
- const resolvedOutputDir = options.output || getValue('SMOONB_OUTPUT_DIR') || config.backup?.outputDir || './backups';
101
+ const resolvedOutputDir = options.output || getValue('SMOONB_OUTPUT_DIR') || defaultOutputDir;
92
102
 
93
103
  // Se mudou o outputDir, movemos o backupDir inicial para o novo local mantendo timestamp
94
104
  const finalBackupDir = backupDir.startsWith(path.resolve(resolvedOutputDir))
@@ -23,6 +23,18 @@ module.exports = async (_options) => {
23
23
  showBetaBanner();
24
24
 
25
25
  try {
26
+ // Termo de uso e aviso de risco
27
+ console.log(chalk.yellow.bold('\n⚠️ TERMO DE USO E AVISO DE RISCO\n'));
28
+ console.log(chalk.white('Ao prosseguir, você reconhece e concorda que o Supa Moonbase (smoonb) é fornecido "NO ESTADO EM QUE SE ENCONTRA" ("AS IS") e "CONFORME DISPONIBILIDADE", sem garantias de qualquer natureza—expressas, implícitas ou legais—incluindo, sem limitação, garantias de comercialização, adequação a um fim específico e não violação, na máxima extensão permitida pela lei aplicável. Operações de backup e restauração envolvem riscos, os ambientes variam amplamente e não é possível prever ou validar todas as configurações dos usuários. Você é o único responsável por validar seu ambiente, manter cópias independentes e verificar os resultados antes de utilizá-los em produção. O Supa Moonbase (smoonb) é construído com repositórios públicos, auditáveis e software livre, para auxiliar pessoas a simplificar seus fluxos, sem com isso criar qualquer garantia, promessa de suporte ou compromisso de nível de serviço.\n'));
29
+ console.log(chalk.white('Limitação de responsabilidade (PT-BR) — Na máxima extensão permitida por lei, a Goalmoon, seus contribuidores e licenciadores não serão responsáveis por danos indiretos, incidentais, especiais, consequentes, exemplares ou punitivos (incluindo perda de dados, interrupção de negócios ou lucros cessantes) decorrentes do uso, incapacidade de uso, das operações de backup/restauração realizadas com, ou dos resultados gerados pelo Supa Moonbase (smoonb). Em qualquer hipótese, a responsabilidade total por todas as reivindicações relacionadas ao Supa Moonbase (smoonb) não excederá o valor pago por você pelo Supa Moonbase (smoonb) nos 12 meses anteriores ao evento. Nada neste aviso exclui ou limita responsabilidades onde tais limites sejam proibidos por lei, incluindo (conforme aplicável) dolo ou culpa grave.\n'));
30
+ console.log(chalk.white('Observação para consumidores no Brasil (PT-BR) — Para consumidores brasileiros, este aviso não afasta direitos irrenunciáveis previstos no Código de Defesa do Consumidor (CDC); qualquer limitação aqui prevista só se aplica nos limites da lei e não impede a indenização obrigatória quando cabível.\n'));
31
+
32
+ const termsAccepted = await confirm('Você aceita os Termos de Uso e o Aviso de Risco de Restauração?', true);
33
+ if (!termsAccepted) {
34
+ console.log(chalk.red('🚫 Operação cancelada pelo usuário.'));
35
+ process.exit(1);
36
+ }
37
+
26
38
  // Executar validação Docker ANTES de tudo
27
39
  await step00DockerValidation();
28
40
 
package/src/index.js CHANGED
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  const chalk = require('chalk');
9
+ const path = require('path');
9
10
  const { showBetaBanner } = require('./utils/banner');
10
11
 
11
12
  // Exportar comandos
@@ -62,50 +63,27 @@ function showQuickHelp() {
62
63
  🚀 COMANDOS PRINCIPAIS:
63
64
 
64
65
  📊 Backup completo:
65
- npx smoonb backup # Usa configuração do .smoonbrc
66
+ npx smoonb backup # Backup completo interativo usando Docker
66
67
 
67
68
  🔄 Restauração completa:
68
- npx smoonb restore --backup-dir <dir> # Restaura backup usando psql
69
-
70
- ⚡ Edge Functions:
71
- npx smoonb functions list
72
- npx smoonb functions push
69
+ npx smoonb restore # Restauração interativa usando psql (Docker)
73
70
 
74
71
  🔍 Verificação pós-restore:
75
72
  npx smoonb check # Verifica integridade do projeto
76
73
 
77
- ⚙️ Configuração:
78
- npx smoonb config --init # Criar arquivo de configuração
79
- npx smoonb config --show # Mostrar configuração atual
80
-
81
- 📋 CONFIGURAÇÃO AUTOMÁTICA:
82
- npx smoonb config --init # Cria .smoonbrc com projectId, URLs, etc.
83
- # Edite o arquivo com suas credenciais Supabase
84
- npx smoonb backup # Funciona automaticamente!
85
-
86
- 📝 EXEMPLO DE CONFIGURAÇÃO (.smoonbrc):
87
- {
88
- "supabase": {
89
- "projectId": "abc123def456",
90
- "url": "https://abc123def456.supabase.co",
91
- "serviceKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkXVCJ9...",
92
- "anonKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkXVCJ9...",
93
- "databaseUrl": "postgresql://postgres:[senha]@db.abc123def456.supabase.co:5432/postgres",
94
- "accessToken": "sbp_1234567890abcdef1234567890abcdef"
95
- }
96
- }
74
+ 📋 CONFIGURAÇÃO:
75
+ Configure o arquivo .env.local na raiz do projeto com suas credenciais Supabase.
76
+ O smoonb irá mapear as variáveis interativamente na primeira execução.
97
77
 
98
78
  🔑 PERSONAL ACCESS TOKEN (OBRIGATÓRIO):
99
79
  Para Management API (Edge Functions, Auth Settings, Storage):
100
80
  1. Acesse: https://supabase.com/dashboard/account/tokens
101
81
  2. Clique em "Generate new token"
102
82
  3. Copie o token (formato: sbp_...)
103
- 4. Adicione ao .smoonbrc como "accessToken"
83
+ 4. Adicione ao .env.local como SUPABASE_ACCESS_TOKEN
104
84
 
105
- 🔧 COMO CONFIGURAR:
106
- 1. npx smoonb config --init
107
- 2. Edite .smoonbrc com suas credenciais
108
- 3. npx smoonb backup (funciona automaticamente!)
85
+ 🔄 ATUALIZAR PARA ÚLTIMA VERSÃO:
86
+ npm install smoonb@latest
109
87
  `));
110
88
  }
111
89
 
@@ -195,7 +173,7 @@ function checkCurrentConfig() {
195
173
 
196
174
  if (config) {
197
175
  console.log(chalk.green('✅ Arquivo de configuração encontrado'));
198
- console.log(chalk.gray(` - Localização: ${require('os').homedir()}/.smoonbrc`));
176
+ console.log(chalk.gray(` - Localização: ${path.join(process.cwd(), '.env.local')}`));
199
177
 
200
178
  if (config.supabase?.url) {
201
179
  console.log(chalk.gray(` - Supabase URL: ${config.supabase.url}`));
@@ -210,7 +188,7 @@ function checkCurrentConfig() {
210
188
  }
211
189
  } else {
212
190
  console.log(chalk.yellow('⚠️ Arquivo de configuração não encontrado'));
213
- console.log(chalk.gray(' - Use: smoonb config --init'));
191
+ console.log(chalk.gray(' - Configure o arquivo .env.local na raiz do projeto'));
214
192
  }
215
193
 
216
194
  if (hasCredentials) {
@@ -1,32 +1,28 @@
1
1
  const chalk = require('chalk');
2
2
 
3
3
  /**
4
- * Banner da versão experimental
4
+ * Banner principal do smoonb
5
5
  */
6
6
  function showBetaBanner() {
7
- console.log(chalk.red.bold(`
8
- ╔══════════════════════════════════════════════════════════════╗
9
- ║ 🚀 smoonb ║
10
- ║ ║
11
- ║ ⚠️ EXPERIMENTAL VERSION - NÃO TESTADA! ║
12
- ║ ║
13
- 🚨 AVISO: Este software NUNCA foi testado em produção! ║
14
- ⚠️ USE POR SUA CONTA E RISCO - Pode causar perda de dados ║
15
- NÃO NOS RESPONSABILIZAMOS por qualquer perda de dados ║
16
- ║ ║
17
- A primeira ferramenta CLI completa para backup e migração ║
18
- de projetos Supabase. Resolve o problema de backup ║
19
- incompleto das ferramentas existentes.
20
- ║ ║
21
- ✅ Database PostgreSQL + Edge Functions + Auth Settings ║
22
- Storage Objects + Realtime Settings + Metadados ║
23
- ║ ║
24
- 🏢 Desenvolvido por: Goalmoon Tecnologia LTDA ║
25
- 🌐 Website: https://goalmoon.com
26
- ║ 📖 Documentação: https://github.com/almmello/smoonb ║
27
- ║ 🐛 Issues: https://github.com/almmello/smoonb/issues ║
28
- ╚══════════════════════════════════════════════════════════════╝
29
- `));
7
+ console.log(chalk.cyan.bold('\n🚀 Supa Moonbase (smoonb)\n'));
8
+ console.log(chalk.white('A primeira ferramenta CLI completa para backup e migração de projetos Supabase.'));
9
+ console.log(chalk.white('Resolve o problema de backup incompleto das ferramentas existentes.\n'));
10
+
11
+ console.log(chalk.cyan.bold('📦 Componentes de Backup:\n'));
12
+ console.log(chalk.white(' ✅ Database PostgreSQL (pg_dumpall + SQL separados)'));
13
+ console.log(chalk.white(' ✅ Database Extensions and Settings'));
14
+ console.log(chalk.white(' Custom Roles'));
15
+ console.log(chalk.white(' ✅ Edge Functions'));
16
+ console.log(chalk.white(' ✅ Auth Settings'));
17
+ console.log(chalk.white(' ✅ Storage Buckets'));
18
+ console.log(chalk.white(' ✅ Realtime Settings'));
19
+ console.log(chalk.white(' ✅ Supabase .temp'));
20
+ console.log(chalk.white(' ✅ Migrations\n'));
21
+
22
+ console.log(chalk.white('🏢 Desenvolvido por: Goalmoon Tecnologia LTDA'));
23
+ console.log(chalk.cyan('🌐 Website: https://smoonb.com'));
24
+ console.log(chalk.cyan('📖 Documentação: https://github.com/almmello/smoonb'));
25
+ console.log(chalk.cyan('🐛 Issues: https://github.com/almmello/smoonb/issues\n'));
30
26
  }
31
27
 
32
28
  module.exports = { showBetaBanner };
@@ -35,7 +35,7 @@ async function captureRealtimeSettings(projectId, backupDir, skipInteractive = f
35
35
  console.log('\n🔧 Configurações de Realtime Settings');
36
36
  console.log('═'.repeat(50));
37
37
  console.log(`📱 Acesse: ${dashboardUrl}`);
38
- console.log('📝 Anote os valores dos 4 parâmetros abaixo:\n');
38
+ console.log('📝 Anote os valores dos 7 parâmetros abaixo:\n');
39
39
 
40
40
  const settings = await captureSettingsInteractively(projectId, previousSettings);
41
41
 
@@ -126,38 +126,61 @@ async function captureSettingsInteractively(projectId, previousSettings) {
126
126
 
127
127
  // Valores padrão baseados na imagem ou configurações anteriores
128
128
  const defaults = previousSettings?.realtime_settings?.settings || {
129
+ enable_realtime_service: { value: true },
129
130
  allow_public_access: { value: true },
130
131
  database_connection_pool_size: { value: 2 },
131
132
  max_concurrent_clients: { value: 200 },
132
- max_events_per_second: { value: 100 }
133
+ max_events_per_second: { value: 100 },
134
+ max_presence_events_per_second: { value: 100 },
135
+ max_payload_size_kb: { value: 100 }
133
136
  };
134
137
 
138
+ const enableRealtime = await askQuestion(
139
+ '1. Enable Realtime service (true/false):',
140
+ defaults.enable_realtime_service?.value ?? true
141
+ );
142
+
135
143
  const allowPublicAccess = await askQuestion(
136
- '1. Allow public access (true/false):',
144
+ '2. Allow public access (true/false):',
137
145
  defaults.allow_public_access.value
138
146
  );
139
147
 
140
148
  const poolSize = await askQuestion(
141
- '2. Database connection pool size:',
149
+ '3. Database connection pool size:',
142
150
  defaults.database_connection_pool_size.value
143
151
  );
144
152
 
145
153
  const maxClients = await askQuestion(
146
- '3. Max concurrent clients:',
154
+ '4. Max concurrent clients:',
147
155
  defaults.max_concurrent_clients.value
148
156
  );
149
157
 
150
158
  const maxEvents = await askQuestion(
151
- '4. Max events per second:',
159
+ '5. Max events per second:',
152
160
  defaults.max_events_per_second.value
153
161
  );
154
162
 
163
+ const maxPresenceEvents = await askQuestion(
164
+ '6. Max presence events per second:',
165
+ defaults.max_presence_events_per_second?.value ?? 100
166
+ );
167
+
168
+ const maxPayloadSize = await askQuestion(
169
+ '7. Max payload size in KB:',
170
+ defaults.max_payload_size_kb?.value ?? 100
171
+ );
172
+
155
173
  const settings = {
156
174
  realtime_settings: {
157
175
  note: "Configurações de Realtime Settings capturadas interativamente",
158
176
  dashboard_url: `https://supabase.com/dashboard/project/${projectId}/realtime/settings`,
159
177
  captured_at: new Date().toISOString(),
160
178
  settings: {
179
+ enable_realtime_service: {
180
+ label: "Enable Realtime service",
181
+ description: "If disabled, no clients will be able to connect and new connections will be rejected",
182
+ value: enableRealtime === 'true' || enableRealtime === true
183
+ },
161
184
  allow_public_access: {
162
185
  label: "Allow public access",
163
186
  description: "If disabled, only private channels will be allowed",
@@ -177,17 +200,30 @@ async function captureSettingsInteractively(projectId, previousSettings) {
177
200
  label: "Max events per second",
178
201
  description: "Sets maximum number of events per second that can be sent to your Realtime service",
179
202
  value: parseInt(maxEvents)
203
+ },
204
+ max_presence_events_per_second: {
205
+ label: "Max presence events per second",
206
+ description: "Sets maximum number of presence events per second",
207
+ value: parseInt(maxPresenceEvents)
208
+ },
209
+ max_payload_size_kb: {
210
+ label: "Max payload size in KB",
211
+ description: "Sets maximum payload size in KB",
212
+ value: parseInt(maxPayloadSize)
180
213
  }
181
214
  },
182
215
  restore_instructions: {
183
216
  url: `https://supabase.com/dashboard/project/${projectId}/realtime/settings`,
184
217
  steps: [
185
218
  "1. Acesse a URL acima",
186
- "2. Configure 'Allow public access' conforme o valor em settings.allow_public_access.value",
187
- "3. Configure 'Database connection pool size' conforme o valor em settings.database_connection_pool_size.value",
188
- "4. Configure 'Max concurrent clients' conforme o valor em settings.max_concurrent_clients.value",
189
- "5. Configure 'Max events per second' conforme o valor em settings.max_events_per_second.value",
190
- "6. Clique em 'Save changes'"
219
+ "2. Configure 'Enable Realtime service' conforme o valor em settings.enable_realtime_service.value",
220
+ "3. Configure 'Allow public access' conforme o valor em settings.allow_public_access.value",
221
+ "4. Configure 'Database connection pool size' conforme o valor em settings.database_connection_pool_size.value",
222
+ "5. Configure 'Max concurrent clients' conforme o valor em settings.max_concurrent_clients.value",
223
+ "6. Configure 'Max events per second' conforme o valor em settings.max_events_per_second.value",
224
+ "7. Configure 'Max presence events per second' conforme o valor em settings.max_presence_events_per_second.value",
225
+ "8. Configure 'Max payload size in KB' conforme o valor em settings.max_payload_size_kb.value",
226
+ "9. Clique em 'Save changes'"
191
227
  ]
192
228
  }
193
229
  }