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 +22 -0
- package/README.md +95 -48
- package/bin/smoonb.js +6 -31
- package/package.json +2 -3
- package/src/commands/backup/index.js +16 -6
- package/src/commands/restore/index.js +12 -0
- package/src/index.js +11 -33
- package/src/utils/banner.js +20 -24
- package/src/utils/realtime-settings.js +47 -11
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
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** (
|
|
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=
|
|
100
|
-
NEXT_PUBLIC_SUPABASE_ANON_KEY=
|
|
101
|
-
SUPABASE_SERVICE_ROLE_KEY=
|
|
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:[
|
|
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=
|
|
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/
|
|
166
|
-
- 📊 2/
|
|
167
|
-
- 🔧 3/
|
|
168
|
-
- 🔐 4/
|
|
169
|
-
- 🔄 5/
|
|
170
|
-
- 📦 6/
|
|
171
|
-
- 👥 7/
|
|
172
|
-
- ⚡ 8/
|
|
173
|
-
- 📁 9/
|
|
174
|
-
- 📋 10/
|
|
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
|
-
##
|
|
498
|
+
## 💼 Modelo de Acesso e Assinatura
|
|
475
499
|
|
|
476
|
-
|
|
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
|
-
|
|
502
|
+
Até que a validação esteja ativa, a ferramenta pode ser utilizada sem login.
|
|
480
503
|
|
|
481
|
-
|
|
504
|
+
Saiba mais em [Pricing](https://smoonb.com/pricing) e [FAQ Comercial](https://smoonb.com/faq).
|
|
482
505
|
|
|
483
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
526
|
+
**O que significa grandfathering?**
|
|
488
527
|
|
|
489
|
-
|
|
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://
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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.
|
|
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
|
-
//
|
|
46
|
-
const
|
|
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 ||
|
|
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') ||
|
|
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 #
|
|
66
|
+
npx smoonb backup # Backup completo interativo usando Docker
|
|
66
67
|
|
|
67
68
|
🔄 Restauração completa:
|
|
68
|
-
npx smoonb restore
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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 .
|
|
83
|
+
4. Adicione ao .env.local como SUPABASE_ACCESS_TOKEN
|
|
104
84
|
|
|
105
|
-
|
|
106
|
-
|
|
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: ${
|
|
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(' -
|
|
191
|
+
console.log(chalk.gray(' - Configure o arquivo .env.local na raiz do projeto'));
|
|
214
192
|
}
|
|
215
193
|
|
|
216
194
|
if (hasCredentials) {
|
package/src/utils/banner.js
CHANGED
|
@@ -1,32 +1,28 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Banner
|
|
4
|
+
* Banner principal do smoonb
|
|
5
5
|
*/
|
|
6
6
|
function showBetaBanner() {
|
|
7
|
-
console.log(chalk.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
154
|
+
'4. Max concurrent clients:',
|
|
147
155
|
defaults.max_concurrent_clients.value
|
|
148
156
|
);
|
|
149
157
|
|
|
150
158
|
const maxEvents = await askQuestion(
|
|
151
|
-
'
|
|
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 '
|
|
187
|
-
"3. Configure '
|
|
188
|
-
"4. Configure '
|
|
189
|
-
"5. Configure 'Max
|
|
190
|
-
"6.
|
|
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
|
}
|