mirror of
https://github.com/cytopia/devilbox.git
synced 2025-04-19 16:20:52 +00:00
Compare commits
46 Commits
v3.0.0-bet
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
986f04637f | ||
|
8621ce1b55 | ||
|
10b20c0745 | ||
|
1c2143095a | ||
|
22ed5edc4e | ||
|
9d23981173 | ||
|
6fa4d4a386 | ||
|
51a127dda3 | ||
|
76c6467806 | ||
|
617241ce42 | ||
|
2fa1641bc2 | ||
|
de8d40822c | ||
|
b773fcd1b7 | ||
|
7c461870f0 | ||
|
ecb674f859 | ||
|
8e39202fc9 | ||
|
8c81bcc1a1 | ||
|
8a1a720e8c | ||
|
fb173e0ed6 | ||
|
9f54138567 | ||
|
364f4aa3a6 | ||
|
c7c2b4f2cb | ||
|
0b561dfdd2 | ||
|
794e3d8961 | ||
|
a84e18be67 | ||
|
894706ab09 | ||
|
448054bece | ||
|
e18bfd3f4f | ||
|
d1894b3eb2 | ||
|
7f3b45b387 | ||
|
81c9bb0a93 | ||
|
cb07f319de | ||
|
cca1744145 | ||
|
9fc97586e6 | ||
|
2db5ffff6b | ||
|
0dc1b9cafb | ||
|
b05f4240f3 | ||
|
e18e923d87 | ||
|
c6e1192429 | ||
|
634b9af7e5 | ||
|
a1fa5724e8 | ||
|
a786eb64b0 | ||
|
01d2f4afed | ||
|
873abc6c4c | ||
|
1ba3cd399c | ||
|
299b765652 |
@ -13,8 +13,8 @@ error_reporting(-1);
|
||||
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
|
||||
|
||||
|
||||
$DEVILBOX_VERSION = 'v3.0.0-beta-0.1';
|
||||
$DEVILBOX_DATE = '2022-12-24';
|
||||
$DEVILBOX_VERSION = 'v3.0.0-beta-0.3';
|
||||
$DEVILBOX_DATE = '2023-01-02';
|
||||
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
|
||||
|
||||
//
|
||||
|
@ -150,6 +150,11 @@ if (loadClass('Helper')->isLoggedIn()) {
|
||||
$_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'wscat') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getWscatVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'yarn') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getYarnVersion()) !== false) ? $version : $no
|
||||
|
@ -65,7 +65,7 @@ function run_supervisor_command($command) {
|
||||
);
|
||||
?>
|
||||
<h3>Daemon overview</h3><br/>
|
||||
<p>If you made a change to any vhost settings, you can trigger a manual reload here.</p>
|
||||
<p>If you made any changes to vhost settings (vhost-gen templates or backend configuration) or to the webserver configuration itself, you can trigger a manual reload of <code>watcherd</code> here to apply them. No need to restart the Docker Compose stack.</p>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
|
@ -345,7 +345,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Angular Cli</th>
|
||||
<th style="width: 50%;">Angular Cli</th>
|
||||
<td id="app_angular_cli"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -428,6 +428,10 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
<th>Wordpress Cli</th>
|
||||
<td id="app_wpcli"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Wscat</th>
|
||||
<td id="app_wscat"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Yarn</th>
|
||||
<td id="app_yarn"></td>
|
||||
@ -970,6 +974,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
updateVersions('vue_cli');
|
||||
updateVersions('webpack_cli');
|
||||
updateVersions('wpcli');
|
||||
updateVersions('wscat');
|
||||
updateVersions('yarn');
|
||||
})();
|
||||
</script>
|
||||
|
@ -1,66 +0,0 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
if (!isset($_GET['name'])) {
|
||||
loadClass('Helper')->redirect('/vhosts.php');
|
||||
}
|
||||
if (!strlen($_GET['name'])) {
|
||||
loadClass('Helper')->redirect('/vhosts.php');
|
||||
}
|
||||
$vhost = $_GET['name'];
|
||||
$found = false;
|
||||
$vhosts = loadClass('Httpd')->getVirtualHosts();
|
||||
foreach ($vhosts as $v) {
|
||||
if ($vhost == $v['name']) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Be safe before using outputs
|
||||
$vhost = htmlentities($vhost);
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(true); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>vhost-gen: <?php echo $vhost;?></h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<?php if (!$found): ?>
|
||||
<p>The Virtual Host "<?php echo $vhost; ?>" does not exist.</p>
|
||||
<?php else: ?>
|
||||
<?php $tpl = loadClass('Httpd')->getVhostgenTemplatePath($vhost); ?>
|
||||
<?php if (!$tpl): ?>
|
||||
<p>No custom vhost-gen configuration found for "<?php echo $vhost; ?>".</p>
|
||||
<?php else: ?>
|
||||
<p>Note: If the resulting virtual host config does not reflect the vhost-gen template changes, you will need to restart the Devilbox.</p>
|
||||
<a href="/vhosts.php"><i class="fa fa-chevron-left" aria-hidden="true"></i> Overview</a><br/>
|
||||
<br/><h3>virtual host config</h3><br/>
|
||||
<a title="Virtual host: <?php echo $vhost;?>.conf" target="_blank" href="/vhost.d/<?php echo $vhost;?>.conf">
|
||||
<i class="fa fa-external-link" aria-hidden="true"></i> <?php echo $vhost;?>.conf
|
||||
</a>
|
||||
<br/><br/><h3>vhost-gen config</h3><br/>
|
||||
<code><?php echo $tpl; ?></code><br/><br/>
|
||||
<?php $lines = file($tpl); ?>
|
||||
<pre style="border: 1px solid black; padding:5px;"><code><?php foreach ($lines as $line): ?><?php echo $line; ?><?php endforeach; ?></code></pre>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
@ -66,6 +66,10 @@
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.2">docker-php-fpm-8.2</a></td>
|
||||
<td>PHP 8.2 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.3">docker-php-fpm-8.3</a></td>
|
||||
<td>PHP 8.3 base images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm">docker-php-fpm</a></td>
|
||||
<td>PHP-FPM Devilbox images (<code>amd64</code> and <code>arm64</code>)</td>
|
||||
|
@ -26,31 +26,93 @@
|
||||
<th>DocumentRoot</th>
|
||||
<th>Backend</th>
|
||||
<th>Config</th>
|
||||
<th>Valid</th>
|
||||
<th>URL</th>
|
||||
<th style="width:60px;">Valid</th>
|
||||
<th style="width:260px;">URL</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$totals = 0;
|
||||
$filler = ' ';
|
||||
for ($i=0; $i<$totals; $i++) {
|
||||
$filler = $filler. ' ';
|
||||
}
|
||||
?>
|
||||
<?php foreach ($vHosts as $vHost): ?>
|
||||
<tr>
|
||||
<td><?php echo $vHost['name'];?></td>
|
||||
<td><?php echo loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR');?>/<?php echo $vHost['name'];?>/<?php echo loadClass('Helper')->getEnv('HTTPD_DOCROOT_DIR');?></td>
|
||||
<td><?php echo loadClass('Httpd')->getVhostBackend($vHost['name']); ?></td>
|
||||
<td>
|
||||
<a title="Virtual host: <?php echo $vHost['name'];?>.conf" target="_blank" href="/vhost.d/<?php echo $vHost['name'];?>.conf"><i class="fa fa-cog" aria-hidden="true"></i></a>
|
||||
<?php if (($vhostGen = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
|
||||
<a title="vhost-gen: <?php echo basename($vhostGen);?> for <?php echo $vHost['name'];?>" href="/info_vhostgen.php?name=<?php echo $vHost['name'];?>"><i class="fa fa-filter" aria-hidden="true"></i></a>
|
||||
<?php $id_vhost_httpd = str_replace('=', '', base64_encode('vhost_httpd_conf_' . $vHost['name'])); ?>
|
||||
<?php $id_vhost_vhostgen = str_replace('=', '', base64_encode('vhost_vhost_gen_' . $vHost['name'])); ?>
|
||||
|
||||
<!-- [httpd.conf] Button trigger modal -->
|
||||
<a href="#"><i class="fa fa-cog" aria-hidden="true" data-toggle="modal" data-target="#<?php echo $id_vhost_httpd;?>"></i></a>
|
||||
<!-- [httpd.conf] Modal -->
|
||||
<div class="modal" id="<?php echo $id_vhost_httpd;?>" tabindex="-1" role="dialog" aria-labelledby="<?php echo $id_vhost_httpd;?>Label" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="<?php echo $id_vhost_httpd;?>Label"><?php echo '<strong>httpd.conf: </strong><code>'.$vHost['name'].'.'.loadClass('Httpd')->getTldSuffix(). '</code>'; ?></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<?php $url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]"; ?>
|
||||
<?php $src = file_get_contents($url.'/vhost.d/' . $vHost['name'] . '.conf'); ?>
|
||||
<?php //$src = htmlentities($src); ?>
|
||||
<?php $src = str_replace('<', '<', $src); ?>
|
||||
<?php $src = str_replace('>', '>', $src); ?>
|
||||
<?php $src = preg_replace('/<(\/?.*)>/m', '<strong><\1></strong>', $src); // Apache directives ?>
|
||||
<?php $src = preg_replace('/(.*{\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
|
||||
<?php $src = preg_replace('/^(\s*}\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
|
||||
<?php //$src = preg_replace('/"(.+)"/m', '<span style="color: blue;">"\1"</span>', $src); ?>
|
||||
<?php $src = preg_replace('/^(\s*(?!<#)[^#"]*)"(.*)"/m', '\1<span style="color: blue;">"\2"</span>', $src); // double quotes?>
|
||||
<?php $src = preg_replace("/^(\s*(?!<#)[^#']*)'(.*)'/m", '\1<span style="color: blue;">"\2"</span>', $src); // single quotes ?>
|
||||
<?php $src = preg_replace('/^(\s*#)(.*)$/m', '<span style="color: gray;">\1\2</span>', $src); // comments ?>
|
||||
<?php echo '<pre><code>' . $src . '</code></pre>';?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if (($vhostGenPath = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
|
||||
<!-- [vhost-gen] Button trigger modal -->
|
||||
<a href="#"><i class="fa fa-filter" aria-hidden="true" data-toggle="modal" data-target="#<?php echo $id_vhost_vhostgen;?>"></i></a>
|
||||
<!-- [vhost-gen] Modal -->
|
||||
<div class="modal" id="<?php echo $id_vhost_vhostgen;?>" tabindex="-1" role="dialog" aria-labelledby="<?php echo $id_vhost_vhostgen;?>Label" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="<?php echo $id_vhost_vhostgen;?>Label"><?php echo '<code>'.$vhostGenPath.'</code>'; ?></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<?php $src = file_get_contents($vhostGenPath); ?>
|
||||
<?php //$src = htmlentities($src); ?>
|
||||
<?php $src = str_replace('<', '<', $src); ?>
|
||||
<?php $src = str_replace('>', '>', $src); ?>
|
||||
<?php $src = preg_replace('/<(\/?.*)>/m', '<strong><\1></strong>', $src); // Apache directives ?>
|
||||
<?php $src = preg_replace('/(.*{\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
|
||||
<?php $src = preg_replace('/^(\s*}\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
|
||||
<?php //$src = preg_replace('/"(.+)"/m', '<span style="color: blue;">"\1"</span>', $src); ?>
|
||||
<?php //$src = preg_replace("/'(.+)'/m", '<span style="color: blue;">'."'".'\1'."'".'</span>', $src); ?>
|
||||
<?php $src = preg_replace('/^(\s*(?!<#)[^#"]*)"(.*)"/m', '\1<span style="color: blue;">"\2"</span>', $src); // double quotes ?>
|
||||
<?php $src = preg_replace("/^(\s*(?!<#)[^#']*)'(.*)'/m", '\1<span style="color: blue;">"\2"</span>', $src); // single quotes ?>
|
||||
<?php $src = preg_replace('/^(\s*#)(.*)$/m', '<span style="color: gray;">\1\2</span>', $src); // comments ?>
|
||||
<?php $src = preg_replace('/^(\s*[_a-z]+):/m', '<span style="color: green;"><strong>\1</strong></span>:', $src); // yaml keys ?>
|
||||
<?php $src = preg_replace('/(__[_A-Z]+__)/m', '<span style="color: red;">\1</span>', $src); // variables ?>
|
||||
<?php echo '<pre><code>' . $src . '</code></pre>';?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>"> </td>
|
||||
<td id="href-<?php echo $vHost['name'];?>"><?php echo $filler;?></td>
|
||||
<td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>"></td>
|
||||
<td id="href-<?php echo $vHost['name'];?>"></td>
|
||||
</tr>
|
||||
<input type="hidden" name="vhost[]" class="vhost" value="<?php echo $vHost['name'];?>" />
|
||||
<?php endforeach; ?>
|
||||
@ -65,6 +127,60 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$cmd="netstat -wneeplt 2>/dev/null | sort | grep '\s1000\s' | awk '{print \"app=\"\$9\"|addr=\"\$4}' | sed 's/\(app=\)\([0-9]*\/\)/\\1/g' | sed 's/\(.*\)\(:[0-9][0-9]*\)/\\1|port=\\2/g' | sed 's/port=:/port=/g'";
|
||||
$output=loadClass('Helper')->exec($cmd);
|
||||
$daemons = array();
|
||||
foreach (preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
|
||||
$section = preg_split("/\|/", $line);
|
||||
if (count($section) == 3) {
|
||||
$tool = preg_split("/=/", $section[0]);
|
||||
$addr = preg_split("/=/", $section[1]);
|
||||
$port = preg_split("/=/", $section[2]);
|
||||
$tool = $tool[1];
|
||||
$addr = $addr[1];
|
||||
$port = $port[1];
|
||||
$daemons[] = array(
|
||||
'tool' => $tool,
|
||||
'addr' => $addr,
|
||||
'port' => $port
|
||||
);
|
||||
}
|
||||
}
|
||||
?>
|
||||
<?php if (count($daemons)): ?>
|
||||
<br/>
|
||||
<br/>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<h2>Local listening daemons</h2>
|
||||
<table class="table table-striped">
|
||||
<thead class="thead-inverse">
|
||||
<tr>
|
||||
<th>Application</th>
|
||||
<th>Listen Address</th>
|
||||
<th>Listen Port</th>
|
||||
<th>Host</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($daemons as $daemon): ?>
|
||||
<tr>
|
||||
<td><?php echo $daemon['tool']; ?></td>
|
||||
<td><?php echo $daemon['addr']; ?></td>
|
||||
<td><?php echo $daemon['port']; ?></td>
|
||||
<td>php (172.16.238.10)</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
@ -83,7 +199,7 @@
|
||||
var el_valid;
|
||||
var el_href;
|
||||
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
if (this.readyState == 4 && this.status == 200 || this.status == 426) {
|
||||
el_valid = document.getElementById('valid-' + vhost);
|
||||
el_href = document.getElementById('href-' + vhost);
|
||||
error = this.responseText;
|
||||
@ -129,13 +245,14 @@
|
||||
var el_href = document.getElementById('href-' + vhost);
|
||||
var error = this.responseText;
|
||||
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
if (this.readyState == 4 && (this.status == 200 || this.status == 426)) {
|
||||
clearTimeout(xmlHttpTimeout);
|
||||
el_valid.className += ' bg-success';
|
||||
if (el_valid.innerHTML != 'WARN') {
|
||||
el_valid.innerHTML = 'OK';
|
||||
}
|
||||
el_href.innerHTML = '<a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>' + el_href.innerHTML;
|
||||
//el_href.innerHTML = '(<a target="_blank" href="'+proto+'//localhost/devilbox-project/'+name+'">ext</a>) <a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>' + el_href.innerHTML;
|
||||
el_href.innerHTML = '<a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>';
|
||||
} else {
|
||||
//console.log(vhost);
|
||||
}
|
||||
|
@ -29,10 +29,18 @@ class Httpd extends BaseClass implements BaseInterface
|
||||
$url = 'http://'.$domain;
|
||||
$error = array();
|
||||
|
||||
// 1. Check htdocs folder
|
||||
if (!$this->_is_valid_dir($docroot)) {
|
||||
$error[] = 'error';
|
||||
$error[] = 'Missing <strong>'.$htdocs.'</strong> directory in: <strong>'.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/</strong>';
|
||||
|
||||
$backend = $this->getVhostBackend($vhost);
|
||||
$pos_def = strpos($backend, 'default');
|
||||
$pos_phpfpm = strpos($backend, 'tcp://');
|
||||
|
||||
// Only if backend 'default' or 'phpfpm', we need a htdocs/ directory
|
||||
if ( ($pos_def !== false && $pos_def == 0) || ($pos_phpfpm !== false && $pos_phpfpm == 0) ) {
|
||||
// 1. Check htdocs folder
|
||||
if (!$this->_is_valid_dir($docroot)) {
|
||||
$error[] = 'error';
|
||||
$error[] = 'Missing <strong>'.$htdocs.'</strong> directory in: <strong>'.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/</strong>';
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Check internal DNS server
|
||||
|
@ -140,6 +140,11 @@ class Php extends BaseClass implements BaseInterface
|
||||
$output = loadClass('Helper')->exec('wp --version 2>/dev/null | grep -i ^WP', $output);
|
||||
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
|
||||
}
|
||||
public function getWscatVersion()
|
||||
{
|
||||
$output = loadClass('Helper')->exec('wscat --version 2>/dev/null | head -1', $output);
|
||||
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
|
||||
}
|
||||
public function getYarnVersion()
|
||||
{
|
||||
$output = loadClass('Helper')->exec('yarn --version 2>/dev/null', $output);
|
||||
|
104
.devilbox/www/include/vendor/Mail/mimeDecode.php
vendored
104
.devilbox/www/include/vendor/Mail/mimeDecode.php
vendored
@ -28,8 +28,8 @@
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* - Neither the name of the authors, nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this
|
||||
* - Neither the name of the authors, nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
@ -142,11 +142,11 @@ class Mail_mimeDecode extends PEAR
|
||||
/**
|
||||
* Flag to determine whether to decode headers
|
||||
* (set to UTF8 to iconv convert headers)
|
||||
* @var mixed
|
||||
* @var mixed
|
||||
* @access private
|
||||
*/
|
||||
var $_decode_headers;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Flag to determine whether to include attached messages
|
||||
@ -182,7 +182,7 @@ class Mail_mimeDecode extends PEAR
|
||||
{
|
||||
$this->__construct($input);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Begins the decoding process. If called statically
|
||||
@ -197,7 +197,7 @@ class Mail_mimeDecode extends PEAR
|
||||
* of the parts. (Transfer encoding)
|
||||
* decode_headers - Whether to decode headers,
|
||||
* - use "UTF8//IGNORE" to convert charset.
|
||||
*
|
||||
*
|
||||
* input - If called statically, this will be treated
|
||||
* as the input
|
||||
* @return object Decoded results
|
||||
@ -229,17 +229,17 @@ class Mail_mimeDecode extends PEAR
|
||||
$params['decode_headers'] : false;
|
||||
$this->_rfc822_bodies = isset($params['rfc_822bodies']) ?
|
||||
$params['rfc_822bodies'] : false;
|
||||
|
||||
|
||||
if (is_string($this->_decode_headers) && !function_exists('iconv')) {
|
||||
PEAR::raiseError('header decode conversion requested, however iconv is missing');
|
||||
}
|
||||
|
||||
|
||||
$structure = $this->_decode($this->_header, $this->_body);
|
||||
if ($structure === false) {
|
||||
$structure = $this->raiseError($this->_error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $structure;
|
||||
}
|
||||
|
||||
@ -320,10 +320,10 @@ class Mail_mimeDecode extends PEAR
|
||||
$encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
|
||||
$this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null;
|
||||
break;
|
||||
|
||||
|
||||
case 'multipart/signed': // PGP
|
||||
$parts = $this->_boundarySplit($body, $content_type['other']['boundary'], true);
|
||||
$return->parts['msg_body'] = $parts[0];
|
||||
$return->parts['msg_body'] = $parts[0];
|
||||
list($part_header, $part_body) = $this->_splitBodyHeader($parts[1]);
|
||||
$return->parts['sig_hdr'] = $part_header;
|
||||
$return->parts['sig_body'] = $part_body;
|
||||
@ -404,7 +404,7 @@ class Mail_mimeDecode extends PEAR
|
||||
}
|
||||
for ($i = 0; $i < count($structure->parts); $i++) {
|
||||
|
||||
|
||||
|
||||
if (!empty($structure->headers['content-type']) AND substr(strtolower($structure->headers['content-type']), 0, 8) == 'message/') {
|
||||
$prepend = $prepend . $mime_number . '.';
|
||||
$_mime_number = '';
|
||||
@ -424,7 +424,7 @@ class Mail_mimeDecode extends PEAR
|
||||
$structure->mime_id = $prepend . $mime_number;
|
||||
$no_refs ? $return[$prepend . $mime_number] = '' : $return[$prepend . $mime_number] = &$structure;
|
||||
}
|
||||
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
@ -442,7 +442,7 @@ class Mail_mimeDecode extends PEAR
|
||||
if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $input, $match)) {
|
||||
return array($match[1], $match[2]);
|
||||
}
|
||||
// bug #17325 - empty bodies are allowed. - we just check that at least one line
|
||||
// bug #17325 - empty bodies are allowed. - we just check that at least one line
|
||||
// of headers exist..
|
||||
if (count(explode("\n",$input))) {
|
||||
return array($input, '');
|
||||
@ -466,11 +466,11 @@ class Mail_mimeDecode extends PEAR
|
||||
// Unfold the input
|
||||
$input = preg_replace("/\r?\n/", "\r\n", $input);
|
||||
//#7065 - wrapping.. with encoded stuff.. - probably not needed,
|
||||
// wrapping space should only get removed if the trailing item on previous line is a
|
||||
// wrapping space should only get removed if the trailing item on previous line is a
|
||||
// encoded character
|
||||
$input = preg_replace("/=\r\n(\t| )+/", '=', $input);
|
||||
$input = preg_replace("/\r\n(\t| )+/", ' ', $input);
|
||||
|
||||
|
||||
$headers = explode("\r\n", trim($input));
|
||||
$got_start = false;
|
||||
foreach ($headers as $value) {
|
||||
@ -485,7 +485,7 @@ class Mail_mimeDecode extends PEAR
|
||||
$got_start = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$hdr_name = substr($value, 0, $pos = strpos($value, ':'));
|
||||
$hdr_value = substr($value, $pos+1);
|
||||
if($hdr_value[0] == ' ') {
|
||||
@ -520,7 +520,7 @@ class Mail_mimeDecode extends PEAR
|
||||
* filename*0*=ENC'lang'urlencoded data.
|
||||
* filename*1*=ENC'lang'urlencoded data.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param string Header value to parse
|
||||
* @return array Contains parsed result
|
||||
@ -554,7 +554,7 @@ class Mail_mimeDecode extends PEAR
|
||||
$lq = ''; // last quote..
|
||||
|
||||
while ($i < $l) {
|
||||
|
||||
|
||||
$c = $input[$i];
|
||||
//var_dump(array('i'=>$i,'c'=>$c,'q'=>$q, 'lq'=>$lq, 'key'=>$key, 'val' =>$val));
|
||||
|
||||
@ -566,7 +566,7 @@ class Mail_mimeDecode extends PEAR
|
||||
}
|
||||
$escaped = true;
|
||||
$c = $input[$i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// state - in key..
|
||||
@ -588,7 +588,7 @@ class Mail_mimeDecode extends PEAR
|
||||
$i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// state - in value.. (as $val is set..)
|
||||
|
||||
if ($q === false) {
|
||||
@ -597,10 +597,10 @@ class Mail_mimeDecode extends PEAR
|
||||
$i++;
|
||||
continue; // skip leading spaces after '=' or after '"'
|
||||
}
|
||||
|
||||
// do not de-quote 'xxx*= itesm..
|
||||
|
||||
// do not de-quote 'xxx*= itesm..
|
||||
$key_is_trans = $key[strlen($key)-1] == '*';
|
||||
|
||||
|
||||
if (!$key_is_trans && !$escaped && ($c == '"' || $c == "'")) {
|
||||
// start quoted area..
|
||||
$q = $c;
|
||||
@ -612,7 +612,7 @@ class Mail_mimeDecode extends PEAR
|
||||
}
|
||||
// got end....
|
||||
if (!$escaped && $c == ';') {
|
||||
|
||||
|
||||
$return['other'][$key] = trim($val);
|
||||
$val = false;
|
||||
$key = '';
|
||||
@ -625,31 +625,31 @@ class Mail_mimeDecode extends PEAR
|
||||
$i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// state - in quote..
|
||||
if (!$escaped && $c == $q) { // potential exit state..
|
||||
|
||||
|
||||
// end of quoted string..
|
||||
$lq = $q;
|
||||
$q = false;
|
||||
$i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// normal char inside of quoted string..
|
||||
$val.= $c;
|
||||
$i++;
|
||||
}
|
||||
|
||||
|
||||
// do we have anything left..
|
||||
if (strlen(trim($key)) || $val !== false) {
|
||||
|
||||
|
||||
$val = trim($val);
|
||||
|
||||
|
||||
$return['other'][$key] = $val;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$clean_others = array();
|
||||
// merge added values. eg. *1[*]
|
||||
foreach($return['other'] as $key =>$val) {
|
||||
@ -659,12 +659,12 @@ class Mail_mimeDecode extends PEAR
|
||||
$clean_others[$key] .= $val;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
$clean_others[$key] = $val;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// handle language translation of '*' ending others.
|
||||
foreach( $clean_others as $key =>$val) {
|
||||
if ( $key[strlen($key)-1] != '*') {
|
||||
@ -677,26 +677,26 @@ class Mail_mimeDecode extends PEAR
|
||||
// extended-other-values
|
||||
$match = array();
|
||||
$info = preg_match("/^([^']+)'([^']*)'(.*)$/", $val, $match);
|
||||
|
||||
|
||||
$clean_others[$key] = urldecode($match[3]);
|
||||
$clean_others[strtolower($key)] = $clean_others[$key];
|
||||
$clean_others[strtolower($key).'-charset'] = $match[1];
|
||||
$clean_others[strtolower($key).'-language'] = $match[2];
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$return['other'] = $clean_others;
|
||||
|
||||
|
||||
// decode values.
|
||||
foreach($return['other'] as $key =>$val) {
|
||||
$charset = isset($return['other'][$key . '-charset']) ?
|
||||
$return['other'][$key . '-charset'] : false;
|
||||
|
||||
|
||||
$return['other'][$key] = $this->_decodeHeader($val, $charset);
|
||||
}
|
||||
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
@ -729,7 +729,7 @@ class Mail_mimeDecode extends PEAR
|
||||
$parts[] = $tmp[$i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// add the last part on if it does not end with the 'closing indicator'
|
||||
if (!empty($tmp[$len]) && strlen(trim($tmp[$len])) && $tmp[$len][0] != '-') {
|
||||
$parts[] = $tmp[$len];
|
||||
@ -781,12 +781,12 @@ class Mail_mimeDecode extends PEAR
|
||||
}
|
||||
$input = str_replace($encoded, $text, $input);
|
||||
}
|
||||
|
||||
|
||||
if ($default_charset && is_string($this->_decode_headers)) {
|
||||
$conv = @iconv($charset, $this->_decode_headers, $input);
|
||||
$input = ($conv === false) ? $input : $conv;
|
||||
}
|
||||
|
||||
|
||||
return $input;
|
||||
}
|
||||
|
||||
@ -832,10 +832,12 @@ class Mail_mimeDecode extends PEAR
|
||||
// Remove soft line breaks
|
||||
$input = preg_replace("/=\r?\n/", '', $input);
|
||||
|
||||
// cytopia edit
|
||||
if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
|
||||
$cb = function($matches) {
|
||||
return chr(hexdec($matches[0]));
|
||||
// cytopia edit (added ctype_xdigit() check around)
|
||||
if (ctype_xdigit($matches[0])) {
|
||||
return chr(hexdec($matches[0]));
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// Replace encoded characters
|
||||
@ -924,7 +926,7 @@ class Mail_mimeDecode extends PEAR
|
||||
|
||||
/**
|
||||
* getSendArray() returns the arguments required for Mail::send()
|
||||
* used to build the arguments for a mail::send() call
|
||||
* used to build the arguments for a mail::send() call
|
||||
*
|
||||
* Usage:
|
||||
* $mailtext = Full email (for example generated by a template)
|
||||
@ -966,7 +968,7 @@ class Mail_mimeDecode extends PEAR
|
||||
}
|
||||
$to = substr($to,1);
|
||||
return array($to,$header,$this->_body);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a xml copy of the output of
|
||||
|
2
.github/workflows/documentation.yml
vendored
2
.github/workflows/documentation.yml
vendored
@ -36,7 +36,7 @@ jobs:
|
||||
target:
|
||||
- build
|
||||
- linkcheck
|
||||
- linkcheck2
|
||||
# - linkcheck2
|
||||
|
||||
name: "[Docs ${{ matrix.target }}]"
|
||||
steps:
|
||||
|
@ -6,12 +6,24 @@ endif
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Misc Targets
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
update-readme:
|
||||
.PHONY: update-readme
|
||||
update-readme: _update-readme-modules
|
||||
update-readme: _update-readme-tools
|
||||
|
||||
.PHONY: _update-readme-modules
|
||||
_update-readme-modules:
|
||||
cat "../README.md" \
|
||||
| perl -0 -pe "s#<!-- modules -->.*<!-- /modules -->#<!-- modules -->\n$$(./scripts/get-modules.sh)\n<!-- /modules -->#s" \
|
||||
> "../README.md.tmp"
|
||||
yes | mv -f "../README.md.tmp" "../README.md"
|
||||
|
||||
.PHONY: _update-readme-tools
|
||||
_update-readme-tools:
|
||||
cat "../README.md" \
|
||||
| perl -0 -pe "s#<!-- tools -->.*<!-- /tools -->#<!-- tools -->\n$$(./scripts/get-tools.sh)\n<!-- /tools -->#s" \
|
||||
> "../README.md.tmp"
|
||||
yes | mv -f "../README.md.tmp" "../README.md"
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Linting Targets
|
||||
|
@ -94,7 +94,7 @@ MODS="$( echo "${PHP52_MODS}, ${PHP53_MODS}, ${PHP54_MODS}, ${PHP55_MODS}, ${PHP
|
||||
###
|
||||
### Get disabled modules
|
||||
###
|
||||
DISABLED=",blackfire,ioncube,phalcon,psr,$( grep -E '^PHP_MODULES_DISABLE=' "${DVLBOX_PATH}/env-example" | sed 's/.*=//g' ),"
|
||||
DISABLED=",blackfire,ioncube,phalcon,psr,xhprof,$( grep -E '^PHP_MODULES_DISABLE=' "${DVLBOX_PATH}/env-example" | sed 's/.*=//g' ),"
|
||||
#echo $DISABLED
|
||||
B="✔" # Enabled base modules (cannot be disabled)
|
||||
E="🗸" # Enabled mods modules (can be disabled)
|
||||
|
25
.tests/scripts/get-tools.sh
Executable file
25
.tests/scripts/get-tools.sh
Executable file
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# NOTE: Parsing curl to tac to circumnvent "failed writing body"
|
||||
# https://stackoverflow.com/questions/16703647/why-curl-return-and-error-23-failed-writing-body
|
||||
|
||||
set -e
|
||||
set -u
|
||||
set -o pipefail
|
||||
|
||||
SCRIPT_PATH="$( cd "$(dirname "$0")" && pwd -P )"
|
||||
DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
|
||||
# shellcheck disable=SC1090
|
||||
. "${SCRIPT_PATH}/.lib.sh"
|
||||
|
||||
RETRIES=10
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# FUNCTIONS
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
PHP_TAG="$( grep 'devilbox/php' "${DVLBOX_PATH}/docker-compose.yml" | sed 's/^.*-work-//g' )"
|
||||
PHP_TOOLS="$( run "curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/doc/available-tools.md'" "${RETRIES}" )";
|
||||
|
||||
echo "${PHP_TOOLS}" | grep -A 1000000 'TOOLS_WORK_START'
|
@ -54,7 +54,7 @@ fi
|
||||
HOST_PORT_HTTPD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HOST_PORT_HTTPD" )"
|
||||
TLD_SUFFIX="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "TLD_SUFFIX" )"
|
||||
HTTPD_DOCROOT_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_DOCROOT_DIR" )"
|
||||
HTTPD_TEMPLATE_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_TEMPLATE_DIR" )"
|
||||
#HTTPD_TEMPLATE_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_TEMPLATE_DIR" )"
|
||||
|
||||
|
||||
###
|
||||
@ -128,14 +128,14 @@ fi
|
||||
###
|
||||
### Vhost config link is available
|
||||
###
|
||||
printf "[TEST] vhost.d config link is available"
|
||||
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'vhost.d/${VHOST}.conf' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
printf "\\r[FAIL] vhost.d config link is available\\n"
|
||||
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
|
||||
exit 1
|
||||
else
|
||||
printf "\\r[OK] vhost.d config link is available\\n"
|
||||
fi
|
||||
#printf "[TEST] vhost.d config link is available"
|
||||
#if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'vhost.d/${VHOST}.conf' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
# printf "\\r[FAIL] vhost.d config link is available\\n"
|
||||
# run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
|
||||
# exit 1
|
||||
#else
|
||||
# printf "\\r[OK] vhost.d config link is available\\n"
|
||||
#fi
|
||||
|
||||
|
||||
###
|
||||
@ -154,62 +154,62 @@ fi
|
||||
###
|
||||
### vhost-gen config link should appear
|
||||
###
|
||||
run "docker-compose exec --user devilbox -T php mkdir -p /shared/httpd/${VHOST}/${HTTPD_TEMPLATE_DIR}" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache22.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" "${RETRIES}"
|
||||
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache24.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" "${RETRIES}"
|
||||
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/nginx.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" "${RETRIES}"
|
||||
|
||||
printf "[TEST] vhost-gen config link is available"
|
||||
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'info_vhostgen.php?name=${VHOST}' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
printf "\\r[FAIL] vhost-gen config link is available\\n"
|
||||
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
|
||||
exit 1
|
||||
else
|
||||
printf "\\r[OK] vhost-gen config link is available\\n"
|
||||
fi
|
||||
#run "docker-compose exec --user devilbox -T php mkdir -p /shared/httpd/${VHOST}/${HTTPD_TEMPLATE_DIR}" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
#run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache22.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" "${RETRIES}"
|
||||
#run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache24.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" "${RETRIES}"
|
||||
#run "cp ${DVLBOX_PATH}/cfg/vhost-gen/nginx.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" "${RETRIES}"
|
||||
#
|
||||
#printf "[TEST] vhost-gen config link is available"
|
||||
#if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'info_vhostgen.php?name=${VHOST}' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
# printf "\\r[FAIL] vhost-gen config link is available\\n"
|
||||
# run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
|
||||
# exit 1
|
||||
#else
|
||||
# printf "\\r[OK] vhost-gen config link is available\\n"
|
||||
#fi
|
||||
|
||||
|
||||
###
|
||||
### vhost-gen config should be available
|
||||
###
|
||||
printf "[TEST] vhost-gen config is available"
|
||||
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__VHOST_NAME__' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
printf "\\r[FAIL] vhost-gen config is available\\n"
|
||||
run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
|
||||
exit 1
|
||||
else
|
||||
printf "\\r[OK] vhost-gen config is available\\n"
|
||||
fi
|
||||
#printf "[TEST] vhost-gen config is available"
|
||||
#if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__VHOST_NAME__' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
# printf "\\r[FAIL] vhost-gen config is available\\n"
|
||||
# run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
|
||||
# exit 1
|
||||
#else
|
||||
# printf "\\r[OK] vhost-gen config is available\\n"
|
||||
#fi
|
||||
|
||||
|
||||
###
|
||||
### vhost-gen config changes are shown in intranet
|
||||
###
|
||||
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml"
|
||||
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml"
|
||||
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml"
|
||||
|
||||
printf "[TEST] vhost-gen config changes are shown"
|
||||
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__MY_GREP_VALUE__' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
printf "\\r[FAIL] vhost-gen config changes are shown\\n"
|
||||
run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
|
||||
exit 1
|
||||
else
|
||||
printf "\\r[OK] vhost-gen config changes are shown\\n"
|
||||
fi
|
||||
#replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml"
|
||||
#replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml"
|
||||
#replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml"
|
||||
#
|
||||
#printf "[TEST] vhost-gen config changes are shown"
|
||||
#if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__MY_GREP_VALUE__' >/dev/null" "${RETRIES}" "" "0"; then
|
||||
# printf "\\r[FAIL] vhost-gen config changes are shown\\n"
|
||||
# run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
|
||||
# exit 1
|
||||
#else
|
||||
# printf "\\r[OK] vhost-gen config changes are shown\\n"
|
||||
#fi
|
||||
|
||||
|
||||
###
|
||||
### Vhost disappears after removing its dir
|
||||
###
|
||||
run "docker-compose exec --user devilbox -T php rm -rf /shared/httpd/${VHOST}" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
run "sleep 4"
|
||||
|
||||
printf "[TEST] vhost disappears after removing its dir"
|
||||
if ! run "test \"\$(curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep -c '${VHOST}')\" = \"0\"" "${RETRIES}" "" "0"; then
|
||||
printf "\\r[FAIL] vhost disappears after removing its dir\\n"
|
||||
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep '${VHOST}' || true"
|
||||
exit 1
|
||||
else
|
||||
printf "\\r[OK] vhost disappears after removing its dir\\n"
|
||||
fi
|
||||
#run "docker-compose exec --user devilbox -T php rm -rf /shared/httpd/${VHOST}" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
#run "sleep 4"
|
||||
#
|
||||
#printf "[TEST] vhost disappears after removing its dir"
|
||||
#if ! run "test \"\$(curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep -c '${VHOST}')\" = \"0\"" "${RETRIES}" "" "0"; then
|
||||
# printf "\\r[FAIL] vhost disappears after removing its dir\\n"
|
||||
# run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep '${VHOST}' || true"
|
||||
# exit 1
|
||||
#else
|
||||
# printf "\\r[OK] vhost disappears after removing its dir\\n"
|
||||
#fi
|
||||
|
60
CHANGELOG.md
60
CHANGELOG.md
@ -6,6 +6,66 @@ Make sure to have a look at [UPDATING.md](https://github.com/cytopia/devilbox/bl
|
||||
## Unreleased
|
||||
|
||||
|
||||
## Release v3.0.0-beta-0.3 (2022-01-02)
|
||||
|
||||
This release provides the `dvl.to` domain to be used with `TLD_SUFFIX` (set to default), which eliminates the need to set any entries in `/etc/hosts`, as all of its subdomain will point to `127.0.0.1` via official DNS. Domain has been acquired thanks to awesome sponsors!
|
||||
|
||||
### Fixed
|
||||
- Intranet: mail.php fixed deprecation warnings [#798](https://github.com/cytopia/devilbox/issues/798)
|
||||
- Added `host.docker.internal` to extra_hosts to be able to connect to the host system [#919](https://github.com/cytopia/devilbox/issues/919)
|
||||
|
||||
### Changed
|
||||
- Use `dvl.to` as default `TLD_SUFFIX` (it always poits to `127.0.0.1` removing the need to create `/etc/hosts` entries)
|
||||
|
||||
### Added
|
||||
- Intranet: vhost overview shows listening ports
|
||||
- Intranet: vhost overview now has modals to show httpd and vhost-gen configs
|
||||
- Docs: Show available tools per version in README.md
|
||||
- Added `xhprof` PHP extension
|
||||
|
||||
|
||||
## Release v3.0.0-beta-0.2 (2022-12-27)
|
||||
|
||||
The Backend configuration now supports websockets as well:
|
||||
|
||||
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
|
||||
```bash
|
||||
# PHP-FPM backend
|
||||
conf:phpfpm:tcp:php80:9000
|
||||
|
||||
# HTTP Reverse Proxy backend
|
||||
conf:rproxy:http:172.16.238.10:3000
|
||||
|
||||
# HTTPS Reverse Proxy backend
|
||||
conf:rproxy:https:172.16.238.10:3000
|
||||
|
||||
# Websocket Reverse Proxy backend
|
||||
conf:rproxy:ws:172.16.238.10:3000
|
||||
|
||||
# SSL Websocket Reverse Proxy backend
|
||||
conf:rproxy:wss:172.16.238.10:3000
|
||||
```
|
||||
|
||||
Once you're done with `backend.cfg` changes, head over to the Intranet C&C page (http://localhost/cnc.php) and Reload `watcherd`.
|
||||
|
||||
|
||||
### Fixed
|
||||
- Intranet: vhost overview: allow HTTP 426 to succeed in vhost page (websocket projects)
|
||||
- Intranet: vhost overview: Reverse Proxy or Websocket backends do not require a `htdocs/` dir for healthcheck
|
||||
- Fixed reverse proxy template generation for Apache 2.2 and Apache 2.4 [vhost-gen #51](https://github.com/devilbox/vhost-gen/pull/51)
|
||||
- Fixed Nginx hash bucket size length to allow long hostnames
|
||||
|
||||
### Added
|
||||
- Reverse Proxy automation for websocket projects (`ws://<host>:<port>` or `wss:<host>:<port>`) (Does not work with Apache 2.2)
|
||||
- Added tool `wscat` to be able to test websocket connections
|
||||
- Intranet: show `wscat` version
|
||||
- Intranet: vhost overview now also shows websocket projects
|
||||
|
||||
### Changed
|
||||
- Do not mount any startup/autostart script directories for multi-php compose as they do not contain tools
|
||||
- Updated vhost-gen templates in `cfg/vhost-gen` (replace your project templates with new ones)
|
||||
|
||||
|
||||
## Release v3.0.0-beta-0.1 (2022-12-24) 🎅🎄🎁
|
||||
|
||||
This is a beta release, using a completely rewritten set of HTTPD server, which allow easy reverse Proxy integration and different PHP versions per project:
|
||||
|
@ -34,10 +34,23 @@
|
||||
# __ERROR_LOG__
|
||||
#
|
||||
|
||||
###
|
||||
### Notes about Apache
|
||||
###
|
||||
|
||||
#
|
||||
# 1. Each same directive is checked in order of definition (last one wins)
|
||||
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
|
||||
# * Last match always takes precedence
|
||||
#
|
||||
# Exception: Directories, where shortest path is matched first
|
||||
# Exception: ProxyPass and Alias first match and then stops
|
||||
|
||||
###
|
||||
### Basic vHost skeleton
|
||||
###
|
||||
### Note: Reverse Proxy section must be last for Apache 2.2
|
||||
###
|
||||
vhost: |
|
||||
<VirtualHost __DEFAULT_VHOST__:__PORT__>
|
||||
ServerName __VHOST_NAME__
|
||||
@ -45,11 +58,17 @@ vhost: |
|
||||
CustomLog "__ACCESS_LOG__" combined
|
||||
ErrorLog "__ERROR_LOG__"
|
||||
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
ProxyRequests On
|
||||
# ProxyRequests: Disable "Forward Proxy"
|
||||
# ProxyPreserveHost: Pass "Host" header to remote
|
||||
# ProxyVia: Add "Via" header
|
||||
ProxyRequests Off
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://php:8000/
|
||||
ProxyPassReverse / http://php:8000/
|
||||
ProxyVia On
|
||||
<Location />
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
ProxyPass http://php:8000/ retry=0
|
||||
ProxyPassReverse http://php:8000/
|
||||
</Location>
|
||||
|
||||
__REDIRECT__
|
||||
__SSL__
|
||||
@ -92,6 +111,7 @@ features:
|
||||
# Alias Definition
|
||||
Alias "__ALIAS__" "__PATH____ALIAS__"
|
||||
<Location "__ALIAS__">
|
||||
ProxyPass !
|
||||
__XDOMAIN_REQ__
|
||||
</Location>
|
||||
<Directory "__PATH____ALIAS__">
|
||||
@ -101,10 +121,10 @@ features:
|
||||
|
||||
deny: |
|
||||
# Deny Definition
|
||||
<FilesMatch "__REGEX__">
|
||||
<LocationMatch "__REGEX__">
|
||||
Order allow,deny
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
</LocationMatch>
|
||||
|
||||
server_status: |
|
||||
# Status Page
|
||||
@ -114,13 +134,16 @@ features:
|
||||
Allow from all
|
||||
</Location>
|
||||
|
||||
# https://stackoverflow.com/a/42558499
|
||||
# https://fetch.spec.whatwg.org/#forbidden-header-name
|
||||
xdomain_request: |
|
||||
# Allow cross domain request from these hosts
|
||||
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
|
||||
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
|
||||
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
|
||||
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
|
||||
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
|
||||
Header always set Access-Control-Max-Age "0"
|
||||
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
|
||||
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
|
||||
RewriteEngine On
|
||||
RewriteCond %{REQUEST_METHOD} OPTIONS
|
||||
|
@ -40,10 +40,23 @@
|
||||
# __PHP_PORT__
|
||||
#
|
||||
|
||||
###
|
||||
### Notes about Apache
|
||||
###
|
||||
|
||||
#
|
||||
# 1. Each same directive is checked in order of definition (last one wins)
|
||||
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
|
||||
# * Last match always takes precedence
|
||||
#
|
||||
# Exception: Directories, where shortest path is matched first
|
||||
# Exception: ProxyPass and Alias first match and then stops
|
||||
|
||||
###
|
||||
### Basic vHost skeleton
|
||||
###
|
||||
### Note: Reverse Proxy section must be last for Apache 2.2
|
||||
###
|
||||
vhost: |
|
||||
<VirtualHost __DEFAULT_VHOST__:__PORT__>
|
||||
ServerName __VHOST_NAME__
|
||||
@ -54,13 +67,13 @@ vhost: |
|
||||
__REDIRECT__
|
||||
__SSL__
|
||||
__VHOST_DOCROOT__
|
||||
__VHOST_RPROXY__
|
||||
__PHP_FPM__
|
||||
__ALIASES__
|
||||
__DENIES__
|
||||
__SERVER_STATUS__
|
||||
# Custom directives
|
||||
__CUSTOM__
|
||||
__VHOST_RPROXY__
|
||||
</VirtualHost>
|
||||
|
||||
###
|
||||
@ -84,13 +97,38 @@ vhost_type:
|
||||
Allow from all
|
||||
</Directory>
|
||||
|
||||
# Reverse Proxy (-r)
|
||||
# Reverse Proxy (-r http(s)://ADDR:PORT)
|
||||
rproxy: |
|
||||
# Define the vhost to reverse proxy
|
||||
ProxyRequests On
|
||||
# ProxyRequests: Disable "Forward Proxy"
|
||||
# ProxyPreserveHost: Pass "Host" header to remote
|
||||
# ProxyVia: Add "Via" header
|
||||
ProxyRequests Off
|
||||
ProxyPreserveHost On
|
||||
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
|
||||
ProxyPassReverse __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
|
||||
ProxyVia On
|
||||
<Location __LOCATION__>
|
||||
# Reverse Proxy
|
||||
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
|
||||
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
|
||||
</Location>
|
||||
|
||||
# Reverse Proxy with websocket support (-r ws(s)://ADDR:PORT)
|
||||
rproxy_ws: |
|
||||
# ProxyRequests: Disable "Forward Proxy"
|
||||
# ProxyPreserveHost: Pass "Host" header to remote
|
||||
# ProxyVia: Add "Via" header
|
||||
ProxyRequests Off
|
||||
ProxyPreserveHost On
|
||||
ProxyVia On
|
||||
<Location __LOCATION__>
|
||||
# Websocket Rewrite Settings
|
||||
RewriteEngine On
|
||||
RewriteCond %{HTTP:Connection} Upgrade [NC]
|
||||
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||
RewriteRule ^/?(.*)$ __WS_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/$1 [P,L]
|
||||
# Reverse Proxy
|
||||
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
|
||||
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
|
||||
</Location>
|
||||
|
||||
|
||||
###
|
||||
@ -120,6 +158,7 @@ features:
|
||||
# Alias Definition
|
||||
Alias "__ALIAS__" "__PATH____ALIAS__"
|
||||
<Location "__ALIAS__">
|
||||
ProxyPass !
|
||||
__XDOMAIN_REQ__
|
||||
</Location>
|
||||
<Directory "__PATH____ALIAS__">
|
||||
@ -129,10 +168,10 @@ features:
|
||||
|
||||
deny: |
|
||||
# Deny Definition
|
||||
<FilesMatch "__REGEX__">
|
||||
<LocationMatch "__REGEX__">
|
||||
Order allow,deny
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
</LocationMatch>
|
||||
|
||||
server_status: |
|
||||
# Status Page
|
||||
@ -142,13 +181,16 @@ features:
|
||||
Allow from all
|
||||
</Location>
|
||||
|
||||
# https://stackoverflow.com/a/42558499
|
||||
# https://fetch.spec.whatwg.org/#forbidden-header-name
|
||||
xdomain_request: |
|
||||
# Allow cross domain request from these hosts
|
||||
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
|
||||
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
|
||||
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
|
||||
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
|
||||
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
|
||||
Header always set Access-Control-Max-Age "0"
|
||||
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
|
||||
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
|
||||
RewriteEngine On
|
||||
RewriteCond %{REQUEST_METHOD} OPTIONS
|
||||
|
@ -34,6 +34,17 @@
|
||||
# __ERROR_LOG__
|
||||
#
|
||||
|
||||
###
|
||||
### Notes about Apache
|
||||
###
|
||||
|
||||
#
|
||||
# 1. Each same directive is checked in order of definition (last one wins)
|
||||
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
|
||||
# * Last match always takes precedence
|
||||
#
|
||||
# Exception: Directories, where shortest path is matched first
|
||||
# Exception: ProxyPass and Alias first match and then stops
|
||||
|
||||
###
|
||||
### Basic vHost skeleton
|
||||
@ -46,11 +57,19 @@ vhost: |
|
||||
CustomLog "__ACCESS_LOG__" combined
|
||||
ErrorLog "__ERROR_LOG__"
|
||||
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
ProxyRequests On
|
||||
# ProxyRequests: Disable "Forward Proxy"
|
||||
# ProxyPreserveHost: Pass "Host" header to remote
|
||||
# ProxyAddHeaders: Add "X-Forward-*" headers
|
||||
# ProxyVia: Add "Via" header
|
||||
ProxyRequests Off
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://php:8000/
|
||||
ProxyPassReverse / http://php:8000/
|
||||
ProxyAddHeaders On
|
||||
ProxyVia On
|
||||
<Location />
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
ProxyPass http://php:8000/ retry=0
|
||||
ProxyPassReverse http://php:8000/
|
||||
</Location>
|
||||
|
||||
__REDIRECT__
|
||||
__SSL__
|
||||
@ -93,6 +112,7 @@ features:
|
||||
# Alias Definition
|
||||
Alias "__ALIAS__" "__PATH____ALIAS__"
|
||||
<Location "__ALIAS__">
|
||||
ProxyPass !
|
||||
__XDOMAIN_REQ__
|
||||
</Location>
|
||||
<Directory "__PATH____ALIAS__">
|
||||
@ -103,10 +123,10 @@ features:
|
||||
|
||||
deny: |
|
||||
# Deny Definition
|
||||
<FilesMatch "__REGEX__">
|
||||
<LocationMatch "__REGEX__">
|
||||
Order allow,deny
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
</LocationMatch>
|
||||
|
||||
server_status: |
|
||||
# Status Page
|
||||
@ -117,13 +137,16 @@ features:
|
||||
Require all granted
|
||||
</Location>
|
||||
|
||||
# https://stackoverflow.com/a/42558499
|
||||
# https://fetch.spec.whatwg.org/#forbidden-header-name
|
||||
xdomain_request: |
|
||||
# Allow cross domain request from these hosts
|
||||
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
|
||||
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
|
||||
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
|
||||
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
|
||||
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
|
||||
Header always set Access-Control-Max-Age "0"
|
||||
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
|
||||
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
|
||||
RewriteEngine On
|
||||
RewriteCond %{REQUEST_METHOD} OPTIONS
|
||||
|
@ -40,6 +40,17 @@
|
||||
# __PHP_PORT__
|
||||
#
|
||||
|
||||
###
|
||||
### Notes about Apache
|
||||
###
|
||||
|
||||
#
|
||||
# 1. Each same directive is checked in order of definition (last one wins)
|
||||
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
|
||||
# * Last match always takes precedence
|
||||
#
|
||||
# Exception: Directories, where shortest path is matched first
|
||||
# Exception: ProxyPass and Alias first match and then stops
|
||||
|
||||
###
|
||||
### Basic vHost skeleton
|
||||
@ -86,13 +97,42 @@ vhost_type:
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
# Reverse Proxy (-r)
|
||||
# Reverse Proxy (-r http(s)://ADDR:PORT)
|
||||
rproxy: |
|
||||
# Define the vhost to reverse proxy
|
||||
ProxyRequests On
|
||||
# ProxyRequests: Disable "Forward Proxy"
|
||||
# ProxyPreserveHost: Pass "Host" header to remote
|
||||
# ProxyAddHeaders: Add "X-Forward-*" headers
|
||||
# ProxyVia: Add "Via" header
|
||||
ProxyRequests Off
|
||||
ProxyPreserveHost On
|
||||
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
|
||||
ProxyPassReverse __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
|
||||
ProxyAddHeaders On
|
||||
ProxyVia On
|
||||
<Location __LOCATION__>
|
||||
# Reverse Proxy
|
||||
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
|
||||
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
|
||||
</Location>
|
||||
|
||||
# Reverse Proxy with websocket support (-r ws(s)://ADDR:PORT)
|
||||
rproxy_ws: |
|
||||
# ProxyRequests: Disable "Forward Proxy"
|
||||
# ProxyPreserveHost: Pass "Host" header to remote
|
||||
# ProxyAddHeaders: Add "X-Forward-*" headers
|
||||
# ProxyVia: Add "Via" header
|
||||
ProxyRequests Off
|
||||
ProxyPreserveHost On
|
||||
ProxyAddHeaders On
|
||||
ProxyVia On
|
||||
<Location __LOCATION__>
|
||||
# Websocket Rewrite Settings
|
||||
RewriteEngine On
|
||||
RewriteCond %{HTTP:Connection} Upgrade [NC]
|
||||
RewriteCond %{HTTP:Upgrade} websocket [NC]
|
||||
RewriteRule ^/?(.*)$ __WS_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/$1 [P,L]
|
||||
# Reverse Proxy
|
||||
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
|
||||
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
|
||||
</Location>
|
||||
|
||||
|
||||
###
|
||||
@ -141,6 +181,7 @@ features:
|
||||
# Alias Definition
|
||||
Alias "__ALIAS__" "__PATH____ALIAS__"
|
||||
<Location "__ALIAS__">
|
||||
ProxyPass !
|
||||
__XDOMAIN_REQ__
|
||||
</Location>
|
||||
<Directory "__PATH____ALIAS__">
|
||||
@ -151,10 +192,10 @@ features:
|
||||
|
||||
deny: |
|
||||
# Deny Definition
|
||||
<FilesMatch "__REGEX__">
|
||||
<LocationMatch "__REGEX__">
|
||||
Order allow,deny
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
</LocationMatch>
|
||||
|
||||
server_status: |
|
||||
# Status Page
|
||||
@ -165,13 +206,16 @@ features:
|
||||
Require all granted
|
||||
</Location>
|
||||
|
||||
# https://stackoverflow.com/a/42558499
|
||||
# https://fetch.spec.whatwg.org/#forbidden-header-name
|
||||
xdomain_request: |
|
||||
# Allow cross domain request from these hosts
|
||||
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
|
||||
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
|
||||
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
|
||||
Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
|
||||
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
|
||||
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
|
||||
Header always set Access-Control-Max-Age "0"
|
||||
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
|
||||
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
|
||||
RewriteEngine On
|
||||
RewriteCond %{REQUEST_METHOD} OPTIONS
|
||||
|
@ -48,8 +48,11 @@ vhost: |
|
||||
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
location / {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
# https://stackoverflow.com/a/72586833
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
# Proxy connection
|
||||
proxy_pass http://php:8000;
|
||||
}
|
||||
|
||||
@ -111,11 +114,12 @@ features:
|
||||
|
||||
xdomain_request: |
|
||||
# Allow cross domain request from these hosts
|
||||
# https://fetch.spec.whatwg.org/#forbidden-header-name
|
||||
if ( $http_origin ~* (__REGEX__) ) {
|
||||
add_header "Access-Control-Allow-Origin" "$http_origin";
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
|
||||
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
|
||||
add_header "Access-Control-Allow-Origin" "$http_origin";
|
||||
add_header 'Access-Control-Allow-Methods' 'HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Headers' 'Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With';
|
||||
add_header 'Access-Control-Expose-Headers' 'Content-Security-Policy, Location';
|
||||
add_header 'Access-Control-Max-Age' 0;
|
||||
return 200;
|
||||
}
|
||||
|
@ -75,12 +75,31 @@ vhost_type:
|
||||
root "__DOCUMENT_ROOT__";
|
||||
index __INDEX__;
|
||||
|
||||
# Reverse Proxy (-r)
|
||||
# Reverse Proxy (-r http(s)://ADDR:PORT)
|
||||
rproxy: |
|
||||
# Define the vhost to reverse proxy
|
||||
# Define Reverse Proxy
|
||||
location __LOCATION__ {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
# https://stackoverflow.com/a/72586833
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
# Proxy connection
|
||||
proxy_pass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__;
|
||||
}
|
||||
|
||||
# Reverse Proxy with websocket support (-r ws(s)://ADDR:PORT)
|
||||
rproxy_ws: |
|
||||
# Define Reverse Proxy with Websock support
|
||||
location __LOCATION__ {
|
||||
# https://stackoverflow.com/a/72586833
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
# Websocket settings
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
# Proxy connection
|
||||
proxy_pass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__;
|
||||
}
|
||||
|
||||
@ -147,11 +166,12 @@ features:
|
||||
|
||||
xdomain_request: |
|
||||
# Allow cross domain request from these hosts
|
||||
# https://fetch.spec.whatwg.org/#forbidden-header-name
|
||||
if ( $http_origin ~* (__REGEX__) ) {
|
||||
add_header "Access-Control-Allow-Origin" "$http_origin";
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
|
||||
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
|
||||
add_header "Access-Control-Allow-Origin" "$http_origin";
|
||||
add_header 'Access-Control-Allow-Methods' 'HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Headers' 'Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With';
|
||||
add_header 'Access-Control-Expose-Headers' 'Content-Security-Policy, Location';
|
||||
add_header 'Access-Control-Max-Age' 0;
|
||||
return 200;
|
||||
}
|
||||
|
@ -220,8 +220,8 @@ print_head_1 "Checking .env file values"
|
||||
WRONG_ENV_FILES_VALUES=0
|
||||
|
||||
DEBUG_ENTRYPOINT="$( get_env_value "DEBUG_ENTRYPOINT" )"
|
||||
if [ "${DEBUG_ENTRYPOINT}" != "0" ] && [ "${DEBUG_ENTRYPOINT}" != "1" ] && [ "${DEBUG_ENTRYPOINT}" != "2" ] && [ "${DEBUG_ENTRYPOINT}" != "3" ] && [ "${DEBUG_ENTRYPOINT}" != "3" ]; then
|
||||
log_err "Variable 'DEBUG_ENTRYPOINT' should be 0, 1 or 2. Has: ${DEBUG_ENTRYPOINT}"
|
||||
if [ "${DEBUG_ENTRYPOINT}" != "0" ] && [ "${DEBUG_ENTRYPOINT}" != "1" ] && [ "${DEBUG_ENTRYPOINT}" != "2" ] && [ "${DEBUG_ENTRYPOINT}" != "3" ] && [ "${DEBUG_ENTRYPOINT}" != "4" ]; then
|
||||
log_err "Variable 'DEBUG_ENTRYPOINT' should be 0, 1, 2, 3 or 4. Has: ${DEBUG_ENTRYPOINT}"
|
||||
RET_CODE=$(( RET_CODE + 1))
|
||||
WRONG_ENV_FILES_VALUES=1
|
||||
else
|
||||
|
@ -34,7 +34,7 @@ services:
|
||||
|
||||
php54:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:5.4-prod-0.147
|
||||
image: devilbox/php-fpm:5.4-prod-0.150
|
||||
hostname: php54
|
||||
networks:
|
||||
app_net:
|
||||
@ -43,16 +43,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-5.4:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-5.4:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-5.4:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-5.4:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php55:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:5.5-prod-0.147
|
||||
image: devilbox/php-fpm:5.5-prod-0.150
|
||||
hostname: php55
|
||||
networks:
|
||||
app_net:
|
||||
@ -61,16 +61,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-5.5:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-5.5:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-5.5:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-5.5:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php56:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:5.6-prod-0.147
|
||||
image: devilbox/php-fpm:5.6-prod-0.150
|
||||
hostname: php56
|
||||
networks:
|
||||
app_net:
|
||||
@ -79,16 +79,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-5.6:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-5.6:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-5.6:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-5.6:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php70:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:7.0-prod-0.147
|
||||
image: devilbox/php-fpm:7.0-prod-0.150
|
||||
hostname: php70
|
||||
networks:
|
||||
app_net:
|
||||
@ -97,16 +97,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-7.0:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-7.0:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-7.0:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-7.0:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php71:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:7.1-prod-0.147
|
||||
image: devilbox/php-fpm:7.1-prod-0.150
|
||||
hostname: php71
|
||||
networks:
|
||||
app_net:
|
||||
@ -115,16 +115,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-7.1:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-7.1:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-7.1:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-7.1:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php72:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:7.2-prod-0.147
|
||||
image: devilbox/php-fpm:7.2-prod-0.150
|
||||
hostname: php72
|
||||
networks:
|
||||
app_net:
|
||||
@ -133,16 +133,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-7.2:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-7.2:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-7.2:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-7.2:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php73:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:7.3-prod-0.147
|
||||
image: devilbox/php-fpm:7.3-prod-0.150
|
||||
hostname: php73
|
||||
networks:
|
||||
app_net:
|
||||
@ -151,16 +151,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-7.3:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-7.3:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-7.3:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-7.3:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php74:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:7.4-prod-0.147
|
||||
image: devilbox/php-fpm:7.4-prod-0.150
|
||||
hostname: php74
|
||||
networks:
|
||||
app_net:
|
||||
@ -169,16 +169,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-7.4:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-7.4:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-7.4:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-7.4:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php80:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:8.0-prod-0.147
|
||||
image: devilbox/php-fpm:8.0-prod-0.150
|
||||
hostname: php80
|
||||
networks:
|
||||
app_net:
|
||||
@ -187,16 +187,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-8.0:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-8.0:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-8.0:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-8.0:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php81:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:8.1-prod-0.147
|
||||
image: devilbox/php-fpm:8.1-prod-0.150
|
||||
hostname: php81
|
||||
networks:
|
||||
app_net:
|
||||
@ -205,16 +205,16 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-8.1:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-8.1:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-8.1:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-8.1:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
||||
php82:
|
||||
<<: *default-php
|
||||
image: devilbox/php-fpm:8.2-prod-0.147
|
||||
image: devilbox/php-fpm:8.2-prod-0.150
|
||||
hostname: php82
|
||||
networks:
|
||||
app_net:
|
||||
@ -223,9 +223,9 @@ services:
|
||||
# Specific volumes
|
||||
- ${DEVILBOX_PATH}/cfg/php-ini-8.2:/etc/php-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-fpm-8.2:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/cfg/php-startup-8.2:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/cfg/php-startup-8.2:/startup.1.d:rw${MOUNT_OPTIONS}
|
||||
# Generic volumes
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
|
||||
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
|
||||
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
|
||||
|
@ -89,6 +89,7 @@ services:
|
||||
extra_hosts:
|
||||
docker.for.lin.host.internal: 172.16.238.1
|
||||
docker.for.lin.localhost: 172.16.238.1
|
||||
host.docker.internal: host-gateway
|
||||
|
||||
networks:
|
||||
app_net:
|
||||
@ -99,7 +100,7 @@ services:
|
||||
# PHP
|
||||
# ------------------------------------------------------------
|
||||
php:
|
||||
image: devilbox/php-fpm:${PHP_SERVER}-work-0.147
|
||||
image: devilbox/php-fpm:${PHP_SERVER}-work-0.150
|
||||
hostname: php
|
||||
|
||||
##
|
||||
@ -171,6 +172,7 @@ services:
|
||||
extra_hosts:
|
||||
docker.for.lin.host.internal: 172.16.238.1
|
||||
docker.for.lin.localhost: 172.16.238.1
|
||||
host.docker.internal: host-gateway
|
||||
|
||||
networks:
|
||||
app_net:
|
||||
@ -227,7 +229,7 @@ services:
|
||||
# Web Server
|
||||
# ------------------------------------------------------------
|
||||
httpd:
|
||||
image: devilbox/${HTTPD_SERVER}:${HTTPD_FLAVOUR:-alpine}-1.0-beta1
|
||||
image: devilbox/${HTTPD_SERVER}:${HTTPD_FLAVOUR:-alpine}-1.0
|
||||
hostname: httpd
|
||||
|
||||
environment:
|
||||
|
BIN
docs/img/example_01-vhost.png
Normal file
BIN
docs/img/example_01-vhost.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
BIN
docs/img/example_02-vhost.png
Normal file
BIN
docs/img/example_02-vhost.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
11
env-example
11
env-example
@ -90,17 +90,20 @@ LOCAL_LISTEN_ADDR=
|
||||
###
|
||||
### Note: In addition to period or dot character ('.'), only ALPHA ([a-zA-Z]+) characters are supported.
|
||||
### Mac users should not use the .local TLD, as this will not resolve properly due Apple's
|
||||
### use of Multicast DNS.##
|
||||
### use of Multicast DNS.
|
||||
###
|
||||
### Note: If you use 'dvl.to' then there is no need for additional DNS as this always points
|
||||
### to 127.0.0.1 by default.
|
||||
###
|
||||
### Example:
|
||||
### TLD_SUFFIX=loc
|
||||
### Makes your project available under xxxx.loc
|
||||
### Makes your project available under <project>.loc
|
||||
###
|
||||
### Example:
|
||||
### TLD_SUFFIX=local
|
||||
### Makes your project available under xxxx.local
|
||||
### Makes your project available under <project>.local
|
||||
###
|
||||
TLD_SUFFIX=loc
|
||||
TLD_SUFFIX=dvl.to
|
||||
|
||||
|
||||
###
|
||||
|
Loading…
x
Reference in New Issue
Block a user