Bu proje; birden fazla Linux sunucunun tek bir web panelinden güvenli şekilde tanımlanmasını, izlenmesini ve yönetilmesini amaçlayan profesyonel bir Server Management Platform'dur.
| Doküman | Kim için | Ne anlatır |
|---|---|---|
| Son kullanıcı kılavuzu | Paneli kullanan herkes | Ekranların ne işe yaradığı, günlük dilde. Kurulum ve teknik terim yok. |
| Kullanma kılavuzu | Operatör ve yönetici | Menü menü nasıl yapılır: sunucu ekleme, izleme, Docker, yedek, alarm, dağıtım. |
| Teknik doküman | Geliştirici ve kurulum sorumlusu | Mimari, güvenlik, veri, eklentiler ve yapılandırma. |
| Eklenti geliştirme | Eklenti yazan geliştirici | Servis şablonu eklentisi (C# ve JSON), alan başvurusu, doğrulama ve güvenlik kuralları. |
Bu dosyanın 1–82. bölümleri ürün hedefi ve yol haritasıdır. Çalışan sistemin kurulumu ve ayrıntılı davranışı Geliştirme Ortamı bölümünden başlar; teknik doküman oradaki ayrıntıya bağlanır.
Telif hakkı Mehmet Ünal'a aittir. Yazılım MIT Lisansı ile açık kaynak olarak yayımlanır: kullanılabilir, değiştirilebilir ve dağıtılabilir; ticari ürünlerde de kullanılabilir. Kopyalarda telif ve izin bildirimi korunur.
Sistem yöneticisinin SSH ile tek tek sunuculara bağlanmak yerine;
- Sunucu eklemesi
- CPU / RAM / Disk / Network takibi
- Docker container yönetimi
- Dokploy kurulumu
- Terminal erişimi
- Dosya yönetimi
- Kullanıcı ve yetki yönetimi
- Log görüntüleme
- Servis yönetimi
- Backup / restore
- Alert ve bildirimler
- Sunucu sağlık kontrolü
gibi işlemleri merkezi bir panelden yapabilmesi hedeflenmektedir.
Sistem özellikle VPS, Dedicated Server, Cloud Server ve Docker tabanlı uygulama sunucularını yönetmek için tasarlanacaktır.
Ana ekran tüm sunucuların genel durumunu göstermelidir.
- Toplam sunucu
- Online sunucu
- Offline sunucu
- Kritik durumdaki sunucu
- Toplam CPU kullanımı
- Toplam RAM kullanımı
- Toplam disk kullanımı
- Çalışan Docker container sayısı
- Duran container sayısı
- Hatalı container sayısı
- Aktif alarm sayısı
- 🟢 Healthy
- 🟡 Warning
- 🔴 Critical
- ⚫ Offline
- 🔵 Maintenance
- CPU kullanım grafiği
- RAM kullanım grafiği
- Disk kullanım grafiği
- Network RX/TX
- Load Average
- Container sayısı
- Son sistem olayları
- Son deployment işlemleri
Dashboard gerçek zamanlı veya kısa polling aralıklarıyla güncellenebilmelidir.
Panelden yeni sunucu eklenebilmelidir.
Alanlar:
- Sunucu adı
- Hostname
- IP adresi
- SSH Port
- Kullanıcı adı
- Authentication Type
- Root / Sudo bilgisi
- SSH Password veya SSH Private Key
- Sunucu açıklaması
- Etiketler
- Environment
- Lokasyon
- Provider
- İşletim sistemi
Desteklenmesi gereken yöntemler:
- SSH Password
- SSH Private Key
- SSH Key + Passphrase
- Sudo User
Root kullanımı mümkün olduğunca sınırlandırılmalı; normal kullanıcı + sudo desteklenmelidir.
Sunucu şifreleri ve private key bilgileri plaintext olarak veritabanında tutulmamalıdır.
- AES-256 veya güçlü envelope encryption
- Application master key
- Environment variable / secret store
- Maskeli gösterim
- Audit log
- Secret rotation
- Şifre dışa aktarma engeli
- Private key indirme engeli
- Host key fingerprint doğrulama
- Known Hosts yönetimi
- SSH timeout
- Connection retry
- Brute-force koruması
- Session timeout
- Komut çalıştırma audit log'u
Her sunucunun kendine ait detay ekranı olacaktır.
- Overview
- Metrics
- Docker
- Terminal
- Files
- Services
- Processes
- Logs
- Network
- Storage
- Kaynak Kullanımı
- Temizlik
- Security
- Deployments
- Backups
- Alerts
- Activity
Sunucudan aşağıdaki bilgiler alınmalıdır:
- CPU kullanım %
- Core sayısı
- Thread sayısı
- Load Average
- CPU temperature varsa
- Top CPU processes
- Total
- Used
- Free
- Cached
- Available
- Swap
- Disk toplam alanı
- Kullanılan alan
- Boş alan
- Kullanım %
- Mount point
- Inode kullanımı
- RX
- TX
- Paket sayısı
- Network interface
- Public IP
- Private IP
- OS
- Kernel
- Architecture
- Hostname
- Uptime
- Timezone
- Last reboot
Sadece anlık değerler değil geçmiş değerler de tutulmalıdır.
Örneğin:
- Son 1 saat
- Son 6 saat
- Son 24 saat
- Son 7 gün
- Son 30 gün
Grafikler:
- CPU
- RAM
- Disk
- Network
- Load Average
Retention policy uygulanmalıdır.
Örneğin yüksek çözünürlüklü metrikler kısa süre tutulurken uzun dönem için aggregation kullanılmalıdır.
Docker ekranı projenin en önemli modüllerinden biri olacaktır.
Gösterilecek bilgiler:
- Docker Engine version
- Containers
- Running
- Stopped
- Restarting
- Failed
- Images
- Volumes
- Networks
- Disk usage
Her container için:
- Container Name
- ID
- Image
- Status
- Health
- Ports
- CPU
- RAM
- Network RX/TX
- Created At
- Started At
- Restart Count
- Running
- Exited
- Restarting
- Paused
- Dead
- Unknown
Panel üzerinden:
- Start
- Stop
- Restart
- Pause
- Resume
- Kill
- Remove
- Rename
- Inspect
- Logs
- Stats
işlemleri yapılabilmelidir.
Tehlikeli işlemler için confirmation modal kullanılmalıdır.
Örneğin:
Container'ı silmek üzeresiniz. Bu işlem geri alınamaz.
Kullanıcı container içine terminal ile girebilmelidir.
Örneğin:
docker exec -it container_name /bin/shveya uygun shell otomatik tespit edilmelidir.
Web panelinde:
- Xterm.js
- WebSocket
- SSH/Docker exec session
kullanılabilir.
Terminal resize desteklemelidir.
Container dosya sistemi panel üzerinden yönetilebilmelidir.
- Dosya listeleme
- Klasör oluşturma
- Dosya oluşturma
- Dosya silme
- Rename
- Copy
- Move
- Upload
- Download
- Edit
- Permission değiştirme
- Owner değiştirme
Web tabanlı kod editörü olarak CodeMirror 5 kullanılır (wwwroot/lib/codemirror, yerelden sunulur).
Destek:
- JSON
- YAML
- XML
- HTML
- CSS
- JS
- TS
- C#
- ENV
- Markdown
- Nginx config
- Dockerfile
- Shell
Linux permission yönetimi desteklenmelidir.
Örnek:
chmod 755
chmod 644
chown www-data:www-data
UI üzerinden:
- Owner
- Group
- Read
- Write
- Execute
seçilebilir.
Raw chmod/chown işlemleri de Advanced Mode içerisinde bulunabilir.
Panelden Docker Compose projeleri yönetilebilmelidir.
- Compose project listesi
- Compose YAML görüntüleme
- YAML editörü
- Validate
- Up
- Down
- Restart
- Pull
- Build
- Logs
- Recreate
- Environment Variables
- Volumes
- Networks
Örnek:
docker compose up -dişlemi panel üzerinden gerçekleştirilebilir.
- Image listesi
- Size
- Created
- Repository
- Tag
- Digest
İşlemler:
- Pull
- Remove
- Inspect
- Tag
- Prune
Private registry desteği eklenebilir.
Gösterilecek:
- Volume name
- Driver
- Mountpoint
- Size
- Container bağlantıları
İşlemler:
- Create
- Inspect
- Remove
- Backup
- Restore
- Network listesi
- Driver
- Subnet
- Gateway
- Connected containers
İşlemler:
- Create
- Remove
- Inspect
- Connect
- Disconnect
Sunucuya panel üzerinden Dokploy kurulabilmelidir.
Kurulum öncesi:
- OS kontrolü
- Docker kontrolü
- RAM kontrolü
- Disk kontrolü
- Port kontrolü
- Root/Sudo kontrolü
- Internet bağlantısı kontrolü
Adımlar:
- Server seç
- Compatibility check
- Docker check
- Port check
- Installation confirmation
- Installation
- Health check
- Complete
Kurulum çıktısı canlı terminal/log ekranında gösterilmelidir.
Sunucu Dokploy kullanıyorsa:
- Dokploy version
- Status
- URL
- Port
- Container status
- Last health check
gösterilmelidir.
Mümkün olan yerlerde Dokploy API entegrasyonu tercih edilmelidir.
İleri aşamada panel deployment merkezi haline getirilebilir.
Destek:
- GitHub
- GitLab
- Bitbucket
- Self-hosted Git
- Repository
- Branch
- Commit
- Dockerfile
- Compose
- Environment
- Build command
- Deploy command
- Started
- Building
- Deploying
- Success
- Failed
- Cancelled
Sistemin merkezi terminal ekranı olmalıdır.
Terminal:
- SSH
- WebSocket
- Xterm.js
ile çalışabilir.
- Full screen
- Copy / Paste
- Multiple tabs
- Terminal resize
- Command history
- Search
- Download output
- Session reconnect
- Session timeout
Terminal en yüksek riskli modüllerden biridir.
- Session authentication
- Role check
- Server permission check
- Session timeout
- Command audit
- IP audit
- User audit
- Dangerous command warning
İsteğe bağlı:
rm -rf
mkfs
dd
shutdown
reboot
iptables
userdel
gibi komutlarda ikinci onay istenebilir.
Güvenlik sistemi komutları tamamen engellemek yerine configurable policy yaklaşımını desteklemelidir.
Normal SSH bağlantısına ek olarak tarayıcı üzerinden terminal:
Browser
↓
WebSocket
↓
Server Management API
↓
SSH Session
↓
Linux Server
şeklinde çalışmalıdır.
SSH private key backend tarafında güvenli secret store üzerinden kullanılmalıdır.
Sunucudaki process'ler gösterilmelidir.
Alanlar:
- PID
- Process
- User
- CPU
- RAM
- Start Time
- Command
İşlemler:
- View
- Kill
- Restart
Root gerektiren işlemler permission kontrolünden geçmelidir.
Systemd servisleri listelenebilmelidir.
Örnek:
nginx
docker
redis
postgresql
mssql-server
ssh
İşlemler:
- Start
- Stop
- Restart
- Enable
- Disable
- Status
- Logs
Merkezi log ekranı:
- Docker logs
- System logs
- Application logs
- Nginx logs
- SSH logs
- Systemd logs
- Live log
- Search
- Filter
- Level
- Time range
- Download
- Auto refresh
Durum: planlanan. Bu modül henüz uygulanmadı; aşağıdaki metin hedef tanımıdır.
İleri seviye modül:
- Site listesi
- Config
- Enable / Disable
- Test configuration
- Reload
- Restart
- SSL status
Örnek:
nginx -t
systemctl reload nginxSunucu üzerinde çalışan servislerin domainlerini takip edebilmelidir.
- Domain
- IP
- SSL provider
- Expiration date
- Certificate status
SSL bitimine:
- 30 gün
- 15 gün
- 7 gün
- 3 gün
kala bildirim gönderilebilir.
Sunucu ve Docker için backup sistemi:
- File backup
- Database backup
- Docker volume backup
- Configuration backup
- Full server snapshot integration
Desteklenebilecek storage:
- S3
- Cloudflare R2
- MinIO
- Backblaze B2
- Local storage
- Manual
- Scheduled
- Retention
- Encryption
- Compression
İsteğe bağlı DB modülü:
- SQL Server
- PostgreSQL
- MySQL
- MariaDB
- Redis
Gösterilecek:
- Connection status
- Database size
- Connections
- Health
- Version
Database işlemleri mümkün olduğunca güvenli, read-only ağırlıklı ve role-based yapılmalıdır.
Kullanıcı kendi alarm kurallarını oluşturabilmelidir.
Örnek:
CPU > 90% for 5 minutes
RAM > 90%
Disk > 85%
Disk > 95%
Server offline
Container stopped
Container restarting
SSL expires < 7 days
Backup failed
Deployment failed
Docker daemon stopped
Desteklenebilir:
- Telegram
- Discord
- Slack
- Web notification
Notification policy:
Warning
Critical
Recovery
Recovery notification da gönderilmelidir.
Sunucu ve servislerin erişilebilirliği takip edilmelidir.
Örneğin:
Server
├── SSH
├── HTTP
├── HTTPS
├── Docker
├── Dokploy
└── Custom Port
Her servis için:
- Uptime
- Response time
- Last check
- Failure count
tutulabilir.
Durum: planlanan. Bu modül henüz uygulanmadı; aşağıdaki metin hedef tanımıdır.
Sunucunun açık portları görüntülenebilir.
Örneğin:
22 SSH
80 HTTP
443 HTTPS
2375 Docker
3000 Application
Docker remote API gibi yüksek riskli servisler varsayılan olarak güvenli olmayan şekilde expose edilmemelidir.
Sunucunun güvenlik durumunu gösteren ayrı ekran.
Kontroller:
- SSH root login
- Password authentication
- Firewall
- Open ports
- Failed SSH attempts
- Docker exposure
- Outdated packages
- Disk encryption status
- User list
- Sudo users
Olası öneriler:
SSH root login is enabled
Password authentication is enabled
Port 2375 is publicly accessible
Firewall is inactive
Sistem sadece tespit etmeli; otomatik düzeltmeler açık kullanıcı onayı olmadan uygulanmamalıdır.
RBAC: izinler rollere, roller kullanıcılara verilir. Bir kullanıcının birden fazla rolü olabilir; izinleri rollerin birleşimidir.
- Yerleşik roller: SuperAdmin (her izin, değiştirilemez), Admin, Operator, Developer, Viewer. Yerleşik rollerin izinleri Yönetim → Roller sayfasından değiştirilebilir ve Varsayılana döndür ile geri alınır; adları değişmez, silinemezler.
- Özel roller: ad, açıklama ve modüllere göre gruplanmış izin kutularıyla oluşturulur (eklenti izinleri dahil), kopyalanabilir, silinebilir (kullanıcıları varsa önce başka role taşınır).
roles.manageizni gerekir (varsayılan: SuperAdmin, Admin). - Güvenlik kuralları: SuperAdmin olmayan rol yöneticisi yalnızca kendinde olan izinleri verebilir;
user.manage/roles.manageson aktif sahibinden alınamaz; kendi yönetim yetkisini kaldıran değişiklik ek onay ister. İzin kaldırılınca etkilenen kullanıcıların oturumu (security stamp) en geç 1 dakikada yenilenir ve açık terminalleri kapanır. - Yükseltme: seeder her rol için daha önce önerdiği izinleri
RoleKnownPermissionstablosunda tutar; yeni sürümde yalnızca YENİ varsayılan izinler eklenir, yöneticinin kaldırdığı izinler geri gelmez. - Audit:
role.create,role.update,role.permissions_change,role.delete,role.assign.
Varsayılan izinler (✓). Eklentiler (Dokploy, Dokku, GitHub) kendi izinlerini ve rol önerilerini IPermissionProvider ile ekler.
| İzin | Açıklama | SuperAdmin | Admin | Operator | Developer | Viewer |
|---|---|---|---|---|---|---|
dashboard.view |
Dashboard görüntüleme | ✓ | ✓ | ✓ | ✓ | ✓ |
server.view |
Sunucu görüntüleme | ✓ | ✓ | ✓ | ✓ | ✓ |
server.create |
Sunucu ekleme | ✓ | ✓ | |||
server.edit |
Sunucu düzenleme | ✓ | ✓ | |||
server.delete |
Sunucu silme | ✓ | ✓ | |||
server.connect |
Sunucuya bağlanma | ✓ | ✓ | ✓ | ||
docker.view |
Docker görüntüleme (container, image, volume, network, log) | ✓ | ✓ | ✓ | ✓ | ✓ |
docker.start |
Container başlatma / devam ettirme | ✓ | ✓ | ✓ | ||
docker.stop |
Container durdurma / duraklatma / kill | ✓ | ✓ | ✓ | ||
docker.restart |
Container yeniden başlatma | ✓ | ✓ | ✓ | ✓ | |
docker.delete |
Docker silme (container, image, volume, network, prune) | ✓ | ✓ | |||
docker.manage |
Docker yönetimi (image pull, volume/network oluşturma, yeniden adlandırma) | ✓ | ✓ | |||
docker.terminal |
Container terminali | ✓ | ✓ | ✓ | ||
terminal.view |
Terminal sayfası ve oturum geçmişi görüntüleme | ✓ | ✓ | ✓ | ||
terminal.execute |
Sunucuda terminal oturumu açma | ✓ | ✓ | ✓ | ||
file.view |
Dosya listeleme ve içerik görüntüleme | ✓ | ✓ | ✓ | ✓ | |
file.create |
Dosya / klasör oluşturma ve kopyalama | ✓ | ✓ | ✓ | ||
file.edit |
Dosya düzenleme, yeniden adlandırma ve taşıma | ✓ | ✓ | ✓ | ||
file.delete |
Dosya / klasör silme | ✓ | ✓ | |||
file.upload |
Dosya yükleme | ✓ | ✓ | ✓ | ||
file.download |
Dosya indirme | ✓ | ✓ | ✓ | ✓ | |
file.permissions |
Dosya izinleri ve sahiplik değiştirme (chmod / chown) | ✓ | ✓ | |||
deployment.view |
Deployment projeleri, geçmişi ve logları görüntüleme | ✓ | ✓ | ✓ | ✓ | ✓ |
deployment.manage |
Deployment projesi ekleme, düzenleme, silme (Git erişim anahtarı ve ortam değişkenleri dahil) | ✓ | ✓ | |||
deployment.execute |
Deployment başlatma, iptal etme, yeniden dağıtma, geri dönüş ve yeniden başlatma | ✓ | ✓ | ✓ | ✓ | |
deployment.secrets |
Proje ortam değişkeni değerlerini görme ve .env olarak indirme | ✓ | ✓ | |||
alert.view |
Alarmlar, uptime kontrolleri ve SSL sertifikalarını görüntüleme | ✓ | ✓ | ✓ | ✓ | ✓ |
alert.acknowledge |
Alarmı üstlenme (görüldü olarak işaretleme) | ✓ | ✓ | ✓ | ||
alert.manage |
Alarm kuralları, bildirim kanalları, uptime ve SSL kontrollerini yönetme | ✓ | ✓ | |||
backup.view |
Yedekleme işleri, depolama hedefleri ve yedek geçmişini görüntüleme | ✓ | ✓ | ✓ | ✓ | ✓ |
backup.execute |
Yedeklemeyi elle başlatma ve süren yedeklemeyi iptal etme | ✓ | ✓ | ✓ | ||
backup.manage |
Yedekleme işi ve depolama hedefi ekleme, düzenleme, silme (veritabanı parolası ve şifreleme parolası dahil); yedek dosyası silme | ✓ | ✓ | |||
backup.restore |
Yedeği bir sunucuya geri yükleme | ✓ | ✓ | |||
backup.download |
Yedek dosyasını indirme (şifreli yedekte parola girilerek çözülmüş indirme dahil) | ✓ | ✓ | ✓ | ||
plugin.manage |
Eklenti kurma, etkinleştirme ve devre dışı bırakma | ✓ | ||||
user.manage |
Kullanıcı yönetimi | ✓ | ||||
roles.manage |
Rol yönetimi (rol oluşturma, izinlerini değiştirme, silme) | ✓ | ✓ | |||
audit.view |
Audit log görüntüleme | ✓ | ✓ | |||
audit.export |
Audit log'u CSV olarak dışa aktarma ve bütünlüğünü doğrulama | ✓ | ✓ | |||
security.view |
Güvenlik merkezi ve sunucu güvenlik taramalarını görüntüleme | ✓ | ✓ | ✓ | ||
security.scan |
Sunucuda güvenlik taraması başlatma (yalnızca okuma yapar) | ✓ | ✓ | ✓ | ||
system.view |
Sunucu servisleri, process'ler, loglar, ağ ve disk bilgisini görüntüleme | ✓ | ✓ | ✓ | ✓ | |
system.manage |
Sunucu servisini başlatma, durdurma, yeniden başlatma ve process sonlandırma | ✓ | ✓ | ✓ | ||
server.cleanup |
Sunucu temizliği (kullanılmayan Docker kaynakları, paket önbelleği, eski loglar ve geçici dosyaları silme) | ✓ | ✓ | ✓ | ||
command.view |
Toplu komut geçmişini ve sunucu şablonlarını görüntüleme | ✓ | ✓ | ✓ | ||
command.run |
Birden fazla sunucuda aynı anda komut çalıştırma | ✓ | ✓ | |||
template.manage |
Sunucu şablonlarını (betik / cloud-init) ekleme, düzenleme ve silme | ✓ | ✓ | |||
cloud.view |
Bulut sağlayıcı hesaplarını, sunucu listesini ve maliyetleri görüntüleme | ✓ | ✓ | ✓ | ||
cloud.manage |
Bulut sağlayıcı hesabı ekleme, düzenleme, silme ve eşitleme | ✓ | ✓ | |||
cloud.provision |
Bulut sağlayıcıda yeni sunucu oluşturma | ✓ | ✓ | |||
settings.view |
Sistem ayarlarını ve uygulama bilgisini görüntüleme | ✓ | ✓ | |||
settings.manage |
İzleme, alarm, yedekleme, tarama ve bulut aralıklarını değiştirme | ✓ | ✓ | |||
services.view |
Servisleri (veritabanı ve uygulamalar), loglarını ve işlem geçmişini görüntüleme | ✓ | ✓ | ✓ | ✓ | ✓ |
services.manage |
Servis kurma, ayarlarını değiştirip yeniden oluşturma, sürüm yükseltme, durdurma ve kaldırma | ✓ | ✓ | ✓ | ||
services.console |
Servis konsolunu açma (psql, mysql, redis-cli …) | ✓ | ✓ | ✓ | ||
services.reveal_secrets |
Servis parolalarını ve parolalı bağlantı adreslerini görüntüleme | ✓ | ✓ |
Panel /api/v1 altında JSON REST API sunar. Kimlik doğrulama yalnızca kişisel API anahtarıyladır; tarayıcı oturumu (cookie) bu uçlara erişemez.
- Anahtar Hesap menüsü → API anahtarları sayfasında oluşturulur: ad, süre (30 / 90 / 365 gün;
ApiKeys:AllowNoExpiryaçıksa süresiz), kapsam (kullanıcının kendi izinlerinden seçim) ve isteğe bağlı IP / CIDR listesi. Anahtar (smk_<önek>_<gizli>) yalnızca bir kez gösterilir; veritabanında önek ve SHA-256 özeti durur. - İstek anındaki izinler = anahtarın kapsamı ∩ kullanıcının o anki izinleri. Her uç panelle aynı izni ister; yetki yoksa 403.
- İptal edilen, süresi dolan, izin listesi dışındaki IP'den gelen veya sahibi pasif / kilitli olan anahtar 401 alır. Anahtar başına dakikada 120 istek (429).
- Yanıtlar camelCase JSON; listeler
{ items, page, pageSize, totalCount, totalPages }; hatalar ProblemDetails (application/problem+json). - OpenAPI belgesi:
/api/v1/openapi.json(anahtar veya panel oturumu ile). Panelde API anahtarları → API belgesi sekmesi curl örneklerini gösterir.
export SM_API_KEY="smk_..."
BASE=https://panel.example.com/api/v1
curl -s -H "Authorization: Bearer $SM_API_KEY" $BASE/servers
curl -s -H "Authorization: Bearer $SM_API_KEY" $BASE/servers/<id>/status
curl -s -X POST -H "Authorization: Bearer $SM_API_KEY" -H "Content-Type: application/json" \
-d '{"commitSha": null}' $BASE/projects/<id>/deployments # 202 + statusUrl
curl -s -H "Authorization: Bearer $SM_API_KEY" "$BASE/deployments/<id>/log?tail=100"
curl -s -X POST -H "Authorization: Bearer $SM_API_KEY" $BASE/services/<id>/restart
curl -s -X POST -H "Authorization: Bearer $SM_API_KEY" $BASE/backups/jobs/<id>/run
curl -fL -H "Authorization: Bearer $SM_API_KEY" -o backup.tar.gz $BASE/backups/runs/<id>/download
curl -s -H "Authorization: Bearer $SM_API_KEY" $BASE/alerts
curl -s -X POST -H "Authorization: Bearer $SM_API_KEY" $BASE/alerts/<id>/acknowledge| Uç | İzin |
|---|---|
GET /me |
— |
GET /servers, /servers/{id}, /servers/{id}/status |
server.view |
GET /projects, /projects/{id}/deployments |
deployment.view |
POST /projects/{id}/deployments, /projects/{id}/restart |
deployment.execute |
GET /deployments/{id}, /deployments/{id}/log?tail= |
deployment.view |
GET /services, /services/{id}, /services/{id}/status |
services.view |
POST /services/{id}/start, /stop, /restart |
services.manage |
GET /backups/jobs, /backups/runs, /backups/runs/{id} |
backup.view |
POST /backups/jobs/{id}/run |
backup.execute |
GET /backups/runs/{id}/download |
backup.download |
GET /alerts?status=firing|resolved|all |
alert.view |
POST /alerts/{id}/acknowledge |
alert.acknowledge |
Yapılandırma: ApiKeys:Enabled (true), ApiKeys:MaxLifetimeDays (365), ApiKeys:AllowNoExpiry (false), ApiKeys:RequestsPerMinute (120), ApiKeys:MaxKeysPerUser (20). Audit: api_key.create, api_key.revoke, api_key.use (anahtar başına saatte en çok bir kez veya kaynak IP değişince).
Yapılan bütün kritik işlemler kayıt altına alınmalıdır.
Örnek:
User:
Mehmet
Action:
Docker Restart
Server:
Production-01
Container:
api
IP:
x.x.x.x
Date:
2026-10-03 20:15
Audit log silinmemeli veya yalnızca özel yetkili kullanıcı tarafından retention policy kapsamında yönetilebilmelidir.
Sunucu bakım moduna alınabilir.
Maintenance sırasında:
- Alert susturma
- Deployment engelleme
- Kullanıcı bilgilendirme
- Bakım notu
özellikleri bulunmalıdır.
Sunucular etiketlenebilmelidir.
Örnek:
production
staging
development
database
docker
web
api
eu
tr
Böylece filtreleme kolaylaşır.
Sunucular gruplandırılabilir.
Örneğin:
Production
├── Web-01
├── Web-02
├── API-01
└── DB-01
Staging
├── Stage-01
└── Stage-02
Grup bazlı:
- Monitoring
- Alert
- Permission
- Deployment
uygulanabilir.
Yeni sunucular için template sistemi:
Ubuntu Docker Server
Ubuntu Dokploy Server
Web Server
Database Server
CI/CD Server
Template üzerinden:
- Package installation
- Docker installation
- Firewall configuration
- Monitoring agent
- User creation
otomatikleştirilebilir.
İleri aşamada:
- Ubuntu kurulumu sonrası hazırlık
- Docker kurulumu
- Dokploy kurulumu
- Nginx kurulumu
- Firewall
- Monitoring agent
- SSH hardening
tek workflow ile uygulanabilir.
Bu yapı idempotent olmalıdır.
Sık kullanılan komutlar kaydedilebilir.
Örnek:
docker ps
docker system df
df -h
free -h
uptime
systemctl status dockerKullanıcı komut kütüphanesi oluşturabilir.
Komutlar:
- Global
- Server specific
- Role restricted
olabilir.
Sunucularda zamanlanmış işlemler:
- Backup
- Cleanup
- Docker prune
- Log cleanup
- Health check
- Custom script
olarak planlanabilir.
Cron yönetimi desteklenebilir.
Bir veya birden fazla sunucuda script çalıştırma.
Örnek:
Production Group
↓
Script
↓
Web-01
Web-02
API-01
API-02
Sonuçlar:
- Success
- Failed
- Duration
- Output
- Error
olarak tutulmalıdır.
Toplu çalıştırma için güçlü confirmation ve role permission uygulanmalıdır.
İki veya daha fazla sunucu karşılaştırılabilir.
Karşılaştırma:
- CPU
- RAM
- Disk
- OS
- Kernel
- Docker
- Containers
- Uptime
- Network
- Open ports
Cloud provider bilgisi eklenirse:
- Aylık tahmini maliyet
- Server cost
- Storage cost
- Backup cost
- Traffic cost
takip edilebilir.
Provider:
- AWS
- Azure
- Hetzner
- DigitalOcean
- Vultr
- Linode
- Scaleway
- Contabo
- OVH
gibi platformlara adapter mimarisi ile bağlanabilir.
Önerilen teknoloji:
Frontend
↓
ASP.NET Core MVC / Razor
↓
ASP.NET Core API
↓
Application
↓
Infrastructure
↓
SSH / Docker / Linux / Database
- ASP.NET Core 10
- C#
- Clean Architecture
- MSSQL
- Entity Framework Core
- FluentValidation
- FluentMigrator
- ASP.NET Core Identity
- Serilog
- SignalR
- ASP.NET Core MVC / Razor
- Tailwind CSS v4 + Sass
- ES module JavaScript ve jQuery (framework yok)
- CodeMirror 5 (dosya editörü)
- xterm.js
- Chart.js
- SweetAlert2, toastr
SignalR:
Server Metrics
Docker Logs
Terminal Events
Deployment Logs
Alerts
System Events
src/
├── ServerManager.Domain/
│ ├── Entities/
│ ├── Enums/
│ ├── ValueObjects/
│ └── Interfaces/
│
├── ServerManager.Application/
│ ├── Services/
│ ├── DTOs/
│ ├── Validators/
│ ├── Interfaces/
│ └── Mappings/
│
├── ServerManager.Infrastructure/
│ ├── Persistence/
│ ├── Repositories/
│ ├── SSH/
│ ├── Docker/
│ ├── Monitoring/
│ ├── Notifications/
│ ├── Security/
│ └── BackgroundJobs/
│
├── ServerManager.Web.Framework/ # Host ile eklentilerin ortak web altyapısı
│ ├── Authorization/
│ ├── Mvc/
│ ├── Plugins/
│ ├── Servers/
│ └── UI/
│
├── ServerManager.Web/
│ ├── Controllers/
│ ├── Hubs/
│ ├── Views/
│ ├── Components/
│ ├── wwwroot/
│ └── Middleware/
│
└── Plugins/ # nopCommerce tarzı eklentiler (Modül / Eklenti)
├── ServerManager.Plugin.DevOps.Dokploy/
├── ServerManager.Plugin.DevOps.Dokku/
├── ServerManager.Plugin.Git.GitHub/
├── ServerManager.Plugin.Notifications.{Email,Telegram,Discord}/
├── ServerManager.Plugin.Storage.{S3,AzureBlob}/
├── ServerManager.Plugin.Services.Extra/ # Servis şablonları (Meilisearch, ClickHouse, Keycloak)
└── ServerManager.Plugin.Cloud.{Hetzner,DigitalOcean,Vultr,Linode,Scaleway}/
Repository pattern kullanılmalı; database erişimi repository katmanında tutulmalıdır.
Çekirdek (sunucu, izleme, Docker, terminal, dosya, kullanıcı, audit) host uygulamada kalır. Dokploy ve Dokku (hazır) ile Coolify, CapRover, Portainer (planlanan) gibi üçüncü parti DevOps araçları ve isteğe bağlı entegrasyonlar eklenti olarak geliştirilir: her biri kendi projesinde, kendi entity, migration, servis, controller, view, JS/CSS, izin ve audit tanımlarıyla durur; host'a dokunmadan eklenir, kurulur, etkinleştirilir veya devre dışı bırakılır.
Server işlemleri doğrudan controller'a yazılmamalıdır.
Örneğin:
IServerProvider
├── SshServerProvider
├── DockerProvider
└── CloudProvider
Docker:
IDockerProvider
gibi abstraction kullanılmalıdır.
DevOps araçlarının provider'ları kendi eklentisinin içinde tanımlanır ve host'un ortak SSH/Docker altyapısını (IServerConnectionProvider, IRemoteCommandExecutor, ISecretProtector) kullanır:
Plugins/
├── DevOps.Dokploy → IDokployProvider (SshDokployProvider), IDokployApiClient
├── DevOps.Dokku → IDokkuProvider (SSH üzerinden dokku CLI)
└── DevOps.Coolify → ICoolifyProvider (planlanan; henüz eklentisi yok)
Bu yapı ileride yeni provider eklemeyi kolaylaştırır; yeni araç için host kodu değişmez (bkz. Eklenti geliştirme).
Önerilen tablolar:
Servers
ServerCredentials
ServerTags
ServerGroups
ServerGroupMembers
ServerMetrics
ServerHealthChecks
DockerContainers
DockerImages
DockerVolumes
DockerNetworks
DockerProjects
Deployments
DeploymentLogs
TerminalSessions
TerminalCommandLogs
Files
FileOperationLogs
Services
Processes
Backups
BackupJobs
Alerts
AlertRules
Notifications
Users
Roles
Permissions
UserRoles
RolePermissions
AuditLogs
MaintenanceWindows
CommandLibrary
ScheduledTasks
ServerScripts
SslCertificates
Domains
Ports
Secret değerleri doğrudan ServerCredentials içerisinde plaintext olarak tutulmamalıdır.
Arka plan servisleri:
MetricsCollector
HealthCheckWorker
DockerMonitor
AlertWorker
BackupWorker
CertificateMonitor
CleanupWorker
DeploymentWorker
Örneğin MetricsCollector her 15-30 saniyede sunucuları kontrol edebilir.
Yoğun sunucu sayısında adaptive polling ve job queue kullanılmalıdır.
Önerilen yapı:
Server Manager
|
+------------+------------+
| | |
SSH Docker API HTTPS/API
| | |
Linux Docker Dokploy
Server Engine Instance
Mümkün olduğunca sunuculara inbound port açmak yerine outbound bağlantı veya SSH üzerinden yönetim tercih edilmelidir.
İleride küçük bir Linux Agent geliştirilebilir.
Server Manager
↓
Agent
↓
Linux Server
Agent:
- Metrics
- Docker
- Logs
- Process
- Services
- File operations
sağlayabilir.
Agent bağlantısı:
- TLS
- API key
- Certificate
- Heartbeat
ile korunmalıdır.
Agent ilk sürüm için zorunlu değildir.
MVP'de agent kurmadan:
SSH
Docker CLI
HTTP API
Dokploy API
üzerinden ilerlemek önerilir.
Bu sayede yeni sunucuya sadece SSH bilgileri verilerek sistem kullanılabilir.
Tasarım profesyonel bir DevOps/SaaS dashboard görünümünde olmalıdır.
Dashboard
Infrastructure
├── Servers
├── Groups
└── Providers
Containers
├── Docker
├── Images
├── Volumes
└── Networks
Deployments
├── Projects
├── Deployments
└── History
Operations
├── Terminal
├── Files
├── Services
├── Processes
└── Logs
Monitoring
├── Metrics
├── Uptime
├── Alerts
└── SSL
Backup
Security
Users
Audit Logs
Settings
Sunucu detayında üst bölüm:
Production-01
Ubuntu 24.04
Online
IP: xxx.xxx.xxx.xxx
Uptime: 24d 13h
CPU ███████░░░ 71%
RAM █████░░░░░ 52%
DISK ████████░░ 81%
Alt bölüm:
CPU Chart
RAM Chart
Network Chart
Docker Status
Recent Logs
Recent Events
Alerts
SignalR ile:
- CPU değişimi
- RAM değişimi
- Docker status
- Live terminal
- Live logs
- Deployment output
sayfa refresh edilmeden güncellenmelidir.
Panel:
- Dark
- Light
- System
modlarını desteklemelidir.
Terminal ve log ekranları için dark-first UI kullanılabilir.
API response:
{
"isSuccess": true,
"statusCode": 200,
"data": {},
"message": "",
"validationMessages": [],
"timeStamp": "2026-10-03T20:15:00+03:00",
"apiVersion": "1.0"
}Global exception middleware:
ValidationException
AuthenticationException
AuthorizationException
ServerConnectionException
SshException
DockerException
DeploymentException
FileOperationException
hatalarını merkezi olarak yönetmelidir.
Sensitive bilgiler error response içerisinde gösterilmemelidir.
Kesinlikle:
- SSH password loglanmamalı
- Private key loglanmamalı
- Environment secret loglanmamalı
- Terminal output gerekiyorsa configurable retention uygulanmalı
- Tokenlar maskelenmeli
- API key hash/encryption ile korunmalı
- CSRF koruması
- XSS koruması
- Rate limiting
- RBAC
- Audit logging
- Secure headers
uygulanmalıdır.
Aşağıdaki işlemler için ikinci doğrulama düşünülebilir:
- Server delete
- Container delete
- Volume delete
- Docker prune
- File delete
- Recursive folder delete
- Reboot
- Shutdown
- Firewall change
- User delete
- Database restore
- Backup restore
Admin kullanıcıları için:
- TOTP
- Recovery codes
- Optional WebAuthn
desteklenebilir.
Özellikle terminal, server credential ve deployment işlemlerinde step-up authentication kullanılabilir.
Durum: planlanan. Bu modül henüz uygulanmadı; aşağıdaki metin hedef tanımıdır.
External automation için API key sistemi:
Name
Key
Permissions
Expiration
Last Used
Created By
API key scope:
server:read
docker:read
deployment:execute
backup:execute
gibi granular olmalıdır.
Durum: planlanan. Bu modül henüz uygulanmadı; aşağıdaki metin hedef tanımıdır.
Dış sistemlerden event alınabilir:
Deployment completed
Git push
Monitoring event
Backup event
Ayrıca sistem kendi webhooklarını gönderebilir.
Sunucu bilgileri:
- JSON
- CSV
ile import/export edilebilir.
Secret değerleri export edilmemelidir.
Durum: planlanan. Bu modül henüz uygulanmadı; aşağıdaki metin hedef tanımıdır.
Global search:
Server
Container
Image
Deployment
Domain
Alert
User
Log
üzerinde çalışmalıdır.
Örneğin:
api
aranınca:
API-01
api-container
api deployment
api logs
görülebilmelidir.
- Authentication
- Identity
- RBAC
- Layout
- Dashboard
- Server CRUD
- Secure credential storage
- SSH connection test
- CPU
- RAM
- Disk
- Network
- Uptime
- Health checks
- Charts
- Containers
- Images
- Volumes
- Networks
- Container logs
- Start/Stop/Restart
- Container terminal
- Web terminal
- File browser
- File editor
- Upload/download
- Permission management
- Installation wizard
- Health check
- Dokploy status
- API integration
- Git integration
- Projects
- Deployment
- Deployment logs
- History
Durum: tamamlandı. Ayrıntılar için bkz. Deployment.
- Alert rules
- Telegram
- Discord
- SSL monitoring
- Uptime
Durum: tamamlandı. Ayrıntılar için bkz. Alarmlar ve izleme.
- Docker volume backup
- Database backup
- File backup
- S3/R2
- Restore
Durum: tamamlandı. Ayrıntılar için bkz. Yedekleme.
- Security center
- SSH audit
- Port audit
- Firewall status
- 2FA
- Advanced audit
Durum: tamamlandı. Ayrıntılar için bkz. Güvenlik merkezi, İki adımlı doğrulama ve Audit log.
- Agent
- Multi-server command runner
- Cloud provider integration
- Cost monitoring
- Server provisioning
- Server templates
Durum: tamamlandı. Ayrıntılar için bkz. Toplu komut ve şablonlar, Bulut sağlayıcıları, Maliyet raporu, Agent ve Ayarlar.
MVP'nin başarılı olması için ilk versiyonda şu özellikler tamamlanmalıdır:
- Server CRUD
- SSH authentication
- Connection test
- Server health
- CPU/RAM/Disk/Network
- Container list
- Status
- Logs
- Start
- Stop
- Restart
- Container terminal
- Images
- Volumes
- Networks
- Web terminal
- Multiple sessions
- Resize
- Command history
- Browse
- Create
- Edit
- Delete
- Upload
- Download
- Permissions
- Install
- Status
- Health check
- RBAC
- Encryption
- Audit logs
- 2FA
- Dangerous action confirmation
- Kubernetes
- Proxmox
- VMware
- LXC/LXD
- Cloud provider API
- VM lifecycle management
- CI/CD
- GitOps
- Deployment pipelines
- Canary deployment
- Blue/Green deployment
- Rollback
- Prometheus
- Grafana integration
- Loki
- OpenTelemetry
- Distributed tracing
Panel içerisinde AI assistant eklenebilir.
Örneğin kullanıcı:
"Bu sunucuda neden CPU kullanımı yüksek?"
dediğinde sistem:
- Metrics inceler
- Process listesini inceler
- Docker containerlarını inceler
- Logları analiz eder
- Bulguları açıklar
- Önerilen aksiyonları listeler
AI doğrudan destructive komut çalıştırmamalı; aksiyonlar kullanıcı onayıyla uygulanmalıdır.
İleri sürümde:
User
↓
AI Copilot
↓
Permission Check
↓
Read-only diagnostics
↓
Analysis
↓
Suggested Actions
↓
User Confirmation
↓
Execution
↓
Audit Log
Örnek:
"api container sürekli restart oluyor."
AI:
Container: api
Restart Count: 47
Muhtemel neden:
Application exited with code 1.
Son loglarda:
Connection refused
Öneri:
Database bağlantısını kontrol edin.
AI kendiliğinden:
docker rm -f apigibi destructive işlem çalıştırmamalıdır.
Uzun vadede:
Server Metrics
↓
Metrics Collector
↓
Time Series Storage
↓
Dashboard
↓
Alert Engine
Metrik sayısı büyürse MSSQL yerine veya yanında:
- Prometheus
- VictoriaMetrics
- TimescaleDB
gibi time-series çözümleri değerlendirilebilir.
Sistem yüzlerce sunucuyu yönetebilecek şekilde tasarlanmalıdır.
- Async I/O
- Connection pooling
- Background workers
- Job queue
- Caching
- SignalR
- Metric aggregation
- Pagination
- Lazy loading
- Rate limiting
Sunucular aynı anda sorgulanmamalı; concurrency limiti uygulanmalıdır.
Server Management uygulamasının kendisi de izlenmelidir.
- Application health
- Database health
- Redis health
- Worker health
- Queue health
- SignalR connections
- SSH failures
- Docker API failures
Redis şu amaçlarla kullanılabilir:
- Cache
- Distributed locks
- Session
- SignalR backplane
- Background job state
- Temporary terminal session state
Server Manager'ın kendisi de Docker ile çalıştırılabilmelidir.
Örnek:
server-manager-web
server-manager-worker
server-manager-db
server-manager-redis
Docker Compose ile production deployment desteklenmelidir.
Minimum:
Database
Credentials metadata
Application configuration
Audit logs
yedeklenmelidir.
Secret encryption key backup stratejisi ayrıca tasarlanmalıdır.
Encryption key kaybedilirse encrypted credentials geri döndürülemeyebileceğinden recovery planı zorunludur.
Bir özellik tamamlandı sayılabilmesi için:
- Backend tamamlanmış
- UI tamamlanmış
- Validation tamamlanmış
- Authorization tamamlanmış
- Audit log eklenmiş
- Error handling yapılmış
- Loading state eklenmiş
- Empty state eklenmiş
- Success/error notification eklenmiş
- Responsive kontrol edilmiş
- Test yazılmış
- Security kontrolü yapılmış
- Documentation güncellenmiş
olmalıdır.
Cursor AI projeyi geliştirirken:
- Mevcut mimariyi bozmamalıdır.
- Kullanıcı istemediği özellikleri rastgele eklememelidir.
- Önce mevcut kodu analiz etmelidir.
- Büyük değişikliklerde plan çıkarmalıdır.
- Security kritik işlemleri doğrudan uygulamamalıdır.
- Secret değerleri source code içine yazmamalıdır.
- Repository dışından database erişmemelidir.
- Controller içine business logic yazmamalıdır.
- Async işlemleri tercih etmelidir.
- Her yeni özellik için authorization kontrolü eklemelidir.
- Destructive işlemler confirmation gerektirmelidir.
- Audit log gerektiren işlemler audit edilmelidir.
- UI'da Türkçe kullanıcı metinleri kullanılmalıdır.
- Kod ve teknik isimlendirmeler İngilizce olmalıdır.
- Gereksiz dependency eklememelidir.
- Gereksiz refactor yapmamalıdır.
- Test edilebilir kod yazmalıdır.
- Production secretlarını loglamamalıdır.
- Dokploy, Dokku gibi üçüncü parti DevOps araçlarını ve isteğe bağlı entegrasyonları host'a değil,
src/Plugins/altında ayrı bir eklenti olarak geliştirmelidir; eklenti host projesine referans eklememeli, yalnızcaApplication,InfrastructureveWeb.Frameworküzerinden çalışmalıdır.
Bu proje yalnızca basit bir "SSH paneli" olmamalıdır.
Hedef ürün:
Sunucu + Docker + Dokploy + Deployment + Monitoring + Terminal + Files + Backup + Security + Alerting + AI DevOps Assistant
özelliklerini tek platformda birleştiren profesyonel bir Server Management Platform'dur.
İlk hedef küçük ve güvenli bir MVP oluşturmak; daha sonra Docker, Dokploy, deployment, monitoring, backup ve AI özelliklerini aşamalı şekilde genişletmektir.
Geçici isim:
Server Management Platform
Alternatif marka isimleri:
- ServerPilotX
- ServerHub
- ServerDeck
- InfraPilot
- ServerOps
- DevOpsHub
- InfraManager
- OpsCenter
- ServerControl
- InfraDesk
1. Authentication / Identity
2. RBAC
3. Server Management
4. SSH Connection
5. Server Metrics
6. Dashboard
7. Docker Management
8. Container Terminal
9. File Manager
10. Dokploy Installer
11. Deployment
12. Logs
13. Alerts
14. Backup
15. Security Center
16. Audit
17. 2FA
18. AI DevOps Copilot
Bu sıra değiştirilmeden önce her fazın stabil ve güvenli çalışması doğrulanmalıdır.
Phase 1 (Foundation) kapsamındaki özellikler: Identity ile giriş/çıkış, rol ve izin tabanlı yetkilendirme (RBAC), dashboard, sunucu ekleme/düzenleme/silme, şifreli kimlik bilgileri (AES-256-GCM), SSH bağlantı testi (host key fingerprint TOFU), kullanıcı yönetimi ve audit log.
Phase 2 (Monitoring) kapsamındaki özellikler: agentless SSH ile CPU, RAM, swap, disk, inode, network, load, uptime ve process metrikleri; otomatik sunucu durumu (Healthy / Warning / Critical / Offline); sağlık kontrolleri; saatlik özetleme ve saklama süresi politikası; SignalR ile canlı güncelleme; Chart.js grafikleri (1 saat – 30 gün).
Phase 3 (Docker) kapsamındaki özellikler: SSH üzerinden Docker CLI ile genel bakış, container listesi (canlı CPU/RAM), container detayı (inspect, port, mount, network, env, label), start/stop/restart/pause/unpause/kill/remove/rename, loglar (arama, stderr filtresi, canlı takip, indirme), xterm.js ile container terminali, image (pull, sil, prune), volume (oluştur, sil, prune) ve network (oluştur, sil) yönetimi. Sudo yetkili kullanıcılar desteklenir.
Phase 4 (Terminal & Files) kapsamındaki özellikler: tarayıcıdan SSH terminali (Browser → SignalR WebSocket → API → SSH; çoklu sekme, yeniden boyutlandırma, tam ekran, kopyala/yapıştır, arama, çıktı indirme, komut geçmişi, sayfa yenilenince/bağlantı kopunca aynı oturuma yeniden bağlanma, boşta kalma zaman aşımı), tehlikeli komutlarda ikinci onay, oturum ve komut geçmişi; SFTP tabanlı dosya yöneticisi (gezinme, oluşturma, yeniden adlandırma/taşıma, kopyalama, silme, sürükle-bırak yükleme, indirme, chmod/chown) ve CodeMirror editörü (JSON, YAML, XML, HTML, CSS, JS, TS, C#, ENV, Markdown, Nginx, Dockerfile, Shell ve daha fazlası).
Phase 5 (Dokploy) kapsamındaki özellikler — DevOps.Dokploy eklentisi olarak (bkz. Eklentiler): Dokploy kurulum sihirbazı (sunucu seçimi → uyumluluk → Docker → port → onay → kurulum → sağlık kontrolü → tamamlandı), ön kontroller (işletim sistemi, mimari, container ortamı, root/sudo, RAM, disk, port, internet), canlı kurulum çıktısı (sayfa kapansa da kurulum sürer, geri dönünce çıktı yeniden oynatılır), kurulum geçmişi; Dokploy durumu (sürüm, durum, adres, port, swarm servisleri ve container'lar, son sağlık kontrolü, yanıt süresi), periyodik sağlık kontrolü ve API anahtarıyla proje özeti.
| Katman | Teknoloji |
|---|---|
| Web | ASP.NET Core MVC (.NET 10), Tailwind CSS v4 + Sass, ES module JavaScript |
| Arayüz bileşenleri | SweetAlert2 (onay/uyarı), toastr (bildirim), xterm.js (terminal), CodeMirror 5 (dosya editörü) |
| Kimlik | ASP.NET Core Identity (Guid anahtarlı), izin claim'leri |
| Veri | MSSQL, EF Core (yalnızca sorgu), FluentMigrator (tüm şema) |
| Doğrulama | FluentValidation |
| SSH | SSH.NET |
| Canlı veri | ASP.NET Core SignalR, Chart.js |
| Log | Serilog (konsol + logs/ dosyası) |
| Test | xUnit v3, NSubstitute |
Mimari: Domain → Application (servisler, DTO, validator, arayüzler) → Infrastructure (EF Core, repository, Identity, şifreleme, SSH) → Web.Framework (yetkilendirme, JSON yanıtı, sunucu sayfası, eklenti yükleyici) → Web (controller, view). Eklentiler src/Plugins/ altında Infrastructure ve Web.Framework'e referans veren ayrı projelerdir; host eklentilere derleme zamanında bağlı değildir. Mediator yoktur; akış Controller → Service → Repository şeklindedir.
- .NET SDK 10.0
- Node.js 20+ (yalnızca stil derlemesi ve vendor dosyalarının kopyalanması için)
- Docker (yerel MSSQL için)
cp .env.example .env # MSSQL_SA_PASSWORD değerini güçlü bir parolayla değiştirin
docker compose up -d db # MSSQL 2022, yalnızca 127.0.0.1:14340 üzerinden erişilir.env dosyası git'e eklenmez.
Gizli değerler kaynak koda veya appsettings.json dosyasına yazılmaz. Geliştirmede dotnet user-secrets, sunucuda ortam değişkenleri kullanılır (ör. Security__MasterKey).
cd src/ServerManager.Web
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=localhost,14340;Database=ServerManager;User Id=sa;Password=<MSSQL_SA_PASSWORD>;TrustServerCertificate=True;Encrypt=True"
dotnet user-secrets set "Security:MasterKey" "$(openssl rand -base64 32)"
dotnet user-secrets set "Seed:AdminEmail" "admin@example.com"
dotnet user-secrets set "Seed:AdminPassword" "<en az 10 karakter, büyük/küçük harf ve rakam>"
dotnet user-secrets set "Seed:AdminFullName" "Sistem Yöneticisi"| Anahtar | Açıklama |
|---|---|
ConnectionStrings:DefaultConnection |
MSSQL bağlantı dizesi |
Security:MasterKey |
32 baytlık base64 anahtar; SSH parolası, private key, passphrase ve sudo parolasını şifreler |
Security:KeyVersion |
Anahtar sürümü (varsayılan 1); şifreli değerler v{sürüm}: önekiyle saklanır |
Seed:AdminEmail / Seed:AdminPassword / Seed:AdminFullName |
İlk SuperAdmin hesabı (bu e-postayla kullanıcı yoksa oluşturulur; mevcut kullanıcının parolası/rolü değiştirilmez) |
Database:AutoCreate |
true ise veritabanı yoksa oluşturulur (Development'ta açık) |
Proxy:TrustForwardedHeaders |
Reverse proxy arkasında X-Forwarded-* başlıklarına güvenilsin mi (bkz. Reverse proxy) |
Proxy:KnownProxies / Proxy:KnownNetworks |
X-Forwarded-* başlıklarına güvenilen vekil IP adresleri / CIDR ağları |
Önemli:
Security:MasterKeykaybolur veya değişirse kayıtlı sunucu kimlik bilgileri çözülemez. Anahtarı güvenli bir yerde yedekleyin.
cd src/ServerManager.Web
npm install
npm run build # vendor kopyalama + stil derleme
npm run build:css # yalnızca stiller (Sass → Tailwind → minify)
npm run build:css:watch # geliştirme sırasında izleme modu
npm run build:vendor # jQuery, toastr, SweetAlert2, Chart.js, SignalR, xterm.js, CodeMirror 5 → wwwroot/libDerlenmiş wwwroot/css ve wwwroot/lib dosyaları repoya dahildir; SCSS, view veya JS'te sınıf değişikliği yapıldığında ya da paket sürümü güncellendiğinde yeniden derlenmelidir. Kütüphaneler CDN yerine yerelden sunulur (CSP script-src 'self').
Frontend yapısı:
| Yol | İçerik |
|---|---|
Styles/site.scss |
Ortak stiller: base, layout, components, vendor (SweetAlert2/toastr temaları) partial'ları ve Tailwind teması |
Styles/pages/<sayfa>.scss |
Yalnızca o sayfaya ait stiller → wwwroot/css/pages/<sayfa>.css |
wwwroot/js/core |
http (fetch + antiforgery), dialog (SweetAlert2), notify (toastr), forms, dom, format, navigation, page-scope, regions |
wwwroot/js/components |
ajax-actions, ajax-list, auto-refresh, log-console, modal, remote-panels, stepper, tabs, tooltip |
wwwroot/js/features |
Monitoring, sunucu ve Docker modülleri |
wwwroot/js/pages/<sayfa>.js |
Sayfanın giriş modülü |
src/Plugins/<eklenti>/Styles/pages/<sayfa>.scss |
Eklenti sayfası stili → eklentinin Content/css/pages/<sayfa>.css dosyası (aynı npm run build:css derler) |
- View'da
ViewData["Page"] = "<sayfa>"atanınca layoutcss/pages/<sayfa>.cssvejs/pages/<sayfa>.jsdosyalarını ekler. Eklenti view'larında ayrıcaViewData[PluginContent.PagePluginKey]atanır; dosyalar/plugins/<eklenti-adı-küçük-harf>/altından yüklenir. - JavaScript yalnızca ES module'dür; layout'taki import map her modülü sürüm parametreli adrese eşler (önbellek bozma).
- Veri çekme, ekleme, düzenleme, silme ve uyarıların tamamı AJAX ile yapılır; sayfa yenilenmez. Listeler partial view +
pushStateile filtrelenir, formlar JSON (isSuccess,message,data,errors) döner. - Onaylar SweetAlert2 ile (tehlikeli işlemlerde ad yazarak), bildirimler toastr ile gösterilir.
dotnet run --project src/ServerManager.Web --launch-profile https- Uygulama açılışta FluentMigrator migration'larını uygular, rolleri/izinleri ve ilk SuperAdmin'i oluşturur (idempotent; mevcut veri silinmez).
- Adres:
https://localhost:7180(http profili:http://localhost:5180).
dotnet test --solution ServerManager.slnxBirim testleri veritabanına veya gerçek sunuculara bağlanmaz. global.json içinde Microsoft.Testing.Platform runner'ı seçilidir.
tests/ServerManager.Web.Tests uygulamayı WebApplicationFactory<Program> ile bellek içinde, üretim ayarlarıyla (Development dışı ortam, HTTPS, Secure cookie) açar ve güvenlik davranışını uçtan uca dener: girişsiz isteğin giriş sayfasına yönlenmesi, antiforgery zorunluluğu, izin reddi (403 / AccessDenied), hesap kilidi ve giriş hız sınırı, zorunlu 2FA yönlendirmesi, agent raporunda Bearer token kontrolü, sağlık uçları ve tüm eklentilerin hatasız yüklenmesi. Uygulama açılışta migration çalıştırdığı için bu testler gerçek bir SQL Server ister; SM_TEST_SQL ortam değişkeni tanımlı değilse atlanır (başarısız sayılmaz). Her test sunucusu kendi geçici veritabanını (SmWebTests_<guid>) açar ve sonunda siler.
docker compose up -d db
export SM_TEST_SQL="Server=127.0.0.1,14340;User Id=sa;Password=<MSSQL_SA_PASSWORD>;TrustServerCertificate=True"
dotnet test --project tests/ServerManager.Web.TestsDerleme uyarıları hata olarak ele alınır (Directory.Build.props → TreatWarningsAsErrors).
GitHub Actions iş akışı .github/workflows/ci.yml her branch'e yapılan push'ta ve her pull request'te çalışır; aynı branch/PR için yeni koşu başlarsa eskisi iptal edilir.
| İş | Ne yapar |
|---|---|
build-test |
global.json'daki SDK ile dotnet restore + dotnet build -c Release (uyarılar hata), SQL Server 2022 servis konteyneriyle dotnet test --solution ServerManager.slnx (web entegrasyon testleri dahil; SM_TEST_SQL koşuya özel üretilen parolayla ayarlanır, secret gerekmez). TRX sonuçları test-results artifact'ı olarak yüklenir. Son adımda dotnet list package --vulnerable --include-transitive bir paket bulursa iş başarısız olur. |
frontend |
.nvmrc'deki Node sürümüyle npm ci, npm run build:vendor ve npm run build:css; ardından src/ServerManager.Web/wwwroot ve src/Plugins/*/Content altında git diff boş değilse (derlenmiş CSS/vendor dosyaları commit edilmemişse) başarısız olur. Stil değiştirdiyseniz yerelde npm run build çalıştırıp çıktıyı commit edin. |
docker |
Kök Dockerfile'ı buildx ile derler (push yok, GitHub Actions önbelleği). |
e2e |
Uçtan uca testler (aşağıda). Yavaş ve privileged konteyner gerektirdiği için PR'larda çalışmaz; elle (Actions → CI → Run workflow), her gece (02:30 UTC) ve main'e push'ta çalışır. |
Bağımlılık güncellemeleri .github/dependabot.yml ile haftalık (pazartesi) ve gruplanmış olarak açılır: NuGet, npm (src/ServerManager.Web), GitHub Actions ve Docker imajları (kök Dockerfile, docker/e2e-ubuntu, docker/ssh-docker-test).
tests/ServerManager.E2E.Tests uygulamayı WebApplicationFactory<Program> ile Production ortamında ve geçici bir veritabanıyla (SmE2E_<guid>, sonda silinir) açar; gerçek akışları HTTP yerine uygulama servisleri üzerinden, gerçek bir SSH sunucusuna karşı çalıştırır:
| Akış | Kapsam |
|---|---|
| Sunucu ekleme | Kayıt → bağlantı testi → host key'in ilk testte sabitlenmesi → ikinci testte aynı anahtar; kayıtlı anahtar bozulunca bağlantının reddedilmesi (FingerprintMismatch); yanlış parolada anahtarın sabitlenmemesi; NOPASSWD sudo kullanıcısıyla Docker genel bakışı |
| Docker | Genel bakış (sürüm, CPU, bellek, container/imaj sayıları) ve container listesi |
| Servisler | Redis ve PostgreSQL kurulumu → healthy → panelde saklanan parolayla bağlantı (redis-cli PING / psql sorgusu) → çalışma logları → (PostgreSQL) yerel depolamaya yedek işi + manuel yedek → indirme akışı boş değil → verisiyle kaldırma (container ve volume gerçekten silinmiş mi) |
| Temizlik | Durmuş bir container'ın taramada bulunması; önizlemenin (dry run) hiçbir şey silmemesi |
| Kaynak kullanımı | Anlık görüntünün ayrıştırılması (çekirdek, yük, bellek yüzdesi 0–100, süreç listesi, container'lar) ve disk taraması |
| Deployment | Sunucuda git init --bare ile açılan depoya küçük bir Dockerfile uygulaması push edilir; proje file:// depo adresiyle (doğrulayıcı file://'ı kabul eder) oluşturulur, dallar git ls-remote ile okunur, deploy edilir, uygulama HTTP'den yanıt verir; proje "sunucudan da sil" ile kaldırılır |
Her test kendi oluşturduğu kayıtları ve sunucudaki container/volume/klasörleri sonunda siler. Ortam değişkenleri tanımlı değilse testler atlanır (başarısız sayılmaz):
| Değişken | Açıklama |
|---|---|
SM_TEST_SQL |
Veritabanı adı içermeyen SQL Server bağlantı dizesi |
SM_E2E_SSH_HOST / SM_E2E_SSH_PORT |
E2E sunucusu (ör. 127.0.0.1 / 2224) |
SM_E2E_SSH_USER / SM_E2E_SSH_PASSWORD |
Parolalı sudo kullanıcısı (smtest) ve parolası (.env → E2E_SSH_PASSWORD) |
SM_E2E_SSH_NOPASSWD_USER |
İsteğe bağlı; NOPASSWD sudo kullanıcısı (smnopw), aynı parola |
E2E sunucusu docker/e2e-ubuntu imajıdır: Ubuntu 24.04, openssh-server, sudo, Docker CE + compose eklentisi (privileged konteynerde Docker-in-Docker), git, curl, iptables, python3. smtest sudo grubunda (parolalı), smnopw NOPASSWD sudo; ikisi de docker grubunda. systemd PID 1 olarak çalışmaz: systemctl ve journald yoktur (journal temizliği ve Linux servis yönetimi bu ortamda kullanılamaz; testler bunlara bağlı değildir). Çekirdekte nftables yoksa .env'de E2E_IPTABLES_LEGACY=1 verilebilir.
# .env: E2E_SSH_PASSWORD (ve isteğe bağlı E2E_SSH_PORT=2224)
docker compose up -d db
docker compose -p sm-e2e --profile e2e up -d --build --wait sm-e2e-ubuntu
export SM_TEST_SQL="Server=127.0.0.1,14340;User Id=sa;Password=<MSSQL_SA_PASSWORD>;TrustServerCertificate=True"
export SM_E2E_SSH_HOST=127.0.0.1 SM_E2E_SSH_PORT=2224 SM_E2E_SSH_USER=smtest SM_E2E_SSH_PASSWORD=<E2E_SSH_PASSWORD>
export SM_E2E_SSH_NOPASSWD_USER=smnopw
dotnet test --project tests/ServerManager.E2E.Tests
# Bitince E2E konteynerini, ağını ve Docker-in-Docker volume'unu kaldırın:
docker compose -p sm-e2e --profile e2e down -v-p sm-e2e ayrı bir compose projesi adı verir; down -v yalnızca bu projedeki kaynakları siler, varsayılan projedeki veritabanı (server-manager-db) ve diğer test konteynerleri etkilenmez. İlk koşuda Redis/PostgreSQL/busybox imajları E2E sunucusunun içine indirildiği için birkaç dakika sürebilir; sonraki koşular (konteyner silinmedikçe) birkaç on saniyedir.
| Rol | İzinler |
|---|---|
| SuperAdmin | Tümü (eklenti yönetimi plugin.manage yalnızca SuperAdmin'dedir) |
| Admin | Dashboard, sunucu görüntüleme/ekleme/düzenleme/silme/bağlantı testi, tüm Docker, terminal, dosya ve deployment izinleri, sistem bilgisi görüntüleme/yönetim, sunucu temizliği, alarm görüntüleme/üstlenme/yönetim, yedekleme, güvenlik merkezi, audit log görüntüleme/dışa aktarma, toplu komut görüntüleme/çalıştırma, şablon yönetimi, bulut sağlayıcı görüntüleme/yönetim/sunucu oluşturma, ayarlar |
| Operator | Dashboard, sunucu görüntüleme, bağlantı testi, Docker görüntüleme/başlatma/durdurma/yeniden başlatma/terminal, sunucu terminali, sistem bilgisi görüntüleme/yönetim, sunucu temizliği, dosya görüntüleme/oluşturma/düzenleme/yükleme/indirme, deployment görüntüleme/çalıştırma, alarm görüntüleme/üstlenme, yedek görüntüleme/çalıştırma/indirme, güvenlik görüntüleme/tarama, toplu komut geçmişi görüntüleme, bulut sağlayıcı görüntüleme |
| Developer | Dashboard, sunucu görüntüleme, sistem bilgisi görüntüleme, Docker görüntüleme/yeniden başlatma, dosya görüntüleme/indirme, deployment görüntüleme/çalıştırma, alarm görüntüleme |
| Viewer | Dashboard, sunucu görüntüleme, Docker görüntüleme, deployment görüntüleme, alarm görüntüleme |
İzinler AspNetRoleClaims tablosunda permission claim'i olarak tutulur. Seeder yalnızca eksik izinleri ekler; elle eklenmiş izinleri kaldırmaz. Eklentiler kendi izinlerini ve varsayılan rol dağılımını getirir; bunlar eklenti kurulurken ve her açılışta eksikse eklenir (Dokploy için bkz. Dokploy).
Metrik ve grafik görüntüleme server.view, "Şimdi topla" (anlık metrik toplama) server.connect izni gerektirir.
Arka plan servisi (MetricsCollectorWorker) izlemesi açık ve host key fingerprint'i doğrulanmış her sunucuya belirlenen aralıkla SSH ile bağlanır, tek bir salt okunur komutla /proc, df, ps ve ip çıktısını okur. Sunucuya agent kurulmaz, dosya yazılmaz. Toplama sırasında fingerprint ilk kez kaydedilmez (TOFU yalnızca bağlantı testinde); farklı bir anahtar gelirse sunucu hemen Offline olur.
Anahtar (Monitoring:) |
Varsayılan | Açıklama |
|---|---|---|
Enabled |
true |
Toplayıcı ve bakım servislerini açar/kapatır |
IntervalSeconds |
30 |
Toplama aralığı (en az 10 sn) |
MaxConcurrency |
4 |
Aynı anda bağlanılan en fazla sunucu |
OfflineAfterFailures |
2 |
Kaç ardışık başarısız toplamadan sonra Offline sayılır |
CpuWarningPercent / CpuCriticalPercent |
80 / 95 |
CPU eşikleri |
MemoryWarningPercent / MemoryCriticalPercent |
85 / 95 |
RAM eşikleri |
DiskWarningPercent / DiskCriticalPercent |
80 / 90 |
En dolu disk bölümü eşikleri |
RawRetentionHours |
48 |
Ham ölçümlerin saklama süresi |
HourlyRetentionDays |
90 |
Saatlik özetlerin saklama süresi |
HealthCheckRetentionDays |
30 |
Sağlık kontrolü kayıtlarının saklama süresi |
MaintenanceIntervalMinutes |
10 |
Özetleme ve saklama işinin çalışma aralığı |
ResourceHistoryIntervalMinutes |
5 |
Kaynak geçmişi (container + process örnekleri) toplama aralığı; 0 kapatır. Ayrı worker'da çalışır |
ReclaimableScanIntervalHours |
6 |
"Temizlenebilir alan" alarmı için silmeyen temizlik taraması aralığı; 0 kapatır |
Durum kuralları:
- Eşik aşımı yoksa Healthy, uyarı eşiği aşılırsa Warning, kritik eşik aşılırsa Critical.
- Ardışık başarısız toplama sayısı
OfflineAfterFailuresdeğerine ulaşırsa Offline. - Bakımda durumundaki sunucunun durumu otomatik değiştirilmez; metrikleri toplanmaya devam eder.
- Her durum değişikliği audit log'a
server.status_changedolarak (kullanıcı: "Sistem") yazılır.
Saklama politikası (MetricsMaintenanceWorker):
- Tamamlanmış saatler önce
ServerMetricsHourlytablosuna özetlenir, ardından süresi dolan ham kayıtlar silinir. 1 saat – 24 saat grafikleri ham veriden, 7 gün ve 30 gün grafikleri saatlik özetten çizilir. - Silme yalnızca geçici tablolarda (
ServerMetrics,ServerMetricsHourly,ServerHealthChecks,UptimeCheckResults,NotificationDeliveries, kaynak geçmişi içinContainerMetricSamples,ContainerMetricsHourly,ProcessSnapshots) ve panelden saklama süresi verilen geçmiş tablolarında çalışır; bu liste dışında bir tablo, zaman sütunu veya gruplama sütunu istenirse işlem hata verip durur. Uptime ve bildirim kayıtlarının saklaması için bkz. Alarmlar ve izleme. - Her sunucunun en son ölçümü ve son 50 sağlık kontrolü süre dolsa bile korunur. Sunucu, kullanıcı ve audit kayıtlarına dokunulmaz.
- Silme 5000 satırlık partilerle yapılır; her çalışmanın özeti (özetlenen saat ve silinen kayıt sayıları) loglanır.
Canlı güncelleme /hubs/monitoring SignalR hub'ı üzerinden yapılır; sunucu detay sayfası yalnızca kendi sunucusunun, liste ve dashboard tüm sunucuların güncellemelerini alır. Hub server.view izni gerektirir.
Docker yönetimi agentless'tır: panel sunucuya SSH ile bağlanıp docker CLI komutlarını çalıştırır (Docker API'si dışarı açılmaz, sunucuya ek yazılım kurulmaz). Sunucunun host key fingerprint'i doğrulanmış olmalıdır. Sunucuda "Sudo kullanıcı" işaretliyse (SSH kullanıcısı docker grubunda değilse gerekir) komutlar sudo -S -p '' -- docker … ile çalıştırılır (parola tanımlı değilse sudo -n); sudo parolası şifreli saklanır, komut satırına yazılmaz, stdin'den gönderilir.
| İzin | Kapsam |
|---|---|
docker.view |
Genel bakış, container/image/volume/network listeleri, inspect, loglar |
docker.start |
Container başlatma / devam ettirme |
docker.stop |
Durdurma / duraklatma / kill |
docker.restart |
Yeniden başlatma |
docker.delete |
Container, image, volume, network silme ve prune |
docker.manage |
Image pull, volume/network oluşturma, container yeniden adlandırma |
docker.terminal |
Container terminali |
Anahtar (Docker:) |
Varsayılan | Açıklama |
|---|---|---|
CommandTimeoutSeconds |
60 |
Docker komutu zaman aşımı |
PullTimeoutSeconds |
600 |
Image pull zaman aşımı |
DefaultLogTail / MaxLogTail |
200 / 5000 |
Log satır sayısı varsayılanı ve üst sınırı |
Container terminali sunucu terminaliyle aynı altyapıyı ve Terminal: ayarlarını kullanır (bkz. Terminal).
Güvenlik kuralları:
- Container, image, volume ve network adları whitelist regex'iyle doğrulanır; tüm argümanlar shell quoting ile komuta eklenir.
- Stop, restart, kill, silme ve prune işlemleri onay ister; silme işlemlerinde kaynak adı yazılarak onaylanır. Her işlem audit log'a yazılır.
- Network oluştururken verilen subnet sunucunun kendi ağlarıyla veya panelin bağlandığı adresle çakışıyorsa işlem reddedilir (aksi halde yeni bridge SSH erişimini kesebilir).
- Docker aksiyonları kullanıcı başına dakikada 30 istekle sınırlandırılır.
- Container terminali
/hubs/terminalSignalR hub'ı üzerinden çalışır; oturum açılışı, kapanışı ve girilen komutlar kayda alınır, çıktı loglanmaz.
Geliştirmede gerçek sunucular yerine izole bir Docker-in-Docker container'ı kullanılır. Host Docker soketine bağlanmaz; içindeki container'lar host'tan tamamen ayrıdır.
# .env: SSH_TEST_PASSWORD ve (isteğe bağlı) SSH_TEST_PORT=2223
docker compose --profile test up -d --build ssh-docker-test- Adres:
127.0.0.1:2223(yalnızca localhost). deploykullanıcısıdockergrubundadır (sudo gerekmez).opskullanıcısı yalnızcasudo dockerçalıştırabilir (sudo akışını test etmek için; panelde "Sudo kullanıcı" işaretlenir ve sudo parolası olarak aynı parola girilir).- Parola yalnızca git'e eklenmeyen
.envdosyasındadır.
Sunucu detayındaki Terminal sekmesi tarayıcıdan SSH kabuğu açar: Browser → /hubs/terminal (SignalR WebSocket) → API → SSH. Sunucunun host key fingerprint'i doğrulanmış olmalıdır.
| İzin | Kapsam |
|---|---|
terminal.view |
Terminal sekmesi ve oturum geçmişi (kendi oturumları; audit.view izni olan tüm kullanıcıların oturumlarını görür) |
terminal.execute |
Sunucuda terminal oturumu açma, kendi komut geçmişi |
- Birden fazla sekme açılabilir; sekme listesi tarayıcı oturumunda (
sessionStorage) tutulur. Sayfa yenilenir veya bağlantı koparsa aynı SSH oturumuna yeniden bağlanılır ve son çıktı ekrana geri basılır. Oturum başka bir sekmede açıldığında eski sekme "Buraya al" ile geri alabilir. - Araç çubuğu: arama (Enter / Shift+Enter), kopyala (Ctrl+Shift+C), yapıştır (Ctrl+Shift+V), çıktıyı
.txtolarak indirme, tam ekran, komut geçmişi paneli (tıklanan komut Enter'a basılmadan satıra yazılır). - Boşta kalan oturum
IdleTimeoutMinutessonunda, tarayıcısı kopmuş oturumReconnectGraceSecondssonunda kapatılır. - Tehlikeli komutlar (
rm -r,mkfs,dd of=,shutdown/poweroff/halt,reboot,iptables/nft/ufw,userdel, disk aygıtına yazma, fork bomb) varsayılan olarak engellenmez; komut sunucuya gönderilmeden bekletilir ve kullanıcıdan ikinci onay istenir. Yanıt verilmezseConfirmationTimeoutSecondssonunda iptal edilir. ModOff/Warn/Confirm/Blockolarak ayarlanabilir, kurallarDangerousCommandsile değiştirilebilir ([{ "Pattern": "<regex>", "Description": "…" }]; boş liste varsayılan kuralları kullanır). - Oturum açılışı/kapanışı (kullanıcı, IP, süre) audit log'a, girilen komutlar
TerminalCommandstablosuna yazılır. Tehlikeli komutlar ayrıcaterminal.dangerous_commandolarak audit log'a düşer. Parola sorusu (sudo, ssh) ekrandayken ve tam ekran uygulamalarda (vim, less, top) yazılanlar komut olarak kaydedilmez; çıktı hiç loglanmaz. Ok tuşu, Tab veya geçmişten çağırma ile değişen satırlar "yaklaşık" olarak işaretlenir. - Terminal geçmişi otomatik silinmez. Uygulama kapanırken açık kalan oturum kayıtları silinmeden "kapandı" olarak işaretlenir.
Anahtar (Terminal:) |
Varsayılan | Açıklama |
|---|---|---|
IdleTimeoutMinutes |
30 |
Boşta kalan oturumun kapatılma süresi |
MaxSessionsPerUser |
5 |
Kullanıcı başına eş zamanlı oturum (sunucu + container) |
ReconnectGraceSeconds |
120 |
Tarayıcı bağlantısı koptuğunda oturumun açık tutulduğu süre |
OutputBufferKilobytes |
256 |
Yeniden bağlanınca geri basılan son çıktı |
ConfirmationTimeoutSeconds |
120 |
Onay bekleyen tehlikeli komutun iptal süresi |
DangerousCommandMode |
Confirm |
Off, Warn, Confirm veya Block |
DangerousCommands |
[] |
Özel kural listesi (boşsa varsayılan kurallar) |
Sunucu detayındaki Files sekmesi SFTP üzerinden çalışır (sunucuya ek yazılım kurulmaz). Kopyalama, klasör silme, chmod ve chown SSH komutuyla (cp -a, rm -rf, chmod, chown; argümanlar shell quoting ile) yapılır; sunucuda "Sudo kullanıcı" işaretliyse bu komutlar sudo ile çalışır.
| İzin | Kapsam |
|---|---|
file.view |
Klasör listeleme, dosyayı editörde salt okunur açma |
file.create |
Dosya / klasör oluşturma, kopyalama |
file.edit |
Dosya kaydetme, yeniden adlandırma / taşıma |
file.delete |
Dosya / klasör silme |
file.upload |
Dosya yükleme (düğme veya sürükle-bırak) |
file.download |
Dosya indirme |
file.permissions |
chmod / chown (owner/group/rwx tablosu veya gelişmiş modda ham değer, özyinelemeli seçenek) |
- Editör: CodeMirror 5; söz dizimi dosya adından seçilir (JSON, YAML, XML, HTML, CSS, JS, TS, C#, ENV, Markdown, Nginx, Dockerfile, Shell, SQL, Python, Go, TOML, PHP, Diff) ve elle değiştirilebilir. Ctrl/Cmd+S kaydeder, Ctrl+F arar, Alt+G satıra gider. Yalnızca UTF-8 metin dosyaları açılır; BOM ve satır sonu (LF/CRLF) korunur. Dosya siz düzenlerken sunucuda değiştiyse kaydetme çakışma uyarısı verir ve üzerine yazma onayı ister. Kaydedilmemiş değişiklik varken sayfadan çıkış onay ister.
- Dosya silme onay ister; klasör silme klasör adının birebir yazılmasıyla onaylanır. Var olan bir dosyanın üzerine yükleme ayrıca onay ister.
- Sistem klasörleri (
/,/etc,/usr,/varvb.,ProtectedPaths) panelden silinemez, taşınamaz ve izinleri değiştirilemez (içlerindeki dosyalar etkilenmez). - Tüm işlemler (görüntüleme, kaydetme, oluşturma, taşıma, kopyalama, silme, izin, yükleme, indirme) audit log'a yazılır. Dosya aksiyonları kullanıcı başına dakikada 60 istekle sınırlandırılır.
Anahtar (Files:) |
Varsayılan | Açıklama |
|---|---|---|
MaxEditKilobytes |
1024 |
Editörde açılabilecek en büyük dosya |
MaxUploadMegabytes |
100 |
Dosya başına yükleme sınırı |
OperationTimeoutSeconds |
60 |
SFTP işlemleri ile kopyalama, klasör silme ve izin komutlarının zaman aşımı |
ProtectedPaths |
[] |
Korunan yollar (boşsa varsayılan sistem klasörleri) |
Eklenti:
DevOps.Dokploy(src/Plugins/ServerManager.Plugin.DevOps.Dokploy). Açılışta otomatik kurulmaz; devre dışı bırakılırsa sekme, sayfalar, hub ve sağlık kontrolü durur, kayıtlar silinmez.
Sunucu detayındaki Dokploy sekmesi Dokploy kurulumunun durumunu gösterir; Dokploy kur sihirbazı resmi kurulum betiğiyle (https://dokploy.com/install.sh) kurulum yapar. Durum agentless olarak SSH ile (docker service ls, docker ps, sunucu içinden /api/health) okunur; panel adresi ve API anahtarı tanımlıysa panelden HTTP ile sağlık kontrolü ve proje özeti alınır.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
dokploy.view |
Dokploy sekmesi, durum, sağlık kontrolü, kurulum geçmişi ve kurulum çıktıları | SuperAdmin, Admin, Operator, Developer, Viewer |
dokploy.install |
Uyumluluk kontrolü ve kurulumu başlatma | SuperAdmin, Admin |
dokploy.manage |
Panel adresi ve API anahtarı ayarları | SuperAdmin, Admin |
Kurulum akışı:
- Ön kontroller: işletim sistemi (Ubuntu, Debian, Fedora, CentOS/RHEL dışı dağıtımlar uyarı), mimari, container içinde çalışma (engeller; Swarm container içinde çalışmaz), root veya tam sudo yetkisi, en az
MinMemoryMbRAM,RecommendedDiskGbaltı boş disk (uyarı), Docker ve Swarm durumu,RequiredPortsportlarının boş olması, betik adresine ve Docker Hub'a erişim,curlvarlığı. Engelleyen sorun varsa onay adımı açılmaz. - Onay: sunucu adı birebir yazılarak onaylanır; sürüm son kararlı, canary veya belirli bir etiket (
v0.25.3gibi) seçilebilir. - Betik sunucuya
/tmpaltına indirilir, yalnızca sahibi okuyabilir yapılır, SHA-256 özeti kurulum kaydına yazılır,sudoile (gerekirse) root olarak çalıştırılır ve işlem bitince silinir. - Çıktı
/hubs/dokploySignalR hub'ı üzerinden canlı akar. Kurulum arka planda sürer; sayfa kapanıp yeniden açıldığında çıktı baştan oynatılır, biten kurulumların çıktısı geçmişten "Görüntüle" ile açılır. Aynı sunucuda aynı anda tek kurulum çalışır. - Betik bittikten sonra Dokploy'un
/api/healthyanıtıStartupTimeoutSecondsboyunca beklenir; yanıt gelirse kurulum başarılı sayılır. - Kurulum başlangıcı (
dokploy.install_start) ve sonucu (dokploy.install_complete; başarılı/başarısız, betik SHA-256 özetiyle) audit log'a yazılır. Uygulama kurulum sırasında kapanırsa kayıt silinmez, "Kesildi" olarak işaretlenir.
Durum ve ayarlar:
- Durum: Çalışıyor, Sorunlu (eksik bileşen veya panelden erişilemiyor), Durdu, Kurulu değil. Arka plan servisi (
DokployHealthWorker) kayıtlı her kurulumuHealthCheckIntervalMinutesaralığıyla kontrol eder. - API anahtarı Dokploy'da Settings → Profile → API/CLI bölümünden oluşturulur; kaydetmeden önce panelde doğrulanır,
Security:MasterKeyile şifrelenerek saklanır ve hiçbir yerde gösterilmez. Proje özetinde yalnızca proje adı ve uygulama/compose/veritabanı sayıları okunur; ortam değişkenleri ve parolalar eşlenmez. - HTTP isteklerinde yönlendirme izlenmez (API anahtarı başlığı başka bir adrese taşınmasın diye); yanıt boyutu 4 MB ile sınırlıdır.
- Dokploy aksiyonları kullanıcı başına dakikada 20 istekle sınırlandırılır.
Anahtar (Dokploy:) |
Varsayılan | Açıklama |
|---|---|---|
InstallScriptUrl |
https://dokploy.com/install.sh |
Kurulum betiği |
ExpectedSha256 |
boş | Kurulum betiğinin beklenen SHA-256 özeti (hex). Doluysa indirilen betik bu özetle eşleşmezse kurulum çalıştırılmaz; boşsa özet kontrolü yapılmaz |
RegistryCheckUrl |
https://registry-1.docker.io/v2/ |
İnternet kontrolünde erişilmesi gereken registry |
Port |
3000 |
Dokploy panel portu |
RequiredPorts |
[80, 443, 3000] |
Boş olması gereken portlar (appsettings içinde değiştirilecekse ortam değişkeniyle verin; liste varsayılana eklenir) |
MinMemoryMb |
2048 |
En az RAM |
RecommendedDiskGb |
30 |
Altı uyarı olarak gösterilen boş disk |
CommandTimeoutSeconds |
30 |
Kontrol komutlarının zaman aşımı |
InstallTimeoutMinutes |
30 |
Kurulum betiğinin zaman aşımı |
StartupTimeoutSeconds |
180 |
Kurulumdan sonra sağlık yanıtı için bekleme süresi |
HttpTimeoutSeconds |
10 |
Dokploy API isteklerinin zaman aşımı |
HealthCheckIntervalMinutes |
5 |
Periyodik sağlık kontrolü aralığı (0 kapatır) |
MaxStoredOutputKilobytes |
512 |
Kurulum kaydında saklanan çıktı (son kısım) |
InstallationHistoryCount |
10 |
Durum sayfasında gösterilen kurulum sayısı |
Eklenti:
DevOps.Dokku(src/Plugins/ServerManager.Plugin.DevOps.Dokku). Açılışta otomatik kurulmaz. Devre dışı bırakılırsa sunucu sekmesi kapanır; sunucudaki Dokku kurulumu silinmez.
Sunucu detayındaki Dokku sekmesi sürümü ve uygulamaları SSH ile okur (dokku version, apps:list, ps:report, domains:report). Kurulu değilse Dokku kur resmi bootstrap betiğini (https://dokku.com/install/<sürüm>/bootstrap.sh) sudo ile çalıştırır; çıktı sayfada yenilenir, uygulama yeniden başlasa bile sunucudaki betik kendi başına sürebilir. Uygulama satırındaki Yeniden başlat dokku ps:restart çağırır.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
dokku.view |
Sekme, sürüm ve uygulama listesi | SuperAdmin, Admin, Operator, Developer, Viewer |
dokku.manage |
Kurulum ve uygulama yeniden başlatma | SuperAdmin, Admin |
- Komutlar sudo ile çalışır. Uygulama adı ve sürüm kabuğa yazılmadan önce doğrulanır (
v1.2.3,my-app). - Kurulum kaydı veritabanına yazılmaz; süren çıktı yalnızca o süreçte tutulur. Sonuç audit log'a
dokku.install_startvedokku.install_completeolarak yazılır. Yeniden başlatmadokku.app_restartolur. - İşlemler kullanıcı başına dakikada 20 istekle sınırlandırılır.
Anahtar (Dokku:) |
Varsayılan | Açıklama |
|---|---|---|
Version |
v0.38.31 |
Kurulacak Dokku etiketi |
CommandTimeoutSeconds |
60 |
Durum ve yeniden başlatma zaman aşımı |
InstallTimeoutMinutes |
20 |
Bootstrap betiğinin zaman aşımı |
Git deposundaki bir uygulamayı kayıtlı bir sunucuya SSH üzerinden (agentless) dağıtır. Menüde Projeler ve Deployment'lar sayfaları, sunucu detayında Deployments sekmesi bulunur. Bu özellik çekirdeğin parçasıdır; Dokploy gibi üçüncü taraf araçlar eklenti olarak ayrı kalır.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
deployment.view |
Projeler, deployment geçmişi, canlı çıktı ve log indirme | SuperAdmin, Admin, Operator, Developer, Viewer |
deployment.manage |
Proje ekleme, düzenleme, silme (Git erişim anahtarı, ortam değişkenleri, build/deploy komutları dahil) | SuperAdmin, Admin |
deployment.execute |
Deployment başlatma, iptal etme, yeniden dağıtma, depo/dal kontrolü | SuperAdmin, Admin, Operator, Developer |
deployment.managefiilen sunucuda komut çalıştırma yetkisidir: "Komutlar" build türündeki komutlar ve Dockerfile/compose içeriği hedef sunucuda çalışır. Bu izni yalnızca sunucuya terminal erişimi verilebilecek kişilere verin.
Proje ayarları:
- Git kaynağı: iki yol vardır.
- Depo adresiyle (elle): sağlayıcı (GitHub, GitLab, Bitbucket, kendi sunucusu),
https://veya SSH depo adresi, dal, isteğe bağlı kullanıcı adı ve erişim anahtarı (token). SSH adreslerinde hedef sunucudaki kullanıcının anahtarı depoda yetkili olmalıdır. - Bağlantıyla: etkin bir Git entegrasyon eklentisinin (ör. GitHub App) bağlantılarından biri seçilir, bağlantının erişebildiği depolar listelenir. Erişim anahtarı girilmez ve saklanmaz; her depo kontrolü ve deployment için bağlantıdan yalnızca o depoya okuma yetkili kısa ömürlü bir anahtar alınır. Projede yalnızca eklenti adı, bağlantı kimliği ve depo adı (
sahip/ad) tutulur.
- Depo adresiyle (elle): sağlayıcı (GitHub, GitLab, Bitbucket, kendi sunucusu),
- Dal seçimi: "Depodaki dalları getir" düğmesi dalları listeler. Bağlantılı projelerde dallar sağlayıcı API'sinden, elle girilen adreslerde hedef sunucudan
git ls-remote --headsile okunur (bu yüzden önce sunucu seçilmelidir). Listeden seçilebilir veya dal adı elle yazılabilir. - Kayıtlı erişim anahtarı: düzenlemede boş bırakılırsa korunur. Depo adresinin sunucusu (host) değişirse kayıtlı anahtar yeni adrese gönderilmez; yeni anahtar girilmeli veya "kaldır" seçilmelidir. Bağlantılı kaynağa geçildiğinde kayıtlı anahtar silinir.
- Build türü: Docker Compose (compose dosyası; proje adı
sm-<proje>), Dockerfile (imagesm-<proje>:<kısa-sha>ve:latest, tek containersm-<proje>,--restart unless-stopped,sm.projectetiketi, isteğe bağlı port eşlemeleri) veya Komutlar (proje klasöründeshile çalışan build ve deploy komutları; isteğe bağlı sudo). - Sunucudaki klasör: mutlak yol; sistem klasörleri (
/etc,/usr,/bin,/rootvb.) reddedilir. SSH kullanıcısının yazabildiği bir yer olmalıdır. - Ortam değişkenleri: oluşturma formunda isteğe bağlı başlangıç
.enviçeriği; sonrası proje sayfasındaki Ortam değişkenleri sekmesinden yönetilir (bkz. aşağıda). DeğerlerSecurity:MasterKeyile şifrelenir.
Deployment akışı (aşamalar ekranda adım adım görünür):
- Hazırlık: proje ve sunucu bağlantısı okunur, gizli bilgiler çözülür.
- Kaynak kod: klasör yoksa oluşturulur ve
git inityapılır; dal (veya belirli commit)--depth 1ile çekilir, çalışma ağacı o commit'e alınır. Alınan commit hemen kayda yazılır; iptal edilen veya başarısız olan deployment da hangi commit'te olduğunu bilir ve yeniden dağıtılabilir..envtanımlıysa yazılır. - Build: türe göre
docker compose build,docker buildveya build komutu. - Deploy:
docker compose up -d --remove-orphans, eski container kaldırılıpdocker run, veya deploy komutu.
Çıktı /hubs/deployments SignalR hub'ı üzerinden canlı akar; sayfa yeniden açıldığında o ana kadarki çıktı baştan oynatılır. Deployment arka planda sürer, sayfayı kapatmak onu durdurmaz. Aynı projede aynı anda tek deployment çalışır. Liste sayfaları çalışan deployment varken 5 saniyede bir kendini yeniler. Log, deployment sayfasından düz metin olarak indirilebilir.
- Belirli commit: Deploy formuna tam SHA girilebilir; geçmişteki bir deployment "Yeniden deploy" ile aynı commit'e, projenin güncel ayarlarıyla dağıtılır. SHA ile fetch, Git sunucusunun buna izin vermesini gerektirir (GitHub/GitLab izin verir; kendi sunucunuzda
uploadpack.allowReachableSHA1InWant). - İptal: çalışan komut durdurulur, kayıt "İptal edildi" ve iptal eden kullanıcıyla saklanır. Sunucuda o ana kadar yapılanlar (çekilen kod, build edilen image) geri alınmaz. Uygulama kapanırken süren deployment "Kesildi" olarak işaretlenir; açılışta yarım kalan kayıtlar da "Kesildi"ye çekilir.
- Audit:
project.create/update/delete,deployment.start,deployment.rollback,deployment.restart,deployment.complete(sonuç ve commit ile),deployment.cancel,project.env_update/env_reveal/env_export,project.webhook_update,project.service_link/service_unlink.
Güvenlik notları:
- Erişim anahtarı komut satırına, loglara veya sunucuda diske yazılmaz; stdin ile verilir ve yalnızca o komut süresince geçici bir credential helper ile kullanılır. Depo yapılandırmasına kaydedilmez.
.envstdin ileumask 077altında yazılır (yalnızca SSH kullanıcısı okuyabilir) ve yalnızca projede ortam değişkeni tanımlıysa yazılır; kayıtlı değişkenler kaldırılırsa sunucudaki mevcut dosyaya dokunulmaz.- Hiçbir adım dosya silmez (
git clean/rm -rfyok). Dolu ve git deposu olmayan bir klasör reddedilir; mevcut bir git deposunda çalışma ağacı çekilen commit'e zorla alınır, izlenmeyen dosyalar kalır. - Submodule'ler çekilmez. Git komutları SSH kullanıcısıyla, Docker komutları sunucunun sudo ayarıyla çalışır.
- Proje silme kaydı listeden gizler (soft delete); sunucudaki dosyalara, container'lara ve deployment geçmişine dokunulmaz.
- Bağlantılı projelerde bağlantıyı sağlayan eklenti devre dışıysa proje detayında "(eklenti etkin değil)" görünür, depo kontrolü ve deployment açık bir hatayla durur; proje kaydı korunur.
Anahtar (Deployment:) |
Varsayılan | Açıklama |
|---|---|---|
GitTimeoutSeconds |
300 |
Depo kontrolü, fetch ve checkout zaman aşımı |
BuildTimeoutMinutes |
30 |
Build adımının zaman aşımı |
DeployTimeoutMinutes |
10 |
Deploy adımının zaman aşımı |
MaxStoredLogKilobytes |
1024 |
Deployment kaydında saklanan log (son kısım; çalışırken 10 saniyede bir kaydedilir) |
AcmeEmail |
boş | Let's Encrypt (ACME) hesap e-postası. Yapılandırılmalıdır: boşsa vekil (Traefik) kurulumu "Let's Encrypt e-postası yapılandırılmamış (Deployment:AcmeEmail)" hatasıyla durur |
KeepImageCount |
5 |
Dockerfile projelerinde başarılı deploy sonrası saklanan commit imajı (sm-<proje>:<kısa-sha>) sayısı; eskiler silinir, latest ve çalışan imaj korunur. 0 silmeyi kapatır |
PublicBaseUrl |
boş | Webhook adresinde kullanılacak panel adresi (ör. https://panel.ornek.com); boşsa isteğin adresi kullanılır |
- Ortam değişkenleri sekmesi: anahtar/değer tablosu; tek değişken ekleme, değer değiştirme, silme,
.envyapıştırarak veya dosya seçerek içe aktarma (yalnızca yenileri ekle / var olanları değiştir / tümünü değiştir) ve.envolarak indirme. Kayıt tek şifreli.envmetnidir; her değişiklikte çözülüp satır bazında düzenlenir (yorumlar ve sıra korunur). Değerler maskelidir; "Göster" ve ".env indir"deployment.secretsyetkisi ister ve audit'e yazılır. Yazmadeployment.manageister. Değişiklikler sonraki deploy'da veya Uygula / Yeniden başlat ile sunucuya yazılır. - Compose ve .env: compose
.env'yi yalnızca${DEĞİŞKEN}yerleştirmesi için okur. Panel bu yüzdendocker compose config --servicesile servisleri okur vesm-proxy.override.ymliçinde tüm servislereenv_file: [<klasör>/.env]ekler (servisin kendienvironment:değerleri önceliklidir). Projeye bağlı servis varsa tüm servislersm-servicesağına da alınır (bkz. Projeye bağla). Override ortam değişkeni kaydı, domain veya bağlı servis olduğunda yazılır, hiçbiri yoksa silinir. - Uygula / Yeniden başlat: kaynak kod çekilmeden ve build yapılmadan
.envve override yeniden yazılır; Compose'daup -d --no-build --remove-orphans(yapılandırması değişen servisler yeniden oluşturulur), Dockerfile'da containerlatestimajıyla yeniden oluşturulur. Deployment kaydı "Yeniden başlatma" türüyle, canlı logla açılır; süren deployment varsa başlamaz.deployment.executeister. - Çalışma logları sekmesi: projenin container'ları (Compose:
com.docker.compose.project=sm-<proje>, Dockerfile:sm-<proje>) listelenir; seçilen container için son N satır, arama, "yalnızca hata/uyarı" (error, fatal, panic, exception, warn), stderr filtresi, canlı takip ve indirme.deployment.viewvedocker.viewister. - Push ile otomatik deploy: proje başına açılır; ilk açılışta 64 karakterlik gizli anahtar üretilir (şifreli saklanır, yalnızca üretildiğinde gösterilir, yenilenebilir). Adres
POST /api/webhooks/projects/{id}(anonim, IP başına dakikada 30 istek, gövde en fazla 5 MB). GitHubX-Hub-Signature-256(HMAC-SHA256, sabit zamanlı karşılaştırma) veya GitLabX-Gitlab-Tokendoğrulanır. Yalnızca proje dalına gelen push deploy edilir (push'taki commit); diğer olaylar ve dallar200ile yok sayılır, ping200, imza hatası401, kapalıysa403. Deploy başlarsa202. Süren deployment varsa (bu örnekte veya veritabanında) yeni deploy başlatılmaz; proje başına tek bir takip deploy'u kalıcı kuyruğa alınır (202;DeploymentProjects.PendingWebhook*) ve süren deployment bitince dalın son hali deploy edilir (art arda push'larda sonuncusu kaybolmaz). Kuyruk uygulama yeniden başlasa da korunur: açılışta yarım kalan deployment'lar "kesildi" yapıldıktan sonra kuyruk işlenir ve dakikada bir yoklanır. Başlatan "webhook" olarak kaydedilir; son teslimatın sonucu sekmede görünür. GitHub App eklentisi webhook kullanmaz; depo webhook'u proje başına ayrı tanımlanır. Kurulum: GitHub'da depo Settings → Webhooks → Add webhook: Payload URL sekmedeki adres, Content typeapplication/json, Secret paneldeki anahtar, "Just the push event". GitLab'da Settings → Webhooks: URL, "Secret token" ve "Push events" (isteğe bağlı dal filtresi). Panel ters vekil arkasındaysa adresin doğru üretilmesi içinDeployment:PublicBaseUrldoldurulmalıdır. - Geri dönüş: deployment geçmişinde, çalışan sürüm dışındaki başarılı deployment'larda Bu sürüme geri dön. Yeni kayıt "Geri dönüş" türüyle açılır. Dockerfile'da
sm-<proje>:<kısa-sha>imajı duruyorsa kaynak kod ve build atlanır, imajlatestolarak etiketlenip çalıştırılır; yoksa commit yeniden çekilip build edilir. Compose ve komut projelerinde commit çekilip build edilir. Ortam değişkenleri ve domainler projenin güncel ayarlarından gelir.
Docker Compose ve Dockerfile projelerine proje detayındaki Domain kartından alan adı bağlanır (Komutlar türündeki projelere domain bağlanamaz). Görüntüleme deployment.view, ekleme/düzenleme/silme, vekil kurulumu ve yönlendirmeyi yeniden uygulama deployment.manage ister; değiştiren işlemler kullanıcı başına dakikada 20 istekle sınırlıdır.
- Vekil (reverse proxy): projenin sunucusunda bir kez
sm-traefikcontainer'ı (traefik:v3.5,--restart unless-stopped, 80 ve 443 portları) vesm-proxyDocker ağı kurulur. Kurulumdan önce 80/443 portlarını başka bir sürecin dinleyip dinlemediği kontrol edilir; doluysa kurulum durur. Container zaten varsa yeniden oluşturulmaz, durmuşsa başlatılır. Let's Encrypt kayıtları/var/lib/sm-traefik/letsencrypt/acme.json(izin600), dinamik yapılandırma/var/lib/sm-traefik/dynamicaltında tutulur. - Domain kaydı: host (ör.
api.ornek.com), isteğe bağlı yol öneki (PathPrefix), container portu, Compose projelerinde servis adı ve TLS modu. Aynı sunucuda aynı host + yol iki kez kullanılamaz; bir projeye en fazla 20 domain eklenir. Silme host adının birebir yazılmasıyla onaylanır. - TLS modları:
- Let's Encrypt: Traefik HTTP-01 doğrulamasıyla sertifika alır; DNS kaydı sunucuya işaret etmeli ve 80 portu dışarıdan erişilebilir olmalıdır. Hesap e-postası
Deployment:AcmeEmail'dir. - Cloudflare: TLS Cloudflare'de biter; sunucu yalnızca 80 portundan yanıt verir.
- Özel sertifika: yapıştırılan PEM sertifika ve özel anahtar
Security:MasterKeyile şifrelenerek saklanır, komut satırına yazılmaz ve sunucudaki dinamik yapılandırma klasörüne stdin ile gönderilir.
- Let's Encrypt: Traefik HTTP-01 doğrulamasıyla sertifika alır; DNS kaydı sunucuya işaret etmeli ve 80 portu dışarıdan erişilebilir olmalıdır. Hesap e-postası
- Uygulama: Compose dosyası değiştirilmez; yanına
sm-proxy.override.ymlyazılır vedocker compose -f <compose> -f sm-proxy.override.ymlile kullanılır. Dockerfile projesinde container--network sm-proxyve Traefik etiketleriyle başlatılır. Yönlendirme ilk başarılı deployment'tan sonra uygulanır; domain eklendiğinde veya değiştiğinde karttan yeniden uygulanabilir. Domain'i olmayan proje eskisi gibi yalnızca port eşlemesi veya compose ile çalışır. - Proje silme: domain kayıtları yumuşak silinir ve projenin yönlendirmesi kaldırılmaya çalışılır;
sm-traefikdurdurulmaz. - Audit:
deployment_proxy.install,deployment_domain.create,deployment_domain.update,deployment_domain.delete.
Sunuculara tek tıkla Docker tabanlı veritabanı ve uygulama servisleri kurar. Menüde Servisler sayfası, sunucu detayında Servisler sekmesi bulunur (systemd/OpenRC servisleri ayrı olarak Sistem Servisleri adıyla durur; adresleri değişmedi). Container adı sm-svc-<kısa-ad>, varsayılan veri volume'u sm-svc-<kısa-ad>-data'dır; kısa ad servis adından üretilir ve sonradan değişmez.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
services.view |
Servis listesi, detay, loglar, işlem geçmişi | SuperAdmin, Admin, Operator, Developer, Viewer |
services.manage |
Kurma, ayarları değiştirip yeniden oluşturma, sürüm yükseltme, başlatma/durdurma, kaldırma | SuperAdmin, Admin, Operator |
services.console |
Servis konsolu (psql, mysql, redis-cli …) | SuperAdmin, Admin, Operator |
services.reveal_secrets |
Parola ve parolalı bağlantı adreslerini görme | SuperAdmin, Admin |
Şablonlar: veritabanları PostgreSQL (postgres), MySQL (mysql), MariaDB (mariadb), Redis (redis), MongoDB (mongo), SQL Server (mcr.microsoft.com/mssql/server, varsayılan Developer sürümü); uygulamalar MinIO, RabbitMQ, Adminer, pgAdmin, Uptime Kuma ve n8n. Her şablonun sürüm listesi, portları, veri klasörü, kimlik bilgisi → ortam değişkeni eşlemesi, sağlık ve bağlantı testi komutu, konsol komutu ve bağlantı adresi biçimi vardır.
- Kurulum sihirbazı: şablon kartı → sunucu (Docker ve mimari ön kontrolü), ad, sürüm (listeden veya Docker Hub etiketi), veri saklama (Docker volume veya sunucu klasörü), kimlik bilgileri (parola otomatik üretilir), ağ/port, kaynak sınırları ve ek ortam değişkenleri. Kurulum arka planda sürer; adımlar (Docker, port kontrolü, imaj, ağ ve volume, container, sağlık, bağlantı testi)
/hubs/servicesile canlı izlenir, sayfa kapansa da devam eder. - Portlar ve "Dışarıya aç": yayınlanan portlar varsayılan olarak
127.0.0.1'e bağlanır (yalnızca sunucudan veya SSH tüneliyle erişilir). "Dışarıya aç" seçilirse0.0.0.0'a bağlanır. 1024 altı sunucu portlarıManagedServices:AllowPrivilegedHostPortsaçık değilse reddedilir; kurulumdan önce portun boş olduğu kontrol edilir. Yayınlanmayan portlara yalnızca aynı Docker ağındaki container'lar erişir. - IP izin listesi: Docker'ın yayınladığı portlar UFW/INPUT kurallarını atlar. Dışarıya açık portlar için izinli IP/CIDR listesi verilirse kurallar
DOCKER-USERzincirine yazılır (her port için DROP, izinli kaynaklar için üstte RETURN; NAT öncesi hedef porta göre--ctstate DNAT --ctorigdstportile eşleşir, iç ağ trafiği etkilenmez). Kurallar servis etiketiyle (sm-svc-<kısa-ad>) yönetilir, idempotenttir ve yeniden başlatmadasm-services-firewall.servicesystemd birimiyle geri yüklenir. Kurallar kaybolursa servis sayfası uyarır ve "Kuralları yeniden uygula" sunar. Liste boş ve port dışarıya açıksa sayfada uyarı gösterilir. - Ağ: her servis panel ağı
sm-services'e katılır (yoksa oluşturulur); istenirsesm-proxyve sunucudaki başka mevcut ağlara da eklenir. Aynı ağdaki uygulamalar servise container adıyla (sm-svc-db:5432) bağlanır. - Volume: Docker volume veya sunucu klasörü. Veri yeniden oluşturma ve sürüm yükseltmede korunur.
- Ortam değişkenleri: kimlik bilgileri ve ek değişkenler
Security:MasterKeyile şifreli saklanır; sunucuda/var/lib/sm-services/<kısa-ad>/.envdosyasına stdin ile (izin600) yazılır, komut satırına ve loglara girmez (log çıktısı maskelenir). - Detay sayfası: Genel (container durumu, sağlık, ağlar, iç/dış adres, kullanıcı, maskeli bağlantı adresleri; "Parolayı göster"
services.reveal_secretsister ve audit'e yazılır), Loglar (son N satır, arama, hata/uyarı ve stderr filtresi, canlı takip, indirme), İşlemler (kurulum, yeniden oluşturma, yükseltme, kaldırma geçmişi ve logları), Ayarlar (port, IP listesi, ağ, kaynak sınırları, ek değişkenler; kaydedince container yeniden oluşturulur, volume korunur), Sürüm (yeni imaj önce indirilir, indirme başarısızsa mevcut container'a dokunulmaz; ana sürüm değişikliği için ayrıca onay istenir), Konsol (şablonun istemcisi container içinde açılır; parola container ortamından okunur, açılış/kapanış ve komutlar kayda alınır), Tehlikeli bölge (servis adını yazarak kaldırma; "Veriyi de sil" volume'u veya panelin oluşturduğu sunucu klasörünü siler, geri alınamaz). - Entegrasyon:
IManagedServiceService.GetConnectionInfoAsync(serviceId)iç ağ adresini (Host = container adı, Port), kimlik bilgilerini, bağlantı adresini, önerilen ortam değişkenlerini (DATABASE_URL,REDIS_URL,ConnectionStrings__Default…) ve ağları döner; parola içerir, yalnızca sunucu tarafında kullanılmalıdır. - Audit:
managed_service.create/recreate/upgrade/remove/operation_complete/reveal_secrets/console_open/console_close/container_action/firewall_apply. Değiştiren işlemler kullanıcı başına dakikada 20 istekle sınırlıdır.
Servis sayfasının Genel sekmesindeki Projeye bağla, servisi aynı sunucudaki Docker Compose veya Dockerfile projesine bağlar (komutla dağıtılan projelere bağlanmaz). services.manage ve deployment.manage ister; "Hemen uygula" ayrıca deployment.execute ister.
- Proje seçilir; servisin önerdiği ortam değişkenleri parolası
****ile gizlenmiş önizlemeyle listelenir. Her satır seçilebilir ve anahtar adı değiştirilebilir (ör.DATABASE_URL→APP_DB_URL); projede zaten olan anahtarlar işaretlenir. - "Projede zaten tanımlı anahtarların değerini değiştir" kapalıysa var olan anahtarlara dokunulmaz. Değerler sunucuda servisin kayıtlı bilgisinden yazılır; parola tarayıcıya hiç gönderilmez.
- Bağ kaydedilir (
ProjectServiceLinks, proje + servis benzersiz) ve hangi anahtarların yazıldığı saklanır. "Hemen uygula" seçilirse proje build edilmeden yeniden başlatılır.
Bağlı servisi olan projede container'lar sm-services ağına da katılır: Compose projesinde sm-proxy.override.yml tüm servislere networks: [default, (domain varsa sm-proxy), sm-services] ve dış ağ tanımı ekler; Dockerfile projesinde container domain yoksa --network sm-services ile başlatılır, domain varsa sm-proxy ile başlatılıp docker network connect sm-services ile eklenir. Ağ yoksa (docker network inspect … || docker network create) oluşturulur. Değişiklik bir sonraki deploy, "Uygula / Yeniden başlat" veya yönlendirme uygulamasında geçerli olur.
Proje sayfasının Ortam değişkenleri sekmesinde Bağlı servisler listelenir. Bağı kaldır ortam değişkenlerini varsayılan olarak korur; onay penceresindeki kutu işaretlenirse yalnızca bağlarken yazılan anahtarlar silinir. Audit: project.service_link, project.service_unlink (yalnızca anahtar adları; değer yok). Kaldırılan servisin veya silinen projenin bağları görünmez ve projeyi ağa almaz.
Veritabanı şablonlarında (PostgreSQL, MySQL, MariaDB, MongoDB, Redis, SQL Server) kurulum sihirbazında Otomatik yedek bölümü vardır (backup.manage yoksa gizlidir): depolama hedefi, zamanlama (her gün belirli saatte veya N saatte bir), saklanacak son yedek sayısı ve isteğe bağlı şifreleme parolası (en az 12 karakter). SQL Server'da yedeklenecek veritabanı adı da istenir. Ayarlar kurulumdan önce doğrulanır; yedekleme işi yalnızca kurulum başarıyla bittikten sonra, kurulumu başlatan kullanıcı adına IBackupJobService.CreateForContainerDatabaseAsync ile açılır ve sonuç canlı kurulum çıktısına yazılır (başarısızsa kurulum etkilenmez). İstek kurulum kaydında şifreli (parola dahil) saklanır (ManagedServiceOperations.PendingAutoBackup); panel kurulum sırasında yeniden başlarsa, kurulum başarılı bitmişse iş açılışta oluşturulur, başarısız/kesilmişse istek silinir.
| Şablon | Motor | Yedek kullanıcısı | Veritabanı |
|---|---|---|---|
| postgres | PostgreSQL | servis kullanıcısı | servis veritabanı |
| mysql, mariadb | MySQL | root (parolası servis parolasıyla aynı) |
servis veritabanı |
| mongodb | MongoDB | servis yönetici kullanıcısı (authSource=admin) |
tümü |
| redis | Redis | — (parola) | — |
| mssql | SQL Server | sa |
formda girilen |
Mevcut veritabanı servislerinde Genel sekmesindeki Yedekleme kartı servisi yedekleyen işleri (aynı sunucu + container adı) listeler ve Yedek işi oluştur ile aynı formu açar. İş adı <servis> (sm-svc-<kısa-ad>) biçimindedir; Yedekleme → İşler sayfasında düzenlenebilir.
Anahtar (ManagedServices:) |
Varsayılan | Açıklama |
|---|---|---|
PullTimeoutMinutes |
20 |
İmaj indirme (docker pull) üst sınırı |
CommandTimeoutSeconds |
120 |
Tek docker komutunun (create, start, network …) üst sınırı |
HealthTimeoutSeconds |
180 |
Container'ın sağlıklı olmasının beklendiği en kısa süre (şablon daha uzununu isteyebilir, ör. SQL Server) |
MaxStoredLogKilobytes |
256 |
İşlem başına saklanan en fazla log |
AllowPrivilegedHostPorts |
false |
1024 altındaki sunucu portlarına izin verir |
DefaultLogTail |
200 |
Loglar sekmesinde varsayılan satır sayısı |
Menüde Alarmlar (açık ve geçmiş alarmlar, kurallar, bildirim kanalları), Uptime ve SSL Sertifikaları sayfaları bulunur. Üst çubuktaki zil açık alarm sayısını gösterir.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
alert.view |
Alarmlar, uptime kontrolleri ve SSL sertifikalarını görüntüleme; zil | SuperAdmin, Admin, Operator, Developer, Viewer |
alert.acknowledge |
Alarmı üstlenme (görüldü olarak işaretleme) | SuperAdmin, Admin, Operator |
alert.manage |
Kurallar, bildirim kanalları, uptime ve SSL kontrollerini ekleme, düzenleme, silme; kanal testi, "Şimdi kontrol et" | SuperAdmin, Admin |
Kurallar. Her kuralın türü, önem derecesi (Uyarı / Kritik), eşiği, süresi, isteğe bağlı sunucu kapsamı, bağlı kanalları, "düzelince bildir" seçeneği ve tekrar aralığı vardır. Türler: CPU, RAM, disk (en dolu bölüm), sunucu erişilemiyor, uptime kontrolü başarısız, SSL sertifikası süresi, deployment başarısız, yedekleme başarısız, kritik güvenlik bulgusu, servis çalışmıyor (yönetilen servisin container'ı durmuş/sağlıksız; servis başına veya sunucudaki tüm servisler; süre kadar sürmeli, önerilen 5 dk), container yeniden başlama döngüsü (pencere içinde RestartCount artışı ≥ N; önerilen 30 dk içinde 3) ve temizlenebilir alan (otomatik temizlik taramasında silinebilir alan ≥ eşik GB; önerilen 10 GB). Servis türleri kaynak geçmişi örneklerine dayanır; örnek yoksa veya eskiyse durum bilinmiyor sayılır ve açık alarm kapanmaz. Servis sayfası servise ait açık alarmları gösterir. Metrik kuralları süre boyunca her ölçümde eşiğin aşılmasını bekler; tek bir anlık sıçrama alarm açmaz. AlertEvaluationWorker kuralları EvaluationIntervalSeconds aralığıyla (en az 15 sn) değerlendirir.
Kurallar kurulumda otomatik eklenmez; panelden oluşturulur. Kurala kanal bağlanmazsa alarm yalnızca panelde (zil ve Alarmlar sayfası) görünür.
Alarm akışı.
- Koşul oluşunca alarm açılır ve kurala bağlı kanallara Uyarı veya Kritik bildirimi gider. Aynı kural ve hedef için aynı anda tek açık alarm olur.
- Tekrar aralığı tanımlıysa alarm açık kaldıkça bu aralıkla hatırlatma gönderilir;
0ise tek bildirim gider. - Koşul ortadan kalkınca alarm kapanır ve "düzelince bildir" açıksa [Düzeldi] bildirimi gönderilir. Hedef silinirse (sunucu, uptime kontrolü, SSL izleme) veya kural kapatılırsa açık alarm da kapanır.
- SSL kuralları kalan güne göre 30, 15, 7, 3, 1 ve 0. günlerde bir kez daha bildirir; aynı adımda tekrar göndermez.
- Bakımdaki sunucular için sunucu kuralları alarm açmaz.
- Üstlenme bildirimi durdurmaz; alarmı kimin gördüğünü kaydeder. Alarm ve teslimat kayıtları geçmişte kalır, silinmez.
Zil. 60 saniyede bir özet okunur; yeni alarmlar bildirim olarak gösterilir (kritikler hata rengiyle, en fazla 3 tane). Bu istekler X-Background-Poll başlığıyla gider ve oturum süresini uzatmaz; oturum düşerse sorgu durur.
Kanallar eklenti olarak gelir (Notifications.Email, Notifications.Telegram, Notifications.Discord); eklenti devre dışıysa kanal kaydı korunur, gönderim "eklenti etkin değil" hatasıyla başarısız olarak kaydedilir. Her kanalın etkin/pasif durumu ve en düşük önem derecesi vardır (ör. yalnızca kritikler); düzeldi bildirimi alarmın önemine göre aynı kanallara gider. Kanal ayarlarındaki gizli değerler (SMTP parolası, bot anahtarı, webhook adresi) Security:MasterKey ile şifrelenir, arayüzde geri gösterilmez ve düzenlemede boş bırakılırsa korunur. Test gönder düğmesi kanala örnek bir bildirim yollar. Her gönderim sonucu (başarılı/başarısız, hata metni) kanal sayfasında listelenir.
| Kanal | Ayarlar | Notlar |
|---|---|---|
| E-posta | SMTP sunucusu, port, güvenlik (Yok / STARTTLS / SSL), kullanıcı adı, parola, gönderen, alıcılar | MailKit ile gönderilir; adresler alan adı içermelidir |
| Telegram | Bot anahtarı, sohbet kimliği | HTML biçimiyle gider; mesaj metni kaçışlanır |
| Discord | Webhook adresi | Renkli embed (uyarı turuncu, kritik kırmızı, düzeldi yeşil); @everyone gibi bahsetmeler kapalıdır. Adres yalnızca Discord:AllowedHosts listesindeki sunuculara ve https ile gidebilir |
Bildirim metni Türkçedir: önem, kural adı, hedef, değer/eşik ve açılış zamanı. Alerting:PublicBaseUrl doluysa alarma giden bağlantı eklenir.
- Uptime: HTTP(S) kontrolü kabul edilen durum kodlarına (ör.
200-299,301) göre, TCP kontrolü porta bağlanabilmeye göre karar verir. Aralık en azUptimeMinimumIntervalSeconds, aynı anda en fazlaUptimeMaxConcurrencykontrol çalışır. Detay sayfası 24 saat / 7 gün / 30 gün erişilebilirlik yüzdesini, ortalama yanıt süresini ve son 50 sonucu gösterir, 30 saniyede bir yenilenir. - SSL: sertifika
SslCheckIntervalHoursaralığıyla okunur; konu, veren, geçerlilik tarihleri ve kalan gün saklanır. Durumlar: Geçerli, Yakında doluyor (SslExpiringDays), Süresi dolmuş, Geçersiz (zincir veya ad uyuşmazlığı; neden Türkçe açıklanır), Erişilemiyor. - Ağ koruması: hedef adres çözüldükten sonra link-local (bulut metadata adresi
169.254.169.254dahil), multicast ve belirsiz adresler reddedilir; bağlantı çözülen adrese yapılır, böylece DNS yeniden bağlama ile atlatılamaz. Loopback ve özel ağ adresleri (iç servisler için) izinlidir. - Silme kayıtları gizler (soft delete); geçmiş sonuçlar ve alarmlar korunur.
Saklama. Bakım işi uptime sonuçlarını UptimeResultRetentionDays, bildirim teslimat kayıtlarını DeliveryRetentionDays gün sonra siler. Her uptime kontrolünün son 100 sonucu ve her kanalın son 50 teslimatı süre dolsa bile korunur. Silme, İzleme bölümünde anlatılan izin listesindeki tablolarla sınırlıdır; kurallar, kanallar, alarmlar, kontroller ve sertifika kayıtları silinmez.
Audit: alert_rule.create/update/delete, alert.acknowledge, notification_channel.create/update/delete/test, uptime_check.create/update/delete, ssl_monitor.create/update/delete.
Anahtar (Alerting:) |
Varsayılan | Açıklama |
|---|---|---|
Enabled |
true |
Değerlendirme, uptime ve SSL servislerini açar/kapatır |
EvaluationIntervalSeconds |
60 |
Kural değerlendirme aralığı (en az 15 sn) |
PublicBaseUrl |
boş | Bildirimlerdeki panel bağlantısı için dışarıdan görünen adres; boşsa bağlantı eklenmez |
NotificationTimeoutSeconds |
15 |
Tek bir bildirim gönderiminin zaman aşımı |
UptimeMinimumIntervalSeconds |
30 |
Uptime kontrolleri için izin verilen en kısa aralık |
UptimeMaxConcurrency |
8 |
Aynı anda çalışan en fazla uptime kontrolü |
UptimeResultRetentionDays |
30 |
Uptime sonuçlarının saklama süresi |
SslCheckIntervalHours |
6 |
SSL sertifikalarının okunma aralığı |
SslExpiringDays |
30 |
"Yakında doluyor" durumunun eşiği |
DeliveryRetentionDays |
90 |
Bildirim teslimat kayıtlarının saklama süresi |
| Anahtar | Varsayılan | Açıklama |
|---|---|---|
Telegram:ApiUrl |
https://api.telegram.org |
Telegram Bot API adresi |
Discord:AllowedHosts |
discord.com, discordapp.com, ptb.discord.com, canary.discord.com |
Webhook adresinin gidebileceği sunucular (host veya host:port); yapılandırmadaki değerler bu listeye eklenir |
Discord:AllowHttp |
false |
Yalnızca yerel test sunucusu için; üretimde açmayın |
Yerel testte gerçek Telegram/Discord/SMTP yerine yerel sahte sunucular kullanın (Telegram__ApiUrl, Discord__AllowedHosts__0, Discord__AllowHttp=true ortam değişkenleri ve yerel bir SMTP portu); canlı sohbetlere veya kanallara test bildirimi göndermeyin.
Menüde Yedekleme altında üç sekme bulunur: İşler (yedekleme işleri ve "Şimdi yedekle"), Geçmiş (tüm yedek ve geri yükleme çalışmaları, filtreli) ve Depolama (yedeklerin yazıldığı hedefler). Yedekler SSH üzerinden akış olarak alınır; sunucuda geçici dosya oluşmaz, veri panelden doğrudan depolamaya aktarılır.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
backup.view |
İşleri, geçmişi ve çalışma ayrıntılarını (log dahil) görüntüleme | SuperAdmin, Admin, Operator, Developer, Viewer |
backup.execute |
"Şimdi yedekle", süren işlemi iptal etme | SuperAdmin, Admin, Operator |
backup.manage |
İş ve depolama hedefi ekleme, düzenleme, silme; depolama testi; yedek dosyasını elle silme | SuperAdmin, Admin |
backup.restore |
Yedeği bir sunucuya geri yükleme | SuperAdmin, Admin |
backup.download |
Yedek dosyasını indirme; şifreli yedekte parola girilerek çözülmüş indirme | SuperAdmin, Admin, Operator |
| Tür | Kaynak | Sunucuda çalışan | Gereken yetki |
|---|---|---|---|
| Dosya | Bir veya daha çok mutlak yol, isteğe bağlı hariç tutma desenleri (*.log, cache/) |
tar -czf - (GNU veya BusyBox tar) |
Okunacak dosyalar için genelde tam sudo veya root |
| Docker volume | Volume adı | alpine:3 yardımcı container'ı volume'u salt okunur bağlar ve tar ile arşivler (--network none, log kapalı) |
docker grubu veya yalnızca docker için sudo |
| Veritabanı (container) | Container adı, motor (PostgreSQL, MySQL/MariaDB, MongoDB, Redis, SQL Server), veritabanı, kullanıcı, parola | Tek bir docker exec -i içinde motorun aracı (aşağıdaki tablo) ve container içindeki gzip |
docker grubu veya yalnızca docker için sudo |
| Veritabanı (sunucu) | Host, port, veritabanı, kullanıcı, parola | Sunucudaki istemci araçları ve gzip |
İstemci araçları kurulu olmalı |
| Motor | Yedek (dosya) | Zorunlu alanlar | Parolanın aktarımı | Geri yükleme |
|---|---|---|---|---|
| PostgreSQL | pg_dump --clean --if-exists --no-owner --no-privileges (.sql.gz) |
Veritabanı, kullanıcı | PGPASSWORD |
psql -v ON_ERROR_STOP=1 |
| MySQL / MariaDB | mariadb-dump (yoksa mysqldump) --single-transaction --routines --triggers (.sql.gz) |
Veritabanı, kullanıcı | MYSQL_PWD |
mariadb / mysql |
| MongoDB | mongodump --archive, sunucuda gzip (.archive.gz). Veritabanı boşsa tümü. Kimlik doğrulama veritabanı varsayılan admin |
— (parola varsa kullanıcı) | mktemp -d (0700) içinde 0600 YAML dosyası + --config; çıkışta silinir. MongoDB Database Tools 100.3+ gerekir |
mongorestore --archive, isteğe bağlı --drop; farklı ada --nsFrom/--nsTo |
| Redis | BGSAVE → LASTSAVE değişene kadar beklenir → CONFIG GET dir/dbfilename ile bulunan RDB gzip'lenir (.rdb.gz) |
— (ACL kullanıcısı isteğe bağlı) | REDISCLI_AUTH (-a kullanılmaz) |
Elle (aşağıya bakın) |
| SQL Server | sqlcmd ile BACKUP DATABASE … WITH COPY_ONLY, INIT → geçici /var/opt/mssql/backup/sm-backup-<rastgele>.bak gzip'lenip aktarılır ve silinir (.bak.gz). Sıkıştırma kullanılmaz (Express'te yok) |
Veritabanı; kullanıcı (varsayılan sa) |
SQLCMDPASSWORD |
RESTORE … WITH REPLACE (aşağıya bakın) |
- Veritabanı parolası komut satırına yazılmaz: stdin'in ilk satırından okunur ve yalnızca yukarıdaki ortam değişkeni veya geçici config dosyasıyla araca verilir; hiçbir süreç argv'sinde görünmez. Parola
Security:MasterKeyile şifreli saklanır ve arayüzde geri gösterilmez. - sqlcmd sırasıyla
/opt/mssql-tools18/bin/sqlcmd -C,/opt/mssql-tools/bin/sqlcmdve PATH'tekisqlcmd(go-sqlcmd,-C) olarak aranır. - Redis ve SQL Server yedek dosyası veritabanı sunucusunun kendi diskinde oluşur; bu yüzden veritabanı aynı sunucuda (container'da veya yerel) çalışmalıdır, uzak adres reddedilir. SQL Server'da yedek klasöründe veritabanı boyutu kadar boş alan gerekir. Redis'te
CONFIGkomutu kapalı/yeniden adlandırılmışsa yedek alınamaz. AOF açık olsa da RDB anlık görüntüsü tüm veriyi içerir. - Veritabanı adları motora göre dar kalıplarla doğrulanır (SQL Server: harf/
_ile başlayan tanımlayıcı, T-SQL'de[ad]olarak ve]ikilenerek; MongoDB: harf, rakam,_,-, en fazla 63 karakter). - Volume yedeğinden önce volume'un varlığı kontrol edilir; yanlış adla boş bir volume oluşturulup boş yedek alınmaz ("Volume bulunamadı").
- Volume yedeği çalışan container'ı durdurmaz. Sürekli yazılan veriler (ör. veritabanı dosyaları) için tutarlı yedek gerekiyorsa veritabanı yedeği kullanın veya yazan container'ı yedek sırasında durdurun.
- Yardımcı imaj sunucuda yoksa Docker Hub'dan çekilir; sunucunun Docker Hub'a erişimi yoksa
alpine:3imajını önceden yükleyin. Rootless Docker'da volume'lar kullanıcının kendi Docker daemon'ındadır; iş o kullanıcıyla bağlanan sunucu kaydıyla tanımlanmalıdır. - Sudo yetkisi yetersizse hata Türkçe açıklanır (dosya ve sunucudaki veritabanı yedekleri tam sudo, volume ve container veritabanı yedekleri yalnızca docker yetkisi ister).
- Zamanlama: Elle, saatlik (her N saatte bir, gün başına hizalı), günlük (belirli saat) veya haftalık (gün + saat). Saatler
Backup:TimeZonesaat dilimine göre yorumlanır; yaz saati geçişlerinde yerel saat korunur, olmayan saat (ileri alınan saat) bir sonraki geçerli ana kayar. Uygulama kapalıyken kaçırılan çalışmalar açılışta bir kez telafi edilir. - Eşzamanlılık: Aynı iş için aynı anda tek işlem (yedek veya geri yükleme) çalışır; ikincisi reddedilir. Toplam eşzamanlı işlem sayısı
Backup:MaxConcurrencyile sınırlıdır. - İptal ve kesinti: İptal SSH komutunu ve depolamaya yazmayı durdurur, yarım dosya bırakılmaz (S3'te yarım multipart yükleme iptal edilir). Uygulama kapanırken süren işlemler durdurulur; açılışta yarım kalan kayıtlar "Kesildi" olarak işaretlenir.
- Saklama: Her işte "son N yedeği tut" (1–365) ve isteğe bağlı "N günden eskileri sil" (0 = kapalı). Saklama yalnızca yeni yedek başarıyla kaydedildikten sonra çalışır ve yalnızca o işin başarılı yedek dosyalarını depolamadan siler; en yeni yedek hiçbir koşulda silinmez. Çalışma kayıtları, logları ve audit geçmişi silinmez; kayıtta dosyanın "Saklama politikası" tarafından silindiği görünür.
- İş veya depolama hedefi silindiğinde (soft delete) alınmış yedekler ve geçmiş korunur; geçmiş sayfasından geri yüklenebilir.
| Tür | Ayarlar | Notlar |
|---|---|---|
| Yerel disk | Klasör adı | Panel sunucusunda Backup:LocalRootPath altında bir klasör; kök dışına çıkılamaz. Yazma önce .partial dosyasına yapılır, tamamlanınca yeniden adlandırılır |
S3 uyumlu (Storage.S3 eklentisi) |
Endpoint (AWS için boş), bölge, bucket, önek, erişim anahtarı, gizli anahtar, path-style | Amazon S3, Cloudflare R2, MinIO, Backblaze B2, SeaweedFS. 16 MiB parçalarla multipart yükleme; küçük yedekler tek istekle gider. Gizli anahtar Security:MasterKey ile şifrelenir ve geri gösterilmez |
Azure Blob (Storage.AzureBlob eklentisi) |
Hesap adı, hesap anahtarı, isteğe bağlı hizmet adresi, kapsayıcı, önek | Azure Blob Storage. Adres boşsa https://<hesap>.blob.core.windows.net kullanılır. Azurite için adres http://127.0.0.1:10000/devstoreaccount1 olur. Başarısız yüklemede yarım blob silinir. Anahtar şifrelenir ve geri gösterilmez |
- Test et düğmesi hedefe küçük bir dosya yazar, okur ve siler.
- Nesne adı
{önek}{işKimliği}/{yyyyMMdd-HHmmss}-{kısaKimlik}.tar.gz(veritabanında.sql.gz; MongoDB.archive.gz, Redis.rdb.gz, SQL Server.bak.gz), şifreliyse sonuna.smbkeklenir. - S3 bucket'ında yarım kalmış multipart yüklemeleri birkaç gün sonra temizleyen bir yaşam döngüsü kuralı (abort incomplete multipart upload) önerilir; panel hata durumunda yüklemeyi zaten iptal eder, kural yalnızca bağlantı tamamen koptuğunda kalan parçalar içindir.
- R2 için endpoint
https://<hesap>.r2.cloudflarestorage.com, bölgeauto; MinIO/SeaweedFS için path-style açık olmalıdır.
Tüm yedekler gzip ile sıkıştırılır. Şifreleme iş başına açılır (varsayılan açık) ve işe girilen şifreleme parolasıyla yapılır:
- Biçim (
SMBK, sürüm 1): 36 baytlık başlık (SMBK| sürüm | bayrak | 2 boş bayt | PBKDF2 tur sayısı (uint32, big-endian) | 16 bayt salt | 8 bayt nonce öneki), ardından 1 MiB'lık AES-256-GCM parçaları (son-parça bayrağı | uzunluk | şifreli veri | 16 bayt etiket). - Anahtar PBKDF2-HMAC-SHA256 (varsayılan 600.000 tur,
Backup:KeyDerivationIterations) ile türetilir. Her parçanın nonce'u önek + parça sırasıdır; başlık, parça sırası ve son-parça bayrağı ek doğrulama verisidir. Bu sayede parçaların yer değiştirmesi, kesilme ve sona veri ekleme tespit edilir; çözme ilk bozuk parçada durur ve işlem başarısız sayılır. - Parola işte
Security:MasterKeyile şifreli saklanır; her çalışma kendi parolasının kopyasını tutar. İşin parolası sonradan değiştirilse bile eski yedekler kendi parolasıyla açılır. - Şifreli indir dosyayı olduğu gibi (
.smbk) verir. Çalışma ayrıntısındaki Parolayla çözerek indir ise kullanıcının girdiği parolayla panelde çözüp.tar.gz/.sql.gz(veya.archive.gz,.rdb.gz,.bak.gz) olarak verir (bkz. İndirme).
Yedek dosyası, yedeğin göründüğü her yerden indirilebilir: Geçmiş listesi, iş ayrıntısındaki son yedekler, çalışma ayrıntısı, geri yükleme sayfası, sunucunun Backups sekmesi, İşler listesi ve Servisler → Yedekleme kartı (son iki yerde "Son yedek" işin dosyası duran en yeni başarılı yedeğidir). Dosya, kaynak türünden (dosya, Docker volume, veritabanı) bağımsız olarak aynı uç noktadan (GET /BackupRuns/Download/{id}) iner.
- Yetki
backup.download(varsayılan SuperAdmin, Admin, Operator). Başarısız, süren, geri yükleme kaydı veya dosyası saklama politikasıyla/elle silinmiş çalışmalarda düğme pasiftir; nedeni araç ipucunda yazar. - Dosya depolamadan (yerel disk, S3, Azure Blob) panel üzerinden akış hâlinde aktarılır; belleğe veya geçici diske alınmaz, büyük yedeklerde sorun çıkarmaz. Yanıtta
Content-Disposition: attachment(kayıtlı dosya adı, güvenli karakterlere indirgenmiş), biliniyorsaContent-LengthveCache-Control: no-storebulunur. Depolama dosyayı açamazsa (eklenti kapalı, anahtar hatalı, dosya yok) çalışma ayrıntısında Türkçe hata gösterilir. - Çözülmüş indirme (
POST /BackupRuns/Download/{id}, antiforgery korumalı) yalnızca kullanıcı parolayı girdiğinde yapılır; panelde kayıtlı parola kullanılmaz. Parola önce başlık ve ilk parça çözülerek doğrulanır (yanlışsa indirme başlamadan hata verilir), ardından dosya 1 MiB'lık parçalarla akış hâlinde çözülür ve sonunda SHA-256 özeti kayıtla karşılaştırılır; uyuşmazsa bağlantı kesilir. Panel olmadan çözmek içintools/backup-decrypt.pykullanılır (komut çalışma ayrıntısında gösterilir). - Her indirme (başarısız denemeler ve yanlış parola dahil)
backup.downloadaudit kaydı bırakır: çalışma kimliği, iş, dosya adı, boyut ve depolama. Uç nokta kullanıcı başına dakikada 20 istekle sınırlıdır (backup-action). - S3 / Azure için ön imzalı (pre-signed) bağlantı üretilmez; depolama anahtarları ve bucket panel dışına açılmaz, indirme her zaman panel üzerinden yapılır.
Yedekler panelden bağımsız açılabilir; tek gereken şifreleme parolasıdır.
- Şifreleme parolalarını panel dışında saklayın (parola yöneticisi, kasa). Parola kaybolursa ve panel de yoksa şifreli yedek açılamaz; bu tasarım gereğidir.
Security:MasterKeykaybolursa panel kayıtlı parolaları çözemez: geri yükleme "Yedek şifreleme parolası çözülemedi (master key değişmiş olabilir)" hatası verir; Şifreli indir ve parolayla çözerek indirme yine çalışır (parola kullanıcıdan alınır). Yedek dosyaları sağlamdır; dosyayı depolamadan (S3 konsolu,aws s3 cp, yerel klasör) alıp aşağıdaki araçla açın. Ardından yeni MasterKey ile işin parolasını yeniden girin.- Panel tamamen kaybolursa aynı yol geçerlidir: yedek dosyası + parola yeterlidir.
python3 -m pip install cryptography
SM_BACKUP_PASSPHRASE='...' python3 tools/backup-decrypt.py yedek.tar.gz.smbk yedek.tar.gz # parola verilmezse sorulur
tar -xzf yedek.tar.gz -C /geri/yukleme/klasoru # dosya ve volume yedekleri
gunzip -c yedek.sql.gz | psql -d hedef_db # PostgreSQL (MySQL: | mysql hedef_db)
gunzip -c yedek.archive.gz | mongorestore --archive --drop # MongoDB
gunzip -c yedek.bak.gz > yedek.bak # SQL Server: RESTORE DATABASE ... FROM DISK = N'.../yedek.bak'
gunzip -c yedek.rdb.gz > dump.rdb # Redis: aşağıdaki elle geri yükleme adımlarıAraç bozuk/eksik dosyada ve yanlış parolada Türkçe hata verir, yarım çıktı bırakmaz; - çıktısı stdout'a yazar. Şifrelenmemiş yedekler doğrudan tar / gunzip ile açılır.
Geçmişteki başarılı bir yedekten Geri yükle formu açılır; hedef sunucu yedeğin alındığı sunucudan farklı olabilir. Hedefteki verinin üzerine yazılacağı onaylanmadan işlem başlamaz.
| Tür | Hedef | Davranış |
|---|---|---|
| Dosya | Mutlak klasör (varsayılan /; /proc, /sys, /dev ve .. yasak) |
Arşiv klasöre açılır, aynı adlı dosyaların üzerine yazılır; arşivde olmayan dosyalar silinmez |
| Docker volume | Volume adı (varsayılan kaynak volume) | Volume yoksa oluşturulur; içerik üzerine yazılır, fazlalık silinmez |
| Veritabanı (PostgreSQL, MySQL) | Container/host ve veritabanı adı | Veritabanı önceden var olmalıdır. PostgreSQL dökümü tabloları silip yeniden oluşturur; hata olursa ilk hatada durur (ON_ERROR_STOP) |
| MongoDB | Container/host, hedef veritabanı, "Önce sil" | Yoksa oluşturulur. "Önce sil" (--drop, varsayılan açık) yedekteki koleksiyonları yüklemeden önce siler. Farklı ad yazılırsa --nsFrom/--nsTo ile o veritabanına yüklenir. Tüm veritabanlarının yedeği yalnızca özgün adlarıyla yüklenir (admin'deki kullanıcılar dahil) |
| SQL Server | Container/host, hedef veritabanı | .bak geçici dosyaya açılır, açık bağlantılar kesilir (SINGLE_USER WITH ROLLBACK IMMEDIATE), RESTORE … WITH REPLACE, RECOVERY, ardından her durumda MULTI_USER. Aynı adda veri dosyaları yedekteki yollara; farklı adda RESTORE FILELISTONLY okunur ve dosyalar örneğin varsayılan veri/log klasörüne {ad}_{FileId}.mdf/.ndf/.ldf olarak taşınır (MOVE), özgün veritabanına dokunulmaz |
| Redis | — | Panelden geri yüklenmez (çalışan Redis'e güvenli yükleme için durdurma, dosya değiştirme ve AOF yönetimi gerekir). Sayfada şu yönerge gösterilir: dosyayı indirip açın → Redis'i durdurun → RDB'yi CONFIG GET dir klasörüne dbfilename adıyla (ör. /data/dump.rdb) kopyalayın → AOF açıksa (appendonly yes) Redis AOF'u yükler: önce appendonly no ile başlatıp veriyi kontrol edin, sonra CONFIG SET appendonly yes ile AOF'u yeniden oluşturun → Redis'i başlatın |
Yedek/geri yükleme komutları kullanıcı dosyası silmez; yalnızca kendi oluşturdukları geçici dosyaları (MongoDB config, SQL Server .bak) çıkışta siler. Geri yükleme de bir çalışma olarak geçmişe ve audit log'a yazılır. Şifreli yedekte parola yanlışsa geri yükleme hedefe veri yazmadan durur; dosya ortasında bozulma varsa bozuk parçada durur ve çalışma başarısız olur (o ana kadar açılan kısım hedefte kalır). Ayrıca depolamadan okunan dosyanın SHA-256 özeti yedek alınırken kaydedilenle karşılaştırılır.
Container'da çalışan bir veritabanı için iş, form doldurmadan IBackupJobService.CreateForContainerDatabaseAsync(ContainerDatabaseBackupRequest request, CancellationToken) ile açılır. İstek BackupJobSpecs.ForContainerDatabase ile BackupJobFormDto'ya çevrilir ve CreateAsync ile aynı doğrulama, parola şifreleme ve audit kaydından geçer; sonuç yeni işin kimliği veya ValidationFailure'dır. Yetki (backup.manage) çağıran katmanda kontrol edilir.
var result = await backupJobs.CreateForContainerDatabaseAsync(new ContainerDatabaseBackupRequest(
Name: "shop-db günlük", ServerId: serverId, StorageId: storageId,
Engine: BackupDatabaseEngine.MongoDb, ContainerName: "shop-mongo-1",
DatabaseName: "shop", // MongoDB'de null = tümü; Redis'te yok sayılır
User: null, // null = motor varsayılanı (postgres, root, root, sa; Redis'te yok)
Password: mongoPassword)
{
AuthDatabase = "admin",
ScheduleType = BackupScheduleType.Daily, ScheduleTime = "03:00", KeepLast = 7,
EncryptionPassphrase = passphrase // null = şifreleme kapalı
});Alarm: "Yedekleme başarısız" kuralı (varsayılan Kritik, kanal atanmamış) bir işin son yedeği başarısız olunca alarm açar; aynı iş başarılı yedek alınca kapanır.
Audit: backup_storage.create/update/delete/test, backup_job.create/update/delete, backup.start/complete/cancel/restore/download/artifact_delete. Gizli değerler (parolalar, anahtarlar) log'a, audit'e ve çalışma loguna yazılmaz.
Anahtar (Backup:) |
Varsayılan | Açıklama |
|---|---|---|
Enabled |
true |
Zamanlayıcıyı açar/kapatır (elle yedek yine çalışır) |
SchedulerIntervalSeconds |
30 |
Zamanı gelen işlerin kontrol aralığı |
MaxConcurrency |
2 |
Aynı anda çalışan en fazla yedek/geri yükleme |
TimeZone |
Europe/Istanbul |
Günlük/haftalık zamanlamanın saat dilimi (IANA veya Windows kimliği; geçersizse UTC) |
BackupTimeoutMinutes |
240 |
Tek yedeğin en uzun süresi |
RestoreTimeoutMinutes |
240 |
Tek geri yüklemenin en uzun süresi |
LocalRootPath |
App_Data/backups |
Yerel depolama klasörlerinin kökü (uygulama dizinine göre veya mutlak) |
KeyDerivationIterations |
600000 |
Yeni yedeklerde PBKDF2 tur sayısı (eski yedekler başlıktaki değerle açılır) |
MaxStoredLogKilobytes |
256 |
Çalışma başına saklanan en fazla log |
Yerel testte gerçek bucket yerine yerel bir S3 sunucusu (ör. SeaweedFS veya MinIO container'ı) ve test SSH sunucusu kullanın; canlı sunuculardan veya canlı bucket'lardan test yedeği almayın.
Menüde Güvenlik sayfası tüm sunucuların son tarama puanını, kritik bulgu ve uyarı sayılarını gösterir; sunucu detayındaki Güvenlik sekmesi tek sunucunun raporunu, bulgularını, açık portlarını ve tarama geçmişini listeler. Tarama agentless'tır: SSH ile tek bir salt okunur betik çalıştırılır, sunucuda hiçbir ayar değiştirilmez. Her bulgu için önerilen düzeltme komutu metin olarak gösterilir ve kopyalanabilir; panel bu komutları çalıştırmaz.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
security.view |
Güvenlik merkezi ve sunucu güvenlik raporlarını görüntüleme | SuperAdmin, Admin, Operator |
security.scan |
Elle tarama başlatma (dakikada en fazla 10) | SuperAdmin, Admin, Operator |
Denetlenenler:
| Kategori | Kontrol | Kaynak |
|---|---|---|
| SSH | Root girişi, parola ile giriş, boş parola, MaxAuthTries, X11 yönlendirme, başarısız giriş sayısı ve fail2ban |
sshd -T (yoksa sshd_config), journalctl / auth.log / secure |
| Ağ ve portlar | Dinleyen portlar, adres türü (yalnızca yerel, özel ağ, tüm arayüzler, genel), riskli servisler (veritabanı, Redis, Docker API, Telnet, FTP vb.) | ss veya netstat |
| Güvenlik duvarı | ufw, firewalld, nftables, iptables durumu ve kural sayısı | İlgili araçların durum komutları |
| Docker | TCP üzerinden açık Docker API (TLS'siz ise kritik), soket erişimi, dışarı yayınlanan container portları | docker info, daemon.json, docker ps |
| Güncellemeler | Bekleyen (güvenlik) güncellemeleri, yeniden başlatma gereksinimi, otomatik güncelleme | apt, dnf/yum, apk |
| Kullanıcılar | UID 0 hesapları, giriş yapabilen hesaplar, boş parolalı hesaplar, parolasız sudo kuralları | /etc/passwd, /etc/group, /etc/shadow (yetki varsa), sudoers |
| Disk | Şifreli disk (LUKS) varlığı | lsblk |
Puan 100'den başlar; her kritik bulgu 25, her uyarı 10 puan düşürür (en az 0). Özel ağ adresinde dinleyen riskli portlar bir seviye hafif değerlendirilir. Güvenlik duvarı kapalıyken dışarı açık riskli port varsa bulgu kritiktir.
Yetki: sunucuda sudo kullan açıksa betik önce sudo -n ile çalıştırılır; sudo yalnızca belirli komutlara izin veriyorsa (ör. sadece docker) tarama otomatik olarak yetkisiz kullanıcıyla tekrarlanır. Yetkisiz taramada /etc/shadow, güvenlik duvarı kuralları gibi bazı bilgiler okunamaz; rapor bu durumda kısıtlı yetkiyle tarandığını belirtir ve okunamayan kontrolleri "Bilinmiyor" olarak işaretler (puanı düşürmez).
Zamanlanmış tarama: SecurityScanWorker host key'i doğrulanmış sunucuları ScanIntervalHours aralığıyla tarar. Aynı sunucuda aynı anda tek tarama çalışır; uygulama yeniden başlarken yarım kalan taramalar başarısız olarak işaretlenir. Kritik güvenlik bulgusu alarm kuralı, son taramada kritik bulgu olan sunucular için alarm açar (bkz. Alarmlar ve izleme).
appsettings.json → SecurityScan:
| Ayar | Varsayılan | Açıklama |
|---|---|---|
ScanIntervalHours |
24 |
Otomatik tarama aralığı; 0 otomatik taramayı kapatır |
RetentionDays |
180 |
Bu süreden eski tarama kayıtları silinir |
KeepLatestPerServer |
20 |
Yaşından bağımsız olarak her sunucu için korunan son tarama sayısı |
Yerel testte yalnızca test SSH container'larını tarayın; canlı sunucularda denemeler için yalnızca kendi sunucularınızı kullanın.
Her kullanıcı sağ üstteki menüden Hesabım sayfasında parolasını değiştirebilir ve authenticator uygulamasıyla (Google Authenticator, Microsoft Authenticator, 1Password vb.) TOTP tabanlı iki adımlı doğrulamayı açabilir:
- Kurulumu başlat QR kod ve elle girilebilecek anahtarı gösterir.
- Uygulamadaki 6 haneli kod girilince 2FA açılır ve 10 kurtarma kodu bir kez gösterilir. Her kurtarma kodu tek kullanımlıktır.
- Sonraki girişlerde parola sonrası kod istenir. "Bu tarayıcıda 30 gün boyunca sorma" seçilirse o tarayıcıda 2FA adımı 30 gün atlanır; Hesabım sayfasındaki Bu tarayıcıyı unut bu izni kaldırır.
2FA'yı kapatmak ve kurtarma kodlarını yenilemek parola onayı ister. Telefonunu kaybeden kullanıcı için yönetici Kullanıcılar sayfasından 2FA'yı sıfırlayabilir. Giriş, 2FA, kurtarma kodu kullanımı, açma/kapatma ve sıfırlama işlemleri audit log'a yazılır; kod doğrulama uç noktaları giriş rate limit'ine tabidir.
appsettings.json → TwoFactor:Required true yapılırsa 2FA'sı kapalı kullanıcılar giriş yaptıktan sonra yalnızca Hesabım sayfasını kullanabilir; kurulumu tamamlayınca panel açılır. Varsayılan false'tur (mevcut kullanıcılar kilitlenmez).
Audit Log sayfası son 24 saatin özetini (kayıt, başarısız işlem, başarısız giriş, aktif kullanıcı, en sık işlemler) ve filtrelenebilir kayıt listesini gösterir. Filtreler: serbest arama, işlem, sonuç, tarih aralığı, kullanıcı adı, IP (başı yeterli) ve hedef türü. Her kaydın ayrıntı sayfasında tarayıcı bilgisi, kullanıcı kimliği ve zincir imzası görünür. Audit kayıtları düzenlenemez ve hiçbir temizlik işiyle silinmez.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
audit.view |
Audit log listesi, özet ve ayrıntılar | SuperAdmin, Admin |
audit.export |
CSV dışa aktarma ve bütünlük doğrulaması | SuperAdmin, Admin |
- CSV dışa aktarma: Seçili filtreye uyan en yeni 50.000 kayıt Excel uyumlu (UTF-8 BOM,
;ayraçlı) CSV olarak indirilir.=,+,-,@ile başlayan hücreler formül olarak çalışmasın diye başına'eklenir. Dışa aktarma işleminin kendisi de filtresiyle birlikte audit log'a yazılır. - Bütünlük zinciri: Her yeni kayıt, kendi alanları ve bir önceki kaydın imzası üzerinden HMAC-SHA256 ile imzalanır (
ChainHash). Anahtar,Security:MasterKey'den HKDF ile türetilir; ayrı bir gizli değer gerekmez. Bu özellikten önce yazılmış kayıtlar imzasız kalır ve zincirin başında kabul edilir. - Bütünlüğü doğrula: Tüm kayıtlar Id sırasıyla kontrol edilir. Bir kayıt değiştirilmiş, silinmiş, araya kayıt eklenmiş ya da imzası kaldırılmışsa zincirin kırıldığı ilk kayıt numarası gösterilir. Doğrulama sonucu da audit log'a yazılır.
Not:
Security:MasterKeydeğiştirilirse eski kayıtların imzaları yeni anahtarla doğrulanamaz. Anahtar rotasyonundan önce doğrulamayı çalıştırıp sonucu ve CSV dökümünü saklayın.
Sunucu sayfasındaki Sistem Servisleri, Processes, Logs, Network ve Storage sekmeleri bilgileri SSH ile anlık okur; ajan veya ek paket gerekmez. UseSudo açıksa önce sudo -n ile denenir, yetki yoksa normal kullanıcıyla okunur.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
system.view |
Servis, process, log, ağ ve disk bilgilerini görüntüleme | SuperAdmin, Admin, Operator, Developer |
system.manage |
Servis başlatma/durdurma/yeniden başlatma, process sonlandırma | SuperAdmin, Admin, Operator |
- Sistem Servisleri: systemd (
systemctl) veya OpenRC (rc-status) otomatik algılanır. Çalışma durumu ve açılışta başlama bilgisi gösterilir; durum ve ada göre süzülebilir. Durdurma işlemi servis adının yazılmasını ister. Servis yöneticisi olmayan sunucularda (ör. container) açıklama gösterilir. - Processes: procps
psvarsa CPU'ya göre, BusyBox'ta belleğe göre sıralı en fazla 500 process listelenir. Sonlandırma varsayılan olarak SIGTERM gönderir; onay penceresindeki seçenekle SIGKILL gönderilebilir. PID 1 sonlandırılamaz. - Logs: journald varsa
journalctl(birim ve önem filtresiyle), yoksa/var/logaltındaki dosyalar okunur. Yalnızca/var/log/altındaki,..içermeyen yollar kabul edilir. Satır sayısı 10–2000 arasıdır; metin filtresi sunucudan dönen satırlara uygulanır. - Network: arayüzler (durum, MAC, MTU, adresler, alınan/gönderilen bayt), rotalar, DNS sunucuları ve dinlenen portlar (
ssveyanetstat). - Storage: dosya sistemlerinin doluluk ve inode kullanımı (sanal dosya sistemleri gizlenir) ile
lsblkvarsa diskler ve bölümler.
Servis kontrolü ve process sonlandırma audit log'a yazılır (system.service_control, system.process_signal). Bu işlemler kullanıcı başına dakikada 20 istekle sınırlıdır.
Kaynak Kullanımı sekmesi (/ServerResources/Index/{id}, menüde İzleme → Kaynak Kullanımı) sunucuyu neyin yavaşlattığını tek ekranda gösterir. Salt okunurdur ve system.view ister; tek SSH bağlantısıyla okunur:
- Neden yavaş? paneli: eşiklerle Türkçe bulgular ve ilgili bölüme / Temizlik sayfasına bağlantı. Kurallar: 1 dk yük > çekirdek sayısı (2 katı kritik), kullanılabilir bellek < %10 (< %5 kritik), swap ≥ %50 (≥ %80 kritik; 64 MB altı yok sayılır), G/Ç bekleme ≥ %10 (≥ %20 kritik), steal ≥ %10, dosya sistemi veya inode ≥ %90 (≥ %95 kritik), tek process > %80 CPU, son 24 saatte OOM kaydı (journal; yoksa dmesg), container > %80 CPU veya bellek limitinin > %90'ı.
- Yük ortalaması ve çekirdek sayısı,
vmstat 1 2(yoksa/proc/statiki örnek) ile 1 saniyelik CPU dağılımı (kullanıcı / sistem / G/Ç bekleme / steal / boşta),/proc/meminfoile bellek (kullanılan / önbellek / kullanılabilir) ve swap. - En çok CPU ve RAM kullanan 10 process (kullanıcı, komut, %CPU, RSS / %MEM, süre).
system.managevarsa satırdan SIGTERM / SIGKILL gönderilir (Processes sekmesiyle aynı uç nokta ve audit).ps%CPU değeri process ömrü boyunca ortalamadır. - Swap kullanan process'ler (swap doluysa
VmSwap) vepidstat(sysstat) kuruluysa disk G/Ç yapan process'ler. - Container'lar:
docker stats --no-stream(CPU / RAM / ağ / disk G/Ç, sıralanabilir), container sayfasına bağlantı vesm.project,sm.service,com.docker.compose.project=sm-<proje>etiketlerinden panel projesi / servis eşlemesi (docker.viewister). - Dosya sistemleri (doluluk, inode) ve isteğe bağlı En büyük klasörler ve dosyalar taraması:
du -x -k -d 2(GNU du'da--threshold=10M) vefind -xdev -type f -size +100 MB, her biritimeout 60,nice -n 19,ionice -c3ile./proc,/sys,/devve..içeren yollar reddedilir; tarama kullanıcı başına dakikada 20 istekle sınırlıdır. - Otomatik yenile (15 sn) kutusu paneli sekme görünürken yeniler (disk taraması hariç).
- Geçmiş bölümü ("dün gece ne yavaşlattı?"):
ResourceHistoryWorker,Monitoring:ResourceHistoryIntervalMinutes(varsayılan 5 dk) aralıkla ana metrik toplayıcıdan ayrı olarak her sunucudan container kullanımı / durumu / yeniden başlama sayısını (docker stats+docker inspect) ve en çok CPU ve RSS kullanan process'leri (iki/procokuması arasındaki gerçek CPU) kaydeder (ContainerMetricSamples,ProcessSnapshots; saatlik özetContainerMetricsHourly). Aralık seçici (1 sa / 6 sa / 24 sa / 7 gün / özel), en çok kaynak kullanan 5 container için Chart.js CPU ve RAM grafikleri, "Bu aralıkta en çok kaynak kullananlar" tabloları (container ve process) ve grafikte tıklanan ana en yakın process anlık görüntüsü. 48 saati aşan aralıklar saatlik özetten çizilir. Uç noktalarGET /ServerResources/History/{id}veGET /ServerResources/ProcessSnapshot/{id}(system.view).
Temizlik sekmesi (/ServerCleanup/Index/{id}, menüde Operasyon → Temizlik) silinebilecekleri tahmini kazanılacak alanla gruplar ve her öğeyi Güvenle silinebilir ya da gerekçeli Dikkat olarak işaretler. Sayfa ve silme server.cleanup izni ister (varsayılan: SuperAdmin, Admin, Operator).
| Grup | Kaynak | Komut | Seviye |
|---|---|---|---|
| Durmuş container'lar | docker system df -v (exited / created / dead) |
docker rm |
Güvenle; panel projesine / servisine aitse Dikkat "Panel projesine ait" |
| Kullanılmayan imajlar | hiçbir container'ın kullanmadığı imajlar | docker image rm |
Güvenle; geri dönüş imajı sm-<proje>:<sha> (Deployment:KeepImageCount) Dikkat |
| Kullanılmayan ağlar | docker network ls --filter dangling=true |
docker network rm |
Güvenle; panel compose ağı Dikkat. sm-proxy, sm-services, bridge, host, none, docker_gwbridge, ingress listelenmez |
| Kullanılmayan volume'lar | Links = 0 |
docker volume rm |
Anonim Güvenle; isimli, compose ve sm-svc-*-data Dikkat. Volume'lar hiç önceden seçilmez |
| Build cache | kullanımda olmayan kayıtlar | docker builder prune -f |
Güvenle |
| Paket önbelleği | /var/cache/apt (dnf / yum) |
apt-get clean / dnf, yum clean all |
Güvenle |
| Journal | journalctl --disk-usage |
journalctl --vacuum-size=<MB>M |
Güvenle |
| Eski log dosyaları | /var/log altında *.gz, *.xz, *.bz2, *.zst, *.[0-9], *.old, *-YYYYMMDD, N günden eski (journal hariç) |
aynı find … -delete |
Güvenle |
| Geçici dosyalar | /tmp altında N gündür değişmemiş ve okunmamış normal dosyalar (systemd-private-*, soket klasörleri, *.pid, *.lock hariç) |
aynı find … -delete |
Dikkat |
| Eski snap sürümleri | snap list --all → disabled |
snap remove <ad> --revision=<rev> |
Güvenle |
| Eski çekirdekler | dpkg-query / rpm -q kernel (çalışan hariç) |
yalnızca gösterilir, öneri yazılır | Dikkat |
- Önizle hiçbir şey silmez (
apt-get -s clean, silmedenfind; diğerleri için çalışacak komut gösterilir). Seçilenleri temizle onay ister; "Dikkat" öğesi seçiliysetemizleyazılmalıdır. - Çalıştırmada sunucu yeniden taranır, yalnızca hâlâ silinebilir olan anahtarlar işlenir; istekten gelen ad komuta girmez. Günlük satır satır akar (NDJSON); kazanılan alan
dfile önce / sonra boş alan farkıdır. - Komutlar sudo açıksa sudo ile çalışır. Gerçek çalıştırma audit log'a
server.cleanup(öğeler + kazanılan bayt) olarak yazılır; önizleme yazılmaz. Kullanıcı başına dakikada 20 istek, tek seferde en fazla 500 öğe.
Backups, Alerts ve Activity sekmeleri ilgili modülün listesini yalnızca bu sunucuya süzerek gösterir: sunucunun yedekleme işleri ve yedek geçmişi (backup.view), sunucuya ait alarmlar (alert.view) ve sunucu üzerinde yapılan işlemlerin audit kayıtları (audit.view). Sekmeler yalnızca ilgili izni olan kullanıcılara görünür.
Gruplar sayfası (/ServerGroups) sunucuları proje, müşteri veya rol bazında toplar. Bir sunucu en fazla bir gruptadır; grup silinirse sunucular silinmez, yalnızca gruptan çıkarılır (grup kaydı da yumuşak silinir). Görüntüleme server.view, ekleme/düzenleme/silme server.edit izni ister ve her değişiklik audit log'a yazılır (server_group.create/update/delete).
- Sunucu formunda grup, aylık maliyet (0–1.000.000) ve para birimi (USD, EUR, TRY, GBP) seçilir. Maliyet girilip para birimi seçilmezse USD kabul edilir.
- Sunucu listesi gruba göre süzülebilir; grup kartlarında sunucu sayısı, erişilebilir sunucu sayısı ve para birimine göre toplam aylık maliyet görünür.
- Menüdeki Docker, İmajlar, Volume'lar, Ağlar, Terminal, Dosyalar, Sistem Servisleri, Process'ler, Loglar, Temizlik, Metrikler ve Kaynak Kullanımı bağlantıları önce sunucu seçiciyi açar; seçilen sunucunun ilgili sekmesine gider. Seçici, kullanıcının o özellik için izni yoksa menüde görünmez.
Toplu komut sayfası (/CommandRuns) bir komutu veya çok satırlı betiği seçilen sunucularda aynı anda çalıştırır. Komut her sunucuda sh -c '<betik>' 2>&1 olarak, en fazla 5 sunucuda paralel çalışır; stdout ve stderr yazıldığı sırayla birleştirilir.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
command.view |
Komut geçmişini ve çıktıları görüntüleme, şablon listesini görme | SuperAdmin, Admin, Operator |
command.run |
Sunucularda toplu komut çalıştırma | SuperAdmin, Admin |
template.manage |
Betik ve cloud-init şablonu ekleme/düzenleme/silme | SuperAdmin, Admin |
- Hedefler tek tek veya grup düğmesiyle seçilir (en fazla 100 sunucu). Zaman aşımı 5–900 saniye, komut en fazla 8000 karakterdir.
- Çalıştırmadan önce onay penceresi komutu ve sunucuları gösterir; 5 veya daha fazla sunucuda sunucu sayısının yazılması istenir.
- sudo ile çalıştır yalnızca sudo kullanımı açık sunuculara uygulanır; diğer sunucularda komut yetkisiz çalıştırılmaz, "başarısız" olarak işaretlenir.
- Her sunucunun durumu (başarılı, başarısız, zaman aşımı, kesildi), çıkış kodu, süresi ve çıktısının son 32.000 karakteri saklanır. Ayrıntı sayfası çalışma sürerken kendiliğinden yenilenir.
- Komut HTTP isteğinden bağımsız arka planda çalışır. Uygulama kapanırsa süren komutlar "kesildi" olarak kapanır; açılışta önceki çalışmadan yarım kalan kayıtlar da "kesildi" olarak işaretlenir. Komut geçmişi silinmez.
- Her çalıştırma audit log'a
command.runolarak (sunucular, sudo bilgisi ve komut metniyle) yazılır.
Şablonlar (/ServerTemplates) iki türdür:
- Kabuk betiği: Toplu komut formunda seçildiğinde içeriği komut alanına kopyalanır ("sudo gerektirir" işaretliyse sudo kutusu da işaretlenir); çalıştırmadan önce düzenlenebilir. Şablon listesindeki çalıştır düğmesi formu bu şablonla açar.
- cloud-init: Bulut sağlayıcıda yeni sunucu oluşturulurken user-data olarak verilir; içerik
#cloud-configveya#!ile başlamalıdır.
Şablon içeriği şifrelenmeden saklanır; parola veya API anahtarı yazılmamalıdır. Silinen şablon yumuşak silinir; o şablonla çalıştırılmış komutların geçmişi korunur.
Sağlayıcılar sayfası (/CloudAccounts) Hetzner Cloud, DigitalOcean, Vultr, Linode ve Scaleway hesaplarını bağlar. Her sağlayıcı ayrı bir eklentidir (Cloud.Hetzner, Cloud.DigitalOcean, Cloud.Vultr, Cloud.Linode, Cloud.Scaleway, grup "Bulut"); kullanmadan önce Eklentiler sayfasından kurulup etkinleştirilmelidir. Eklentisi kapatılan hesap listede görünür, ancak eşitleme ve sunucu oluşturma çalışmaz.
| İzin | Kapsam | Varsayılan roller |
|---|---|---|
cloud.view |
Hesapları ve sağlayıcıdaki sunucu listesini görüntüleme | SuperAdmin, Admin, Operator |
cloud.manage |
Hesap ekleme, düzenleme, silme ve eşitleme | SuperAdmin, Admin |
cloud.provision |
Sağlayıcıda yeni sunucu oluşturma | SuperAdmin, Admin |
- Hesap ekleme: API anahtarı kaydedilmeden önce sağlayıcıda doğrulanır ve AES-256-GCM ile şifrelenerek saklanır; bir daha gösterilmez. Düzenlemede anahtar alanı boş bırakılırsa mevcut anahtar korunur. Listeleme için okuma, sunucu oluşturma için yazma yetkili anahtar gerekir.
- Sunucu listesi sağlayıcıdan anlık okunur. Panele bağlı olmayan sunucularda Panele ekle sunucu formunu ad, IP, konum ve aylık fiyatla doldurur (kullanıcı adı
root); SSH bilgileri girilip kaydedildiğinde sunucu hesaba bağlanır (server.createizni gerekir,cloud.importolarak audit log'a yazılır). - Eşitleme (elle veya
Cloud:SyncIntervalHoursaralığında otomatik, varsayılan 6 saat,0kapatır):- Hiçbir hesaba bağlı olmayan ve IP adresi sağlayıcıdaki bir sunucuyla tam olarak bir kayıtta eşleşen panel sunucusu hesaba bağlanır. Aynı IP birden fazla panel sunucusunda varsa bağlama yapılmaz.
- Bağlı sunucuların aylık maliyeti ve para birimi sağlayıcı fiyatından güncellenir. Hetzner fiyatı sunucunun konumundaki KDV hariç (net) aylık ücrettir (EUR). DigitalOcean, Vultr ve Linode aylık ücrettir (USD). Scaleway ürünü aylık EUR yayınlamazsa saatlik ücret 730 ile çarpılır. Fiyat dönmeyen sunucunun elle girilmiş maliyeti değiştirilmez.
- Son eşitleme zamanı ve hatası hesap kartında görünür. Elle eşitleme her zaman, otomatik eşitleme yalnızca değişiklik olduğunda audit log'a
cloud.syncolarak yazılır.
- Sunucu oluşturma (
/CloudAccounts/Provision): bölge, sunucu tipi (aylık fiyatıyla, seçilen bölgede satılanlar) ve işletim sistemi imajı sağlayıcıdan yüklenir. İsteğe bağlı cloud-init şablonu user-data olarak verilir (en fazla 32 KB). SSH genel anahtarı girilirse root kullanıcısına eklenir: şablonsuzsa#cloud-config+ssh_authorized_keys, cloud-config şablonda mevcut listeye eklenerek,#!betikte shebang'den hemen sonra kurulum komutlarıyla. Onay penceresinde sunucu adının yazılması istenir. - Anahtar verilmezse Hetzner tek seferlik root parolası döndürür; Vultr
default_passwordalanını, Linode ise panelin ürettiği root parolasını aynı pencerede bir kez gösterir. Bu parolalar veritabanına ve audit log'a yazılmaz. DigitalOcean parolayı hesabın e-postasına gönderir. Scaleway parola döndürmez. Linode adı harfle başlamalı, 3–64 karakter olmalı ve nokta içermemelidir. Oluşturma (başarılı veya başarısız)cloud.provisionolarak audit log'a yazılır. - Hesap silindiğinde kayıt yumuşak silinir ve bağlı panel sunucularının hesap bağlantısı kaldırılır; sağlayıcıdaki sunuculara ve panel sunucu kayıtlarına dokunulmaz.
Sağlayıcı API adresleri Cloud:Hetzner:ApiUrl (varsayılan https://api.hetzner.cloud/v1/), Cloud:DigitalOcean:ApiUrl (https://api.digitalocean.com/v2/), Cloud:Vultr:ApiUrl (https://api.vultr.com/v2/), Cloud:Linode:ApiUrl (https://api.linode.com/v4/) ve Cloud:Scaleway:ApiUrl (https://api.scaleway.com/) ile değiştirilebilir; yerel testlerde sahte bir API'ye yönlendirmek için kullanılır. İstekler yönlendirme izlemeyen ayrı HTTP istemcileriyle yapılır; 401/403/429 yanıtları Türkçe hata mesajına çevrilir. Scaleway gizli anahtarı Bearer yerine X-Auth-Token başlığında gider.
Maliyet sayfası (/Costs, server.view) sunucuların aylık maliyetini para birimine göre toplar ve yıllık tahmini gösterir; kur çevrimi yapılmaz. Rapor gruplara ve kaynağa (bulut hesabı veya "Elle girilen") göre kırılır, maliyeti girilmemiş sunucuları ayrıca işaretler ve sunucu düzenleme ekranına bağlantı verir.
Panelin SSH ile ulaşamadığı sunucular (NAT arkası, kapalı SSH) için sunucuda çalışan küçük bir agent metrik gönderir. Kurulum ve durum, sunucunun Metrikler sekmesinin altındaki panelden yönetilir (server.view görür, server.edit token üretir ve iptal eder).
- Token (
sma_+ 43 karakter) yalnızca oluşturulduğu anda, kurulum komutunun içinde bir kez gösterilir. Veritabanında SHA-256 özeti saklanır; düz metin loglanmaz. Yeni token eskisini geçersiz kılar. İptalagent.token_revoke, oluşturmaagent.token_createolarak audit log'a yazılır. - Kurulum komutu
GET /api/agent/install.shbetiğini indirir. Betik token içermez;SM_URLveSM_TOKENortam değişkenleriyle root olarak çalıştırılır. systemd varsa dakikada bir zamanlayıcı, yoksa cron kurulur. Kaldırma: aynı betikuninstallargümanıyla. - Agent, SSH toplayıcısıyla aynı ölçüm betiğini yerelde çalıştırıp çıktıyı
POST /api/agent/reportile gönderir (Bearer token,X-Agent-Version). Rapor metrik, anlık görüntü ve sağlık kaydı olarak SSH ile toplanmış gibi yazılır. İki rapor arasında en az 20 saniye olmalıdır; izleme kapalıysa rapor reddedilir. - Son rapor 3 dakika içindeyse o sunucudan SSH ile ayrıca metrik toplanmaz. Host key doğrulanmamış ve agent'ı 5 dakikadır sessiz olan sunucu için başarısız sağlık kaydı yazılır; ardışık başarısızlık eşiği dolunca sunucu çevrimdışı olur.
- Rapor uç noktası oturumsuzdur ve IP başına dakikada 120 istekle sınırlıdır. Gövde en fazla 256 KB olabilir. Panel HTTP üzerinden açıldıysa metrik sayfası token'ın ağda şifresiz gideceğini uyarır.
Ayarlar sayfası (/Settings, settings.view, SuperAdmin ve Admin) sürüm, çalışma ortamı, süreç süresi ve veritabanı şema sürümünü gösterir. settings.manage (SuperAdmin ve Admin) izleme, alarm, yedekleme, güvenlik taraması ve bulut aralıklarını kaydeder. Kayıt PanelSettings tablosuna yazılır ve çalışan sürecin seçenek nesnesine uygulanır; toplayıcı, alarm, yedek zamanlayıcı, uptime ve SSL bir sonraki turda yeni değeri kullanır. Agent aralığı kurulum betiğine gömülüdür, bu sayfadan değişmez. Bağlantı dizesi, ana anahtar ve API anahtarları gösterilmez ve kaydedilmez. Değişiklik settings.update olarak audit log'a yazılır.
Sistem nopCommerce'teki plugin mantığıyla genişler: Dokploy, Dokku ve diğer DevOps araçları host'tan bağımsız birer eklentidir. Her eklenti Plugins/{SystemName}/ klasöründe plugin.json tanımı, derlenmiş assembly'si (controller, derlenmiş Razor view'ları, servisler, migration'lar) ve Content/ klasörüyle (CSS/JS) durur.
Yönetim → Eklentiler sayfası (plugin.manage, yalnızca SuperAdmin) bulunan eklentileri grup halinde listeler:
| İşlem | Davranış |
|---|---|
| Kur | Eklentinin migration'ları çalışır, izinleri varsayılan rollere eklenir, kayıt InstalledPlugins tablosuna yazılır ve eklenti etkinleşir. |
| Devre dışı bırak | Controller'ları 404 döner, SignalR hub'ları bağlantıyı reddeder, sunucu sekmesi gizlenir, arka plan işleri durur. Tablolar ve veriler silinmez. |
| Etkinleştir | Eklenti kaldığı yerden çalışır. |
- Kurma, etkinleştirme ve devre dışı bırakma yeniden başlatma gerektirmez; yeni bir eklenti klasörü eklemek veya eklenti dll'ini güncellemek yeniden başlatma gerektirir.
- Kaldırma (uninstall) yoktur: eklenti verisi kullanıcı verisidir ve silinmez. Bir eklentiyi tamamen kapatmak için devre dışı bırakın.
- Açılışta kurulu her eklentinin yeni migration'ları ve eksik izinleri uygulanır;
plugin.jsonsürümü değiştiyse kayıttaki sürüm güncellenir. - Yüklenemeyen eklenti (bozuk
plugin.json, eksik dll, aynıSystemName) uygulamayı durdurmaz; sayfada hatasıyla listelenir ve loglanır. - İşlemler audit log'a
plugin.install,plugin.enable,plugin.disableolarak yazılır.
Anahtar (Plugins:) |
Varsayılan | Açıklama |
|---|---|---|
Directory |
Plugins |
Eklenti klasörlerinin bulunduğu dizin (uygulama kök dizinine göre) |
InstallOnStartup |
[] |
Daha önce hiç kurulmamışsa açılışta otomatik kurulan eklentiler; varsayılan boştur, sonradan devre dışı bırakılan eklenti yeniden etkinleştirilmez |
Tablo gerektirmeyen eklentilerde (bildirim kanalları gibi) migration adımı atlanır.
| Eklenti | Grup | Durum |
|---|---|---|
DevOps.Dokploy |
DevOps | Hazır (bkz. Dokploy) |
Git.GitHub |
Git | Hazır (bkz. GitHub App) |
Notifications.Email |
Bildirim | Hazır (bkz. Bildirim kanalları) |
Notifications.Telegram |
Bildirim | Hazır (bkz. Bildirim kanalları) |
Notifications.Discord |
Bildirim | Hazır (bkz. Bildirim kanalları) |
Storage.S3 |
Yedekleme | Hazır (bkz. Yedekleme) |
Storage.AzureBlob |
Yedekleme | Hazır (bkz. Yedekleme) |
DevOps.Dokku |
DevOps | Hazır (bkz. Dokku) |
Cloud.Hetzner |
Bulut | Hazır (bkz. Bulut sağlayıcıları) |
Cloud.DigitalOcean |
Bulut | Hazır (bkz. Bulut sağlayıcıları) |
Cloud.Vultr |
Bulut | Hazır (bkz. Bulut sağlayıcıları) |
Cloud.Linode |
Bulut | Hazır (bkz. Bulut sağlayıcıları) |
Cloud.Scaleway |
Bulut | Hazır (bkz. Bulut sağlayıcıları) |
Git.GitLab |
Git | Planlandı |
DevOps.Coolify |
DevOps | Planlandı |
Eklenti:
Git.GitHub(src/Plugins/ServerManager.Plugin.Git.GitHub). Açılışta otomatik kurulmaz. Devre dışı bırakılırsa menü ve sayfa kapanır, bağlantılı projelerin deployment'ı durur; kayıtlar silinmez.
GitHub hesaplarındaki veya kurumlarındaki depoları projelere erişim anahtarı girmeden tanıtır. Menüde Deployment → GitHub sayfası bulunur (github.manage, varsayılan SuperAdmin ve Admin).
Bağlantı kurma:
- GitHub'da oluştur (manifest): uygulama adı ve isteğe bağlı kurum adı girilir; panel GitHub'a hazır bir App tanımı gönderir. GitHub'da "Create GitHub App" onaylanınca uygulama oluşur, kimlik bilgileri panele döner ve şifrelenerek saklanır; ardından kurulum sayfası açılır.
- Elle ekle: GitHub'da oluşturulmuş bir App'in App ID'si ve private key (
.pem, en az 2048 bit RSA) girilir; kaydetmeden önce GitHub'da doğrulanır. - Hesaba kur: uygulama bir veya daha fazla hesaba/kuruma kurulur ve depo erişimi seçilir (tümü veya seçili depolar). Kurulumdan sonra GitHub panele geri yönlendirir ve liste yenilenir.
Sayfa her uygulamanın kurulumlarını (hesap, tür, depo erişimi, askıya alınmış mı) ve onu kullanan projeleri gösterir. Proje formundaki Kaynak listesinde her kurulum "hesap · uygulama" olarak çıkar.
- İzinler: manifestle oluşturulan uygulama yalnızca
contents: readvemetadata: readister; webhook tanımlanmaz. Elle eklenen uygulamaya da bundan fazlası gerekmez. - Erişim anahtarları: App private key ile 10 dakikadan kısa ömürlü bir JWT imzalanır, buradan kurulum anahtarı alınır. Deployment ve depo kontrolü için anahtar yalnızca o depoya ve okuma iznine daraltılır, önbelleğe alınmaz, kullanıcı adı
x-access-tokenile stdin üzerinden git'e verilir; projede, logda ve sunucuda diske yazılmaz. Depo/kurulum listeleriListCacheSecondssüresince önbellekte tutulur; Yenile düğmesi ve kurulum dönüşü önbelleği temizler. - Gizli bilgiler: private key, client secret ve webhook secret
Security:MasterKeyile şifrelenir, arayüzde gösterilmez. - Kaldırma: bir uygulamayı kullanan proje varsa kaldırılamaz. Kaldırma kaydı gizler (soft delete); GitHub'daki uygulamayı ve kurulumları silmez, bunlar GitHub ayarlarından kaldırılır.
- Geri dönüş adresi: GitHub'a bildirilen dönüş adresleri
GitHub:PublicBaseUrl'den (boşsa isteğin adresinden) üretilir. Panel ters vekil arkasındaysa veya GitHub'ın kullanıcıyı döndüreceği adres farklıysa bu ayarı doldurun. - Oturum çerezi: giriş çerezi
SameSite=Strictolduğundan GitHub'dan gelen yönlendirmede gönderilmez. Bu yüzdenGitHub/CallbackveGitHub/Setupgirişsiz bir ara sayfa döner; sayfa aynı sitedenCompleteManifest/Installedadreslerine geçer ve işlem orada oturum vegithub.manageiznine göre yapılır. Manifest isteği tek kullanımlıktır, 1 saat geçerlidir ve başlatan kullanıcıya bağlıdır. - CSP: manifest formunun GitHub'a gönderilebilmesi için yalnızca GitHub sayfasında
form-actionpolitikasınaGitHub:WebUrleklenir (HttpContext.AllowFormAction). - Audit:
github.app_create,github.app_delete. Aksiyonlar kullanıcı başına dakikada 20 istekle sınırlandırılır.
Anahtar (GitHub:) |
Varsayılan | Açıklama |
|---|---|---|
ApiUrl |
https://api.github.com |
GitHub REST API adresi (GitHub Enterprise için değiştirin) |
WebUrl |
https://github.com |
Manifest ve kurulum sayfalarının adresi |
PublicBaseUrl |
boş | Panelin dışarıdan görünen adresi; boşsa isteğin adresi kullanılır |
HttpTimeoutSeconds |
15 |
GitHub API isteklerinin zaman aşımı |
ListCacheSeconds |
60 |
Kurulum ve depo listelerinin önbellek süresi |
Yerel test için gerçek GitHub yerine sahte bir API kullanın (GitHub__ApiUrl ve GitHub__WebUrl ortam değişkenleriyle); canlı hesaplarda test uygulaması oluşturmayın.
Aşağıdaki adımlar örnek bir Dokku eklentisi üzerinden anlatılır; yeni bir DevOps aracı için host kodunda değişiklik gerekmez. Servisler modülüne yeni servis türü (şablon) ekleyen eklentiler için ayrı rehber: docs/plugin-gelistirme.md (C# IServiceTemplateProvider veya kodsuz templates/*.json, örnek: ServerManager.Plugin.Services.Extra).
1. Proje — src/Plugins/ServerManager.Plugin.DevOps.Dokku/ServerManager.Plugin.DevOps.Dokku.csproj. Proje adı ServerManager.Plugin.{SystemName} olmalıdır; çıktı klasörü bu addan türetilir. Projeyi ServerManager.slnx içindeki /src/Plugins/ klasörüne ekleyin; Web projesi src/Plugins/*/*.csproj projelerini otomatik olarak önce derler (assembly referansı vermeden).
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\ServerManager.Infrastructure\ServerManager.Infrastructure.csproj" Private="false" />
<ProjectReference Include="..\..\ServerManager.Web.Framework\ServerManager.Web.Framework.csproj" Private="false" />
</ItemGroup>
</Project>src/Plugins/Directory.Build.props ve Directory.Build.targets ortak ayarları getirir: çıktı src/ServerManager.Web/Plugins/{SystemName}/ klasörüne yazılır, plugin.json ve Content/** kopyalanır, host'ta zaten bulunan assembly ve paket dosyaları çıktıya alınmaz. Eklentiye özel bir NuGet paketi gerekiyorsa projede <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> açılır; paket dll'i eklenti klasöründen yüklenir (host'ta bulunan paketler her zaman host'tan yüklenir).
2. plugin.json
{
"SystemName": "DevOps.Dokku",
"FriendlyName": "Dokku",
"Group": "DevOps",
"Version": "1.0.0",
"Author": "Server Manager",
"Description": "Dokku kurulumu, uygulama listesi ve deploy durumu.",
"DisplayOrder": 2,
"AssemblyFileName": "ServerManager.Plugin.DevOps.Dokku.dll"
}SystemName yalnızca harf, rakam ve nokta içerir, sonradan değiştirilmez (kurulum kaydı, statik dosya adresi /plugins/devops.dokku/ ve audit kayıtları buna bağlıdır). İsteğe bağlı Logo alanı Content içindeki dosya adıdır (ör. logo.svg); Eklentiler sayfasında adın yanında gösterilir. Yol, .. veya başka bir klasör kabul edilmez.
3. Kimlik sabitleri ve sağlayıcılar — izin ve audit adları kalıcıdır, değiştirilmez:
public static class DokkuPermissions
{
public const string View = "dokku.view";
public const string Manage = "dokku.manage";
}
public sealed class DokkuPermissionProvider : IPermissionProvider
{
public IReadOnlyList<PermissionDefinition> GetPermissions() =>
[
new(DokkuPermissions.View, "Dokku uygulamalarını görüntüleme"),
new(DokkuPermissions.Manage, "Dokku uygulamalarını yönetme")
];
public IReadOnlyDictionary<string, IReadOnlyList<string>> GetDefaultRolePermissions() => new Dictionary<string, IReadOnlyList<string>>
{
[Roles.Admin] = [DokkuPermissions.View, DokkuPermissions.Manage],
[Roles.Operator] = [DokkuPermissions.View]
};
}SuperAdmin eklentinin tüm izinlerini otomatik alır. Audit etiketleri IAuditActionProvider ile (["dokku.app_restart"] = "Dokku uygulaması yeniden başlatıldı"), sunucu detay sekmesi IServerTabProvider ile tanımlanır:
public IEnumerable<ServerTab> GetTabs() =>
[
new ServerTab("dokku", "Dokku", "Dokku uygulamaları", "Sunucudaki Dokku uygulamalarını görün ve yönetin.",
DokkuPermissions.View, Controller: "Dokku", Order: 20)
];Sunucuya bağlı olmayan sayfalar için sol menüye bağlantı IMenuItemProvider ile eklenir; bağlantı yalnızca eklenti etkinse ve kullanıcının izni varsa görünür:
public IEnumerable<MenuItem> GetItems() =>
[
new(MenuGroups.Deployment, "Dokku", "Dokku uygulamaları", "server", DokkuPermissions.View, "Dokku")
];Projelere depo tanıtan Git sağlayıcıları (GitLab, Gitea vb.) ServerManager.Application.Interfaces.Deployments.IGitIntegration arayüzünü uygulayıp scoped olarak kaydeder; proje formu, dal listesi ve deployment bu arayüz üzerinden çalışır (örnek: GitHubGitIntegration).
Her tip kendi dosyasındadır (bir dosyada tek tip kuralı eklentiler için de geçerlidir).
4. Giriş noktası — IPluginStartup uygulayan sınıf açılışta bulunur ve çağrılır:
public sealed class DokkuStartup : IPluginStartup
{
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.Configure<DokkuOptions>(configuration.GetSection("Dokku"));
services.AddValidatorsFromAssembly(typeof(DokkuStartup).Assembly, includeInternalTypes: true);
services.AddSingleton<IPermissionProvider, DokkuPermissionProvider>();
services.AddSingleton<IAuditActionProvider, DokkuAuditActionProvider>();
services.AddSingleton<IServerTabProvider, DokkuServerTabProvider>();
services.AddSingleton<IDokkuProvider, SshDokkuProvider>();
services.AddScoped<IDokkuRepository, DokkuRepository>();
services.AddScoped<IDokkuService, DokkuService>();
services.Configure<RateLimiterOptions>(o => o.AddPerUserPolicy("dokku-action", 20));
}
public void MapEndpoints(IEndpointRouteBuilder endpoints) =>
endpoints.MapHub<DokkuHub>("/hubs/dokku"); // gerekiyorsa
}ConfigureServices eklenti devre dışıyken de çalışır. Controller, hub ve sekmeler otomatik olarak engellenir; BackgroundService yazıyorsanız her turda IPluginCatalog.IsEnabled(SystemName) ile kontrol edin.
5. Veri — entity'ler eklentidedir; IEntityTypeConfiguration<T> sınıfları ApplicationDbContext'e otomatik eklenir, repository _context.Set<DokkuApp>() kullanır. Şema yalnızca FluentMigrator ile değişir: migration sınıfları eklenti assembly'sinde durur ve kurulumda/açılışta çalışır. Sürüm numarası tüm uygulamada benzersiz bir zaman damgası olmalıdır ([Migration(202611150001, "Dokku tabloları")]); host tablolarına (ör. Servers) yalnızca foreign key ile bağlanın, host tablolarını değiştirmeyin. Şema değişiklikleri yalnızca eklemelidir.
6. Web — controller'lar normal MVC controller'larıdır ([HasPermission(DokkuPermissions.View)], JSON yanıtları ApiResponse ile). Sunucu sayfası için ServerPageBuilder ve _ServerHeader partial'ı kullanılır. View'lar Views/Dokku/*.cshtml altında derlenir; Views/_ViewImports.cshtml eklentinin ve ServerManager.Web.Framework.* namespace'lerini içe aktarır. Sayfa view'ında:
@{
ViewData["Page"] = "dokku";
ViewData[PluginContent.PagePluginKey] = DokkuPlugin.SystemName;
}7. Stil ve JavaScript
| Yol | Açıklama |
|---|---|
Styles/pages/dokku.scss |
Sayfa stili; npm run build:css bunu host temasıyla derleyip Content/css/pages/dokku.css dosyasına yazar (derlenmiş CSS repoya dahildir) |
Content/js/pages/dokku.js |
Sayfanın giriş modülü |
Content/js/features/*.js |
Eklentinin kendi modülleri (göreli import: ../features/app-list.js) |
Host modülleri @app/ önekiyle içe aktarılır; import map bunu sürüm parametreli host adresine çevirir:
import { qs, on } from '@app/core/dom.js';
import { postForm, failureMessage } from '@app/core/http.js';
import { notify } from '@app/core/notify.js';
import { confirmAction } from '@app/core/dialog.js';Frontend kuralları host ile aynıdır: yalnızca ES module, inline script/style yok, tüm işlemler AJAX, onay SweetAlert2, bildirim toastr, her buton/bağlantıda title tooltip'i, sayfa başında kısa açıklama.
8. Test — tests/ServerManager.Plugin.DevOps.Dokku.Tests projesi oluşturun (Dokploy test projesini örnek alın) ve ServerManager.slnx'e ekleyin. İzin/audit adlarının ve plugin.json'ın assembly ile eşleştiğini doğrulayan sözleşme testi önerilir (DokployPluginContractTests).
9. Derleme ve yayın — dotnet build eklentiyi src/ServerManager.Web/Plugins/DevOps.Dokku/ klasörüne yazar (git'e eklenmez). dotnet publish src/ServerManager.Web tüm eklenti klasörlerini yayın çıktısındaki Plugins/ dizinine kopyalar. Hazır bir eklentiyi çalışan bir kuruluma eklemek için klasörünü Plugins/ altına kopyalayıp uygulamayı yeniden başlatmak ve Eklentiler sayfasından kurmak yeterlidir.
Depo kökündeki Dockerfile çok aşamalıdır: mcr.microsoft.com/dotnet/sdk:10.0 ile src/ServerManager.Web yayınlanır (Web derlemesi tüm eklentileri de derler ve PublishPlugins hedefi onları yayın çıktısındaki Plugins/ klasörüne kopyalar), çalışma imajı mcr.microsoft.com/dotnet/aspnet:10.0'dır. İmaj tzdata ve sağlık kontrolü için curl içerir, ayrıcalıksız app kullanıcısıyla (UID 1654) çalışır, 8080 portunu açar ve HEALTHCHECK ile /health adresini yoklar. Ön yüz varlıkları depoda derlenmiş olduğundan imaj derlemesi Node.js gerektirmez.
| Yol | İçerik |
|---|---|
/app/App_Data |
Yerel yedekler (Backup:LocalRootPath = App_Data/backups) — volume |
/app/logs |
Serilog dosya logları — volume |
/app/Plugins |
Eklentiler (imajla gelir) |
docker-compose.yml içindeki app servisi app profilindedir ve db sağlıklı olduktan sonra başlar:
cp .env.example .env # MSSQL_SA_PASSWORD, SM_MASTER_KEY (openssl rand -base64 32), SM_ADMIN_EMAIL / SM_ADMIN_PASSWORD
docker compose --profile app up -d --build
docker compose logs -f app.env değişkeni |
Uygulamadaki karşılığı |
|---|---|
MSSQL_SA_PASSWORD, SM_DB_NAME |
ConnectionStrings__DefaultConnection (Server=db,1433;Database=<SM_DB_NAME>;User Id=sa;...). Parola ; içermemelidir |
SM_MASTER_KEY |
Security__MasterKey (zorunlu; kaybolursa şifreli kayıtlar çözülemez) |
SM_ADMIN_EMAIL, SM_ADMIN_PASSWORD |
Seed__AdminEmail, Seed__AdminPassword (ilk SuperAdmin) |
SM_TRUST_FORWARDED_HEADERS |
Proxy__TrustForwardedHeaders |
SM_ACME_EMAIL |
Deployment__AcmeEmail |
APP_PORT |
Host'ta 127.0.0.1:<APP_PORT> → container 8080 |
Compose servisinde Database__AutoCreate=true olduğundan veritabanı ilk açılışta oluşturulur. Uygulama Production ortamında çalışır: oturum ve antiforgery çerezleri Secure olduğundan panel yalnızca HTTPS üzerinden kullanılabilir. Düz HTTP ile açılan giriş sayfası hata verir. Container'ın önüne TLS sonlandıran bir reverse proxy (Traefik, Nginx, Caddy) koyun, SM_TRUST_FORWARDED_HEADERS=true yapın ve vekilin adresini Proxy:KnownProxies / Proxy:KnownNetworks ile tanımlayın (bkz. Reverse proxy).
| Uç | Amaç | Davranış |
|---|---|---|
GET /health |
Canlılık (liveness) | Oturum gerektirmez; süreç ayaktaysa 200 döner. Docker HEALTHCHECK bu adresi kullanır |
GET /health/ready |
Hazırlık (readiness) | Oturum gerektirmez; veritabanı erişilebilir değilse 503 döner. Yük dengeleyici ve orkestratör için |
Proxy:TrustForwardedHeaders=true olduğunda uygulama X-Forwarded-For ve X-Forwarded-Proto başlıklarını işler (istemci IP'si audit log ve hız sınırlarında, şema HTTPS yönlendirmesi ve Secure çerezlerde kullanılır). Başlıklar yalnızca güvenilen vekillerden gelirse dikkate alınır:
| Anahtar | Açıklama |
|---|---|
Proxy:KnownProxies |
Güvenilen vekil IP adresleri listesi (ör. ["10.0.0.5"]) |
Proxy:KnownNetworks |
Güvenilen vekil ağları, CIDR biçiminde (ör. Docker ağı için ["172.18.0.0/16"]) |
Ortam değişkeniyle liste elemanları indeksle verilir: Proxy__KnownProxies__0=10.0.0.5, Proxy__KnownNetworks__0=172.18.0.0/16. Vekil listede yoksa başlıklar yok sayılır; istemci IP'si vekilin IP'si olarak görünür ve tüm kullanıcılar aynı hız sınırı bölümüne düşer.
Kimlik çerezini, antiforgery token'larını ve iki adımlı doğrulama ara adımını koruyan ASP.NET Core Data Protection anahtarları veritabanında saklanır. Böylece container yeniden oluşturulduğunda veya birden fazla örnek aynı veritabanını kullandığında oturumlar düşmez; ayrıca bir anahtar klasörü volume'ü gerekmez. Bu anahtarlar Security:MasterKey'den bağımsızdır.
Geçmiş kayıtları Retention: anahtarlarıyla gün cinsinden sınırlanır; süresi dolan kayıtlar arka planda silinir. 0 "süresiz sakla" demektir. Audit log kayıtları hiçbir ayarla silinmez (HMAC zinciri bozulmasın diye).
Anahtar (Retention:) |
Kapsam |
|---|---|
DeploymentLogDays |
Deployment kayıtları ve logları |
BackupRunLogDays |
Yedek çalıştırma kayıtları ve logları |
CommandRunDays |
Toplu komut çalıştırma geçmişi |
TerminalSessionDays |
Terminal oturum ve komut geçmişi |
AlertEventDays |
Alarm olayları |
ServiceOperationLogDays |
Servisler modülünün işlem kayıtları ve logları |
ContainerMetricDays |
Kaynak geçmişi: ham container örnekleri (varsayılan 7) |
ContainerMetricHourlyDays |
Kaynak geçmişi: container saatlik özetleri (varsayılan 90) |
ProcessSnapshotDays |
Kaynak geçmişi: process anlık görüntüleri (varsayılan 7) |
Varsayılan değerler appsettings.json dosyasındadır.
- Tüm sayfalar varsayılan olarak giriş gerektirir; her controller/action izin kontrolüyle korunur.
- Tüm POST istekleri antiforgery token ile doğrulanır; AJAX istekleri
RequestVerificationTokenbaşlığını gönderir. - Giriş, bağlantı testi ve anlık metrik toplama uç noktaları rate limit ile sınırlandırılır (dakikada 10 istek).
- İki adımlı doğrulama (TOTP) desteklenir;
TwoFactor:Requiredile zorunlu hale getirilebilir. Audit kayıtları HMAC zinciriyle imzalanır ve panelden doğrulanabilir. - 5 başarısız girişte hesap 15 dakika kilitlenir. Pasifleştirilen veya kilitlenen kullanıcının açık oturumu en geç 1 dakika içinde sonlanır.
- SSH host key fingerprint ilk başarılı bağlantıda kaydedilir; sonraki bağlantılarda farklı bir anahtar gelirse bağlantı reddedilir. Sunucu adresi veya portu değiştirildiğinde fingerprint sıfırlanır.
- Sunucu silme işlemi sunucu adının birebir yazılmasıyla onaylanır ve soft delete olarak yapılır; audit kayıtları korunur.
- Gizli değerler loglara, audit kayıtlarına ve HTML çıktısına yazılmaz.
docker compose logs -f db # MSSQL logları
docker compose down # veritabanını durdur (veri volume'de kalır)
dotnet user-secrets list --project src/ServerManager.Web