Pular para o conteúdo
supastack
Explorar a documentação

For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /pt/docs/modules/storage.md (or send Accept: text/markdown).

Módulo de armazenamento

Um contrato ObjectStorage, adaptadores memory e compatível com S3.

Passo a passo para iniciantes

Pré-requisitos: Leia os dois guias para iniciantes abaixo, conclua a configuração local da Web e abra este monorepo na raiz do seu editor. As configurações da Web pertencem a apps/web/.env.local; Next.js não lê a raiz .env. /dashboard no modo falso padrão é uma demonstração sem banco de dados; /auth precisa de um banco de dados migrado.

Termos rápidos: um espaço de trabalho consiste em usuários, dados e configurações separados de uma equipe. O servidor é o back-end confiável; mantenha as chaves do provedor fora do navegador e do código do telefone. Uma migração é uma alteração de versão do banco de dados que cria ou atualiza tabelas. Um modelo de IA é o mecanismo que responde; o catálogo de modelos é a lista do servidor de IDs e preços de modelos disponíveis. Um provedor é um serviço externo, como IA, e-mail ou serviço de cobrança. Um direito é uma concessão que permite que um espaço de trabalho use um recurso. Um webhook é uma mensagem que um serviço envia para o URL de outro serviço.

1. Para uma avaliação sem credencial, mantenha STORAGE_PROVIDER=memory. Se esta verificação não tiver controle de upload visível, peça ao seu agente de codificação para inspecionar apps/web/app/api/storage/avatar/route.ts, apps/web/app/api/storage/logo/route.ts, apps/web/app/api/storage/organization-logo/route.ts e a página de configurações correspondentes antes de conectar uma pequena imagem de amostra.

2. Para verificar a persistência, defina STORAGE_PROVIDER=s3, STORAGE_REGION e STORAGE_BUCKET em apps/web/.env.local, adicione credenciais de teste somente de servidor localmente e reinicie.

3. A imagem deve ser recarregada do armazenamento. Os arquivos de memória desaparecem quando o processo é reiniciado; para erros S3, verifique o bucket, o endpoint e a política de acesso.

Para código personalizado, comece com o prompts/README.md fornecido e copie o prompt mais próximo: prompts/new-app-screen.md para uma tela de aplicativo ou prompts/new-landing-page.md para uma página pública. Para trabalho de servidor, banco de dados ou provedor, dê ao seu agente de codificação a tarefa deste guia e peça-lhe para ler AGENTS.md, .ai/PROJECT_CONTEXT.md e espelhos .ai/ correspondentes; inspecione os arquivos de origem exatos nomeados aqui; listar arquivos e verificações antes de editar; preservar a propriedade do espaço de trabalho e os segredos apenas do servidor; e mostrar a diferença. Informe o comportamento desejado, campos de entrada e saída, funções permitidas, sucessos e erros esperados e a conta de teste, provedor ou dispositivo. Use valores de amostra; nunca cole um segredo real.

Selecione o back-end de armazenamento

STORAGE_PROVIDER=memory é o padrão sem credenciais. local grava objetos em disco sob STORAGE_LOCAL_DIR (padrão ./.data/storage, exigido explicitamente em produção) e os transmite por URLs com expiração assinadas via HMAC em /api/storage/local/[...key] (STORAGE_LOCAL_SIGNING_SECRET, recorrendo a AUTH_SECRET) para implantações de servidor único. s3 usa apps/web/src/storage-runtime.ts para compor o cliente AWS SDK sobre o contrato enxuto @supastack/storage, oferecendo suporte ao Supabase Storage e ao MinIO com URLs no estilo de caminho ativadas por padrão.

STORAGE_PROVIDER=s3
STORAGE_REGION=us-east-1
STORAGE_BUCKET=your-product-bucket
# Set STORAGE_ACCESS_KEY_ID and STORAGE_SECRET_ACCESS_KEY on the server.
# Optional: STORAGE_ENDPOINT, STORAGE_FORCE_PATH_STYLE, STORAGE_PUBLIC_BASE_URL
# Self-hosted single-server disk storage:
# STORAGE_PROVIDER=local
# STORAGE_LOCAL_DIR=./.data/storage
# STORAGE_LOCAL_SIGNING_SECRET=

Reutilize os limites de upload

As rotas enviadas abrangem objetos, avatares, logotipos de perfil e logotipos de organizações sob /api/storage/. Eles resolvem permissões de identidade/espaço de trabalho e validam o formato de upload antes do armazenamento. Inspecione a política de tamanho/tipo da rota escolhida em vez de aceitar chaves de objeto cliente arbitrárias.

URLs públicos são apresentação, não autorização. Mantenha o conteúdo protegido atrás do limite de leitura verificado do aplicativo e configure a política bucket/CDN para os dados do seu produto.

Teste o comportamento real do armazenamento

Teste uploads permitidos/negados, MIME e rejeição de tamanho, caminhos de espaço de trabalho externo, objetos ausentes e falha do provedor. O modo de memória não persiste entre processos; verifique o armazenamento e a recuperação no back-end selecionado antes do lançamento.

Instalação e configuração

O packages/storage define a interface ObjectStorage — putObject, getObject e deleteObject sobre locators de objetos — com MemoryObjectStorage para testes determinísticos e S3CompatibleObjectStorage para buckets de produção.

As chaves de objeto são construídas com buildWorkspaceObjectKey e verificadas com assertWorkspaceObjectKey, por isso cada ficheiro armazenado é namespaced por workspace e propósito (avatar, ficheiro, logo). WorkspaceScopedStorageError dispara quando uma chave escapa ao seu workspace.

interface ObjectStorage {
  putObject(input: PutObjectInput): Promise<StoredObject>
  getObject(locator: ObjectLocator): Promise<StoredObject | undefined>
  deleteObject(locator: ObjectLocator): Promise<boolean>
  getPublicUrl(locator: ObjectLocator): string
}

key = {workspaceId}/{purpose}/{safeName}

Fluxo de implementação

As rotas da aplicação resolvem o workspace, validam o upload, constroem a chave com scope e chamam o adaptador — o storage nunca vê um caminho de cliente em bruto. Seleciona o adaptador no ambiente do servidor através de STORAGE_PROVIDER e das suas credenciais.

Expõe as leituras através da mesma fronteira de autorização; serve URLs públicos apenas para objetos que o produto publica deliberadamente.

Verificação e resolução de problemas

O MemoryObjectStorage mantém os testes unitários determinísticos — afirma chaves, content types e negações entre workspaces aí. Verifica o adaptador S3 através do percurso smoke opcional contra um bucket real antes de lançar uploads.

Perguntas frequentes

14 perguntas

O que é o supastack?

O supastack é uma base modular para construir produtos SaaS com IA. Reúne a infraestrutura comum para que possas concentrar-te nas funcionalidades próprias do teu produto.

Suporta web e mobile?

Sim. O supastack inclui apps Next.js e Expo como pontos de partida para experiências web e mobile.

Que autenticação está incluída?

O Better Auth cobre email/palavra-passe, OTP e login social. Os workspaces pessoais são aprovisionados com a conta para que os registos fiquem delimitados desde o primeiro dia.

Como é suportada a IA?

O supastack inclui IA multi-fornecedor configurável, registo de utilização, orçamentos e suporte encriptado de chaves próprias (BYOK).

Como são geridas as subscrições?

Para produtos construídos sobre o kit, a faturação Stripe, as subscrições e as permissões formam a base do acesso pago. Os segredos de fornecedor ficam no servidor.

Onde vive o código próprio do meu produto?

As funcionalidades próprias do produto ficam num codebase separado, enquanto o produto configura e integra os módulos base do supastack.

Como funciona o preço do supastack?

O kit é uma compra única com atualizações vitalícias: Uma framework por 249 $ (preço de lançamento temporário — 100 $ de desconto sobre o preço normal de 349 $) ou Todas as frameworks (Next.js, iOS, Android) por 499 $ (preço de lançamento temporário — 100 $ de desconto sobre o preço normal de 599 $), mais 75 $ por lugar de programador adicional. Sem subscrição do kit. O checkout neste site entrega a tua chave de licença por email, com acesso ao repo por convite GitHub.

Como é que os workspaces delimitam os meus dados?

Os registos do utilizador são delimitados por workspaceId. Identidade, permissões, utilização de IA, eventos de faturação e entradas de auditoria ficam dentro do limite do workspace pessoal.

Como funcionam os jobs em segundo plano?

O Trigger.dev é o runtime de jobs explícito. O contrato JobRunner só promete enqueue, status e cancel — a semântica de workflow permanece específica e explícita do Trigger.dev.

Como difere o email da divulgação?

O email transacional cobre fluxos de produto como avisos de conclusão de tarefas. A divulgação fria e as campanhas pertencem ao próprio produto, fora do módulo de email deste kit.

Como funcionam as compras no aplicativo móvel?

O aplicativo móvel inclui compras nativas e restauração via RevenueCat, com acesso verificado pelo servidor. Configure as contas das lojas e conclua os testes em dispositivos antes de publicar. A cobrança web permanece separada.

Onde residem as chaves dos fornecedores de IA?

As credenciais BYOK são encriptadas e ficam no servidor. As chaves são higienizadas nos logs; a utilização e os orçamentos ficam visíveis ao nível do workspace.

Quais métodos de pagamento o checkout aceita?

O checkout hospedado na Stripe aceita cartões e também pode oferecer Alipay e WeChat Pay quando essas carteiras estiverem ativadas na conta Stripe — útil para compradores na China. As autorizações de carteira são confirmadas de forma assíncrona, então a página da licença é atualizada assim que o pagamento é liquidado.

Posso solicitar um reembolso?

Depois de obter acesso ao repositório, o supastack é seu para sempre, portanto não pode ser reembolsado. Mas fique tranquilo: você recebe o código-fonte completo com atualizações vitalícias para criar e lançar produtos ilimitados para você ou seus clientes. Você apenas não pode revender o código nem redistribuir o repositório como starter kit ou modelo.

PT
Tema