Adım 1: Cloudflare Access Kurulumu¶
Tarih: 2026-05-26 Durum: Tamamlandı
Yapılan Yapılandırma¶
| Alan | Değer |
|---|---|
| Plan | Zero Trust Free |
| Team name | fragrant-sunset-dab9 |
| Uygulama adı | Yackr Admin Panel |
| Korunan URL | panel.yackr.co |
| Session süresi | 6 saat |
| Giriş yöntemi | Google SSO (asıl) + One-time PIN (yedek) |
| Policy adı | Panel Access — ALLOW |
| Policy kuralı | murat@yackr.co |
Kritik Değerler¶
| Değer | Açıklama |
|---|---|
| AUD Tag | Cloudflare dashboard → Yackr Admin Panel → Additional settings → AUD Tag |
| JWKS endpoint | https://fragrant-sunset-dab9.cloudflareaccess.com/cdn-cgi/access/certs |
Test¶
panel.yackr.co açıldı → Cloudflare login ekranı geldi → OTP ile giriş yapıldı → panel görüntülendi. ✅
panel.yackr.co açıldı → Google SSO eklendi → Google ile giriş yapıldı → panel görüntülendi. ✅
Backend (Go) — ConnectRPC + CF JWT Doğrulama¶
Tarih: 2026-05-28 Durum: Kod yazıldı ve derleniyor; operasyonel adımlar (DB migration, env, seed) bekliyor.
Yapılanlar¶
- Ayrı binary:
cmd/panel-server— mobile sunucudan (cmd/server) bağımsız, aynıbackendmodülü içinde. - Proto:
proto/panel/v1/panel.proto→PanelService.GetMyProfileRPC.go_package = "backend/gen/go/panel/v1;panelv1". - Protokol: ConnectRPC (
connectrpc.com/connect) — gRPC-Web'i natively destekler, ayrı wrapper yok. - CF JWT doğrulama (
internal/panelserver/interceptor.go): - Kütüphane:
github.com/lestrrat-go/jwx/v3(dahilijwk.Cache, arka planda auto-refresh). - Tek
jwt.Parseçağrısında: imza (RS256 + kid eşleştirme, token alg'ine güvenilmez) + exp (varsayılan) + iss + aud doğrulanır. - JWKS URL sabit (token'dan türetilmez) → cache poisoning riski yok.
- Geçerli JWT'de
emailclaim'i context'e enjekte edilir; aksi haldeUnauthenticated. - Domain katmanı (
internal/panel/):repository.go(admins tablosu sorgusu),service.go(email→rol, admin değilsePermissionDenied),handler.go(ConnectRPC handler). - Migration'lar (
internal/db/migrations/panel/):adminsveadmin_audit_logstabloları — 2026-05-28'de veritabanına uygulandı (TablePlus ile, mobile tablolarıyla aynı CockroachDB). - Doğrulama:
go 1.25.6ile bayraksız derleniyor,go vettemiz,govulncheckeklenen paketlerde açık bulmadı.
Kalanlar (sırayla tamamlanıp buraya eklenecek)¶
- [x] Migration'ları veritabanına uygula (
admins,admin_audit_logs) ✅ 2026-05-28 - [x]
CF_AUD_TAGortam değişkenini ayarla (.env) ✅ 2026-05-28 - [x] İlk superadmin'i seed et (
murat@yackr.co) ✅ 2026-05-29 (local dev DB) - [x] Flutter Web paneli (frontend) — kod yazıldı, web'e derleniyor ✅ 2026-05-29 (grpc + grpc_web, GetMyProfile çağrısı; uçtan uca test Cloudflare arkasında)
- [x] (Sistem) Go 1.26.3 güncellemesi — stdlib güvenlik açıkları için ✅ 2026-05-30
- [x] Panel backend Cloud Run'a deploy edildi (
yackr-panelservisi,europe-west1) ✅ 2026-06-12 — detay:docs/deployment/panel_backend_deployment.md - [x] Cloudflare Pages Function eklendi (
panel/functions/[[catchall]].js) ✅ 2026-06-12 —panel.yackr.co/panel.v1.*isteklerini Cloud Run'a proxy'ler; same-origin yaklaşımı, cross-origin CORS sorunu yok - [x] Prod DB'ye superadmin seed edildi (
murat@yackr.co) ✅ 2026-06-12 —seed_initial_superadmin.sqlile - [ ] Backend firewall: Cloud Run'u yalnızca Cloudflare IP aralıklarına kapat (şu an CF JWT doğrulaması var ama Cloud Run URL'i internete açık)