Fóir para SaaS

Seu produto é um schema atendendo muitos clientes, e a maior parte do trabalho é manter os dados deles separados. No Fóir, o schema é compartilhado de propósito, e o isolamento não é algo que você escreve.

Um schema, e um lugar para alterá-lo

A multi-tenancy costuma forçar uma escolha: um schema com o qual todo cliente precisa evoluir ao mesmo tempo, ou um fork por cliente que ninguém consegue alterar com segurança um ano depois.

No Fóir, um modelo é definido uma vez, no seu projeto, e a organização de cada cliente dentro dele o herda. Há uma definição em vez de uma cópia por cliente, então editá-la muda o que todos eles servem. Um cliente pode definir um modelo próprio abaixo do seu sem fazer fork do resto do seu schema.

Um schema compartilhado não é dado compartilhado

A falha que você não pode ter é um cliente lendo as linhas de outro, e na maioria das stacks a única coisa no caminho é uma cláusula que alguém se lembrou de escrever.

Cada cliente é uma organização dentro do seu projeto, e toda linha que ele escreve é marcada com ela no banco de dados. O acesso é imposto pelo Postgres por baixo da sua aplicação, e não pelo caminho de código que estiver rodando, então uma requisição que não nomeia nenhum cliente volta sem nenhuma das linhas deles em vez de todas, e um novo lugar para guardar dados não pode ser entregue sem regras que o cubram. Nenhuma leitura ou escrita no seu código nomeia o cliente. A credencial com que ela roda é que decide, então uma consulta não pode ser apontada para o cliente errado.

Criar um cliente é uma chamada de API

Cadastrar um cliente costuma significar um script de provisionamento que cria um tenant, aplica a identidade visual, popula os dados iniciais e deixa metade disso para trás quando uma etapa falha.

Uma chamada cria o cliente, identificado por um id que você escolhe para ele. Ela cria a organização dele com a identidade visual, e pode gravar as configurações, adicionar o primeiro membro e emitir uma chave restrita a ele. Ele herda seus modelos de imediato, sem nenhum schema para copiar no lugar. Chame de novo com o mesmo id e ela retoma na etapa que não foi concluída em vez de criar um segundo cliente.

O que seu maior cliente vai perguntar

O negócio que leva você para um mercado maior chega com uma revisão de segurança, e a resposta honesta costuma ser um diagrama de intenções.

Aqui o isolamento é um mecanismo do banco de dados, e não uma política. Os usuários dele fazem login em um domínio que pertence a ele, em telas com o nome dele em vez do seu. E se ele um dia pedir os dados dele, uma exportação feita como a organização dele contém as linhas dele e nenhuma de outro cliente, porque a regra que confina toda leitura confina a exportação também.

Com o que todo cliente começa

As partes de um produto multi-tenant que você de outro modo construiria uma vez e manteria para sempre.

Login para os usuários deles

Cadastro, senha, código de uso único, social e OIDC, em um domínio que pertence ao cliente.

O nome deles nisso

Logo, cor, nome do remetente e endereço de suporte por organização, usados pelas telas e pelos e-mails que os usuários deles veem.

Uma chave por cliente

Uma chave restrita a um cliente não pode ser direcionada a nenhum outro lugar, diga o que disser a requisição. Seu back office guarda uma chave e indica o cliente a cada requisição.

Papéis dentro da conta deles

Papéis de cliente que você declara na configuração, para que a equipe do seu cliente tenha administradores e membros sem que você construa um sistema de permissões.

Meça o que eles usam

Aplique cota a uma operação por cliente em uma janela móvel e condicione-a ao segmento em que ele está, usando os mesmos públicos que personalizam o conteúdo dele.

Ambientes no mesmo formato

Uma configuração nomeia um projeto de staging e um projeto de produção, para que uma mudança de schema seja ensaiada em um lugar seguro antes de chegar aos clientes.

Uso por cliente

Registros, mídia, usuários ativos e e-mails contados por organização, cada um com um limite que você pode definir, para ver e limitar o que cada cliente usa.

Trabalho em segundo plano

Operações, agendamentos e hooks de eventos por organização, com novas tentativas e um registro do que aconteceu.

Mídia

Uma biblioteca de ativos com transformações e versões responsivas, e regras de acesso sobre arquivos.

Modele uma vez, depois adicione o segundo cliente

Crie um projeto e faça push dos modelos em que seu produto roda. O próximo cliente é uma organização dentro dele.