This commit is contained in:
Bozhidar 2024-05-14 14:36:59 +03:00
parent 4d0ea376b6
commit eedc2e201a
4 changed files with 394 additions and 104 deletions

View file

@ -7,6 +7,7 @@ use App\Events\DomainIsCreated;
use App\Events\ModelDomainDeleting; use App\Events\ModelDomainDeleting;
use App\ShellApi; use App\ShellApi;
use App\VirtualHosts\ApacheBuild; use App\VirtualHosts\ApacheBuild;
use App\VirtualHosts\DTO\ApacheVirtualHostSettings;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Modules\Docker\App\Models\DockerContainer; use Modules\Docker\App\Models\DockerContainer;
@ -241,7 +242,7 @@ class Domain extends Model
shell_exec('chmod -f 751 '.$this->domain_public . '/cgi-bin/php'); shell_exec('chmod -f 751 '.$this->domain_public . '/cgi-bin/php');
} }
$apacheVirtualHostBuilder = new \App\VirtualHosts\ApacheVirtualHostBuilder(); $apacheVirtualHostBuilder = new ApacheVirtualHostSettings();
$apacheVirtualHostBuilder->setDomain($this->domain); $apacheVirtualHostBuilder->setDomain($this->domain);
$apacheVirtualHostBuilder->setDomainPublic($this->domain_public); $apacheVirtualHostBuilder->setDomainPublic($this->domain_public);
$apacheVirtualHostBuilder->setDomainRoot($this->domain_root); $apacheVirtualHostBuilder->setDomainRoot($this->domain_root);
@ -322,7 +323,7 @@ class Domain extends Model
} }
} }
$apacheBaseConfig = $apacheVirtualHostBuilder->buildConfig(); $virtualHostSettings = $apacheVirtualHostBuilder->getSettings();
$catchMainDomain = ''; $catchMainDomain = '';
$domainExp = explode('.', $this->domain); $domainExp = explode('.', $this->domain);
@ -352,7 +353,7 @@ class Domain extends Model
} }
} }
$apacheBaseConfigWithSSL = null; $virtualHostSettingsWithSSL = null;
if ($findDomainSSLCertificate) { if ($findDomainSSLCertificate) {
$sslCertificateFile = $this->home_root . '/certs/' . $this->domain . '/public/cert.pem'; $sslCertificateFile = $this->home_root . '/certs/' . $this->domain . '/public/cert.pem';
@ -391,13 +392,13 @@ class Domain extends Model
$apacheVirtualHostBuilder->setSSLCertificateKeyFile($sslCertificateKeyFile); $apacheVirtualHostBuilder->setSSLCertificateKeyFile($sslCertificateKeyFile);
$apacheVirtualHostBuilder->setSSLCertificateChainFile($sslCertificateChainFile); $apacheVirtualHostBuilder->setSSLCertificateChainFile($sslCertificateChainFile);
$apacheBaseConfigWithSSL = $apacheVirtualHostBuilder->buildConfig(); $virtualHostSettingsWithSSL = $apacheVirtualHostBuilder->getSettings();
} }
return [ return [
'apacheBaseConfig' => $apacheBaseConfig, 'virtualHostSettings' => $virtualHostSettings,
'apacheBaseConfigWithSSL' => $apacheBaseConfigWithSSL, 'virtualHostSettingsWithSSL' => $virtualHostSettingsWithSSL,
]; ];
} }

View file

@ -17,113 +17,26 @@ class ApacheBuild
public function build() public function build()
{ {
$virtualHostMerged = '
#=========================================================================#
# PHYRE HOSTING PANEL - Default Web Domain Template #
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS #
# https://phyrepanel.com/docs/server-administration/web-templates.html #
#=========================================================================#
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
';
$getAllDomains = Domain::all(); $getAllDomains = Domain::all();
$virtualHosts = [];
foreach ($getAllDomains as $domain) { foreach ($getAllDomains as $domain) {
$virtualHostSettings = $domain->configureVirtualHost();
$domainVirtualHost = $domain->configureVirtualHost($this->fixPermissions); if (isset($virtualHostSettings['virtualHostSettings'])) {
if (isset($domainVirtualHost['apacheBaseConfig'])) { $virtualHosts[] = $virtualHostSettings['virtualHostSettings'];
$virtualHostMerged .= $domainVirtualHost['apacheBaseConfig'] . "\n\n";
} }
if (isset($domainVirtualHost['apacheBaseConfigWithSSL'])) { if (isset($virtualHostSettings['virtualHostSettingsWithSSL'])) {
$virtualHostMerged .= $domainVirtualHost['apacheBaseConfigWithSSL'] . "\n\n"; $virtualHosts[] = $virtualHostSettings['virtualHostSettingsWithSSL'];
} }
} }
if (!empty(setting('general.master_domain'))) { $apache2 = view('actions.samples.ubuntu.apache2-conf-build', [
// Make master domain virtual host 'virtualHosts' => $virtualHosts
$masterDomain = new MasterDomain(); ])->render();
$domainVirtualHost = $masterDomain->configureVirtualHost($this->fixPermissions);
if (isset($domainVirtualHost['apacheBaseConfig'])) {
$virtualHostMerged .= $domainVirtualHost['apacheBaseConfig'] . "\n\n";
}
if (isset($domainVirtualHost['apacheBaseConfigWithSSL'])) {
$virtualHostMerged .= $domainVirtualHost['apacheBaseConfigWithSSL'] . "\n\n";
}
}
$wildcardDomain = setting('general.wildcard_domain'); file_put_contents('/etc/apache2/apache2.conf', $apache2);
if (!empty($wildcardDomain)) {
// Make wildcard domain virtual host
$masterDomain = new MasterDomain();
$masterDomain->domain = $wildcardDomain;
$domainVirtualHost = $masterDomain->configureVirtualHost($this->fixPermissions);
if (isset($domainVirtualHost['apacheBaseConfig'])) {
$virtualHostMerged .= $domainVirtualHost['apacheBaseConfig'] . "\n\n";
}
if (isset($domainVirtualHost['apacheBaseConfigWithSSL'])) {
$virtualHostMerged .= $domainVirtualHost['apacheBaseConfigWithSSL'] . "\n\n";
}
}
file_put_contents('/etc/apache2/apache2.conf', $virtualHostMerged);
shell_exec('systemctl reload apache2'); shell_exec('systemctl reload apache2');
} }
} }

View file

@ -0,0 +1,170 @@
<?php
namespace App\VirtualHosts\DTO;
class ApacheVirtualHostSettings
{
public $port = 80;
public $domain;
public $domainAlias;
public $domainPublic;
public $domainRoot;
public $homeRoot;
public $user;
public $userGroup;
public $additionalServices = [];
public $sslCertificateFile = null;
public $sslCertificateKeyFile = null;
public $sslCertificateChainFile = null;
public $appType = null;
public $appVersion = null;
public $passengerAppRoot = null;
public $passengerAppType = null;
public $passengerStartupFile = null;
public $serverAdmin = null;
public $proxyPass = null;
public $enableLogs = false;
public function setPort($port)
{
$this->port = $port;
}
public function setDomain($domain)
{
$this->domain = $domain;
}
public function setDomainAlias($domainAlias)
{
$this->domainAlias = $domainAlias;
}
public function setDomainPublic($domainPublic)
{
$this->domainPublic = $domainPublic;
}
public function setDomainRoot($domainRoot)
{
$this->domainRoot = $domainRoot;
}
public function setHomeRoot($homeRoot)
{
$this->homeRoot = $homeRoot;
}
public function setUser($user)
{
$this->user = $user;
}
public function setUserGroup($userGroup)
{
$this->userGroup = $userGroup;
}
public function setAdditionalServices($additionalServices)
{
$this->additionalServices = $additionalServices;
}
public function setSSLCertificateFile($sslCertificateFile)
{
$this->sslCertificateFile = $sslCertificateFile;
}
public function setSSLCertificateKeyFile($sslCertificateKeyFile)
{
$this->sslCertificateKeyFile = $sslCertificateKeyFile;
}
public function setSSLCertificateChainFile($sslCertificateChainFile)
{
$this->sslCertificateChainFile = $sslCertificateChainFile;
}
public function setAppType($appType)
{
$this->appType = $appType;
}
public function setAppVersion($appVersion)
{
$this->appVersion = $appVersion;
}
public function setPassengerAppRoot($passengerAppRoot)
{
$this->passengerAppRoot = $passengerAppRoot;
}
public function setPassengerAppType($passengerAppType)
{
$this->passengerAppType = $passengerAppType;
}
public function setPassengerStartupFile($passengerStartupFile)
{
$this->passengerStartupFile = $passengerStartupFile;
}
public function setServerAdmin($email)
{
$this->serverAdmin = $email;
}
public function setProxyPass($proxyPass)
{
$this->proxyPass = $proxyPass;
}
public function setEnableLogs($enableLogs)
{
$this->enableLogs = $enableLogs;
}
public function getSettings()
{
$settings = [
'port' => $this->port,
'domain' => $this->domain,
'domainAlias' => $this->domainAlias,
'domainPublic' => $this->domainPublic,
'domainRoot' => $this->domainRoot,
'homeRoot' => $this->homeRoot,
'serverAdmin' => $this->serverAdmin,
'user' => $this->user,
'group' => $this->userGroup,
'enableRuid2' => true,
'sslCertificateFile' => $this->sslCertificateFile,
'sslCertificateKeyFile' => $this->sslCertificateKeyFile,
'sslCertificateChainFile' => $this->sslCertificateChainFile,
'appType' => $this->appType,
'appVersion' => $this->appVersion,
'passengerAppRoot' => $this->passengerAppRoot,
'passengerAppType' => $this->passengerAppType,
'passengerStartupFile' => $this->passengerStartupFile,
'proxyPass' => $this->proxyPass,
'enableLogs' => $this->enableLogs,
];
$apacheVirtualHostConfigs = app()->virtualHostManager->getConfigs($this->additionalServices);
$settings = array_merge($settings, $apacheVirtualHostConfigs);
return $settings;
}
}

View file

@ -0,0 +1,206 @@
#=========================================================================#
# PHYRE HOSTING PANEL - Default Web Domain Template #
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS #
# https://phyrepanel.com/docs/server-administration/web-templates.html #
#=========================================================================#
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
@foreach($virtualHosts as $virtualHost)
<VirtualHost *:{{$virtualHost['port']}}>
@if(!empty($virtualHost['serverAdmin']))
ServerAdmin {{$virtualHost['serverAdmin']}}
@endif
ServerName {{$virtualHost['domain']}}
@if(!empty($virtualHost['domainAlias']))
ServerAlias {{$virtualHost['domainAlias']}}
@endif
DocumentRoot {{$virtualHost['domainPublic']}}
SetEnv APP_DOMAIN {{$virtualHost['domain']}}
@if(isset($virtualHost['enableRuid2']) && $virtualHost['enableRuid2'] && !empty($virtualHost['user']) && !empty($virtualHost['group']))
#RDocumentChRoot {{$virtualHost['domainPublic']}}
#SuexecUserGroup {{$virtualHost['user']}} {{$virtualHost['group']}}
#RUidGid {{$virtualHost['user']}} {{$virtualHost['group']}}
@endif
@if($virtualHost['enableLogs'])
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog {{$virtualHost['domainRoot']}}/logs/apache2/bytes.log bytes
CustomLog {{$virtualHost['domainRoot']}}/logs/apache2/access.log common
ErrorLog {{$virtualHost['domainRoot']}}/logs/apache2/error.log
@endif
@if($virtualHost['appType'] == 'php')
ScriptAlias /cgi-bin/ {{$virtualHost['domainPublic']}}/cgi-bin/
@endif
@if (!empty($virtualHost['proxyPass']))
ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
ProxyPass / {{$virtualHost['proxyPass']}}
ProxyPassReverse / {{$virtualHost['proxyPass']}}
@endif
<Directory {{$virtualHost['domainPublic']}}>
Options Indexes FollowSymLinks MultiViews @if($virtualHost['appType'] == 'php') Includes ExecCGI @endif
AllowOverride All
Require all granted
@if(isset($virtualHost['enableRuid2']) && $virtualHost['enableRuid2'] && !empty($virtualHost['user']) && !empty($virtualHost['group']))
RMode config
RUidGid {{$virtualHost['user']}} {{$virtualHost['group']}}
@endif
@if($virtualHost['passengerAppRoot'] !== null)
PassengerAppRoot {{$virtualHost['passengerAppRoot']}}
PassengerAppType {{$virtualHost['passengerAppType']}}
@if($virtualHost['passengerStartupFile'] !== null)
PassengerStartupFile {{$virtualHost['passengerStartupFile']}}
@endif
@endif
@if($virtualHost['appType'] == 'php')
Action phpcgi-script /cgi-bin/php
<Files *.php>
SetHandler phpcgi-script
</Files>
@php
$appendOpenBaseDirs = $virtualHost['homeRoot'];
if (isset($virtualHost['phpAdminValueOpenBaseDirs'])
&& is_array($virtualHost['phpAdminValueOpenBaseDirs'])
&& !empty($virtualHost['phpAdminValueOpenBaseDirs'])) {
$appendOpenBaseDirs .= ':' . implode(':', $virtualHost['phpAdminValueOpenBaseDirs']);
}
@endphp
php_admin_value open_basedir {{$appendOpenBaseDirs}}
php_admin_value upload_tmp_dir {{$virtualHost['homeRoot']}}/tmp
php_admin_value session.save_path {{$virtualHost['homeRoot']}}/tmp
php_admin_value sys_temp_dir {{$virtualHost['homeRoot']}}/tmp
@endif
</Directory>
@if(!empty($virtualHost['sslCertificateFile']) and !empty($virtualHost['sslCertificateKeyFile']))
SSLEngine on
SSLCertificateFile {{$virtualHost['sslCertificateFile']}}
SSLCertificateKeyFile {{$virtualHost['sslCertificateKeyFile']}}
@if (!empty($virtualHost['sslCertificateChainFile']))
SSLCertificateChainFile {{$virtualHost['sslCertificateChainFile']}}
@endif
SSLEngine on
# Intermediate configuration, tweak to your needs
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLOptions +StrictRequire
# Add vhost name to log entries:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
@endif
</VirtualHost>
@endforeach