adems / dapur-multiwebsite
Modul multi-website untuk Dapur AdeMS: satu inti Dapur melayani banyak website
Requires
- php: ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0
- composer-runtime-api: ^2.0
- laminas/laminas-config-aggregator: ^1.20
- mezzio/mezzio: ^3.28
- psr/container: ^1.1 || ^2.0
Requires (Dev)
- laminas/laminas-diactoros: ^3.9
- phpunit/phpunit: ^11.5
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Paket adems/dapur-multiwebsite membuat satu instalasi Dapur AdeMS
(disebut inti) melayani banyak website. Setiap website punya konfigurasi, route, modul, cache,
log, dan upload sendiri, sementara kode inti dan vendor/ cukup satu.
Tanpa daftar website (config/multiwebsite.local.php), paket ini tidak melakukan apa pun dan
Dapur berjalan sebagai satu website seperti biasa.
Persyaratan
- Dapur AdeMS 2.4 atau lebih baru (memiliki kait
DAPUR_CONFIG_CACHE_PATHdanDAPUR_CONFIG_PROVIDERSdiconfig/config.php). Pada inti yang lebih lama, website ditolak dengan pesan kesalahan agar tidak diam-diam menampilkan inti untuk semua domain. - PHP 8.2 sampai 8.5
Instalasi
Di folder inti Dapur, tambahkan paket ke composer.local.json (buat bila belum ada), bukan ke
composer.json, agar composer.json inti tetap sama dengan rilis Dapur:
{
"require": {
"adems/dapur-multiwebsite": "^1.0"
}
}
Lalu jalankan composer update.
Paket bekerja otomatis lewat autoload Composer; tidak perlu didaftarkan di
config/modul.local.php. Multi-website aktif setelah daftar website dibuat:
cp vendor/adems/dapur-multiwebsite/config/multiwebsite.local.php.dist config/multiwebsite.local.php
File config/multiwebsite.local.php, folder config/website/, dan folder data/website/
berisi data milik instalasi Anda (nama domain, lokasi folder, password database website), dan
sudah diabaikan Git oleh inti Dapur.
Daftar website
<?php return [ // Host yang menampilkan inti Dapur (dashboard) 'dashboard' => ['dashboard.contoh.com'], 'website' => [ // Mode folder domain 'contoh.com' => [ 'lokasi' => '/var/www/contoh.com', 'alias' => ['www.contoh.com', 'contoh.co.id', 'www.contoh.co.id'], ], // Mode terpusat (tanpa 'lokasi') 'blog.contoh.com' => [ 'alias' => ['www.blog.contoh.com'], ], ], ];
dashboard: host yang menampilkan inti. Dashboard hanya dilayani lewatpublic/inti, tidak lewat folder website mana pun.website: kuncinya nama website, yaitu domain utamanya.lokasimenunjuk folder website dalam mode folder domain.alias: domain lain yang membuka website yang sama, boleh lebih dari satu. Cache dan data website tetap satu, dan$config['website']['host']tetap berisi nama website. Nama website selalu menang atas alias website lain; bila satu alias tercantum di dua website, yang pertama ditulis yang dipakai.
Untuk website publik, mesin pencari menganggap alias sebagai salinan halaman yang sama. Bila itu tidak diinginkan, alihkan alias ke domain utama di web server, misalnya lewat
.htaccess:RewriteCond %{HTTP_HOST} !^contoh\.com$ [NC] RewriteRule ^ https://contoh.com%{REQUEST_URI} [L,R=301]
Host yang tidak dikenal, termasuk akses lewat alamat IP, mendapat halaman "Website tidak ditemukan" (kode 404) tanpa memuat konfigurasi apa pun.
Website wajib terdaftar
Setiap website wajib tercantum di website, sehingga semuanya terlihat dan bisa dikelola dari
satu tempat. Kedua mode tetap tersedia: lokasi boleh menunjuk ke folder mana pun, dan tanpa
lokasi website memakai config/website/<domain>/ di inti.
| Keadaan | Pengunjung | Baris perintah (--website=) |
|---|---|---|
| Terdaftar, folder ada | website tampil | berjalan untuk website itu |
| Terdaftar, folder belum ada | 404 | kode keluar 1, "terdaftar, tetapi foldernya tidak ditemukan" |
| Tidak terdaftar, folder ada atau tidak | 404 | kode keluar 1, "tidak ditemukan di daftar" |
Folder tidak dibuat otomatis saat ada request. Website bisa didaftarkan lebih dulu dan mulai tampil setelah foldernya dibuat.
Susunan folder website
Isi folder website sama di kedua mode; hanya folder akarnya yang berbeda.
Mode folder domain
Document root domain mengarah ke public/ milik website:
/var/www/contoh.com/
├── config/
│ ├── autoload/ ← *.global.php dan *.local.php milik website (menimpa bawaan inti)
│ ├── routes.php ← route website
│ └── website.php ← judul, tema, daftar modul website
├── data/
│ ├── cache/ ← cache konfigurasi dan cache data aplikasi website
│ ├── log/
│ └── upload/
├── module/ ← modul khusus website: Nama\ dimuat dari module/Nama/src/
└── public/
├── .htaccess ← salin dari public/.htaccess inti
├── asset ← symlink ke public/asset inti
└── index.php
public/index.php milik website cukup beberapa baris:
<?php declare(strict_types=1); // Penanda bahwa request masuk lewat folder website: dashboard tidak dilayani dari sini. // Website tetap dicari dari daftar website. define('DAPUR_WEBSITE_PATH', dirname(__DIR__)); // Jalankan inti Dapur require '/var/www/dapur/public/index.php';
Mode terpusat
Document root domain langsung mengarah ke public/ inti; website dikenali dari nama host.
<inti>/config/website/blog.contoh.com/ ← autoload/, routes.php, website.php, module/
<inti>/data/website/blog.contoh.com/ ← cache/, log/, upload/
Konfigurasi website
Urutan penggabungan konfigurasi:
- Bawaan inti: paket Laminas/Mezzio, modul
App, modul inti (config/modul.local.php), danconfig/autoload/inti. - Modul pilihan website (
'modul'diwebsite.php). - Bawaan paket ini (folder cache data aplikasi website, route website).
config/autoload/*.phpmilik website.
Karena lapisan website dimuat paling akhir, config/autoload/database.local.php milik website
menimpa koneksi database inti.
Contoh config/website.php:
<?php return [ 'judul' => 'Contoh', 'tema' => 'dapur', 'modul' => [ Toko\ConfigProvider::class, // dari module/Toko/src/ConfigProvider.php ], ];
Isinya bisa dibaca di aplikasi lewat $config['website'], ditambah kunci host.
config/routes.php milik website memakai format yang sama dengan config/routes.php inti.
Route website didaftarkan lebih dulu daripada route inti; path yang sama tidak boleh didaftarkan
dua kali. Route dan modul inti berlaku untuk semua website.
Perintah Composer untuk website tertentu
Tambahkan -- --website=<host> pada perintah Composer inti:
composer clear-config-cache -- --website=contoh.com composer cek-database -- --website=contoh.com
Atau pakai variabel lingkungan DAPUR_WEBSITE=contoh.com. Tanpa opsi, perintah berjalan untuk
inti.
Setelah mengubah config/multiwebsite.local.php, website.php, daftar modul, atau
config/autoload/ website, hapus cache konfigurasi website tersebut.
Perintah dapur-website
vendor/bin/dapur-website daftar # semua website terdaftar vendor/bin/dapur-website clear-config-cache --semua # hapus cache konfigurasi inti dan semua website
Website yang foldernya belum ada ditampilkan dengan keterangan folder tidak ditemukan, tanpa
dianggap gagal.
Izin folder
Folder data/ website diisi oleh web server (cache konfigurasi juga memuat password database):
data/cache/dandata/log/: hanya pemilik dan grup web server, misalnya2770.data/upload/: boleh ditulis web server, tetapi berada di luarpublic/dan PHP tidak boleh dijalankan di sana.
Folder data/cache/app beserta induknya dibuat otomatis bila belum ada, dengan izin 2770, agar
anggota grup bisa menghapus cache dari baris perintah. dapur-website clear-config-cache melaporkan
"tidak bisa diperiksa" dan keluar dengan kode 1 bila izin folder tidak mengizinkan pemeriksaan cache.
Pengembangan
composer install
composer test
Lisensi
BSD 3-Clause. Lihat LICENSE.md.