BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Seu portal de notícias, resultados e classificações esportivas.
Translation pending
Sports & fitnessTypeScript · DockerfileGitHub @LucierOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Portal esportivo do futebol urucuiense — notícias, classificações, jogos, transmissões ao vivo e galeria de fotos. Acesse http://localhost:3000.Read the full README ↗
Portal esportivo do futebol urucuiense — notícias, classificações, jogos, transmissões ao vivo e galeria de fotos.
| Camada | Tecnologia |
|---|---|
| Framework | Next.js 15 (App Router, Turbopack) |
| Linguagem | TypeScript 5 |
| Banco de dados | PostgreSQL 16 + Drizzle ORM |
| Estilização | Tailwind CSS v4 |
| Autenticação | JWT (jose) + Refresh Tokens + bcryptjs |
| Validação | Zod |
| Testes | Vitest |
| Monitoramento | Sentry |
| Infra | Docker + Docker Compose |
| CI | GitHub Actions |
# 1. Clone o repositório
git clone https://github.com/Lucier/urucuisports.git
cd urucuisports
# 2. Instale as dependências
pnpm install
# 3. Configure as variáveis de ambiente
cp .env.example .env.local
# Edite .env.local com suas credenciais
# 4. Execute as migrações
pnpm db:migrate
# 5. (Opcional) Popule o banco com dados de exemplo
pnpm db:seed
# 6. Inicie o servidor de desenvolvimento
pnpm dev
Acesse http://localhost:3000.
| Variável | Descrição |
|---|---|
DATABASE_URL | URL de conexão PostgreSQL |
JWT_SECRET | Segredo para assinatura JWT (mín. 32 bytes) |
NEXT_PUBLIC_API_URL | URL pública da aplicação (sem barra final) |
SENTRY_DSN | DSN do Sentry (servidor) — opcional |
NEXT_PUBLIC_SENTRY_DSN | DSN do Sentry (cliente) — opcional |
SENTRY_ORG | Organização no Sentry — opcional |
SENTRY_PROJECT | Projeto no Sentry — opcional |
SENTRY_AUTH_TOKEN | Token para upload de source maps — opcional |
Gere o JWT_SECRET com:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
pnpm dev # Servidor de desenvolvimento (Turbopack)
pnpm build # Build de produção
pnpm start # Inicia o servidor de produção
pnpm lint # ESLint
pnpm type-check # TypeScript sem emitir arquivos
pnpm test # Testes unitários (Vitest)
pnpm test:coverage # Cobertura de testes
pnpm db:generate # Gera nova migração a partir do schema
pnpm db:migrate # Executa migrações pendentes
pnpm db:studio # Abre o Drizzle Studio (UI visual do banco)
pnpm db:seed # Popula o banco com dados de exemplo
# Copie e configure o arquivo de ambiente
cp .env.example .env
# Edite .env com DB_PASSWORD, JWT_SECRET e NEXT_PUBLIC_API_URL
# Suba todos os serviços (app + postgres + backup automático)
docker compose up -d
A aplicação ficará disponível em http://localhost:3000.
O serviço db-backup gera backups diários comprimidos em ./backups/ e remove automaticamente os arquivos com mais de 7 dias.
src/
├── app/ # Rotas e páginas (App Router)
│ ├── admin/ # Painel administrativo (protegido)
│ ├── api/ # API Routes (auth, health)
│ ├── estatisticas/ # Classificação e artilharia por liga
│ ├── fotos/ # Galeria de fotos
│ ├── noticias/ # Listagem e detalhe de notícias
│ └── transmissoes/ # Transmissões ao vivo
├── components/ # Componentes reutilizáveis
│ ├── admin/ # Componentes do painel admin
│ ├── home/ # Seções da página inicial
│ ├── layout/ # Navbar, Footer
│ └── ui/ # Componentes genéricos (SafeImage, etc.)
├── database/
│ ├── schema.ts # Definição de todas as tabelas
│ ├── migrations/ # Migrações SQL geradas pelo Drizzle
│ └── seed.ts # Dados de exemplo
├── lib/ # Utilitários do servidor (auth, jwt, rate-limit)
├── modules/ # Módulos de domínio (auth, users)
├── shared/ # Tipos e utilitários compartilhados
└── tests/ # Testes unitários
| Tabela | Descrição |
|---|---|
users | Usuários e administradores |
refresh_tokens | Tokens de refresh com rotação e revogação |
leagues | Ligas e torneios |
rounds | Rodadas de cada liga |
matches | Partidas com placar e status |
standings | Tabela de classificação |
top_scorers | Artilharia |
teams | Times participantes |
players | Jogadores vinculados a times |
posts | Notícias com soft delete |
categories | Categorias de notícias |
streams | Transmissões ao vivo (YouTube) |
photo_albums | Álbuns de fotos |
advertisers | Anunciantes exibidos na home |
httpOnly)SessionKeepAlive renova o access token automaticamente 5 minutos antes do vencimento, sem interromper a sessão do administradorO pipeline do GitHub Actions (.github/workflows/ci.yml) executa em cada push/PR:
tsc --noEmitnext build (depende dos dois jobs anteriores)