Lalabase
티켓·문서·근무시간·고객대화를 한 곳에 모아 KI로 검색, 소프트웨어 기업 고객 프로젝트용, 오픈소스로 자체 서버·독일 클라우드에 배포
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Painel interno + mostruário da Inphantil. Monólito Next.js 16 (App Router) com duas áreas: • Pública (sem login): landing e mostruário (vitrine, sem venda). • Fechada (login obrigatório): ferramentas internas, catálogo, admin. Ciclo 1 (esta entrega): base + autenticação + upload de imagem + tema/ animações. As funcionalidades de negócio (protetor de parede, tapete, orçamentos, frete, calculadoras, catálogo, mostruário) estão como placeholders "Em breve", com a proteção de rota já correta.README 전문 보기 ↗
Painel interno + mostruário da Inphantil. Monólito Next.js 16 (App Router) com duas áreas:
Ciclo 1 (esta entrega): base + autenticação + upload de imagem + tema/ animações. As funcionalidades de negócio (protetor de parede, tapete, orçamentos, frete, calculadoras, catálogo, mostruário) estão como placeholders "Em breve", com a proteção de rota já correta.
Next.js 16 · TypeScript (strict) · Tailwind CSS v4 · shadcn/ui (Radix) · Framer Motion · Prisma + PostgreSQL (Neon) · Auth.js (NextAuth v5, JWT) · React Hook Form + Zod · Cloudflare R2 (via API S3) · next-themes.
Poder: DEV > ADMIN > SELLER.
| Papel | Acesso |
|---|---|
| SELLER | Ferramentas internas (calculadoras, protetor, tapete, orçamentos, frete). |
| ADMIN | Tudo da área fechada, menos gerenciar usuários (+ catálogo). |
| DEV | Tudo, incluindo criar/editar/ativar/desativar usuários. |
A guarda requireRole() (src/lib/rbac.ts) roda no servidor (Server Actions,
Route Handlers e páginas). O middleware.ts separa rotas públicas das fechadas.
Nunca confie apenas no front.
# 1) Instalar dependências
npm install
# 2) Configurar ambiente
cp .env.example .env
# Preencha DATABASE_URL, NEXTAUTH_SECRET (npx auth secret),
# SEED_DEV_* e as credenciais do Cloudflare R2.
# 3) Criar as tabelas (a migration inicial já vem incluída em prisma/migrations)
npm run prisma:migrate # aplica a migration no banco (dev)
# (em produção/CI use: npx prisma migrate deploy)
# 4) Semear o DEV inicial (usa SEED_DEV_EMAIL / SEED_DEV_PASSWORD)
npm run db:seed
# 5) Subir em desenvolvimento
npm run dev # http://localhost:3000
Login inicial: o e-mail/senha definidos em SEED_DEV_EMAIL / SEED_DEV_PASSWORD.
Novos usuários são criados apenas pelo DEV em /admin/usuarios (não há
auto-cadastro).
| Script | O que faz |
|---|---|
npm run dev | Desenvolvimento |
npm run build / start | Build e produção |
npm run typecheck | tsc --noEmit |
npm run lint | ESLint |
npm run prisma:migrate | Migration de desenvolvimento |
npm run db:seed | Semeia o DEV inicial |
npm run prisma:studio | Prisma Studio |
Todo upload/substituição/exclusão passa pelo serviço central
src/lib/storage.ts (R2 via API S3), para nunca deixar arquivo órfão:
createUploadUrl), envia o arquivo direto ao R2 (PUT) e o servidor grava
apenas url + key. Ao persistir, o servidor faz um HEAD no objeto para
validar tamanho/tipo de forma autoritativa.key(s).key vai para a tabela
OrphanImage e a rotina /api/cron/cleanup-images (Vercel Cron diário,
protegida por CRON_SECRET) tenta de novo e varre o bucket removendo o
que não tem mais referência no banco.Cloudflare → R2 → Create bucket (ex.: inphantil).
R2 → Manage R2 API Tokens → Create API token com permissão Object Read &
Write no bucket. Anote Access Key ID, Secret Access Key e o
Account ID → vão no .env (R2_*).
Acesso público: no bucket, ative o subdomínio r2.dev (dá uma URL
https://pub-xxxx.r2.dev) ou conecte um domínio próprio. Essa base vai em
R2_PUBLIC_BASE_URL.
CORS do bucket (para o upload direto do navegador) — em Settings → CORS policy:
[
{
"AllowedOrigins": ["http://localhost:3000", "https://SEU-DOMINIO"],
"AllowedMethods": ["PUT", "GET"],
"AllowedHeaders": ["content-type"],
"MaxAgeSeconds": 3600
}
]
src/
app/
(public)/ # ABERTO: landing (/) e /mostruario
(auth)/login/ # login
(app)/ # FECHADO: shell com sidebar + topbar
dashboard/
calculadoras/ protetor-parede/ tapete/
orcamentos/ frete/ catalogo/ # placeholders
admin/usuarios/ # SÓ DEV — CRUD de usuários
api/auth/[...nextauth]/
api/cron/cleanup-images/
components/ (ui/ = shadcn, app-shell/, upload/, motion/, ...)
lib/ (auth, prisma, rbac, roles, storage, media-cleanup, nav, validators)
prisma/ (schema.prisma, seed.ts)
.env.example). Defina também NEXTAUTH_URL e CRON_SECRET.vercel.json já agenda a limpeza de imagens (cron diário às 04:00 UTC).npx prisma migrate deploy.next.config.ts libera o host público do R2 (**.r2.dev e/ou o domínio de
R2_PUBLIC_BASE_URL) para o next/image.http://localhost:3000 e o domínio de
produção na política de CORS do bucket R2.deepmerge-ts, dependência
transitiva de lint (dev-only), sem impacto em runtime.