Sistema de autenticação simples e funcional construído com Next.js 16 App Router, Drizzle ORM e SQLite.
- Next.js v16.1.6 - App Router
- TypeScript - Type safety
- Drizzle ORM - Database ORM
- SQLite - Database
- TailwindCSS v4 - Styling com tema escuro
- pnpm - Package manager
- Zod - Schema validation
src/
├── actions.ts # Server Actions (login, register, logout)
├── schemas.ts # Zod schemas para validação
├── app/
│ ├── (auth)/
│ │ ├── login/ # Página de login
│ │ └── register/ # Página de cadastro
│ ├── api/auth/logout/ # API route para logout
│ ├── dashboard/ # Página protegida
│ ├── layout.tsx # Layout principal
│ └── page.tsx # Home
├── components/
│ ├── auth/
│ │ ├── SigninForm.tsx # Formulário de login
│ │ └── SignupForm.tsx # Formulário de cadastro
│ └── AuthNav.tsx # Navegação autenticada
├── db/
│ ├── index.ts # Conexão com DB
│ ├── schema.ts # Schema Drizzle
│ └── seed.ts # Seed data
└── lib/
├── password.ts # Hash de senhas
└── session.ts # Gestão de sessões
-
Instale dependências
pnpm install
-
Configure o banco de dados
pnpm push
-
Inicie o servidor
pnpm dev
-
Acesse
http://localhost:3000
- ✅ Login - Autenticação com email e senha
- ✅ Cadastro - Registro de novos usuários
- ✅ Logout - Encerramento de sessão
- ✅ Sessões - Gestão com cookies seguros
- ✅ Proteção de rotas - Middleware para
/dashboard - ✅ Validação - Zod schemas para forms
- ✅ UI Responsiva - TailwindCSS com tema escuro
- ✅ Segurança - Hash de senhas com crypto
- Senhas hasheadas com
crypto.scrypt() - Sessões com cookies httpOnly e secure
- Validação de inputs com Zod
- Proteção contra timing attacks
pnpm dev- Servidor de desenvolvimentopnpm build- Build para produçãopnpm start- Servidor de produçãopnpm lint- Verificação com Biomepnpm format- Formatação com Biomepnpm push- Push do schema Drizzle
- Oracle Linux 9 com SELinux ativado
- Nginx instalado
- Node.js e pnpm configurados
- Certificado SSL (Let's Encrypt)
/var/www/auth.paxa.dev/ # Aplicação Next.js
/etc/nginx/conf.d/ # auth.paxa.dev.conf
/etc/systemd/system/ # auth.paxa.dev.service
# Clone o repositório
cd /var/www
sudo git clone <repo-url> auth.paxa.dev
cd auth.paxa.dev
# Instale dependências e build
pnpm install
pnpm build
# Configure permissões
sudo chown -R nginx:nginx /var/www/auth.paxa.dev# Copie o arquivo de configuração
sudo cp files/auth.paxa.dev.conf /etc/nginx/conf.d/
# Teste a configuração
sudo nginx -t
# Não reinicie ainda (aguarde configuração do SELinux)# Copie o arquivo de serviço
sudo cp files/auth.paxa.dev.service /etc/systemd/system/
# Recarregue o systemd (não inicie ainda)
sudo systemctl daemon-reloadO SELinux bloqueia por padrão que o nginx faça proxy reverso e que o systemd execute processos Node.js. Execute o script de configuração:
# Torne o script executável
chmod +x scripts/configure-selinux.sh
# Execute a configuração do SELinux
./scripts/configure-selinux.shO que o script faz:
- Contexto de arquivos: Define
httpd_sys_content_tpara/var/www/auth.paxa.dev - Contexto de escrita: Define
httpd_sys_rw_content_tpara banco de dados SQLite - Proxy reverso: Habilita
httpd_can_network_connect(nginx → localhost:3002) - Porta customizada: Registra porta 3002 como
http_port_t - Permissões extras: Habilita
httpd_setrlimitehttpd_execmempara Node.js
# Inicie e habilite o serviço Next.js
sudo systemctl enable auth.paxa.dev
sudo systemctl start auth.paxa.dev
# Verifique o status
sudo systemctl status auth.paxa.dev
# Reinicie o nginx
sudo systemctl restart nginxEste erro geralmente indica que o SELinux está bloqueando a conexão. Verifique:
# 1. Verifique se o serviço está rodando
sudo systemctl status auth.paxa.dev
sudo ss -tlnp | grep 3002
# 2. Verifique logs do SELinux
sudo ausearch -m avc -ts recent | grep denied
# 3. Verifique logs do serviço
sudo journalctl -u auth.paxa.dev -n 50
# 4. Verifique logs do nginx
sudo tail -f /var/log/nginx/error.log# Ver negações recentes
sudo ausearch -m avc -ts today
# Gerar regras para permitir (modo permissivo)
sudo audit2allow -a
# Analisar por que foi bloqueado
sudo audit2why -a
# Temporariamente desabilitar SELinux (APENAS PARA DEBUG)
sudo setenforce 0 # Permissive
# sudo setenforce 1 # Enforcing (restaurar depois)Se você modificar o diretório da aplicação ou portas, execute novamente:
./scripts/configure-selinux.sh
sudo systemctl restart auth.paxa.dev
sudo systemctl restart nginx- Aplicação clonada e build concluído
- Permissões corretas (
nginx:nginx) - Banco de dados criado e migrado
- Arquivo nginx configurado
- Arquivo systemd configurado
- Script SELinux executado
- Certificado SSL configurado
- Serviço iniciado e habilitado
- Nginx reiniciado
- Site acessível via HTTPS
# 1. Pare o serviço
sudo systemctl stop auth.paxa.dev
# 2. Atualize o código
cd /var/www/auth.paxa.dev
sudo -u nginx git pull
sudo -u nginx pnpm install
sudo -u nginx pnpm build
# 3. Restaure contextos SELinux (se novos arquivos)
sudo restorecon -R /var/www/auth.paxa.dev
# 4. Reinicie o serviço
sudo systemctl start auth.paxa.devO projeto utiliza TailwindCSS v4 com tema escuro configurado. Os componentes seguem um design minimalista com bordas e transições suaves.