Panel kurulumu
Panel apps/dashboard altındaki Next.js 15 uygulamasıdır. Mongo ile hiç doğrudan konuşmaz ve tarayıcıya hiçbir sır indirmez: her sayfa bir Server Component, her mutasyon bir server action'dır ve ikisi de API'nin /v1/admin yüzeyini paylaşılan bir token ile çağırır.
1 API tarafını yapılandır
API /v1/admin'i yalnızca ADMIN_API_TOKEN ayarlıyken açar. Yoksa bütün yüzey 404 döner — 401 değil — ki paneli olmayan bir kurulum kilitli bir kapı ilan etmesin.
# .env
ADMIN_API_TOKEN=$(openssl rand -hex 24) # ≥ 24 karakter
ENCRYPTION_KEY=… # generate:keys zaten ayarladı
Değiştirdikten sonra API'yi yeniden başlatın.
2 Paneli yapılandır
Panelin dört değere ihtiyacı var; hiçbiri NEXT_PUBLIC_ değil:
# .env
API_URL=http://localhost:3000 # panel *sunucusu* API'ye nasıl ulaşır
ADMIN_API_TOKEN=… # API'deki değerle aynı olmalı
SESSION_SECRET=$(openssl rand -hex 32)
ADMIN_PASSWORD_HASH=… # aşağıda
INSECURE_COOKIES=false # yalnızca düz http localhost için true
Bootstrap parola hash'ini üretin:
bun run generate:admin-password
# Admin password (görünmeyecek): ********
# ADMIN_PASSWORD_HASH=JGFyZ29uMmlkJHY9MTkkbT0xOTQ1Nix0PTIscD0xJ…
Değer, argon2id hash'inin base64 kodlanmış halidir: ham hash $ işaretleriyle doludur ve Bun'ın .env ayrıştırıcısı, Compose interpolasyonu ve Dokploy'un ortam sekmesi her biri bunları farklı biçimde genişletir. Satırı yazdırıldığı gibi yapıştırın; panel açılışta çözer.
Oturum çerezi varsayılan olarak Secure'dur ve tarayıcılar http:// üzerinden düşürür. Yerel çalıştırma için INSECURE_COOKIES=true ayarlayın; üretimde asla.
3 Çalıştır
Compose altında panel zaten stack'in parçasıdır (docker/dashboard.Dockerfile, 127.0.0.1:3001'de yayınlanır) ve API'ye http://api:3000 olarak ulaşır; docker compose up -d yeterlidir. Traefik arkasında DASHBOARD_DOMAIN ayarlayın — bkz. Dokploy / Traefik.
Docker dışında:
bun run dev:dashboard # geliştirme, :3001
# ya da
bun run build:dashboard
bun --filter @opennotification/dashboard start
http://localhost:3001 adresini açın.
4 İlk giriş (bootstrap)

E-posta alanını boş bırakıp hash'lediğiniz bootstrap parolasını girin. Bu yol yalnızca hiç üye hesabı yokken çalışır: sizi sahip olarak içeri alır ki gerçek hesapları davet edebilesiniz, ilk sahip aktif olur olmaz kendini kapatır.
Üyeler'e gidip kendinizi e-postanız ve owner rolüyle davet edin. Davet bağlantısını kabul edip parola belirleyin — bundan sonra e-posta + parolayla girersiniz ve ADMIN_PASSWORD_HASH girişi ölmüştür. Bkz. Üyeler.
Oturum ve güvenlik notları
- Oturum imzalı bir JSON çerezidir (
id, email, name, role, apps, exp), 7 gün,httpOnly,sameSite=strict.SESSION_SECRET'i değiştirmek herkesi çıkarır — kasıtlı panik düğmesi. - Giriş denemeleri hem panelde (bootstrap yolu) hem API'de (üye yolu) IP başına sınırlıdır.
- Panelden gelen her mutasyon API'ye
x-admin-actor/x-admin-actor-emailbaşlıklarıyla ulaşır ve API bunu denetim günlüğüne yazar. - Panel kimlik bilgilerinin yalnızca durumunu okur. Saklanan
.p8'i, service account'u ya da VAPID private key'i gösteremez — API hiç döndürmez.
Paneli dağıtma
Henüz panel Dockerfile'ı yok. bun run build:dashboard ile derleyip next start'ı bir process manager altında, API ile aynı reverse proxy'nin arkasında, kendi hostname'iyle (örn. push-admin.example.com) çalıştırın. API'ye API_URL üzerinden ulaşması yeterlidir; bu dahili adres olabilir — onu kullanan tek şey paneldir.