chore: remove teknikborc.md

This commit is contained in:
Semih
2026-05-13 20:36:34 +00:00
parent 7c8330e315
commit 608ab0e6c7

View File

@@ -1,162 +0,0 @@
# Süper Panel — Teknik Borç
Bilinçli alınmış shortcut'lar, ertelenen iş, ve sonra dönüp düzeltilmesi gereken şeyler. Her madde için **neden bu durumda**, **risk**, ve **ne zaman/nasıl düzelt** var.
Son güncelleme: 2026-05-13 (Phase 0-5 deploy edildikten sonra).
---
## 🔴 Kritik — kısa vadede yapılmalı
### 1. Master password chat'te paylaşıldı
- **Ne:** Bitwarden master password (`Qawased""Fener900*`) ve panel admin şifresi (`B5nGK3pPLjvguqvkXCHzAa1!`) Claude chat'inde geçti.
- **Risk:** Chat log Anthropic'te saklanıyor; cihaz/hesap kompromisi → tüm sırlar.
- **Düzelt:** İki şifreyi de rotate et (Bitwarden web UI + panel'de bir password-change script).
### 2. Repo public yapıldı
- **Ne:** `git.semih.ai/root/sp` public — Coolify SSH host-key trust sorunu yüzünden HTTPS public clone tek pratik yoldu.
- **Risk:** Şu an kodda secret yok ama yanlışlıkla bir `console.log` veya `.env` commit edilirse görünür.
- **Düzelt:** Coolify build container'a Gitea SSH host key'i baste edip private'a çevir. Veya HTTPS clone'da token'lı remote URL kullan.
### 3. Coolify token panel-web'de full-admin yetkisinde
- **Ne:** `COOLIFY_API_TOKEN` env'i tüm Coolify projelerini deploy/restart edebilir.
- **Risk:** Panel-web XSS / SSRF zafiyeti → Coolify üzerinden tüm spoke'ları yönetebilen attacker.
- **Düzelt:** Coolify'da read+deploy-only scoped token oluştur (mümkünse), `MANAGED_APP_UUIDS` whitelist'e ek olarak token'ı da scope'la.
### 4. TOTP kaldırıldı, sadece Tailscale gating var
- **Ne:** Better Auth TOTP plugin'i çıkarıldı (commit `b2f5942`). Tek faktör: Tailscale + email/password.
- **Risk:** Tailscale anahtarı çalınırsa tek savunma şifre. PRD §5 iki-faktörlü auth katmanı diyor.
- **Düzelt:** Better Auth `twoFactor()` plugin'ini geri ekle, `/setup-2fa` sayfasını restore et. Veya Cloudflare Access katmanı ekle (Tailscale + CF Access).
### 5. Off-host backup yok
- **Ne:** MinIO `maestro` host'unda çalışıyor; panel-postgres dump'ları aynı host'taki MinIO'ya gidiyor.
- **Risk:** Host'un disk loss / total loss durumunda backup da gider.
- **Düzelt:** MinIO bucket replication başka host'a (Hetzner Box, B2, vb.). Veya cron ile `mc mirror` ikincil hedefe.
---
## 🟡 Önemli — orta vadede
### 6. Coolify API token'ı çoklu spoke için ayrılmamış
- Token şu an panel-web env'inde, hem panel-web hem worker container'larından erişilebilir (worker'da yok ama olabilir).
- **Düzelt:** Coolify'da farklı scope token'lar (deploy-only / read-only).
### 7. Spoke admin endpoint'leri yok
- `@panel/admin-sdk/sase` skeleton hazır ama Sase.tr `/internal/admin/*` yayınlamıyor.
- Tüm mutasyonlar şu an manuel (DB direkt vb.).
- **Düzelt:** Sase.tr'de en az 1 endpoint (`POST /internal/admin/users/:id/subscription`) ship et, panel'den çağrıyı doğrula.
### 8. mTLS yok (PRD §5 / Phase 4)
- Layer 2 (admin API) bearer token ile korunuyor, mTLS yok.
- Şu an spoke endpoint olmadığı için critical değil.
- **Trigger:** İkinci spoke `/internal/admin/*` ship edince → `docs/phase4-deferred.md` playbook.
### 9. Infisical yok
- Secret'lar Coolify env'de. PRD Phase 4'te Infisical öngörmüş.
- **Trigger:** Cross-host secret share gerekince → `docs/phase4-deferred.md`.
### 10. CI yok
- Lint/typecheck/test push öncesi koşmuyor. Coolify ne push edersen onu build ediyor.
- Lokal build doğru olsa bile yarın bir devDep değişikliği prod'u kırabilir.
- **Düzelt:** Gitea Actions veya Drone CI + `pnpm lint && pnpm typecheck && pnpm test` workflow.
### 11. T3 Env validation yok (PRD §4)
- `process.env.X` direkt okunuyor, type-safety yok, missing env runtime'da patlar.
- **Düzelt:** `@t3-oss/env-nextjs` + zod schema; `src/env.ts` yaz, tüm okumaları oradan geçir.
### 12. Worker pg_dump version mismatch
- Worker image'da `postgresql16-client`, ama `coolify-db` `postgres:15-alpine`.
- pg_dump 16 → pg 15 genelde çalışır ama desteklenmeyen kombinasyon.
- **Düzelt:** Worker'da `postgresql15-client` kullan (alpine package adı uyumlu mu kontrol et) veya coolify-db'yi 16'ya upgrade.
### 13. Sase Prisma schema partial view drift riski
- `prisma/sase/schema.prisma` elle yazılmış (User + UserSubscription), gerçek schema 47 tablo.
- Sase.tr migrate'de kolon değiştirirse panel sessizce kırılır (runtime'da).
- **Düzelt:** Nightly job `prisma db pull` çalıştırıp diff'i Slack/email'e at — manuel review.
### 14. Backup status sadece panel için
- `/operations` backup kartları sadece `panel-postgres` dump'ları gösteriyor. Spoke DB'leri görünmüyor.
- Spoke backup'ları Coolify'ın kendi backup'ından mı yoksa spoke kendi mi yapıyor — bilinmiyor.
- **Düzelt:** Her wired spoke için: backup verification — son Coolify backup tarihi + size, panel UI'da göster.
### 15. /events SSE polling tabanlı (Redis subscribe değil)
- `/api/events/stream` her 2sn DB'den `Event` tablosu okuyor.
- Verimsiz (boşta da DB hit) ama basit.
- **Düzelt:** Worker'a Redis pub/sub channel ekle (`events:broadcast`), SSE oradan dinlesin → 0 polling.
### 16. Audit table archive bağımlı
- 90 günden eski audit kayıtları nightly job ile MinIO'ya kaldırılıyor. Eğer worker uzun süre düşerse tablo büyür → query yavaşlar.
- **Düzelt:** Worker downtime için alert (Uptime Kuma + Telegram). Veya audit query'lere `createdAt > now() - 90d` index hint.
### 17. better-auth peer-dep uyarısı (zod v4)
- `better-call 1.3.5` zod v4 istiyor, projede v3. Build sırasında WARN.
- Şu an çalışıyor, ama better-auth update'i kırabilir.
- **Düzelt:** zod v4'e geç (breaking changes var — schema migrasyonu gerekir).
---
## 🟢 Nice-to-have
### 18. Password change UI yok
- Admin şifresi değiştirmek için manuel: Better Auth API'sini cURL veya `prisma studio`.
- Tek kullanıcı + sık değişmediği için low-priority.
- **Düzelt:** `/settings/security` sayfası + Better Auth `changePassword` flow.
### 19. Better Auth'un kendi rate limit'i + benim rate-limit ikilisi
- İkisi de aktif, sebep-sonuç karışıyor (test'te attempt 4'te 429 ama benim hook'umun mesajı görünmüyor).
- **Düzelt:** Birini disable et (BA'nın yapılandırması daha doğrudan); veya benim hook'umu pre-better-auth çağırılacak şekilde route'la.
### 20. Coolify webhook sadece panel-web tetikliyor
- Gitea push'unda panel-web otomatik deploy oluyor, panel-worker manuel deploy gerekiyor.
- Düzelt: Coolify'da her iki app için ayrı webhook URL, Gitea'ya 2 webhook ekle. Veya tek webhook → 2 deploy server-side fan-out (Coolify desteklemiyor olabilir).
### 21. Knip yok (unused detection)
- shadcn add edince dahil olan ama kullanılmayan component'ler var (`chart-area-interactive` örneğin).
- **Düzelt:** `knip` ekle, CI'da koşsun.
### 22. Restore drill cron'da değil
- Manuel script var (`scripts/restore-drill.sh`), aylık koşulması bekleniyor ama kimse çalıştırmıyor.
- **Düzelt:** Worker'a aylık (1. ayın 03:00) drill job ekle, başarı/fail Telegram'a at.
### 23. Event payload schema validation yok
- Spoke'tan gelen `payload` JSON, panel hiç doğrulamıyor. Spoke bug'ı → garbage event tablosuna girer.
- **Düzelt:** Per-spoke event-type registry (`packages/event-bus/schemas/sase.ts`), zod ile doğrula, fail edenleri DLQ stream'ine yaz.
### 24. AdminClient retry/backoff yok
- 15sn timeout, hata olursa direkt fırlatır. İlk denemede transient hata → operasyon fail.
- **Düzelt:** Exponential backoff (3 retry), idempotent operasyonlar için.
### 25. Worker pg_dump çıktısı RAM'de tutuluyor
- `Buffer.concat(chunks)` ile tüm dump RAM'de. Panel DB büyüdükçe (>500MB) worker container OOM olabilir.
- **Düzelt:** Stream → MinIO upload (minio JS client `putObject` stream desteği var).
### 26. /settings sayfası gerçek değil
- Sadece email + session expiry gösteriyor. PRD §7'de "Secret management" + "Profile" diyor.
- **Düzelt:** Secrets metadata viewer, profile edit, theme picker.
### 27. Coolify env'de raw secret'lar
- 7+ env var (`DATABASE_URL_*`, `INTERNAL_API_TOKEN_*`, vb.) Coolify UI'da plain.
- Coolify encryption at rest var ama UI'da kim erişebilirse görür.
- **Düzelt:** Phase 4 trigger geldiğinde Infisical'a taşı.
### 28. node_modules build container'da büyük (~1.2GB)
- Worker image full pnpm install + apps/web (Next.js artifacts) içeriyor.
- **Düzelt:** Worker için ayrı pnpm install (workspace filter), Next.js'i runner stage'e koplama.
### 29. middleware sadece `/` için redirect ediyor
- `/projects`, `/audit`, vb. cookie yoksa redirect olmuyor — sadece `PanelShell` içindeki `auth.api.getSession` ile gate'leniyor.
- Çalışıyor ama tutarsız.
- **Düzelt:** Middleware'i tüm korumalı route'lara genişlet.
### 30. Tailscale fallback yok
- PRD §11 riskleri: "Founder TOTP cihazını kaybeder". Şu an TOTP yok, ama eğer Tailscale anahtarı kaybolursa panele erişim sıfır.
- **Düzelt:** Cloudflare Access fallback (PRD'de "belt and suspenders" diyor §13). Veya emergency-access yolu.
---
## Bağlı dokümanlar
- `docs/phase4-deferred.md` — mTLS + Infisical ertelemenin gerekçesi + trigger
- `docs/phase5-deferred.md` — Migration runner + Stripe webhook ertelemenin gerekçesi
- `docs/disaster-recovery.md` — Backup + restore runbook
- `super-panel-prd.md` — Kaynak PRD (§11 risk tablosu)