Merge pull request #944 from cytopia/release/v3.0.0-beta-0.3

Release/v3.0.0 beta 0.3
This commit is contained in:
cytopia 2023-01-03 01:32:23 +01:00 committed by GitHub
commit 10b20c0745
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 1023 additions and 656 deletions

View File

@ -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.2';
$DEVILBOX_DATE = '2022-12-27';
$DEVILBOX_VERSION = 'v3.0.0-beta-0.3';
$DEVILBOX_DATE = '2023-01-02';
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
//

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -26,8 +26,8 @@
<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>
@ -37,15 +37,82 @@
<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">&times;</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('<', '&lt;', $src); ?>
<?php $src = str_replace('>', '&gt;', $src); ?>
<?php $src = preg_replace('/&lt;(\/?.*)&gt;/m', '<strong>&lt;\1&gt;</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">&times;</span>
</button>
</div>
<div class="modal-body">
<?php $src = file_get_contents($vhostGenPath); ?>
<?php //$src = htmlentities($src); ?>
<?php $src = str_replace('<', '&lt;', $src); ?>
<?php $src = str_replace('>', '&gt;', $src); ?>
<?php $src = preg_replace('/&lt;(\/?.*)&gt;/m', '<strong>&lt;\1&gt;</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 style="min-width:60px;" class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>"></td>
<td style="min-width:260px;" id="href-<?php echo $vHost['name'];?>"></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; ?>

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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
View 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'

View File

@ -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

View File

@ -6,6 +6,24 @@ 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:
@ -40,6 +58,7 @@ Once you're done with `backend.cfg` changes, head over to the Intranet C&C page
### 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

1138
README.md

File diff suppressed because it is too large Load Diff

View File

@ -134,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

View File

@ -181,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

View File

@ -137,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

View File

@ -206,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

View File

@ -114,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;
}

View File

@ -166,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;
}

View File

@ -34,7 +34,7 @@ services:
php54:
<<: *default-php
image: devilbox/php-fpm:5.4-prod-0.148
image: devilbox/php-fpm:5.4-prod-0.150
hostname: php54
networks:
app_net:
@ -52,7 +52,7 @@ services:
php55:
<<: *default-php
image: devilbox/php-fpm:5.5-prod-0.148
image: devilbox/php-fpm:5.5-prod-0.150
hostname: php55
networks:
app_net:
@ -70,7 +70,7 @@ services:
php56:
<<: *default-php
image: devilbox/php-fpm:5.6-prod-0.148
image: devilbox/php-fpm:5.6-prod-0.150
hostname: php56
networks:
app_net:
@ -88,7 +88,7 @@ services:
php70:
<<: *default-php
image: devilbox/php-fpm:7.0-prod-0.148
image: devilbox/php-fpm:7.0-prod-0.150
hostname: php70
networks:
app_net:
@ -106,7 +106,7 @@ services:
php71:
<<: *default-php
image: devilbox/php-fpm:7.1-prod-0.148
image: devilbox/php-fpm:7.1-prod-0.150
hostname: php71
networks:
app_net:
@ -124,7 +124,7 @@ services:
php72:
<<: *default-php
image: devilbox/php-fpm:7.2-prod-0.148
image: devilbox/php-fpm:7.2-prod-0.150
hostname: php72
networks:
app_net:
@ -142,7 +142,7 @@ services:
php73:
<<: *default-php
image: devilbox/php-fpm:7.3-prod-0.148
image: devilbox/php-fpm:7.3-prod-0.150
hostname: php73
networks:
app_net:
@ -160,7 +160,7 @@ services:
php74:
<<: *default-php
image: devilbox/php-fpm:7.4-prod-0.148
image: devilbox/php-fpm:7.4-prod-0.150
hostname: php74
networks:
app_net:
@ -178,7 +178,7 @@ services:
php80:
<<: *default-php
image: devilbox/php-fpm:8.0-prod-0.148
image: devilbox/php-fpm:8.0-prod-0.150
hostname: php80
networks:
app_net:
@ -196,7 +196,7 @@ services:
php81:
<<: *default-php
image: devilbox/php-fpm:8.1-prod-0.148
image: devilbox/php-fpm:8.1-prod-0.150
hostname: php81
networks:
app_net:
@ -214,7 +214,7 @@ services:
php82:
<<: *default-php
image: devilbox/php-fpm:8.2-prod-0.148
image: devilbox/php-fpm:8.2-prod-0.150
hostname: php82
networks:
app_net:

View File

@ -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.148
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-beta2
image: devilbox/${HTTPD_SERVER}:${HTTPD_FLAVOUR:-alpine}-1.0
hostname: httpd
environment:

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -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
###