Add first-class hosting subdomain create/attach in Domains panel.
Deploy Ladill Hosting / deploy (push) Successful in 1m9s

Customers can create label-based subdomains under primary/addon sites with a separate max_domains×5 quota, nginx/docroot/SSL provisioning, and managed DNS A records when Ladill controls the parent zone.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-13 12:08:41 +00:00
co-authored by Cursor
parent c12c1cf7c3
commit 460edb8719
10 changed files with 723 additions and 11 deletions
+55
View File
@@ -311,6 +311,61 @@ class HostingAccount extends Model
return max($included, 0);
}
/**
* Domain slot limit from resource limits / product. -1 means unlimited.
*/
public function maxDomainsLimit(): int
{
$limit = data_get($this->resource_limits, 'max_domains');
if ($limit === null) {
$limit = $this->product?->max_domains;
}
if ($limit === null) {
return 1;
}
return (int) $limit;
}
/**
* Subdomain slot limit: max_domains × 5. Unlimited domains unlimited subdomains.
*/
public function maxSubdomainsLimit(): int
{
$maxDomains = $this->maxDomainsLimit();
return $maxDomains === -1 ? -1 : max(0, $maxDomains) * 5;
}
public function domainSitesCount(): int
{
return $this->sites()
->whereIn('type', ['primary', 'addon'])
->count();
}
public function subdomainSitesCount(): int
{
return $this->sites()
->where('type', 'subdomain')
->count();
}
public function canAddDomain(): bool
{
$limit = $this->maxDomainsLimit();
return $limit === -1 || $this->domainSitesCount() < $limit;
}
public function canAddSubdomain(): bool
{
$limit = $this->maxSubdomainsLimit();
return $limit === -1 || $this->subdomainSitesCount() < $limit;
}
public function paidMailboxCount(): int
{
if (! static::tracksLocalMailboxes()) {