Pular para o conteúdo
Nelcota
EN : Read in English

Backend completo. Um binário. Sua VPS.

  • API REST

    GET /rest/v1/notes

    Gerada do seu schema

  • Login

    POST /auth/v1/token

    Senha, magic link, OAuth

  • Arquivos

    /storage/v1/object

    Disco ou S3, com policies

  • Webhooks

    x-nelcota-signature

    Assinados, com retry e histórico

  • Painel admin

    /admin/

    Dados, usuários e SQL

  • PostgreSQL

    owner = auth.uid()

    Decide quem vê o quê

API REST gerada do seu schema, login, arquivos, webhooks e painel admin, rodando no seu PostgreSQL. Sem conta, sem cobrança por requisição, sem uma dúzia de serviços para manter.

API REST

Você cria a tabela. A API sai pronta. Zero endpoints.

Filtros, relações, RPC e documento OpenAPI saem direto do schema. Quem pode ler cada linha é regra do PostgreSQL, não um if esquecido num controller.

PAINEL ADMIN

Painel admin incluso. Nada a mais para instalar.

  • Visão geral do painel do Nelcota com gráficos de tráfego da API, contagem de tabelas e usuários e próximos passos Visão geral do painel do Nelcota com gráficos de tráfego da API, contagem de tabelas e usuários e próximos passos
    Visão geral
  • Editor de tabelas do Nelcota mostrando as linhas de uma tabela notes protegida por RLS Editor de tabelas do Nelcota mostrando as linhas de uma tabela notes protegida por RLS
    Tabelas
Guia do painel

Nada reinventado onde não precisava.

Rust, tokio, axum e rustls na frente, PostgreSQL atrás. Peças que já aguentam produção pelo mundo todo.

Como funciona

Um projeto de fim de semana ou vários apps na mesma VPS: cada um ganha API, login, arquivos e webhooks e quem vê cada linha é o PostgreSQL que decide.

SEGURO POR PADRÃO

Seguro antes da primeira linha.

Nenhum checklist de hardening para lembrar depois. Tudo isto já vem ligado no primeiro nelcota dev.

Ainda é 0.x: as notas de segurança listam o que falta.

Notas de segurança
  • Argon2id + rate limit

    Senhas com hash, limite de tentativas de login e a mesma resposta para e-mail desconhecido e senha errada.

  • Tokens de 15 minutos

    Access tokens Ed25519. O refresh token é trocado a cada uso, e reusar um antigo revoga a sessão.

  • RLS em toda requisição

    Role e claims ficam na transação. Token inválido nunca vira anon.

  • Webhooks ficam do lado de fora

    Só HTTPS. Endereços privados e de metadados de nuvem são bloqueados.

  • Arquivos isolados

    Arquivos servidos pelo Nelcota saem com nosniff e CSP sandbox. No S3, o provedor os serve do domínio dele.

  • Sem Rust unsafe

    unsafe é proibido, o cargo-deny confere as dependências e há mais de 500 testes automatizados.

VELOCIDADE MEDIDA

1.965 req/s com 128 MiB de RAM.

Leituras indexadas com o app preso a 1 CPU e 128 MiB, na versão candidata do main. Sobra memória para o PostgreSQL, que é quem faz o trabalho pesado.

Como foi medido
  • 1.965 req/s leituras indexadas, app com 1 CPU e 128 MiB
  • 45 MiB pico de memória do app sob carga
  • 0 erros em 1.079.703 requisições
  • 4,4 ms latência mediana a 600 req/s

Seu código, seus dados, seu servidor.

Apache-2.0. Sem conta, sem plano, sem fatura surpresa. E se um dia quiser sair, seus dados já estão em PostgreSQL padrão.

TUDO INCLUÍDO

Tudo que um app pede. Já vem dentro.

  • Arquivos

    Disco ou S3, público ou privado. Quem baixa o quê é uma policy SQL, e os links temporários expiram sozinhos.

    Arquivos
  • Webhooks

    Seu servidor recebe as mudanças que você escolher, assinadas, com 6 tentativas se ele estiver fora do ar.

    Webhooks
  • Painel admin

    Tabelas, usuários, arquivos, policies e SQL em /admin/, sem outro serviço para subir.

    Guia do painel

COMECE AGORA

Do zero à API em três passos.

Precisa de Linux com Docker. No macOS e no Windows, compile a partir do código.

Quickstart completo
  1. 1 Instale e suba

    Um comando instala a CLI. nelcota dev sobe o PostgreSQL no Docker e a API na porta 8000.

    Terminal
    # Instala a CLI do nelcota
    curl -fsSL https://raw.githubusercontent.com/Nelcota/Nelcota/main/scripts/install.sh \
      | NELCOTA_SKIP_DOCKER=1 sh
    
    # Cria uma pasta vazia para o app
    mkdir notes-app && cd notes-app
    
    # Sobe o PostgreSQL e a API; deixe rodando
    nelcota dev
  2. 2 Escreva o schema

    Uma migration com a tabela e as regras de acesso. Aplique e gere os tipos.

    Terminal segunda janela
    # Escreve a migration: a tabela notes e as regras de acesso
    mkdir -p migrations src
    cat > migrations/V1__notes.sql <<'SQL'
    -- A tabela: cada nota pertence ao usuário que a escreveu
    CREATE TABLE public.notes (
        id    bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
        owner uuid   NOT NULL DEFAULT auth.uid(),
        body  text   NOT NULL
    );
    
    -- Liga a row-level security na tabela
    ALTER TABLE public.notes ENABLE ROW LEVEL SECURITY;
    
    -- Usuários logados podem ler e escrever na tabela...
    GRANT SELECT, INSERT, UPDATE, DELETE
        ON public.notes
        TO authenticated;
    
    -- ...mas só nas linhas que são deles
    CREATE POLICY notes_owner
        ON public.notes
        FOR ALL
        TO authenticated
        USING      (owner = auth.uid())
        WITH CHECK (owner = auth.uid());
    
    -- Um bucket privado: cada usuário grava na própria pasta
    INSERT INTO storage.buckets (id, public) VALUES ('files', false);
    
    CREATE POLICY notes_files_owner
        ON storage.objects
        FOR ALL
        TO authenticated
        USING (
            bucket_id = 'files'
            AND (storage.foldername(name))[1] = auth.uid()::text
        )
        WITH CHECK (
            bucket_id = 'files'
            AND (storage.foldername(name))[1] = auth.uid()::text
        );
    SQL
    
    # Aplica a migration e gera os tipos TypeScript
    nelcota migrate
    nelcota types -o src/database.ts
  3. 3 Use a API

    Crie um usuário e leia as notas com o token dele. A RLS devolve só as dele.

    Terminal
    # Cria um usuário e guarda o access token dele
    TOKEN=$(curl -fsS -X POST http://127.0.0.1:8000/auth/v1/signup \
      -H 'content-type: application/json' \
      -d '{"email":"[email protected]","password":"a-development-password"}' \
      | jq -er '.access_token')
    
    # Espera a API enxergar a nova tabela
    for attempt in 1 2 3 4 5 6 7 8 9 10; do
      status=$(curl -s -o /dev/null -w '%{http_code}' \
        -H "authorization: Bearer $TOKEN" \
        http://127.0.0.1:8000/rest/v1/notes)
      [ "$status" = 200 ] && break
      sleep 0.2
    done
    [ "$status" = 200 ] || echo 'notes is not ready: check the nelcota dev terminal' >&2
    
    # Insere uma nota como esse usuário
    curl -fsS -X POST http://127.0.0.1:8000/rest/v1/notes \
      -H "authorization: Bearer $TOKEN" \
      -H 'content-type: application/json' \
      -d '{"body":"My first note"}'
    
    # Lê as notas de volta: a RLS devolve só as dele
    curl -fsS 'http://127.0.0.1:8000/rest/v1/notes?order=id.desc' \
      -H "authorization: Bearer $TOKEN"
  • TypeScript
  • Rust
  • curl
  • Docker
  • PostgreSQL
  • Linux
  • macOS
  • Windows

Funciona do jeito que você já trabalha.

SDK para TypeScript e Rust, HTTP puro para qualquer outra linguagem. Roda com Docker ou systemd.

CÓDIGO ABERTO

R$ 0 de licença. Para sempre.

Apache-2.0. Você paga o servidor que escolheu, não cada requisição que o seu app faz.

  • Licença

    R$ 0

    para sempre

    Apache-2.0: use, modifique e distribua.

  • Hospedagem Você escolhe

    Seu servidor

    O guia de deploy coloca 2–3 projetos pequenos numa VPS de 1 GB.

  • Uso

    R$ 0

    por requisição

    Sem medidor. O limite é o seu servidor, não um plano.

Um binário, 128 MiB, Apache-2.0, Sem lock-in

LEIA AS DOCS

Do primeiro comando ao deploy.

Quickstart, API, login, arquivos, deploy, backups e CLI. Em inglês, com tradução para português.

Abrir as docs

CÓDIGO ABERTO

Gostou? Abra uma issue ou mande um PR.

Cada versão, cada decisão e cada bug ficam no GitHub, à vista de todo mundo.

Ver no GitHub
Começar