smoonb 0.0.71 → 0.0.72

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.
@@ -0,0 +1,730 @@
1
+ # Supa Moonbase (smoonb)
2
+
3
+ **Ferramenta completa de backup e migração do Supabase**
4
+
5
+ Backup e restauração: completo e simples, como deveria ser
6
+
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).
8
+
9
+ **Leia em outro idioma:** [English](README.md)
10
+
11
+ **Desenvolvido por:** Goalmoon Tecnologia LTDA
12
+ **Website:** https://smoonb.com
13
+ **GitHub:** https://github.com/almmello/smoonb
14
+
15
+ ## 🎯 Objetivo
16
+
17
+ O **smoonb** resolve o problema das ferramentas existentes que fazem backup apenas da database PostgreSQL, ignorando componentes críticos do Supabase.
18
+
19
+ ## 📦 Componentes de Backup
20
+
21
+ O smoonb faz backup completo de todos os componentes do seu projeto Supabase:
22
+
23
+ - ✅ **Database PostgreSQL** (backup completo via `pg_dumpall` + SQL separados, idêntico ao Dashboard)
24
+ - ✅ **Database Extensions and Settings** (extensões PostgreSQL e configurações)
25
+ - ✅ **Custom Roles** (roles personalizados do PostgreSQL)
26
+ - ✅ **Edge Functions** (download automático do servidor)
27
+ - ✅ **Auth Settings** (configurações de autenticação via Management API)
28
+ - ✅ **Storage Buckets** (backup completo: metadados, configurações e todos os arquivos via Management API + Supabase Client, cria ZIP no padrão do Dashboard)
29
+ - ✅ **Realtime Settings** (7 parâmetros capturados interativamente)
30
+ - ✅ **Supabase .temp** (arquivos temporários do Supabase CLI)
31
+ - ✅ **Migrations** (todas as migrations do projeto via `supabase migration fetch`)
32
+
33
+ ## ⚠️ Universal Disclaimer / Aviso Legal Universal
34
+
35
+ Ao continuar, você reconhece e concorda que o Supa Moonbase (smoonb) é fornecido "NO ESTADO EM QUE SE ENCONTRA" ("AS IS") e "CONFORME DISPONIBILIDADE" ("AS AVAILABLE"), 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 inerentes, os ambientes variam amplamente e não podemos prever ou validar todas as configurações dos usuários. Você é o único responsável por validar seu próprio ambiente, manter cópias independentes e verificar os resultados antes de utilizá-los em produção. Construímos o Supa Moonbase (smoonb) com repositórios públicos, auditáveis e de código aberto para ajudar pessoas a simplificar seus fluxos de trabalho, mas isso não cria qualquer garantia, promessa de suporte ou compromisso de nível de serviço.
36
+
37
+ **Limitação de responsabilidade** — Na máxima extensão permitida por lei, a Goalmoon Tecnologia LTDA, seus contribuidores e licenciadores não serão responsáveis por quaisquer danos indiretos, incidentais, especiais, consequentes, exemplares ou punitivos (incluindo perda de dados, interrupção de negócios ou lucros cessantes) decorrentes ou relacionados ao uso, incapacidade de uso, operações de backup/restauração realizadas por, ou resultados produzidos pelo Supa Moonbase (smoonb). Em qualquer caso, nossa responsabilidade agregada 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.
38
+
39
+ ## 🚀 Instalação
40
+
41
+ **⚠️ IMPORTANTE: Instale APENAS localmente no projeto!**
42
+
43
+ ```bash
44
+ # ✅ CORRETO - Instalar localmente no projeto
45
+ npm install smoonb
46
+
47
+ # ✅ CORRETO - Usar com npx
48
+ npx smoonb --help
49
+
50
+ # ❌ ERRADO - NÃO instalar globalmente
51
+ npm install -g smoonb # ← Isso será bloqueado!
52
+ ```
53
+
54
+ ### 🔄 Atualizar para a Última Versão
55
+
56
+ Para atualizar o smoonb para a versão mais recente disponível:
57
+
58
+ ```bash
59
+ # Atualizar no projeto atual
60
+ npm install smoonb@latest
61
+ ```
62
+
63
+ **⚠️ IMPORTANTE:** O smoonb deve ser instalado localmente no projeto. Não é permitido usar sem instalar (ex.: `npx smoonb@latest`).
64
+
65
+ **💡 Por que apenas local?**
66
+ - **🔒 Segurança**: Evita conflitos de versão
67
+ - **📦 Isolamento**: Cada projeto usa sua versão
68
+ - **🔄 Atualizações**: Controle granular por projeto
69
+ - **🛡️ Estabilidade**: Evita quebras em outros projetos
70
+
71
+ ## 📋 Pré-requisitos
72
+
73
+ ### 1. Docker Desktop (OBRIGATÓRIO)
74
+ ```bash
75
+ # Instalar Docker Desktop
76
+ # Windows/macOS: https://docs.docker.com/desktop/install/
77
+ # Linux: https://docs.docker.com/engine/install/
78
+
79
+ # Verificar se está rodando
80
+ docker --version
81
+ docker ps
82
+ ```
83
+
84
+ **⚠️ IMPORTANTE:** O Docker é necessário para:
85
+ - Backup da database via `pg_dumpall` (compatível com Dashboard do Supabase)
86
+ - Compressão de arquivos `.backup.gz`
87
+ - Restauração de backups `.backup` e `.backup.gz`
88
+
89
+ ### 2. Supabase CLI
90
+ ```bash
91
+ npm install -g supabase
92
+ ```
93
+
94
+ ### 3. Personal Access Token do Supabase
95
+ É necessário obter um token de acesso pessoal do Supabase para usar a Management API:
96
+
97
+ 1. Acesse: https://supabase.com/dashboard/account/tokens
98
+ 2. Clique em "Generate new token"
99
+ 3. Copie o token (formato: `sbp_...`)
100
+ 4. Adicione ao `.env.local` como `SUPABASE_ACCESS_TOKEN`
101
+
102
+ ## ⚙️ Configuração
103
+
104
+ ### Método Moderno: `.env.local` (RECOMENDADO)
105
+
106
+ O **smoonb** agora usa `.env.local` para configuração, seguindo o padrão da indústria. Isso torna o processo mais simples e integrado ao seu fluxo de trabalho.
107
+
108
+ #### 1. Criar ou editar `.env.local` na raiz do projeto
109
+
110
+ ```bash
111
+ # Criar arquivo .env.local
112
+ touch .env.local
113
+ ```
114
+
115
+ #### 2. Adicionar as variáveis de ambiente necessárias
116
+
117
+ ```env
118
+ # URLs e Chaves do Supabase
119
+ NEXT_PUBLIC_SUPABASE_URL=[sua-supabase-url]
120
+ NEXT_PUBLIC_SUPABASE_ANON_KEY=[sua-anon-key]
121
+ SUPABASE_SERVICE_ROLE_KEY=[sua-service-role]
122
+
123
+ # Conexão com Database
124
+ SUPABASE_DB_URL=postgresql://postgres:[sua-database-password]@db.[seu-project-id].supabase.co:5432/postgres
125
+
126
+ # Identificação do Projeto
127
+ SUPABASE_PROJECT_ID=[seu-project-id]
128
+
129
+ # Personal Access Token (OBRIGATÓRIO para Management API)
130
+ SUPABASE_ACCESS_TOKEN=[seu-access-token]
131
+
132
+ # Diretório de Backups (opcional, padrão: ./backups)
133
+ SMOONB_OUTPUT_DIR=./backups
134
+ ```
135
+
136
+ #### 3. Mapeamento Interativo
137
+
138
+ Ao executar `backup` ou `restore` pela primeira vez, o **smoonb** irá:
139
+
140
+ 1. **Ler** seu `.env.local` atual
141
+ 2. **Identificar** as chaves que você já tem
142
+ 3. **Perguntar interativamente** quais chaves correspondem às esperadas (se os nomes forem diferentes)
143
+ 4. **Adicionar** chaves faltantes se necessário
144
+ 5. **Criar backup** automático do `.env.local` antes de qualquer alteração
145
+ 6. **Salvar mapeamento** para futuras execuções
146
+
147
+ **Exemplo de mapeamento:**
148
+ ```
149
+ 🔧 Mapeando variável: NEXT_PUBLIC_SUPABASE_URL
150
+ Valor atual: https://abc123.supabase.co
151
+ Este é o valor correto do projeto alvo? (S/n): S
152
+ ```
153
+
154
+ ## 🌐 Internacionalização (i18n)
155
+
156
+ O **smoonb** suporta múltiplos idiomas automaticamente. Atualmente, os idiomas suportados são:
157
+
158
+ - **Inglês (en)** - Idioma padrão
159
+ - **Português do Brasil (pt-BR)** - Suporte completo
160
+
161
+ ### Detecção Automática de Idioma
162
+
163
+ O idioma é detectado automaticamente na seguinte ordem de precedência:
164
+
165
+ 1. **Flag CLI `--lang`** (maior prioridade)
166
+ ```bash
167
+ npx smoonb --lang pt-BR backup
168
+ npx smoonb --lang en restore
169
+ ```
170
+
171
+ 2. **Variável de ambiente `SMOONB_LANG`**
172
+ ```bash
173
+ # Windows PowerShell
174
+ $env:SMOONB_LANG="pt-BR"
175
+ npx smoonb backup
176
+
177
+ # Linux/macOS
178
+ export SMOONB_LANG=pt-BR
179
+ npx smoonb backup
180
+ ```
181
+
182
+ 3. **Locale do sistema** (LANG, LC_ALL, LC_MESSAGES)
183
+ ```bash
184
+ # O smoonb detecta automaticamente o locale do sistema
185
+ # Exemplo: LANG=pt_BR.UTF-8 → pt-BR
186
+ # Exemplo: LANG=en_US.UTF-8 → en
187
+ ```
188
+
189
+ 4. **Fallback para inglês (en)** se nenhum dos anteriores for detectado
190
+
191
+ ### Idiomas Suportados e Aliases
192
+
193
+ O smoonb aceita os seguintes códigos de idioma:
194
+
195
+ - `en` ou `en-US` → Inglês
196
+ - `pt-BR`, `pt_BR` ou `pt` → Português do Brasil
197
+
198
+ ### Exemplos de Uso
199
+
200
+ **Forçar português:**
201
+ ```bash
202
+ npx smoonb --lang pt-BR backup
203
+ ```
204
+
205
+ **Forçar inglês:**
206
+ ```bash
207
+ npx smoonb --lang en restore
208
+ ```
209
+
210
+ **Usar variável de ambiente:**
211
+ ```bash
212
+ # Windows PowerShell
213
+ $env:SMOONB_LANG="pt-BR"
214
+ npx smoonb check
215
+
216
+ # Linux/macOS
217
+ export SMOONB_LANG=en
218
+ npx smoonb check
219
+ ```
220
+
221
+ **Detecção automática pelo sistema:**
222
+ ```bash
223
+ # Se o sistema estiver configurado com LANG=pt_BR.UTF-8
224
+ # O smoonb automaticamente usará português
225
+ npx smoonb backup
226
+ ```
227
+
228
+ ### Notas Importantes
229
+
230
+ - **Saídas "máquina"** (ex.: `--json` se implementado) **não** são traduzidas; campos e chaves permanecem em inglês
231
+ - Se uma chave de tradução estiver ausente em um idioma, o sistema faz **fallback automático para inglês**
232
+ - O idioma é detectado uma vez no início da execução e aplicado a todas as mensagens do CLI
233
+
234
+ ## 🎯 Uso
235
+
236
+ ### Backup Completo
237
+
238
+ ```bash
239
+ npx smoonb backup
240
+ ```
241
+
242
+ **Fluxo interativo do backup:**
243
+
244
+ 1. **Validação Docker** - Verifica se o Docker está rodando
245
+ 2. **Consentimento** - Pede permissão para ler/escrever `.env.local`
246
+ 3. **Mapeamento de Variáveis** - Mapeia suas variáveis de ambiente (primeira vez)
247
+ 4. **Backup do .env.local** - Cria backup automático antes de alterações
248
+ 5. **Seleção de Componentes** - Pergunta quais componentes incluir:
249
+ - ⚡ Edge Functions (explicação sobre reset de link e download)
250
+ - 📦 Storage (explicação sobre backup completo: download de arquivos + ZIP no padrão do Dashboard)
251
+ - 🔐 Auth Settings (explicação sobre configurações)
252
+ - 🔄 Realtime Settings (explicação sobre captura interativa de 7 parâmetros)
253
+ - 🗑️ Opções de limpeza (functions, .temp, migrations após backup)
254
+ 6. **Resumo de Configurações** - Mostra tudo que será feito
255
+ 7. **Confirmação Final** - Confirma antes de iniciar
256
+ 8. **Execução das Etapas:**
257
+ - 📊 1/10 - Backup Database via `pg_dumpall` (Docker)
258
+ - 📊 2/10 - Backup Database SQL separado (schema, dados, roles)
259
+ - 🔧 3/10 - Backup Database Extensions and Settings
260
+ - 🔐 4/10 - Backup Auth Settings (se selecionado)
261
+ - 🔄 5/10 - Backup Realtime Settings (se selecionado) - 7 parâmetros capturados interativamente
262
+ - 📦 6/10 - Backup Storage (se selecionado) - Download completo de arquivos + ZIP no padrão do Dashboard
263
+ - 👥 7/10 - Backup Custom Roles
264
+ - ⚡ 8/10 - Backup Edge Functions (se selecionado)
265
+ - 📁 9/10 - Backup Supabase .temp (se selecionado)
266
+ - 📋 10/10 - Backup Migrations (se selecionado)
267
+
268
+ **Resultado:**
269
+ ```
270
+ backups/backup-2025-10-31-09-37-54/
271
+ ├── backup-manifest.json # Manifesto com metadados
272
+ ├── db_cluster-31-10-2025@09-38-57.backup.gz # Backup completo (compatível com Dashboard)
273
+ ├── schema.sql # Schema do banco
274
+ ├── data.sql # Dados
275
+ ├── roles.sql # Roles do PostgreSQL
276
+ ├── database-settings-*.json # Extensões e configurações
277
+ ├── auth-settings.json # Configurações de Auth
278
+ ├── realtime-settings.json # Configurações de Realtime
279
+ ├── storage/ # Metadados de Storage
280
+ │ └── [bucket-name].json # Metadados de cada bucket
281
+ ├── [project-id].storage.zip # Backup completo de Storage (padrão Dashboard)
282
+ ├── storage_temp/ # Estrutura temporária (opcional, pode ser removida)
283
+ │ └── [project-id]/ # Estrutura de arquivos baixados
284
+ │ └── [bucket-name]/ # Arquivos de cada bucket
285
+ ├── edge-functions/ # Edge Functions baixadas
286
+ │ └── [nome-da-function]/
287
+ ├── supabase-temp/ # Arquivos .temp do Supabase CLI
288
+ ├── migrations/ # Todas as migrations
289
+ └── env/
290
+ ├── .env.local # Backup do .env.local
291
+ └── env-map.json # Mapeamento de variáveis
292
+ ```
293
+
294
+ ### Restauração Interativa
295
+
296
+ **Restaurar backup existente:**
297
+ ```bash
298
+ npx smoonb restore
299
+ ```
300
+
301
+ **Importar e restaurar diretamente do Dashboard:**
302
+ ```bash
303
+ # Apenas database
304
+ npx smoonb restore --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz"
305
+
306
+ # Database e storage juntos
307
+ npx smoonb restore --file "backup.backup.gz" --storage "meu-projeto.storage.zip"
308
+ ```
309
+
310
+ **Fluxo interativo do restore:**
311
+
312
+ 1. **Validação Docker** - Verifica se o Docker está rodando
313
+ 2. **Termo de Uso** - Exibe e solicita aceitação dos termos
314
+ 3. **Consentimento** - Pede permissão para ler/escrever `.env.local`
315
+ 4. **Mapeamento de Variáveis** - Mapeia variáveis para o projeto de destino
316
+ 5. **Backup do .env.local** - Cria backup automático
317
+ 6. **Seleção de Backup** - Lista e permite escolher qual backup restaurar (pula se `--file` fornecido)
318
+ - Se `--file` for fornecido: importa automaticamente e auto-seleciona o backup
319
+ - Se `--storage` for fornecido junto com `--file`: importa também o arquivo de storage
320
+ 7. **Seleção de Componentes** - Pergunta quais componentes restaurar:
321
+ - 📊 Database (sempre disponível)
322
+ - ⚡ Edge Functions (se disponível no backup)
323
+ - 🔐 Auth Settings (se disponível no backup)
324
+ - 📦 Storage (se disponível no backup)
325
+ - 🔧 Database Extensions and Settings (se disponível no backup)
326
+ - 🔄 Realtime Settings (se disponível no backup)
327
+ 8. **Resumo Detalhado** - Mostra backup selecionado, projeto destino e componentes
328
+ 9. **Confirmação Final** - Confirma antes de iniciar
329
+ 10. **Execução da Restauração:**
330
+ - 📊 Database - Restaura via `psql` (suporta `.backup.gz` e `.backup`)
331
+ - ⚡ Edge Functions - Copia e faz deploy no projeto destino
332
+ - 🔐 Auth Settings - Exibe configurações para aplicação manual
333
+ - 📦 Storage - Restaura buckets e arquivos do ZIP (se disponível) ou exibe informações para migração manual
334
+ - 🔧 Database Settings - Restaura extensões e configurações via SQL
335
+ - 🔄 Realtime Settings - Exibe configurações para aplicação manual
336
+
337
+ **Formato de arquivos suportados:**
338
+ - ✅ `.backup.gz` (compactado) - Descompacta automaticamente antes de restaurar
339
+ - ✅ `.backup` (descompactado) - Restaura diretamente
340
+
341
+ **Quando usar `--file`:**
342
+ - Importa automaticamente o arquivo de backup antes de restaurar
343
+ - Elimina a etapa de seleção de backup
344
+ - Se `--storage` fornecido, importa também o arquivo de storage
345
+ - Útil para restaurar backups baixados diretamente do Dashboard do Supabase
346
+
347
+ ### Importar Backup do Dashboard do Supabase
348
+
349
+ Se você baixou um backup diretamente do Dashboard do Supabase (formato `.backup.gz`), você pode importá-lo para o formato esperado pelo smoonb. O comando também suporta importar arquivos de storage (`.storage.zip`) opcionalmente.
350
+
351
+ **Importar apenas database:**
352
+ ```bash
353
+ npx smoonb import --file "caminho/completo/para/db_cluster-04-03-2024@14-16-59.backup.gz"
354
+ ```
355
+
356
+ **Importar database e storage juntos:**
357
+ ```bash
358
+ npx smoonb import --file "backup.backup.gz" --storage "meu-projeto.storage.zip"
359
+ ```
360
+
361
+ **O que o comando faz:**
362
+ 1. Lê o arquivo `.backup.gz` do Dashboard (obrigatório)
363
+ 2. Se fornecido, lê o arquivo `.storage.zip` do Dashboard (opcional)
364
+ 3. Extrai informações do nome do arquivo de backup (data e hora)
365
+ 4. Cria uma pasta de backup no formato esperado (`backup-YYYY-MM-DD-HH-MM-SS`)
366
+ 5. Copia o arquivo de backup para a pasta criada
367
+ 6. Se fornecido, copia o arquivo de storage para a mesma pasta
368
+ 7. Deixa o backup pronto para ser encontrado pelo comando `restore`
369
+
370
+ **Exemplo completo - Apenas database (usando import + restore):**
371
+ ```bash
372
+ # 1. Baixar backup do Dashboard do Supabase
373
+ # Arquivo: db_cluster-04-03-2024@14-16-59.backup.gz
374
+
375
+ # 2. Importar o arquivo
376
+ npx smoonb import --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz"
377
+
378
+ # 3. Restaurar o backup importado
379
+ npx smoonb restore
380
+ # O backup importado aparecerá na lista de backups disponíveis
381
+ ```
382
+
383
+ **Exemplo completo - Apenas database (usando restore diretamente):**
384
+ ```bash
385
+ # 1. Baixar backup do Dashboard do Supabase
386
+ # Arquivo: db_cluster-04-03-2024@14-16-59.backup.gz
387
+
388
+ # 2. Importar e restaurar diretamente (pula seleção de backup)
389
+ npx smoonb restore --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz"
390
+ ```
391
+
392
+ **Exemplo completo - Database e Storage (usando import + restore):**
393
+ ```bash
394
+ # 1. Baixar backup e storage do Dashboard do Supabase
395
+ # Arquivos:
396
+ # - db_cluster-04-03-2024@14-16-59.backup.gz
397
+ # - meu-projeto.storage.zip
398
+
399
+ # 2. Importar ambos os arquivos
400
+ npx smoonb import --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz" --storage "C:\Downloads\meu-projeto.storage.zip"
401
+
402
+ # 3. Restaurar o backup importado
403
+ npx smoonb restore
404
+ # O backup importado aparecerá na lista de backups disponíveis
405
+ ```
406
+
407
+ **Exemplo completo - Database e Storage (usando restore diretamente):**
408
+ ```bash
409
+ # 1. Baixar backup e storage do Dashboard do Supabase
410
+ # Arquivos:
411
+ # - db_cluster-04-03-2024@14-16-59.backup.gz
412
+ # - meu-projeto.storage.zip
413
+
414
+ # 2. Importar e restaurar diretamente (pula seleção de backup)
415
+ npx smoonb restore --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz" --storage "C:\Downloads\meu-projeto.storage.zip"
416
+ ```
417
+
418
+ **Importante:**
419
+ - O arquivo de backup é **obrigatório** e deve estar no formato do Dashboard: `db_cluster-DD-MM-YYYY@HH-MM-SS.backup.gz`
420
+ - O arquivo de storage é **opcional** e deve estar no formato: `*.storage.zip`
421
+ - O storage depende de um backup, mas o backup não depende do storage
422
+ - Ambos os arquivos serão copiados para a mesma pasta de backup
423
+ - O caminho pode ser absoluto ou relativo
424
+ - O comando criará a estrutura de pastas necessária automaticamente
425
+
426
+ **Diferença entre `import` e `restore --file`:**
427
+ - `import`: Apenas importa o arquivo e cria a estrutura de backup. Você precisa executar `restore` depois.
428
+ - `restore --file`: Importa o arquivo automaticamente e já inicia o processo de restauração, pulando a etapa de seleção de backup.
429
+
430
+ ### Verificação Pós-Restore
431
+
432
+ ```bash
433
+ npx smoonb check
434
+ ```
435
+
436
+ **Verifica:**
437
+ - ✅ Conexão com database
438
+ - ✅ Extensões instaladas
439
+ - ✅ Tabelas criadas
440
+ - ✅ Políticas RLS
441
+ - ✅ Publicações Realtime
442
+ - ✅ Buckets de Storage
443
+
444
+
445
+ ## 🔧 Comandos Disponíveis
446
+
447
+ | Comando | Descrição |
448
+ |---------|-----------|
449
+ | `npx smoonb backup` | Backup completo interativo usando Docker |
450
+ | `npx smoonb restore` | Restauração interativa usando psql (Docker) |
451
+ | `npx smoonb restore --file <path> [--storage <path>]` | Importar e restaurar diretamente arquivo .backup.gz e opcionalmente .storage.zip do Dashboard |
452
+ | `npx smoonb import --file <path> [--storage <path>]` | Importar arquivo .backup.gz e opcionalmente .storage.zip do Dashboard do Supabase |
453
+ | `npx smoonb check` | Verificação de integridade pós-restore |
454
+
455
+ ## 🏗️ Arquitetura Técnica
456
+
457
+ ### Estrutura Modular
458
+
459
+ O código foi refatorado para uma **arquitetura modular** com etapas independentes:
460
+
461
+ #### Backup (`src/commands/backup/`)
462
+ ```
463
+ backup/
464
+ ├── index.js # Orquestrador principal
465
+ ├── utils.js # Utilitários específicos
466
+ └── steps/
467
+ ├── 00-docker-validation.js # Validação Docker
468
+ ├── 01-database.js # Backup via pg_dumpall
469
+ ├── 02-database-separated.js # SQL separado
470
+ ├── 03-database-settings.js # Extensões e settings
471
+ ├── 04-auth-settings.js # Auth via API
472
+ ├── 05-realtime-settings.js # Realtime interativo
473
+ ├── 06-storage.js # Storage via API
474
+ ├── 07-custom-roles.js # Custom roles
475
+ ├── 08-edge-functions.js # Edge Functions
476
+ ├── 09-supabase-temp.js # Supabase .temp
477
+ └── 10-migrations.js # Migrations
478
+ ```
479
+
480
+ #### Restore (`src/commands/restore/`)
481
+ ```
482
+ restore/
483
+ ├── index.js # Orquestrador principal
484
+ ├── utils.js # Utilitários específicos
485
+ └── steps/
486
+ ├── 00-backup-selection.js # Seleção de backup
487
+ ├── 01-components-selection.js # Seleção de componentes
488
+ ├── 02-confirmation.js # Confirmação (legacy)
489
+ ├── 03-database.js # Restauração database
490
+ ├── 04-edge-functions.js # Deploy Edge Functions
491
+ ├── 05-auth-settings.js # Exibe Auth settings
492
+ ├── 06-storage.js # Exibe Storage info
493
+ ├── 07-database-settings.js # Restaura settings
494
+ └── 08-realtime-settings.js # Exibe Realtime settings
495
+ ```
496
+
497
+ ### Estratégia de Backup
498
+
499
+ #### Database
500
+ - **Backup Principal**: `pg_dumpall` via Docker (idêntico ao Dashboard)
501
+ - Arquivo: `db_cluster-XX-XX-XXXX@XX-XX-XX.backup.gz`
502
+ - Compatível com restauração via Dashboard do Supabase
503
+ - **Backup Separado**: SQL em arquivos distintos via Supabase CLI
504
+ - `schema.sql` - Estrutura das tabelas
505
+ - `data.sql` - Dados (comandos COPY)
506
+ - `roles.sql` - Roles e permissões
507
+
508
+ #### Edge Functions
509
+ - **Download Automático**: Via Supabase CLI `supabase functions download`
510
+ - **Reset de Link**: Garante link limpo com o projeto antes do download
511
+ - **Backup Completo**: Código completo de cada function
512
+
513
+ #### Migrations
514
+ - **Download Automático**: Via `supabase migration fetch`
515
+ - **Reset de Link**: Garante link limpo com o projeto
516
+ - **Backup Completo**: Todas as migrations do servidor
517
+
518
+ #### Storage
519
+ - **Backup Completo**: Download de todos os arquivos de todos os buckets
520
+ - **Estrutura Temporária**: Cria `storage_temp/project-id/bucket-name/arquivos...` dentro do backupDir
521
+ - **ZIP no Padrão Dashboard**: Cria `{project-id}.storage.zip` com estrutura `project-id/bucket-name/arquivos...`
522
+ - **Compatível com Restore**: O ZIP criado é compatível com o processo de restore (mesmo formato do Dashboard)
523
+ - **Pergunta Interativa**: Após criar o ZIP, pergunta se deseja limpar a estrutura temporária
524
+ - **Fallback**: Se não houver credenciais do Supabase, faz backup apenas de metadados
525
+ - **Management API**: Usa Personal Access Token para listar buckets e objetos
526
+ - **Supabase Client**: Usa Service Role Key para download de arquivos
527
+
528
+ #### Auth, Realtime
529
+ - **Management API**: Usa Personal Access Token
530
+ - **JSON Export**: Configurações exportadas como JSON
531
+ - **Realtime Settings**: Captura interativa de 7 parâmetros:
532
+ 1. Habilitar serviço Realtime
533
+ 2. Permitir acesso público
534
+ 3. Tamanho do pool de conexões do database
535
+ 4. Máximo de clientes simultâneos
536
+ 5. Máximo de eventos por segundo
537
+ 6. Máximo de eventos de presença por segundo
538
+ 7. Tamanho máximo do payload em KB
539
+ - **Manual para alguns**: Alguns settings precisam ser aplicados manualmente por segurança
540
+
541
+ ### Estratégia de Restauração
542
+
543
+ #### Database
544
+ - **Suporte a Formatos**:
545
+ - `.backup.gz` - Descompacta automaticamente via Docker
546
+ - `.backup` - Restaura diretamente via `psql` (Docker)
547
+ - **Restauração Limpa**: Pode sobrescrever dados existentes (com confirmação)
548
+
549
+ #### Edge Functions
550
+ - **Deploy Limpo**: Limpa `supabase/functions` antes do deploy
551
+ - **Reset de Link**: Garante link correto com projeto destino
552
+ - **Deploy Automático**: Usa `supabase functions deploy`
553
+
554
+ #### Outros Componentes
555
+ - **Database Settings**: Restaura via SQL
556
+ - **Storage**: Restaura buckets e arquivos do ZIP (se disponível) ou exibe informações para configuração manual
557
+ - **Auth/Realtime**: Exibe informações para configuração manual no Dashboard
558
+
559
+ ### Multiplataforma
560
+
561
+ - **Windows/macOS/Linux**: Detecção automática de binários
562
+ - **Multiplataforma**: Usa `fs.promises.cp`, `path.join`, Docker
563
+ - **Docker para Tudo**: Backup, restore e compressão via Docker (garante consistência)
564
+
565
+ ## 📊 Fluxo Recomendado
566
+
567
+ ```bash
568
+ # 1. Configurar .env.local (primeira vez)
569
+ # Edite .env.local com suas credenciais do projeto origem
570
+
571
+ # 2. Backup do projeto origem
572
+ npx smoonb backup
573
+ # - Mapeia variáveis interativamente (primeira vez)
574
+ # - Seleciona componentes para backup
575
+ # - Executa backup completo
576
+
577
+ # 3. Criar novo projeto Supabase
578
+ # (via Dashboard ou Supabase CLI)
579
+
580
+ # 4. Editar .env.local com credenciais do novo projeto
581
+ # Atualize as variáveis para apontar ao projeto destino
582
+
583
+ # 5. Restaurar backup (modo interativo)
584
+ npx smoonb restore
585
+ # - Seleciona backup desejado
586
+ # - Seleciona componentes para restaurar
587
+ # - Executa restauração
588
+
589
+ # 6. Verificar integridade
590
+ npx smoonb check
591
+
592
+ # 7. Aplicar configurações manuais (se necessário)
593
+ # - Auth Settings: Dashboard → Authentication → Settings
594
+ # - Realtime: Dashboard → Database → Replication
595
+ # Nota: Storage é restaurado automaticamente do ZIP se disponível
596
+ ```
597
+
598
+ ## 🎨 Experiência do Usuário
599
+
600
+ ### Interface em Português
601
+
602
+ Todas as interações são em **Português do Brasil**:
603
+ - Perguntas claras e diretas
604
+ - Explicações antes de cada processo
605
+ - Resumos detalhados antes de confirmar
606
+ - Confirmações com `(S/n)` ou `(s/N)` em português
607
+
608
+ ### Mapeamento Inteligente de Variáveis
609
+
610
+ - **Detecção Automática**: Se a chave já existe com o nome esperado, pula a seleção
611
+ - **Opção de Adicionar**: Permite adicionar novas chaves se não existirem
612
+ - **Validação de Valores**: Confirma valores antes de salvar
613
+ - **Backup Automático**: Sempre cria backup do `.env.local` antes de alterações
614
+
615
+ ### Processo Guiado
616
+
617
+ - **Validação Prévia**: Verifica Docker antes de começar
618
+ - **Explicações Contextuais**: Explica cada processo antes de perguntar
619
+ - **Resumo Final**: Mostra tudo que será feito antes de executar
620
+ - **Feedback Visual**: Cores e ícones para melhor experiência
621
+
622
+ ## 🐛 Solução de Problemas
623
+
624
+ ### Docker não encontrado ou não está rodando
625
+ ```bash
626
+ # Verificar se Docker está instalado
627
+ docker --version
628
+
629
+ # Verificar se Docker Desktop está rodando
630
+ docker ps
631
+
632
+ # Se não estiver, iniciar Docker Desktop
633
+ # Windows/macOS: Abrir aplicativo Docker Desktop
634
+ # Linux: sudo systemctl start docker
635
+ ```
636
+
637
+ ### Supabase CLI não encontrado
638
+ ```bash
639
+ npm install -g supabase
640
+ ```
641
+
642
+ ### Personal Access Token inválido ou ausente
643
+
644
+ 1. Verificar se `SUPABASE_ACCESS_TOKEN` está no `.env.local`
645
+ 2. Gerar novo token: https://supabase.com/dashboard/account/tokens
646
+ 3. Atualizar `.env.local` com o novo token
647
+
648
+ ### Database URL incorreta
649
+ - Verificar senha na URL de conexão
650
+ - Usar string de conexão do Dashboard Supabase (Settings → Database)
651
+ - Testar conexão: `psql "sua-database-url" -c "SELECT 1"`
652
+
653
+ ### Arquivo .backup.gz não pode ser restaurado
654
+
655
+ O smoonb suporta automaticamente:
656
+ - ✅ `.backup.gz` - Descompacta via Docker antes de restaurar
657
+ - ✅ `.backup` - Restaura diretamente
658
+
659
+ Se houver problemas:
660
+ 1. Verificar se Docker está rodando
661
+ 2. Verificar permissões do arquivo
662
+ 3. Verificar espaço em disco
663
+
664
+ ### Erro ao baixar Edge Functions
665
+
666
+ 1. Verificar se `SUPABASE_ACCESS_TOKEN` está configurado
667
+ 2. Verificar se o projeto está linkado: `supabase link`
668
+ 3. Verificar se as functions existem no servidor
669
+
670
+ ### Erro ao baixar Migrations
671
+
672
+ 1. Verificar se `SUPABASE_ACCESS_TOKEN` está configurado
673
+ 2. Verificar se o projeto está linkado: `supabase link`
674
+ 3. Verificar se há migrations no servidor
675
+
676
+ ## 🔒 Segurança
677
+
678
+ - **Backup Automático**: Sempre cria backup do `.env.local` antes de alterações
679
+ - **Mapeamento Local**: Mapeamento de variáveis salvo apenas localmente
680
+ - **Sem Dados Sensíveis**: Nenhum dado sensível é enviado para fora do seu ambiente
681
+ - **Docker Isolado**: Operações de database via Docker (isolamento)
682
+
683
+ ## 💼 Modelo de Acesso e Assinatura
684
+
685
+ 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).
686
+
687
+ Até que a validação esteja ativa, a ferramenta pode ser utilizada sem login.
688
+
689
+ Saiba mais em [Pricing](https://smoonb.com/pricing) e [FAQ Comercial](https://smoonb.com/faq).
690
+
691
+ ## 🎁 Grandfathering (conceito)
692
+
693
+ 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).
694
+
695
+ ## 🔒 Privacidade e LGPD (resumo)
696
+
697
+ 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).
698
+
699
+ ## 📋 Termos de Serviço e Uso de Marca
700
+
701
+ 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.
702
+
703
+ "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).
704
+
705
+ ## ❓ FAQ Comercial
706
+
707
+ **Por que assinatura se o código é MIT?**
708
+
709
+ > O código permanece aberto para auditoria e contribuições. O acesso operacional será condicionado à validação de conta, conforme Termos de Serviço.
710
+
711
+ **O que significa grandfathering?**
712
+
713
+ > Contas do período inicial poderão manter condições diferenciadas enquanto ativas; detalhes estarão nos Termos.
714
+
715
+
716
+
717
+ ## 📝 Licença
718
+
719
+ O código do Supa Moonbase é disponibilizado sob licença MIT. Veja [LICENSE](LICENSE) para o texto completo da licença. Uma tradução em português está disponível em [LICENSE.pt-BR.md](LICENSE.pt-BR.md) apenas para conveniência.
720
+
721
+ ## 🤝 Contribuição
722
+
723
+ Contribuições são bem-vindas! Este é um projeto experimental e precisamos de feedback da comunidade.
724
+
725
+
726
+ ---
727
+
728
+ **Desenvolvido por:** Goalmoon Tecnologia LTDA
729
+ **Website:** https://smoonb.com
730
+ **GitHub:** https://github.com/almmello/smoonb