Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 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.