Sürükle-bırak canlı önizlemeli tema üretimi (otomatik theme.css + theme.js), tüm 7 modül kategorisi için tema giydirme, 10 zorunlu güvenlik/mimari kuralı ve uçtan uca çalışan ileri seviye referans sunucu modülü (cloudnode_ornek) anlatımı.
BiriCP; çekirdeği hafif tutan, vitrin temalarını ve 7 farklı kategorideki otomasyon modüllerini Marketplace paketleri (.zip) halinde dağıtan imzalı bir mimariyle çalışır. Bir tema veya modül ister BiriCP Panel içindeki stüdyoda ister doğrudan BiriCP Merkez üzerinde üretilsin, yayınlanmadan önce 10 Zorunlu Kural Doğrulayıcıdan geçer ve Ed25519 (biricp.sig) ile imzalanır.
biricp-package-v1 İmzası (biricp.sig)
Kod yazmadan profesyonel hosting/bulut teması üretmek için hem BiriCP Yönetim Panelinde (/yonetim/themes/studio) hem de BiriCP Merkez’de (/gelistirici/tema-studyosu) yerleşik Sürükle-Bırak Görsel Tema Stüdyosu bulunur.
theme.css ve theme.js Üretimi: Seçtiğiniz renkler, Google Font, köşe yuvarlaklığı ve işaretlediğiniz JS özellikleri (yapışkan başlık, aylık/yıllık fiyat geçişi, kaydırma animasyonu, TLD uzantı filtresi, kopyalama bildirimi) anında CSP uyumlu harici assets/themes/{slug}/theme.css ve assets/themes/{slug}/theme.js dosyalarına derlenir.assets/themes/{slug}/builder-schema.json içinde saklar. Böylece aylar sonra bile temayı stüdyoda tekrar açıp blok sırasını değiştirebilirsiniz.BiriCP’de bir tema yalnızca ana sayfayı değiştirmez; müşteri panelinde çalışan tüm modül kategorilerinin (Proxmox/VDS, Plesk/cPanel/Mailcow, Sanal POS ödeme ekranı, Alan Adı yönetimi, DNS, SMS, e-Fatura ve Eklentiler) görünümünü de kontrol eder! Bu özellik iki katmanlı çalışır:
--bcp-mod-* CSS Değişkenlerilayouts/store.tpl ve layouts/client.tpl aktif temanın theme.css ve theme.js dosyalarını otomatik yükler. Temanızdaki aşağıdaki değişkenler tüm modül kartlarını anında biçimlendirir:
:root, [data-site-theme="studio-nova"] {
--bcp-mod-bg: #ffffff; /* Modül kart zemini */
--bcp-mod-border: rgba(148,163,184,0.24); /* Modül çerçeve rengi */
--bcp-mod-radius: 16px; /* Modül köşe yuvarlaklığı */
--bcp-mod-accent: #2563eb; /* Kicker başlık ve CPU/RAM bar rengi */
--bcp-mod-shadow: 0 12px 28px rgba(15,23,42,0.07);
--bcp-mod-terminal-bg: #0b1220; /* SSH / Konsol kutusu arka planı */
}
Bir modül module_view($category, $moduleName, 'panel', $veriler) yardımcı fonksiyonunu çağırdığında BiriCP\Modules\ModuleView şu sırayla şablon arar (ilk bulunan çizilir):
themes/{tema_slug}/templates/modules/{kategori}/{modul_adi}/panel.tplthemes/{tema_slug}/templates/modules/{kategori}/_default/panel.tplservers/_default/panel.tpl dosyası, kendi özel override'ı olmayan tüm sunucu modüllerini tek seferde giydirir.modules/native/{kategori}/{modul_adi}/templates/panel.tpltemplates/modules/{kategori}/panel.tplMarketplace’e yüklenen her paket ModuleRuleValidator / PackageRuleValidator tarafından otomatik taranır. 100/100 almayan paketler imzalanmaz:
| Kod | Kural Adı | Zorunlu Teknik Kriter |
|---|---|---|
R01 | Arşiv Güvenliği | .. (üst dizine çıkış), mutlak yol (/), sembolik bağ ve .env içeremez. |
R02 | biricp.json Bildirgesi | Geçerli vendor/slug kimliği, SemVer sürüm (1.0.0), type (module|theme) ve requires.biricp. |
R03 | Kategori & Giriş Dosyası | Modüllerde module/Module.php, temalarda theme/theme.json bulunmalıdır. Modül adı snake_case olmalıdır. |
R04 | PHP 8.3 & strict_types | Modüldeki tüm .php dosyaları declare(strict_types=1); içermeli ve TOKEN_PARSE kontrolünden hatasız geçmelidir. (Temalarda .php kesin yasaktır!) |
R05 | Zorunlu Sözleşme Arayüzü | Kategoriye karşılık gelen resmi BiriCP\Modules\Contracts\* arayüzü implements edilmeli ve tüm metotları tanımlanmalıdır. |
R06 | Sandbox Yasaklı Çağrılar | eval, exec, shell_exec, system, passthru, proc_open, popen, pcntl_exec kullanımı kesinlikle reddedilir. |
R07 | İzin Beyanı Tutarlılığı | HTTP/cURL çağrısı yapan modül "network", tablo oluşturan (migrations/) modül "database" iznini biricp.json içinde beyan etmelidir. |
R08 | SQL & Şifreleme Hijyeni | Sorgularda ham $_GET/$_POST birleştirmesi yasaktır; API şifreleri encrypt() / decrypt() ile saklanmalıdır. |
R09 | Smarty Şablon Güvenliği | .tpl dosyalarında {php} veya {include_php} etiketi ve tam <html>/<body> sarmalayıcısı yasaktır. |
R10 | Evrensel Tema Uyumu | Müşteri/yönetici arayüzü döndüren modüller module_view() veya standart .bcp-mod-* sınıflarını kullanmalıdır. |
Tüm sürücüler BiriCP\Modules\Result (Result::ok(array $data, string $msg) veya Result::fail(string $err)) döndürür:
| Kategori Dizini | Zorunlu Arayüz | İsteğe Bağlı Alt Arayüzler | Temel Görev |
|---|---|---|---|
servers/{ad} | ServerDriver | VmControl, VmConsole, VmSsh, VmSnapshots, VmBackups, VmReinstall, HandlesCallback | Bulut VDS, Hosting, Kurumsal Mail, SSL, Hotspot, Santral provizyonu |
gateways/{ad} | GatewayDriver | HandlesCallback (/payment/native/{ad}/callback) | 3D Sanal POS ödeme formu, kart saklama tahsilatı ve iade |
registrars/{ad} | RegistrarDriver | — | Alan adı sorgu, tescil, transfer, yenileme, NS, EPP ve kilit yönetimi |
sms/{ad} | SmsDriver | — | OTP doğrulama ve bildirim SMS gönderimi (send($phone, $msg)) |
dns/{ad} | DnsProvider | — | Müşteri DNS bölgesi (zone) ve A/AAAA/MX/TXT/CNAME kayıt yönetimi |
einvoice/{ad} | EInvoiceProvider | — | Ödenen faturaları GİB e-Fatura / e-Arşiv belgesine dönüştürme ve PDF |
addons/{ad} | AddonModule | — | Hook dinleyicileri, özel yönetici ekranı ve arka plan otomasyon eklentisi |
cloudnode_ornek — Dizin Yapısı, biricp.json ve MigrationKaynak kodda modules/native/servers/cloudnode_ornek/ dizininde hazır bulunan (ve Marketplace’ten ücretsiz indirilebilen) CloudNode Bulut VDS modülümüzün paket yapısı şöyledir:
biricp-cloudnode-ornek-1.0.0.zip
├── biricp.json # Paket kimliği, SemVer ve izin beyanı (R02, R07)
├── biricp.sig # BiriCP Merkez Ed25519 kriptografik imzası
└── module/
├── Module.php # ServerDriver + VmControl + VmConsole + VmSsh + HandlesCallback
├── migrations/
│ └── 001_create_cloudnode_events.php # İdempotent veritabanı tablo kurulumu
└── templates/
└── panel.tpl # Tema uyumlu (module_view) müşteri kontrol kartı
biricp.json Bildirgesi{
"id": "biricp/cloudnode-ornek",
"name": "CloudNode Bulut VDS (İleri Seviye Referans Örnek Modül)",
"version": "1.0.0",
"type": "module",
"description": "ServerDriver + VmControl + VmConsole + VmSsh + HandlesCallback içeren referans sunucu modülü.",
"author": "biricp",
"requires": { "biricp": ">=0.2.7" },
"permissions": ["network", "database"],
"module": {
"category": "servers",
"name": "cloudnode_ornek"
}
}
module/migrations/001_create_cloudnode_events.phpModül Marketplace’ten kurulurken ModuleMigrations servisi tarafından alfabetik sırayla çalıştırılır. Her göç dosyası BiriCP\Core\Database\Migration sınıfından türeyen anonim bir sınıf döndürmelidir:
<?php
declare(strict_types=1);
use BiriCP\Core\Database\Migration;
use Illuminate\Database\Schema\Blueprint;
return new class extends Migration {
public function up(): void
{
if (!$this->schema()->hasTable('mod_cloudnode_events')) {
$this->schema()->create('mod_cloudnode_events', function (Blueprint $table): void {
$table->id();
$table->unsignedBigInteger('service_id')->index();
$table->string('remote_vm_id', 64)->default('');
$table->string('event_type', 60);
$table->json('meta')->nullable();
$table->timestamp('created_at')->useCurrent();
});
}
}
};
ServerDriver Yaşam Döngüsü ve Canlı Kurulum İlerleme ÇubuğuMüşteri siparişi ödediğinde BiriCP kuyruğu create(int $serviceId) metodunu çağırır. Müşterinin hizmet detay sayfasında gerçek zamanlı yüzdelik ilerleme çubuğu görmesi için ProvisionProgress kullanılır ve üretilen şifre mutlaka encrypt() ile saklanır:
public function create(int $serviceId): Result
{
[$svc, $prod, $srv] = $this->serviceContext($serviceId);
if (!$svc || !$srv) {
return Result::fail('Hizmet veya sunucu tanımı eksik.');
}
// 1. Aşama (%20): Müşteri ekranındaki canlı kurulum çubuğunu güncelle
\App\Support\ProvisionProgress::update($serviceId, 'validating', 'Hipervizör kaynakları kontrol ediliyor…', 20);
$rootPass = $svc->password ? decrypt((string) $svc->password) : bin2hex(random_bytes(8)) . 'A!';
$planCode = (string) ($prod->configoption1 ?: 'nvme-4c-8g');
$region = (string) ($prod->configoption2 ?: 'tr-ist1');
// 2. Aşama (%55): Uzak REST API üzerinde sanal sunucuyu oluştur
\App\Support\ProvisionProgress::update($serviceId, 'cloning', 'NVMe disk kalıbı klonlanıyor…', 55);
$resp = $this->apiRequest($srv, 'POST', '/v1/instances', [
'hostname' => $svc->domain ?: ('vps-' . $serviceId . '.cloudnode.local'),
'plan' => $planCode,
'region' => $region,
'root_password' => $rootPass,
]);
if (!$resp['ok']) {
\App\Support\ProvisionProgress::fail($serviceId, $resp['error']);
return Result::fail($resp['error']);
}
// 3. Aşama (%85 → %100): IP ve şifreli root parolasını tblhosting'e kaydet
$ipv4 = (string) ($resp['data']['ipv4'] ?? '185.122.40.18');
\App\Support\ProvisionProgress::update($serviceId, 'configuring', "IPv4 ({$ipv4}) ve SSH uygulanıyor…", 85);
DB::table('tblhosting')->where('id', $serviceId)->update([
'username' => 'root',
'password' => encrypt($rootPass),
'dedicatedip' => $ipv4,
]);
\App\Support\ProvisionProgress::complete($serviceId, "CloudNode VDS hazır ({$ipv4})");
return Result::ok(['ip' => $ipv4]);
}
VmControl), Konsol (VmConsole) ve PuTTY / SSH Yönetimi (VmSsh)Anonim modül sınıfınıza implements ServerDriver, VmControl, VmConsole, VmSsh eklediğiniz anda BiriCP müşteri panelindeki Yönetim sekmesi otomatik olarak aktifleşir; başlat/kapat/yeniden başlat butonları, noVNC konsol penceresi ve PuTTY şifre / SSH anahtar yönetim kutusu tek satır çekirdek kodu değiştirmeden ekrana gelir!
ssh-ed25519 AAAAC3Nza... Cloud-Init senkronize
instanceof ile algılar.
module_view) ve İmzalı Webhook (HandlesCallback)Modülünüzün müşteri panelindeki özel sekmesini çizerken doğrudan HTML birleştirmek yerine module_view('servers', 'cloudnode_ornek', 'panel', $veriler) çağırın. Böylece hem XSS kaçışlaması Smarty tarafından yapılır hem de Sürükle-Bırak Tema Stüdyosunda tasarlanan her tema modülünüzü kendi renk/köşe/terminal stiliyle gösterir:
public function clientAreaOutput(int $serviceId): string
{
[$svc] = $this->serviceContext($serviceId);
$st = $this->loadState($serviceId);
return module_view('servers', 'cloudnode_ornek', 'panel', [
'title' => (string) ($svc->domain ?: ('CloudNode VDS #' . $serviceId)),
'region' => strtoupper((string) ($st['region'] ?? 'TR-IST1')),
'statusBadge' => ($svc && $svc->domainstatus === 'Active') ? '● Çalışıyor' : 'Beklemede',
'statusTone' => ($svc && $svc->domainstatus === 'Active') ? 'ok' : 'warn',
'metrics' => [
['label' => 'vCPU Kullanımı', 'value' => '%18', 'percent' => 18],
['label' => 'DDR5 RAM', 'value' => '2.2 / 8.0 GB', 'percent' => 28],
],
'sshCmd' => !empty($svc->dedicatedip) ? ('ssh root@' . $svc->dedicatedip) : '',
]);
}
public function handleCallback(Request $request): Response
{
$rawBody = (string) ($request->rawBody ?? '');
$sigHeader = (string) ($request->server['HTTP_X_CLOUDNODE_SIGNATURE'] ?? '');
$expected = hash_hmac('sha256', $rawBody, $this->webhookSecret($request));
if ($sigHeader === '' || !hash_equals($expected, $sigHeader)) {
return Response::json(['ok' => false, 'error' => 'Geçersiz HMAC imzası'], 403);
}
return Response::json(['ok' => true]);
}
/yonetim/modules/studio) ekranını açın. Yerel modülünüzün yanındaki Kuralları Denetle butonuna tıklayarak R01–R10 raporunun 100/100 GEÇTİ verdiğini doğrulayın..zip İndir ile arşivi alıp BiriCP Merkez /gelistirici ekranından yükleyin).CryptoService::signPackageZip() ile biricp.sig dosyasını arşive gömer ve belirlediğiniz katmana göre (Ücretsiz, Pro Aboneliğe Dahil veya Ücretli Tekil Eklenti) /marketplace/index.json kataloğunda tüm BiriCP kullanıcılarına açar!