PRIVADO · MULTI-TENANT · CIFRADO · SELF-HOSTED

Armazenamento de objetosque mostra as contas.

O Lockwell é um armazenamento de objetos privado e cifrado, com API compatível com S3, API JSON nativa e SDKs oficiais para Go, Node e Java: um único binário, sem segunda base de dados, sem cola. As afirmações desta página são medições, e o repositório traz as ferramentas para as repetir.

MEDIDO, NÃO PROMETIDOPASS
recuperação após crash, escritas confirmadas intactas
16 s
disco usado para os mesmos bytes, vs MinIO
0.54x
PUT multipart, 64 MiB com 64 clientes
2.2x MinIO
suite de produção S3, 24 clientes SDK
0 falhas
buckets públicos, leituras anónimas
recusado

medido a 2026-06-11 · uma máquina, Docker Compose · metodologia · reproduzir: make bench · make prod-authority-test

O PORTÃO

Todos os pedidos passam pelo portão

Este é o modelo de segurança inteiro numa cena. Um pedido que apresenta uma chave de tenant passa, e o objeto fica selado e cifrado em repouso. Um pedido sem chave é recusado com 401. Não existe caminho anónimo para configurar com cuidado: não existe, ponto.

carries a tenant key: passes, sealed at rest sem chave: recusado no portão, 401

Partilhar continua a funcionar, pelo caminho seguro: gera-se um link assinado com prazo (um download de 7 dias para um cliente, um upload de uma hora no browser) e entrega-se. O link transporta a permissão, ninguém recebe chaves, e expira sozinho.

RECUSADO POR DESENHObuckets públicosleituras anónimasSSE-KMS sem um KMSfallbacks silenciosos em chamadas S3 não suportadasa lista completa →
PARA QUEM PAGA A FATURA

O argumento para substituir um MinIO que funciona

Benchmarks não movem um sistema em produção; contas mais baixas, menos peças móveis e uma saída segura, sim. Isto é o que muda no dia da troca, e a forma honesta de o confirmar sem arriscar nada.

Os mesmos bytes, cerca de metade do disco

Medido: 0,54x o disco do MinIO para um conjunto de escrita idêntico, antes ainda da deduplicação trabalhar sobre dados reais. O armazenamento é a rubrica que só cresce; isto reduz o declive para metade.

Multi-tenancy que não tem de construir

Isolamento por cliente, chaves com âmbito, quotas e registo de auditoria são trabalho do servidor, não uma camada de autenticação que a equipa escreve à volta de um bucket e mantém durante anos.

Conformidade incluída

Cifra em repouso sempre ativa, retenção e legal hold com Object Lock, auditoria, verificação e reparação, e ensaios de backup e restauro. A evidência que o auditor pede é o output normal do produto.

Um binário para operar

Sem base de dados externa, sem broker, sem cache para alimentar. Atualizar é substituir um binário; a recuperação é um ensaio que corre em CI, não uma página de wiki que ninguém testou.

A saída é padrão

Fala S3, por isso sair é um aws s3 sync. Um sistema de armazenamento de onde é fácil sair é o único tipo para onde vale a pena entrar.

Mantenha o MinIO a correr. Audite a mudança primeiro.

O planeador de migração lê o seu MinIO ou outro armazenamento compatível com S3 e recusa funcionalidades bloqueadas em vez de as deixar cair em silêncio. Corra o Lockwell ao lado da produção, copie com verificação e checkpoints, e troque apenas quando o próprio livro-razão o convencer.

$ lockwell migration s3 plan --json
Como funciona a migração →
CASOS REAIS

O que as equipas realmente correm aqui

Três formas concretas, não personas. Cada uma é um tenant, meia dúzia de chaves com âmbito, e partes do servidor que já existem.

Entregas a clientes com links que expiram

Uma agência mantém cada cliente no seu próprio tenant. As entregas partilham-se por links assinados que morrem ao fim de sete dias: sem contas de cliente, sem bucket público, e a auditoria mostra cada download.

URLs assinados →

Ficheiros de utilizadores num SaaS multi-tenant

Cada cliente é um tenant. Os browsers enviam diretamente para o armazenamento com URLs PUT assinados, os webhooks disparam o pipeline de miniaturas, e uma chave comprometida só consegue ver o mundo de um tenant.

O app kit →

O arquivo que o auditor vai visitar

Faturas e registos entram sob retenção Object Lock com cifra sempre ativa. O ciclo de vida expira o que pode expirar, o legal hold congela o que não pode, e o ensaio de restauro prova que os backups são reais.

Object Lock →
EVIDÊNCIA

Veja a funcionar, depois confira a matemática

O terminal repete o ciclo de vida real contra a superfície real da CLI. As barras vêm da evidência de benchmark registada, e a ferramenta vem no repositório, por isso qualquer número pode ser repetido no seu próprio hardware.

lifecycle.sessionrepetido, não fingido
$ lockwell tenant-create acme --yes
tenant "acme" created, isolated by default
$ lockwell key-create app --tenant acme --read --write --delete
access key AKIA...W4 minted, secret shown once
$ aws s3 cp report.pdf s3://acme-inbox/ --endpoint-url https://objects.example.com
upload: ./report.pdf to s3://acme-inbox/report.pdf
$ lockwell cluster disaster-drill --tenant acme --json
{ "unrecoverable_data_loss": 0, ... }
drill: PASS
PUT multipart, partes de 64 MiB com 64 clientes2,2x
lockwell1287 MiB/s
minio579 MiB/s
GET, 64 MiB com 16 clientes2,9x
lockwell13736 MiB/s
minio4659 MiB/s
disco usado para o mesmo conjunto de 44 GiB0,54x menos
lockwell44.0 GiB
minio81.2 GiB

medido a 2026-06-11 · uma máquina, Docker Compose, zero erros em todas as linhas · metodologia · reproduzir: make bench

CONTRAPROVA COM A FERRAMENTA DO PRÓPRIO MINIO · WARP 1.3.1
PUT, objetos de 1 MiB com 16 clientes10,9x
lockwell2561 MiB/s
minio236 MiB/s
GET, objetos de 1 MiB com 16 clientes1,3x
lockwell6857 MiB/s
minio5454 MiB/s
GET dentro da carga mista do warp1,8x
lockwell2628 MiB/s
minio1500 MiB/s

medido a 2026-06-12 com o warp 1.3.1, parâmetros idênticos contra ambos os servidores, zero erros · reproduzir: make bench-warp

resultados completos →
CAPACIDADES

Tudo o que a camada de armazenamento de uma app precisa

Provisionamento, uploads assinados, cifra, suporte edge e webhooks, tudo num servidor e num SDK. Não se cose um bucket, uma fila, um assinador e um cofre de segredos.

01 · tenancy

Provisionamento multi-tenant

Garanta que um tenant existe e gere uma chave nova com âmbito numa só chamada: leitura/escrita/remoção, âmbito opcional por bucket, segredo mostrado uma única vez. Cada tenant é isolado por omissão.

02 · superfícies

APIs nativa + S3 + admin

Um plano de dados JSON nativo, compatibilidade S3 SigV4 e uma API de administração JSON. Três superfícies sobre um servidor, alcançadas por um SDK. Fale com o armazenamento como a sua stack preferir.

03 · uploads

URLs assinados para o browser

Assine um URL de upload ou download no servidor e entregue-o diretamente ao browser. A API nativa assina URLs de escrita, não só GET, por isso os bytes nunca passam pela sua app.

04 · edge

Pronto para o edge

Os clientes nativo e kit não importam nada de node:*, por isso correm em Cloudflare Workers, Vercel Edge, Bun e Deno através de uma entrada /edge dedicada, sem node:crypto.

05 · cifra

Cifra sempre ativa

A cifra autenticada em repouso vem ligada por omissão: AES-256-GCM ou XChaCha20-Poly1305 sobre os dados, com chaves por tenant. Não há flag para esquecer.

06 · webhooks

Webhooks verificáveis

As notificações de bucket fazem POST para o seu endpoint com assinatura HMAC-SHA256 de tempo constante. O verifyWebhook valida a assinatura numa chamada, e corre no edge.

TRÊS SUPERFÍCIES, UM SERVIDOR

Três APIs sobre o mesmo armazenamento cifrado

O Lockwell expõe o mesmo armazenamento multi-tenant e cifrado através de três interfaces. Escolha a que servir, ou misture à vontade.

Compatível com S3SigV4 · XML

Encaixa onde o S3 já está

Autenticação SigV4, endereçamento path-style e virtual-host, versões, multipart, escritas condicionais, URLs pré-assinados, Object Lock, tags e ciclo de vida. O livro de paridade documenta cada operação, e o que ficar de fora falha fechado em vez de fingir.

JSON nativo/api/v1/

Fale com o armazenamento em nativo

Um plano de dados JSON no listener público, sem assinatura SigV4 e sem XML. Os tokens bearer são gerados a partir das chaves de acesso e renovados por si. Os URLs assinados nativos cobrem GET e PUT.

Admin JSON/admin/api/v1/

Provisionar e gerir

Uma API de administração JSON autenticada por bearer num listener privado: tenants, chaves com âmbito, RBAC, auditoria e um documento OpenAPI. O provisionamento vive fora do plano de dados, por desenho.

UM SDK

Sem camada de armazenamento própria para manter

A stack habitual é um bucket, uma segunda base para metadados, um serviço de assinatura, um verificador de webhooks e a cola que os une. O Lockwell colapsa isso num servidor e num SDK: provisionar um tenant, obter um cliente com âmbito, assinar um upload de browser e verificar o webhook, de ponta a ponta, na mesma biblioteca, sobre o mesmo armazenamento cifrado.

npm i @kelphect/sdk
provision.ts@kelphect/sdk
import { LockwellKit } from '@kelphect/sdk';

const kit = new LockwellKit({
  admin:  { endpoint: 'https://admin.example.com', token } },
  native: { endpoint: 'https://objects.example.com' },
});

// 1. provision a tenant + mint a fresh scoped key
const { key } = await kit.provisionTenant('acme', {
  defaultBucket: 'inbox',
});

// 2. sign a browser upload, then hand the URL to the client
const client = kit.clientForTenant('acme', key);
const up = await kit.signedUploadUrl(client, 'inbox', 'photo.jpg', {
  ttl: 300, contentType: 'image/jpeg',
});
ADIADO, NÃO NEGADO

O que ainda não existe, e o que fazer entretanto

Uma funcionalidade entra quando passa os mesmos portões de release que tudo o resto passou: ensaios, suites, comportamento documentado. Até lá o servidor diz não, e esta página di-lo em voz alta.

em desenho, atrás dos portões

Replicação multi-nó

O Lockwell é deliberadamente single-node hoje; o perfil replicado fica suspenso até passar os mesmos ensaios de takeover e durabilidade. Entretanto há equipas com standby morno: uma segunda instância alimentada por sync S3 agendado, com ensaios de restauro a provar a costura.

webhooks hoje

Buses de eventos (SNS, SQS, Lambda)

As notificações entregam-se a webhooks assinados, verificáveis numa chamada. Uma fila entre o Lockwell e o seu pipeline está a um consumidor de distância, em infraestrutura em que já confia.

ciclo de vida hoje

Tiering de armazenamento

As regras de ciclo de vida já expiram e limpam; arquivar a frio é um job agendado a copiar via API S3 para o armazenamento frio que as suas contas preferirem.