smoonb 0.0.7 → 0.0.9
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/README.md +166 -169
- package/bin/smoonb.js +7 -24
- package/package.json +3 -3
- package/src/commands/backup.js +140 -249
- package/src/commands/check.js +210 -349
- package/src/commands/functions.js +123 -349
- package/src/commands/restore.js +203 -281
- package/src/index.js +12 -21
- package/src/services/introspect.js +299 -0
- package/src/utils/cli.js +87 -0
- package/src/utils/config.js +140 -0
- package/src/utils/fsx.js +110 -0
- package/src/utils/hash.js +40 -0
- package/src/commands/secrets.js +0 -361
package/README.md
CHANGED
|
@@ -1,232 +1,229 @@
|
|
|
1
|
-
# smoonb
|
|
1
|
+
# smoonb
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Complete Supabase backup and migration tool**
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## ⚠️ EXPERIMENTAL VERSION - NÃO TESTADA - USE POR SUA CONTA E RISCO
|
|
6
6
|
|
|
7
|
-
|
|
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
|
|
8
12
|
|
|
9
|
-
|
|
10
|
-
- ❌ **NÃO USE** em dados críticos ou produção
|
|
11
|
-
- ⚠️ **RESULTADOS IMPREVISÍVEIS** - podem causar perdas irreparáveis de dados
|
|
12
|
-
- ⚠️ **NÃO NOS RESPONSABILIZAMOS** por qualquer perda de dados
|
|
13
|
-
- ⚠️ **USE POR SUA CONTA E RISCO** - você é o único responsável
|
|
13
|
+
**Desenvolvido por:** Goalmoon Tecnologia LTDA (https://goalmoon.com)
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
## 🎯 Objetivo
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
O **smoonb** resolve o problema das ferramentas existentes que fazem backup apenas da database PostgreSQL, ignorando componentes críticos do Supabase:
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
- ✅ **Database PostgreSQL** (roles, schema, data)
|
|
20
|
+
- ✅ **Edge Functions** (código local)
|
|
21
|
+
- ✅ **Auth Settings** (configurações de autenticação)
|
|
22
|
+
- ✅ **Storage Objects** (buckets e metadados)
|
|
23
|
+
- ✅ **Realtime Settings** (publicações e configurações)
|
|
24
|
+
- ✅ **Inventário Completo** (extensões, políticas RLS, etc.)
|
|
20
25
|
|
|
21
|
-
|
|
22
|
-
- ❌ **Auth Settings** - Configurações de autenticação perdidas
|
|
23
|
-
- ❌ **Storage Objects** - Arquivos e buckets perdidos
|
|
24
|
-
- ❌ **Realtime Settings** - Configurações de tempo real perdidas
|
|
26
|
+
## 🚀 Instalação
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
smoonb é a **primeira ferramenta** que faz backup **COMPLETO** do Supabase:
|
|
28
|
+
```bash
|
|
29
|
+
# Instalar localmente no projeto
|
|
30
|
+
npm install smoonb
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- ✅ **Storage Objects** - Arquivos e metadados
|
|
36
|
-
- ✅ **Realtime Settings** - Configurações de tempo real
|
|
37
|
-
- ✅ **Metadados** - Todas as configurações do projeto
|
|
32
|
+
# Usar com npx
|
|
33
|
+
npx smoonb --help
|
|
34
|
+
```
|
|
38
35
|
|
|
39
|
-
##
|
|
36
|
+
## 📋 Pré-requisitos
|
|
40
37
|
|
|
38
|
+
### 1. Supabase CLI
|
|
41
39
|
```bash
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
npm install -g supabase
|
|
41
|
+
```
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
### 2. PostgreSQL (psql)
|
|
44
|
+
- **Windows**: https://www.postgresql.org/download/windows/
|
|
45
|
+
- **macOS**: `brew install postgresql`
|
|
46
|
+
- **Linux**: `sudo apt-get install postgresql-client`
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
npx smoonb secrets export
|
|
50
|
-
npx smoonb secrets import
|
|
48
|
+
## ⚙️ Configuração
|
|
51
49
|
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
### 1. Inicializar configuração
|
|
51
|
+
```bash
|
|
52
|
+
npx smoonb config --init
|
|
53
|
+
```
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
### 2. Editar `.smoonbrc`
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"supabase": {
|
|
59
|
+
"projectId": "seu-project-id",
|
|
60
|
+
"url": "https://seu-project-id.supabase.co",
|
|
61
|
+
"serviceKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
62
|
+
"anonKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
63
|
+
"databaseUrl": "postgresql://postgres:[senha]@db.seu-project-id.supabase.co:5432/postgres"
|
|
64
|
+
},
|
|
65
|
+
"backup": {
|
|
66
|
+
"includeFunctions": true,
|
|
67
|
+
"includeStorage": true,
|
|
68
|
+
"includeAuth": true,
|
|
69
|
+
"includeRealtime": true,
|
|
70
|
+
"outputDir": "./backups"
|
|
71
|
+
},
|
|
72
|
+
"restore": {
|
|
73
|
+
"cleanRestore": true,
|
|
74
|
+
"verifyAfterRestore": true
|
|
75
|
+
}
|
|
76
|
+
}
|
|
57
77
|
```
|
|
58
78
|
|
|
59
|
-
|
|
79
|
+
### 3. Obter credenciais no Dashboard Supabase
|
|
60
80
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
| Auth Settings | ✅ Backup + Restore | ❌ Não suportado |
|
|
66
|
-
| Storage Objects | ✅ Backup + Restore | ❌ Não suportado |
|
|
67
|
-
| Realtime Settings | ✅ Backup + Restore | ❌ Não suportado |
|
|
68
|
-
| Metadados | ✅ Completo | ❌ Parcial |
|
|
69
|
-
| CLI Simples | ✅ Intuitivo | ⚠️ Complexo |
|
|
70
|
-
| Restauração Confiável | ✅ 100% | ⚠️ Parcial |
|
|
81
|
+
1. **Project ID**: Settings → General → Reference ID
|
|
82
|
+
2. **URL**: Settings → API → Project URL
|
|
83
|
+
3. **Keys**: Settings → API → Project API keys
|
|
84
|
+
4. **Database URL**: Settings → Database → Connection string
|
|
71
85
|
|
|
72
|
-
##
|
|
86
|
+
## 🎯 Uso
|
|
73
87
|
|
|
88
|
+
### Backup Completo
|
|
74
89
|
```bash
|
|
75
|
-
|
|
76
|
-
npm install smoonb
|
|
77
|
-
|
|
78
|
-
# Usar com npx
|
|
79
|
-
npx smoonb --version
|
|
80
|
-
|
|
81
|
-
# Ou adicionar script no package.json
|
|
82
|
-
npm pkg set scripts.backup="npx smoonb backup"
|
|
83
|
-
npm run backup
|
|
90
|
+
npx smoonb backup
|
|
84
91
|
```
|
|
85
92
|
|
|
86
|
-
|
|
93
|
+
**Resultado:**
|
|
94
|
+
```
|
|
95
|
+
backups/backup-2024-01-15T10-30-45-123Z/
|
|
96
|
+
├── backup-manifest.json
|
|
97
|
+
├── roles.sql
|
|
98
|
+
├── schema.sql
|
|
99
|
+
├── data.sql
|
|
100
|
+
├── inventory/
|
|
101
|
+
│ ├── extensions.json
|
|
102
|
+
│ ├── tables.json
|
|
103
|
+
│ ├── policies.json
|
|
104
|
+
│ ├── realtime.json
|
|
105
|
+
│ └── storage.json
|
|
106
|
+
└── functions/
|
|
107
|
+
└── [código das Edge Functions locais]
|
|
108
|
+
```
|
|
87
109
|
|
|
110
|
+
### Restauração Interativa
|
|
88
111
|
```bash
|
|
89
|
-
|
|
90
|
-
npm install smoonb
|
|
91
|
-
|
|
92
|
-
# 2. Configure suas credenciais Supabase
|
|
93
|
-
npx npx smoonb config --init
|
|
94
|
-
|
|
95
|
-
# 3. Edite o arquivo .smoonbrc com suas credenciais
|
|
96
|
-
# 4. Execute o backup completo
|
|
97
|
-
npx npx smoonb backup
|
|
98
|
-
|
|
99
|
-
# 5. Restaure em outro projeto
|
|
100
|
-
npx npx smoonb restore --backup-dir ./backups/backup-2024-01-15T10-30-00Z
|
|
112
|
+
npx smoonb restore
|
|
101
113
|
```
|
|
102
114
|
|
|
103
|
-
|
|
115
|
+
**Processo interativo:**
|
|
116
|
+
1. Lista todos os backups disponíveis
|
|
117
|
+
2. Permite seleção numerada do backup desejado
|
|
118
|
+
3. Verifica se database está vazia (clean restore)
|
|
119
|
+
4. Executa `roles.sql` (roles e permissões)
|
|
120
|
+
5. Executa `schema.sql` (estrutura das tabelas)
|
|
121
|
+
6. Executa `data.sql` (dados com COPY)
|
|
104
122
|
|
|
105
|
-
###
|
|
123
|
+
### Verificação Pós-Restore
|
|
106
124
|
```bash
|
|
107
|
-
npx smoonb
|
|
108
|
-
--project-id abc123def456 \
|
|
109
|
-
--output ./backup-$(date +%Y%m%d) \
|
|
110
|
-
--include-functions \
|
|
111
|
-
--include-storage \
|
|
112
|
-
--include-auth
|
|
125
|
+
npx smoonb check
|
|
113
126
|
```
|
|
114
127
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
```
|
|
128
|
+
**Verifica:**
|
|
129
|
+
- ✅ Conexão com database
|
|
130
|
+
- ✅ Extensões instaladas
|
|
131
|
+
- ✅ Tabelas criadas
|
|
132
|
+
- ✅ Políticas RLS
|
|
133
|
+
- ✅ Publicações Realtime
|
|
134
|
+
- ✅ Buckets de Storage
|
|
123
135
|
|
|
124
|
-
###
|
|
136
|
+
### Edge Functions
|
|
125
137
|
```bash
|
|
126
|
-
#
|
|
127
|
-
npx smoonb
|
|
128
|
-
|
|
129
|
-
# 2. Export secrets (opcional)
|
|
130
|
-
npx smoonb secrets export --project-id source-project
|
|
131
|
-
|
|
132
|
-
# 3. Restore no projeto destino
|
|
133
|
-
npx smoonb restore --project-id target-project
|
|
138
|
+
# Listar functions
|
|
139
|
+
npx smoonb functions list
|
|
134
140
|
|
|
135
|
-
#
|
|
136
|
-
npx smoonb
|
|
137
|
-
|
|
138
|
-
# 5. Verificação final
|
|
139
|
-
npx smoonb check --project-id target-project
|
|
141
|
+
# Deploy functions
|
|
142
|
+
npx smoonb functions push
|
|
140
143
|
```
|
|
141
144
|
|
|
142
|
-
## 🔧
|
|
145
|
+
## 🔧 Comandos Disponíveis
|
|
143
146
|
|
|
144
|
-
|
|
147
|
+
| Comando | Descrição |
|
|
148
|
+
|---------|-----------|
|
|
149
|
+
| `npx smoonb backup` | Backup completo usando Supabase CLI |
|
|
150
|
+
| `npx smoonb restore` | Restauração interativa usando psql |
|
|
151
|
+
| `npx smoonb check` | Verificação de integridade |
|
|
152
|
+
| `npx smoonb functions` | Gerenciar Edge Functions |
|
|
153
|
+
| `npx smoonb config` | Configurar credenciais |
|
|
145
154
|
|
|
146
|
-
|
|
147
|
-
{
|
|
148
|
-
"supabase": {
|
|
149
|
-
"url": "https://your-project.supabase.co",
|
|
150
|
-
"serviceKey": "your-service-key"
|
|
151
|
-
},
|
|
152
|
-
"backup": {
|
|
153
|
-
"includeFunctions": true,
|
|
154
|
-
"includeStorage": true,
|
|
155
|
-
"includeAuth": true,
|
|
156
|
-
"outputDir": "./backups"
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
```
|
|
155
|
+
## 🏗️ Arquitetura Técnica
|
|
160
156
|
|
|
161
|
-
|
|
157
|
+
### Backup Strategy
|
|
158
|
+
- **Database**: `supabase db dump` → `roles.sql`, `schema.sql`, `data.sql`
|
|
159
|
+
- **Inventário**: Queries SQL + Supabase API para metadados
|
|
160
|
+
- **Edge Functions**: Cópia do código local (`supabase/functions/`)
|
|
162
161
|
|
|
163
|
-
###
|
|
162
|
+
### Restore Strategy
|
|
163
|
+
- **Clean Restore**: Verifica database vazia antes de restaurar
|
|
164
|
+
- **Ordem**: roles → schema → data (com transação única para dados)
|
|
165
|
+
- **Verificação**: Checklist automático pós-restore
|
|
164
166
|
|
|
165
|
-
|
|
166
|
-
-
|
|
167
|
-
-
|
|
168
|
-
-
|
|
167
|
+
### Multiplataforma
|
|
168
|
+
- **Windows/macOS/Linux**: Detecção automática de binários
|
|
169
|
+
- **Cross-platform**: Usa `fs.promises.cp`, `path.join`, `spawn`
|
|
170
|
+
- **Sem dependências específicas**: Funciona em qualquer SO
|
|
169
171
|
|
|
170
|
-
|
|
172
|
+
## 📊 Fluxo Recomendado
|
|
171
173
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
- 💰 **Desconto especial**: Usuários experimentais terão condições preferenciais
|
|
176
|
-
- 🔄 **Migração suave**: Processo transparente e bem comunicado
|
|
174
|
+
```bash
|
|
175
|
+
# 1. Backup do projeto origem
|
|
176
|
+
npx smoonb backup
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
# 2. Criar novo projeto Supabase
|
|
179
|
+
# (via Dashboard ou Supabase CLI)
|
|
179
180
|
|
|
180
|
-
|
|
181
|
+
# 3. Configurar .smoonbrc com credenciais do novo projeto
|
|
182
|
+
npx smoonb config --init
|
|
181
183
|
|
|
182
|
-
|
|
184
|
+
# 4. Restaurar backup (modo interativo)
|
|
185
|
+
npx smoonb restore
|
|
183
186
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
3. Commit suas mudanças (`git commit -m 'Adiciona nova funcionalidade'`)
|
|
187
|
-
4. Push para a branch (`git push origin feature/nova-funcionalidade`)
|
|
188
|
-
5. Abra um Pull Request
|
|
187
|
+
# 5. Verificar integridade
|
|
188
|
+
npx smoonb check
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
# 6. Deploy Edge Functions (se necessário)
|
|
191
|
+
npx smoonb functions push
|
|
192
|
+
```
|
|
191
193
|
|
|
192
|
-
|
|
194
|
+
## 🐛 Troubleshooting
|
|
193
195
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
196
|
+
### Supabase CLI não encontrado
|
|
197
|
+
```bash
|
|
198
|
+
npm install -g supabase
|
|
199
|
+
```
|
|
198
200
|
|
|
199
|
-
|
|
201
|
+
### psql não encontrado
|
|
202
|
+
- **Windows**: Instalar PostgreSQL
|
|
203
|
+
- **macOS**: `brew install postgresql`
|
|
204
|
+
- **Linux**: `sudo apt-get install postgresql-client`
|
|
200
205
|
|
|
201
|
-
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
206
|
+
### Database URL incorreta
|
|
207
|
+
- Verificar senha na URL de conexão
|
|
208
|
+
- Usar Connection string do Dashboard Supabase
|
|
209
|
+
- Testar conexão: `psql "sua-database-url" -c "SELECT 1"`
|
|
205
210
|
|
|
206
|
-
|
|
211
|
+
## 📝 Licença
|
|
207
212
|
|
|
208
|
-
|
|
213
|
+
**Versões 0.x.x**: Uso gratuito (experimental)
|
|
214
|
+
**Versões 1.0.0+**: Licença comercial (anúncio com 90 dias de antecedência)
|
|
209
215
|
|
|
210
|
-
|
|
211
|
-
- ⭐ **Dê uma estrela** no GitHub
|
|
212
|
-
- 🐛 **Reporte bugs** e contribua com melhorias
|
|
213
|
-
- 📢 **Compartilhe** com outros desenvolvedores
|
|
216
|
+
## 🤝 Contribuição
|
|
214
217
|
|
|
215
|
-
|
|
218
|
+
Contribuições são bem-vindas! Este é um projeto experimental e precisamos de feedback da comunidade.
|
|
216
219
|
|
|
217
|
-
##
|
|
220
|
+
## ☕ Apoie o Projeto
|
|
218
221
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
- ⚠️ **NUNCA TESTADO EM PRODUÇÃO** - use por sua conta e risco
|
|
222
|
-
- ✅ Backup completo de projetos Supabase (implementação inicial)
|
|
223
|
-
- ✅ Restauração com verificação (implementação inicial)
|
|
224
|
-
- ✅ Suporte a Edge Functions, Auth, Storage e Realtime (implementação inicial)
|
|
225
|
-
- ✅ CLI intuitivo e documentação completa
|
|
226
|
-
- 🏢 Desenvolvido por Goalmoon Tecnologia LTDA
|
|
222
|
+
Se este projeto for útil para você, considere comprar um café:
|
|
223
|
+
[Compre um café](https://pag.ae/7Yj8QjQjQ)
|
|
227
224
|
|
|
228
225
|
---
|
|
229
226
|
|
|
230
|
-
**
|
|
231
|
-
|
|
232
|
-
|
|
227
|
+
**Desenvolvido por:** Goalmoon Tecnologia LTDA
|
|
228
|
+
**Website:** https://goalmoon.com
|
|
229
|
+
**GitHub:** https://github.com/almmello/smoonb
|
package/bin/smoonb.js
CHANGED
|
@@ -68,43 +68,26 @@ program
|
|
|
68
68
|
// Comandos principais
|
|
69
69
|
program
|
|
70
70
|
.command('backup')
|
|
71
|
-
.description('Fazer backup completo do projeto Supabase')
|
|
72
|
-
.option('-
|
|
73
|
-
.option('-o, --output <dir>', 'Diretório de saída do backup', './backups')
|
|
74
|
-
.option('--include-functions', 'Incluir Edge Functions no backup', true)
|
|
75
|
-
.option('--include-storage', 'Incluir Storage Objects no backup', true)
|
|
76
|
-
.option('--include-auth', 'Incluir Auth Settings no backup', true)
|
|
77
|
-
.option('--include-realtime', 'Incluir Realtime Settings no backup', true)
|
|
71
|
+
.description('Fazer backup completo do projeto Supabase usando Supabase CLI')
|
|
72
|
+
.option('-o, --output <dir>', 'Diretório de saída do backup')
|
|
78
73
|
.action(commands.backup);
|
|
79
74
|
|
|
80
75
|
program
|
|
81
76
|
.command('restore')
|
|
82
|
-
.description('Restaurar backup completo
|
|
83
|
-
.option('
|
|
84
|
-
.option('-b, --backup-dir <dir>', 'Diretório do backup a ser restaurado')
|
|
85
|
-
.option('--clean-restore', 'Limpar projeto antes da restauração', false)
|
|
86
|
-
.option('--verify', 'Verificar restauração após completar', true)
|
|
77
|
+
.description('Restaurar backup completo usando psql (modo interativo)')
|
|
78
|
+
.option('--db-url <url>', 'URL da database de destino (override)')
|
|
87
79
|
.action(commands.restore);
|
|
88
80
|
|
|
89
|
-
program
|
|
90
|
-
.command('secrets')
|
|
91
|
-
.description('Gerenciar secrets do projeto Supabase')
|
|
92
|
-
.option('export', 'Exportar secrets (sem commitar)')
|
|
93
|
-
.option('import', 'Importar secrets no projeto alvo')
|
|
94
|
-
.action(commands.secrets);
|
|
95
81
|
|
|
96
82
|
program
|
|
97
83
|
.command('functions')
|
|
98
|
-
.description('Gerenciar Edge Functions')
|
|
99
|
-
.option('push', 'Deploy de Edge Functions')
|
|
100
|
-
.option('pull', 'Baixar Edge Functions do projeto')
|
|
84
|
+
.description('Gerenciar Edge Functions do Supabase')
|
|
101
85
|
.action(commands.functions);
|
|
102
86
|
|
|
103
87
|
program
|
|
104
88
|
.command('check')
|
|
105
|
-
.description('
|
|
106
|
-
.option('-
|
|
107
|
-
.option('--verbose', 'Saída detalhada', false)
|
|
89
|
+
.description('Verificar integridade do projeto Supabase após restauração')
|
|
90
|
+
.option('-o, --output <file>', 'Arquivo de saída do relatório', 'check-report.json')
|
|
108
91
|
.action(commands.check);
|
|
109
92
|
|
|
110
93
|
program
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "smoonb",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Complete Supabase backup and migration tool - EXPERIMENTAL VERSION - USE AT YOUR OWN RISK",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"node": ">=16.0.0"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"commander": "^11.1.0",
|
|
30
29
|
"@supabase/supabase-js": "^2.38.0",
|
|
31
30
|
"chalk": "^4.1.2",
|
|
32
|
-
"
|
|
31
|
+
"commander": "^11.1.0",
|
|
32
|
+
"inquirer": "^8.2.7"
|
|
33
33
|
},
|
|
34
34
|
"type": "commonjs",
|
|
35
35
|
"repository": {
|