Ödeme aracılık/PSP CRM paneli. Banka IBAN'ları üzerinden yatırım/çekim işlemleri, takım bazlı kasa muhasebesi, komisyon ve partner kâr paylaşımı yönetimi.
Bu depo, mevcut PHP/Laravel 12 + Vue 3 projesinin (docs/paydopay-v4) .NET 10 + Soğan (Onion) mimarisine taşınmış halidir. Frontend (Vue SPA) birebir korunmuş, /api sözleşmesi değiştirilmemiştir.
Soğan Mimarisi — içe doğru bağımlılık: Api → Infrastructure → Application → Domain
| Katman | Sorumluluk |
|---|---|
| TPanel.Domain | Entity'ler, enum'lar, iş kuralları (bağımlılıksız çekirdek) |
| TPanel.Application | Arayüzler (I*Store, I*Service), DTO/feature mantığı |
| TPanel.Infrastructure | Dapper/EF Core veri erişimi, dış servisler (Telegram, Claude Vision), arka plan işleri |
| TPanel.Api | İnce controller'lar, auth, middleware, SPA servisi |
Teknolojiler: .NET 10, ASP.NET Core, EF Core 9 (Pomelo MySQL) + Dapper (hibrit), MySQL, Vue 3 (Vuexy) + Vite.
tpanel/
├── TPanel.slnx # .NET çözüm dosyası
├── src/
│ ├── backend/ # .NET projeleri (Onion)
│ │ ├── TPanel.Domain/
│ │ ├── TPanel.Application/
│ │ ├── TPanel.Infrastructure/
│ │ └── TPanel.Api/ # giriş noktası — hem /api hem SPA'yı servis eder
│ └── frontend/ # Vue 3 SPA (Vuexy) — kaynak + derlenmiş build
│ ├── resources/ # Vue kaynak kodu
│ └── public/build/ # Vite çıktısı (.NET bunu servis eder)
├── storage/ # Runtime depolama (dekontlar, export'lar) — .NET buraya yazar
└── docs/
├── paydopay-v4/ # Orijinal Laravel projesi (yalnızca referans)
└── database/tpanel_crm.sql
Not: Backend ve frontend tek origin'den sunulur — .NET hem
/api/*'i hem Vue SPA'yı (/) aynı port üzerinden verir. Frontend/apigöreli base URL kullanır.
- .NET 10 SDK (bu makinede
C:\Program Files\dotnet\dotnet.exe) - MySQL — XAMPP ile
localhost:3306,paydopay_crmveritabanı yüklü (docs/database/tpanel_crm.sql) - Node.js + pnpm — yalnızca frontend'i yeniden derlemek için gerekir. Sadece çalıştırmak için gerekmez (derlenmiş build depoda mevcut).
XAMPP Control Panel'den MySQL'i başlatın. paydopay_crm şeması yüklü olmalı. Bağlantı dizesi (src/backend/TPanel.Api/appsettings.json):
Server=127.0.0.1;Port=3306;Database=paydopay_crm;User Id=root;Password=
Geliştirme (önerilen):
dotnet run --project src\backend\TPanel.Api
launchSettings.json'a görehttp://localhost:5212(Development). Durdurmak:Ctrl+C.
Port/ortam override ile:
$env:ASPNETCORE_URLS="http://localhost:5080"; $env:ASPNETCORE_ENVIRONMENT="Production"
dotnet run --project src\backend\TPanel.ApiDerlenmiş DLL'i doğrudan (script/CI için):
cd src\backend\TPanel.Api
$env:ASPNETCORE_URLS="http://localhost:5080"
& "C:\Program Files\dotnet\dotnet.exe" ".\bin\Debug\net10.0\TPanel.Api.dll"Çalışma dizini
TPanel.Apiklasörü olmalı (appsettings + göreli frontend/storage yolları için).
- Panel: http://localhost:5212 (veya seçtiğiniz port)
- Test kullanıcısı:
velmort/123456(super admin, 2FA kapalı) - API sağlık kontrolü:
/api/v1/health
Derlenmiş build depoda olduğundan çalıştırmak için ek işlem gerekmez — .NET servis eder.
Yeniden derlemek için (Node.js gerekir):
cd src\frontend
pnpm install
pnpm build # -> public/build güncellenir
vite.config.jshâlâlaravel-vite-pluginkullanır; Laravel kökü dışında build sırasında uyarı verebilir ama çıktıyı yinepublic/build'e üretir. Hot-reload'lu geliştirme (pnpm dev) için ek bağlama gerekir.
dotnet build TPanel.slnx -c ReleaseUygulama tek bir ASP.NET Core sürecidir — /api ile Vue SPA'yı aynı porttan sunar. Önüne TLS için bir reverse proxy (nginx/Caddy), arkasına MySQL/MariaDB konur.
Repoda hazır Dockerfile + docker-compose.yml var (app + MySQL 8.0; frontend imaja derlenmiş haliyle gömülür, storage kalıcı volume).
git clone <repo> tpanel && cd tpanel
cp .env.example .env # güçlü şifreler + APP_URL=https://nobelpay.me
docker compose up -d --build- Panel:
http://SUNUCU:8080(ilk açılışta şemadocs/database/tpanel_crm.sql'den otomatik yüklenir). - HTTPS: önüne reverse proxy koyun (
proxy_pass http://127.0.0.1:8080,client_max_body_size 12M) + Let's Encrypt. Caddy ile otomatik TLS de tercih edilebilir. - MariaDB isterseniz
dbimajınımariadb:11yapıpDatabase__ServerVersion: "11.4.0-mariadb"ayarlayın. - Şemayı sonradan değiştirdiyseniz:
docker compose down -v(⚠️ veriyi siler) → yenidenup.
Komutlar: docker compose logs -f app · docker compose restart app · docker compose down.
0) Docker'ı kur (bir kez) — resmi depodan:
sudo apt update && sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker compose version # doğrula1) Projeyi al:
cd /opt && sudo git clone <repo-url> tpanel
sudo chown -R $USER:$USER /opt/tpanel # <-- eklenecek satır
cd tpanel2) .env ayarla:
cp .env.example .env && nano .env
# DB_NAME → veritabanı adı (varsayılan tpanel_crm)
# DB_ROOT_PASSWORD / DB_USER / DB_PASSWORD → güçlü şifreler
# APP_URL → https://nobelpay.me
# TELEGRAM_* → opsiyonel (boş bırakılabilir)3) Build + başlat — repo kökündeki deploy.sh ile (önkoşul + .env kontrolü + sağlık beklemesi dahil):
./deploy.sh
# veya elle: docker compose up -d --buildİlk build birkaç dakika sürer (.NET restore + publish). up sırasıyla: app imajını derler (publish + derlenmiş SPA gömülür) → MySQL'i başlatır ve ilk açılışta docs/database/tpanel_crm.sql'i otomatik yükler → healthcheck geçince app başlar.
4) Doğrula:
docker compose ps # running/healthy
docker compose logs -f app # "Now listening on: http://[::]:8080"
curl http://localhost:8080/api/v1/health # API sağlık5) HTTPS — önüne reverse proxy (compose yalnızca HTTP 8080 açar):
sudo apt install -y nginx certbot python3-certbot-nginx/etc/nginx/sites-available/tpanel:
server {
listen 80;
server_name nobelpay.me;
client_max_body_size 12M; # dekont yüklemeleri için ŞART
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}sudo ln -s /etc/nginx/sites-available/tpanel /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d nobelpay.me # otomatik TLS→ Panel: https://nobelpay.me · giriş velmort / 123456.
6) Günlük operasyonlar:
| İşlem | Komut |
|---|---|
| Kodu güncelle | git pull && ./deploy.sh |
| Logları izle | docker compose logs -f app |
| Yeniden başlat | docker compose restart app |
| Durdur (veri kalır) | docker compose down |
| DB yedeği | docker compose exec db sh -c 'mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE"' > yedek.sql |
| Storage yedeği | docker run --rm -v tpanel_storage:/s -v $PWD:/b alpine tar czf /b/storage.tgz -C /s . |
Şema değişikliği: init script yalnızca ilk açılışta çalışır. Baştan yüklemek için
docker compose down -v(⚠️ DB verisini siler) →./deploy.sh.
# 1) Bağımlılıklar (libicu ŞART — uygulama tr-TR kültürü kullanır)
sudo apt update && sudo apt install -y nginx libicu-dev mariadb-server
sudo apt install -y aspnetcore-runtime-10.0 # veya self-contained publish ile bu adımı atla
# 2) Veritabanı
sudo mysql -e "CREATE DATABASE paydopay_crm CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -e "CREATE USER 'tpanel'@'localhost' IDENTIFIED BY 'GUCLU_SIFRE'; GRANT ALL ON paydopay_crm.* TO 'tpanel'@'localhost';"
mysql -u tpanel -p paydopay_crm < docs/database/tpanel_crm.sql
# 3) Publish (yerelde) + sunucuya kopyala
dotnet publish src/backend/TPanel.Api -c Release -o publish
rsync -avz publish/ user@sunucu:/opt/tpanel/app/
rsync -avz src/frontend/public/ user@sunucu:/opt/tpanel/frontend/
ssh user@sunucu 'mkdir -p /opt/tpanel/storage/app/public/receipts'Sunucuda /opt/tpanel/app/appsettings.Production.json — mutlak yollar + gerçek sırlar:
{
"ConnectionStrings": { "MySql": "Server=127.0.0.1;Port=3306;Database=paydopay_crm;User Id=tpanel;Password=GUCLU_SIFRE;CharSet=utf8mb4;SslMode=None;AllowPublicKeyRetrieval=true" },
"Database": { "ServerVersion": "11.4.0-mariadb" },
"Frontend": { "PublicPath": "/opt/tpanel/frontend" },
"Storage": { "LocalDiskPath": "/opt/tpanel/storage/app", "PublicDiskPath": "/opt/tpanel/storage/app/public" },
"App": { "Url": "https://nobelpay.me", "Name": "TPanel" }
}systemd birimi (/etc/systemd/system/tpanel.service):
[Unit]
Description=TPanel
After=network.target mariadb.service
[Service]
WorkingDirectory=/opt/tpanel/app
ExecStart=/usr/bin/dotnet /opt/tpanel/app/TPanel.Api.dll
Restart=always
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://127.0.0.1:5000
[Install]
WantedBy=multi-user.targetsudo chown -R www-data:www-data /opt/tpanel/storage
sudo systemctl enable --now tpanelnginx + TLS:
server {
listen 80;
server_name nobelpay.me;
client_max_body_size 12M; # dekont yüklemeleri (≤10MB) için
location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
}sudo certbot --nginx -d nobelpay.me- libicu zorunlu — uygulama Türkçe (
tr-TR) biçimlendirme kullanır; eksikse çöker. client_max_body_size ≥ 12M— dekont yüklemeleri (≤10 MB).Database:ServerVersionkurulu motora göre olmalı (MySQL ≠ MariaDB).- Tek instance çalıştırın — günlük snapshot/cron uygulama içinde
HostedServiceolarak koşar; 2 instance çift snapshot üretir. - Sırlar ortam değişkeni /
appsettings.Production.jsonile verilir, repoya commit edilmez. Anthropic API key panel → Sistem Ayarları'ndan (system_settings) okunur. - Frontend değiştiyse
cd src/frontend && pnpm build→public/çıktısını sunucuya kopyalayın (Docker'da imajı yeniden build edin).
src/backend/TPanel.Api/appsettings.json anahtarları:
| Anahtar | Açıklama |
|---|---|
ConnectionStrings:MySql |
MySQL bağlantı dizesi |
Frontend:PublicPath |
SPA static dosya kökü (../../frontend/public) |
Storage:LocalDiskPath / PublicDiskPath |
Dekont/dosya depolama (repo kökü storage/) |
Telegram:BotToken / PayrouteChatId |
Telegram bildirimleri (boşsa no-op). BotToken panelden de (system_settings.telegram_bot_token) okunur. |
Telegram:WebhookSecret |
Webhook secret token (set-webhook ile Telegram'a kaydedilir) |
Sırlar: Prodüksiyon değerlerini (DB şifresi, Telegram/Anthropic token)
appsettings.json'a yazıp commit etmeyin; ortam değişkeni veyaappsettings.*.local.jsonkullanın (.gitignoreile dışlanır). Anthropic API key runtime'dasystem_settingstablosundan okunur.
- Kimlik doğrulama — Sanctum uyumlu opaque token, MD5 legacy şifre uyumu, 2FA (TOTP)
- Dış Merchant API (v1) — HMAC korumalı deposit/withdraw/transaction uçları
- İşlem yönetimi — yatırım/çekim onay-red akışı, dekont yükleme
- Kasa muhasebesi — takım/merchant/aracı/partner/fon deposu kasaları, devirli günlük snapshot
- Yönetim CRUD + Dashboard + Export — async CSV/XLSX dışa aktarım
- 6 analitik rapor — merchant/team/operations/conversion/player-risk/bank-account
- Arka plan işleri — günlük kasa snapshot cron, süre dolan yatırım reddi, Telegram bildirimleri
- AI dekont doğrulama — Claude Vision OCR + perceptual hash (dHash) + metadata analizi
- Telegram webhook —
POST /api/telegram/webhook: Chat ID kaydı (Chat ID Bul), risk butonları (Engelle/Vazgeç),#finile dekont yükleme,@bot kasaraporu. KaydıPOST /api/system/telegram/set-webhook(super admin) yapar.
ProvisionApiSecrets ve test-data üretimi henüz port edilmedi. Telegram webhook'unun canlı çalışması için public HTTPS URL + bot token gerekir.
Özel/dahili proje.