Boilerplate completo para aplicações SaaS multi-tenant com opção de frontend Vue 3 ou React 18, compartilhando o mesmo backend NestJS.
Este boilerplate oferece:
- Dual Frontend: Escolha entre Vue 3 ou React 18 (ou use ambos)
- Backend NestJS: API robusta com TypeORM, Auth0 e multi-tenancy
- Monorepo Turborepo: Gerenciamento eficiente com pnpm workspaces
- Multi-Tenant: Isolamento completo de dados por conta
- Autenticação: Auth0 JWT com roles e permissões
- i18n: Suporte a múltiplos idiomas (PT/EN)
boilerplate/
├── apps/
│ └── backend/ # Backend NestJS + TypeORM + Auth0
├── templates/
│ ├── react/ # Template React completo
│ └── vue/ # Template Vue completo
├── scripts/
│ ├── add-react.sh # Adiciona frontend React
│ ├── add-vue.sh # Adiciona frontend Vue
│ └── remove-frontend.sh # Remove frontend
└── install.sh # Script de instalação principal
Nota: Os frontends (Vue/React) NÃO estão inclusos por padrão. Use os scripts para adicionar o frontend de sua escolha.
- Node.js >= 18
- pnpm >= 8.15.5
- Git
Execute o seguinte comando em seu terminal:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/etusdigital/boilerplate/HEAD/install.sh)"Este comando irá:
- Verificar e instalar pnpm se necessário
- Baixar o boilerplate
- Configurar backend e arquivos de ambiente
- Instalar dependências do backend
- Executar migrations e seeds
- Opcionalmente criar um usuário administrador
- Inicializar repositório git
cd nome-do-projeto
# Escolha um:
bash scripts/add-react.sh # Para adicionar React
bash scripts/add-vue.sh # Para adicionar Vue- Clone o repositório:
git clone https://github.com/etusdigital/boilerplate.git nome-do-projeto
cd nome-do-projeto- Instale as dependências do backend:
cd apps/backend
pnpm install
cd ../..- Configure o arquivo de ambiente do backend:
cp apps/backend/.env.example apps/backend/.env- Execute as migrations e seeds:
pnpm run migration- Adicione um frontend (escolha React ou Vue):
# Escolha um:
bash scripts/add-react.sh # Para adicionar React
bash scripts/add-vue.sh # Para adicionar VueO script irá:
- Copiar o template para
apps/frontend-reactouapps/frontend-vue - Criar arquivo
.envbaseado no.env.example - Instalar dependências do frontend
O boilerplate NÃO inclui frontends por padrão. Você deve escolher e adicionar o frontend desejado após a instalação.
bash scripts/add-react.shEste script irá:
- Verificar se React já existe
- Copiar template para
apps/frontend-react - Configurar
.envautomaticamente - Instalar dependências com pnpm
bash scripts/add-vue.shEste script irá:
- Verificar se Vue já existe
- Copiar template para
apps/frontend-vue - Configurar
.envautomaticamente - Instalar dependências com pnpm
bash scripts/remove-frontend.shO script irá:
- Perguntar qual frontend remover (React ou Vue)
- Solicitar confirmação (ação irreversível)
- Remover completamente o frontend escolhido
pnpm devpnpm dev:vue # Apenas Vue frontend (porta 3000)
pnpm dev:react # Apenas React frontend (porta 3000)
pnpm dev:backend # Apenas backend (porta 3001)Para rodar as migrations e seeds:
pnpm run migrationApós executar as migrations e seeds:
- Email:
admin@etus.com - Senha:
o9ac08ZBrSgv
- Desenvolvimento: SQLite
- Produção: PostgreSQL, MySQL ou outros bancos relacionais suportados pelo TypeORM
- Acesse o Auth0 Dashboard
- Crie uma nova API Application
- Configure as URLs permitidas (http://localhost:3000, http://localhost:3001)
- Copie o
Domain,Client ID,Client SecreteAudience
- Crie uma nova Single Page Application
- Configure Allowed Callback URLs:
http://localhost:3000/callback - Configure Allowed Logout URLs:
http://localhost:3000 - Configure Allowed Web Origins:
http://localhost:3000 - Copie o
Client ID
Crie uma Action no fluxo de Login para adicionar roles ao token:
exports.onExecutePostLogin = async (event, api) => {
const namespace = 'https://boilerplate.app/roles';
const roles = event.user.app_metadata?.roles || [];
if (event.authorization) {
api.idToken.setCustomClaim(namespace, roles);
api.accessToken.setCustomClaim(namespace, roles);
}
};Backend (apps/backend/.env):
JWKS_URI=https://YOUR_DOMAIN.auth0.com/.well-known/jwks.json
IDP_ISSUER=https://YOUR_DOMAIN.auth0.com/
IDP_AUDIENCE=YOUR_API_AUDIENCE
AUTH0_DOMAIN=YOUR_DOMAIN.auth0.com
AUTH0_CLIENT_ID=YOUR_API_CLIENT_ID
AUTH0_CLIENT_SECRET=YOUR_API_CLIENT_SECRETFrontend Vue (apps/frontend-vue/.env):
VITE_AUTH0_DOMAIN=YOUR_DOMAIN.auth0.com
VITE_AUTH0_CLIENT_ID=YOUR_SPA_CLIENT_ID
VITE_AUTH0_REDIRECT_URI=http://localhost:3000/callback
VITE_AUTH0_AUDIENCE=YOUR_API_AUDIENCE
VITE_BACKEND_URL=http://localhost:3001Frontend React (apps/frontend-react/.env):
VITE_AUTH0_DOMAIN=YOUR_DOMAIN.auth0.com
VITE_AUTH0_CLIENT_ID=YOUR_SPA_CLIENT_ID
VITE_AUTH0_REDIRECT_URI=http://localhost:3000/callback
VITE_AUTH0_AUDIENCE=YOUR_API_AUDIENCE
VITE_BACKEND_URL=http://localhost:3001pnpm buildIsso irá criar builds otimizados de todos os apps no monorepo.
cd apps/frontend-vue
pnpm test # Unit tests
pnpm test:coverage # Coverage reportcd apps/frontend-react
pnpm test # Unit tests
pnpm test:coverage # Coverage reportcd apps/backend
pnpm test # Unit tests
pnpm test:e2e # E2E tests- Vue 3 + Composition API
- Pinia (State Management)
- Vue Router
- @auth0/auth0-vue
- vue-i18next
- @etus/design-system
- TailwindCSS
- Vite
- React 18 + Hooks
- Zustand (State Management)
- React Router v6
- @auth0/auth0-react
- react-i18next
- TailwindCSS v4
- Vite
- NestJS
- TypeORM
- SQLite (dev) / PostgreSQL (prod)
- Auth0 JWT
- Swagger/OpenAPI
- Class Validator
- ClsModule (Context)
- Turborepo
- pnpm workspaces
- Shared configs (ESLint, TypeScript, Jest)
- Metodologia de Desenvolvimento:
docs/development_methodology_for_developers.md - Guidelines do Projeto:
docs/project_guidelines_for_developers.md - Planos de Implementação:
docs/implementation_plans/ - Lições Aprendidas:
docs/lessons_learned/ - Instruções para Claude Code:
CLAUDE.md
Este boilerplate implementa multi-tenancy com isolamento completo de dados:
- Cada requisição é filtrada por
account-id(header automático) - Backend usa ClsModule para contexto de conta
- Soft deletes em todas as entidades
- Audit logging automático
- RolesGuard baseado em banco de dados
Suporte completo a múltiplos idiomas:
- Português (pt)
- Inglês (en)
Adicionar novo idioma:
- Criar arquivo em
src/app/i18n/locales/[lang].ts - Registrar no
i18n/index.ts - Adicionar traduções
# Desenvolvimento
pnpm dev # Inicia todos os serviços
pnpm dev:vue # Inicia apenas Vue
pnpm dev:react # Inicia apenas React
pnpm dev:backend # Inicia apenas backend
# Build
pnpm build # Build de todos os apps
pnpm build --filter=backend # Build apenas do backend
# Testes
pnpm test # Testes de todos os apps
pnpm lint # Lint de todos os apps
pnpm format # Format com Prettier
# Database
pnpm run migration # Executa migrations e seeds
cd apps/backend && npx typeorm migration:generate src/database/migrations/MigrationName
cd apps/backend && npx typeorm migration:run
# Scripts
bash scripts/add-react.sh # Adiciona React
bash scripts/add-vue.sh # Adiciona Vue
bash scripts/remove-frontend.sh # Remove frontend- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença MIT.
Para dúvidas, issues ou sugestões, abra uma issue no repositório.