Documentação / v1

Da primeira requisição
à implantação em produção.

Comece com uma instalação local, conecte pagamentos e serviços externos, implante na sua própria infraestrutura e mantenha a plataforma atualizada. Os guias para iniciantes incluem os cliques no painel de cada provedor, não apenas as variáveis de ambiente.

27 guias 6 trilhas PTfonte
Comece aqui8 min de leitura

Visão geral da plataforma

O FastRestful é uma plataforma de produtos de API voltada para produção. Ele reúne um marketplace público, versões de API, um gateway com medição, assinaturas e cobrança, documentação, um console do consumidor, um estúdio de fornecedor e um plano de controle da equipe em um único sistema Django + frontend.

É novo por aqui? Siga o caminho para iniciantes: Instale localmente, depois faça sua primeira requisição pelo gateway. Conecte pagamentos somente quando quiser cobrar dinheiro, e leia Implantação antes de tornar o site público.

O que é o FastRestful

O FastRestful não é uma única API. É a infraestrutura de produto em torno das APIs: a vitrine, a fronteira do contrato, o caminho da requisição, o dinheiro, o conteúdo e as operações. Uma equipe pode operar uma API ou um marketplace multivendor a partir da mesma instalação.

SuperfícieQuem usaO que ele gerencia
Site públicoVisitantes e compradoresMarketplace, páginas de detalhe de API, documentação, preços, blog, status, perfis de fornecedores e páginas legais.
Console do consumidorAssinantes de APIAplicativos, chaves, assinaturas, explorador, requisições, análises, faturas, equipe e suporte.
Estúdio do fornecedorPublicadores de APIProdutos, versões, endpoints, planos, consumidores, monetização, repasses, portal e suporte.
Plano de controle da equipeOperadores da plataformaTráfego, fornecedores, cobrança, repasses, suporte, moderação, CMS, anúncios, idiomas e auditoria.

Modos de fornecedor único e multivendor

A plataforma começa no modo de fornecedor único. Somente a organização marcada como fornecedora da plataforma pode publicar APIs públicas. Um superusuário pode ativar o modo multivendor em Configurações do site; depois disso, qualquer organização com um perfil de fornecedor aprovado pode publicar.

  • Fornecedor único: um negócio de API curado, um fornecedor da plataforma, governança mais simples.
  • Multivendor: marketplace no estilo RapidAPI, em que fornecedores independentes listam, precificam e oferecem suporte às próprias APIs.
  • A alternância é aplicada na camada de modelo, portanto API, admin e estúdio de fornecedor permanecem consistentes.
  • O onboarding de fornecedores, a revisão de perfis e a separação de funções continuam ativos nos dois modos.

Arquitetura em resumo

caminho da requisição
Browser / SDK
   │
   ├── public site + consoles ──► Django REST API ──► PostgreSQL
   │                                  │
   │                                  ├── Redis (cache, throttles, Celery)
   │                                  ├── S3 / CloudFront (media, specs)
   │                                  └── provider webhooks (payments, payouts)
   │
   └── API product request ──► metered gateway ──► vendor upstream
                                  │
                                  ├── API key + subscription
                                  ├── quota + rate limit + entitlement
                                  ├── SSRF checks + idempotency + retries
                                  └── usage event + redacted request log

A stack

CamadaTecnologia
BackendDjango 5.1+, Django REST Framework, SimpleJWT, drf-spectacular, Celery
FrontendReact 19, app router compatível com Next, Vite, TypeScript, primitivas Tailwind/shadcn
Banco de dadosSQLite para desenvolvimento local; PostgreSQL 16 em produção
Cache / filaLocMem localmente; Redis em produção; worker + beat do Celery para tarefas agendadas
ArmazenamentoSistema de arquivos local por padrão; S3 + CloudFront recomendados em produção
PagamentosStripe, PayPal, Flutterwave, Paystack, Razorpay
E-mailSMTP, SES, Mailgun, SendGrid, Postmark, Brevo, Mailjet, SparkPost, Resend

Princípios do produto

  • O isolamento de inquilinos é no servidor. O espaço de trabalho ativo é explícito, as permissões de objetos são verificadas novamente e os serializadores públicos são separados dos privados.
  • As versões são imutáveis. Um contrato ativo não pode ser editado no local; crie uma nova versão e promova-a.
  • A verdade do provedor prevalece. A criação do checkout nunca concede direito de acesso; webhooks assinados do provedor definem o estado financeiro.
  • As chaves são segredos. As chaves de API brutas são exibidas uma vez, armazenadas como hash para busca e criptografadas para uso do gateway no servidor.
  • As operações deixam evidências. Eventos de auditoria, recibos de webhook, logs de requisição e decisões de moderação são somente anexados onde isso importa.
  • Um único design system. Tokens do Signal Grid, superfícies semânticas, metadados em monoespaçado e estados acessíveis em todas as superfícies.

Para onde ir agora

Escolha o caminho que corresponde ao que você está fazendo. Você não precisa ler toda a documentação em ordem.

Quero…Leia estes guias em ordem
Veja funcionando localmenteInstalação → Início rápido
Cobrar clientesGateways de pagamento → Cobrança e repasses
Conectar e-mail, armazenamento ou SSOIntegrações externas
Colocar em um servidor públicoImplantação → Segurança → Backups e atualizações
Instalar atualizações oficiaisLicenciamento e atualizações oficiais
Operar a plataforma no dia a diaOperações → Observabilidade → Solução de problemas

Avaliando o produto? Leia o inventário de recursos. Procurando um endpoint específico? Use a referência da API.

Comece aqui10 min de leitura

Instale o FastRestful no seu computador

Uma primeira instalação completa para quem nunca executou uma aplicação Django ou Node. Siga as etapas em ordem. Cada etapa termina com uma verificação para você saber que funcionou antes de continuar.

Antes de começar

Você não precisa de Docker, Redis, armazenamento em nuvem nem de uma conta de pagamento para a demonstração local. SQLite e um cache em memória mantêm a primeira execução simples.

Você precisa dePor quêComo verificar
Python 3.11Executa o backend Django.python3.11 --version
Node.js 22.13+Executa o frontend e suas ferramentas de build.node --version
GitBaixa o código-fonte.git --version
Duas janelas de terminalUma executa o backend, a outra o frontend.Abra o Terminal duas vezes.
Mantenha os dois servidores em execução. O backend e o frontend são processos separados. Fechar um terminal interrompe esse processo. Use Ctrl+C em um terminal para parar um servidor quando terminar.

1. Verifique suas ferramentas

Execute estes comandos no terminal. Se algum estiver faltando, instale-o primeiro e reabra o terminal.

verificar versões
python3.11 --version
node --version
npm --version
git --version

Você deve ver Python 3.11, Node 22.13 ou mais recente e uma versão do npm. Se python3.11 não for encontrado, instale o Python 3.11 em python.org. Se o Node for anterior ao 22.13, instale a versão LTS atual em nodejs.org.

Windows: use py -3.11 onde este guia diz python3.11, e ative o ambiente com .venv\Scripts\Activate.ps1.

2. Baixe o código

shell
git clone <your-fastrestful-repository> fastrestful
cd fastrestful
npm ci

npm ci instala as versões exatas das dependências do frontend a partir do arquivo de lock. Pode levar alguns minutos. Você deve terminar com uma pasta node_modules e nenhuma mensagem de erro.

3. Crie o ambiente do backend

Um ambiente virtual mantém os pacotes Python do FastRestful separados do restante do seu computador.

shell
cd backend
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

No Windows PowerShell, ative com .venv\Scripts\Activate.ps1 em vez de source .venv/bin/activate. Quando o ambiente estiver ativo, seu prompt normalmente começa com (.venv).

Ponto de verificação: execute python3.11 -m django --version. Ele deve exibir uma versão do Django 5.x. Se falhar, o ambiente virtual não está ativo ou a instalação não foi concluída.

4. Crie o arquivo de configuração do backend

Copie o arquivo de exemplo e depois gere dois segredos e cole-os em backend/.env.

shell
cp .env.example .env
python3.11 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
python3.11 -c "import secrets; print(secrets.token_urlsafe(64))"
  1. Abra backend/.env em qualquer editor de texto.
  2. Cole a primeira saída em FIELD_ENCRYPTION_KEY=. Isso criptografa chaves de API e segredos de provedores.
  3. Cole a segunda saída em DJANGO_SECRET_KEY=.
  4. Deixe DJANGO_DEBUG=True, DATABASE_URL=sqlite:///db.sqlite3 e FRONTEND_URL=http://localhost:5055 para o desenvolvimento local.
Nunca faça commit de .env. Ele contém segredos. O repositório já o ignora. Se você alterar a porta do frontend depois, atualize FRONTEND_URL, CORS_ALLOWED_ORIGINS, e CSRF_TRUSTED_ORIGINS para corresponder.

5. Crie o banco de dados e os dados de demonstração

Certifique-se de que o ambiente virtual ainda está ativo e de que você está dentro de backend/.

shell
python3.11 manage.py migrate
python3.11 manage.py seed_demo
python3.11 manage.py seed_apis
python3.11 manage.py seed_docs
python3.11 manage.py seed_engagement

migrate cria as tabelas do banco de dados. Os comandos de seed criam um marketplace de demonstração, produtos de API, conteúdo de documentação e perfis da comunidade. Isso cria um arquivo local backend/db.sqlite3.

Credenciais apenas locais. seed_demo cria o superusuário admin / Admin12345!. O seed de engajamento cria perfis de criadores com a senha Demo12345!. Nunca reutilize essas credenciais em produção.

6. Inicie o backend

terminal 1
# inside backend/, with the virtual environment active
python3.11 manage.py runserver 127.0.0.1:5056

Deixe este terminal aberto. O backend está pronto quando imprime Starting development server at http://127.0.0.1:5056/. Verifique em outro terminal com:

verificar backend
curl http://127.0.0.1:5056/api/health/live

7. Inicie o frontend

Abra o segundo terminal e volte para a raiz do repositório. O backend deve continuar em execução no terminal 1.

terminal 2
cd /path/to/fastrestful
npm run dev -- --port 5055 --host 127.0.0.1

O servidor de desenvolvimento do Vite faz proxy das rotas do Django (/api/v1, /api/health, /api/schema, /api/docs, /admin, /static, /media) para o backend na porta 5056. Páginas públicas de produtos, como /api/{slug}, continuam sendo servidas pelo frontend.

8. Abra o aplicativo e entre

Abra estes endereços no navegador:

PáginaEndereçoO que é
Site públicohttp://127.0.0.1:5055Marketplace e site de marketing.
Plano de controlehttp://127.0.0.1:5055/admin/Admin do Django e operações do FastRestful.
Documentação da APIhttp://127.0.0.1:5056/api/docs/Swagger UI para a API da plataforma.
Verificação de integridadehttp://127.0.0.1:5056/api/health/readyProntidão para verificações de implantação.

Entre no plano de controle com admin / Admin12345!.

Lista de verificação da primeira execução

  • O site público carrega e o catálogo do marketplace fica visível.
  • O plano de controle abre e você consegue entrar como admin.
  • Configurações do site, Planos da plataforma e a seção de conteúdo do site abrem sem erros.
  • Uma conta de consumidor consegue criar um aplicativo e uma chave de API.
  • Uma requisição pelo gateway aparece nos logs de requisição.

O que fazer agora

Problemas comuns de instalação

SintomaCausa provávelCorreção
python3.11: command not foundO Python 3.11 não está instalado ou não está no PATH.Instale o Python 3.11, reabra o terminal e execute a verificação novamente.
npm ci falha com um erro de engineO Node.js é anterior ao 22.13.Instale o Node 22.13+ e execute npm ci novamente.
ModuleNotFoundError: djangoO ambiente virtual não está ativo.Execute source .venv/bin/activate dentro de backend/.
Erro de FIELD_ENCRYPTION_KEYA chave está ausente ou não foi colada corretamente.Gere uma nova chave Fernet e cole o valor completo sem aspas.
A porta 5055 ou 5056 já está em usoOutro processo está usando a porta.Interrompa o outro processo ou escolha novas portas e atualize FRONTEND_URL, os valores de CORS e CSRF.
A página carrega, mas as chamadas de API falhamO backend não está em execução.Inicie o terminal 1 com runserver e confirme a URL de integridade.
O login de administrador é rejeitadoO seed de demonstração não foi executado ou um banco de dados diferente está em uso.Execute seed_demo ou crie sua própria conta com python3.11 manage.py createsuperuser.
Redefinição local. Se você quiser recomeçar do zero apenas na sua máquina local, pare o backend, exclua backend/db.sqlite3, depois execute novamente migrate e os comandos de seed. Nunca exclua um banco de dados de produção.
Comece aqui8 min de leitura

Início rápido: sua primeira requisição pelo gateway

Passe de uma instalação local limpa a uma chamada de API com medição. Você assinará uma API de demonstração, criará uma chave, enviará uma requisição e verá o evento de uso e o log de requisição.

Antes de começar: conclua Instalação e mantenha os dois terminais em execução. O backend deve estar em 127.0.0.1:5056 e o frontend em 127.0.0.1:5055.

1. Entre e escolha um espaço de trabalho

Abra http://127.0.0.1:5055 e entre com admin / Admin12345!, ou registre uma nova conta. Um espaço de trabalho (organização) agrupa seus aplicativos, chaves, assinaturas e faturas.

O espaço de trabalho ativo é enviado no cabeçalho X-Organization nas chamadas de API. O console do navegador o define automaticamente. Quando você chama a API por conta própria, deve incluí-lo, a menos que a requisição use uma chave de API em vez de uma sessão de navegador.

2. Assine um produto

Abra o marketplace, escolha um produto com uma versão ativa e selecione um plano. O produto SignalStack incluído no seed tem uma versão 2.4.0 ativa e três planos.

Se o plano for gratuito, a ativação é imediata. Se o plano for pago, o FastRestful abre o provedor de pagamento configurado. Um redirecionamento do navegador nunca concede acesso por si só: a assinatura só é ativada depois que um webhook assinado do provedor liquida a primeira fatura.

Ainda não tem um provedor de pagamento? Use um plano gratuito para sua primeira requisição. Para vender planos pagos, siga Gateways de pagamento, passo a passo primeiro.

3. Crie um aplicativo e uma chave

No console do consumidor, crie um aplicativo e depois emita uma chave de API. A chave bruta é exibida uma única vez, então copie-a imediatamente para um gerenciador de senhas ou para um arquivo .env local.

formato da chave bruta
fr_live_<random-secret>

# Store it in a secret manager or local .env file.
# Never commit it to a repository or paste it into a public issue.

Os escopos são full, execute ou read. Escolha o escopo mais restrito que funcione. Se perder a chave, revogue-a e emita uma nova; a chave antiga deixa de funcionar imediatamente.

4. Envie uma requisição pelo gateway

Substitua fr_live_… pela chave que você acabou de criar. Este exemplo usa o produto SignalStack incluído no seed e seu alias de caminho.

curl via alias de caminho do produto
curl --request GET \
  --url 'http://127.0.0.1:5055/api/v1/signal-stack/v2/deliveries?limit=10' \
  --header 'X-API-Key: fr_live_…' \
  --header 'Idempotency-Key: quickstart-001'

Com o roteamento por host do produto ativado, a mesma requisição usa https://{product-slug}.{FASTRESTFUL_API_HOST_SUFFIX}/.... Ambas as portas de entrada compartilham a mesma assinatura, cota, limite de taxa, idempotência, medição e pipeline de log de requisição.

Aba de teste da API do FastRestful com lista de endpoints, banner de gateway seguro e controles de requisição em tempo real
A página pública da API mantém o testador, o contrato do endpoint e o contexto da requisição em uma única aba.

5. Inspecione o resultado

  • Evento de uso: registrado no servidor com status e latência.
  • Contador mensal: incrementado para aplicação da cota e excedente.
  • Log de requisição: prévias de requisição e resposta com dados sensíveis ocultados, visíveis ao consumidor e ao fornecedor.
  • Painel: requisições, taxa de sucesso, gasto, latência, principais APIs e atividade recente.

Abra o painel do consumidor e o log de requisição. Você deve ver a requisição que acabou de fazer. Se não vir, verifique no terminal que executa o backend se há um traceback.

6. Publique uma versão (opcional)

No estúdio de fornecedor, abra a bancada de um produto, importe um contrato OpenAPI para uma versão de rascunho, reconcilie a documentação dos endpoints, execute o diff, envie para revisão e promova. Uma versão ativa exige um contrato OpenAPI não vazio e compatível, além de um catálogo de endpoints que corresponda exatamente.

Para o ciclo de vida completo, leia Produtos de API e versões.

Se a requisição falhar

RespostaO que costuma significarO que fazer
401A chave está ausente, revogada ou malformada.Copie a chave completa novamente. Não inclua aspas nem espaço no final.
403A assinatura está inativa ou o escopo da chave é muito restrito.Confirme que o plano está ativo e que a chave tem escopo execute ou full.
404O método e o caminho não correspondem à versão ativa.Verifique o endpoint na página da API e confirme que a versão está ativa.
429A cota do plano ou o limite de taxa foi excedido.Leia retry_after e aguarde, ou use um plano maior.
Erro de CORS ou CSRF no navegadorA origem do navegador não é confiável.Adicione a origem do frontend a CORS_ALLOWED_ORIGINS e CSRF_TRUSTED_ORIGINS. Chamadas ao gateway que usam X-API-Key não usam cookies do navegador.
Comece aqui14 min de leitura

Configuração sem sobrecarga

A maioria das instalações precisa apenas de um pequeno conjunto de configurações para funcionar. Comece pelo mínimo abaixo e depois adicione as integrações que você realmente usa. As tabelas longas mais adiante são referência, não uma lista de verificação.

Onde ficam as configurações

LocalUse paraQuando se aplica
backend/.envSegredos, banco de dados, Redis, chaves de pagamento, SSO e armazenamento.Reinicie o backend após alterá-lo.
Admin → Gateways de pagamentoCredenciais de pagamento e repasse.Substitui os valores correspondentes de .env campo a campo. Sem reinicialização.
Admin → Newsletter → Configurações de e-mailProvedor de e-mail de campanha e identidade do remetente.Substitui o remetente do ambiente para campanhas.
Admin → Configurações do siteBranding, navegação, roteamento por host, modo de manutenção e comportamento do site.Aplica-se imediatamente, a menos que a configuração esteja em cache ou incorporada ao frontend.
Variáveis de build do frontendValores de NEXT_PUBLIC_*, como a URL pública da API.Incorporadas no momento do build. Recompile o frontend após alterá-las.

Configurações locais mínimas

Depois de copiar .env.example, estes são os únicos valores que você precisa alterar para a demonstração local:

backend/.env
DJANGO_DEBUG=True
DJANGO_SECRET_KEY=<generated-random-value>
FIELD_ENCRYPTION_KEY=<generated-fernet-key>
DATABASE_URL=sqlite:///db.sqlite3
FRONTEND_URL=http://localhost:5055
CORS_ALLOWED_ORIGINS=http://localhost:5055,http://127.0.0.1:5055
CSRF_TRUSTED_ORIGINS=http://localhost:5055,http://127.0.0.1:5055

Gere as duas chaves com os comandos em Instalação → Criar o arquivo de configuração do backend.

Configurações mínimas de produção

Produção adiciona PostgreSQL, Redis, um hostname real e origens HTTPS. Substitua cada placeholder pelos seus próprios valores.

ambiente do backend em produção
DJANGO_DEBUG=False
DJANGO_SECRET_KEY=<50-plus-random-characters>
DJANGO_ALLOWED_HOSTS=api.example.com,www.example.com
DATABASE_URL=postgresql://user:password@db-host:5432/fastrestful
REDIS_URL=redis://redis-host:6379/0
FRONTEND_URL=https://www.example.com
CORS_ALLOWED_ORIGINS=https://www.example.com
CSRF_TRUSTED_ORIGINS=https://www.example.com
FIELD_ENCRYPTION_KEY=<fernet-key>
Não use SQLite em produção. Quando DJANGO_DEBUG=False, o FastRestful exige PostgreSQL e uma URL Redis compartilhada. Consulte Implantação para a sequência completa.

Como alterar configurações com segurança

  1. Altere uma integração por vez.

    Configure, teste e verifique antes de passar para o próximo provedor. Isso torna as falhas óbvias.

  2. Edite backend/.env no servidor.

    Não edite arquivos dentro de um contêiner em execução que será substituído. Mantenha os segredos no armazenamento de segredos da sua plataforma de implantação sempre que possível.

  3. Reinicie o backend e os workers.

    As alterações de ambiente são lidas na inicialização do processo. Reinicie o Gunicorn, o worker do Celery e o beat do Celery após editar .env.

  4. Recompile o frontend para alterações de NEXT_PUBLIC_*.

    Valores públicos do frontend são compilados no build. Reiniciar o frontend não é suficiente.

  5. Execute a ação de teste do provedor.

    Use o checkout de teste, o e-mail de teste ou o log de entregas de webhook antes de enviar tráfego real.

Referência principal de ambiente

VariávelPadrãoFinalidade
DJANGO_SECRET_KEYchave apenas para desenvolvimentoDeve ter 50 ou mais caracteres em produção.
DJANGO_DEBUGTrueDefina False em produção. Ativa comportamento de cookie seguro, HSTS e HTTPS.
DJANGO_ALLOWED_HOSTSlocalhost,127.0.0.1,testserverHostnames separados por vírgula. Inclua hosts de API com curinga ao usar subdomínios de produto.
DATABASE_URLsqlite:///db.sqlite3SQLite localmente; PostgreSQL em produção. Produção falha sem PostgreSQL.
REDIS_URLvazioCache compartilhado e broker padrão do Celery. Obrigatório em produção.
CELERY_BROKER_URLREDIS_URLURL de broker separado opcional.
FRONTEND_URLhttp://localhost:5055Origem pública do frontend, base de retorno do checkout e fallback de rastreamento. Deve ser HTTPS em produção.
FRONTEND_PREVIEW_URLFRONTEND_URLURL base usada pelas prévias de ativos personalizados do admin.
FIELD_ENCRYPTION_KEYvazioChave Fernet para chaves de API criptografadas e segredos de provedores. Obrigatória em produção.
CORS_ALLOWED_ORIGINSlocal 3000/5055/5173Origens de navegador separadas por vírgula autorizadas a chamar a API.
CSRF_TRUSTED_ORIGINSespelha CORSOrigens de navegador com credenciais confiáveis para requisições que alteram estado.
SECURE_REFERRER_POLICYstrict-origin-when-cross-originCabeçalho de política de referenciador.

Ambiente do frontend

VariávelFinalidade
NEXT_PUBLIC_API_URLOrigem da API Django para implantações separadas. Omita para caminhos na mesma origem.
NEXT_PUBLIC_SITE_URLOrigem pública canônica do frontend para metadados, sitemap, robots e URLs Open Graph.
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYChave publicável do Stripe para UI de cartão incorporada. O Stripe.js é carregado da CDN; sem dependência npm.
FASTRESTFUL_DEV_BACKEND_URLDestino opcional do proxy de desenvolvimento. O padrão é http://127.0.0.1:5056.
FASTRESTFUL_ADMIN_ORIGINSOrigens de admin permitidas para prévias de ativos personalizados em iframe.

Gateway e roteamento por host

VariávelPadrãoFinalidade
GATEWAY_TIMEOUT_SECONDS15Tempo limite de requisição ao upstream.
GATEWAY_MAX_BODY_BYTES262144Tamanho máximo do corpo de entrada.
GATEWAY_MAX_UPLOAD_BYTES5242880Limite combinado de upload multipart.
GATEWAY_MAX_RETRIES1Orçamento de tentativas para falhas transitórias seguras.
GATEWAY_RETRY_BACKOFF_SECONDS0.05Intervalo entre tentativas.
GATEWAY_IDEMPOTENCY_TTL_SECONDS86400Tempo de vida do cache de replay.
GATEWAY_CIRCUIT_FAILURE_THRESHOLD3Falhas antes da abertura do circuito.
GATEWAY_CIRCUIT_WINDOW_SECONDS60Janela de contagem de falhas.
GATEWAY_CIRCUIT_COOLDOWN_SECONDS30Tempo de espera com circuito aberto.
GATEWAY_TRUSTED_PROXY_CIDRSvazioProxies confiáveis autorizados a fornecer cabeçalhos de IP do cliente.
GATEWAY_MEDIA_PREVIEW_BYTES1500000Tamanho máximo da prévia de mídia em base64 capturada para o console.
FASTRESTFUL_API_HOST_SUFFIXvazioAtiva o roteamento direto {product}.{suffix}. Quando vazio, mantém apenas o alias de caminho.

Autenticação e SSO

VariávelFinalidade
SSO_ISSUERURL do emissor OIDC. Sem valor, o botão OIDC fica oculto.
SSO_CLIENT_ID / SSO_CLIENT_SECRETCredenciais do cliente OIDC.
SSO_SAML_ENABLEDAtiva endpoints SP do SAML 2.0. Requer lxml.
SSO_SAML_ENTITY_IDID de entidade do provedor de serviços SAML. Padrão fastrestful.
SSO_SAML_SSO_URLURL de SSO do provedor de identidade.
SSO_SAML_IDP_CERTCertificado X.509 PEM do provedor de identidade.
SSO_SAML_AUDIENCERestrição de público-alvo opcional.
ORGANIZATION_INVITE_DAYSValidade do convite em dias. Padrão 7.

E-mail e newsletter

VariávelFinalidade
EMAIL_BACKENDBackend de console em modo de depuração; backend SMTP em produção por padrão.
EMAIL_HOST / EMAIL_PORTHost e porta SMTP.
EMAIL_HOST_USER / EMAIL_HOST_PASSWORDCredenciais SMTP.
EMAIL_USE_TLSAtiva STARTTLS. Padrão true.
ALERT_FROM_EMAILIdentidade padrão do remetente e dos alertas.
NEWSLETTER_TRACKING_BASE_URLOrigem pública para pixels de rastreamento, redirecionamentos de clique e links de cancelamento de inscrição. Usa FRONTEND_URL como fallback.

As configurações SMTP da newsletter também podem ser armazenadas no estúdio de newsletter e substituem o remetente do ambiente para campanhas. Consulte Estúdio de newsletter.

Referência de pagamentos e repasses

Procurando instruções de configuração? As variáveis abaixo são apenas referência. Para instruções passo a passo no painel de cada provedor, eventos de webhook, verificação de webhooks do PayPal e checkouts de teste, use Gateways de pagamento, passo a passo.
Grupo de variáveisVariáveis
StripeSTRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_API_BASE opcional
PayPalPAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, PAYPAL_WEBHOOK_ID, PAYPAL_ENV, PAYPAL_API_BASE opcional
FlutterwaveFLUTTERWAVE_PUBLIC_KEY, FLUTTERWAVE_SECRET_KEY, FLUTTERWAVE_WEBHOOK_SECRET, FLUTTERWAVE_API_BASE opcional
PaystackPAYSTACK_PUBLIC_KEY, PAYSTACK_SECRET_KEY, PAYSTACK_WEBHOOK_SECRET, PAYSTACK_API_BASE opcional
RazorpayRAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET, RAZORPAY_WEBHOOK_SECRET, RAZORPAY_API_BASE opcional
RepassesPAYOUT_PROVIDER é uma lista de permissões opcional separada por vírgulas: stripe, paypal

Admin → Gateways de pagamento armazena as mesmas credenciais no banco de dados. Um registro no banco substitui os campos de ambiente um a um, e desativá-lo desliga o provedor em todos os lugares mesmo que as chaves de ambiente continuem definidas.

Armazenamento de mídia e especificações

VariávelFinalidade
MEDIA_STORAGElocal ou s3.
MEDIA_S3_BUCKET / MEDIA_S3_REGIONBucket e região do S3.
MEDIA_S3_ENDPOINT_URLEndpoint personalizado compatível com S3.
MEDIA_S3_ACLACL direta opcional do S3. Omita ao usar CloudFront com OAC.
MEDIA_CDN_DOMAINDomínio do CloudFront ou de outro CDN.
MEDIA_CDN_DISTRIBUTION_IDAtiva ações de invalidação por ativo.
SPEC_STORAGEdb ou s3 para blobs de contrato OpenAPI.
SPEC_S3_BUCKET / SPEC_S3_PREFIX / SPEC_S3_REGIONDestino e prefixo do blob de especificação. O modo S3 precisa de boto3.

SHORTLINK_BASE_URL define a origem pública dos links curtos, por exemplo https://go.example.com. Quando vazio, recorre a NEWSLETTER_TRACKING_BASE_URL e depois a FRONTEND_URL. O comando checklinks pode ser agendado via cron ou Celery beat.

Precedência e recarregamentos

  • Valores de ambiente fornecem padrões de implantação; registros de gateway no admin substituem campo a campo.
  • Alterações no ambiente do backend exigem reinicialização do processo. Algumas configurações em cache (sinalizador de manutenção, localidade de origem) são limpas automaticamente ao salvar o modelo.
  • Variáveis públicas do frontend são incorporadas no momento do build. Recompile após alterar valores de NEXT_PUBLIC_*.
  • Após alterar lib/i18n/*.json, execute npm run export:i18n e reinicie o backend para que o pacote de origem em cache fique atualizado.
Implantar e operar16 min de leitura

Implantação

Leve o FastRestful de uma demonstração local com SQLite para uma implantação em produção com PostgreSQL, Redis, armazenamento de objetos, um servidor WSGI, TLS e um frontend estático. A plataforma foi projetada para ser auto-hospedada.

Antes de implantar

  • Um nome de domínio e acesso ao DNS para os hosts do frontend e da API.
  • Um banco de dados PostgreSQL 16 e uma instância Redis 7.
  • Terminação HTTPS, seja no seu proxy ou na borda.
  • Um DJANGO_SECRET_KEY gerado e um FIELD_ENCRYPTION_KEY com backup.
  • Um plano para armazenamento de mídia: disco local é aceitável apenas para um teste em servidor único; use armazenamento compatível com S3 em implantações reais.
  • Um destino de backup fora do servidor da aplicação.

Ordem recomendada

  1. Implante o backend e o banco de dados.

    Faça /api/health/ready passar antes de mexer no frontend.

  2. Implante o frontend.

    Aponte-o para a origem da API e adicione a origem do frontend às configurações de CORS e CSRF.

  3. Configure e-mail e armazenamento.

    Use Integrações externas. Verifique um e-mail de teste e um upload de teste.

  4. Conecte pagamentos somente quando estiver pronto para vender.

    Use Gateways de pagamento, passo a passo e conclua primeiro o checkout de teste.

  5. Ative a licença e agende os heartbeats.

    Use Licenciamento e atualizações oficiais.

  6. Configure backups e monitoramento.

    Use Backups e atualizações e Observabilidade.

Topologia recomendada

topologia de produção
Internet
  │
  ├── app.example.com ──► frontend (static/CDN or Node runtime)
  │                           │
  │                           └── /api/* ──► reverse proxy ──► Gunicorn / Django
  │
  ├── api.example.com ──► reverse proxy ──► Gunicorn / Django
  ├── *.api.example.com ──► wildcard product gateway
  │
  ├── PostgreSQL 16 (primary)
  ├── Redis 7 (cache + Celery broker)
  ├── S3 + CloudFront (media, optional specs)
  └── Celery worker + beat (billing, moderation, email, availability)

Você pode servir o frontend e a API na mesma origem ou separá-los. Se separar, defina NEXT_PUBLIC_API_URL como a origem da API, adicione a origem do frontend a CORS_ALLOWED_ORIGINS e CSRF_TRUSTED_ORIGINS, e defina FRONTEND_URL como a origem pública do frontend.

Docker Compose

O repositório inclui um arquivo Compose com PostgreSQL, a API, o Redis e perfis opcionais de worker/beat.

O Compose executa a stack do backend, não o frontend. Crie o frontend separadamente e hospede-o no seu host estático ou CDN, ou adicione um serviço de frontend ao seu próprio arquivo Compose. O contêiner da API executa migrações e o Gunicorn na porta 8000.
shell
export DJANGO_SECRET_KEY="$(openssl rand -base64 64 | tr -d '\n')"
export FIELD_ENCRYPTION_KEY="$(python3.11 -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())')"
export DJANGO_ALLOWED_HOSTS="api.example.com,.api.example.com"
export CORS_ALLOWED_ORIGINS="https://app.example.com"
export CSRF_TRUSTED_ORIGINS="https://app.example.com"
export FRONTEND_URL="https://app.example.com"
export POSTGRES_PASSWORD="$(openssl rand -hex 24)"

docker compose up --build -d
docker compose --profile scheduler up --build -d

Execute migrações e seeds dentro do contêiner da API depois que o banco de dados estiver saudável:

shell
docker compose exec api python manage.py migrate --noinput
docker compose exec api python manage.py seed_demo
docker compose exec api python manage.py seed_apis
docker compose exec api python manage.py seed_docs
docker compose exec api python manage.py collectstatic --noinput
Altere a senha do seed imediatamente para qualquer implantação exposta à internet. Não execute seeds de demonstração em produção a menos que você pretenda manter os dados de demonstração.

Configuração manual de produção

Backend

shell
cd /srv/fastrestful/backend
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install gunicorn>=22.0 boto3 django-storages  # optional: S3 media

cp .env.example .env
# Fill production values, then:
python3.11 manage.py migrate --noinput
python3.11 manage.py collectstatic --noinput
python3.11 manage.py check --deploy

Gunicorn + systemd

/etc/systemd/system/fastrestful.service
[Unit]
Description=FastRestful Django API
After=network.target postgresql.service redis.service

[Service]
User=fastrestful
Group=fastrestful
WorkingDirectory=/srv/fastrestful/backend
EnvironmentFile=/srv/fastrestful/backend/.env
ExecStart=/srv/fastrestful/backend/.venv/bin/gunicorn \
  config.wsgi:application \
  --bind 127.0.0.1:8000 \
  --workers 3 \
  --timeout 60
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
shell
sudo systemctl daemon-reload
sudo systemctl enable --now fastrestful
sudo systemctl status fastrestful

Proxy reverso Nginx

/etc/nginx/sites-available/fastrestful
server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

    client_max_body_size 8m;

    location /static/ {
        alias /srv/fastrestful/backend/staticfiles/;
        expires 30d;
        access_log off;
    }

    location /media/ {
        alias /srv/fastrestful/backend/media/;
        expires 7d;
        access_log off;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 65s;
    }
}

server {
    listen 80;
    server_name api.example.com;
    return 301 https://$host$request_uri;
}

Host de produto com curinga

/etc/nginx/sites-available/fastrestful-products
server {
    listen 443 ssl http2;
    server_name *.api.example.com;

    ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;  # product slug comes from this host
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Adicione um registro DNS curinga, emita um certificado curinga com um desafio DNS-01 e inclua o host curinga em DJANGO_ALLOWED_HOSTS. Defina FASTRESTFUL_API_HOST_SUFFIX=api.example.com.

Build e hospedagem do frontend

shell
export NEXT_PUBLIC_API_URL="https://api.example.com"
export NEXT_PUBLIC_SITE_URL="https://app.example.com"
export NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_live_..."
npm run build

Implante a saída do build no seu host estático ou runtime compatível com Node. O build é autossuficiente e não requer um plano de controle de site gerenciado. Se usar Cloudflare, vincule D1/Images somente quando a implantação precisar desses recursos.

Arquivos estáticos e de mídia

  • Estáticos: execute collectstatic, sirva /static/ pelo Nginx ou pela sua CDN.
  • Mídia local: sirva /media/ pelo Nginx em implantações pequenas.
  • Mídia em produção: use S3 + CloudFront com OAC, mantenha o bucket privado, defina MEDIA_STORAGE=s3 e não defina MEDIA_S3_ACL, a menos que sirva diretamente do S3.
  • Especificações: deixe SPEC_STORAGE=db para uma instalação pequena; use S3 para arquivos de contrato maiores.

Verificações de integridade

SondaEsperado
GET /api/health/liveLiveness do processo. Sem dependência de banco de dados.
GET /api/health/readyProntidão do banco de dados + cache compartilhado. Retorna 503 com a dependência com falha.
GET /api/schema/Esquema OpenAPI. Útil para verificações de fumaça na implantação.

Atualizações e backups

sequência segura de atualização
# 1. Back up PostgreSQL and media
pg_dump --format=custom "$DATABASE_URL" > fastrestful-$(date +%F).dump

# 2. Pull code and install dependencies
git pull --ff-only
pip install -r backend/requirements.txt
npm ci

# 3. Apply migrations and rebuild assets
python3.11 backend/manage.py migrate
npm run build

# 4. Restart API and workers
sudo systemctl restart fastrestful
sudo systemctl restart fastrestful-worker fastrestful-beat

# 5. Verify
curl -f https://api.example.com/api/health/ready

Critérios de produção

  • DJANGO_DEBUG=False, segredo de 50+ caracteres, chave Fernet válida.
  • PostgreSQL, Redis, origens HTTPS e hosts permitidos explícitos.
  • Credenciais de administrador alteradas; usuários de demonstração removidos ou desativados.
  • Webhooks de pagamento e repasse registrados com o segredo assinado correto.
  • Credenciais de SMTP e provedores testadas; domínio do remetente autenticado.
  • S3/CloudFront configurados se uploads de mídia estiverem ativados.
  • Worker do agendador + beat em execução ou equivalentes em cron instalados.
  • Backups testados por restauração em um ambiente separado.
  • O monitoramento cobre prontidão, taxa de 5xx, latência do gateway, falhas de webhook e profundidade da fila.
  • Páginas legais, termos, privacidade e contato de suporte revisados pelo operador.
Implantar e operar10 min de leitura

Operações

Liquidação agendada, entrega de notificações, verificações de disponibilidade, retenção de telemetria, sondas de integridade e os comandos operacionais que mantêm o FastRestful saudável.

Agenda do Celery

TarefaAgendaFinalidade
settle_period1º dia de cada mês, 00:05 UTCGerar faturas e repasses do período anterior.
escalate_moderation_casesA cada 15 minutosEncaminhar casos de moderação e recursos em atraso.
deliver_notification_email_queueA cada 15 minutosEntregar e-mails de notificação na fila com recuperação de reservas obsoletas.
schedule_daily_api_availability_checksDiariamente, 00:20 UTCDisparar verificações de disponibilidade dos produtos.
shell
celery -A config worker -l info -Q billing,celery
celery -A config beat -l info

Sem um broker, o Celery executa em modo eager no processo. Em produção, defina REDIS_URL ou CELERY_BROKER_URL e execute worker e beat como serviços separados.

Comandos operacionais

ComandoO que faz
generate_invoices --period YYYY-MMGeração idempotente de faturas para um período.
generate_payouts --period YYYY-MMGeração idempotente de repasses, com reembolsos e taxas aplicados.
prune_telemetryRetenção para logs de requisição e eventos de uso.
check_api_availabilityExecutar verificações de integridade dos produtos manualmente.
escalate_moderationEncaminhar casos em atraso sem o beat do Celery.
deliver_notification_emailsEsvaziar o backlog de e-mails de notificação na fila.
checklinksVerificar novamente destinos de links curtos em busca de URLs quebradas.
shell
python3.11 manage.py generate_invoices --period 2026-10
python3.11 manage.py generate_payouts --period 2026-10
python3.11 manage.py prune_telemetry --request-log-days 90 --usage-event-days 365
python3.11 manage.py check_api_availability
python3.11 manage.py checklinks --limit 200 --timeout 6

Modo de manutenção

Ative Operações da plataforma → Modo de manutenção em Configurações do site. O frontend retorna uma página 503 com a marca, as chamadas de API e de gateway dos clientes retornam uma resposta maintenance_mode legível por máquina com Retry-After: 300, e documentação/Swagger ficam pausados.

O admin da equipe, as sondas de integridade, os callbacks do provedor de identidade e os webhooks assinados de pagamento/repasse permanecem disponíveis para que a plataforma possa se recuperar com segurança e os provedores não sejam descartados.

Monitoramento

  • Sonda de prontidão para banco de dados + cache compartilhado.
  • Taxa de 5xx da API e latência p95 por namespace.
  • Taxa de erros de upstream do gateway e eventos de circuito aberto.
  • Fila de falhas de webhook e exceções de repasse.
  • Profundidade da fila do Celery e heartbeat do beat.
  • Taxas de devolução/reclamação de e-mail e taxa de cancelamento de inscrição.
  • Crescimento do armazenamento de mídia e taxa de acerto do cache da CDN.
  • Conexões PostgreSQL, consultas lentas, disco e sucesso dos backups.

Backups

DadosEstratégia de backup
PostgreSQLDump lógico noturno mais backups contínuos do provedor. Teste a restauração trimestralmente.
Mídia no S3Ative o versionamento do bucket e a replicação entre regiões, se necessário.
Especificações no bancoIncluídas nos backups do PostgreSQL.
Segredos de ambienteArmazene em um gerenciador de segredos; faça backup com controles de acesso e histórico de rotação.
Evidências de auditoriaRetenha conforme a política; jobs de exportação podem criar arquivos imutáveis.

Notas de escalonamento

  • Execute várias instâncias Gunicorn/Django atrás de um balanceador de carga; mantenha sessões e cache no Redis.
  • Execute workers do Celery separadamente dos processos web e escale as filas de cobrança e padrão de forma independente.
  • Os limites de taxa do gateway usam o cache compartilhado; uma indisponibilidade do cache retorna um 503 que permite nova tentativa em vez de falhar aberto.
  • Use pool de conexões PostgreSQL se o número de workers crescer.
  • Mova a mídia para S3/CloudFront antes que o tráfego torne o ciclo de vida do disco local doloroso.
  • Mantenha a retenção de telemetria explícita; logs de requisição e eventos de uso não foram feitos para crescer para sempre.
Implantar e operar12 min de leitura

Segurança

Comportamento crítico de segurança no FastRestful: custódia de chaves, isolamento de inquilinos, proteção SSRF do gateway, política de origem do navegador, armazenamento de segredos, evidências de auditoria e a lista de verificação de endurecimento para produção.

Custódia de chaves de API

  • Chaves brutas são retornadas exatamente uma vez na criação ou rotação. Nunca são renderizadas novamente por serializadores ou pelo admin.
  • Formas de armazenamento: um prefixo de busca, um hash SHA-256 para comparação em tempo constante e uma cópia criptografada com Fernet para uso do gateway no servidor.
  • A rotação revoga a chave antiga e emite uma nova em uma única chamada. Uma chave revogada não pode ser usada para emitir substitutas.
  • Os escopos restringem o acesso: full, execute ou read. Atualizações só podem restringir um escopo, nunca ampliá-lo.
  • Uma chave é vinculada ao seu aplicativo e assinatura; ela não pode atravessar aplicativos ou espaços de trabalho.

Isolamento de inquilinos

  • X-Organization seleciona o inquilino ativo. As permissões no servidor verificam novamente a associação para cada objeto.
  • As leituras de fornecedores têm escopo duplo: um fornecedor vê seus próprios produtos, assinaturas, faturas e logs; um consumidor vê apenas seu próprio espaço de trabalho.
  • Campos de propriedade são imutáveis pela API.
  • Serializadores públicos são explícitos, não listas de permissão de um modelo privado. Métricas operacionais e campos privados ficam fora das respostas anônimas.
  • Superusuários podem ler entre inquilinos para suporte, mas gravações ainda exigem o escopo proprietário correto, exceto em operações explícitas da plataforma.

Segurança do gateway

  • Os upstreams devem usar HTTPS, resolver para endereços públicos, permanecer no host original e evitar padrões de travessia.
  • Redirecionamentos não são seguidos. As respostas DNS são verificadas e o IP público selecionado é fixado pela conexão TLS para evitar rebinding.
  • Tempos limite, limites de corpo, limites de upload e tentativas limitadas são aplicados antes do encaminhamento.
  • Segredos de fornecedores são anexados apenas no servidor; eles nunca chegam ao navegador.
  • Chaves de idempotência são armazenadas como hashes de token com uma impressão digital da requisição e uma resposta com dados sensíveis ocultados, nunca corpos de requisição brutos.
  • As prévias de resposta têm tamanho limitado e ocultam Set-Cookie, Authorization e X-API-Key.
  • Uma indisponibilidade do cache compartilhado retorna um 503 que permite nova tentativa antes da reserva de cota; o gateway não falha aberto.

Segurança do navegador e de origem

  • Produção aplica HTTPS, HSTS, cookies seguros e uma política de referenciador estrita.
  • CORS_ALLOWED_ORIGINS e CSRF_TRUSTED_ORIGINS devem nomear exatamente o frontend público.
  • Cookies CSRF são legíveis pelo frontend porque a sessão compartilhada do Django é usada para gravações no admin e no console; nunca os exponha entre origens.
  • Ativos CSS/JS personalizados são conteúdo confiável do operador. Use um nonce CSP, pré-visualize antes da ativação e revise o histórico de revisões.
  • O modo de manutenção mantém callbacks de provedores e rotas do provedor de identidade disponíveis.

Gerenciamento de segredos

SegredoArmazenamento
DJANGO_SECRET_KEYGerenciador de segredos ou arquivo de ambiente legível apenas pelo usuário do serviço. Faça rotação de forma deliberada.
FIELD_ENCRYPTION_KEYGerenciador de segredos. Faça backup: perdê-lo torna chaves criptografadas e segredos de provedores irrecuperáveis.
Chaves de provedoresRegistros de gateway no admin ou ambiente. Prefira registros no admin para rotação operacional sem implantação.
Credenciais SMTPEstúdio de newsletter ou ambiente. Use uma identidade de envio dedicada.
URL do banco de dadosGerenciador de segredos. Use TLS e um role de banco de dados com privilégio mínimo.

Endurecimento da autenticação

  • Ative a autenticação de dois fatores obrigatória para a equipe e, opcionalmente, para todas as contas em Configurações do site.
  • Use OIDC ou SAML para identidade corporativa; o login por senha pode permanecer como fallback.
  • Mantenha tokens de acesso de curta duração (15 minutos) e tokens de atualização rotativos na lista de bloqueio após a rotação.
  • Convites são armazenados como hash, de uso único, vinculados ao e-mail e expiram após sete dias.
  • O acesso ao admin exige is_staff; o espaço de trabalho admin não é uma função de equipe da plataforma.
  • Respostas de redefinição de senha não revelam se uma conta existe.

Auditoria e evidências

  • Ações de admin, decisões de moderação, alterações de estado de cobrança, reconciliação de repasses, alterações de configurações e recuperação de contas geram eventos de auditoria.
  • Os recibos de eventos do provedor são somente de acréscimo e rejeitam conflitos de payload, o que torna as novas tentativas seguras.
  • Os lançamentos do razão são somente de acréscimo. Reembolsos após o repasse criam lançamentos de clawback e de reversão de tarifas.
  • Tarefas de exportação de auditoria oferecem retenção e revisão sem acesso direto ao banco de dados.

Checklist de produção

shell
DJANGO_DEBUG=0 \
DATABASE_URL=postgresql://… \
REDIS_URL=redis://… \
FRONTEND_URL=https://app.example.com \
DJANGO_ALLOWED_HOSTS=api.example.com,.api.example.com \
CORS_ALLOWED_ORIGINS=https://app.example.com \
CSRF_TRUSTED_ORIGINS=https://app.example.com \
DJANGO_SECRET_KEY=<50+ chars> \
FIELD_ENCRYPTION_KEY=<fernet key> \
python3.11 manage.py check --deploy
  • Contas de demonstração e dados de seed removidos da produção.
  • Dois fatores obrigatórios para a equipe; SSO testado de ponta a ponta.
  • Webhooks de pagamento verificados com o segredo assinado do provedor.
  • Bucket de mídia privado; CDN OAC configurado; sem acesso de gravação com curinga.
  • Backups criptografados e com restauração testada.
  • Os logs excluem segredos e ocultam dados de payload dos consumidores.
  • Imagens de dependências e contêineres corrigidas em uma agenda.
  • Contato de incidentes e canal de divulgação de vulnerabilidades publicados.
Implantar e operar16 min de leitura

Licenciamento & atualizações oficiais

O FastRestful é código-fonte licenciado vendido pela Dakidarts. Conecte a chave de compra ao LicenseHub para verificar versões oficiais assinadas, instalar uma versão mais recente ou reverter para uma anterior. O gateway em execução continua funcionando se o LicenseHub estiver temporariamente indisponível.

O que a central de atualizações faz

TarefaOnde
Conecte a licença de compra e veja as datas de direitoAdmin → Atualizações de software (/admin/updates/)
Verifique, baixe, valide e instale versõesA mesma página, ou o comando fastrestful_update
Renove a concessão da licença em uma agendapython3.11 manage.py license_heartbeat
Veja o histórico de atualizações e os logs do instaladorAtividade de download & instalação na página de atualizações
Veja o status da licença na visão geral de operaçõesAdmin → Visão geral de operações
Antes de atualizar: faça um backup do banco de dados e da mídia. O atualizador cria snapshots do código-fonte e do SQLite por padrão, mas um backup verificado continua sendo sua rede de segurança. Consulte Backups & atualizações.

Parte 1 — Ative sua licença

  1. Compre o FastRestful e abra o painel da Dakidarts.

    Acesse Painel → Licenças e copie a chave completa. Ela começa com DK-FRST-….

  2. Abra a central de atualizações.

    Entre como equipe e abra https://your-domain/admin/updates/. A barra lateral chama isso de Atualizações de software.

  3. Cole a chave de licença.

    Use a chave completa, incluindo todos os hífens. Ela é criptografada em repouso e apenas uma forma mascarada é exibida após a ativação.

  4. Confirme a URL do LicenseHub.

    O padrão é https://dakidarts.com. Mantenha-o a menos que a Dakidarts forneça uma origem diferente. HTTPS é obrigatório fora da depuração local.

  5. Escolha o ambiente.

    Produção consome um assento de produção. Staging e Desenvolvimento consomem assentos fora de produção. Escolha o que corresponde a esta instalação.

  6. Opcionalmente, adicione o domínio de produção.

    Por exemplo, api.example.com. Isso ajuda a identificar a instalação no portal do cliente.

  7. Escolha um canal de versão.

    Comece com Stable. Use Beta ou Preview apenas em um ambiente de teste descartável.

  8. Clique em Ativar licença.

    A ativação cria ou reutiliza um installation_id persistente e vincula um assento. A página então mostra a edição, as janelas de atualização e suporte, a contagem de ativações e o último heartbeat.

Se a ativação falhar, o erro será exibido na página. As causas mais comuns são chave expirada, limite de assentos ou chave copiada com um espaço no final.

Parte 2 — Instale uma atualização pelo admin

  1. Faça um backup.

    Faça backup do PostgreSQL, da mídia, do .env e de quaisquer arquivos personalizados. Confirme a restauração do backup antes de precisar dele.

  2. Abra Admin → Atualizações de software.

    A página mostra a versão em execução, a versão instalada e o status da conexão.

  3. Clique em Verificar atualizações.

    O LicenseHub retorna todas as versões cobertas pela sua janela de atualização: mais recentes, atual e anteriores.

  4. Clique em Baixar & preparar na versão desejada.

    O FastRestful baixa cada artefato, verifica o SHA-256, verifica a assinatura do manifesto Ed25519 e extrai o pacote em FASTRESTFUL_UPDATE_DIR/<version>/bundle/.

  5. Clique em Instalar.

    O admin inicia um worker independente para que migrações ou um build não excedam o tempo limite da requisição web. A página é atualizada durante a execução.

  6. Aguarde “instalado” e o banner de reinicialização.

    O processo em execução ainda usa o código antigo até você reiniciar. A página mostra Instalado … · reinicialização necessária.

  7. Reinicie os serviços.

    Reinicie o Gunicorn ou seu servidor de aplicações, o worker e o beat do Celery, e o processo de frontend se ele rodar no mesmo host. Use seu gerenciador de serviços, não a página do admin. Exemplos de comandos systemd:

    exemplo systemd
    sudo systemctl restart fastrestful
    sudo systemctl restart fastrestful-worker fastrestful-beat
    # restart your frontend process too if it runs on this host
  8. Verifique.

    Confirme a versão na central de atualizações, abra /api/health/ready e faça uma requisição de teste pelo gateway.

Pacotes grandes: a Baixar & preparar ação é executada dentro da requisição do admin. Para uma versão grande em uma conexão lenta, use o comando de download da CLI no shell do servidor para que um timeout da web não a interrompa.

Parte 3 — Atualize pela linha de comando

Use isso quando o admin estiver indisponível ou quando você quiser a instalação em uma sessão de terminal.

shell
cd /srv/fastrestful/backend
source .venv/bin/activate

python3.11 manage.py fastrestful_update status
python3.11 manage.py fastrestful_update check
python3.11 manage.py fastrestful_update download --release-version 1.2.0
python3.11 manage.py fastrestful_update install --release-version 1.2.0

A instalação pela CLI é síncrona e imprime o log do instalador capturado. A instalação pelo admin é assíncrona. Ambas verificam os mesmos artefatos assinados antes de executar o instalador.

Mantenha a concessão da licença em dia

A concessão do certificado é de 24 horas. Um heartbeat a cada seis horas deixa margem para indisponibilidades transitórias. Uma verificação diária basta para descobrir novas versões.

exemplo de cron
17 */6 * * * cd /srv/fastrestful/backend && /srv/fastrestful/.venv/bin/python manage.py license_heartbeat --check-updates >> /var/log/fastrestful-license.log 2>&1

Um heartbeat com falha registra o erro no admin, mas não interrompe o gateway.

Parte 4 — Reverta para uma versão anterior

  1. Abra a lista de versões.

    Versões anteriores cobertas pela sua janela de atualização aparecem ao lado da versão atual.

  2. Clique em Instalar versão anterior na versão desejada.

    A central de atualizações marca a instalação com essa versão. Esta é uma instalação normal de versão, não um reset destrutivo.

  3. Reinicie os serviços.

    O processo reiniciado passa a usar a árvore de código-fonte anterior.

  4. Verifique o banco de dados.

    Se a versão mais recente aplicou uma migração irreversível, restaure o backup do banco de dados anterior à atualização. Mantenha o backup do banco e o backup do código juntos.

Snapshots de código-fonte ficam em FASTRESTFUL_UPDATE_DIR/backups/. O SQLite é copiado; o PostgreSQL é exportado com pg_dump quando disponível. Um rollback que atravesse uma migração irreversível ainda pode precisar da restauração do banco de dados.

Parte 5 — Canais e ambientes

CanalUse para
stableVersões de produção. Este é o padrão.
betaVersões de prévia para um ambiente de staging.
previewBuilds iniciais. Use apenas com um ambiente descartável.

O canal fica armazenado na conexão e é enviado em cada verificação. Altere-o na página de atualizações ou durante a ativação.

Parte 6 — Docker e implantações baseadas em imagem

O instalador padrão atualiza um checkout de código-fonte. Em um contêiner, as alterações no sistema de arquivos não são duráveis quando o contêiner é recriado. Escolha uma destas opções:

  • Crie e implante uma nova imagem a partir da versão baixada no seu pipeline normal.
  • Defina um FASTRESTFUL_UPDATE_INSTALL_SCRIPT personalizado que baixe a nova imagem ou dispare a implantação da sua plataforma.
  • Use fastrestful_update download para buscar e verificar a versão e, em seguida, aplique-a fora do contêiner em execução.
Nunca monte o diretório de atualizações sobre os arquivos de código-fonte da aplicação. O atualizador grava pacotes e backups nesse diretório; sobrepor o código-fonte pode corromper ambos.

Parte 7 — Configuração

VariávelPadrãoFinalidade
FASTRESTFUL_VERSION1.0.0Versão mostrada ao LicenseHub e comparada com as versões. Builds oficiais definem este valor.
DAKIDARTS_LICENSEHUB_URLhttps://dakidarts.comOrigem do LicenseHub para ativação, heartbeats e verificações.
FASTRESTFUL_UPDATE_DIR<repo>/updatesDiretório privado de preparação para artefatos, pacotes e backups.
FASTRESTFUL_UPDATE_TIMEOUT_SECONDS900Tempo máximo de execução do instalador.
FASTRESTFUL_UPDATE_INSTALL_SCRIPTinstall.shCaminho do instalador relativo ao pacote extraído.
FIELD_ENCRYPTION_KEYobrigatório em produçãoCriptografa a chave de compra. Faça backup dela. Perdê-la exige reconectar a licença.

Parte 8 — Solução de problemas

SintomaO que verificar
license_key_requiredA chave está ausente ou foi apagada. Reconecte em /admin/updates/.
activation_not_foundA instalação foi desativada no portal do cliente ou substituída. Reconecte ou reative.
updates_expiredRenove o direito de atualização no portal da Dakidarts. A instalação existente continua em execução.
activation_limitDesative uma instalação antiga no portal da Dakidarts e tente novamente.
Falha na soma de verificação do downloadTente novamente. Verifique se há um proxy ou cache corrompendo artefatos. Não execute o pacote.
Nenhum script de instalaçãoO pacote de versão está incompleto. Use seu fluxo de implantação ou recrie a versão com scripts/install-release.sh.
A instalação foi bem-sucedida, mas a versão não mudouReinicie o backend, os workers e o frontend. O processo em execução ainda usa o código anterior.
As verificações de integridade falham após uma atualizaçãoLeia o log de atualização e restaure o backup do código-fonte anterior em FASTRESTFUL_UPDATE_DIR/backups/ e o backup correspondente do banco de dados, se necessário.

Parte 9 — Notas de segurança

  • Apenas membros da equipe com licensing.change_licenseconnection podem abrir a central de atualizações.
  • A proteção CSRF é aplicada em todas as ações.
  • A chave de compra é criptografada em repouso e nunca é exibida após a ativação.
  • Os downloads usam tokens de curta duração do LicenseHub. Os artefatos são verificados por SHA-256 e pela assinatura do manifesto Ed25519 antes da extração ou execução.
  • A extração de arquivos rejeita caminhos absolutos, travessia, links simbólicos e hardlinks.
  • Mantenha o diretório de atualizações privado. Não o sirva pelo Nginx nem pelo armazenamento de objetos.
  • Uma indisponibilidade do LicenseHub ou uma janela de atualização expirada não deixam um gateway em execução offline. A revogação bloqueia downloads oficiais; ela não interrompe remotamente uma instalação perpétua existente.

Para mantenedores de versões

As versões oficiais são artefatos privados do LicenseHub. Um pacote pode conter um arquivo compactado de código-fonte ou vários artefatos (código-fonte, migrações, frontend, documentação). Todos os artefatos são extraídos no mesmo diretório bundle/ na ordem retornada pelo LicenseHub.

O pacote deve incluir um instalador em um destes caminhos:

  • install.sh
  • scripts/install.sh
  • scripts/install-release.sh
  • o caminho em FASTRESTFUL_UPDATE_INSTALL_SCRIPT

scripts/install-release.sh neste repositório é a implementação de referência. Copie-o para a raiz do pacote de versão como install.sh. Ele cria snapshots do código-fonte e do banco de dados anteriores, sobrepõe o novo código-fonte, preserva arquivos locais de segredos/mídia/banco de dados, instala dependências do backend, executa migrações do Django e imprime o requisito de reinicialização.

O instalador recebe FASTRESTFUL_RELEASE_DIR, FASTRESTFUL_BUNDLE_DIR, FASTRESTFUL_UPDATE_DIR, FASTRESTFUL_APP_ROOT, FASTRESTFUL_FROM_VERSION, FASTRESTFUL_TO_VERSION, FASTRESTFUL_PYTHON e FASTRESTFUL_INSTALL_LOG. Ele é executado com bash, um tempo limite e um log capturado. Deve ser não interativo e deixar a instalação recuperável em caso de falha.

Implantar & operar8 min de leitura

Solução de problemas

As falhas que as equipes encontram com mais frequência — e as verificações que as resolvem.

A API retorna 401 ou 403

  • 401: token bearer ausente/expirado, X-API-Key ausente ou uma chave que não resolve. Atualize o JWT ou emita uma nova chave.
  • 403: autenticado, mas sem permissão. Verifique a participação no espaço de trabalho, a função, o status da assinatura e o direito ao endpoint.
  • Chamadas externas ao gateway devem usar X-API-Key (ou uma chave bearer fr_live_…), não um JWT do painel.
  • Chamadas do painel precisam de Authorization: Bearer <access> e X-Organization: <uuid>.

Requisições do navegador falham com CORS ou CSRF

  • Adicione a origem exata do frontend a CORS_ALLOWED_ORIGINS e CSRF_TRUSTED_ORIGINS.
  • Use o mesmo esquema, host e porta que o navegador usa. localhost e 127.0.0.1 são origens diferentes.
  • Recrie o frontend após alterar NEXT_PUBLIC_API_URL ou NEXT_PUBLIC_SITE_URL.
  • Para chamadas ao gateway a partir de origens arbitrárias de consumidores, configure regexes de CORS ou CORS permissivo apenas no host da API do produto.

A requisição ao gateway falha

SintomaVerifique
429Cota mensal ou limite de taxa por minuto atingido. Inspecione o uso da assinatura e os limites do plano.
409Chave de idempotência reutilizada com dados de requisição diferentes. Use uma nova chave ou repita a requisição original.
503 com nova tentativaCache compartilhado indisponível, circuit breaker aberto ou modo de manutenção. Verifique o Redis e a disponibilidade da plataforma.
Falha de TLS/DNS no upstreamConfirme que o upstream do fornecedor é HTTPS público e resolve sem redirecionamentos.
Chave rejeitadaA chave foi revogada, expirou, está vinculada a outra aplicação ou sua assinatura não está ativa.
Endpoint não encontradoMétodo + caminho devem corresponder a um endpoint na versão ativa. Verifique a versão e o direito do plano.

As migrações falham ou o esquema está desatualizado

shell
python3.11 manage.py showmigrations
python3.11 manage.py makemigrations --check --dry-run
python3.11 manage.py migrate --noinput
python3.11 manage.py check

Se uma migração conflitar com um branch personalizado, resolva em uma cópia do banco de dados e nunca edite uma migração já aplicada em produção.

A mídia retorna 404 ou um recurso de CDN desatualizado

  • Modo local: confirme que MEDIA_ROOT permite gravação e que o Nginx serve /media/.
  • Modo S3: verifique permissões do bucket, região, endpoint e origem da CDN. Mantenha o bucket privado ao usar OAC.
  • Após substituir um recurso, purgue a distribuição da CDN ou use a ação de purga no admin.
  • Confirme que MEDIA_CDN_DOMAIN não tem caminho final e corresponde ao certificado.

Os webhooks de pagamento estão falhando

Comece pela configuração específica do provedor em Gateways de pagamento, passo a passo. Depois, verifique estes itens na ordem:

  1. A URL é exata e pública. Registre /api/v1/billing/stripe-webhook/, /paypal-webhook/, /flutterwave-webhook/, /paystack-webhook/ ou /razorpay-webhook/ no mesmo hostname que os usuários acessam. Localhost não funcionará.
  2. Valores de teste e produção não estão misturados. Uma chave de teste com um ID de webhook de produção (ou o contrário) falha em todas as entregas.
  3. O segredo é do tipo correto. O Stripe precisa do segredo de assinatura do endpoint (whsec_…), não da chave secreta da API. O Flutterwave precisa do hash secreto que você criou. O Razorpay precisa do segredo de assinatura do webhook.
  4. O PayPal usa um ID de webhook, não um segredo. Coloque em PAYPAL_WEBHOOK_ID o ID do mesmo app e ambiente do PayPal. O FastRestful verifica cada evento com a API de verificação de assinatura do PayPal. Um ID ausente ou incorreto retorna Bad signature. Consulte Solução de problemas de webhook do PayPal.
  5. O Paystack geralmente não precisa de segredo de webhook. Deixe PAYSTACK_WEBHOOK_SECRET em branco; o FastRestful verifica com PAYSTACK_SECRET_KEY.
  6. Os tipos de evento estão selecionados. Um webhook que é acessível, mas não está inscrito no evento de liquidação, deixa a fatura em aberto.
  7. Seu proxy preserva os cabeçalhos do provedor. Nginx, Cloudflare e balanceadores de carga devem encaminhar os cabeçalhos de assinatura sem alterações.
  8. O valor e a moeda correspondem. O FastRestful rejeita uma liquidação que não corresponde à fatura.
  9. Verifique o recibo. Abra Admin → Eventos de pagamento; IDs de evento duplicados são reconhecidos sem liquidação dupla. Reenvie o evento com falha pelo painel do provedor.

O e-mail não está sendo enviado

  • O desenvolvimento usa o backend de e-mail de console. Verifique a saída do terminal.
  • A produção usa SMTP por padrão. Teste host, porta, TLS, usuário e senha.
  • As configurações de newsletter podem substituir o remetente do ambiente; confirme o provedor ativo no estúdio.
  • Verifique SPF, DKIM e DMARC antes de culpar a fila. Taxas de rejeição e reclamação suprimem envios futuros.

Problemas de build ou rotas do frontend

  • Execute npm run typecheck e npm test antes de depurar a implantação.
  • Uma página em branco alimentada pela API geralmente significa que a origem da API está inacessível ou o CORS está incompleto.
  • Se as páginas públicas de produto funcionam, mas /api/{slug} retorna 404, confirme que o proxy encaminha apenas namespaces do Django e não a rota de produto pertencente ao frontend.
  • Após alterações de i18n, execute npm run export:i18n e reinicie o Django.

As edições de localidade não aparecem

  • O francês incluído carrega do bundle do frontend; as sobreposições do admin vêm da API de localidade ativa.
  • Salve a sobreposição do admin, confirme que a localidade está ativa e faça uma atualização forçada no navegador.
  • Após alterar fr.json, exporte o código-fonte do backend e reinicie a API para limpar o cache do processo.
  • Verifique se há uma preferência de localidade obsoleta no localStorage.
Plataforma10 min de leitura

Autenticação & acesso

O FastRestful usa tokens de acesso JWT de curta duração, refresh tokens rotativos e uma sessão de navegador compartilhada do Django. O mesmo login pode abrir o console do consumidor, o estúdio do fornecedor e o admin da equipe.

Fluxos de autenticação

FluxoEndpointResultado
Login com senhaPOST /api/v1/auth/token/Token de acesso + refresh e uma sessão do Django.
CadastroPOST /api/v1/auth/register/Usuário, espaço de trabalho opcional, par de JWT e sessão.
RefreshPOST /api/v1/auth/token/refresh/Novo token de acesso; a rotação coloca o refresh token antigo na lista de bloqueio.
LogoutPOST /api/v1/auth/logout/Limpa a sessão; opcionalmente, bloqueia um refresh token fornecido.
Redefinição de senhaPOST /api/v1/auth/password-reset/E-mail de redefinição que não revela a existência da conta.
Confirmação de redefiniçãoPOST /api/v1/auth/password-reset/confirm/Um token de uso único substitui a senha.
OIDC/api/v1/auth/sso/status|start|callback/Login e troca com o provedor.
SAML 2.0/api/v1/auth/saml/status|metadata|start/Fluxo do provedor de serviço com binding POST.

Cabeçalhos da requisição

requisição da API do painel
Authorization: Bearer <access-token>
X-Organization: <organization-uuid>
Content-Type: application/json
requisição externa ao gateway
X-API-Key: fr_live_…
# backwards-compatible alternative:
Authorization: Bearer fr_live_…

O painel usa JWT mais o cabeçalho explícito do espaço de trabalho ativo. Consumidores externos usam uma chave de API de produto com assinatura. Um JWT do painel não deve ser usado como chave de API do cliente, e uma chave de API bruta não deve ser enviada aos endpoints do painel.

Funções no espaço de trabalho

FunçãoAcesso típico
ProprietárioControle total do espaço de trabalho, cobrança, equipe e operações de fornecedor. O último proprietário é protegido.
AdministradorEquipe, aplicações, chaves, assinaturas, publicação, cobrança e suporte.
DesenvolvedorAplicações, chaves, testes de endpoint e publicação de produtos quando permitido.
CobrançaFaturas, formas de pagamento, cupons, reembolsos e repasses.
VisualizadorAcesso somente leitura aos recursos do espaço de trabalho.

O acesso da equipe da plataforma é separado: exige is_staff e nunca decorre de uma função admin no espaço de trabalho. As permissões da equipe são aplicadas por modelo Django e ação administrativa.

Autenticação de dois fatores

  • Inscrição de autenticador TOTP com QR/URI de provisionamento e códigos de recuperação de uso único.
  • Os códigos de recuperação são exibidos uma vez, armazenados com hash e regenerados em conjunto.
  • Um superusuário pode exigir dois fatores para todas as contas em Configurações do site.
  • O acesso ao admin pode ser bloqueado até a confirmação da inscrição; o console mostra uma tela dedicada de configuração.

Convites para o espaço de trabalho

Proprietários e administradores convidam por e-mail e atribuem uma função. Os tokens de convite são armazenados com hash, de uso único, vinculados ao e-mail, expiram após sete dias e podem ser reenviados ou revogados. Aceitar um convite exige um usuário autenticado com o e-mail correspondente e pode reativar uma participação inativa.

API da equipe
GET  /api/v1/organization-invites/
POST /api/v1/organization-invites/          {"email": "...", "role": "developer"}
POST /api/v1/organization-invites/{id}/resend/
POST /api/v1/organization-invites/{id}/revoke/
POST /api/v1/auth/invites/accept/           {"token": "..."}

Configuração de SSO

OIDC

backend/.env
SSO_ISSUER=https://login.example.com/realms/acme
SSO_CLIENT_ID=fastrestful
SSO_CLIENT_SECRET=...
FRONTEND_URL=https://app.example.com

Registre a URL de callback https://api.example.com/api/v1/auth/sso/callback/ no provedor de identidade. Destinos relativos seguros e tokens de convite sobrevivem ao ciclo completo.

SAML 2.0

backend/.env
SSO_SAML_ENABLED=1
SSO_SAML_ENTITY_ID=fastrestful
SSO_SAML_SSO_URL=https://idp.example.com/sso
SSO_SAML_IDP_CERT="-----BEGIN CERTIFICATE-----..."
SSO_SAML_AUDIENCE=fastrestful

Instale lxml antes de habilitar o SAML. Os metadados são servidos em /api/v1/auth/saml/metadata/; configure o IdP com a URL do serviço de consumo de asserção desde o endpoint de início.

Ciclo de vida da chave de API

  • Crie uma chave na aplicação selecionada; a chave completa aparece uma vez.
  • Envie-a como X-API-Key ou uma credencial bearer fr_live_….
  • Faça a rotação para revogar a chave antiga e emitir uma nova de forma atômica.
  • Revogue imediatamente quando uma credencial for perdida; não há recuperação do valor completo.
  • Use o escopo execute ou read para privilégio mínimo quando o cliente não precisar de gerenciamento completo.
Plataforma12 min de leitura

Produtos de API & versões

Um produto é a identidade pública. Uma versão é o contrato imutável. Endpoints, documentação, política do gateway e direitos do plano acompanham essa fronteira de versão.

O modelo de produto

EntidadeControla
CategoryNavegação e agrupamento no marketplace.
ApiProductNome público, slug, logo, categoria, fornecedor, upstream, visibilidade, site, verificação de integridade.
ApiVersionNúmero da versão, registro de alterações, contrato OpenAPI, status, notas da versão.
EndpointMétodo, caminho, resumo, parâmetros, documentação de requisição/resposta, políticas, limite de taxa.
PlanPreço, intervalo, cota, excedente, teste, recursos, direito a endpoints.

Crie e publique um produto

  1. No estúdio do fornecedor, crie o produto com nome, slug, categoria, tagline, README e URL do upstream.
  2. Crie uma versão em rascunho e importe um contrato OpenAPI 3.x ou Swagger 2.0.
  3. Revise o catálogo de endpoints reconciliado e a documentação dos endpoints.
  4. Crie pelo menos um plano público e configure cotas, limites de taxa e direitos.
  5. Execute a prontidão de publicação; todas as quatro verificações devem passar.
  6. Envie a versão para revisão e depois promova-a para ativa.
  7. Publique o produto. A versão ativa anterior é desativada automaticamente.

Importação OpenAPI

shell
curl --request POST \
  --url 'https://api.example.com/api/v1/products/signal-stack/import-spec/' \
  --header 'Authorization: Bearer <access>' \
  --header 'X-Organization: <vendor-org-uuid>' \
  --header 'Content-Type: application/json' \
  --data '{
    "version": "2.5.0",
    "openapi": { "openapi": "3.0.3", "paths": { } },
    "changelog": "Add delivery scheduling."
  }'

A importação cria ou atualiza uma versão em rascunho, reconcilia as linhas de endpoint a partir de paths, informa endpoints criados/atualizados/excluídos e preserva os campos de política do gateway nas operações mantidas. A importação de versão ativa é rejeitada.

Prontidão para publicação

EtapaRequisito
Metadados da listagemNome, slug, tagline, categoria e README estão presentes.
UpstreamUm upstream HTTPS válido está configurado.
Versão ativaPelo menos uma versão ativa com um contrato OpenAPI compatível e endpoints correspondentes.
Plano públicoPelo menos um plano público está disponível.

Máquina de estados da versão

fluxo de estados
draft ──submit_review──► review ──promote──► live ──deprecate──► deprecated
  └───────────────────────promote────────────────┘

# product visibility
draft ──publish──► public ──unpublish──► draft
                       └──retire──► retired ──restore──► draft
  • As versões ativas são imutáveis: edições são rejeitadas no nível do modelo e do serializer.
  • A promoção desativa a versão ativa anterior para manter a invariante de uma única versão ativa.
  • O contrato e o catálogo de endpoints devem corresponder exatamente antes da promoção.
  • Os direitos de endpoint do plano são remapeados por método + caminho quando uma nova versão ativa substitui a anterior.

Relatórios de mudanças incompatíveis

shell
GET /api/v1/versions/{version_id}/diff/?against={previous_version_id}

# Review added, removed, and changed operations before promotion.
# A release can be promoted only after the contract is validated.

Roteamento de hosts de produtos

Todo produto publicado tem duas portas de entrada equivalentes:

AmbienteURL base
Produção com DNS curingahttps://{product-slug}.api.example.com
Host único / desenvolvimentohttps://api.example.com/api/v1/{product-slug}

O middleware lê o primeiro rótulo do host como o slug do produto. Aliases de caminho são registrados como uma rota final, então rotas de API nomeadas sempre vencem. Produtos desconhecidos retornam 404 com uma dica; requisições sem chave para produtos desconhecidos retornam 401 para evitar enumeração.

Direitos do plano

  • all concede todos os endpoints públicos da versão ativa.
  • selected concede apenas o conjunto de endpoints configurado.
  • Os direitos selecionados são aplicados no gateway, incluindo requisições de caminho bruto que ignoram o catálogo de endpoints.
  • Os termos comerciais são bloqueados após a primeira assinatura; crie um plano substituto em vez de editar um plano com assinatura.
Plataforma11 min de leitura

Gateway & medição

O gateway é o único caminho para os upstreams dos fornecedores. Ele resolve o produto, autentica a chave, aplica a política de assinatura e plano, reserva cota, encaminha com segurança, mede o uso e grava um rastreamento redigido.

Pipeline de requisição

  1. Resolva o produto pelo host ou alias de caminho e encontre o endpoint da versão ativa por método + caminho.
  2. Autentique com um JWT/sessão do painel ou uma credencial externa X-API-Key / bearer fr_live_….
  3. Resolva a assinatura do produto e da aplicação. Apenas assinaturas ativas e em período de teste.
  4. Valide o vínculo da chave e registre last_used_at. Uma chave não pode cruzar aplicações ou espaços de trabalho.
  5. Reserve a cota no contador mensal e aplique limites de taxa por endpoint de forma atômica.
  6. Execute verificações de segurança de rede: HTTPS, DNS público, sem redirecionamentos, sem travessia, IP fixado.
  7. Encaminhe com tempo limite, limites de corpo, limites de upload e novas tentativas limitadas.
  8. Meça: evento de uso, contador mensal, log de requisição redigido e prévia da resposta.

Chamadas diretas ao produto

host do produto
curl --request POST \
  --url 'https://signal-stack.api.example.com/v2/deliveries' \
  --header 'X-API-Key: fr_live_…' \
  --header 'Content-Type: application/json' \
  --data '{"recipient":"maya@example.dev","template":"welcome"}'
alias de caminho
curl --request GET \
  --url 'https://api.example.com/api/v1/signal-stack/v2/deliveries?limit=10' \
  --header 'X-API-Key: fr_live_…'

O envelope legado POST /api/v1/gateway/execute/ permanece para integrações e ferramentas de console existentes. Novos snippets usam a forma direta.

Cabeçalhos do gateway

CabeçalhoFinalidade
X-API-KeyChave de produto com assinatura. Recomendada para clientes externos.
Authorization: Bearer fr_live_…Forma de chave compatível com versões anteriores.
Idempotency-KeyChave segura para replay de respostas concluídas, TTL padrão de 24 horas.
X-OrganizationSomente para o espaço de trabalho do painel; não para clientes externos do gateway.

Cotas e limites de taxa

  • A cota mensal é reservada antes do encaminhamento e conta as requisições roteadas, incluindo falhas no upstream.
  • Cota ilimitada remove apenas o teto mensal; o limite por minuto e o direito a endpoints continuam valendo.
  • O limite de taxa por endpoint usa uma janela fixa atômica em cache. Uma indisponibilidade do cache compartilhado retorna 503 com nova tentativa antes da reserva de cota.
  • O excedente é cobrado por 1.000 requisições quando configurado; zero significa apenas alerta.

Idempotência e novas tentativas

  • As respostas concluídas são armazenadas com um hash SHA-256 do token, impressão digital da requisição e resposta redigida pelo TTL configurado.
  • Replays retornam a resposta armazenada antes da cota ou de chamadas ao upstream.
  • Reutilizar uma chave com dados de requisição diferentes retorna 409.
  • As novas tentativas são limitadas e só se aplicam a falhas transitórias seguras; métodos não idempotentes não são repetidos às cegas.
  • Um circuit breaker abre após falhas repetidas no upstream e retorna 503 com nova tentativa durante o resfriamento.

SSRF e segurança de rede

  • Os upstreams devem ser HTTPS públicos. Respostas de DNS privadas, loopback, link-local e inseguras são rejeitadas.
  • O caminho deve permanecer no host original. A travessia .. é rejeitada.
  • Redirecionamentos não são seguidos.
  • O endereço DNS público selecionado é fixado durante a conexão TLS para evitar rebinding.
  • Os segredos do fornecedor são anexados no lado do servidor e nunca retornados ao navegador.
  • As prévias de resposta têm limite de tamanho e ocultam cookies, autorização e cabeçalhos de chave de API.

Logs de requisição e medição

  • Visão do consumidor: histórico de requisições do espaço de trabalho ativo com busca, filtros de status e exportação CSV.
  • Visão do fornecedor: logs no nível da requisição em todos os produtos controlados, com consumidor, endpoint, latência, status e prévias redigidas.
  • Eventos de uso: código de status, latência, assinatura, produto, endpoint e carimbo de data/hora.
  • Contadores mensais: modelo de leitura de cotas e análises.
  • A retenção é configurável com prune_telemetry.

Ambiente do gateway

Todos os tempos limite, limites, orçamentos de novas tentativas, limites de circuit breaker, TTL de idempotência, CIDRs de proxy confiáveis, limites de prévia de mídia e o sufixo do host do produto são definidos pelo ambiente. Consulte Configuração para a tabela completa.

Plataforma14 min de leitura

Cobrança & repasses

A cobrança tem dois trabalhos: permitir que consumidores paguem por planos de API e permitir que o operador da plataforma cobre pela capacidade do espaço de trabalho. Ambos usam os mesmos provedores, faturas e liquidação de webhooks.

Conectando um provedor pela primeira vez? Leia Gateways de pagamento, passo a passo primeiro. Ele cobre o painel do provedor, URLs de webhook, o ID de webhook do PayPal e checkouts de teste. Este guia explica o que acontece depois que o provedor está conectado.

Os dois planos de cobrança

Pense nisso como dois caixas registradores separados:

PlanoQuem pagaQuem recebeO que libera
Planos de API do fornecedorConsumidor da APIFornecedor da API, menos a taxa do marketplaceRequisições a esse produto, sujeitas à sua cota e limite de taxa.
Planos da plataformaProprietário do espaço de trabalhoOperador da plataformaContagem de espaços de trabalho e limites de listagem de APIs na própria plataforma.

Ambos usam checkout hospedado, webhooks assinados, faturas e conciliação. A receita de APIs dos fornecedores entra na liquidação de repasses; a receita de assinaturas da plataforma não.

Planos do fornecedor

  • Intervalo mensal ou anual, moeda, preço e descrição.
  • Cota mensal, limite de taxa por minuto, excedente por 1.000 requisições, dias de teste.
  • Até oito linhas públicas de recursos e um plano público recomendado.
  • Direito a endpoints all ou selected.
  • Os termos comerciais são bloqueados após a primeira assinatura; use um plano substituto para alterações.

Checkout e liquidação

  1. O consumidor seleciona um plano e aceita os termos da API.
  2. Uma assinatura pendente e a fatura do primeiro período são criadas.
  3. O provedor configurado abre o checkout hospedado.
  4. O provedor envia um webhook assinado após o pagamento.
  5. O FastRestful verifica a assinatura, registra o evento do provedor, valida valor/moeda e marca a fatura como paga.
  6. O direito só é ativado após a liquidação. Redirecionamentos do navegador nunca concedem acesso.
webhooks do provedor
POST /api/v1/billing/stripe-webhook/
POST /api/v1/billing/paypal-webhook/
POST /api/v1/billing/flutterwave-webhook/
POST /api/v1/billing/paystack-webhook/
POST /api/v1/billing/razorpay-webhook/

Suporte a provedores

Cada provedor abaixo tem um guia de configuração passo a passo em Gateways de pagamento, passo a passo.

ProvedorCheckoutRepassesCredenciais
StripeSim, PaymentIntent incorporado ou hospedadoTransferências do ConnectSTRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
PayPalAssinaturas do BillingRepassesID/segredo do cliente, ID do webhook
FlutterwaveCheckout hospedadoConciliação manualSegredo público/secreto/webhook
PaystackCheckout hospedadoConciliação manualSegredo público/secreto/webhook
RazorpayCheckout hospedadoConciliação manualID da chave/segredo/segredo do webhook

Admin → Gateways de pagamento substitui as credenciais do ambiente campo a campo. Desativar um registro de gateway desliga esse provedor em todos os lugares, mesmo que as chaves de ambiente permaneçam.

Reembolsos

  • Fornecedores com permissão de cobrança reembolsam faturas pagas pelo gateway original.
  • Os reembolsos do Stripe são conciliados cumulativamente a partir de eventos de webhook; gateways hospedados confirmam de forma síncrona.
  • Chaves de idempotência e solicitações de reembolso pendentes tornam as novas tentativas seguras.
  • Reembolsos integrais marcam a fatura como reembolsada.
  • Reembolsos após o repasse acrescentam lançamentos de clawback de receita do fornecedor e de reversão proporcional de tarifas no razão.
  • Consumidores não podem se reembolsar; pagamentos manuais devem ser reembolsados pelo provedor.

Repasses

estado do repasse
pending ──► in_transit ──► paid
   │              │
   ├──► failed ◄──┘
   └──► reversed

# Only paid invoices settle. Refunds reduce the next transfer.
# Gross collected revenue is stored separately from net transfer.
# Provider event IDs are unique and retries are idempotent.
  • Configure um destino de fornecedor com PATCH /api/v1/orgs/{id}/payout-provider/ (acct_… para Stripe ou e-mail para PayPal).
  • Inicie uma transferência com POST /api/v1/payouts/{id}/transfer/.
  • Concilie com POST /api/v1/payouts/{id}/reconcile/; estados estritos exigem um ID de transferência ou motivo de falha.
  • Os webhooks do Stripe conciliam transfer.created|paid|failed|reversed.

Assinaturas da plataforma

O modo multifornecedor deve estar ativado. O checkout de assinatura da plataforma fica indisponível enquanto o modo multivendor estiver desativado nas configurações do site. Ative-o antes de vender planos de espaço de trabalho.
  • Os planos da plataforma são gerenciados em Admin → Planos da plataforma; no máximo cinco planos.
  • Cada plano pode definir limites de espaços de trabalho próprios e de listagem de APIs, benefícios e uma recomendação.
  • Planos pagos permanecem não publicados até que um valor de exibição e um ID de preço recorrente correspondente no provedor sejam configurados.
  • As sessões de Checkout e do Portal de Cobrança são criadas no servidor com destinos fixos FRONTEND_URL.
  • A conciliação de assinaturas é somente leitura no admin, para que alterações da equipe não divirjam do provedor.

Comandos de liquidação

shell
python3.11 manage.py generate_invoices --period 2026-10
python3.11 manage.py generate_payouts --period 2026-10

# Both commands are idempotent and safe to rerun.

A tarefa mensal do Celery é executada no dia 1 às 00:05 UTC. Sem um broker, invoque os comandos manualmente.

Ambiente do provedor

Consulte Configuração → Pagamentos e repasses para cada variável. No mínimo: segredo/webhook do Stripe, cliente/webhook do PayPal ou o trio público/secreto/webhook do gateway hospedado. A interface de cartão do frontend também precisa de NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY.

Plataforma24 min de leitura

Gateways de pagamento, passo a passo

Conecte um provedor de pagamento real sem adivinhações. Cada seção de provedor tem duas partes: o que clicar no painel do provedor e depois o que inserir no FastRestful. O PayPal inclui um passo a passo completo de webhook, inclusive onde encontrar o ID de webhook que o FastRestful exige.

Antes de começar

Você precisa dePor quê
Uma URL HTTPS públicaTodo provedor precisa alcançar seu endpoint de webhook. localhost não funcionará em um painel de provedor real.
Uma conta de teste primeiroUse o modo sandbox/teste até que um pagamento de teste seja liquidado. Nunca depure com dinheiro real.
Acesso administrativoVocê configurará os provedores em Admin → Gateways de pagamento ou em backend/.env.
Um plano para venderOs planos de API do fornecedor são criados no estúdio do fornecedor. Os planos da plataforma são criados em Admin → Planos da plataforma.
Um provedor por vez. Configure o Stripe, faça um pagamento de teste e confirme que a fatura foi paga antes de adicionar o PayPal ou um gateway hospedado. Bugs de provedores são muito mais fáceis de encontrar quando apenas uma coisa mudou.
Planos gratuitos continuam funcionando sem um provedor. O checkout pago não abre até que pelo menos um gateway esteja ativado. Se o checkout exibir “Nenhum provedor de pagamento está configurado”, conclua primeiro uma seção de provedor abaixo.
Os painéis dos provedores mudam. Use estas etapas como um mapa, não como uma captura de tela. Se um rótulo de menu for diferente, procure o mesmo conceito: chaves de API, webhooks, produtos, preços ou repasses.

Como o dinheiro circula no FastRestful

  1. O FastRestful cria uma fatura.

    A assinatura e a fatura do primeiro período existem antes de o checkout abrir. Nada é marcado como pago ainda.

  2. Para planos pagos, o provedor abre o checkout.

    O cliente paga na página hospedada do provedor. O FastRestful armazena apenas a referência do checkout.

  3. O provedor envia um webhook assinado.

    O FastRestful verifica a assinatura, registra o evento uma vez e confere o valor e a moeda.

  4. A fatura é liquidada.

    Só então a assinatura é ativada e o direito começa. Um redirecionamento do navegador nunca concede acesso.

Os webhooks são a fonte da verdade. Se o cliente pagar mas o webhook nunca chegar, a fatura permanece aberta. O painel do provedor é o lugar para inspecionar e reenviar a entrega.

Onde ficam as credenciais

Você pode colocar credenciais em backend/.env ou em Admin → Gateways de pagamento. Os registros do admin são mais fáceis de rotacionar e substituem os valores de ambiente campo a campo. Desativar um registro do admin desliga o provedor em todos os lugares, mesmo que as chaves de ambiente ainda existam.

ProvedorCampo públicoCampo secretoCampo de webhook
Stripe—Chave secreta (sk_…)Segredo de assinatura (whsec_…)
PayPalID do clienteSegredo do clienteID do webhook (não é um segredo nem a URL)
FlutterwaveChave públicaChave secreta (FLWSECK-…)Hash secreto que você cria
PaystackChave pública (pk_…)Chave secreta (sk_…)Deixe em branco para usar a chave secreta
RazorpayID da chave (rzp_…)Segredo da chaveSegredo de assinatura do webhook
Os nomes dos campos no admin são genéricos. No formulário de gateway de pagamento, Chave pública significa o identificador público/de cliente do provedor, Chave secreta significa seu segredo privado de API, e Segredo do webhook significa o valor de assinatura do webhook. Para o PayPal, são Client ID, Client secret e Webhook ID, respectivamente.

Testando webhooks no seu notebook

Os provedores não conseguem alcançar http://127.0.0.1:5056. Use uma destas abordagens para testes locais.

Stripe CLI

  1. Instale e faça login no Stripe CLI.

    Siga o guia de instalação do Stripe CLI e depois execute stripe login e aprove o prompt do navegador.

  2. Encaminhe eventos para seu backend local.
    shell
    stripe listen --forward-to localhost:5056/api/v1/billing/stripe-webhook/
  3. Copie o segredo de assinatura impresso.

    A CLI imprime whsec_…. Coloque-o em STRIPE_WEBHOOK_SECRET ou no registro do Stripe no admin. Mantenha a CLI em execução.

  4. Dispare um evento de teste.
    shell
    stripe trigger checkout.session.completed
    stripe trigger invoice.paid

PayPal, Flutterwave, Paystack e Razorpay

Esses provedores precisam de uma URL HTTPS pública. Use um túnel como ngrok ou Cloudflare Tunnel e registre a URL do túnel no painel do provedor:

shell
# Example with ngrok
ngrok http 5056

# Use the generated https URL, for example:
# https://abc123.ngrok-free.app/api/v1/billing/paypal-webhook/

Vai mudar a URL do túnel depois? Atualize o painel do provedor e o destino de webhook do FastRestful juntos. Uma URL desatualizada é a causa mais comum de "pagamento aprovado, mas a fatura nunca foi fechada".

O PayPal também oferece um simulador de webhook no painel do desenvolvedor. Aponte-o para a URL do túnel e use o ID de webhook do mesmo app de sandbox para que o FastRestful possa verificar o evento simulado.

Escolhendo um provedor

ProvedorCheckoutRepassesMelhor opção para
StripeCheckout hospedado ou interface de cartão incorporadaTransferências do ConnectCartões globais, carteiras digitais e repasses automatizados a fornecedores.
PayPalPedidos do PayPal Checkout; PayPal Billing para planos da plataformaPayPal PayoutsCompradores que preferem saldos do PayPal, cartões e assinaturas do PayPal.
FlutterwaveCheckout hospedadoConciliação manualMercados africanos com métodos de pagamento locais.
PaystackCheckout hospedadoConciliação manualNigéria, Gana, Quênia e África do Sul.
RazorpayPayment LinksConciliação manualÍndia, com preços prioritariamente em INR.
Planos de fornecedor vs. planos da plataforma. As assinaturas de planos de API de fornecedores são cobradas por meio de faturas do FastRestful: o primeiro período abre um checkout hospedado, e as faturas seguintes são geradas pela tarefa de liquidação. As assinaturas da plataforma usam a cobrança recorrente do provedor: Stripe Prices ou PayPal Billing plans. O checkout de assinatura da plataforma também exige que o modo multivendor esteja ativado nas configurações do site. Eles são configurados em lugares diferentes.

Stripe, passo a passo

1. Crie e ative uma conta Stripe

  1. Crie uma conta Stripe e complete o perfil empresarial.
  2. Mantenha o Test mode ativado enquanto você integra. O botão fica na barra superior do Stripe Dashboard.
  3. Você pode fazer pagamentos de teste antes de o Stripe concluir a ativação da conta.

2. Copie as chaves de API

  1. Abra Developers → API keys.

    No Stripe Dashboard, abra Developers e depois API keys.

  2. Copie a chave secreta.

    Use primeiro a chave secreta de teste (sk_test_…). Coloque-a em STRIPE_SECRET_KEY ou no registro de administração do Stripe. Nunca coloque a chave secreta no código do frontend.

  3. Copie a chave publicável.

    Coloque a chave publicável de teste (pk_test_…) em NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY se quiser a interface de cartão incorporada. Recompile o frontend depois de alterá-la.

3. Adicione o endpoint de webhook do Stripe

  1. Abra Developers → Webhooks → Add endpoint.
  2. Defina a URL do endpoint.
    URL de produção ou staging
    https://api.example.com/api/v1/billing/stripe-webhook/
  3. Selecione os eventos que o FastRestful concilia.
    • checkout.session.completed
    • invoice.paid e invoice.payment_succeeded
    • invoice.payment_failed
    • customer.subscription.created, customer.subscription.updated, customer.subscription.deleted
    • charge.refunded
    • transfer.created, transfer.paid, transfer.failed, transfer.reversed (repasses)
  4. Copie o segredo de assinatura.

    O Stripe mostra um valor que começa com whsec_…. Este é STRIPE_WEBHOOK_SECRET. Não é a chave secreta da API.

O Stripe assina cada entrega. O FastRestful rejeita assinaturas expiradas e falha de forma segura quando STRIPE_WEBHOOK_SECRET está ausente, portanto um segredo de assinatura correto é obrigatório.

4. Adicione o Stripe no FastRestful

Abra Admin → Payment gateways e edite a linha Stripe (recomendado), ou use variáveis de ambiente.

Campo do FastRestfulValor do Stripe
ModoTeste até o sandbox funcionar; depois, use Live.
Chave secretask_test_… ou sk_live_…
Segredo do webhookwhsec_…

Se preferir usar variáveis de ambiente, defina STRIPE_SECRET_KEY e STRIPE_WEBHOOK_SECRET e reinicie o backend e os workers.

5. Planos da plataforma e Stripe Prices

Necessário apenas se você vender assinaturas da plataforma. Os planos de API dos fornecedores usam o preço do próprio produto e não precisam de um Stripe Price.

  1. Crie um Product no Stripe.

    Abra Product catalog → Add product. Dê a ele o nome do seu plano da plataforma.

  2. Adicione um Price recorrente.

    Use o valor, a moeda e o intervalo de cobrança exatos que o seu plano da plataforma exibe. Os preços mensal e anual devem ser Prices separados.

  3. Copie cada Price ID.

    Os Price IDs começam com price_….

  4. Cole-os no plano da plataforma.

    Abra Admin → Platform plans e preencha Stripe monthly price ID e Stripe annual price ID.

O FastRestful verifica o Price em relação ao valor, à moeda e ao intervalo do plano no checkout. Uma divergência retorna 409 com uma explicação, em vez de cobrar o valor errado.

6. Stripe Connect para repasses a fornecedores

  1. Ative o Connect no Stripe e crie uma conta conectada para cada fornecedor que você paga.
  2. Copie o ID da conta conectada (acct_…).
  3. Armazene-o como destino do fornecedor com PATCH /api/v1/orgs/{id}/payout-provider/ ou nas configurações de repasse do fornecedor.
  4. Opcionalmente, defina PAYOUT_PROVIDER=stripe para permitir apenas repasses via Stripe.
  5. Mantenha os eventos transfer.* selecionados no webhook do Stripe.

7. Teste o Stripe

  1. Use o cartão de teste 4242 4242 4242 4242, qualquer validade futura e qualquer CVC.
  2. Conclua um checkout e confirme que a fatura fica paga.
  3. Confirme que a assinatura fica ativa e que a chave do consumidor funciona.
  4. Abra Admin → Payment events e confirme que o evento foi processado uma única vez.
  5. Dispare um reembolso e confirme que o estado de reembolso da fatura está correto.

PayPal, passo a passo

O PayPal é o provedor com mais etapas do lado da plataforma. O FastRestful usa dois produtos diferentes do PayPal: Checkout orders para compras de planos de API de fornecedores e Billing subscriptions para planos da plataforma. Ambos usam as mesmas credenciais de app e o mesmo webhook.

1. Crie um app PayPal e copie as credenciais

  1. Abra o PayPal Developer Dashboard.

    Acesse developer.paypal.com e entre com sua conta empresarial do PayPal.

  2. Escolha Sandbox ou Live.

    Use o seletor Sandbox/Live no topo. Sandbox e live têm apps, credenciais e IDs de webhook separados.

  3. Abra Apps & Credentials → Create App.

    Dê um nome como FastRestful e selecione a conta empresarial que deve receber os pagamentos.

  4. Copie o Client ID e o Secret.

    Eles vão para PAYPAL_CLIENT_ID e PAYPAL_CLIENT_SECRET (ou para o registro de administração do PayPal). Se o secret estiver oculto, use a ação de regeneração do app e copie o novo valor.

2. Adicione o webhook do PayPal (obrigatório)

Esta é a etapa que a maioria das pessoas esquece. Sem um webhook ID, o FastRestful rejeita todos os eventos do PayPal e os pedidos pagos não são liquidados.

  1. Abra seu app em Apps & Credentials.
  2. Role até Webhooks e clique em Add Webhook.

    O rótulo exato pode ser Webhooks ou Add Webhook, dependendo da versão do dashboard do PayPal.

  3. Insira a URL do webhook.
    URL do webhook do PayPal
    https://api.example.com/api/v1/billing/paypal-webhook/

    A URL precisa ser HTTPS pública. Um redirecionamento no navegador não é prova de pagamento; o PayPal envia eventos assinados para essa URL, e esses eventos liquidam a fatura.

  4. Selecione os tipos de evento.
    Grupo de eventosSelecionarPor que o FastRestful precisa disso
    Checkout ordersCHECKOUT.ORDER.APPROVED, PAYMENT.CAPTURE.COMPLETEDCaptura e liquida pagamentos de planos de API de fornecedores.
    AssinaturasBILLING.SUBSCRIPTION.ACTIVATED, BILLING.SUBSCRIPTION.CANCELLED, BILLING.SUBSCRIPTION.SUSPENDED, BILLING.SUBSCRIPTION.EXPIREDAtiva e atualiza assinaturas da plataforma. ACTIVATED é o evento que concede o direito de acesso.
    Pagamentos de assinaturaPAYMENT.SALE.COMPLETEDRegistra renovações e reativa assinaturas da plataforma em atraso.
    RepassesPAYMENT.PAYOUTS-ITEM.SUCCEEDED, PAYMENT.PAYOUTS-ITEM.FAILED, PAYMENT.PAYOUTS-ITEM.BLOCKED, PAYMENT.PAYOUTS-ITEM.RETURNED, PAYMENT.PAYOUTS-ITEM.CANCELEDConcilia transferências de repasse a fornecedores.
  5. Salve o webhook e copie o Webhook ID.

    Abra o webhook salvo, se necessário. O PayPal mostra um webhook ID (uma string alfanumérica curta). Este é PAYPAL_WEBHOOK_ID. Ele não é a URL do webhook e não é o client secret.

Por que o PayPal é diferente. O FastRestful não faz hash do payload do PayPal com um segredo compartilhado. Ele envia os cabeçalhos do webhook e o corpo do evento para o /v1/notifications/verify-webhook-signature endpoint junto com o ID de webhook armazenado. Se o ID estiver ausente, vier do outro ambiente ou de outro aplicativo, a verificação falha e o FastRestful retorna 400 Bad signature. Este é um comportamento intencional de falha fechada.

3. Adicione o PayPal no FastRestful

Campo do FastRestfulValor do PayPal
ID do clienteClient ID do app
Segredo do clienteSecret do app
ID do webhookO ID do webhook que você copiou na etapa anterior
ModoTest para sandbox, Live para produção

Abra Admin → Payment gateways e edite a linha PayPal. Nesse formulário, Public key é o Client ID, Secret key é o Client secret e Webhook secret é o Webhook ID.

Se preferir variáveis de ambiente:

backend/.env
PAYPAL_CLIENT_ID=...
PAYPAL_CLIENT_SECRET=...
PAYPAL_WEBHOOK_ID=...
PAYPAL_ENV=sandbox          # use live in production
# PAYPAL_API_BASE=          # only for a proxy or custom host

Reinicie o backend e os workers depois de alterar valores de ambiente. Se usar o registro de administração, salve e ative-o; nenhum reinício é necessário.

4. Planos do PayPal Billing para assinaturas da plataforma

Pule esta etapa, a menos que você venda assinaturas da plataforma pelo PayPal. Os planos de API de fornecedores usam Checkout orders de pagamento único e não precisam de um plano do PayPal Billing.

  1. Crie um Product no PayPal.

    No dashboard do PayPal, abra a área Billing/Subscriptions e crie um produto que represente sua plataforma.

  2. Crie um Plan mensal e/ou anual.

    Defina o valor, a moeda e o intervalo exatos que correspondem ao plano no FastRestful. Crie um plano separado para cada intervalo.

  3. Copie cada Plan ID.

    Os plan IDs do PayPal começam com P-….

  4. Cole-os no plano da plataforma.

    Abra Admin → Platform plans e preencha PayPal monthly plan ID e PayPal annual plan ID.

  5. Confirme que o webhook inclui eventos de assinatura.

    A assinatura é criada no estado PENDING. Ela só fica ativa depois que BILLING.SUBSCRIPTION.ACTIVATED chega.

5. PayPal Payouts para fornecedores

  1. Confirme que a conta empresarial do PayPal está aprovada para Payouts.
  2. Armazene o e-mail de recebimento PayPal do fornecedor como destino de repasse com PATCH /api/v1/orgs/{id}/payout-provider/.
  3. Opcionalmente, defina PAYOUT_PROVIDER=paypal ou PAYOUT_PROVIDER=stripe,paypal para permitir ambos.
  4. Mantenha os eventos PAYMENT.PAYOUTS-ITEM.* selecionados no webhook.

6. Teste o sandbox do PayPal

  1. Use credenciais de sandbox.

    Defina PAYPAL_ENV=sandbox, use o Client ID e o secret do app de sandbox e o webhook ID de sandbox.

  2. Crie uma conta de comprador de sandbox.

    O PayPal Developer Dashboard oferece contas pessoais de teste. Entre em sandbox.paypal.com com esse comprador quando o checkout abrir.

  3. Conclua um pagamento de teste.

    Aprove o pedido e aguarde o redirecionamento de volta ao FastRestful.

  4. Verifique o recebimento do webhook.

    Abra Admin → Payment events. Você deve ver CHECKOUT.ORDER.APPROVED, depois PAYMENT.CAPTURE.COMPLETED, e a fatura deve ficar paga.

  5. Reenvie uma entrega, se necessário.

    No dashboard do PayPal, abra as entregas de eventos do webhook e reenvie o evento que falhou. O FastRestful deduplica por ID de evento.

Solução de problemas do webhook do PayPal

Resposta do FastRestfulSignificadoCorreção
400 PayPal webhook is not configured.O client ID ou o client secret está ausente, ou o registro de administração está desativado.Preencha o client ID e o secret e ative o registro. Reinicie se usar variáveis de ambiente.
400 Bad signature.O webhook ID está ausente, pertence a outro app/ambiente ou os cabeçalhos de assinatura foram removidos.Copie o webhook ID do mesmo app de sandbox/live. Não use a URL nem o client secret. Verifique se o seu proxy encaminha os cabeçalhos Paypal-*.
404 Unknown invoice for PayPal capture.A captura chegou antes de existir a referência local da fatura, ou o evento veio de outra instalação.Reenvie o evento pelo PayPal depois de confirmar que o checkout foi criado por esta instalação.
{"status":"ignored"}O evento não é tratado pelo FastRestful, ou a referência de assinatura/pedido é desconhecida.Verifique se os tipos de evento acima estão selecionados. Confirme que o checkout foi criado por este ambiente do FastRestful.
{"status":"duplicate"}O mesmo ID de evento foi entregue duas vezes.Nenhuma ação. Esta é a proteção de idempotência funcionando.

Flutterwave, passo a passo

  1. Crie e verifique uma conta Flutterwave.

    Complete o perfil empresarial e o KYC antes de usar o modo live.

  2. Copie as chaves de API.

    Abra Settings → API Keys. Copie a chave pública e a chave secreta. As chaves de teste e live são separadas.

  3. Adicione a URL do webhook.

    Abra Settings → Webhooks e defina:

    URL do webhook do Flutterwave
    https://api.example.com/api/v1/billing/flutterwave-webhook/
  4. Crie um secret hash.

    Insira uma string aleatória longa como o secret hash do webhook. Coloque o mesmo valor em FLUTTERWAVE_WEBHOOK_SECRET ou no registro de administração. Este é um valor que você escolhe, não uma chave gerada pelo Flutterwave.

  5. Insira as chaves no FastRestful.

    Edite a linha Flutterwave em Admin → Payment gateways, ou defina FLUTTERWAVE_PUBLIC_KEY, FLUTTERWAVE_SECRET_KEY e FLUTTERWAVE_WEBHOOK_SECRET.

  6. Teste um checkout.

    O FastRestful trata charge.completed com status successful. Os demais eventos são confirmados e ignorados.

Paystack, passo a passo

  1. Crie e ative uma conta Paystack.

    Conclua as etapas de ativação empresarial antes de usar chaves live.

  2. Copie as chaves de API.

    Abra Settings → API Keys & Webhooks. Copie as chaves pública e secreta para o modo de teste ou live.

  3. Adicione a URL do webhook.
    URL do webhook do Paystack
    https://api.example.com/api/v1/billing/paystack-webhook/
  4. Deixe o segredo do webhook em branco.

    O Paystack assina cada webhook com sua chave secreta usando HMAC-SHA512. O FastRestful usa PAYSTACK_SECRET_KEY como fallback quando PAYSTACK_WEBHOOK_SECRET está vazio. Só defina uma substituição se o suporte do Paystack fornecer uma chave de assinatura separada.

  5. Insira as chaves no FastRestful.

    Edite a linha Paystack em Admin → Payment gateways, ou defina PAYSTACK_PUBLIC_KEY e PAYSTACK_SECRET_KEY.

  6. Teste um checkout.

    O FastRestful trata charge.success e compara o valor na menor unidade da moeda (por exemplo, kobo para NGN).

Razorpay, passo a passo

  1. Crie e verifique uma conta Razorpay.

    Conclua o KYC e ative os pagamentos live.

  2. Gere chaves de API.

    Abra Account & Settings → API Keys e gere uma chave. Copie o Key ID e o Key Secret.

  3. Adicione o webhook.

    Abra Account & Settings → Webhooks → Add New Webhook e defina:

    URL do webhook do Razorpay
    https://api.example.com/api/v1/billing/razorpay-webhook/

    Selecione payment_link.paid. O FastRestful cria um Payment Link do Razorpay para o checkout e concilia esse evento. Defina um segredo de webhook forte; o Razorpay assina com HMAC-SHA256, e o mesmo valor deve ser armazenado no FastRestful.

  4. Insira as chaves no FastRestful.

    Edite a linha Razorpay em Admin → Payment gateways, ou defina RAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET e RAZORPAY_WEBHOOK_SECRET.

  5. Teste um checkout.

    Abra o Payment Link, pague com um método de teste e confirme que a fatura foi paga e que o evento foi registrado uma única vez.

O teste de aceitação de 10 minutos

Execute isto para cada provedor antes de entrar em produção:

  • O provedor aparece como configurado e ativado em Admin → Payment gateways.
  • Um checkout de teste abre a página do provedor e retorna à URL correta do frontend.
  • O webhook assinado chega e aparece uma única vez em Admin → Payment events.
  • A fatura só fica paga depois do webhook, não no redirecionamento.
  • A assinatura fica ativa e uma chave do consumidor funciona.
  • Um reembolso retorna ao método de pagamento original e atualiza o razão.
  • Se os repasses estiverem ativados, uma transferência de teste chega ao destino do fornecedor e é conciliada.
  • Uma entrega duplicada de webhook é reconhecida sem liquidação dupla.

Erros comuns com webhooks

ErroO que aconteceCorreção
Usar http://localhost como URL do webhookO provedor não consegue acessar sua máquina.Use uma URL HTTPS pública ou um túnel para testes locais.
Misturar credenciais de teste e liveO checkout abre, mas a verificação do webhook falha ou a conta errada é cobrada.Mantenha todo o conjunto no mesmo modo: chaves, ID/segredo do webhook e ambiente do provedor.
Colar a URL do webhook do PayPal como PAYPAL_WEBHOOK_IDTodos os eventos do PayPal retornam Bad signature.Copie o webhook ID na página de detalhes do Webhooks do app.
Usar a chave secreta do Stripe como segredo do webhookAs entregas do Stripe falham na verificação.Use o segredo de assinatura do endpoint (whsec_…).
Esquecer de assinar um eventoO provedor nunca o envia, então a fatura permanece em aberto.Selecione a lista de eventos desse provedor exatamente como mostrado acima.
Alterar a URL do túnelAs entregas vão para um host antigo e falham.Atualize o dashboard do provedor e o FastRestful juntos.
Valor ou moeda erradosO FastRestful rejeita a liquidação para proteger o razão.Faça o plano e o preço do provedor coincidirem exatamente.
O proxy remove os cabeçalhos de assinaturaA verificação falha mesmo com os segredos corretos.Encaminhe os cabeçalhos do provedor sem alterações pelo Nginx, Cloudflare ou seu balanceador de carga.

Lista de verificação para entrar em produção

  1. Mude para credenciais live.

    Substitua chaves de teste, webhook IDs e segredos por valores live. Defina PAYPAL_ENV=live para o PayPal.

  2. Registre as URLs de webhook de produção.

    Use seu hostname real de API, não um túnel, e confirme que o HTTPS funciona a partir da internet pública.

  3. Defina a chave publicável do frontend.

    Use a chave publicável live do Stripe e recompile o frontend.

  4. Faça os preços e plan IDs corresponderem.

    Confirme que os Stripe Price IDs e os PayPal Billing plan IDs apontam para objetos live com o valor, a moeda e o intervalo exatos.

  5. Faça um pequeno pagamento real e reembolse-o.

    Verifique o webhook, a fatura, o direito de acesso, o reembolso e os lançamentos no razão. Esta é a única maneira de provar o caminho live.

  6. Acompanhe o primeiro dia de eventos.

    Verifique Admin → Payment events em busca de falhas e confirme que o dashboard do provedor mostra entregas bem-sucedidas.

Experiência8 min de leitura

Biblioteca de mídia & CDN

Um único pipeline de armazenamento para recursos de mídia, logotipos de produtos, fotos de fornecedores, avatares de usuários e imagens do CMS. Sistema de arquivos local em desenvolvimento; S3 + CloudFront em produção.

Tipos e limites suportados

TipoExtensõesLimite
Imagemjpg, jpeg, png, webp, gif8 MB
Vídeomp4, webm64 MB
Áudiomp3, wav, ogg16 MB
Documentopdf, txt, csv16 MB
Arquivo compactadozip32 MB

A validação verifica a extensão, o tipo de conteúdo declarado, a assinatura de magic bytes e o tamanho. Bytes idênticos dentro de um mesmo espaço de trabalho são deduplicados por checksum SHA-256. GET /api/v1/media/supported-types/ alimenta as dicas de aceitação da interface.

Modos de armazenamento

MEDIA_STORAGEComportamento
localArmazenamento em sistema de arquivos do Django em MEDIA_ROOT; servido em /media/.
s3S3 via django-storages. Nomes de objetos UUID são imutáveis e gravados com um cabeçalho de cache imutável de um ano.

O modo S3 exige boto3 e django-storages no ambiente de produção. manage.py check falha se o bucket estiver ausente e avisa quando nem um domínio CDN nem uma ACL de leitura pública estiverem configurados.

Configuração do CloudFront

  1. Crie um bucket privado com o bloqueio de todo acesso público ativado.
  2. Crie uma distribuição CloudFront com a origem do bucket e o Origin Access Control (OAC).
  3. Conceda à distribuição s3:GetObject em arn:aws:s3:::<bucket>/* por meio da política de bucket gerada.
  4. Aponte MEDIA_CDN_DOMAIN para a distribuição ou para um CNAME com um certificado ACM.
  5. Opcionalmente, defina MEDIA_CDN_DISTRIBUTION_ID para ativar ações de invalidação.
Como os nomes dos objetos são imutáveis, uploads substituídos recebem uma nova chave. O cache de CDN de longa duração é seguro e purgas raramente são necessárias. Defina MEDIA_S3_ACL=public-read somente ao servir diretamente do S3 sem o CloudFront.

Fluxos de trabalho da biblioteca

  • Console: a equipe envia e gerencia a biblioteca; os inquilinos veem uma estante do espaço de trabalho somente leitura em /dashboard/media ou /vendor/media.
  • Coleções: pastas/categorias com escopo de espaço de trabalho, com busca, filtros e movimentações em lote.
  • Predefinições de renomeação: kebab, snake, Title Case, UPPER ou manter, com prefixos, sufixos e sequências com preenchimento.
  • Pontos focais: focal_x/focal_y por recurso (0–100), usados pelos blocos de imagem do CMS.
  • Seleção de intervalo: clique com Shift para selecionar um intervalo, baixe, copie a URL e abra o recurso anterior/seguinte no painel lateral.
  • Selos de uso: veja onde um recurso é referenciado antes de excluí-lo.

Funcionamento do seletor

Selecionar um recurso da biblioteca copia seus bytes para o campo de destino. Substituir ou excluir o recurso da biblioteca nunca quebra uma imagem selecionada, e cada modelo mantém seu próprio ciclo de vida de armazenamento. Recursos de outro espaço de trabalho são rejeitados.

Destinos conectados: logotipo do produto, perfil/capa do fornecedor, avatar do usuário, identidade visual do admin, imagens de categoria, imagens do CMS e mídia de blocos de conteúdo.

API de mídia

EndpointFinalidade
GET/POST /api/v1/media/Listagem com kind/search/ordering e upload multipart.
PATCH/DELETE /api/v1/media/{id}/Metadados, texto alternativo, tags e exclusão.
POST /api/v1/media/bulk-delete/Exclusão em lote por ids.
GET /api/v1/media/supported-types/Registro de tipos e limites.
GET /api/v1/media/storage-info/Diagnósticos de backend, bucket, CDN, ACL e URL de exemplo, restritos à equipe.

Ambiente

Consulte Configuração para a matriz de armazenamento de mídia e spec, incluindo URL do endpoint, domínio CDN, ID da distribuição e comportamento da ACL.

Experiência12 min de leitura

Estúdio de newsletter

Marketing por e-mail restrito à equipe, com públicos, modelos baseados em blocos, campanhas, testes A/B de assunto, segmentos, automações, análise por link e e-mails transacionais do sistema.

Estúdio de newsletter do FastRestful com crescimento, entregabilidade, campanhas, assinantes e atividade de e-mail
O estúdio de newsletter é uma superfície operacional separada dentro do plano de controle, não uma aba de configurações escondida.

Início rápido

  1. Abra /admin/newsletter/ → Settings e configure o provedor, o remetente, a URL pública do backend, o endereço postal e o texto de cancelamento de inscrição.
  2. Lists & contacts → crie uma lista; adicione ou importe contatos como email, name, tags.
  3. Templates → duplique um modelo inicial pronto ou comece do zero, crie com o editor de blocos e depois salve e visualize.
  4. Campaigns → escolha um modelo, listas, segmento opcional, assunto(s) e envie um teste para você mesmo.
  5. Automations → adicione etapas de e-mail e de espera; entradas em listas ou tags disparam a inscrição.
  6. System emails → vincule modelos a gatilhos transacionais.
Configuração do provedor: para os passos exatos no painel do SES, Mailgun, SendGrid, Postmark, Brevo, Mailjet, SparkPost, Resend ou SMTP personalizado, consulte External integrations → Email.
trabalho agendado
python3.11 manage.py newsletter_beat
# or schedule the Celery tasks:
# newsletter.send_due_campaigns
# newsletter.process_automations

Provedores de e-mail

ProvedorNotas sobre credenciais
SMTP (personalizado)Host, porta, usuário, senha, TLS/SSL; campos em branco herdam EMAIL_*.
Amazon SESCredenciais SMTP e região.
MailgunChave de API e domínio de envio; região da UE suportada.
SendGridChave de API Bearer.
PostmarkToken do servidor.
BrevoChave de API.
MailjetChave de API e secret.
SparkPostChave de API Bearer.
ResendChave de API Bearer.

Os segredos são criptografados em repouso. Um botão de teste envia pelo provedor selecionado antes de você lançar uma campanha.

Modelos e editor

  • Blocos: cabeçalho, hero, texto, imagem, botão, divisor, espaçador, imagem + texto, destaques, citação, links sociais, HTML bruto, rodapé.
  • Blocos avançados: colunas, depoimento, tabela, vídeo, cartão de produto, banner de CTA, nota de rodapé.
  • Variantes para layouts de hero, tamanho/alinhamento de texto, molduras/legendas de imagem, estilo/tamanho/alinhamento de botão, estilo/largura de divisor, raio do tema e largura do conteúdo.
  • Arrastar e soltar e reordenação por teclado, pré-visualização ao vivo com debounce, alternativa em texto simples, preheader e URLs sanitizadas.
  • Placeholders: {{first_name}}, {{action_url}}, {{message}}, {{site_name}}, {{unsubscribe_url}}, {{preferences_url}}.
  • 18 modelos integrados para lançamentos, resumos, webinars, estudos de caso, reconquista, NPS, promoções, registros de alterações, editoriais, destaques da comunidade, onboarding e anúncios de serviço.

Campanhas

  • O público é composto pelas listas selecionadas (união) ∩ segmento opcional, sem duplicatas; apenas contatos inscritos, com endereços que apresentaram bounce ou reclamação excluídos.
  • Os testes A/B de assunto dividem uma porcentagem dos destinatários, aguardam uma janela e depois enviam o vencedor para o restante. A opção manual “decidir vencedor agora” está disponível.
  • Reenviar para não abertos cria um rascunho direcionado apenas aos contatos que não abriram a campanha original.
  • Agendamento, pausa/retomada/cancelamento, envio de teste e calendário de campanhas.
  • Relatórios: entregas, aberturas, cliques, cancelamentos de inscrição, comparação A/B, tabela de cliques por link, linha do tempo de engajamento e destinatários mais recentes.
  • Os padrões de UTM são aplicados aos links da campanha; apenas destinos http(s) são aceitos.

Segmentos e automações

Os segmentos combinam listas, tags (todas/qualquer uma), status do contato, janelas de engajamento (abriu, clicou, não abriu em N dias) e recência de entrada. As contagens são avaliadas ao vivo e reutilizadas pelas campanhas.

As automações são disparadas por entrada em lista, tag, ação manual ou API. As etapas enviam um e-mail ou aguardam N horas. As execuções avançam de forma idempotente e registram falhas. A inscrição é deduplicada por contato.

E-mails do sistema

Se um modelo ativo do estúdio estiver vinculado a um gatilho, ele renderiza HTML + texto; caso contrário, a mensagem simples legada é enviada. As chaves vinculadas incluem boas-vindas, redefinição de senha, código de login, alerta de segurança, aviso da plataforma, fatura aberta, falha de pagamento, fornecedor aprovado, alerta de cota, convite para organização e resumo de atividades.

Inscrição pública e preferências

  • POST /api/v1/newsletter/subscribe/ com confirmação opcional de double opt-in.
  • GET /confirm/<token>/, GET /unsubscribe/<token>/ e POST de um clique do RFC 8058.
  • Central de preferências em /api/v1/newsletter/preferences/<token>/ para alternar listas ou cancelar a inscrição globalmente.
  • O pixel de abertura e os redirecionamentos de clique reescrevem os links quando o rastreamento está ativado.
  • Os e-mails enviados incluem os cabeçalhos List-Unsubscribe e List-Unsubscribe-Post.

Entregabilidade e operações

  • Gráficos de bounce, reclamações, cancelamentos de inscrição e crescimento; mantenha as taxas de bounce e reclamação próximas de zero.
  • Mapa de calor de horário de envio por dia da semana local × hora, com recomendações de melhor janela.
  • Estimativas de público e endereços de amostra antes do envio.
  • Página de contatos com status, tags, campos personalizados, associações a listas, supressão, entregas, eventos e execuções de automação.
  • Exportações CSV para contatos, destinatários de campanha e links.
  • Execute newsletter_beat a cada poucos minutos para agendamentos, decisões A/B e atrasos de automação.
Experiência8 min de leitura

Anúncios & banners

Banners públicos criados no admin para barras superiores, posições no rodapé e anúncios dentro da página — com segmentação, agendamento, regras de dispensa, experimentos visuais e análise de impressões/cliques.

Posicionamentos

ChaveOnde aparece
topbarBarra de largura total acima do cabeçalho público.
footerBanner de largura total acima da grade do rodapé.
footer_leftEspaço de anúncio à esquerda do rodapé.
footer_rightEspaço de anúncio à direita do rodapé.
centerBanner na página, entre o cabeçalho e o conteúdo.

Um banner é exibido por posicionamento, escolhido por prioridade e depois por recência. Um banner pode ter vários posicionamentos como destino.

Segmentação e agendamento

  • Caminhos: padrões de inclusão e exclusão como /pricing, /docs/* ou *.
  • Público: todos, visitantes desconectados ou usuários conectados.
  • Idioma e dispositivo: listas de permissão separadas por vírgula; tablet usa mobile como fallback quando mobile é permitido.
  • Agendamento: carimbos de data/hora de início/fim e um interruptor de ativação.
  • Prioridade: números maiores vencem quando vários banners correspondem.

Design e recursos integrados

  • Layouts: barra, cartão, dividido, minimalista.
  • Selo, título, corpo, rótulo/URL/estilo/nova aba do CTA, imagem, lado, cores, gradientes, alinhamento e pré-visualização ao vivo.
  • Ícone/emoji opcional, padrões decorativos (pontos, grade, listras, brilho) e animações de entrada seguras para movimento reduzido.
  • 32 banners integrados para lançamentos, confiança/status, promoções, eventos, ciclo de vida, editorial, comunidade e campanhas sazonais.
  • HTML personalizado com placeholders {{click_url}}, {{dismiss_url}} e {{impression_url}} para que o rastreamento continue funcionando.
  • Frequência de dispensa: a cada carregamento de página, uma vez por sessão, uma vez por dia ou uma vez para sempre.

Entrega e rastreamento

endpoints públicos
GET  /api/v1/announcements/?path=/pricing&locale=en&placement=topbar
POST /api/v1/announcements/<id>/impression/
POST /api/v1/announcements/<id>/dismiss/
GET  /api/v1/announcements/<id>/click/

Os payloads incluem HTML renderizado no servidor com estilos inline, além de impression_url, dismiss_url e frequency. Os eventos registram posicionamento, caminho, idioma, dispositivo, referenciador, user agent e IP.

Experimentos e relatórios

  • Banners com a mesma prioridade compartilham o tráfego por peso (1–1000).
  • Defina um nome de experimento e um rótulo de variante em vários banners; uma variante é escolhida por requisição com base no peso.
  • Os relatórios de experimento mostram impressões, cliques, CTR e a variante líder.
  • Os relatórios mostram a atividade diária de 30/90 dias e detalham posicionamento, páginas principais, dispositivos e eventos recentes.
  • As listas do admin mostram contadores, ações de ativar/pausar e registros de eventos somente leitura.

Operações

Os eventos de banner são somente de adição. O estado de dispensa é armazenado no navegador do visitante e contado no servidor. O script público ignora user agents de bots; use um user agent de navegador normal para o QA de banners públicos.

Experiência7 min de leitura

Links curtos

Links curtos prontos para campanhas, redirecionamentos, códigos QR, padrões de UTM, fallbacks, análise de cliques e verificações de destinos quebrados — disponíveis tanto no painel do consumidor quanto no estúdio do fornecedor.

  • Crie links curtos com slug personalizado, destino, tags, tipo de redirecionamento, expiração e estado ativo.
  • Redirecionamentos 301 ou 302; links expirados ou desativados podem usar um destino seguro como fallback ou uma página 410 com a sua marca.
  • Padrões de UTM (utm_source, utm_medium, utm_campaign) acrescentados no momento do redirecionamento; parâmetros de campanha recebidos têm precedência.
  • Geração de QR SVG com cor personalizada e metadados de campanha.
  • Análise de cliques com país, dispositivo, referenciador e contexto de campanha.
  • Verificações de integridade de destinos quebrados com detalhes do erro e nova verificação em um clique.
  • Importação/exportação CSV e ações de seleção em lote.

Abra Links no painel do consumidor (/dashboard/links) ou no estúdio do fornecedor (/vendor/links). O editor inclui título, destino, slug, tags, tipo de redirecionamento, expiração, interruptor de ativação e escopo de todo o site apenas para a equipe. A tabela oferece ações de copiar, QR, verificar novamente, editar, excluir, integridade e status.

VariávelFinalidade
SHORTLINK_BASE_URLOrigem pública do link curto, por exemplo https://go.example.com.
NEWSLETTER_TRACKING_BASE_URLOrigem de fallback quando a base do link curto está vazia.
FRONTEND_URLOrigem de fallback final.
verificações de integridade agendadas
python3.11 manage.py checklinks --limit 200 --timeout 6
EndpointFinalidade
GET/POST /api/v1/short-links/Liste e crie links do espaço de trabalho.
PATCH/DELETE /api/v1/short-links/{id}/Edite ou exclua.
GET /api/v1/short-links/{id}/qr/QR SVG com cor opcional.
POST /api/v1/short-links/{id}/check/Verifique novamente a integridade do destino.
GET /api/v1/short-links/export/Exportação CSV.
POST /api/v1/short-links/import/Importação CSV.

Os redirecionamentos públicos resolvem por slug, registram o clique e então redirecionam. As listas do admin incluem colunas de cliques/integridade, ações de verificar novamente/ativar/desativar, uma ação rápida “Encurtar um link” e um registro de cliques somente leitura.

Experiência12 min de leitura

Site, CMS & idiomas

O plano de controle Django é responsável pelo shell público: identidade, padrões de busca/compartilhamento, navegação, páginas, posts do blog, documentos legais, CSS/JS personalizados, modo de manutenção e camadas de idioma.

Superfícies do operador

Rota do adminControla
/admin/platform/sitesettings/Política do marketplace, assets da marca, metadados globais, textos do cabeçalho/rodapé, anúncio, contato de suporte, política de dois fatores, modo de manutenção.
/admin/platform/sitenavigationitem/Links ordenados do cabeçalho/rodapé, posicionamento, visibilidade e comportamento de nova aba.
/admin/platform/contentpage/Páginas, posts do blog, rascunhos de documentos legais, seções estruturadas, mídia de capa, SEO, estado de publicação.
/admin/platform/siteasset/Trechos de CSS/JS personalizados, escopo por caminho, pré-visualização, histórico de revisões.
/admin/platform/sitelocale/Idiomas integrados, camadas do admin, cobertura de tradução, importação/exportação.

Configurações do site

  • Logotipo, favicon e imagem de compartilhamento social com seletor de mídia e limpeza pós-commit.
  • Título meta global, descrição e fallback da imagem de compartilhamento.
  • Modo marketplace, porcentagem de taxa padrão, indicador de manutenção.
  • Rótulo do CTA do cabeçalho + destino (devem ser fornecidos juntos).
  • Banner de anúncio ativado/texto/url.
  • Título do rodapé, resumo, direitos autorais, e-mail de suporte.
  • Desafio integrado ou Google reCAPTCHA para formulários públicos.
  • Política obrigatória de dois fatores para todas as contas.
  • Cores do tema, fontes e pré-visualização ao vivo do shell público.

Conteúdo estruturado

Páginas e posts são montados a partir de seções ordenadas, não de HTML bruto. Os tipos de seção disponíveis incluem prosa, tabela, código, imagem, vídeo, dividido, citação, abas, código multilíngue, exemplo de endpoint, depoimentos, lista de recursos, FAQ, etapas, métricas, grade de cartões, divisor, hero, faixa de logos, linha do tempo, lista de links, destaque, coleção de API, coleção de categorias, APIs principais e artigos recentes.

  • A prosa aceita parágrafos separados por uma linha em branco; os itens de lista são um por linha.
  • As ações exigem um rótulo e um destino; os links aceitam caminhos do site, HTTPS, mailto ou tel.
  • Rascunhos nunca aparecem publicamente; páginas publicadas aparecem no conteúdo do site, nos metadados e nas rotas do sitemap.
  • O SEO no nível da página substitui os padrões globais campo a campo.
  • Páginas legais entram no grupo legal padrão do rodapé somente após a publicação.

CSS & JS personalizados

Admin → Custom assets injeta CSS ou JavaScript no site público sem implantação. Cada trecho tem um tipo, posicionamento (head ou footer) e escopo (site inteiro, caminhos selecionados ou uma página). Os caminhos suportam correspondências exatas e curingas /prefix/*.

  • Payload público: GET /api/v1/platform/assets/ retorna trechos ativos mais o csp_nonce configurado.
  • Pré-visualização: cada trecho tem uma pré-visualização em iframe no admin com injeção forçada via ?fr_preview_asset=<id>.
  • Revisões: cada salvamento cria um snapshot imutável com autor e nota; qualquer revisão pode ser restaurada como uma nova entrada.
  • CSP: defina o mesmo nonce em Site settings e na sua política de edge; as tags o recebem automaticamente.

Idiomas e camadas de tradução

O inglês é o pacote de origem canônico. O francês é distribuído completo. Todos os outros idiomas são uma camada esparsa do admin mesclada sobre o inglês em tempo de execução.

  • Abra Site locales → Manage translations para inspecionar a cobertura, editar o francês integrado ou adicionar um idioma.
  • O francês integrado aparece com 100% de cobertura sem uma linha no banco de dados. Salvar um campo cria uma camada do admin sem alterar o fallback distribuído.
  • Exporte JSON ou TypeScript, traduza offline e importe de volta. Chaves desconhecidas são ignoradas e informadas.
  • A API pública de idiomas retorna as camadas ativas; o frontend as mescla sobre o inglês e o francês integrados.
  • Depois de editar lib/i18n/*.json, execute npm run export:i18n e reinicie a API para atualizar o cache do processo.

Modo de manutenção

A manutenção pausa todas as rotas do frontend e as chamadas de API/gateway dos clientes. O admin da equipe, as sondas de integridade, os callbacks do provedor de identidade e os webhooks assinados de pagamento/repasse permanecem disponíveis. A disponibilidade pública é exposta anonimamente com o indicador de manutenção, o aviso e o intervalo de nova tentativa.

Contratos públicos

EndpointExpõe
GET /api/v1/platform/branding/Logotipo, favicon, horário de atualização.
GET /api/v1/platform/site-metadata/Título, descrição, imagem social, favicon, horário de atualização.
GET /api/v1/platform/site-content/Navegação ativa, textos do shell, páginas/posts publicados.
GET /api/v1/platform/site-pages/Metadados de rotas publicadas para SEO e sitemap.
GET /api/v1/platform/availability/Indicador de manutenção, aviso, intervalo de nova tentativa.
GET /api/v1/platform/assets/CSS/JS personalizados ativos e nonce de CSP.
GET /api/v1/platform/locales/Camadas de idioma ativas.
Avançado14 min de leitura

Integrações externas, passo a passo

E-mail, armazenamento de objetos, login único, infraestrutura e webhooks de saída. Cada seção informa o que fazer primeiro no site do provedor e depois exatamente quais valores copiar para o FastRestful.

Os pagamentos têm um guia próprio. Stripe, PayPal, Flutterwave, Paystack, Razorpay, webhooks e repasses são abordados em Gateways de pagamento, passo a passo.

Qual valor prevalece?

  • As variáveis de ambiente fornecem os padrões de implantação.
  • Os registros gerenciados no admin substituem os valores de ambiente correspondentes campo a campo.
  • Desativar um registro do admin desliga esse provedor em todos os lugares, mesmo que as chaves de ambiente permaneçam definidas.
  • Os valores de provedor do frontend são incorporados no momento do build. Recompile depois de alterar NEXT_PUBLIC_*.
  • Execute a ação de teste do provedor antes de enviar tráfego real.

Provedores de e-mail e newsletter

O FastRestful pode enviar e-mails de campanha, automação e sistema pelo seu próprio provedor. Configure-o em Admin → Newsletter → Email settings, ou herde SMTP das variáveis de ambiente EMAIL_*. As chaves e os segredos de API são criptografados em repouso.

A configuração em seis etapas

  1. Crie uma conta em um provedor.

    Use um provedor transacional como Amazon SES, Mailgun, SendGrid, Postmark, Brevo, Mailjet, SparkPost, Resend ou qualquer host SMTP.

  2. Verifique seu domínio de envio ou endereço de remetente.

    A maioria dos provedores não entrega até que o domínio ou e-mail seja verificado. Adicione os registros DNS fornecidos pelo provedor.

  3. Crie a chave de API ou as credenciais SMTP.

    Use a menor permissão que permita enviar e-mail. Para SMTP, copie o host, a porta, o usuário e a senha.

  4. Insira os valores no FastRestful.

    Abra Admin → Newsletter → Email settings. Escolha o provedor, cole as credenciais e defina o nome do remetente, o e-mail do remetente, o reply-to, o endereço postal e o texto de cancelamento de inscrição.

  5. Defina a URL pública do backend.

    Ela é usada em pixels de rastreamento, links de confirmação e links de cancelamento de inscrição. Deve ser a origem pública que chega ao Django, não o servidor de desenvolvimento do frontend.

  6. Envie um e-mail de teste para você mesmo.

    Use a ação de teste integrada. Verifique o código-fonte completo da mensagem para confirmar o remetente e os links esperados antes de enviar uma campanha.

Guia rápido de provedores

ProvedorO que fazer no site do provedorO que colar no FastRestful
SMTP (personalizado)Obtenha o host, a porta, o usuário e a senha no seu host de e-mail ou painel de hospedagem.Host, porta, usuário, senha, TLS/SSL.
Amazon SESVerifique o domínio ou remetente, solicite acesso de produção e crie credenciais SMTP no console do SES.Host SMTP como email-smtp.us-east-1.amazonaws.com, porta 587, usuário e senha SMTP. Mantenha o TLS ativado.
MailgunAdicione e verifique o domínio de envio e crie uma chave de API. Anote se o domínio está na região dos EUA ou da UE.Chave de API, domínio de envio, região da UE opcional, endpoint de API opcional.
SendGridVerifique um remetente ou domínio e crie uma chave de API com permissão Mail Send.Chave de API Bearer.
PostmarkCrie um servidor e verifique uma assinatura de remetente ou domínio.Token do servidor.
BrevoVerifique o remetente ou o domínio e crie uma chave de API v3.Chave de API.
MailjetVerifique o remetente ou o domínio e crie uma chave de API e um secret.Chave de API e secret.
SparkPostVerifique o domínio de envio e crie uma chave de API com permissão de envio.Chave de API Bearer.
ResendVerifique o domínio de envio e crie uma chave de API.Chave de API Bearer.

Entregabilidade é um trabalho de DNS. Autentique SPF, DKIM e DMARC antes de aumentar o volume. Comece com envios pequenos, monitore rejeições e reclamações e mantenha o link de descadastro funcionando. Campanhas, automações e e-mails do sistema podem usar modelos diferentes, mas compartilham o mesmo provedor.

Armazenamento de objetos e CDN

O armazenamento no sistema de arquivos local é adequado para desenvolvimento. Em produção, use armazenamento compatível com S3 e uma CDN, para que os uploads sobrevivam às implantações e os assets carreguem rapidamente.

1. Crie o bucket S3 e as permissões

  1. Crie um bucket privado.

    No console da AWS, crie um bucket na região desejada. Mantenha Bloquear todo o acesso público ativado. O CloudFront fará a leitura por meio do OAC.

  2. Crie um usuário ou papel IAM.

    A cadeia de credenciais padrão é suportada: variáveis de ambiente, um perfil de instância ou IRSA no Kubernetes. Não codifique chaves diretamente no repositório.

  3. Conceda apenas as permissões de que o FastRestful precisa.
    política IAM mínima
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::my-media-bucket"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
          "Resource": "arn:aws:s3:::my-media-bucket/*"
        }
      ]
    }
  4. Instale as bibliotecas de armazenamento.

    Execute pip install boto3 django-storages no ambiente de backend e adicione-as aos requisitos de implantação.

  5. Defina os valores de ambiente.
    backend/.env
    MEDIA_STORAGE=s3
    MEDIA_S3_BUCKET=my-media-bucket
    MEDIA_S3_REGION=us-east-1
    # MEDIA_S3_ENDPOINT_URL=   # only for S3-compatible providers
    # MEDIA_S3_ACL=            # omit when using CloudFront OAC
  6. Reinicie e envie um asset de teste.

    Abra a biblioteca de mídia e envie uma imagem. Ela deve aparecer no bucket e carregar pela CDN ou URL S3 configurada.

2. Coloque o CloudFront na frente do bucket

  1. Crie uma distribuição CloudFront.

    Escolha o bucket como origem e crie um Origin Access Control (OAC).

  2. Atualize a política do bucket.

    Permita que a distribuição CloudFront leia os objetos. O console do CloudFront pode gerar a política para você.

  3. Defina os valores do FastRestful.
    backend/.env
    MEDIA_CDN_DOMAIN=cdn.example.com
    MEDIA_CDN_DISTRIBUTION_ID=E1234567890ABC
    # MEDIA_S3_ACL=public-read   # only if serving S3 directly, not recommended
  4. Permita a invalidação de cache.

    Adicione cloudfront:CreateInvalidation à política IAM se quiser que o botão de limpeza da biblioteca de mídia funcione.

  5. Teste com um novo upload.

    Envie um novo arquivo, abra-o pelo domínio da CDN, substitua-o e use a ação de limpeza.

3. Provedores compatíveis com S3

Cloudflare R2, MinIO, DigitalOcean Spaces e serviços semelhantes funcionam pela API S3. Defina MEDIA_S3_ENDPOINT_URL como o endpoint S3 do provedor e mantenha o bucket privado se o provedor oferecer suporte a CDN ou URLs assinadas. Verifique upload, download e exclusão antes de confiar nisso em produção.

4. Armazenamento de especificações OpenAPI

Por padrão, os contratos OpenAPI importados são armazenados no banco de dados. Para armazená-los no S3, defina:

backend/.env
SPEC_STORAGE=s3
SPEC_S3_BUCKET=my-spec-bucket
SPEC_S3_PREFIX=specs/
SPEC_S3_REGION=us-east-1
# SPEC_S3_ENDPOINT_URL=

Consulte Biblioteca de mídia e CDN para limites de upload, tipos de arquivo suportados e comportamento da CDN.

Login único

OIDC e SAML preservam destinos relativos seguros e tokens de convite da organização. O login por senha pode permanecer ativado como alternativa.

OIDC, passo a passo

  1. Crie um aplicativo OIDC no seu provedor de identidade.

    Use Okta, Auth0, Microsoft Entra ID, Google Workspace, Keycloak, Authentik ou qualquer provedor OIDC compatível.

  2. Registre a URL de callback.
    URI de redirecionamento
    https://api.example.com/api/v1/auth/sso/callback/

    Use o hostname exato que os usuários acessam. Uma diferença de barra final fará o callback falhar.

  3. Permita o fluxo de código de autorização e os escopos.

    Solicite openid, email e profile.

  4. Copie o emissor, o client ID e o client secret.
    backend/.env
    SSO_ISSUER=https://login.example.com/realms/acme
    SSO_CLIENT_ID=fastrestful
    SSO_CLIENT_SECRET=...
  5. Reinicie o backend.

    O botão de SSO fica oculto até que o provedor seja configurado.

  6. Teste com uma identidade real.

    Entre pelo botão e confirme se o callback retorna à rota esperada do frontend.

SAML 2.0, passo a passo

  1. Instale a dependência opcional.

    Execute pip install lxml antes de ativar o SAML.

  2. Copie os metadados do SP.

    Forneça esta URL ao seu provedor de identidade ou envie o XML que ele retornar:

    metadados do SP
    https://api.example.com/api/v1/auth/saml/metadata/
  3. Defina a URL do ACS e o entity ID no IdP.

    O assertion consumer service é:

    URL do ACS
    https://api.example.com/api/v1/auth/saml/callback/

    O entity ID padrão é fastrestful. Você pode alterá-lo com SSO_SAML_ENTITY_ID.

  4. Copie a URL de SSO do IdP e o certificado de assinatura.
    backend/.env
    SSO_SAML_ENABLED=1
    SSO_SAML_ENTITY_ID=fastrestful
    SSO_SAML_SSO_URL=https://idp.example.com/sso
    SSO_SAML_IDP_CERT=-----BEGIN CERTIFICATE-----...
    # SSO_SAML_AUDIENCE=fastrestful
  5. Reinicie e teste.

    Inicie um login pelo frontend e confirme se a asserção do IdP retorna à página esperada.

Provedores de infraestrutura

ServiçoO que fazerConfiguração do FastRestful
PostgreSQLProvisione um banco de dados gerenciado ou seu próprio servidor. Ative backups automatizados e monitore os limites de conexão.DATABASE_URL. Obrigatório em produção.
RedisProvisione uma instância Redis gerenciada. Ative a persistência se você depender das novas tentativas do Celery.REDIS_URL. Obrigatório em produção.
CeleryExecute um worker e um processo beat no systemd, Supervisor ou no gerenciador de processos da sua plataforma.CELERY_BROKER_URL (usa REDIS_URL por padrão).
NginxTermine o TLS, faça proxy para o Gunicorn, sirva /static/ e /media/ e encaminhe os headers de host e IP do cliente.Consulte Implantação → Nginx.
Cloudflare / CDNFaça proxy do DNS, ative o TLS e aumente os limites de upload para corresponder às configurações de mídia. Mantenha os caminhos de webhook fora de cache agressivo.Regras de DNS e cache.
Execute o agendador. O Celery beat executa a liquidação mensal, a escalada de moderação, e-mails e verificações de disponibilidade. Sem um broker, execute os comandos de liquidação manualmente. Consulte Operações.

Ferramentas de API e webhooks de saída

OpenAPI, Swagger e Postman

  • Importação OpenAPI: importe OpenAPI 3.x ou Swagger 2.0 em uma versão de rascunho. O pipeline de versões reconcilia endpoints e sinaliza mudanças incompatíveis.
  • Schema da plataforma: exporte-o em /api/schema/ com python3.11 manage.py spectacular --file schema.yml --validate.
  • Swagger UI: disponibilizado em /api/docs/ pelo backend.
  • Postman / kits iniciais: os endpoints de produto expõem pacotes para download aos consumidores.

Webhooks de saída, passo a passo

  1. Crie o endpoint no FastRestful.

    Abra a seção de endpoints de webhook do plano de controle e adicione a URL do seu receptor. Ela deve usar HTTPS.

  2. Escolha os eventos e um segredo de assinatura.

    Armazene um segredo forte. O FastRestful assina o corpo bruto da requisição com HMAC-SHA256.

  3. Envie uma entrega de teste.

    Confirme se o seu receptor retorna uma resposta 2xx.

  4. Verifique a assinatura no seu servidor.

    Compare seu próprio HMAC-SHA256 do corpo bruto com o header X-FastRestful-Signature. O valor é sha256=<hex>. O nome do evento está em X-FastRestful-Event.

  5. Acompanhe o log de entregas.

    As novas tentativas são seguras e o histórico de entregas é evidência somente leitura. Trate nomes de eventos duplicados de forma idempotente.

Webhooks de pagamento são separados. Webhooks de provedores liquidam valores e são registrados no painel de cada provedor. Webhooks de saída do fornecedor são para as suas próprias integrações. Não aponte um provedor de pagamento para um endpoint de webhook de fornecedor.

Checklist de aceitação da integração

  • O provedor aparece como configurado e ativado na página de administração ou configurações.
  • Uma mensagem ou upload de teste real chega ao provedor e a URL retornada carrega.
  • O e-mail de teste chega; SPF, DKIM e DMARC passam.
  • A mídia enviada é armazenada no bucket e servida pela CDN.
  • O callback OIDC ou SAML retorna à rota esperada do frontend.
  • As assinaturas dos webhooks de saída são verificadas no receptor.
  • As novas tentativas não duplicam efeitos colaterais.
  • Credenciais de teste e de produção não são misturadas.
Avançado9 min de leitura

Backups & atualizações

Um caminho repetível de backup, restauração e atualização para uma implantação auto-hospedada do FastRestful. Os backups vêm primeiro; o método de atualização depende de como você comprou e implantou o produto.

Instalação licenciada da Dakidarts? Use Licenciamento & atualizações oficiais para versões oficiais assinadas e rollback com um clique. Este guia ainda cobre o plano de backup e restauração e o caminho manual de atualização do código-fonte.

O que fazer backup

DadosPor quêMétodo
PostgreSQLInquilinos, produtos, versões, assinaturas, faturas, auditoria, conteúdo, metadados de chaves.Dump lógico noturno mais backup contínuo do provedor.
Mídia no S3Assets da biblioteca, logos, avatares, imagens do CMS.Versionamento e replicação entre regiões quando necessário.
Blobs de especificaçãoContratos OpenAPI quando SPEC_STORAGE=s3.Incluídos no backup do S3.
Segredos de ambienteDJANGO_SECRET_KEY, FIELD_ENCRYPTION_KEY, credenciais de provedores.Gerenciador de segredos com controle de acesso e histórico de rotação.
Configuração de build do frontendValores de NEXT_PUBLIC_* e configurações de hospedagem.Infraestrutura como código ou notas de implantação.
Aviso sobre a chave de criptografia. Perder FIELD_ENCRYPTION_KEY torna chaves de API criptografadas e segredos de provedores irrecuperáveis. Faça backup dele separadamente do banco de dados, com controle de acesso rigoroso.

Backup do PostgreSQL

shell
pg_dump --format=custom "$DATABASE_URL" > fastrestful-$(date +%F-%H%M).dump
pg_dump --format=plain "$DATABASE_URL" | gzip > fastrestful-$(date +%F-%H%M).sql.gz

# Verify the dump is readable
pg_restore --list fastrestful-$(date +%F-%H%M).dump > /dev/null

Restaure em um banco de dados limpo

shell
createdb fastrestful_restore
pg_restore --clean --if-exists --no-owner \
  --dbname=fastrestful_restore fastrestful-2026-10-21.dump

# Point a staging deployment at the restored database and run:
python3.11 manage.py migrate --check
python3.11 manage.py check

Teste restaurações trimestralmente. Um backup que nunca foi restaurado é uma suposição, não um plano de recuperação.

Duas formas de atualizar

CaminhoUse quandoComece aqui
Central de atualizações oficialVocê comprou o FastRestful da Dakidarts e executa uma implantação a partir do código-fonte ou em VM.Licenciamento e atualizações oficiais
Atualização manual do código-fonteVocê mantém um fork personalizado, cria suas próprias imagens ou não usa o LicenseHub.A sequência abaixo.

Sequência de atualização manual

Use isto apenas para uma implantação personalizada que não é gerenciada pela central de atualizações oficial.

  1. Leia as notas da versão e verifique mudanças de migração ou de ambiente.
  2. Faça backup do PostgreSQL, da mídia e dos segredos.
  3. Coloque a plataforma em modo de manutenção se uma migração exigir pausa de escrita.
  4. Baixe o código e instale as dependências de backend e frontend.
  5. Execute as migrações, colete os arquivos estáticos e faça o build do frontend.
  6. Reinicie a API e os workers; verifique a prontidão e faça uma requisição de smoke test.
  7. Saia do modo de manutenção e monitore a taxa de erros, a profundidade da fila e os recebimentos de webhook.
Depois de qualquer um dos caminhos de atualização, reinicie o Gunicorn, o worker e o beat do Celery e o processo de build do frontend, se ele rodar no mesmo host. Depois verifique /api/health/ready, envie uma requisição de teste rápido e abra Administração → Eventos de pagamento para confirmar que nenhuma entrega de provedor falhou durante a reinicialização.
shell
git pull --ff-only
pip install -r backend/requirements.txt
npm ci

python3.11 backend/manage.py migrate --noinput
python3.11 backend/manage.py collectstatic --noinput
npm run build

sudo systemctl restart fastrestful
sudo systemctl restart fastrestful-worker fastrestful-beat
curl -f https://api.example.com/api/health/ready

Rollback

  • O rollback de código é simples apenas quando a versão anterior não exigiu uma migração de banco de dados irreversível.
  • Mantenha um snapshot do banco de dados antes de cada migração. Restaure o snapshot e a versão de código correspondente juntos.
  • Nunca edite uma migração já aplicada em produção; adicione uma nova migração corretiva.
  • Após o rollback, execute novamente a requisição de smoke test e inspecione as tarefas enfileiradas em busca de suposições de schema.

Segurança das migrações

preflight
python3.11 manage.py showmigrations
python3.11 manage.py makemigrations --check --dry-run
python3.11 manage.py migrate --plan
  • Primeiro mudanças aditivas, depois preenchimento, e a remoção dos campos antigos em uma versão posterior.
  • Evite bloqueios longos de tabela em tabelas de alta volume de medição, log de requisições e auditoria.
  • Use o modo de manutenção para migrações que alteram colunas de estado financeiro ou de versão.
  • Mantenha o Celery pausado até que as migrações terminem.

Versões do frontend

O build do frontend é estático e autossuficiente. Mantenha a origem da API e a URL pública do site alinhadas com a implantação. Se você implantar um novo build que espera novos campos da API, lance o backend primeiro ou mantenha o contrato compatível com versões anteriores.

Avançado9 min de leitura

Observabilidade

Saúde, logs, métricas e filas para uma plataforma em que requisições, dinheiro e moderação deixam evidências.

Saúde e prontidão

SondaO que responde
GET /api/health/liveO processo está ativo?
GET /api/health/readyO processo consegue acessar o banco de dados e o cache compartilhado?
GET /api/schema/O contrato da API pode ser servido?
Renderização de rota do frontendO shell público consegue carregar a marca e o conteúdo?

Use a prontidão para a participação no balanceador de carga. Uma indisponibilidade de cache retorna 503 com a dependência com falha, em vez de servir com estado apenas local.

Contexto da requisição

  • Toda resposta da API carrega metadados da requisição nos logs da aplicação. Preserve o request ID através do seu proxy reverso.
  • Os logs de requisição do gateway incluem assinatura, produto, endpoint, status, latência e prévias com dados sensíveis mascarados.
  • Os eventos de provedor armazenam IDs de evento e hashes de payload, não segredos brutos.
  • Os eventos de auditoria vinculam ator, ação, organização, destino e metadados.

Sinais para monitorar

ÁreaSinalLimite de ação
APITaxa de 5xx, latência p95Acione o plantão em caso de 5xx sustentado ou regressão de latência.
GatewayTaxa de erros upstream, contagem de circuitos abertosInvestigue a saúde do fornecedor antes de aumentar cotas.
Banco de dadosConexões, consultas lentas, discoEscale ou adicione índices antes da saturação.
RedisMemória, evictions, erros de conexãoEvictions podem fazer o comportamento de cotas e limites de taxa falhar.
CeleryProfundidade da fila, falhas de tarefas, heartbeat do beatAlertar se a liquidação ou a fila de e-mail parar.
DinheiroWebhooks com falha, reembolsos pendentes, exceções de repasseReconcilie antes de tentar novamente sem critério.
E-mailTaxa de rejeição, reclamações, taxa de descadastroSuprima e investigue quando acima do normal.

Regras de logging

  • Nunca registre em log chaves de API brutas, segredos de provedores ou payloads completos de pagamento.
  • Mantenha as prévias de requisição/resposta limitadas e com dados sensíveis mascarados.
  • Registre IDs de eventos de provedor e resultados de liquidação, não dados de cartão.
  • Use campos estruturados sempre que possível: request ID, organização, produto, endpoint, status.
  • Separe as evidências de auditoria dos logs comuns da aplicação.

Filas e trabalhos agendados

shell
celery -A config inspect ping
celery -A config inspect active
celery -A config inspect reserved
celery -A config inspect scheduled

Monitore as filas default e de cobrança de forma independente. A liquidação roda mensalmente; a moderação e as notificações rodam a cada 15 minutos; as verificações de disponibilidade rodam diariamente.

Conjunto mínimo de alertas

  • Prontidão falhando por mais de 2 minutos.
  • Taxa de 5xx da API acima do objetivo de serviço.
  • Circuito do gateway aberto ou taxa de erros upstream em pico.
  • Falhas de webhook ou eventos de provedor não processados.
  • Heartbeat do Celery beat ausente; profundidade da fila crescendo.
  • Saturação de disco e conexões do banco de dados.
  • Falha de backup ou último backup bem-sucedido muito antigo.
  • Queda inesperada na adesão à autenticação de dois fatores entre a equipe.

Comandos de diagnóstico

shell
python3.11 manage.py check --deploy
python3.11 manage.py showmigrations
python3.11 manage.py prune_telemetry --request-log-days 90 --usage-event-days 365
python3.11 manage.py check_api_availability
python3.11 manage.py checklinks --limit 200 --timeout 6
Avançado8 min de leitura

Escalonamento

Onde o FastRestful escala sem problemas, onde precisa de infraestrutura e qual estado deve permanecer compartilhado.

Escale as camadas separadamente

topologia
edge / CDN
  ├── frontend static assets
  └── API reverse proxy
        ├── Django / Gunicorn replicas
        ├── Celery workers (default queue)
        ├── Celery workers (billing queue)
        ├── Celery beat (one instance)
        ├── PostgreSQL primary + read capacity
        └── Redis (shared cache + broker)

Camada web

  • Execute várias instâncias Gunicorn/Django sem estado atrás de um balanceador de carga.
  • As sessões ficam no banco de dados; o cache e os limites de taxa usam Redis. Não dependa de memória local em produção.
  • Dimensione os workers para a requisição de gateway mais lenta (timeout padrão de 15 segundos).
  • Termine o TLS na borda e preserve o host original para o roteamento de produtos.

Banco de dados

  • Use PostgreSQL com pool de conexões à medida que o número de workers cresce.
  • Tabelas de alto volume: eventos de uso, logs de requisição, eventos de auditoria, entregas de webhook.
  • Remova telemetria periodicamente e arquive evidências de auditoria conforme a política.
  • Mantenha as gravações de estado financeiro transacionais; não faça sharding de tabelas de fatura ou ledger sem um plano de migração.

Redis

  • O cache compartilhado é obrigatório para os limites de taxa e a idempotência do gateway.
  • Uma indisponibilidade do Redis retorna 503 com nova tentativa possível antes da reserva de cota; o gateway não recorre a estado por processo.
  • Monitore evictions. A perda de registros de idempotência pode permitir chamadas upstream duplicadas após mudanças de TTL.
  • Use um banco de dados ou uma instância Redis separada para o broker do Celery se a pressão de cache aumentar.

Capacidade do gateway

  • As cotas e os limites de taxa são aplicados por assinatura e endpoint, não por processo.
  • A latência upstream domina o tempo da requisição; mantenha timeouts e novas tentativas conservadores.
  • O armazenamento de idempotência cresce com o volume de requisições; dimensione o Redis para o TTL configurado.
  • Use roteamento por host de produto com TLS curinga para evitar um gargalo de caminho central na borda.

Workers e trabalhos agendados

  • Execute uma única instância beat; vários agendadores beat podem duplicar trabalhos temporizados.
  • Escale as filas de cobrança e default separadamente.
  • Mantenha a liquidação idempotente; novas execuções são seguras por design.
  • Aplique backpressure nas filas de e-mail e moderação com concorrência de workers, em vez de desativar novas tentativas.

Mídia e CDN

  • Mova os uploads para o S3 antes que o ciclo de vida do disco local se torne um problema.
  • Sirva pelo CloudFront com nomes de objeto imutáveis e cache de longa duração.
  • Mantenha o acesso à origem privado; evite políticas de bucket públicas.
  • Use a limpeza por asset apenas quando uma chave de objeto for reutilizada intencionalmente.

Checklist de capacidade

  • Alertas de prontidão e 5xx estão conectados ao acionamento de plantão.
  • O PostgreSQL tem folga para conexões, disco e IOPS.
  • O Redis tem folga para cache e registros de idempotência.
  • A profundidade da fila do Celery e o heartbeat do beat são monitorados.
  • O armazenamento de objetos e a CDN estão fora do servidor web.
  • A retenção de telemetria é configurada antes do crescimento, não depois.
Avançado10 min de leitura

Modelo de dados e permissões

As entidades que definem o FastRestful, os limites de inquilino em torno delas e as invariantes que mantêm dinheiro e versões consistentes.

Inquilinos

Organization é o limite do inquilino. Um usuário entra por meio de um Membership com um papel. A organização ativa é transmitida explicitamente e resolvida no servidor antes do acesso ao objeto.

FunçãoPropósito
ProprietárioControle total do espaço de trabalho, cobrança, equipe e operações de fornecedores. Último proprietário protegido.
AdministradorEquipe, aplicativos, chaves, assinaturas, publicação, cobrança, suporte.
DesenvolvedorAplicativos, chaves, testes de endpoint, publicação quando permitido.
CobrançaFaturas, cupons, reembolsos, repasses, métodos de pagamento.
VisualizadorVisibilidade somente leitura do espaço de trabalho.

Entidades principais

DomínioEntidades
IdentidadeUser, Organization, Membership, OrganizationInvite, VendorProfile, TwoFactorDevice, LoginCode
CatálogoCategory, ApiProduct, ApiVersion, Endpoint, ApiAvailabilityCheck
AcessoApplication, ApiKey, Plan, Subscription, Coupon
MediçãoUsageEvent, MonthlyCounter
DinheiroInvoice, Payout, LedgerEntry, PaymentEvent, PayoutProviderEvent, RefundRequest
PlataformaSiteSettings, PlatformPlan, PlatformSubscription, SiteNavigationItem, ContentPage, SiteLocale, SiteAsset
EngajamentoEmailList, Contact, Campaign, EmailTemplate, Automation, Banner, ShortLink
ConfiançaAbuseReport, ModerationAppeal, ModerationPolicy, SafetyEnforcement, ProfileBlock, DirectMessage
OperaçõesRequestLog, WebhookEndpoint, WebhookDelivery, Ticket, TicketMessage, AuditEvent, ExportJob

Invariantes

  • Um produto tem apenas uma versão ativa por vez.
  • O contrato e o catálogo de endpoints de uma versão ativa não podem ser editados.
  • Uma assinatura tem termos comerciais imutáveis; alterações criam um novo plano.
  • Uma chave de API pertence a exatamente um aplicativo e não pode transitar entre aplicativos.
  • Um ID de evento de provedor é registrado uma única vez; reenvios não liquidam duas vezes.
  • Os repasses seguem uma máquina de estados monotônica.
  • Os lançamentos do ledger são somente de acréscimo.
  • O último proprietário ativo do espaço de trabalho não pode ser removido nem rebaixado.

Verificações de permissão

OperaçãoAutoridade necessária
Alterações de equipe e espaço de trabalhoProprietário ou administrador
Publicar/promover produtoProprietário, administrador ou desenvolvedor na organização proprietária
Fatura, reembolso, repasse, cupomProprietário, administrador ou cobrança
Configurações da plataformaSuperusuário / permissões explícitas de staff
Revisão de perfil de fornecedorStaff com permissão no modelo de fornecedor
Decisão de moderaçãoStaff com permissão no modelo de segurança

Exclusão e retenção

  • Tickets nunca são excluídos; eles permanecem como evidência de suporte.
  • O histórico de versões ativas permanece disponível para auditoria mesmo após a descontinuação.
  • Eventos de auditoria e recibos de provedores são somente de acréscimo.
  • Logs de requisição e eventos de uso são removidos conforme a retenção configurada.
  • As exclusões de mídia usam o ciclo de vida do asset e devem respeitar referências em uso.

Estendendo o modelo

  1. Comece por um fluxo de trabalho real, não por um campo hipotético.
  2. Mantenha dados exclusivos da plataforma fora de serializers anônimos.
  3. Valide na camada de modelo/API; adicione restrições de banco de dados para dinheiro e transições de estado.
  4. Adicione testes de contrato para permissões, limites de inquilino e idempotência.
  5. Documente a superfície do operador antes de lançar o modelo.
Avançado8 min de leitura

Extensões

Estenda a experiência pública e o fluxo operacional sem bifurcar o núcleo: assets personalizados, seções de CMS, sobreposições de idioma, webhooks e padrões de administração.

CSS e JavaScript personalizados

Administração → Assets personalizados injeta um snippet no site público. Cada snippet tem um tipo, posicionamento, escopo e estado ativo.

CampoOpções
TipoCSS ou JavaScript
PosicionamentoCabeçalho ou rodapé
EscopoSite inteiro, caminhos selecionados ou uma página
Padrões de caminhoCaminhos exatos e curingas /prefix/*
  • Cada salvamento cria uma revisão imutável com autor e nota; qualquer revisão pode ser restaurada como uma nova entrada.
  • Visualize o site em produção em um iframe da administração com o snippet injetado à força.
  • Use o nonce de CSP configurado tanto nas configurações do site quanto na política de borda; as tags injetadas o recebem automaticamente.
  • Trate os snippets como código confiável do operador. Eles podem alterar o estilo ou instrumentar o site público.

Seções estruturadas do CMS

Páginas e posts são montados a partir de seções ordenadas. O editor inclui texto, tabela, código, imagem, vídeo, split, citação, abas, grupos de código, exemplos de endpoint, depoimentos, recursos, FAQ, etapas, métricas, cards, divisores, hero, faixa de logos, linha do tempo, lista de links, callouts, coleções de API, coleções de categoria, principais APIs e artigos recentes.

  • Use seções estruturadas em vez de colar HTML arbitrário.
  • Defina o rótulo da ação e o destino juntos.
  • Use caminhos do site, HTTPS, mailto ou destinos tel.
  • Mantenha textos alternativos de imagem significativos; o texto do corpo pode servir como legenda.
  • Páginas publicadas entram na navegação e nos metadados do sitemap apenas quando estão ativas.

Sobreposições de idioma

O inglês é o bundle canônico; o francês é distribuído completo. Adicione outro idioma na administração, importe um bundle JSON ou TypeScript e substitua apenas as chaves necessárias.

  • Os valores incluídos permanecem como fallback quando uma chave de sobreposição está vazia.
  • Chaves desconhecidas são ignoradas e reportadas durante a importação.
  • Exporte JSON ou TypeScript para tradução offline.
  • Execute npm run export:i18n após editar o bundle do frontend e reinicie a API.

Webhooks de saída

Os webhooks de fornecedor entregam eventos assinados a endpoints HTTPS com histórico de entregas seguro para novas tentativas. Mantenha o segredo de assinatura no espaço de trabalho do fornecedor e verifique a assinatura antes de agir sobre um payload.

  • Use uma URL de endpoint estável e retorne 2xx rapidamente.
  • Trate os eventos como pelo menos uma vez e torne os handlers idempotentes.
  • Use o log de entregas para inspecionar o status da resposta e as prévias.
  • Não reutilize rotas de webhook de provedor de pagamento para eventos de fornecedor.

Padrão de extensão da administração

  1. Registre o modelo com comportamento explícito de lista, filtro, busca e permissão.
  2. Adicione um formulário de administração focado, em vez de expor campos internos brutos.
  3. Use eventos de auditoria para ações que alteram estado.
  4. Adicione uma página de prévia ou relatório apenas quando ela responder a uma pergunta real do operador.
  5. Teste os limites de permissão e a separação entre serializers públicos e privados.

Padrão de extensão da API

  • Mantenha o escopo de inquilino antes de cada consulta.
  • Use serializers explícitos de requisição/resposta.
  • Retorne códigos de erro estáveis para o comportamento do cliente.
  • Torne as novas tentativas seguras com idempotência onde houver dinheiro ou estado envolvido.
  • Adicione anotações OpenAPI para que o schema permaneça utilizável.
Referência10 min de leitura

Administração

O plano de controle da equipe é uma superfície de administração do Django ciente de permissões para operações da plataforma. Ele não usa métricas de demonstração nem ignora permissões de modelo.

Visão geral das operações do plano de controle da equipe do FastRestful com tráfego, catálogo, receita e filas de decisão
A visão geral da equipe é um snapshot ao vivo, ciente de permissões, dos registros atuais da plataforma.

Limite de acesso

  • O acesso da equipe exige is_staff. Um papel de admin no espaço de trabalho não é staff da plataforma.
  • A autenticação de dois fatores pode ser exigida para todas as contas nas configurações do site.
  • As permissões de modelo do Django e o comportamento registrado de ModelAdmin são respeitados.
  • As leituras da administração podem ser mais amplas que as gravações; a propriedade do objeto e o estado do provedor ainda condicionam ações consequentes.
  • Toda ação sensível deve criar um evento de auditoria com ator, destino e metadados.

Visão geral das operações

/admin/ mostra um snapshot ao vivo e somente leitura, construído a partir dos registros atuais: tráfego, APIs públicas, consumidores ativos, espaços de trabalho ativos, mensagens de contato, adoção de dois fatores, avisos da plataforma, filas de atenção, estado de pagamentos, fluxo de auditoria, experiência do site e cobertura de idiomas.

  • Ações rápidas: criar API, revisar fornecedores, configurações do site, planos da plataforma, estúdio de conteúdo, newsletter, banners, links.
  • Filas de decisão: fornecedores, moderação, recursos, restrições de segurança, suporte, webhooks com falha, repasses, faturas, caixa de entrada de contato.
  • Painel de pagamentos: receita por provedor, assinaturas ativas, MRR, checkouts pendentes, recibos de webhook, reembolsos, links de gateway.

Seções do plano de controle

SeçãoModelos / fluxos de trabalho
Catálogo de APIsProdutos, categorias, versões, endpoints, avaliações, verificações de disponibilidade, configurações do portal.
FornecedoresRevisão, aprovação, suspensão e reenvio de perfil de fornecedor.
Finanças e repassesGateways de pagamento, faturas, repasses, ledger, cupons, eventos de pagamento, reembolsos, eventos de provedor.
Tickets de suporteFilas, prioridade, status, contexto da requisição, respostas.
Confiança e segurançaDenúncias de abuso, recursos, política de moderação, bloqueios de perfil, ledger de aplicação de medidas.
Confiabilidade e usoLogs de requisição, registros de idempotência, eventos de uso, contadores mensais, eventos de auditoria.
Espaços de trabalho e acessoOrganizações, associações, convites, aplicativos, chaves de API, planos, assinaturas, planos da plataforma.
IntegraçõesEndpoints de webhook e histórico de entregas.
Newsletter e e-mailModelos, listas, contatos, segmentos, campanhas, automações, e-mails rastreados, eventos, configurações.
Experiência do siteMídia, coleções, configurações do site, navegação, páginas de conteúdo, assets personalizados, idiomas.
Identidade e segurançaUsuários, códigos de login, grupos, tokens na blacklist/pendentes.
Mensagens e comunidadeNotificações da plataforma, mensagens de contato, mensagens diretas, preferências, seguidores, notificações de usuário, mensagens de ticket.

Moderação e segurança

  • As denúncias carregam tipo/rótulo do alvo, categoria, evidências, prioridade, prazo de SLA, atribuição e resumos de resolução privados/públicos.
  • A equipe configura janelas de SLA por prioridade, limites de escalonamento e janelas de recurso em Política de moderação.
  • Denúncias encerradas elegíveis podem ser contestadas uma vez dentro da janela; a decisão pública original permanece anexada.
  • Recursos aceitos reabrem o caso com um novo SLA derivado da política.
  • Resolver uma denúncia mantida pode emitir uma medida de segurança auditável: advertência, restrição de comunidade, restrição de publicação ou restrição de plataforma.
  • Os registros de aplicação de medidas mostram pontos, motivo público, datas de vigência e status, e somente o usuário afetado ou membros ativos do fornecedor podem lê-los.

Suporte e equipe

  • Os tickets vinculam consumidor, produto, assinatura e contexto opcional de log de requisição.
  • As mensagens avançam o timestamp de atividade do ticket para que as filas permaneçam ordenadas pela resposta mais recente.
  • Convites de equipe, alterações de papel, desativação e remoção são exclusivos de proprietário/administrador; o último proprietário ativo não pode ser removido.
  • Os convites são hasheados, de uso único, vinculados ao e-mail e expiram.

Planos da plataforma e reconciliação

  • No máximo cinco planos de plataforma; os códigos permanecem estáveis após a criação.
  • Preço de exibição, IDs de provedor mensal/anual, limite de espaços de trabalho, limite de listagem de APIs, benefícios e recomendação.
  • Planos pagos ficam não publicados até existir um par de valor + ID de preço recorrente do provedor.
  • A reconciliação de assinaturas da plataforma, somente leitura, mostra estado e direito sem permitir divergência da equipe em relação ao provedor.

Notificações da plataforma

Avisos criados pela equipe se distribuem em linhas de caixa de entrada por usuário. O público pode ser todas as contas ou apenas a equipe; os níveis são info, notice e critical. As contagens de entrega aparecem no snapshot de operações.

Auditoria e exportações

  • Eventos de auditoria somente de acréscimo com ator, ação, organização, destino e metadados.
  • Os trabalhos de exportação suportam fluxos de revisão de segurança e retenção.
  • As listas da administração expõem visões filtradas, busca e CSV quando apropriado.
  • Nunca coloque segredos brutos, chaves de API ou payloads de provedores nos metadados de auditoria.

Gerenciamento de idiomas

Idiomas do site → Gerenciar traduções mostra idiomas incluídos e gerenciados, cobertura e chaves ausentes. O francês incluído é editável por uma sobreposição da administração. A importação/exportação suporta JSON e literais TypeScript; chaves desconhecidas são ignoradas e reportadas.

Referência10 min de leitura

Referência da API

A API do FastRestful é uma superfície do Django REST Framework com raiz em /api/v1/. O OpenAPI é servido pelo backend e é o contrato autoritativo.

URLs base e documentação

SuperfícieURL
Raiz da APIhttps://api.example.com/api/v1/
Schema OpenAPI/api/schema/
Swagger UI/api/docs/
Saúde/api/health/live, /api/health/ready
Host do produtohttps://{product-slug}.api.example.com
Alias de caminho do produto/api/v1/{product-slug}/...

Autenticação

obter tokens
curl --request POST \
  --url 'https://api.example.com/api/v1/auth/token/' \
  --header 'Content-Type: application/json' \
  --data '{"username":"you@example.com","password":"..."}'

# Response
{"access":"...", "refresh":"...", "user": {...}}
chamada autenticada
curl --request GET \
  --url 'https://api.example.com/api/v1/dashboard/consumer/' \
  --header 'Authorization: Bearer <access>' \
  --header 'X-Organization: <organization-uuid>'

Namespaces

PrefixoFinalidade
/auth/Token, refresh, cadastro, me, logout, redefinição de senha, perfil, 2FA, SSO, SAML, convites.
/orgs/, /memberships/, /organization-invites/Espaços de trabalho, papéis, convites, equipe.
/products/, /versions/, /endpoints/, /plans/, /categories/Catálogo e ciclo de vida da API.
/applications/, /keys/, /subscriptions/Acesso e direitos do consumidor.
/dashboard/Read models de resumo do consumidor e do fornecedor.
/gateway/execute/Envelope legado do gateway seguro (rotas diretas são preferíveis).
/request-logs/, /usage-events/, /usage-counters/Medição e observabilidade.
/invoices/, /payouts/, /ledger/, /coupons/, /billing/Dinheiro, reembolsos, webhooks de provedores.
/support/ (tickets, ticket-messages)Fila de suporte e respostas.
/media/, /media-collections/Biblioteca de mídia e seletor.
/newsletter/Cadastro público, rastreamento, preferências.
/short-links/Links curtos, QR, cliques, saúde, importação/exportação.
/announcements/Entrega pública de banners e eventos.
/platform/Configurações, identidade visual, metadados, conteúdo do site, planos, assinaturas, idiomas, assets, disponibilidade.
/moderation-appeals/, /safety-enforcements/Histórico de casos de segurança e restrições.
/messages/, /blocks/, /reports/, /reviews/Comunidade e confiança.
/audit-events/, /export-jobs/Trilha de auditoria e exportações.
/webhook-endpoints/, /webhook-deliveries/Gerenciamento de webhooks assinados.

Mapa dos endpoints principais

Método + caminhoFinalidade
POST /auth/token/, POST /auth/token/refresh/Login por senha e refresh de token rotativo.
POST /auth/register/Crie um usuário e um primeiro espaço de trabalho opcional.
GET /auth/me/Usuário da sessão, organizações e capacidade de publicação.
GET /orgs/, GET /memberships/Espaços de trabalho e associação de papéis.
GET /products/, GET /products/{slug}/Catálogo de produtos público e visível para o inquilino.
POST /products/{slug}/import-spec/Importe um contrato OpenAPI ou Swagger em uma versão de rascunho.
GET /versions/{id}/diff/?against=Compare dois contratos de versão.
POST /versions/{id}/promote/Promova uma versão validada e aposente a versão ativa anterior.
GET /products/{slug}/publication-readiness/Retorne os quatro gates de publicação.
GET /applications/, GET /keys/Aplicativos de consumidor e credenciais com escopo.
POST /keys/{id}/rotate/, POST /keys/{id}/revoke/Substitua ou revogue uma chave com segurança.
GET /subscriptions/, POST /{id}/cancel/Planos ativos e cancelamento.
POST /subscriptions/{id}/change-plan/Mude para outro plano elegível.
POST /gateway/execute/Envelope legado do gateway seguro.
GET /dashboard/consumer/, GET /dashboard/vendor/Read models de resumo do consumidor e do fornecedor.
GET /request-logs/Histórico de requisições com escopo de inquilino e dados sensíveis mascarados.
GET /usage-events/, GET /usage-counters/Detalhe de medição e contadores mensais.
GET /invoices/, POST /invoices/{id}/pay/Histórico de cobrança e checkout do provedor.
POST /invoices/{id}/refund/Reembolso total ou parcial pelo gateway original.
GET /payouts/, POST /payouts/{id}/transfer/Liquidação do fornecedor e transferência pelo provedor.
POST /payouts/{id}/reconcile/Aplique o resultado estrito do provedor a um repasse.
GET/POST /media/, GET /media/supported-types/Biblioteca de mídia e validação de upload.
POST /newsletter/subscribe/Cadastro público em lista, com double opt-in opcional.
GET /short-links/, GET /short-links/{id}/qr/Gerenciamento de links, redirecionamentos e assets de QR.
GET /announcements/?path=Melhor banner público para cada posicionamento.
GET /platform/branding/, GET /platform/site-content/Shell público, metadados, navegação e conteúdo publicado.
GET /platform/plans/, GET /platform/subscription/Planos da plataforma e direito atual.
GET /platform/locales/, GET /platform/assets/Sobreposições de idioma ativas e assets personalizados.
GET /tickets/, GET/POST /ticket-messages/Fila de suporte, respostas e contexto da requisição.
GET /reports/, GET /moderation-appeals/Histórico de casos de segurança e elegibilidade para recurso.
GET /webhook-endpoints/, GET /webhook-deliveries/Configuração de webhooks de saída e evidências de entrega.
GET /audit-events/, GET /export-jobs/Trilha de auditoria e status de exportação.

Paginação e filtragem

Os endpoints de lista usam um contrato de número de página: page, page_size, search, ordering e filtros de recurso. As respostas usam {count, next, previous, results}. A ordenação aceita um nome de campo, opcionalmente prefixado com -.

exemplo
GET /api/v1/products/?page=2&page_size=25&search=delivery&ordering=-rating_average
GET /api/v1/invoices/?status=paid&ordering=-created_at
GET /api/v1/request-logs/?status_class=server&ordering=-created_at

Formato dos erros

Erros de validação usam o objeto com chaves de campo do DRF. Erros de gateway e da plataforma usam um objeto JSON com um código legível por máquina, uma mensagem humana e metadados opcionais de nova tentativa.

erro típico
{
  "detail": "Monthly quota exceeded.",
  "code": "quota_exceeded",
  "retry_after": 300
}

Formato da chamada ao gateway

requisição direta
GET https://signal-stack.api.example.com/v2/deliveries?limit=10
X-API-Key: fr_live_…
Idempotency-Key: request-8241

{
  "status": 200,
  "latency_ms": 84,
  "content_type": "application/json",
  "data_preview": "...",
  "headers": {...}
}

Webhooks

Existem dois tipos de webhook no FastRestful. Mantenha-os separados:

TipoDireçãoFinalidade
Webhooks de saída do fornecedorFastRestful → seu servidorNotifique seus sistemas sobre eventos da plataforma. Assinado com X-FastRestful-Signature: sha256=<hex> e X-FastRestful-Event.
Webhooks de provedores de pagamentoProvedor → FastRestfulLiquidam faturas, assinaturas, reembolsos e repasses. Os esquemas de assinatura variam por provedor.
rotas de provedores de pagamento
POST /api/v1/billing/stripe-webhook/
POST /api/v1/billing/paypal-webhook/
POST /api/v1/billing/flutterwave-webhook/
POST /api/v1/billing/paystack-webhook/
POST /api/v1/billing/razorpay-webhook/
  • Os endpoints de webhook de fornecedor devem usar HTTPS e armazenar um segredo de assinatura.
  • As entregas são assinadas, repetidas com segurança e registradas com status e prévia da resposta.
  • Os webhooks de provedores de pagamento são registrados no painel de cada provedor, não na seção de webhooks de fornecedor.
  • Os IDs de evento de provedor são únicos; eventos assinados duplicados são confirmados sem liquidação dupla.
  • A configuração e as listas de eventos de webhook estão em Gateways de pagamento, passo a passo.

Fluxo de trabalho OpenAPI

shell
cd backend
python3.11 manage.py spectacular --file schema.yml --validate

Use o schema gerado para SDKs, Postman ou testes de contrato. Os contratos OpenAPI de nível de produto são separados: eles são importados nas versões da API e promovidos pelo pipeline de versões.

Como destravar

Se um endpoint retornar um código inesperado, verifique primeiro o request ID, o método de autenticação, o header do espaço de trabalho e o estado da assinatura. O Guia de solução de problemas cobre os modos de falha comuns em ordem.