Next.js + Prisma + PostgreSQL projesi.
- Node.js 20+
- Docker Desktop (PostgreSQL için)
npm installcp .env.example .envdocker compose up -dnpx prisma generate
npx prisma migrate dev --name init
npm run db:seednpm run devTarayıcıda http://localhost:3000 adresini aç.
| Komut | Açıklama |
|---|---|
npm run dev |
Geliştirme sunucusu |
npm run build |
Production build |
npm start |
Production sunucu |
npm run copy-cesium |
Cesium assets kopyala |
npm run db:migrate |
Prisma migration |
npm run db:seed |
Seed verileri oluştur |
npm run db:studio |
Prisma Studio (DB GUI) |
docker compose up -d |
PostgreSQL başlat |
docker compose down |
PostgreSQL durdur |
3D globe viewer /viewer adresinde çalışır.
Cesium static assets npm install sırasında otomatik olarak public/cesium klasörüne kopyalanır.
Manuel kopyalamak için:
npm run copy-cesium- Cesium sadece client-side render edilir (SSR yok)
- Assets
/cesiumpath'inden servis edilir - Cesium versiyon güncellemesinde
npm installassets'i yeniler
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA
Örnek (local):
postgresql://postgres:postgres@localhost:5432/plot_orbit?schema=public
Seed script varsayılan bir tenant ve admin kullanıcı oluşturur.
Environment değişkenleri ile özelleştirilebilir:
| Değişken | Varsayılan |
|---|---|
DEFAULT_TENANT_NAME |
Demo Organization |
DEFAULT_TENANT_SLUG |
demo |
DEFAULT_ADMIN_EMAIL |
admin@example.com |
DEFAULT_ADMIN_PASSWORD |
changeme123 |
DEFAULT_ADMIN_NAME |
Admin User |
Seed idempotent'tir - birden fazla çalıştırılabilir, duplicate oluşturmaz.
Uygulama session-based authentication kullanır.
| Sayfa | Açıklama |
|---|---|
/register |
Yeni tenant + kullanıcı kaydı |
/login |
Giriş |
/dashboard |
Ana panel (login gerekli) |
| Endpoint | Method | Açıklama |
|---|---|---|
/api/auth/register |
POST | Yeni tenant + kullanıcı oluştur |
/api/auth/login |
POST | Giriş yap |
/api/auth/logout |
POST | Çıkış yap |
/api/auth/me |
GET | Mevcut kullanıcı bilgisi |
- Email: admin@example.com
- Password: changeme123
| Route Pattern | Koruma |
|---|---|
/dashboard/** |
Auth gerekli (redirect → /login) |
/api/** (korumalı) |
Auth gerekli (401 JSON) |
/, /login, /register, /viewer |
Public |
/api/auth/* |
Public |
import { requireAuth } from "@/server/auth";
export default async function ProtectedPage() {
const { user, tenant } = await requireAuth();
// redirect to /login if not authenticated
}import { requireAuthApi } from "@/server/auth";
export async function GET() {
const { auth, error } = await requireAuthApi();
if (error) return error; // 401 response
// auth.user, auth.tenant available
}import { requireAuth } from "@/server/auth";
import { createTenantDb } from "@/server/db/tenantDb";
export default async function Page() {
const auth = await requireAuth();
const db = createTenantDb(auth);
const users = await db.user.findMany(); // only tenant's users
}- Framework: Next.js 16 (App Router)
- Language: TypeScript (strict mode)
- Database: PostgreSQL 16
- ORM: Prisma
- 3D Globe: CesiumJS
- Auth: Custom session (argon2 + httpOnly cookies)
- Validation: Zod
- Styling: Tailwind CSS