smoonb 1.0.6 → 1.0.8

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.pt-BR.md CHANGED
@@ -1,644 +1,679 @@
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
- > **Produto comercial.** É necessário ter **licença ativa** e **assinatura válida** (ou estar em período de trial) para usar o smoonb. [www.smoonb.com/#price](https://www.smoonb.com/#price). O uso é regido pelos [Termos de Serviço](https://www.smoonb.com/terms) e pela [Política de Privacidade](https://www.smoonb.com/privacy). Não assumimos responsabilidade por danos causados pelo smoonb; os avisos legais abaixo permanecem válidos.
8
-
9
- **Leia em outro idioma:** [English](README.md)
10
-
11
- **Desenvolvido por:** Goalmoon Tecnologia LTDA
12
- **Website:** https://www.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).
38
-
39
- ## 🚀 Instalação
40
-
41
- **⚠️ IMPORTANTE: Instale APENAS localmente no projeto!**
42
-
43
- **Instalar localmente no projeto:**
44
- ```bash
45
- npm install smoonb
46
- ```
47
-
48
- **Usar com npx:**
49
- ```bash
50
- npx smoonb --help
51
- ```
52
-
53
- **Não instalar globalmente** (será bloqueado):
54
- ```bash
55
- npm install -g smoonb
56
- ```
57
-
58
- ### 🔄 Atualizar para a Última Versão
59
-
60
- Para atualizar o smoonb para a versão mais recente disponível, execute no projeto atual:
61
-
62
- ```bash
63
- npm install smoonb@latest
64
- ```
65
-
66
- **⚠️ IMPORTANTE:** O smoonb deve ser instalado localmente no projeto. Não é permitido usar sem instalar (ex.: `npx smoonb@latest`).
67
-
68
- **💡 Por que apenas local?**
69
- - **🔒 Segurança**: Evita conflitos de versão
70
- - **📦 Isolamento**: Cada projeto usa sua versão
71
- - **🔄 Atualizações**: Controle granular por projeto
72
- - **🛡️ Estabilidade**: Evita quebras em outros projetos
73
-
74
- ## 📋 Pré-requisitos
75
-
76
- ### 1. Docker Desktop (OBRIGATÓRIO)
77
-
78
- Instale pelo [Docker Desktop](https://docs.docker.com/desktop/install/) (Windows/macOS) ou [Docker Engine](https://docs.docker.com/engine/install/) (Linux). Depois verifique se está rodando:
79
-
80
- ```bash
81
- docker --version
82
- docker ps
83
- ```
84
-
85
- **⚠️ IMPORTANTE:** O Docker é necessário para:
86
- - Backup da database via `pg_dumpall` (compatível com Dashboard do Supabase)
87
- - Compressão de arquivos `.backup.gz`
88
- - Restauração de backups `.backup` e `.backup.gz`
89
-
90
- ### 2. Supabase CLI
91
- ```bash
92
- npm install -g supabase
93
- ```
94
-
95
- **Política de versão:** o smoonb aceita qualquer versão do Supabase CLI que esteja **no máximo 1 minor atrás da latest** (mesma major). Recomendamos sempre usar a versão mais recente. Versões muito antigas são bloqueadas com mensagem de erro.
96
-
97
- Se o seu gerenciador de pacotes (ex.: **Scoop** no Windows) instala com atraso e você quer avançar mesmo assim, use a flag `--skip-supabase-version-check` (veja a seção de uso abaixo).
98
-
99
- Para atualizar o Supabase CLI: [Atualizando o Supabase CLI](https://supabase.com/docs/guides/cli/getting-started#updating-the-supabase-cli).
100
-
101
- ### 3. Personal Access Token do Supabase
102
- É necessário obter um token de acesso pessoal do Supabase para usar a Management API:
103
-
104
- 1. Acesse: https://supabase.com/dashboard/account/tokens
105
- 2. Clique em "Generate new token"
106
- 3. Copie o token (formato: `sbp_...`)
107
- 4. Adicione ao `.env.local` como `SUPABASE_ACCESS_TOKEN`
108
-
109
- ### 4. Chave de licença (OBRIGATÓRIA para backup e restore)
110
- O **smoonb** exige uma licença válida para executar backup e restore:
111
-
112
- 1. Obtenha sua licença no app desktop em https://www.smoonb.com
113
- 2. Defina no ambiente ou no `.env.local`: `SMOONB_LICENSE_KEY=[sua-chave-de-licença]`
114
- 3. A licença é validada no início de cada execução (step 00); não há cache. Se a validação falhar (rede/servidor), o CLI aborta. A licença **não** aparece no wizard de mapeamento de variáveis (já foi validada antes).
115
-
116
- ## ⚙️ Configuração
117
-
118
- ### Método Moderno: `.env.local` (RECOMENDADO)
119
-
120
- 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.
121
-
122
- #### 1. Criar ou editar `.env.local` na raiz do projeto
123
-
124
- ```bash
125
- touch .env.local
126
- ```
127
-
128
- #### 2. Adicionar as variáveis de ambiente necessárias
129
-
130
- ```env
131
- SMOONB_LICENSE_KEY=[sua-chave-de-licença]
132
- NEXT_PUBLIC_SUPABASE_URL=[sua-supabase-url]
133
- NEXT_PUBLIC_SUPABASE_ANON_KEY=[sua-anon-key]
134
- SUPABASE_SERVICE_ROLE_KEY=[sua-service-role]
135
- SUPABASE_DB_URL=postgresql://postgres:[sua-database-password]@db.[seu-project-id].supabase.co:5432/postgres
136
- SUPABASE_PROJECT_ID=[seu-project-id]
137
- SUPABASE_ACCESS_TOKEN=[seu-access-token]
138
- SUPABASE_POSTGRES_MAJOR=17
139
- SMOONB_TELEMETRY_ENABLED=true
140
- SMOONB_OUTPUT_DIR=./backups
141
- ```
142
-
143
- Obrigatórias: `SMOONB_LICENSE_KEY` (app desktop em [smoonb.com](https://www.smoonb.com)), `SUPABASE_POSTGRES_MAJOR` (ex.: 17; veja no Dashboard → Project Settings → Infrastructure → Service Versions). Opcionais: `SMOONB_TELEMETRY_ENABLED`, `SMOONB_OUTPUT_DIR` (padrão `./backups`).
144
-
145
- #### 3. Mapeamento Interativo
146
-
147
- Ao executar `backup` ou `restore` pela primeira vez, o **smoonb** irá:
148
-
149
- 1. **Ler** seu `.env.local` atual
150
- 2. **Identificar** as chaves que você já tem
151
- 3. **Perguntar interativamente** quais chaves correspondem às esperadas (se os nomes forem diferentes)
152
- 4. **Adicionar** chaves faltantes se necessário
153
- 5. **Criar backup** automático do `.env.local` antes de qualquer alteração
154
- 6. **Salvar mapeamento** para futuras execuções
155
-
156
- **Exemplo de mapeamento:**
157
- ```
158
- 🔧 Mapeando variável: NEXT_PUBLIC_SUPABASE_URL
159
- Valor atual: https://abc123.supabase.co
160
- Este é o valor correto do projeto alvo? (S/n): S
161
- ```
162
-
163
- ## 🌐 Internacionalização (i18n)
164
-
165
- O **smoonb** suporta múltiplos idiomas automaticamente. Atualmente, os idiomas suportados são:
166
-
167
- - **Inglês (en)** - Idioma padrão
168
- - **Português do Brasil (pt-BR)** - Suporte completo
169
-
170
- ### Detecção Automática de Idioma
171
-
172
- O idioma é detectado automaticamente na seguinte ordem de precedência:
173
-
174
- 1. **Variável de ambiente `SMOONB_LANG`** (no `.env.local` ou no ambiente)
175
- 2. **Locale do sistema** (LANG, LC_ALL, LC_MESSAGES). Exemplo: `LANG=pt_BR.UTF-8` → pt-BR
176
- 3. **Fallback para inglês (en)** se nenhum dos anteriores for detectado
177
-
178
- ### Idiomas Suportados e Aliases
179
-
180
- - `en` ou `en-US` → Inglês
181
- - `pt-BR`, `pt_BR` ou `pt` → Português do Brasil
182
-
183
- ### Notas Importantes
184
-
185
- - **Saídas "máquina"** (ex.: `--json` se implementado) **não** são traduzidas; campos e chaves permanecem em inglês
186
- - Se uma chave de tradução estiver ausente em um idioma, o sistema faz **fallback automático para inglês**
187
- - O idioma é detectado uma vez no início da execução e aplicado a todas as mensagens do CLI
188
-
189
- ## 🎯 Uso
190
-
191
- ### Backup Completo
192
-
193
- ```bash
194
- npx smoonb backup
195
- ```
196
-
197
- **Opções disponíveis:**
198
-
199
- | Flag | Descrição |
200
- |------|-----------|
201
- | `--skip-supabase-version-check` | Pula a checagem de versão do Supabase CLI. Use quando seu gerenciador de pacotes (ex.: Scoop) instala com atraso. Um aviso é exibido e o usuário assume o risco. |
202
-
203
- **Exemplo com a flag:**
204
- ```bash
205
- npx smoonb backup --skip-supabase-version-check
206
- ```
207
-
208
- **Fluxo interativo do backup:**
209
-
210
- 1. **Termo de uso** - Exibe e solicita aceitação dos termos
211
- 2. **Validação de licença** - Valida `SMOONB_LICENSE_KEY` (env ou prompt); sem cache; aborta se a validação falhar
212
- 3. **Validação Docker** - Verifica se o Docker está rodando
213
- 4. **Consentimento** - Pede permissão para ler/escrever `.env.local`
214
- 5. **Mapeamento de variáveis** - Mapeia suas variáveis de ambiente (primeira vez; a licença não entra no wizard—já validada)
215
- 6. **Backup do .env.local** - Cria backup automático antes de alterações
216
- 7. **Seleção de componentes** - Pergunta quais componentes incluir:
217
- - ⚡ Edge Functions (explicação sobre reset de link e download)
218
- - 📦 Storage (explicação sobre backup completo: download de arquivos + ZIP no padrão do Dashboard)
219
- - 🔐 Auth Settings (explicação sobre configurações)
220
- - 🔄 Realtime Settings (explicação sobre captura interativa de 7 parâmetros)
221
- - 🗑️ Opções de limpeza (functions, .temp, migrations após backup)
222
- 8. **Resumo de configurações** - Mostra tudo que será feito
223
- 9. **Confirmação final** - Confirma antes de iniciar
224
- 10. **Execução das etapas:**
225
- - 📊 1/10 - Backup Database via `pg_dumpall` (Docker)
226
- - 📊 2/10 - Backup Database SQL separado (schema, dados, roles)
227
- - 🔧 3/10 - Backup Database Extensions and Settings
228
- - 🔐 4/10 - Backup Auth Settings (se selecionado)
229
- - 🔄 5/10 - Backup Realtime Settings (se selecionado) - 7 parâmetros capturados interativamente
230
- - 📦 6/10 - Backup Storage (se selecionado) - Download completo de arquivos + ZIP no padrão do Dashboard
231
- - 👥 7/10 - Backup Custom Roles
232
- - ⚡ 8/10 - Backup Edge Functions (se selecionado)
233
- - 📁 9/10 - Backup Supabase .temp (se selecionado)
234
- - 📋 10/10 - Backup Migrations (se selecionado)
235
-
236
- **Resultado:** Uma pasta `backups/backup-YYYY-MM-DD-HH-MM-SS/` contendo, por exemplo:
237
-
238
- ```
239
- backups/backup-2025-10-31-09-37-54/
240
- ├── backup-manifest.json
241
- ├── db_cluster-31-10-2025@09-38-57.backup.gz
242
- ├── schema.sql
243
- ├── data.sql
244
- ├── roles.sql
245
- ├── database-settings-*.json
246
- ├── auth-settings.json
247
- ├── realtime-settings.json
248
- ├── storage/
249
- │ └── [bucket-name].json
250
- ├── [project-id].storage.zip
251
- ├── storage_temp/
252
- │ └── [project-id]/
253
- │ └── [bucket-name]/
254
- ├── edge-functions/
255
- │ └── [nome-da-function]/
256
- ├── supabase-temp/
257
- ├── migrations/
258
- └── env/
259
- ├── .env.local
260
- └── env-map.json
261
- ```
262
-
263
- ### Restauração Interativa
264
-
265
- **Restaurar backup existente:**
266
- ```bash
267
- npx smoonb restore
268
- ```
269
-
270
- **Opções disponíveis:**
271
-
272
- | Flag | Descrição |
273
- |------|-----------|
274
- | `--skip-supabase-version-check` | Pula a checagem de versão do Supabase CLI. Use quando seu gerenciador de pacotes (ex.: Scoop) instala com atraso. Um aviso é exibido e o usuário assume o risco. |
275
-
276
- **Exemplo com a flag:**
277
- ```bash
278
- npx smoonb restore --skip-supabase-version-check
279
- ```
280
-
281
- **Fluxo interativo do restore:**
282
-
283
- 1. **Termo de uso** - Exibe e solicita aceitação dos termos
284
- 2. **Validação de licença** - Valida `SMOONB_LICENSE_KEY` (env ou prompt); aborta se a validação falhar
285
- 3. **Validação Docker** - Verifica se o Docker está rodando
286
- 4. **Consentimento** - Pede permissão para ler/escrever `.env.local`
287
- 5. **Mapeamento de variáveis** - Mapeia variáveis para o projeto de destino (inclui `SUPABASE_POSTGRES_MAJOR`)
288
- 6. **Backup do .env.local** - Cria backup automático
289
- 7. **Seleção de backup** - Lista e permite escolher qual backup restaurar
290
- 8. **Seleção de componentes** - Pergunta quais componentes restaurar:
291
- - 📊 Database (sempre disponível)
292
- - ⚡ Edge Functions (se disponível no backup)
293
- - 🔐 Auth Settings (se disponível no backup)
294
- - 📦 Storage (se disponível no backup)
295
- - 🔧 Database Extensions and Settings (se disponível no backup)
296
- - 🔄 Realtime Settings (se disponível no backup)
297
- 9. **Resumo detalhado** - Mostra backup selecionado, projeto destino e componentes
298
- 10. **Confirmação final** - Confirma antes de iniciar
299
- 11. **Aviso** - Explica que erros durante a restauração são esperados; link para [documentação de restore do Dashboard Supabase](https://supabase.com/docs/guides/platform/migrating-within-supabase/dashboard-restore); aguardar o fim do processo e testar o resultado antes de aceitar para prosseguir
300
- 12. **Execução da restauração:**
301
- - 📊 Database - Restaura via `psql` (suporta `.backup.gz` e `.backup`)
302
- - ⚡ Edge Functions - Copia e faz deploy no projeto destino
303
- - 🔐 Auth Settings - Exibe configurações para aplicação manual
304
- - 📦 Storage - Restaura buckets e arquivos do ZIP (se disponível) ou exibe informações para migração manual
305
- - 🔧 Database Settings - Restaura extensões e configurações via SQL
306
- - 🔄 Realtime Settings - Exibe configurações para aplicação manual
307
-
308
- **Formato de arquivos suportados:**
309
- - ✅ `.backup.gz` (compactado) - Descompacta automaticamente antes de restaurar
310
- - ✅ `.backup` (descompactado) - Restaura diretamente
311
-
312
- ### Importar Backup do Dashboard do Supabase
313
-
314
- 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.
315
-
316
- **Importar apenas database:**
317
- ```bash
318
- npx smoonb import --file "caminho/completo/para/db_cluster-04-03-2024@14-16-59.backup.gz"
319
- ```
320
-
321
- **Importar database e storage juntos:**
322
- ```bash
323
- npx smoonb import --file "backup.backup.gz" --storage "meu-projeto.storage.zip"
324
- ```
325
-
326
- **O que o comando faz:**
327
- 1. Lê o arquivo `.backup.gz` do Dashboard (obrigatório)
328
- 2. Se fornecido, lê o arquivo `.storage.zip` do Dashboard (opcional)
329
- 3. Extrai informações do nome do arquivo de backup (data e hora)
330
- 4. Cria uma pasta de backup no formato esperado (`backup-YYYY-MM-DD-HH-MM-SS`)
331
- 5. Copia o arquivo de backup para a pasta criada
332
- 6. Se fornecido, copia o arquivo de storage para a mesma pasta
333
- 7. Deixa o backup pronto para ser encontrado pelo comando `restore`
334
-
335
- **Exemplo completo - Apenas database (usando import + restore):**
336
-
337
- 1. Baixe o backup do Dashboard do Supabase (ex.: `db_cluster-04-03-2024@14-16-59.backup.gz`).
338
- 2. Importe o arquivo e depois restaure:
339
-
340
- ```bash
341
- npx smoonb import --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz"
342
- npx smoonb restore
343
- ```
344
-
345
- O backup importado aparecerá na lista de backups disponíveis.
346
-
347
- **Exemplo completo - Database e Storage (usando import + restore):**
348
-
349
- 1. Baixe backup e storage do Dashboard do Supabase (ex.: `db_cluster-04-03-2024@14-16-59.backup.gz` e `meu-projeto.storage.zip`).
350
- 2. Importe ambos os arquivos e depois restaure:
351
-
352
- ```bash
353
- npx smoonb import --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz" --storage "C:\Downloads\meu-projeto.storage.zip"
354
- npx smoonb restore
355
- ```
356
-
357
- O backup importado aparecerá na lista de backups disponíveis.
358
-
359
- **Importante:**
360
- - O arquivo de backup é **obrigatório** e deve estar no formato do Dashboard: `db_cluster-DD-MM-YYYY@HH-MM-SS.backup.gz`
361
- - O arquivo de storage é **opcional** e deve estar no formato: `*.storage.zip`
362
- - O storage depende de um backup, mas o backup não depende do storage
363
- - Ambos os arquivos serão copiados para a mesma pasta de backup
364
- - O caminho pode ser absoluto ou relativo
365
- - O comando criará a estrutura de pastas necessária automaticamente
366
-
367
- Após executar `import`, execute `restore` para escolher o backup importado na lista e restaurar.
368
-
369
- ## 🔧 Comandos Disponíveis
370
-
371
- | Comando | Descrição |
372
- |---------|-----------|
373
- | `npx smoonb backup` | Backup completo interativo usando Docker |
374
- | `npx smoonb backup --skip-supabase-version-check` | Backup pulando a checagem de versão do Supabase CLI |
375
- | `npx smoonb restore` | Restauração interativa usando psql (Docker) |
376
- | `npx smoonb restore --skip-supabase-version-check` | Restore pulando a checagem de versão do Supabase CLI |
377
- | `npx smoonb import --file <path> [--storage <path>]` | Importar arquivo .backup.gz e opcionalmente .storage.zip do Dashboard do Supabase |
378
-
379
- ## 🏗️ Arquitetura Técnica
380
-
381
- ### Estrutura Modular
382
-
383
- O código foi refatorado para uma **arquitetura modular** com etapas independentes:
384
-
385
- #### Backup (`src/commands/backup/`)
386
- ```
387
- backup/
388
- ├── index.js
389
- ├── utils.js
390
- └── steps/
391
- ├── 00-license.js
392
- ├── 01-docker-validation.js
393
- ├── 02-database.js
394
- ├── 03-database-separated.js
395
- ├── 04-database-settings.js
396
- ├── 05-auth-settings.js
397
- ├── 06-realtime-settings.js
398
- ├── 07-storage.js
399
- ├── 08-custom-roles.js
400
- ├── 09-edge-functions.js
401
- ├── 10-supabase-temp.js
402
- └── 11-migrations.js
403
- ```
404
-
405
- #### Restore (`src/commands/restore/`)
406
- A validação de licença (mesmo step do backup, `00-license.js` em backup/steps) roda no início. Em seguida:
407
- ```
408
- restore/
409
- ├── index.js
410
- ├── utils.js
411
- └── steps/
412
- ├── 00-backup-selection.js
413
- ├── 01-components-selection.js
414
- ├── 02-confirmation.js
415
- ├── 03-database.js
416
- ├── 04-edge-functions.js
417
- ├── 05-auth-settings.js
418
- ├── 06-storage.js
419
- ├── 07-database-settings.js
420
- └── 08-realtime-settings.js
421
- ```
422
-
423
- ### Estratégia de Backup
424
-
425
- #### Database
426
- - **Backup Principal**: `pg_dumpall` via Docker (idêntico ao Dashboard)
427
- - Arquivo: `db_cluster-XX-XX-XXXX@XX-XX-XX.backup.gz`
428
- - Compatível com restauração via Dashboard do Supabase
429
- - **Backup Separado**: SQL em arquivos distintos via Supabase CLI
430
- - `schema.sql` - Estrutura das tabelas
431
- - `data.sql` - Dados (comandos COPY)
432
- - `roles.sql` - Roles e permissões
433
-
434
- #### Edge Functions
435
- - **Download Automático**: Via Supabase CLI `supabase functions download`
436
- - **Reset de Link**: Garante link limpo com o projeto antes do download
437
- - **Backup Completo**: Código completo de cada function
438
-
439
- #### Migrations
440
- - **Download Automático**: Via `supabase migration fetch`
441
- - **Reset de Link**: Garante link limpo com o projeto
442
- - **Backup Completo**: Todas as migrations do servidor
443
-
444
- #### Storage
445
- - **Backup Completo**: Download de todos os arquivos de todos os buckets
446
- - **Estrutura Temporária**: Cria `storage_temp/project-id/bucket-name/arquivos...` dentro do backupDir
447
- - **ZIP no Padrão Dashboard**: Cria `{project-id}.storage.zip` com estrutura `project-id/bucket-name/arquivos...`
448
- - **Compatível com Restore**: O ZIP criado é compatível com o processo de restore (mesmo formato do Dashboard)
449
- - **Pergunta Interativa**: Após criar o ZIP, pergunta se deseja limpar a estrutura temporária
450
- - **Fallback**: Se não houver credenciais do Supabase, faz backup apenas de metadados
451
- - **Management API**: Usa Personal Access Token para listar buckets e objetos
452
- - **Supabase Client**: Usa Service Role Key para download de arquivos
453
-
454
- #### Auth, Realtime
455
- - **Management API**: Usa Personal Access Token
456
- - **JSON Export**: Configurações exportadas como JSON
457
- - **Realtime Settings**: Captura interativa de 7 parâmetros:
458
- 1. Habilitar serviço Realtime
459
- 2. Permitir acesso público
460
- 3. Tamanho do pool de conexões do database
461
- 4. Máximo de clientes simultâneos
462
- 5. Máximo de eventos por segundo
463
- 6. Máximo de eventos de presença por segundo
464
- 7. Tamanho máximo do payload em KB
465
- - **Manual para alguns**: Alguns settings precisam ser aplicados manualmente por segurança
466
-
467
- ### Estratégia de Restauração
468
-
469
- #### Database
470
- - **Suporte a Formatos**:
471
- - `.backup.gz` - Descompacta automaticamente via Docker
472
- - `.backup` - Restaura diretamente via `psql` (Docker)
473
- - **Restauração Limpa**: Pode sobrescrever dados existentes (com confirmação)
474
-
475
- #### Edge Functions
476
- - **Deploy Limpo**: Limpa `supabase/functions` antes do deploy
477
- - **Reset de Link**: Garante link correto com projeto destino
478
- - **Deploy Automático**: Usa `supabase functions deploy`
479
-
480
- #### Outros Componentes
481
- - **Database Settings**: Restaura via SQL
482
- - **Storage**: Restaura buckets e arquivos do ZIP (se disponível) ou exibe informações para configuração manual
483
- - **Auth/Realtime**: Exibe informações para configuração manual no Dashboard
484
-
485
- ### Multiplataforma
486
-
487
- - **Windows/macOS/Linux**: Detecção automática de binários
488
- - **Multiplataforma**: Usa `fs.promises.cp`, `path.join`, Docker
489
- - **Docker para Tudo**: Backup, restore e compressão via Docker (garante consistência)
490
-
491
- ## 📊 Fluxo Recomendado
492
-
493
- 1. **Configurar `.env.local`** (primeira vez) com as credenciais do projeto origem.
494
- 2. **Backup do projeto origem:**
495
- ```bash
496
- npx smoonb backup
497
- ```
498
- (Mapeia variáveis interativamente na primeira vez, seleciona componentes, executa backup completo.)
499
- 3. **Criar novo projeto Supabase** (via Dashboard ou Supabase CLI).
500
- 4. **Editar `.env.local`** com as credenciais do novo projeto (apontar variáveis para o projeto destino).
501
- 5. **Restaurar backup** (modo interativo):
502
- ```bash
503
- npx smoonb restore
504
- ```
505
- (Seleciona backup desejado, componentes a restaurar, executa restauração.)
506
- 6. **Aplicar configurações manuais** se necessário: Auth Settings (Dashboard → Authentication → Settings), Realtime (Dashboard → Database → Replication). O Storage é restaurado automaticamente do ZIP quando disponível.
507
-
508
- ## 🎨 Experiência do Usuário
509
-
510
- ### Interface em Português
511
-
512
- Todas as interações são em **Português do Brasil**:
513
- - Perguntas claras e diretas
514
- - Explicações antes de cada processo
515
- - Resumos detalhados antes de confirmar
516
- - Confirmações com `(S/n)` ou `(s/N)` em português
517
-
518
- ### Mapeamento Inteligente de Variáveis
519
-
520
- - **Detecção Automática**: Se a chave já existe com o nome esperado, pula a seleção
521
- - **Opção de Adicionar**: Permite adicionar novas chaves se não existirem
522
- - **Validação de Valores**: Confirma valores antes de salvar
523
- - **Backup Automático**: Sempre cria backup do `.env.local` antes de alterações
524
-
525
- ### Processo Guiado
526
-
527
- - **Validação Prévia**: Verifica Docker antes de começar
528
- - **Explicações Contextuais**: Explica cada processo antes de perguntar
529
- - **Resumo Final**: Mostra tudo que será feito antes de executar
530
- - **Feedback Visual**: Cores e ícones para melhor experiência
531
-
532
- ## 🐛 Solução de Problemas
533
-
534
- ### Docker não encontrado ou não está rodando
535
-
536
- Verifique se o Docker está instalado e em execução:
537
-
538
- ```bash
539
- docker --version
540
- docker ps
541
- ```
542
-
543
- Se não estiver, inicie o Docker Desktop (Windows/macOS) ou execute `sudo systemctl start docker` (Linux).
544
-
545
- ### Supabase CLI não encontrado
546
- ```bash
547
- npm install -g supabase
548
- ```
549
-
550
- ### Supabase CLI desatualizado (abaixo da versão mínima aceita)
551
-
552
- O smoonb aceita versões até **1 minor atrás da latest**. Se sua versão instalada estiver abaixo desse limite, você verá uma mensagem como:
553
-
554
- ```
555
- ❌ Supabase CLI X.Y.Z está abaixo da versão mínima aceita (X.W.0). Versão latest: X.V.Z. Atualize para pelo menos a versão X.W.0.
556
- ```
557
-
558
- **Opção 1 — Atualizar o Supabase CLI:**
559
- ```bash
560
- npm install -g supabase@latest # instalação global
561
- npm install supabase@latest # instalação local/projeto
562
- ```
563
-
564
- **Opção 2 — Pular a checagem (temporariamente, risco do usuário):**
565
- ```bash
566
- npx smoonb backup --skip-supabase-version-check
567
- npx smoonb restore --skip-supabase-version-check
568
- ```
569
-
570
- > **Nota para usuários de Scoop (Windows):** o repositório do Scoop pode levar alguns dias para atualizar após um release. Use `--skip-supabase-version-check` até que o Scoop disponibilize a versão atualizada.
571
-
572
- ### Personal Access Token inválido ou ausente
573
-
574
- 1. Verificar se `SUPABASE_ACCESS_TOKEN` está no `.env.local`
575
- 2. Gerar novo token: https://supabase.com/dashboard/account/tokens
576
- 3. Atualizar `.env.local` com o novo token
577
-
578
- ### Database URL incorreta
579
- - Verificar senha na URL de conexão
580
- - Usar string de conexão do Dashboard Supabase (Settings → Database)
581
- - Testar conexão: `psql "sua-database-url" -c "SELECT 1"`
582
-
583
- ### Arquivo .backup.gz não pode ser restaurado
584
-
585
- O smoonb suporta automaticamente:
586
- - ✅ `.backup.gz` - Descompacta via Docker antes de restaurar
587
- - ✅ `.backup` - Restaura diretamente
588
-
589
- Se houver problemas:
590
- 1. Verificar se Docker está rodando
591
- 2. Verificar permissões do arquivo
592
- 3. Verificar espaço em disco
593
-
594
- ### Erro ao baixar Edge Functions
595
-
596
- 1. Verificar se `SUPABASE_ACCESS_TOKEN` está configurado
597
- 2. Verificar se o projeto está linkado: `supabase link`
598
- 3. Verificar se as functions existem no servidor
599
-
600
- ### Erro ao baixar Migrations
601
-
602
- 1. Verificar se `SUPABASE_ACCESS_TOKEN` está configurado
603
- 2. Verificar se o projeto está linkado: `supabase link`
604
- 3. Verificar se há migrations no servidor
605
-
606
- ## 🔒 Segurança
607
-
608
- - **Backup Automático**: Sempre cria backup do `.env.local` antes de alterações
609
- - **Mapeamento Local**: Mapeamento de variáveis salvo apenas localmente
610
- - **Sem Dados Sensíveis**: Nenhum dado sensível é enviado para fora do seu ambiente
611
- - **Docker Isolado**: Operações de database via Docker (isolamento)
612
-
613
- ## 💼 Acesso e assinatura
614
-
615
- O código do Supa Moonbase é disponibilizado sob licença MIT (ver `LICENSE`). Para usar o smoonb é obrigatório ter **licença ativa** e **assinatura válida**, ou estar em **período de trial**. A validação da licença ocorre no início do backup e do restore; sem licença e assinatura válidas (ou trial), o CLI não executa essas operações.
616
-
617
- [smoonb.com/#price](https://www.smoonb.com/#price).
618
-
619
- ## 🔒 Privacidade e LGPD (resumo)
620
-
621
- O Supa Moonbase adota o princípio de minimização de dados. Tratamos apenas as 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 estão descritos na [Política de Privacidade](https://www.smoonb.com/privacy).
622
-
623
- ## 📋 Termos de Serviço e uso de marca
624
-
625
- A licença de código (MIT) não substitui os [Termos de Serviço](https://www.smoonb.com/terms) que regem o acesso operacional e a validação de assinatura.
626
-
627
- "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://www.smoonb.com/terms).
628
-
629
- [FAQ](https://www.smoonb.com/#faq).
630
-
631
- ## 📝 Licença
632
-
633
- 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.
634
-
635
- ## 🤝 Contribuição
636
-
637
- Contribuições são bem-vindas. [www.smoonb.com/#price](https://www.smoonb.com/#price).
638
-
639
-
640
- ---
641
-
642
- **Desenvolvido por:** Goalmoon Tecnologia LTDA
643
- **Website:** https://www.smoonb.com
644
- **GitHub:** https://github.com/almmello/smoonb
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
+ > **Produto comercial.** É necessário ter **licença ativa** e **assinatura válida** (ou estar em período de trial) para usar o smoonb. [www.smoonb.com/#price](https://www.smoonb.com/#price). O uso é regido pelos [Termos de Serviço](https://www.smoonb.com/terms) e pela [Política de Privacidade](https://www.smoonb.com/privacy). Não assumimos responsabilidade por danos causados pelo smoonb; os avisos legais abaixo permanecem válidos.
8
+
9
+ **Leia em outro idioma:** [English](README.md)
10
+
11
+ **Desenvolvido por:** Goalmoon Tecnologia LTDA
12
+ **Website:** https://www.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).
38
+
39
+ ## 🚀 Instalação
40
+
41
+ **⚠️ IMPORTANTE: Instale APENAS localmente no projeto!**
42
+
43
+ **Instalar localmente no projeto:**
44
+ ```bash
45
+ npm install smoonb
46
+ ```
47
+
48
+ **Usar com npx:**
49
+ ```bash
50
+ npx smoonb --help
51
+ ```
52
+
53
+ **Não instalar globalmente** (será bloqueado):
54
+ ```bash
55
+ npm install -g smoonb
56
+ ```
57
+
58
+ ### 🔄 Atualizar para a Última Versão
59
+
60
+ Para atualizar o smoonb para a versão mais recente disponível, execute no projeto atual:
61
+
62
+ ```bash
63
+ npm install smoonb@latest
64
+ ```
65
+
66
+ **⚠️ IMPORTANTE:** O smoonb deve ser instalado localmente no projeto. Não é permitido usar sem instalar (ex.: `npx smoonb@latest`).
67
+
68
+ **💡 Por que apenas local?**
69
+ - **🔒 Segurança**: Evita conflitos de versão
70
+ - **📦 Isolamento**: Cada projeto usa sua versão
71
+ - **🔄 Atualizações**: Controle granular por projeto
72
+ - **🛡️ Estabilidade**: Evita quebras em outros projetos
73
+
74
+ ## 📋 Pré-requisitos
75
+
76
+ ### 1. Docker Desktop (OBRIGATÓRIO)
77
+
78
+ Instale pelo [Docker Desktop](https://docs.docker.com/desktop/install/) (Windows/macOS) ou [Docker Engine](https://docs.docker.com/engine/install/) (Linux). Depois verifique se está rodando:
79
+
80
+ ```bash
81
+ docker --version
82
+ docker ps
83
+ ```
84
+
85
+ **⚠️ IMPORTANTE:** O Docker é necessário para:
86
+ - Backup da database via `pg_dumpall` (compatível com Dashboard do Supabase)
87
+ - Compressão de arquivos `.backup.gz`
88
+ - Restauração de backups `.backup` e `.backup.gz`
89
+
90
+ ### 2. Supabase CLI
91
+ ```bash
92
+ npm install -g supabase
93
+ ```
94
+
95
+ **Política de versão:** o smoonb aceita qualquer versão do Supabase CLI que esteja **no máximo 1 minor atrás da latest** (mesma major). Recomendamos sempre usar a versão mais recente. Versões muito antigas são bloqueadas com mensagem de erro.
96
+
97
+ Se o seu gerenciador de pacotes (ex.: **Scoop** no Windows) instala com atraso e você quer avançar mesmo assim, use a flag `--skip-supabase-version-check` (veja a seção de uso abaixo).
98
+
99
+ Para atualizar o Supabase CLI: [Atualizando o Supabase CLI](https://supabase.com/docs/guides/cli/getting-started#updating-the-supabase-cli).
100
+
101
+ ### 3. Personal Access Token do Supabase
102
+ É necessário obter um token de acesso pessoal do Supabase para usar a Management API:
103
+
104
+ 1. Acesse: https://supabase.com/dashboard/account/tokens
105
+ 2. Clique em "Generate new token"
106
+ 3. Copie o token (formato: `sbp_...`)
107
+ 4. Adicione ao `.env.local` como `SUPABASE_ACCESS_TOKEN`
108
+
109
+ ### 4. Chave de licença (OBRIGATÓRIA para backup e restore)
110
+ O **smoonb** exige uma licença válida para executar backup e restore:
111
+
112
+ 1. Obtenha sua licença no app desktop em https://www.smoonb.com
113
+ 2. Defina no ambiente ou no `.env.local`: `SMOONB_LICENSE_KEY=[sua-chave-de-licença]`
114
+ 3. A licença é validada no início de cada execução (step 00); não há cache. Se a validação falhar (rede/servidor), o CLI aborta. A licença **não** aparece no wizard de mapeamento de variáveis (já foi validada antes).
115
+
116
+ ## ⚙️ Configuração
117
+
118
+ ### Método Moderno: `.env.local` (RECOMENDADO)
119
+
120
+ 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.
121
+
122
+ #### 1. Criar ou editar `.env.local` na raiz do projeto
123
+
124
+ ```bash
125
+ touch .env.local
126
+ ```
127
+
128
+ #### 2. Adicionar as variáveis de ambiente necessárias
129
+
130
+ ```env
131
+ SMOONB_LICENSE_KEY=[sua-chave-de-licença]
132
+ NEXT_PUBLIC_SUPABASE_URL=[sua-supabase-url]
133
+ NEXT_PUBLIC_SUPABASE_ANON_KEY=[sua-anon-key]
134
+ SUPABASE_SERVICE_ROLE_KEY=[sua-service-role]
135
+ SUPABASE_DB_URL=postgresql://postgres:[sua-database-password]@db.[seu-project-id].supabase.co:5432/postgres
136
+ SUPABASE_PROJECT_ID=[seu-project-id]
137
+ SUPABASE_ACCESS_TOKEN=[seu-access-token]
138
+ SUPABASE_POSTGRES_MAJOR=17
139
+ SMOONB_TELEMETRY_ENABLED=true
140
+ SMOONB_OUTPUT_DIR=./backups
141
+ ```
142
+
143
+ Obrigatórias: `SMOONB_LICENSE_KEY` (app desktop em [smoonb.com](https://www.smoonb.com)), `SUPABASE_POSTGRES_MAJOR` (ex.: 17; veja no Dashboard → Project Settings → Infrastructure → Service Versions). Opcionais: `SMOONB_TELEMETRY_ENABLED`, `SMOONB_OUTPUT_DIR` (padrão `./backups`).
144
+
145
+ #### 3. Mapeamento Interativo
146
+
147
+ Ao executar `backup` ou `restore` pela primeira vez, o **smoonb** irá:
148
+
149
+ 1. **Ler** seu `.env.local` atual
150
+ 2. **Identificar** as chaves que você já tem
151
+ 3. **Perguntar interativamente** quais chaves correspondem às esperadas (se os nomes forem diferentes)
152
+ 4. **Adicionar** chaves faltantes se necessário
153
+ 5. **Criar backup** automático do `.env.local` antes de qualquer alteração
154
+ 6. **Salvar mapeamento** para futuras execuções
155
+
156
+ **Exemplo de mapeamento:**
157
+ ```
158
+ 🔧 Mapeando variável: NEXT_PUBLIC_SUPABASE_URL
159
+ Valor atual: https://abc123.supabase.co
160
+ Este é o valor correto do projeto alvo? (S/n): S
161
+ ```
162
+
163
+ ## 🌐 Internacionalização (i18n)
164
+
165
+ O **smoonb** suporta múltiplos idiomas automaticamente. Atualmente, os idiomas suportados são:
166
+
167
+ - **Inglês (en)** - Idioma padrão
168
+ - **Português do Brasil (pt-BR)** - Suporte completo
169
+
170
+ ### Detecção Automática de Idioma
171
+
172
+ O idioma é detectado automaticamente na seguinte ordem de precedência:
173
+
174
+ 1. **Variável de ambiente `SMOONB_LANG`** (no `.env.local` ou no ambiente)
175
+ 2. **Locale do sistema** (LANG, LC_ALL, LC_MESSAGES). Exemplo: `LANG=pt_BR.UTF-8` → pt-BR
176
+ 3. **Fallback para inglês (en)** se nenhum dos anteriores for detectado
177
+
178
+ ### Idiomas Suportados e Aliases
179
+
180
+ - `en` ou `en-US` → Inglês
181
+ - `pt-BR`, `pt_BR` ou `pt` → Português do Brasil
182
+
183
+ ### Notas Importantes
184
+
185
+ - **Saídas "máquina"** (ex.: `--json` se implementado) **não** são traduzidas; campos e chaves permanecem em inglês
186
+ - Se uma chave de tradução estiver ausente em um idioma, o sistema faz **fallback automático para inglês**
187
+ - O idioma é detectado uma vez no início da execução e aplicado a todas as mensagens do CLI
188
+
189
+ ## 🎯 Uso
190
+
191
+ ### Backup Completo
192
+
193
+ ```bash
194
+ npx smoonb backup
195
+ ```
196
+
197
+ **Opções disponíveis:**
198
+
199
+ | Flag | Descrição |
200
+ |------|-----------|
201
+ | `--skip-supabase-version-check` | Pula a checagem de versão do Supabase CLI. Use quando seu gerenciador de pacotes (ex.: Scoop) instala com atraso. Um aviso é exibido e o usuário assume o risco. |
202
+
203
+ **Exemplo com a flag:**
204
+ ```bash
205
+ npx smoonb backup --skip-supabase-version-check
206
+ ```
207
+
208
+ **Fluxo interativo do backup:**
209
+
210
+ 1. **Termo de uso** - Exibe e solicita aceitação dos termos
211
+ 2. **Validação de licença** - Valida `SMOONB_LICENSE_KEY` (env ou prompt); sem cache; aborta se a validação falhar
212
+ 3. **Validação Docker** - Verifica se o Docker está rodando
213
+ 4. **Consentimento** - Pede permissão para ler/escrever `.env.local`
214
+ 5. **Mapeamento de variáveis** - Mapeia suas variáveis de ambiente (primeira vez; a licença não entra no wizard—já validada)
215
+ 6. **Backup do .env.local** - Cria backup automático antes de alterações
216
+ 7. **Seleção de componentes** - Pergunta quais componentes incluir:
217
+ - ⚡ Edge Functions (explicação sobre reset de link e download)
218
+ - 📦 Storage (explicação sobre backup completo: download de arquivos + ZIP no padrão do Dashboard)
219
+ - 🔐 Auth Settings (explicação sobre configurações)
220
+ - 🔄 Realtime Settings (explicação sobre captura interativa de 7 parâmetros)
221
+ - 🗑️ Opções de limpeza (functions, .temp, migrations após backup)
222
+ 8. **Resumo de configurações** - Mostra tudo que será feito
223
+ 9. **Confirmação final** - Confirma antes de iniciar
224
+ 10. **Execução das etapas:**
225
+ - 📊 1/10 - Backup Database via `pg_dumpall` (Docker)
226
+ - 📊 2/10 - Backup Database SQL separado (schema, dados, roles)
227
+ - 🔧 3/10 - Backup Database Extensions and Settings
228
+ - 🔐 4/10 - Backup Auth Settings (se selecionado)
229
+ - 🔄 5/10 - Backup Realtime Settings (se selecionado) - 7 parâmetros capturados interativamente
230
+ - 📦 6/10 - Backup Storage (se selecionado) - Download completo de arquivos + ZIP no padrão do Dashboard
231
+ - 👥 7/10 - Backup Custom Roles
232
+ - ⚡ 8/10 - Backup Edge Functions (se selecionado)
233
+ - 📁 9/10 - Backup Supabase .temp (se selecionado)
234
+ - 📋 10/10 - Backup Migrations (se selecionado)
235
+
236
+ **Resultado:** Uma pasta `backups/backup-YYYY-MM-DD-HH-MM-SS/` contendo, por exemplo:
237
+
238
+ ```
239
+ backups/backup-2025-10-31-09-37-54/
240
+ ├── backup-manifest.json
241
+ ├── db_cluster-31-10-2025@09-38-57.backup.gz
242
+ ├── schema.sql
243
+ ├── data.sql
244
+ ├── roles.sql
245
+ ├── database-settings-*.json
246
+ ├── auth-settings.json
247
+ ├── realtime-settings.json
248
+ ├── storage/
249
+ │ └── [bucket-name].json
250
+ ├── [project-id].storage.zip
251
+ ├── storage_temp/
252
+ │ └── [project-id]/
253
+ │ └── [bucket-name]/
254
+ ├── edge-functions/
255
+ │ └── [nome-da-function]/
256
+ ├── supabase-temp/
257
+ ├── migrations/
258
+ └── env/
259
+ ├── .env.local
260
+ └── env-map.json
261
+ ```
262
+
263
+ ### Restauração Interativa
264
+
265
+ **Restaurar backup existente:**
266
+ ```bash
267
+ npx smoonb restore
268
+ ```
269
+
270
+ **Opções disponíveis:**
271
+
272
+ | Flag | Descrição |
273
+ |------|-----------|
274
+ | `--skip-supabase-version-check` | Pula a checagem de versão do Supabase CLI. Use quando seu gerenciador de pacotes (ex.: Scoop) instala com atraso. Um aviso é exibido e o usuário assume o risco. |
275
+
276
+ **Exemplo com a flag:**
277
+ ```bash
278
+ npx smoonb restore --skip-supabase-version-check
279
+ ```
280
+
281
+ **Fluxo interativo do restore:**
282
+
283
+ 1. **Termo de uso** - Exibe e solicita aceitação dos termos
284
+ 2. **Validação de licença** - Valida `SMOONB_LICENSE_KEY` (env ou prompt); aborta se a validação falhar
285
+ 3. **Validação Docker** - Verifica se o Docker está rodando
286
+ 4. **Consentimento** - Pede permissão para ler/escrever `.env.local`
287
+ 5. **Mapeamento de variáveis** - Mapeia variáveis para o projeto de destino (inclui `SUPABASE_POSTGRES_MAJOR`)
288
+ 6. **Backup do .env.local** - Cria backup automático
289
+ 7. **Seleção de backup** - Lista e permite escolher qual backup restaurar
290
+ 8. **Seleção de componentes** - Pergunta quais componentes restaurar:
291
+ - 📊 Database (sempre disponível)
292
+ - ⚡ Edge Functions (se disponível no backup)
293
+ - 🔐 Auth Settings (se disponível no backup)
294
+ - 📦 Storage (se disponível no backup)
295
+ - 🔧 Database Extensions and Settings (se disponível no backup)
296
+ - 🔄 Realtime Settings (se disponível no backup)
297
+ 9. **Resumo detalhado** - Mostra backup selecionado, projeto destino e componentes
298
+ 10. **Confirmação final** - Confirma antes de iniciar
299
+ 11. **Endereços do projeto** - Confirma se as URLs Supabase nos dados e arquivos devem apontar para o novo projeto
300
+ 12. **Execução da restauração:**
301
+ - 📊 Database - Restaura via `psql` (suporta `.backup.gz` e `.backup`)
302
+ - ⚡ Edge Functions - Faz deploy de uma cópia temporária, preservando as fontes locais
303
+ - 🔐 Auth Settings - Aplica via API e verifica os valores recuperados
304
+ - 📦 Storage - Restaura buckets e arquivos do ZIP, preserva metadados e verifica cada download
305
+ - 🔧 Database Settings - Restaura extensões e configurações via SQL
306
+ - 🔄 Realtime Settings - Aplica e verifica o snapshot registrado no backup
307
+
308
+ ### Restauração verificada (1.0.8)
309
+
310
+ Use um projeto de destino novo e vazio e Node.js 20 ou mais recente. O backup completo existente da versão 1.0.7 pode ser reutilizado, sem nova captura. A versão 1.0.8 usa o dump completo como snapshot único: recupera a estrutura da aplicação, dados de Auth, histórico de migrações, buckets e metadados. Os schemas internos e as migrações da plataforma são mantidos na versão do destino.
311
+
312
+ A carga do banco usa uma transação com interrupção em erro, suspende triggers apenas nessa conexão, compara todas as colunas recuperadas e verifica chaves estrangeiras antes de confirmar. Permissões herdadas dos defaults do destino são removidas antes da reaplicação dos grants do backup. SQL com falha nunca é classificado como sucesso. O arquivo compactado e a pasta local de funções são preservados.
313
+
314
+ O remapeamento opcional troca apenas o domínio Supabase do projeto em URLs, inclusive em JSON e arquivos de texto. Não troca IDs isolados nem nomes de arquivos. URLs históricas também podem ser afetadas; escolha preservar quando isso for necessário. URLs assinadas, domínios personalizados, integrações externas e chaves de API da aplicação precisam de validação específica. As chaves de plataforma do destino não são substituídas.
315
+
316
+ Auth e Realtime são aplicados pela Management API e conferidos por nova leitura. A captura antiga de Realtime pode conter valores desatualizados: a restauração reproduz os valores e a data registrados, não o estado atual do projeto original. Novos backups capturam Realtime diretamente pela API. Em backups antigos sem o sinalizador de JWT de Functions, o padrão seguro é exigir JWT; os novos backups guardam esse sinalizador.
317
+
318
+ O relatório é salvo durante cada etapa, inclusive em falhas. Serviços externos não participam da transação do banco: se uma etapa posterior falhar, as anteriores permanecem registradas como concluídas. Não repita a carga do banco em um destino já preenchido. Resolva a etapa indicada e selecione apenas os componentes pendentes, ou use outro projeto vazio.
319
+
320
+ Dados internos não suportados (por exemplo, Vault com segredos criptografados sem migração da chave) e configurações incompatíveis com o plano/versão do destino interrompem o processo. O status verificado cobre os componentes selecionados; ainda é necessário validar login, envio de e-mail e fluxos de negócio antes de usar o destino em produção.
321
+
322
+ **Formato de arquivos suportados:**
323
+ - ✅ `.backup.gz` (compactado) - Descompacta automaticamente antes de restaurar
324
+ - ✅ `.backup` (descompactado) - Restaura diretamente
325
+
326
+ ### Importar Backup do Dashboard do Supabase
327
+
328
+ 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.
329
+
330
+ **Importar apenas database:**
331
+ ```bash
332
+ npx smoonb import --file "caminho/completo/para/db_cluster-04-03-2024@14-16-59.backup.gz"
333
+ ```
334
+
335
+ **Importar database e storage juntos:**
336
+ ```bash
337
+ npx smoonb import --file "backup.backup.gz" --storage "meu-projeto.storage.zip"
338
+ ```
339
+
340
+ **O que o comando faz:**
341
+ 1. Lê o arquivo `.backup.gz` do Dashboard (obrigatório)
342
+ 2. Se fornecido, lê o arquivo `.storage.zip` do Dashboard (opcional)
343
+ 3. Extrai informações do nome do arquivo de backup (data e hora)
344
+ 4. Cria uma pasta de backup no formato esperado (`backup-YYYY-MM-DD-HH-MM-SS`)
345
+ 5. Copia o arquivo de backup para a pasta criada
346
+ 6. Se fornecido, copia o arquivo de storage para a mesma pasta
347
+ 7. Deixa o backup pronto para ser encontrado pelo comando `restore`
348
+
349
+ **Exemplo completo - Apenas database (usando import + restore):**
350
+
351
+ 1. Baixe o backup do Dashboard do Supabase (ex.: `db_cluster-04-03-2024@14-16-59.backup.gz`).
352
+ 2. Importe o arquivo e depois restaure:
353
+
354
+ ```bash
355
+ npx smoonb import --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz"
356
+ npx smoonb restore
357
+ ```
358
+
359
+ O backup importado aparecerá na lista de backups disponíveis.
360
+
361
+ **Exemplo completo - Database e Storage (usando import + restore):**
362
+
363
+ 1. Baixe backup e storage do Dashboard do Supabase (ex.: `db_cluster-04-03-2024@14-16-59.backup.gz` e `meu-projeto.storage.zip`).
364
+ 2. Importe ambos os arquivos e depois restaure:
365
+
366
+ ```bash
367
+ npx smoonb import --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz" --storage "C:\Downloads\meu-projeto.storage.zip"
368
+ npx smoonb restore
369
+ ```
370
+
371
+ O backup importado aparecerá na lista de backups disponíveis.
372
+
373
+ **Importante:**
374
+ - O arquivo de backup é **obrigatório** e deve estar no formato do Dashboard: `db_cluster-DD-MM-YYYY@HH-MM-SS.backup.gz`
375
+ - O arquivo de storage é **opcional** e deve estar no formato: `*.storage.zip`
376
+ - O storage depende de um backup, mas o backup não depende do storage
377
+ - Ambos os arquivos serão copiados para a mesma pasta de backup
378
+ - O caminho pode ser absoluto ou relativo
379
+ - O comando criará a estrutura de pastas necessária automaticamente
380
+
381
+ Após executar `import`, execute `restore` para escolher o backup importado na lista e restaurar.
382
+
383
+ ## 🔧 Comandos Disponíveis
384
+
385
+ | Comando | Descrição |
386
+ |---------|-----------|
387
+ | `npx smoonb backup` | Backup completo interativo usando Docker |
388
+ | `npx smoonb backup --skip-supabase-version-check` | Backup pulando a checagem de versão do Supabase CLI |
389
+ | `npx smoonb restore` | Restauração interativa usando psql (Docker) |
390
+ | `npx smoonb restore --skip-supabase-version-check` | Restore pulando a checagem de versão do Supabase CLI |
391
+ | `npx smoonb import --file <path> [--storage <path>]` | Importar arquivo .backup.gz e opcionalmente .storage.zip do Dashboard do Supabase |
392
+
393
+ ## 🏗️ Arquitetura Técnica
394
+
395
+ ### Estrutura Modular
396
+
397
+ O código foi refatorado para uma **arquitetura modular** com etapas independentes:
398
+
399
+ #### Backup (`src/commands/backup/`)
400
+ ```
401
+ backup/
402
+ ├── index.js
403
+ ├── utils.js
404
+ └── steps/
405
+ ├── 00-license.js
406
+ ├── 01-docker-validation.js
407
+ ├── 02-database.js
408
+ ├── 03-database-separated.js
409
+ ├── 04-database-settings.js
410
+ ├── 05-auth-settings.js
411
+ ├── 06-realtime-settings.js
412
+ ├── 07-storage.js
413
+ ├── 08-custom-roles.js
414
+ ├── 09-edge-functions.js
415
+ ├── 10-supabase-temp.js
416
+ └── 11-migrations.js
417
+ ```
418
+
419
+ #### Restore (`src/commands/restore/`)
420
+ A validação de licença (mesmo step do backup, `00-license.js` em backup/steps) roda no início. Em seguida:
421
+ ```
422
+ restore/
423
+ ├── index.js
424
+ ├── utils.js
425
+ └── steps/
426
+ ├── 00-backup-selection.js
427
+ ├── 01-components-selection.js
428
+ ├── 02-confirmation.js
429
+ ├── 03-database.js
430
+ ├── 04-edge-functions.js
431
+ ├── 05-auth-settings.js
432
+ ├── 06-storage.js
433
+ ├── 07-database-settings.js
434
+ └── 08-realtime-settings.js
435
+ ```
436
+
437
+ ### Estratégia de Backup
438
+
439
+ #### Database
440
+ - **Backup Principal**: `pg_dumpall` via Docker (idêntico ao Dashboard)
441
+ - Arquivo: `db_cluster-XX-XX-XXXX@XX-XX-XX.backup.gz`
442
+ - Compatível com restauração via Dashboard do Supabase
443
+ - **Backup Separado**: SQL em arquivos distintos via Supabase CLI
444
+ - `schema.sql` - Estrutura das tabelas
445
+ - `data.sql` - Dados (comandos COPY)
446
+ - `roles.sql` - Roles e permissões
447
+
448
+ #### Edge Functions
449
+ - **Download Automático**: Via Supabase CLI `supabase functions download`
450
+ - **Reset de Link**: Garante link limpo com o projeto antes do download
451
+ - **Backup Completo**: Código completo de cada function
452
+
453
+ #### Migrations
454
+ - **Download Automático**: Via `supabase migration fetch`
455
+ - **Reset de Link**: Garante link limpo com o projeto
456
+ - **Backup Completo**: Todas as migrations do servidor
457
+
458
+ #### Storage
459
+ - **Backup Completo**: Download de todos os arquivos de todos os buckets
460
+ - **Estrutura Temporária**: Cria `storage_temp/project-id/bucket-name/arquivos...` dentro do backupDir
461
+ - **ZIP no Padrão Dashboard**: Cria `{project-id}.storage.zip` com estrutura `project-id/bucket-name/arquivos...`
462
+ - **Compatível com Restore**: O ZIP criado é compatível com o processo de restore (mesmo formato do Dashboard)
463
+ - **Pergunta Interativa**: Após criar o ZIP, pergunta se deseja limpar a estrutura temporária
464
+ - **Fallback**: Se não houver credenciais do Supabase, faz backup apenas de metadados
465
+ - **Management API**: Usa Personal Access Token para listar buckets e objetos
466
+ - **Supabase Client**: Usa Service Role Key para download de arquivos
467
+
468
+ #### Auth, Realtime
469
+ - **Management API**: Usa Personal Access Token
470
+ - **JSON Export**: Configurações exportadas como JSON
471
+ - **Realtime Settings**: Captura interativa de 7 parâmetros:
472
+ 1. Habilitar serviço Realtime
473
+ 2. Permitir acesso público
474
+ 3. Tamanho do pool de conexões do database
475
+ 4. Máximo de clientes simultâneos
476
+ 5. Máximo de eventos por segundo
477
+ 6. Máximo de eventos de presença por segundo
478
+ 7. Tamanho máximo do payload em KB
479
+ - **Manual para alguns**: Alguns settings precisam ser aplicados manualmente por segurança
480
+
481
+ ### Estratégia de Restauração
482
+
483
+ #### Database
484
+ - **Suporte a Formatos**:
485
+ - `.backup.gz` - Descompacta automaticamente via Docker
486
+ - `.backup` - Restaura diretamente via `psql` (Docker)
487
+ - **Restauração Limpa**: Pode sobrescrever dados existentes (com confirmação)
488
+
489
+ #### Edge Functions
490
+ - **Deploy Limpo**: Limpa `supabase/functions` antes do deploy
491
+ - **Reset de Link**: Garante link correto com projeto destino
492
+ - **Deploy Automático**: Usa `supabase functions deploy`
493
+
494
+ #### Outros Componentes
495
+ - **Database Settings**: Restaura via SQL
496
+ - **Storage**: Restaura buckets e arquivos do ZIP (se disponível) ou exibe informações para configuração manual
497
+ - **Auth/Realtime**: Exibe informações para configuração manual no Dashboard
498
+
499
+ ### Multiplataforma
500
+
501
+ - **Windows/macOS/Linux**: Detecção automática de binários
502
+ - **Multiplataforma**: Usa `fs.promises.cp`, `path.join`, Docker
503
+ - **Docker para Tudo**: Backup, restore e compressão via Docker (garante consistência)
504
+
505
+ ## 📊 Fluxo Recomendado
506
+
507
+ 1. **Configurar `.env.local`** (primeira vez) com as credenciais do projeto origem.
508
+ 2. **Backup do projeto origem:**
509
+ ```bash
510
+ npx smoonb backup
511
+ ```
512
+ (Mapeia variáveis interativamente na primeira vez, seleciona componentes, executa backup completo.)
513
+ 3. **Criar novo projeto Supabase** (via Dashboard ou Supabase CLI).
514
+ 4. **Editar `.env.local`** com as credenciais do novo projeto (apontar variáveis para o projeto destino).
515
+ 5. **Restaurar backup** (modo interativo):
516
+ ```bash
517
+ npx smoonb restore
518
+ ```
519
+ (Seleciona backup desejado, componentes a restaurar, executa restauração.)
520
+ 6. **Conferir o resultado**: leia `backups/restore-*/report.json` e teste login, e-mail e os fluxos da aplicação no destino.
521
+
522
+ ## 🎨 Experiência do Usuário
523
+
524
+ ### Interface em Português
525
+
526
+ Todas as interações são em **Português do Brasil**:
527
+ - Perguntas claras e diretas
528
+ - Explicações antes de cada processo
529
+ - Resumos detalhados antes de confirmar
530
+ - Confirmações com `(S/n)` ou `(s/N)` em português
531
+
532
+ ### Mapeamento Inteligente de Variáveis
533
+
534
+ - **Detecção Automática**: Se a chave já existe com o nome esperado, pula a seleção
535
+ - **Opção de Adicionar**: Permite adicionar novas chaves se não existirem
536
+ - **Validação de Valores**: Confirma valores antes de salvar
537
+ - **Backup Automático**: Sempre cria backup do `.env.local` antes de alterações
538
+
539
+ ### Processo Guiado
540
+
541
+ - **Validação Prévia**: Verifica Docker antes de começar
542
+ - **Explicações Contextuais**: Explica cada processo antes de perguntar
543
+ - **Resumo Final**: Mostra tudo que será feito antes de executar
544
+ - **Feedback Visual**: Cores e ícones para melhor experiência
545
+
546
+ ## 🐛 Solução de Problemas
547
+
548
+ ### Avisos de chaves estrangeiras circulares na exportação dos dados
549
+
550
+ Tabelas podem referenciar umas às outras ou a si mesmas. O PostgreSQL avisa que um dump **somente de dados** nem sempre pode ser restaurado com a verificação normal de chaves estrangeiras. Esse aviso isolado não significa falha na exportação: confira o resultado do comando e o manifesto do backup.
551
+
552
+ O smoonb agrupa esses avisos conhecidos, lista as tabelas envolvidas e registra os diagnósticos originais em `backup-manifest.json`, em `components.database_separated.warnings`. Outros avisos e erros continuam visíveis. Se schema, dados ou roles falharem, esse componente será marcado como incompleto.
553
+
554
+ Atualmente, o Supabase CLI coloca `SET session_replication_role = replica;` no início de `data.sql`. O smoonb verifica a primeira linha antes de informar sua presença. Isso **não valida a restauração**: a role de destino precisa ter permissão para alterar essa configuração. Restaure o schema antes dos dados e interrompa ao encontrar erros SQL. Para uma restauração controlada em destino separado e adequado, siga o [guia de backup/restauração do Supabase](https://supabase.com/docs/guides/platform/migrating-within-supabase/backup-restore):
555
+
556
+ ```bash
557
+ psql --dbname "$TARGET_DB_URL" --single-transaction --variable ON_ERROR_STOP=1 --file roles.sql --file schema.sql --command 'SET session_replication_role = replica' --file data.sql
558
+ ```
559
+
560
+ A configuração afeta essa conexão de restauração; não altera o banco de origem. Confira contagens e referências no destino restaurado antes de depender do backup. Não remova chaves estrangeiras da aplicação para silenciar os avisos. O `.backup.gz` principal é um dump completo do cluster; os SQL separados são arquivos adicionais.
561
+
562
+ ### Verificações de desenvolvimento
563
+
564
+ Use Node.js 22 para as verificações de desenvolvimento: `npm test`, `npm run lint` e `npm run build`. O teste explícito `npm run test:docker` exige Docker, imagem `postgres:17` e Supabase CLI. Ele cria somente dados fictícios em um PostgreSQL descartável próprio, testa restaurações com e sem proteção e remove esse contêiner ao terminar. Não usa credenciais do projeto nem banco remoto.
565
+
566
+
567
+ ### Docker não encontrado ou não está rodando
568
+
569
+ Verifique se o Docker está instalado e em execução:
570
+
571
+ ```bash
572
+ docker --version
573
+ docker ps
574
+ ```
575
+
576
+ Se não estiver, inicie o Docker Desktop (Windows/macOS) ou execute `sudo systemctl start docker` (Linux).
577
+
578
+ ### Supabase CLI não encontrado
579
+ ```bash
580
+ npm install -g supabase
581
+ ```
582
+
583
+ ### Supabase CLI desatualizado (abaixo da versão mínima aceita)
584
+
585
+ O smoonb aceita versões até **1 minor atrás da latest**. Se sua versão instalada estiver abaixo desse limite, você verá uma mensagem como:
586
+
587
+ ```
588
+ ❌ Supabase CLI X.Y.Z está abaixo da versão mínima aceita (X.W.0). Versão latest: X.V.Z. Atualize para pelo menos a versão X.W.0.
589
+ ```
590
+
591
+ **Opção 1 — Atualizar o Supabase CLI:**
592
+ ```bash
593
+ npm install -g supabase@latest # instalação global
594
+ npm install supabase@latest # instalação local/projeto
595
+ ```
596
+
597
+ **Opção 2 — Pular a checagem (temporariamente, risco do usuário):**
598
+ ```bash
599
+ npx smoonb backup --skip-supabase-version-check
600
+ npx smoonb restore --skip-supabase-version-check
601
+ ```
602
+
603
+ > **Nota para usuários de Scoop (Windows):** o repositório do Scoop pode levar alguns dias para atualizar após um release. Use `--skip-supabase-version-check` até que o Scoop disponibilize a versão atualizada.
604
+
605
+ ### Personal Access Token inválido ou ausente
606
+
607
+ 1. Verificar se `SUPABASE_ACCESS_TOKEN` está no `.env.local`
608
+ 2. Gerar novo token: https://supabase.com/dashboard/account/tokens
609
+ 3. Atualizar `.env.local` com o novo token
610
+
611
+ ### Database URL incorreta
612
+ - Verificar senha na URL de conexão
613
+ - Usar string de conexão do Dashboard Supabase (Settings → Database)
614
+ - Testar conexão: `psql "sua-database-url" -c "SELECT 1"`
615
+
616
+ ### Arquivo .backup.gz não pode ser restaurado
617
+
618
+ O smoonb suporta automaticamente:
619
+ - ✅ `.backup.gz` - Lê o conteúdo compactado sem modificar o arquivo original
620
+ - ✅ `.backup` - Restaura diretamente
621
+
622
+ Se houver problemas:
623
+ 1. Verificar se Docker está rodando
624
+ 2. Verificar permissões do arquivo
625
+ 3. Verificar espaço em disco
626
+
627
+ ### Erro ao baixar Edge Functions
628
+
629
+ 1. Verificar se `SUPABASE_ACCESS_TOKEN` está configurado
630
+ 2. Verificar se o projeto está linkado: `supabase link`
631
+ 3. Verificar se as functions existem no servidor
632
+
633
+ ### Erro ao baixar Migrations
634
+
635
+ 1. Verificar se `SUPABASE_ACCESS_TOKEN` está configurado
636
+ 2. Verificar se o projeto está linkado: `supabase link`
637
+ 3. Verificar se há migrations no servidor
638
+
639
+ ## 🔒 Segurança
640
+
641
+ - **Backup Automático**: Sempre cria backup do `.env.local` antes de alterações
642
+ - **Mapeamento Local**: Mapeamento de variáveis salvo apenas localmente
643
+ - **Sem Dados Sensíveis**: Nenhum dado sensível é enviado para fora do seu ambiente
644
+ - **Docker Isolado**: Operações de database via Docker (isolamento)
645
+
646
+ ## 💼 Acesso e assinatura
647
+
648
+ O código do Supa Moonbase é disponibilizado sob licença MIT (ver `LICENSE`). Para usar o smoonb é obrigatório ter **licença ativa** e **assinatura válida**, ou estar em **período de trial**. A validação da licença ocorre no início do backup e do restore; sem licença e assinatura válidas (ou trial), o CLI não executa essas operações.
649
+
650
+ [smoonb.com/#price](https://www.smoonb.com/#price).
651
+
652
+ ## 🔒 Privacidade e LGPD (resumo)
653
+
654
+ O Supa Moonbase adota o princípio de minimização de dados. Tratamos apenas as 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 estão descritos na [Política de Privacidade](https://www.smoonb.com/privacy).
655
+
656
+ ## 📋 Termos de Serviço e uso de marca
657
+
658
+ A licença de código (MIT) não substitui os [Termos de Serviço](https://www.smoonb.com/terms) que regem o acesso operacional e a validação de assinatura.
659
+
660
+ "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://www.smoonb.com/terms).
661
+
662
+ [FAQ](https://www.smoonb.com/#faq).
663
+
664
+ ## 📝 Licença
665
+
666
+ 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.
667
+
668
+ ## 🤝 Contribuição
669
+
670
+ Contribuições são bem-vindas. [www.smoonb.com/#price](https://www.smoonb.com/#price).
671
+
672
+
673
+ ---
674
+
675
+ **Desenvolvido por:** Goalmoon Tecnologia LTDA
676
+ **Website:** https://www.smoonb.com
677
+ **GitHub:** https://github.com/almmello/smoonb
678
+
679
+ Teste adicional do caminho real de restore: `npm run test:restore:docker`. Usa PostgreSQL descartável, dados fictícios e transporte HTTP simulado para Storage; cobre Auth, permissões, ciclos, rollback, arquivos e metadados.