Compare commits

..

22 Commits

Author SHA1 Message Date
a445a209b8 Added .env variable HTTPD_FLAVOUR to decide between Debian or Alpine for HTTP server 2022-03-28 16:55:04 +02:00
bd9830a472 Remove failing services in CI 2022-03-27 23:25:23 +02:00
8b76df678a Add exceptions for PHP CI to use older PGSQL versions 2022-03-27 21:57:26 +02:00
3a581cb74d Removed CI for MongoDB 2.8 and MongoDB 3.0 due to segfault 2022-03-27 20:36:04 +02:00
bf9966a6e9 Give more startup-time for CI tests 2022-03-27 20:15:14 +02:00
63b046fd7c Ensure CI tests run on bash shell 2022-03-27 20:05:14 +02:00
8b4a5f4777 Adjust version according to breaking changes 2022-03-27 19:42:35 +02:00
f3b50d0791 Add breaking changes info to CHANGELOG 2022-03-27 19:41:12 +02:00
97e65e03fc Add new CI status badges 2022-03-27 19:40:53 +02:00
1783d05622 Use tiny Alpine version of Bind container 2022-03-27 19:40:34 +02:00
2a99a935f5 Add exceptions for PHP CI to use older PGSQL versions 2022-03-27 19:40:09 +02:00
483f5ca53c Fix Release version in CHANELOG 2022-03-27 18:19:36 +02:00
c12db006bb Rename workflows 2022-03-27 18:16:14 +02:00
c9067abc9b Reorganize integration tests 2022-03-27 18:10:52 +02:00
a0c7728ea9 Test re-usable workflows 2022-03-27 17:40:13 +02:00
1007e35963 Colorize test outputs 2022-03-27 15:43:03 +02:00
152c852b6b Fix PGSQL versions in CI 2022-03-27 15:08:19 +02:00
d11c1304ed Added CakePHP integration tests for PHP 8+ 2022-03-27 07:43:07 +02:00
945566d74b Fix CI script to detect PHP version 2022-03-27 07:04:09 +02:00
bb7069192c Fix postgresql volume definitions 2022-03-27 06:57:04 +02:00
e73d3a74c2 Bump version 2022-03-27 04:25:52 +02:00
8aa32358d7 Changed default server versions to have arm64 support 2022-03-27 04:24:40 +02:00
140 changed files with 1580 additions and 3744 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.3';
$DEVILBOX_DATE = '2023-01-02';
$DEVILBOX_VERSION = 'v2.0.0';
$DEVILBOX_DATE = '2022-04-01';
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
//

View File

@ -36,32 +36,31 @@ if (loadClass('Helper')->isLoggedIn()) {
//
else if (isset($_GET['software'])) {
$no = '<span class="text-danger">not installed</span>';
$no_mod = '<span class="text-warning">PHP module not loaded</span>';
$software = array();
if ($_GET['software'] == 'angular_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getAngularCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'asgardcms_installer') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getAsgardCmsInstallerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'codeception') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getCodeceptionVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'composer') {
if ($_GET['software'] == 'composer') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getComposerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'deployer') {
else if ($_GET['software'] == 'drupalc') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDeployerVersion()) !== false) ? $version : $no
$_GET['software'] => (($version = loadClass('Php')->getDrupalConsoleVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush7') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(7)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush8') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(8)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush9') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(9)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'git') {
@ -69,24 +68,9 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getGitVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'grunt_cli') {
else if ($_GET['software'] == 'laravel') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getGruntCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'gulp') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getGulpVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'laravel_installer') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getLaravelInstallerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'laravel_lumen') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getLaravelLumenVersion()) !== false) ? $version : $no
$_GET['software'] => (($version = loadClass('Php')->getLaravelVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'mds') {
@ -94,11 +78,6 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getMdsVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'mupdf_tools') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getMupdfToolsVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'node') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getNodeVersion()) !== false) ? $version : $no
@ -109,56 +88,20 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getNpmVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'phalcon_devtools') {
if (!extension_loaded('phalcon')) {
echo json_encode(array(
$_GET['software'] => $no_mod
));
} else {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getPhalconDevtoolsVersion()) !== false) ? $version : $no
));
}
}
else if ($_GET['software'] == 'phpunit') {
else if ($_GET['software'] == 'phalcon') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getPhpunitVersion()) !== false) ? $version : $no
$_GET['software'] => (($version = loadClass('Php')->getPhalconVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'stylelint') {
else if ($_GET['software'] == 'symfony') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getStylelintVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'symfony_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getSymfonyCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'vue_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getVueCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'webpack_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getWebpackCliVersion()) !== false) ? $version : $no
$_GET['software'] => (($version = loadClass('Php')->getSymfonyVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'wpcli') {
echo json_encode(array(
$_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
));
} else {
echo json_encode(array($_GET['software'] => 'unknown software'));
}

View File

@ -0,0 +1,22 @@
class HtmlEmail extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
let emailContent;
const templateId = this.dataset.templateId;
try {
emailContent = document.getElementById(templateId).innerHTML;
} catch (error) {
console.log(error);
return;
}
const container = document.createElement('div');
container.innerHTML = emailContent;
this.shadowRoot.appendChild(container);
}
}
customElements.define('html-email', HtmlEmail);

View File

@ -1,179 +0,0 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
// TODO: This is currently a temporary hack to talk to supervisor on the HTTPD server
function run_supervisor_command($command) {
$supervisor_config_file = '/tmp/supervisorctl.conf';
$port = getenv('SVCTL_LISTEN_PORT');
$user = getenv('SVCTL_USER');
$pass = getenv('SVCTL_PASS');
$content = "[supervisorctl]\n";
$content .= "serverurl=http://httpd:" . $port . "\n";
$content .= "username=" . $user . "\n";
$content .= "password=" . $pass . "\n";
$fp = fopen($supervisor_config_file, 'w');
fwrite($fp, $content);
fclose($fp);
return loadClass('Helper')->exec('supervisorctl -c ' . $supervisor_config_file . ' ' . $command);
}
?>
<?php if ( isset($_POST['watcherd']) && $_POST['watcherd'] == 'reload' ) {
run_supervisor_command('restart watcherd');
sleep(1);
loadClass('Helper')->redirect('/cnc.php');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(true); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<h1>Command & Control</h1>
<br/>
<br/>
<div class="row">
<div class="col-md-12">
<?php
$status_w = run_supervisor_command('status watcherd');
$status_h = run_supervisor_command('status httpd');
$words = preg_split("/\s+/", $status_w);
$data_w = array(
'name' => isset($words[0]) ? $words[0] : '',
'state' => isset($words[1]) ? $words[1] : '',
'pid' => isset($words[3]) ? preg_replace('/,$/', '', $words[3]) : '',
'uptime' => isset($words[5]) ? $words[5] : '',
);
$words = preg_split("/\s+/", $status_h);
$data_h = array(
'name' => isset($words[0]) ? $words[0] : '',
'state' => isset($words[1]) ? $words[1] : '',
'pid' => isset($words[3]) ? preg_replace('/,$/', '', $words[3]) : '',
'uptime' => isset($words[5]) ? $words[5] : '',
);
?>
<h3>Daemon overview</h3><br/>
<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>
<th>Daemon</th>
<th>Status</th>
<th>Pid</th>
<th>Uptime</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td><?php echo $data_w['name']; ?></td>
<td><?php echo $data_w['state']; ?></td>
<td><?php echo $data_w['pid']; ?></td>
<td><?php echo $data_w['uptime']; ?></td>
<td><form method="post"><button type="submit" name="watcherd" value="reload" class="btn btn-primary">Reload</button></form></td>
</tr>
<tr>
<td><?php echo $data_h['name']; ?></td>
<td><?php echo $data_h['state']; ?></td>
<td><?php echo $data_h['pid']; ?></td>
<td><?php echo $data_h['uptime']; ?></td>
<td></td>
</tr>
</tbody>
</table>
<br/>
<br/>
<h3>watcherd stderr</h3>
<br/>
<?php
$output = run_supervisor_command('tail -1000000 watcherd stderr');
echo '<pre>';
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
if ( strpos($line, "[ERR]") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "[emerg]") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "Syntax error") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "[WARN]") !== false ) {
echo '<span style="color: #ccaa00">' . $line . '</span>';
} else {
echo $line;
}
echo "\n";
}
echo '</pre>';
?>
<h3>watcherd stdout</h3>
<br/>
<?php
$output = run_supervisor_command('tail -1000000 watcherd');
echo '<pre>';
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
$pos_info = strpos($line, "[INFO]");
$pos_ok = strpos($line, "[OK]");
if ( $pos_ok !== false ) {
echo '<span style="color: #669a00"><strong>' . $line . '</strong></span>';
} else if ( $pos_info !== false && $pos_info == 0 ) {
echo '<span style="color: #0088cd">' . $line . '</span>';
} else {
echo $line;
}
echo "\n";
}
echo '</pre>';
?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
<script>
$(function() {
$('.subject').click(function() {
const id = ($(this).attr('id'));
const row = $('#mail-'+id);
row.toggle();
const bodyElement = row.find('.email-body')[0];
if(bodyElement.shadowRoot !== null){
// We've already fetched the message content.
return;
}
bodyElement.attachShadow({ mode: 'open' });
bodyElement.shadowRoot.innerHTML = 'Loading...';
$.get('?get-body=' + id, function(response){
response = JSON.parse(response);
row.find('.raw-email-body').html(response.raw);
const body = response.body;
if(body === null){
row.find('.alert').show();
}
else{
bodyElement.shadowRoot.innerHTML = body;
}
})
})
// Handler for .ready() called.
});
</script>
</body>
</html>

View File

@ -334,121 +334,10 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<div class="row">
<div class="col-lg-4 col-md-6 col-sm-12 col-xs-12 col-margin">
<div class="dash-box">
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> Available CLI Tools</div>
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> PHP Container Setup</div>
<div class="dash-box-body">
<p><small>You can also enter the php container via <code style="background-color:#3d3d3d;">./shell.sh</code> and use the following cli tools:</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small">
<thead class="thead-inverse">
<tr>
<th colspan="2">Tools</th>
</tr>
</thead>
<tbody>
<tr>
<th style="width: 50%;">Angular Cli</th>
<td id="app_angular_cli"></td>
</tr>
<tr>
<th>AsgardCMS Installer</th>
<td id="app_asgardcms_installer"></td>
</tr>
<tr>
<th>Codeception</th>
<td id="app_codeception"></td>
</tr>
<tr>
<th>Composer</th>
<td id="app_composer"></td>
</tr>
<tr>
<th>Deployer</th>
<td id="app_deployer"></td>
</tr>
<tr>
<th>Git</th>
<td id="app_git"></td>
</tr>
<tr>
<th>Grunt Cli</th>
<td id="app_grunt_cli"></td>
</tr>
<tr>
<th>Gulp</th>
<td id="app_gulp"></td>
</tr>
<tr>
<th>Laravel Installer</th>
<td id="app_laravel_installer"></td>
</tr>
<tr>
<th>Laravel Lumen</th>
<td id="app_laravel_lumen"></td>
</tr>
<tr>
<th>Mupdf Tools</th>
<td id="app_mupdf_tools"></td>
</tr>
<tr>
<th>mysqldump-secure</th>
<td id="app_mds"></td>
</tr>
<tr>
<th>Node</th>
<td id="app_node"></td>
</tr>
<tr>
<th>Npm</th>
<td id="app_npm"></td>
</tr>
<tr>
<th>Phalcon Devtools</th>
<td id="app_phalcon_devtools"></td>
</tr>
<tr>
<th>Phpunit</th>
<td id="app_phpunit"></td>
</tr>
<tr>
<th>Stylelint</th>
<td id="app_stylelint"></td>
</tr>
<tr>
<th>Symfony Cli</th>
<td id="app_symfony_cli"></td>
</tr>
<tr>
<th>Vue Cli</th>
<td id="app_vue_cli"></td>
</tr>
<tr>
<th>Webpack Cli</th>
<td id="app_webpack_cli"></td>
</tr>
<tr>
<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>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6 col-sm-12 col-xs-12 offset-lg-4 offset-md-0 offset-sm-0 col-margin">
<div class="dash-box">
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> PHP Container Status</div>
<div class="dash-box-body">
<p><small>You have made the following base configuration to the Devilbox:</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small">
<p><small>You can also enter the php container and work from inside. The following is available inside the container:</small></p>
<thead class="thead-inverse">
<tr>
<th colspan="2">Settings</th>
@ -485,7 +374,78 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
</tr>
</tbody>
</table>
<p><small>The PHP container can connect to the following services via the specified hostnames and IP addresses.</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small">
<thead class="thead-inverse">
<tr>
<th colspan="2">Tools</th>
</tr>
</thead>
<tbody>
<tr>
<th>composer</th>
<td id="app_composer"></td>
</tr>
<tr>
<th>drupal-console</th>
<td id="app_drupalc"></td>
</tr>
<tr>
<th>drush7</th>
<td id="app_drush7"></td>
</tr>
<tr>
<th>drush8</th>
<td id="app_drush8"></td>
</tr>
<tr>
<th>drush9</th>
<td id="app_drush9"></td>
</tr>
<tr>
<th>git</th>
<td id="app_git"></td>
</tr>
<tr>
<th>Laravel installer</th>
<td id="app_laravel"></td>
</tr>
<tr>
<th>mysqldump-secure</th>
<td id="app_mds"></td>
</tr>
<tr>
<th>node</th>
<td id="app_node"></td>
</tr>
<tr>
<th>npm</th>
<td id="app_npm"></td>
</tr>
<tr>
<th>Phalcon devtools</th>
<td id="app_phalcon"></td>
</tr>
<tr>
<th>Symfony installer</th>
<td id="app_symfony"></td>
</tr>
<tr>
<th>Wordpress cli</th>
<td id="app_wpcli"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6 col-sm-12 col-xs-12 offset-lg-4 offset-md-0 offset-sm-0 col-margin">
<div class="dash-box">
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> PHP Container Status</div>
<div class="dash-box-body">
<p><small>The PHP Docker can connect to the following services via the specified hostnames and IP addresses.</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small">
<thead class="thead-inverse">
<tr>
@ -953,29 +913,19 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
xhttp.open('GET', '_ajax_callback.php?software='+app, true);
xhttp.send();
}
updateVersions('angular_cli');
updateVersions('asgardcms_installer');
updateVersions('codeception');
updateVersions('composer');
updateVersions('deployer');
updateVersions('drupalc');
updateVersions('drush7');
updateVersions('drush8');
updateVersions('drush9');
updateVersions('git');
updateVersions('grunt_cli');
updateVersions('gulp');
updateVersions('laravel_installer');
updateVersions('laravel_lumen');
updateVersions('laravel');
updateVersions('mds');
updateVersions('mupdf_tools');
updateVersions('node');
updateVersions('npm');
updateVersions('phalcon_devtools');
updateVersions('phpunit');
updateVersions('stylelint');
updateVersions('symfony_cli');
updateVersions('vue_cli');
updateVersions('webpack_cli');
updateVersions('phalcon');
updateVersions('symfony');
updateVersions('wpcli');
updateVersions('wscat');
updateVersions('yarn');
})();
</script>
</body>

View File

@ -0,0 +1,66 @@
<?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

@ -24,28 +24,6 @@ require $VEN_DIR . DIRECTORY_SEPARATOR . 'Mail' . DIRECTORY_SEPARATOR .'mimeDeco
require $LIB_DIR . DIRECTORY_SEPARATOR . 'Mail.php';
require $LIB_DIR . DIRECTORY_SEPARATOR . 'Sort.php';
if (isset($_GET['get-body']) && is_numeric($_GET['get-body'])) {
$messageNumber = $_GET['get-body'];
$MyMbox = new \devilbox\Mail('/var/mail/devilbox');
$message = $MyMbox->getMessage($messageNumber-1);
$structure = $message['decoded'];
$body = null;
if (isset($structure->body)) {
$body = $structure->body;
}
elseif(isset($structure->parts[1]->body)) {
$body = $structure->parts[1]->body;
}
elseif(isset($structure->parts[0]->body)) {
$body = $structure->parts[0]->body;
}
exit(json_encode(array(
'raw' => htmlentities($message['raw']),
'body' => $body,
)));
}
if (isset($_GET['delete']) && is_numeric($_GET['delete'])) {
$message = $_GET['delete'];
@ -193,6 +171,17 @@ $messages = $MyMbox->get($sortOrderArr);
<?php
$message = htmlentities($data['raw']);
$structure = $data['decoded'];
$body = null;
if (isset($structure->body)) {
$body = $structure->body;
}
elseif(isset($structure->parts[1]->body)) {
$body = $structure->parts[1]->body;
}
elseif(isset($structure->parts[0]->body)) {
$body = $structure->parts[0]->body;
}
?>
<tr id="<?php echo $data['num'];?>" class="subject">
<td><?php echo $data['num'];?></td>
@ -209,13 +198,17 @@ $messages = $MyMbox->get($sortOrderArr);
<tr id="mail-<?php echo $data['num'];?>" style="display:none">
<td></td>
<td colspan="5">
<div class="email-body"></div>
<div class="alert alert-warning" role="alert" style="display:none">
No valid body found
</div>
<?php if ($body !== null): ?>
<template id="mail-body-<?=$data['num']?>"><?=$body?></template>
<html-email data-template-id="mail-body-<?=$data['num']?>"></html-email>
<?php else: ?>
<div class="alert alert-warning" role="alert">
No valid body found
</div>
<?php endif; ?>
<hr>
<p><a class="btn btn-primary" data-toggle="collapse" href="#email-<?php echo $data['num'];?>" aria-expanded="false" aria-controls="email-<?php echo $data['num'];?>">Raw source</a></p>
<div class="collapse" id="email-<?php echo $data['num'];?>"><pre class="raw-email-body"></pre></div>
<div class="collapse" id="email-<?php echo $data['num'];?>"><pre><?php echo $message;?></pre></div>
</td>
</tr>
<?php endforeach; ?>
@ -234,34 +227,12 @@ $messages = $MyMbox->get($sortOrderArr);
<script>
$(function() {
$('.subject').click(function() {
const id = ($(this).attr('id'));
const row = $('#mail-'+id);
row.toggle();
const bodyElement = row.find('.email-body')[0];
if(bodyElement.shadowRoot !== null){
// We've already fetched the message content.
return;
}
bodyElement.attachShadow({ mode: 'open' });
bodyElement.shadowRoot.innerHTML = 'Loading...';
$.get('?get-body=' + id, function(response){
response = JSON.parse(response);
row.find('.raw-email-body').html(response.raw);
const body = response.body;
if(body === null){
row.find('.alert').show();
}
else{
bodyElement.shadowRoot.innerHTML = body;
}
})
var id = ($(this).attr('id'));
$('#mail-'+id).toggle();
})
// Handler for .ready() called.
});
</script>
<script src="/assets/js/html-email.js"></script>
</body>
</html>

View File

@ -16,7 +16,6 @@
<p>I am currently the sole creator and maintainer of the Devilbox and all of its required projects.<br/>If you find this useful or if it makes your daily programming life easier, consider donating to keep this project alive.</p>
<ul>
<li><a target="_blank" href="https://github.com/sponsors/cytopia"><strong>GitHub sponsorship</strong></a></li>
<li><a target="_blank" href="https://opencollective.com/devilbox"><strong>Open Collective</strong></a></li>
<li><a target="_blank" href="https://www.patreon.com/devilbox"><strong>Patreon</strong></a></li>
</ul>
<br/>
@ -40,63 +39,55 @@
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.2">docker-php-fpm-5.2</a></td>
<td>Legacy PHP 5.2 base images (<code>amd64</code> and <code>i386</code>)</td>
<td>Legacy PHP 5.2 base images (amd64 and i386)</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-5.3">docker-php-fpm-5.3</a></td>
<td>Legacy PHP 5.3 base images (<code>amd64</code> and <code>arm64</code>)</td>
<td>Legacy PHP 5.3 base images (amd64 and arm64)</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-5.4">docker-php-fpm-5.4</a></td>
<td>Legacy PHP 5.4 base images (<code>amd64</code> and <code>arm64</code>)</td>
<td>Legacy PHP 5.4 base images (amd64 and arm64)</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-5.5">docker-php-fpm-5.5</a></td>
<td>Legacy PHP 5.5 base images (<code>amd64</code> and <code>arm64</code>)</td>
<td>Legacy PHP 5.5 base images (amd64 and arm64)</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.0">docker-php-fpm-8.0</a></td>
<td>PHP 8.0 base images (<code>amd64</code> and <code>arm64</code>)</td>
<td>PHP 8.0 base images (amd64 and arm64)</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.1">docker-php-fpm-8.1</a></td>
<td>PHP 8.1 base images (<code>amd64</code> and <code>arm64</code>)</td>
<td>PHP 8.1 base images (amd64 and arm64)</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.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>
<td>Upcoming PHP 8.2 base images (amd64 and arm64)</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>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-community">docker-php-fpm-community</a></td>
<td>PHP-FPM Community images (<code>amd64</code> and <code>arm64</code>)</td>
<td>PHP-FPM Devilbox images</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-mysql">docker-mysql</a></td>
<td>MySQL, MariaDB and PerconaDB images (<code>amd64</code> and <code>arm64</code>)</td>
<td>MySQL, MariaDB and PerconaDB images (amd64 and arm64)</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.2">docker-apache-2.2</a></td>
<td>Apache 2.2 images (<code>amd64</code> and <code>arm64</code>)</td>
<td>Apache 2.2 images (amd64 and arm64)</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.4">docker-apache-2.4</a></td>
<td>Apache 2.4 images (<code>amd64</code> and <code>arm64</code>)</td>
<td>Apache 2.4 images (amd64 and arm64)</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-stable">docker-nginx-stable</a></td>
<td>Nginx stable images (<code>amd64</code> and <code>arm64</code>)</td>
<td>Nginx stable images (amd64 and arm64)</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-mainline">docker-nginx-mainline</a></td>
<td>Nginx mainline images (<code>amd64</code> and <code>arm64</code>)</td>
<td>Nginx mainline images (amd64 and arm64)</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-haproxy">docker-haproxy</a></td>
@ -104,7 +95,7 @@
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-ngrok">docker-ngrok</a></td>
<td>Ngrok image (<code>amd64</code> and <code>arm64</code>)</td>
<td>Ngrok image</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-varnish">docker-varnish</a></td>
@ -151,19 +142,15 @@
<td>Re-usable GitHub Action Workflows</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/shell-command-retry-action">shell-command-retry</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/shell-command-retry-action">shell-command-retry-action</a></td>
<td>GitHub Action</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/docker-tag-action">docker-tag</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/docker-tag-action">docker-tag-action</a></td>
<td>GitHub Action</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/git-ref-matrix-action">git-ref-matrix</a></td>
<td>GitHub Action</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/upload-artifact-verify-action">upload-artifact-verify</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/git-ref-matrix-action">git-ref-matrix-action</a></td>
<td>GitHub Action</td>
</tr>
<tr>

View File

@ -76,7 +76,6 @@ class Connection {
// Detect version and choose appropriate database driver
switch (substr($version,0,2)) {
case '15': return 'Postgres';break;
case '14': return 'Postgres';break;
case '13': return 'Postgres13';break;
case '12': return 'Postgres12';break;

View File

@ -24,95 +24,31 @@
<tr>
<th>Project</th>
<th>DocumentRoot</th>
<th>Backend</th>
<th>Config</th>
<th style="width:60px;">Valid</th>
<th style="width:260px;">URL</th>
<th>Valid</th>
<th>URL</th>
</tr>
</thead>
<tbody>
<?php
$totals = 70;
$filler = '&nbsp;';
for ($i=0; $i<$totals; $i++) {
$filler = $filler. '&nbsp;';
}
?>
<?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>
<?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>
<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 endif; ?>
</td>
<td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>"></td>
<td id="href-<?php echo $vHost['name'];?>"></td>
<td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>">&nbsp;&nbsp;&nbsp;</td>
<td id="href-<?php echo $vHost['name'];?>"><?php echo $filler;?></td>
</tr>
<input type="hidden" name="vhost[]" class="vhost" value="<?php echo $vHost['name'];?>" />
<?php endforeach; ?>
@ -127,60 +63,6 @@
</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(); ?>
@ -199,7 +81,7 @@
var el_valid;
var el_href;
if (this.readyState == 4 && this.status == 200 || this.status == 426) {
if (this.readyState == 4 && this.status == 200) {
el_valid = document.getElementById('valid-' + vhost);
el_href = document.getElementById('href-' + vhost);
error = this.responseText;
@ -245,14 +127,13 @@
var el_href = document.getElementById('href-' + vhost);
var error = this.responseText;
if (this.readyState == 4 && (this.status == 200 || this.status == 426)) {
if (this.readyState == 4 && this.status == 200) {
clearTimeout(xmlHttpTimeout);
el_valid.className += ' bg-success';
if (el_valid.innerHTML != 'WARN') {
el_valid.innerHTML = 'OK';
}
//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>';
el_href.innerHTML = '<a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>' + el_href.innerHTML;
} else {
//console.log(vhost);
}

View File

@ -18,10 +18,6 @@ class Html
'name' => 'Virtual Hosts',
'path' => '/vhosts.php'
),
array(
'name' => 'C&C',
'path' => '/cnc.php'
),
array(
'name' => 'Emails',
'path' => '/mail.php'
@ -267,7 +263,7 @@ HTML;
<nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse footer">
<div class="container justify-content-end">
<ul class="nav navbar-nav">
<li class="nav-item nav-link">Render time: {$render_time} sec</li>
<li class="nav-item nav-link">Render time: ${render_time} sec</li>
<li class="nav-item"><a class="nav-link" target="_blank" href="https://github.com/cytopia/devilbox"><code>Github</code></a></li>
<li class="nav-item"><a class="nav-link" href="/credits.php"><code>Credits</code></a></li>
<li class="nav-item"><a class="nav-link" href="/support.php"><code>Support</code></a></li>

View File

@ -70,22 +70,6 @@ class Mail
}
/**
* Returns a single message
*
* @param int $messageIndex The zero-based index of the message to return.
*/
public function getMessage($messageIndex){
$message = $this->_Mbox->get($messageIndex);
$Decoder = new \Mail_mimeDecode($message, "\r\n");
return array(
'num' => $messageIndex + 1,
'raw' => $message,
'decoded' => $Decoder->decode($this->_defaultMimeParams)
);
}
/**
* Retrieve emails.
*
@ -103,7 +87,13 @@ class Mail
// Get messages in reverse order (last entry first)
for ($n = $total; $n >= 0; --$n) {
$messages[] = $this->getMessage($n);
$message = $this->_Mbox->get($n);
$Decoder = new \Mail_mimeDecode($message, "\r\n");
$messages[] = array(
'num' => $n + 1,
'raw' => $message,
'decoded' => $Decoder->decode($this->_defaultMimeParams)
);
}
// Optionally sort messages

View File

@ -29,18 +29,10 @@ class Httpd extends BaseClass implements BaseInterface
$url = 'http://'.$domain;
$error = array();
$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>';
}
// 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
@ -204,33 +196,6 @@ class Httpd extends BaseClass implements BaseInterface
return false;
}
public function getVhostBackend($vhost)
{
$dir = loadClass('Helper')->getEnv('HTTPD_TEMPLATE_DIR');
$name = 'backend.cfg';
$file = '/shared/httpd/'.$vhost.'/'.$dir.'/'.$name;
if (!file_exists($file)) {
return 'default';
}
$fp = fopen($file, 'r');
$cont = stream_get_contents($fp);
fclose($fp);
// conf:<type>:<proto>:<server>:<port>
$arr = explode(':', $cont);
$type = $arr[1];
$prot = $arr[2];
$addr = ''; // this may contain ':' itself due to IPv6 addresses
for ($i=3; $i<(count($arr)-1); $i++) {
$addr .= $arr[$i];
}
$port = $arr[count($arr) - 1];
return $prot.'://'.$addr.':'.$port;
}
/*********************************************************************************
*

View File

@ -71,8 +71,7 @@ class Pgsql extends BaseClass implements BaseInterface
public function __destruct()
{
if ($this->_link) {
// DO NOT CLOSE. It is kind of shared.
//pg_close($this->_link);
pg_close($this->_link);
}
}
@ -149,7 +148,7 @@ class Pgsql extends BaseClass implements BaseInterface
// Get schemas for each database
foreach ($databases as $name => &$database) {
$PSQL = new Pgsql(
$GLOBALS['PGSQL_HOST_NAME'],
$this->getIpAddress(),
array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),
@ -180,7 +179,7 @@ class Pgsql extends BaseClass implements BaseInterface
public function getSchemaSize($database, $schema)
{
$PSQL = new Pgsql(
$GLOBALS['PGSQL_HOST_NAME'],
$this->getIpAddress(),
array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),
@ -218,7 +217,7 @@ class Pgsql extends BaseClass implements BaseInterface
public function getTableCount($database, $schema)
{
$PSQL = new Pgsql(
$GLOBALS['PGSQL_HOST_NAME'],
$this->getIpAddress(),
array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),

View File

@ -35,19 +35,9 @@ class Php extends BaseClass implements BaseInterface
$uid = loadClass('Helper')->egrep('/[0-9]+/', $uid);
return $uid;
}
public function getAngularCliVersion()
public function getGitVersion()
{
$output = loadClass('Helper')->exec('ng version 2>/dev/null | grep -i "^Angular CLI" | head -1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getAsgardCmsInstallerVersion()
{
$output = loadClass('Helper')->exec('asgardcms --version --no-ansi 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getCodeceptionVersion()
{
$output = loadClass('Helper')->exec('codecept --version --no-ansi 2>/dev/null | grep -i ^Codecept', $output);
$output = loadClass('Helper')->exec('git --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getComposerVersion()
@ -55,45 +45,15 @@ class Php extends BaseClass implements BaseInterface
$output = loadClass('Helper')->exec('composer --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getDeployerVersion()
public function getDrushVersion($version)
{
$output = loadClass('Helper')->exec('dep --version --no-ansi 2>/dev/null | grep -i ^Deploy', $output);
$output = loadClass('Helper')->exec('drush'.$version.' --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getGitVersion()
public function getDrupalConsoleVersion()
{
$output = loadClass('Helper')->exec('git --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getGruntCliVersion()
{
$output = loadClass('Helper')->exec('grunt --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getGulpVersion()
{
$output = loadClass('Helper')->exec('gulp --version --no-color 2>/dev/null | head -1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getLaravelInstallerVersion()
{
$output = loadClass('Helper')->exec('laravel --version --no-ansi 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getLaravelLumenVersion()
{
$output = loadClass('Helper')->exec('lumen --version --no-ansi 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getMdsVersion()
{
$output = loadClass('Helper')->exec('mysqldump-secure --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getMupdfToolsVersion()
{
$output = loadClass('Helper')->exec('mutool -v 2>&1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
$output = loadClass('Helper')->exec('drupal --version 2>/dev/null | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"', $output);
return loadClass('Helper')->egrep('/[0-9.]+[-rc0-9.]*/', $output);
}
public function getNodeVersion()
{
@ -105,61 +65,31 @@ class Php extends BaseClass implements BaseInterface
$output = loadClass('Helper')->exec('npm --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getPhalconDevtoolsVersion()
public function getLaravelVersion()
{
$output = loadClass('Helper')->exec('laravel --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getMdsVersion()
{
$output = loadClass('Helper')->exec('mysqldump-secure --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getPhalconVersion()
{
$output = loadClass('Helper')->exec('phalcon --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getPhpunitVersion()
{
$output = loadClass('Helper')->exec('phpunit --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getStylelintVersion()
{
$output = loadClass('Helper')->exec('stylelint --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getSymfonyCliVersion()
public function getSymfonyVersion()
{
$output = loadClass('Helper')->exec('symfony -V 2>/dev/null | tr -d "[:cntrl:]" | sed "s/\[[0-9]*m//g"', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getVueCliVersion()
{
$output = loadClass('Helper')->exec('vue --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getWebpackCliVersion()
{
$output = loadClass('Helper')->exec('webpack-cli --version --no-stats --no-target --no-watch --no-color 2>/dev/null | grep webpack-cli', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getWpcliVersion()
{
$output = loadClass('Helper')->exec('wp --version 2>/dev/null | grep -i ^WP', $output);
$output = loadClass('Helper')->exec('wp --version 2>/dev/null', $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);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
//public function getDrushVersion($version)
//{
// $output = loadClass('Helper')->exec('drush'.$version.' --version 2>/dev/null', $output);
// return loadClass('Helper')->egrep('/[0-9.]+/', $output);
//}
//public function getDrupalConsoleVersion()
//{
// $output = loadClass('Helper')->exec('drupal --version 2>/dev/null | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"', $output);
// return loadClass('Helper')->egrep('/[0-9.]+[-rc0-9.]*/', $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,12 +832,10 @@ 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) {
// cytopia edit (added ctype_xdigit() check around)
if (ctype_xdigit($matches[0])) {
return chr(hexdec($matches[0]));
}
return chr(hexdec($matches[0]));
};
} else {
// Replace encoded characters
@ -926,7 +924,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)
@ -968,7 +966,7 @@ class Mail_mimeDecode extends PEAR
}
$to = substr($to,1);
return array($to,$header,$this->_body);
}
}
/**
* Returns a xml copy of the output of

85
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,85 @@
---
name: "\U0001F41B Bug report"
about: Something is not working? Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
<!---
1. Verify first that your issue/request is not already reported on GitHub.
2. Verify that your question is not covered in the docs: https://devilbox.readthedocs.io
3. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this bug report.
-->
### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Bug Report
<!-- DO NOT CHANGE THIS -->
### Checklist
<!-- ENSURE YOU HAVE DONE THE FOLLOWING -->
* [ ] `.env` file is attached
* [ ] `./check-config.sh` output is added below
* [ ] `docker-compose logs` output is added below
* [ ] `docker-compose.override.yml` is attached (if exists)
* [ ] Custom configs from `cfg/` dir are attached (if exist)
* [ ] I've looked through the docs: https://devilbox.readthedocs.io/en/latest/
* [ ] I've looked through existing issues: https://github.com/cytopia/devilbox/issues
* [ ] I've read troubleshooting: https://devilbox.readthedocs.io/en/latest/support/troubleshooting.html
### OS / ENVIRONMENT
<!-- COMPLETE ALL 6 BULLET POINTS BELOW: -->
1. Host operating system and version:
2. (Windows only) Native Docker or Docker Toolbox:
3. Docker version:
4. Docker Compose version:
5. (Linux) Is SELinux enabled?:
6. What git commit hash are you on?:
### SUMMARY
<!-- Explain the problem briefly -->
### STEPS TO REPRODUCE
<!-- Show exactly how to reproduce the problem -->
<!-- Make this as detailed as possible and be sure that others can fully reproduce this issue -->
### EXPECTED BEHAVIOUR
<!-- What is the expected behaviour? -->
### ACTUAL BEHAVIOUR
<!-- What is the actual behaviour? -->
### OTHER INFORMATION
#### Start command
<!-- Add the command you have used to start the devilbox -->
```
$ docker-compose up...
```
#### Outputs
<!-- 1/2 Add the output from ./check-config.sh -->
```bash
$ ./check-config.sh
<<< REPLACE THIS LINE WITH OUTPUT FROM ABOVE COMMAND >>>
```
<!-- 2/2 Add the output from docker-compose logs -->
```bash
$ docker-compose logs
<<< REPLACE THIS LINE WITH OUTPUT FROM ABOVE COMMAND >>>
```

View File

@ -1,190 +0,0 @@
---
name: "\U0001F41B Bug report"
description: File a bug report
title: "[Bug]: "
labels: ["bug", "triage"]
assignees:
- cytopia
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: checkboxes
attributes:
label: Have you already looked into this bug?
description: Please invest some time and check if this bug is already mentioned or documented elsewhere (You may select more than one).
options:
- label: I have checked the [Troubleshooting Guide](https://devilbox.readthedocs.io/en/latest/support/troubleshooting.html)
- label: I have checked [Release notes](https://github.com/cytopia/devilbox/releases) for potential migration steps
- label: I have checked [existing issues](https://github.com/cytopia/devilbox/issues) for similar bugs
- label: I have googled this bug already with no luck
- label: I have not done any of the above
validations:
required: true
- type: input
attributes:
label: (Optional) Error message
description: If you encountered any error message, copy and paste it here. This will be used for googling the issue.
validations:
required: false
- type: textarea
id: what-happened
attributes:
label: What went wrong?
description: What exactly went wrong of what bug did you encounter?
validations:
required: true
- type: textarea
id: expected-behaviour
attributes:
label: Expected behaviour
description: What did you expect to happen instead?
validations:
required: true
- type: textarea
id: steps-to-reproduce
attributes:
label: How can we reproduce the bug?
description: How do you trigger this bug? Please walk us through it step by step in detail. This is crucial in order to triage the bug and support you in resolving it.
validations:
required: true
- type: dropdown
id: host-os
attributes:
label: Host Operating System
description: What operating system are you using?
multiple: false
options:
- Linux
- macOS
- Windows
validations:
required: true
- type: dropdown
id: host-platform
attributes:
label: Host Platform (amd64, arm64, other)
description: What host platform are you running on?
options:
- amd64
- arm64
- other
validations:
required: true
- type: dropdown
attributes:
label: (Linux only) Is SELinux enabled?
description: When using Linux as your host operating system, check if SELinux is enabled or not. [More info here](https://devilbox.readthedocs.io/en/latest/getting-started/install-the-devilbox.html?highlight=selinux#linux-selinux)
options:
- Yes, SELinux is enabled
- No, SELinux is disabled
- I don't know
- I am not on Linux
validations:
required: true
- type: input
id: docker-version
attributes:
label: Docker version
description: "What Docker version are you using? Please copy and paste the output of `docker --version` into this text area."
validations:
required: true
- type: input
id: docker-compose-version
attributes:
label: Docker Compose version
description: "What Docker Compose version are you using? Please copy and paste the output of `docker-compose --version` into this text area."
validations:
required: true
- type: input
id: devilbox-version
attributes:
label: Devilbox version
description: "What version of Devilbox are you running (latest master, specific tag, git hash, etc)?"
validations:
required: true
- type: dropdown
attributes:
label: Have you removed stopped containers before starting?
description: "Have you done a `docker-compose rm` before starting up the Devilbox? [More info here](https://docs.docker.com/compose/reference/rm/)"
multiple: false
options:
- "Yes"
- "No"
validations:
required: true
- type: dropdown
attributes:
label: Have you pulled latest Docker images before starting?
description: "Have you done a `docker-compose pull` before starting up the Devilbox?"
multiple: false
options:
- "Yes"
- "No"
validations:
required: true
- type: input
attributes:
label: Devilbox start command
description: "What is the [start command](https://devilbox.readthedocs.io/en/latest/getting-started/start-the-devilbox.html) you have used to start the Devilbox?"
validations:
required: true
- type: textarea
id: log-env-file
attributes:
label: "Config: .env file"
description: "Please copy and paste your `.env` file into this text area"
render: shell
validations:
required: true
- type: textarea
attributes:
label: "Config: docker-compose.override.yml"
description: "If you are using `docker-compose.override.yml`, please copy and paste its contents into this text area."
render: shell
validations:
required: false
- type: textarea
id: log-check-config
attributes:
label: "Config: ./check-config.sh"
description: "Please copy and paste the output of `./check-config.sh` into this text area"
render: shell
validations:
required: true
- type: textarea
id: log-docker-compose
attributes:
label: "Log: docker-compose logs"
description: "Please copy and paste the output of `docker-compose logs` into this text area"
render: shell
validations:
required: true
- type: textarea
attributes:
label: (Optional) Additional information
description: Add any additional information that might help with this bug report. (E.g. customizations from the `autostart/`, `bash/`, `cfg/` or `supervisor/` directory or relevant logfiles from the `log/` directory)
validations:
required: false

View File

@ -1,18 +0,0 @@
---
blank_issues_enabled: false
contact_links:
- name: Devilbox Discord Chat
url: https://discord.gg/2wP3V6kBj4
about: Please notify or discuss about any other requests here.
- name: Devilbox Discourse Forum
url: https://devilbox.discourse.group/
about: Please ask and answer general questions here.
- name: Devilbox Community Support
url: https://devilbox.discourse.group/
about: Please ask and answer questions here.
- name: Devilbox documentation
url: https://devilbox.readthedocs.io/
about: Find the Devilbox documentation here.

30
.github/ISSUE_TEMPLATE/documentation.md vendored Normal file
View File

@ -0,0 +1,30 @@
---
name: "\U0001F4DD Documentation"
about: Anything related to the Devilbox documentation
title: ''
labels: documentation
assignees: ''
---
<!---
1. Verify first that your question is not already reported on GitHub.
2. Verify that your question is not covered in the docs: https://devilbox.readthedocs.io
3. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this question.
-->
#### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Documentation
<!-- DO NOT CHANGE THIS -->
#### SUMMARY
<!-- Add your information here -->
#### Goal
<!-- Explain what you actually want to accomplish -->

View File

@ -1,30 +0,0 @@
---
name: "\U0001F4DD Documentation"
description: Something is missing or wrong in the documentation.
title: "[Docs]: "
labels: ["documentation"]
assignees:
- cytopia
body:
- type: textarea
attributes:
label: What is wrong in the documentation?
description: Tell us, what is wrong in the documentation?
validations:
required: false
- type: textarea
attributes:
label: What is missing in the documentation?
description: Tell us, what is missing in the documentation?
validations:
required: false
- type: dropdown
attributes:
label: Are you willing to provide a PR to address this?
options:
- "Yes"
- "No"

View File

@ -0,0 +1,30 @@
---
name: "✨ Feature request"
about: Suggest an idea for this project
title: ''
labels: feature
assignees: ''
---
<!---
1. Verify first that your feature request is not already reported on GitHub.
2. Verify that your feature is not already implemented: https://devilbox.readthedocs.io
3. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this feature request
-->
#### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Feature request
<!-- DO NOT CHANGE THIS -->
#### SUMMARY
<!-- Explain your feature idea briefly -->
#### Goal
<!-- Explain what you actually want to accomplish with that feature -->

View File

@ -1,36 +0,0 @@
---
name: "✨ Feature request"
description: Suggest an idea or feature for this project
title: "[Feature]: "
labels: ["feature"]
assignees: []
body:
- type: textarea
attributes:
label: What is your idea or feature suggestion?
description: Tell us, what idea or feature you suggest to be added to the Devilbox.
validations:
required: true
- type: textarea
attributes:
label: Benefits
description: Tell us, how this this will be beneficial to the Devilbox.
validations:
required: false
- type: textarea
attributes:
label: Where can we find information about this?
description: If you are proposing a software or tool, please add relevant links and documentation.
validations:
required: false
- type: dropdown
attributes:
label: Are you willing to provide a PR to address this?
options:
- "Yes"
- "No"

View File

@ -1,50 +0,0 @@
---
name: "❔ How to do ...?"
description: How do I do X or Y with the Devilbox?
title: "[Howto]: "
labels: ["question", "Community help wanted"]
assignees: []
body:
- type: markdown
attributes:
value: |
If this is a generic question, please consider using the [Devilbox forum](https://devilbox.discourse.group/) instead.
- type: checkboxes
attributes:
label: Have you already checked elsewhere?
description: You may select more than one.
options:
- label: I have read the [Devilbox documentation](https://devilbox.readthedocs.io/en/latest/)
- label: I have checked the [Devilbox Troubleshooting Guide](https://devilbox.readthedocs.io/en/latest/)
- label: I have checked the [Devilbox FAQ](https://devilbox.readthedocs.io/en/latest/support/faq.html)
- label: I have checked the [Devilbox Howto](https://devilbox.readthedocs.io/en/latest/support/howto.html)
- label: I have checked the [Devilbox Forum](https://devilbox.discourse.group/)
- label: I have checked [existing issues](https://github.com/cytopia/devilbox/issues)
- label: I have googled already with no luck
- label: I have not done any of the above
validations:
required: true
- type: textarea
attributes:
label: What are you struggling with?
description: Tell the community, what you are struggling with. Be as specific as possible to make it easier for other people to answer your question.
validations:
required: true
- type: textarea
attributes:
label: What have you tried already?
description: Add some details on what you have tried already, so this can be ruled out.
validations:
required: true
- type: textarea
attributes:
label: What is your goal?
description: Tell the community, what you want to accomplish? This might be helpful to know in order to prevent [XY problems](https://en.wikipedia.org/wiki/XY_problem).
validations:
required: true

40
.github/ISSUE_TEMPLATE/question.md vendored Normal file
View File

@ -0,0 +1,40 @@
---
name: "❔ Question"
about: 'Consider using the Devilbox Forum instead: https://devilbox.discourse.group/'
title: ''
labels: ''
assignees: ''
---
<!-- ---------- GITHUB QUESTIONS ARE DEPRECATED ---------- -->
<!-- ---------- USE THE FORUM ---------- ->
<!-- ---------- https://devilbox.discourse.group/ ---------- ->
<!---
1. A better place for questions is: https://devilbox.discourse.group/
2. VERIFY first that your question is not already reported on GitHub.
3. VERIFY that your question is not covered in the docs: https://devilbox.readthedocs.io
4. VERIFY that your question is not covered in the forum: https://devilbox.discourse.group/
5. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this question.
-->
#### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Question
<!-- DO NOT CHANGE THIS -->
#### SUMMARY
<!-- Ask your question here -->
#### Goal
<!-- Explain what you actually want to accomplish -->

View File

@ -12,14 +12,9 @@ name: Docs
on:
# Runs on Pull Requests
pull_request:
paths:
- 'docs/**'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- 'docs/**'
- '!**.md'
branches:
- master
@ -36,7 +31,7 @@ jobs:
target:
- build
- linkcheck
# - linkcheck2
- linkcheck2
name: "[Docs ${{ matrix.target }}]"
steps:

View File

@ -29,9 +29,7 @@ env:
{"MYSQL_SERVER": "mariadb-10.5"},
{"MYSQL_SERVER": "mariadb-10.6"},
{"MYSQL_SERVER": "mariadb-10.7"},
{"MYSQL_SERVER": "mariadb-10.8"},
{"MYSQL_SERVER": "mariadb-10.9"},
{"MYSQL_SERVER": "mariadb-10.10"}
{"MYSQL_SERVER": "mariadb-10.8"}
]

View File

@ -34,8 +34,6 @@ env:
{"PGSQL_SERVER": "PgSQL 13-alpine"},
{"PGSQL_SERVER": "PgSQL 14"},
{"PGSQL_SERVER": "PgSQL 14-alpine"},
{"PGSQL_SERVER": "PgSQL 15"},
{"PGSQL_SERVER": "PgSQL 15-alpine"},
{"PGSQL_SERVER": "PgSQL latest"},
{"PGSQL_SERVER": "PgSQL alpine"}
]

View File

@ -25,8 +25,6 @@ env:
{"REDIS_SERVER": "Redis 6.0-alpine"},
{"REDIS_SERVER": "Redis 6.2"},
{"REDIS_SERVER": "Redis 6.2-alpine"},
{"REDIS_SERVER": "Redis 7.0"},
{"REDIS_SERVER": "Redis 7.0-alpine"},
{"REDIS_SERVER": "Redis latest"},
{"REDIS_SERVER": "Redis alpine"}
]

View File

@ -12,32 +12,9 @@ name: Httpd
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:

View File

@ -12,32 +12,9 @@ name: Memcd
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:

View File

@ -12,32 +12,9 @@ name: Mongo
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:

View File

@ -12,32 +12,9 @@ name: MySQL
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:

View File

@ -12,32 +12,9 @@ name: PgSQL
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:

View File

@ -12,32 +12,9 @@ name: PHP
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:

View File

@ -12,32 +12,9 @@ name: Redis
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:

View File

@ -76,7 +76,7 @@ jobs:
cd "${GITHUB_WORKSPACE}/.tests/"
# Test full customization
make configure KEY=DEBUG_ENTRYPOINT VAL="$(( RANDOM % 3 ))"
make configure KEY=DEBUG_COMPOSE_ENTRYPOINT VAL="$(( RANDOM % 3 ))"
make configure KEY=DOCKER_LOGS VAL="$(( RANDOM % 1 ))"
make configure KEY=TLD_SUFFIX VAL=loc2
make configure KEY=TIMEZONE VAL='Europe/Berlin'

6
.gitignore vendored
View File

@ -50,9 +50,9 @@
# Ignore custom global vhost gen templates
/cfg/vhost-gen/apache22.yml
/cfg/vhost-gen/apache24.yml
/cfg/vhost-gen/nginx.yml
/cfg/vhost-gen/apache22.conf
/cfg/vhost-gen/apache24.conf
/cfg/vhost-gen/nginx.conf
# Ignore custom HTTPD configs
/cfg/apache-2.2/*.conf

View File

@ -6,24 +6,12 @@ endif
# -------------------------------------------------------------------------------------------------
# Misc Targets
# -------------------------------------------------------------------------------------------------
.PHONY: update-readme
update-readme: _update-readme-modules
update-readme: _update-readme-tools
.PHONY: _update-readme-modules
_update-readme-modules:
update-readme:
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
@ -63,7 +51,7 @@ pull: ../.env
###
start: ../.env
@$(MAKE) --no-print-directory configure KEY=HOST_PATH_HTTPD_DATADIR VAL=.tests/www
@$(MAKE) --no-print-directory configure KEY=DEBUG_ENTRYPOINT VAL=3
@$(MAKE) --no-print-directory configure KEY=DEBUG_COMPOSE_ENTRYPOINT VAL=2
@$(MAKE) --no-print-directory configure KEY=NEW_UID VAL=$$(id -u)
@$(MAKE) --no-print-directory configure KEY=NEW_GID VAL=$$(id -g)
@$(PWD)/scripts/compose-start.sh

View File

@ -20,70 +20,326 @@ RETRIES=10
# -------------------------------------------------------------------------------------------------
PHP_TAG="$( grep 'devilbox/php' "${DVLBOX_PATH}/docker-compose.yml" | sed 's/^.*-work-//g' )"
PHP_MOD="$( run "curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/doc/php-modules.md'" "${RETRIES}" )";
get_modules() {
local php_version="${1}"
local stage="${2}"
local modules=
local names=
###
### Get PHP core modules (5 rounds)
###
if ! PHP52_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '52-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.2"
exit 1
fi
modules="$( \
echo "${PHP_MOD}" \
| grep -E "ext_${stage}_.+_${php_version}" \
| grep -v '><' \
| sed \
-e "s|.*ext_${stage}_||g" \
-e "s|_${php_version}.*||g" \
)"
# Ensure to fetch name with correct upper-/lower-case
while read -r module; do
name="$( \
echo "${PHP_MOD}" \
| grep -Eio ">${module}<" \
| sed -e 's|>||g' -e 's|<||g' \
| sort -u \
)"
names="$( printf "%s\n%s" "${names}" "${name}" )"
done < <(echo "${modules}")
if ! PHP53_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '53-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.3"
exit 1
fi
# Remove leading and trailing newline
names="$( echo "${names}" | grep -v '^$' )"
if ! PHP54_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '54-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.4"
exit 1
fi
# Output comma separated
echo "${names}" | paste -d, -s
}
if ! PHP55_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '55-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.5"
exit 1
fi
if ! PHP56_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '56-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.6"
exit 1
fi
PHP52_BASE="$( get_modules "5.2" "base" )"
PHP53_BASE="$( get_modules "5.3" "base" )"
PHP54_BASE="$( get_modules "5.4" "base" )"
PHP55_BASE="$( get_modules "5.5" "base" )"
PHP56_BASE="$( get_modules "5.6" "base" )"
PHP70_BASE="$( get_modules "7.0" "base" )"
PHP71_BASE="$( get_modules "7.1" "base" )"
PHP72_BASE="$( get_modules "7.2" "base" )"
PHP73_BASE="$( get_modules "7.3" "base" )"
PHP74_BASE="$( get_modules "7.4" "base" )"
PHP80_BASE="$( get_modules "8.0" "base" )"
PHP81_BASE="$( get_modules "8.1" "base" )"
PHP82_BASE="$( get_modules "8.2" "base" )"
if ! PHP70_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '70-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.0"
exit 1
fi
PHP52_MODS="$( get_modules "5.2" "mods" )"
PHP53_MODS="$( get_modules "5.3" "mods" )"
PHP54_MODS="$( get_modules "5.4" "mods" )"
PHP55_MODS="$( get_modules "5.5" "mods" )"
PHP56_MODS="$( get_modules "5.6" "mods" )"
PHP70_MODS="$( get_modules "7.0" "mods" )"
PHP71_MODS="$( get_modules "7.1" "mods" )"
PHP72_MODS="$( get_modules "7.2" "mods" )"
PHP73_MODS="$( get_modules "7.3" "mods" )"
PHP74_MODS="$( get_modules "7.4" "mods" )"
PHP80_MODS="$( get_modules "8.0" "mods" )"
PHP81_MODS="$( get_modules "8.1" "mods" )"
PHP82_MODS="$( get_modules "8.2" "mods" )"
if ! PHP71_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '71-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.1"
exit 1
fi
if ! PHP72_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '72-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.2"
exit 1
fi
if ! PHP73_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '73-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.3"
exit 1
fi
if ! PHP74_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '74-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.4"
exit 1
fi
if ! PHP80_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '80-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.0"
exit 1
fi
if ! PHP81_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '81-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.1"
exit 1
fi
if ! PHP82_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '82-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.2"
exit 1
fi
###
### Get PHP mods modules (5 rounds)
###
if ! PHP52_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '52-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.2"
exit 1
fi
if ! PHP53_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '53-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.3"
exit 1
fi
if ! PHP54_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '54-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.4"
exit 1
fi
if ! PHP55_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '55-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.5"
exit 1
fi
if ! PHP56_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '56-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.6"
exit 1
fi
if ! PHP70_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '70-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.0"
exit 1
fi
if ! PHP71_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '71-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.1"
exit 1
fi
if ! PHP72_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '72-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.2"
exit 1
fi
if ! PHP73_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '73-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.3"
exit 1
fi
if ! PHP74_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '74-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.4"
exit 1
fi
if ! PHP80_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '80-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.0"
exit 1
fi
if ! PHP81_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '81-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.1"
exit 1
fi
if ! PHP82_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '82-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.2"
exit 1
fi
###
### Todo: add ioncube
@ -94,7 +350,7 @@ MODS="$( echo "${PHP52_MODS}, ${PHP53_MODS}, ${PHP54_MODS}, ${PHP55_MODS}, ${PHP
###
### Get disabled modules
###
DISABLED=",blackfire,ioncube,phalcon,psr,xhprof,$( grep -E '^PHP_MODULES_DISABLE=' "${DVLBOX_PATH}/env-example" | sed 's/.*=//g' ),"
DISABLED=",blackfire,ioncube,phalcon,psr,$( 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)

View File

@ -1,25 +0,0 @@
#!/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

@ -14,7 +14,7 @@ DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
RETRIES=10
# see framework-cakephp-php8.sh for PHP 8+ tests
DISABLED_VERSIONS=("5.2" "5.3" "5.4" "5.5" "5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2")
DISABLED_VERSIONS=("5.2" "5.3" "5.4" "5.5" "8.0" "8.1" "8.2")
PHP_VERSION="$( get_php_version "${DVLBOX_PATH}" )"

View File

@ -13,7 +13,7 @@ DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
. "${SCRIPT_PATH}/../scripts/.lib.sh"
RETRIES=10
DISABLED_VERSIONS=("5.3" "5.4" "5.5" "5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2")
DISABLED_VERSIONS=("5.3" "5.4" "5.5" "5.6" "8.0" "8.1" "8.2")
DISABLED_MYSQL_VERSIONS=("mysql-8.0" "percona-8.0")

View File

@ -71,4 +71,4 @@ run "curl -sS --fail -XPOST 'http://localhost:${HOST_PORT_HTTPD}/mail.php' -d 'e
# Validate
run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_MAIL}' >/dev/null" "${RETRIES}"
run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_SUBJ}' >/dev/null" "${RETRIES}"
run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php?get-body=1' | tac | tac | grep '${MY_MESS}' >/dev/null" "${RETRIES}"
run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_MESS}' >/dev/null" "${RETRIES}"

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,246 +6,7 @@ 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:
* https://github.com/devilbox/docker-nginx-stable/pull/55
* https://github.com/devilbox/docker-nginx-mainline/pull/57
* https://github.com/devilbox/docker-apache-2.2/pull/53
* https://github.com/devilbox/docker-apache-2.4/pull/54
Once it has been tested by the community, and potential errors have been addressed, a new major version will be released.
**IMPORTANT:** This release required you to copy `env-example` over onto `.env` due to some changes in variables.
### TL;DR
1. **Multiple PHP Versions**<br/>
Here is an example to run one project with a specific PHP version<br/>
```bash
# Enable all PHP versions
cp compose/docker-compose.override.yml-php-multi.yml docker-compose.override.yml
# Start default set and php80
docker-compose up php httpd bind php80
```
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```
conf:phpfpm:tcp:php80:9000
```
2. **Automated Reverse Proxy setup**<br/>
Here is an example to proxy one project to a backend service (e.g. NodeJS or Python application, which runs in the PHP container on port 3000)<br/>
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```
conf:rproxy:http:127.0.0.1:3000
```
#### PHP hostnames and IP addresses
| PHP Version | Hostname | IP address |
|-------------|----------|----------------|
| 5.4 | php54 | 172.16.238.201 |
| 5.5 | php55 | 172.16.238.202 |
| 5.6 | php56 | 172.16.238.203 |
| 7.0 | php70 | 172.16.238.204 |
| 7.1 | php71 | 172.16.238.205 |
| 7.2 | php72 | 172.16.238.206 |
| 7.3 | php73 | 172.16.238.207 |
| 7.4 | php74 | 172.16.238.208 |
| 8.0 | php80 | 172.16.238.209 |
| 8.1 | php81 | 172.16.238.210 |
| 8.2 | php82 | 172.16.238.211 |
### Fixed
- Fixed Protocol substitution bug in Reverse Proxy generation for Apache 2.2 and Apache 2.4 [vhost-gen #49](https://github.com/devilbox/vhost-gen/pull/49) [vhost-gen #50](https://github.com/devilbox/vhost-gen/pull/50)
- Fixed missing module `mod_proxy_html` in Apache 2.4 as per requirement from `vhost-gen` for Reverse Proxy setup
- Fixed encoding issue with Apache 2.4 Reverse Proxy by enabling `mod_xml2enc` module (Required by `mod_proxy_html`)
- Allow to run different PHP versions per project. fixes [#146](https://github.com/cytopia/devilbox/issues/146)
### Added
- New HTTPD server capable of auto reverse proxy creation (and different PHP versions per project)
- Intranet: Added Command & Control center to view watcherd logs and retrigger config in case of vhost changes
- Intranet: vhost page now also shows the configured Backend
- Environment variable `DEVILBOX_HTTPD_MGMT_PASS`
- Environment variable `DEVILBOX_HTTPD_MGMT_USER`
- New Docker Compose Override file `docker-compose.override.yml-php-multi.yml` (allows to run multiple PHP versions).
- Update Bind to latest version
### Changed
- Disabled `psr` extension by default [php-psr #78](https://github.com/jbboehr/php-psr/issues/78#issuecomment-722290110)
- Disabled `phalcon` extension by default
- Environment variable `DEBUG_COMPOSE_ENTRYPOINT` renamed to `DEBUG_ENTRYPOINT`
- Environment variable `HTTPD_TIMEOUT_TO_PHP_FPM` renamed to `HTTPD_BACKEND_TIMEOUT`
## Release v2.4.0 (2022-12-18)
This release might be a bit bumpy due to a massive amount of changes in upstream projects. If you encounter issues, please do raise tickets.
### General
#### New PHP-FPM images
This release uses a new set of PHP-FPM images. They have been heavily rewritten and modularized in order to make PHP extension and PHP tool generation more easy. See the following release notes for details:
> 499 changed files with 29,281 additions and 13,977 deletions.
* https://github.com/devilbox/docker-php-fpm/releases/tag/0.145
* https://github.com/devilbox/docker-php-fpm/releases/tag/0.146
* https://github.com/devilbox/docker-php-fpm/releases/tag/0.147
#### How to add modules/tools?
* **[How to build PHP modules](https://github.com/devilbox/docker-php-fpm/blob/master/php_modules/README.md)**
* **[How to install tools in PHP images](https://github.com/devilbox/docker-php-fpm/blob/master/php_tools/README.md)**
#### Available Tools
You can now also find a detailed overview about what tools are installed in what PHP version image. See here: https://github.com/devilbox/docker-php-fpm/blob/master/doc/available-tools.md
#### Gitter -> Discord
Additionally I am moving away from Gitter to **Discord**. See reason and announcement here: https://devilbox.discourse.group/t/migrating-from-gitter-to-discord/716/2
**🎮 Discord:** https://discord.gg/2wP3V6kBj4
### Fixed
- Intranet: Fixed PostgreSQL database overview
- Fixed PATH for all pre-installed composer and node tools
### Changed
- Updated PHP versions (https://github.com/cytopia/devilbox/issues/940)
- Updated MySQL versions
- Intranet: Improved installed tools overview (index.php)
- Intranet: Delayed message loading (https://github.com/cytopia/devilbox/pull/904)
### Added
- Added tool `mhsendmail` for arm64 images
- Added tool `wkhtmltopdf` for arm64 images (https://github.com/cytopia/devilbox/issues/936)
- Added tool `taskfile` (https://github.com/cytopia/devilbox/issues/934)
### Removed
- Removed tool `drush` (detail: https://github.com/cytopia/devilbox/issues/930#issuecomment-1344764908)
## Release v2.3.0 (2022-12-04)
### Fixed
- Fixed correct permission for `/opt/nvm` in PHP container [#499](https://github.com/cytopia/devilbox/issues/499), [#PHP-FPM 0.141](https://github.com/devilbox/docker-php-fpm/releases/tag/0.141)
- Fixed Debian Jessie repository trust beyond EOL [#PHP-FPM 0.140](https://github.com/devilbox/docker-php-fpm/releases/tag/0.140)
- Fixed phpPgAdmin to work with PostgreSQL 15
### Added
- Added env var to Bind to specify overall memory consumption via `MAX_CACHE_SIZE` [#BIND 0.30](https://github.com/cytopia/docker-bind/releases/tag/0.30)
- Added PHP extension: `lz4` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added PHP extension: `lzf` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added PHP extension: `zstd` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added serializer to Redis extension: `lz4`, `lzf` and` zstd` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added MariaDB 10.9 and 10.11 [#MYSQL 0.19](https://github.com/devilbox/docker-mysql/pull/24)
- Added PGSQL 15
- Added Redis 7.0
### Changed
- Switched to `phalcon` 5.x extension for PHP 8.0 and PHP 8.1 [#913](https://github.com/cytopia/devilbox/issues/913), [#PHP-FPM 0.143](https://github.com/devilbox/docker-php-fpm/releases/tag/0.143)
- Updated to latest minor versions of Apache 2.2, Apache 2.4, Nginx stable and Nginx mainline
- Updated to latest minor versions of PHP [#917](https://github.com/cytopia/devilbox/issues/917)
- Updated to latest minor versions of MySQL, MariaDB and Percona DB
- Updated PHP extensions to lastest versions [#899](https://github.com/cytopia/devilbox/issues/899)
### Removed
- Removed Phalcon DevTools for PHP 7.4 due to build error [#PHP-FPM 0.142](https://github.com/devilbox/docker-php-fpm/releases/tag/0.142)
## Release v2.2.0 (2022-04-14)
This release adds PHP-FPM community images via `docker-compose.override.yml`, which easily allows you
to build upon existing PHP images and customize them for your usecase/workflow.
#### Added
- Added PHP-FPM Community images: https://github.com/devilbox/docker-php-fpm-community/
## Release v2.1.1 (2022-04-07)
#### Changed
- Used tagged PHP images (auto-updating)instead early release branch one.
## Release v2.1.0 (2022-04-05)
This is now a 100% `arm64` compatible release.
#### Fixed
- Fixed imklog: cannot open kernel log (/proc/kmsg): Operation not permitted.
- Fixed missing `arm64` support: [#855](https://github.com/cytopia/devilbox/issues/855)
#### Added
- Added PHP images with `arm64` support for PHP: https://github.com/devilbox/docker-php-fpm/releases/tag/0.138
- Added `vips` to PHP 8.0
- Added `vips` to PHP 8.1
- Added `swoole` to PHP 8.1
#### Removed
- Removed homebrew due to arm64 issues
- Removed Ansible due to arm64 issues
## Release v2.0.0 (2022-03-28)
## Release v2.0.0 (2022-04-01)
The goal of this release is to reduce the overall size of Docker images and bring in latest versions.

1186
README.md

File diff suppressed because it is too large Load Diff

View File

@ -3,17 +3,6 @@
This document will hold all information on how to update between major versions.
## Update from `v2.4.0` to `v3.0.0` (`v3.0.0-beta-1`)
**PR:** https://github.com/cytopia/devilbox/pull/942
This PR introduces new `.env` variables, so you are required to copy `env-example` over to `.env`.
Also ensure to stop and remove containers.
```bash
docker-compose stop
docker-compose rm -f
```
## Update from `v1.8.1` to `v1.8.2`
**PR:** https://github.com/cytopia/devilbox/pull/750

View File

@ -1,5 +0,0 @@
[mysqld]
;key_buffer_size=16M
[mysqldump]
;quick

View File

@ -1,5 +0,0 @@
[mysqld]
;key_buffer_size=16M
[mysqldump]
;quick

View File

@ -1,5 +0,0 @@
[mysqld]
;key_buffer_size=16M
[mysqldump]
;quick

View File

@ -1,4 +1,4 @@
# PHP-FPM 5.3 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 5.4 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 5.5 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 5.6 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 7.0 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 7.1 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 7.2 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 7.3 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 7.4 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 8.0 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 8.1 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP-FPM 8.2 config directory
# PHP-FPM config directory
## General

View File

@ -1,4 +1,4 @@
# PHP 5.2 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 5.3 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 5.4 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 5.5 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 5.6 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 7.0 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 7.1 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 7.2 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 7.3 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 7.4 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 8.0 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 8.1 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# PHP 8.2 ini directory
# PHP ini directory
## General

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 5.2 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 5.3 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 5.4 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 5.5 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 5.6 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 7.0 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 7.1 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 7.2 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 7.3 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 7.4 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 8.0 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 8.1 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (for PHP 8.2 only)
# Custom startup scripts (per PHP version)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires

View File

@ -34,23 +34,10 @@
# __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__
@ -58,17 +45,11 @@ vhost: |
CustomLog "__ACCESS_LOG__" combined
ErrorLog "__ERROR_LOG__"
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyVia: Add "Via" header
ProxyRequests Off
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
ProxyRequests On
ProxyPreserveHost 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>
ProxyPass / http://php:8000/
ProxyPassReverse / http://php:8000/
__REDIRECT__
__SSL__
@ -111,7 +92,6 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -121,10 +101,10 @@ features:
deny: |
# Deny Definition
<LocationMatch "__REGEX__">
<FilesMatch "__REGEX__">
Order allow,deny
Deny from all
</LocationMatch>
</FilesMatch>
server_status: |
# Status Page
@ -134,16 +114,13 @@ 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 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 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-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

@ -40,23 +40,10 @@
# __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__
@ -67,13 +54,13 @@ vhost: |
__REDIRECT__
__SSL__
__VHOST_DOCROOT__
__VHOST_RPROXY__
__PHP_FPM__
__ALIASES__
__DENIES__
__SERVER_STATUS__
# Custom directives
__CUSTOM__
__VHOST_RPROXY__
</VirtualHost>
###
@ -97,38 +84,13 @@ vhost_type:
Allow from all
</Directory>
# Reverse Proxy (-r http(s)://ADDR:PORT)
# Reverse Proxy (-r)
rproxy: |
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyVia: Add "Via" header
ProxyRequests Off
# Define the vhost to reverse proxy
ProxyRequests On
ProxyPreserveHost 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
# 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>
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
ProxyPassReverse __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
###
@ -158,7 +120,6 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -168,10 +129,10 @@ features:
deny: |
# Deny Definition
<LocationMatch "__REGEX__">
<FilesMatch "__REGEX__">
Order allow,deny
Deny from all
</LocationMatch>
</FilesMatch>
server_status: |
# Status Page
@ -181,16 +142,13 @@ 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 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 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-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

@ -34,17 +34,6 @@
# __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
@ -57,19 +46,11 @@ vhost: |
CustomLog "__ACCESS_LOG__" combined
ErrorLog "__ERROR_LOG__"
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyAddHeaders: Add "X-Forward-*" headers
# ProxyVia: Add "Via" header
ProxyRequests Off
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
ProxyRequests On
ProxyPreserveHost On
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>
ProxyPass / http://php:8000/
ProxyPassReverse / http://php:8000/
__REDIRECT__
__SSL__
@ -112,7 +93,6 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -123,10 +103,10 @@ features:
deny: |
# Deny Definition
<LocationMatch "__REGEX__">
<FilesMatch "__REGEX__">
Order allow,deny
Deny from all
</LocationMatch>
</FilesMatch>
server_status: |
# Status Page
@ -137,16 +117,13 @@ 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 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 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-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

@ -40,17 +40,6 @@
# __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
@ -97,42 +86,13 @@ vhost_type:
Require all granted
</Directory>
# Reverse Proxy (-r http(s)://ADDR:PORT)
# Reverse Proxy (-r)
rproxy: |
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyAddHeaders: Add "X-Forward-*" headers
# ProxyVia: Add "Via" header
ProxyRequests Off
# Define the vhost to reverse proxy
ProxyRequests On
ProxyPreserveHost On
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>
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
ProxyPassReverse __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
###
@ -181,7 +141,6 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -192,10 +151,10 @@ features:
deny: |
# Deny Definition
<LocationMatch "__REGEX__">
<FilesMatch "__REGEX__">
Order allow,deny
Deny from all
</LocationMatch>
</FilesMatch>
server_status: |
# Status Page
@ -206,16 +165,13 @@ 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 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 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-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

@ -48,11 +48,8 @@ vhost: |
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
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;
# Proxy connection
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://php:8000;
}
@ -114,12 +111,11 @@ 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' '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-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-Max-Age' 0;
return 200;
}

View File

@ -75,31 +75,12 @@ vhost_type:
root "__DOCUMENT_ROOT__";
index __INDEX__;
# Reverse Proxy (-r http(s)://ADDR:PORT)
# Reverse Proxy (-r)
rproxy: |
# Define Reverse Proxy
# Define the vhost to reverse proxy
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;
# 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_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__;
}
@ -166,12 +147,11 @@ 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' '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-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-Max-Age' 0;
return 200;
}

View File

@ -219,13 +219,13 @@ 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}" != "4" ]; then
log_err "Variable 'DEBUG_ENTRYPOINT' should be 0, 1, 2, 3 or 4. Has: ${DEBUG_ENTRYPOINT}"
DEBUG_COMPOSE_ENTRYPOINT="$( get_env_value "DEBUG_COMPOSE_ENTRYPOINT" )"
if [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "0" ] && [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "1" ] && [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "2" ]; then
log_err "Variable 'DEBUG_COMPOSE_ENTRYPOINT' should be 0, 1 or 2. Has: ${DEBUG_COMPOSE_ENTRYPOINT}"
RET_CODE=$(( RET_CODE + 1))
WRONG_ENV_FILES_VALUES=1
else
log_debug "Variable 'DEBUG_ENTRYPOINT' has correct value: ${DEBUG_ENTRYPOINT}"
log_debug "Variable 'DEBUG_COMPOSE_ENTRYPOINT' has correct value: ${DEBUG_COMPOSE_ENTRYPOINT}"
fi
DOCKER_LOGS="$( get_env_value "DOCKER_LOGS" )"
@ -430,7 +430,7 @@ fi
#--------------------------------------------------------------------------------------------------
# Ensure cfg/ and log/ directories exist
# Ensure cfg/, mod/ and log/ directories exist
#--------------------------------------------------------------------------------------------------
print_head_1 "Checking required Devilbox core directories exist"
@ -464,6 +464,21 @@ if [ "${DIR_MISSING}" = "0" ]; then
log_ok "All PHP log/ sub directories are present"
fi
# /mod/php-fpm-VERSION
DIR_MISSING=0
while read -r php_version; do
if [ ! -d "mod/php-fpm-${php_version}" ]; then
log_err "Directory 'mod/php-fpm-${php_version}' is missing"
RET_CODE=$(( RET_CODE + 1))
DIR_MISSING=1
else
log_debug "Directory 'mod/php-fpm-${php_version}' is present"
fi
done < <(grep -E '^#?PHP_SERVER=' env-example | awk -F'=' '{print $2}')
if [ "${DIR_MISSING}" = "0" ]; then
log_ok "All PHP mod/ sub directories are present"
fi
# /cfg/apache|nginx-VERSION
DIR_MISSING=0
while read -r httpd_version; do
@ -507,6 +522,7 @@ DEVILBOX_DIRS=(
"cfg"
"compose"
"log"
"mod"
"supervisor"
)
@ -575,6 +591,7 @@ DEVILBOX_DIRS=(
"ca"
"cfg"
"compose"
"mod"
"supervisor"
)

View File

@ -7,12 +7,6 @@ version: '2.3'
###
services:
# -----------------------------------------------------------------------------------------------
# PHP Community image
# -----------------------------------------------------------------------------------------------
php:
image: devilbox/php-fpm-community:${PHP_SERVER}-${PHP_COMMUNITY_FLAVOUR:-devilbox}
# -----------------------------------------------------------------------------------------------
# Blackfire
# -----------------------------------------------------------------------------------------------
@ -243,26 +237,6 @@ services:
- bind
- httpd
# -----------------------------------------------------------------------------------------------
# Meilisearch
# -----------------------------------------------------------------------------------------------
meilisearch:
image: getmeili/meilisearch:${MEILI_SERVER:-latest}
hostname: meilisearch
command: meilisearch
environment:
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY-""}
ports:
- "${LOCAL_LISTEN_ADDR}${HOST_PORT_MEILI:-7700}:7700"
networks:
app_net:
ipv4_address: 172.16.238.203
volumes:
- devilbox-meilisearch:/meili_data
depends_on:
- bind
- php
- httpd
###
### Volumes
@ -272,4 +246,3 @@ volumes:
devilbox-solr:
devilbox-elastic:
devilbox-logstash:
devilbox-meilisearch:

View File

@ -1,29 +0,0 @@
# vim: set ft=yaml:
---
version: '2.3'
services:
# -----------------------------------------------------------------------------------------------
# Meilisearch
# -----------------------------------------------------------------------------------------------
meilisearch:
image: getmeili/meilisearch:${MEILI_SERVER:-latest}
hostname: meilisearch
command: meilisearch
environment:
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY-""}
ports:
- "${LOCAL_LISTEN_ADDR}${HOST_PORT_MEILI:-7700}:7700"
networks:
app_net:
ipv4_address: 172.16.238.203
volumes:
- devilbox-meilisearch:/meili_data
depends_on:
- bind
- php
- httpd
volumes:
devilbox-meilisearch:

View File

@ -1,11 +0,0 @@
# vim: set ft=yaml:
---
version: '2.3'
services:
# -----------------------------------------------------------------------------------------------
# PHP Community image
# -----------------------------------------------------------------------------------------------
php:
image: devilbox/php-fpm-community:${PHP_SERVER}-${PHP_COMMUNITY_FLAVOUR:-devilbox}

View File

@ -1,231 +0,0 @@
# vim: set ft=yaml:
---
version: '2.3'
# ------------------------------------------------------------
# Yaml Default
# ------------------------------------------------------------
###
### Default PHP-FPM config
###
x-app: &default-php
env_file:
- ./.env
environment:
# Debug/Logging
- DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT:-2}
- DOCKER_LOGS=1
# Enable/Disable PHP Modules
- ENABLE_MODULES=${PHP_MODULES_ENABLE}
- DISABLE_MODULES=${PHP_MODULES_DISABLE}
# Mail-catching
- ENABLE_MAIL=${PHP_MAIL_CATCH_ALL:-2}
dns:
- 172.16.238.100
depends_on:
- bind
# ------------------------------------------------------------
# PHP Services
# ------------------------------------------------------------
services:
php54:
<<: *default-php
image: devilbox/php-fpm:5.4-prod-0.150
hostname: php54
networks:
app_net:
ipv4_address: 172.16.238.201
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php55:
<<: *default-php
image: devilbox/php-fpm:5.5-prod-0.150
hostname: php55
networks:
app_net:
ipv4_address: 172.16.238.202
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php56:
<<: *default-php
image: devilbox/php-fpm:5.6-prod-0.150
hostname: php56
networks:
app_net:
ipv4_address: 172.16.238.203
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php70:
<<: *default-php
image: devilbox/php-fpm:7.0-prod-0.150
hostname: php70
networks:
app_net:
ipv4_address: 172.16.238.204
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php71:
<<: *default-php
image: devilbox/php-fpm:7.1-prod-0.150
hostname: php71
networks:
app_net:
ipv4_address: 172.16.238.205
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php72:
<<: *default-php
image: devilbox/php-fpm:7.2-prod-0.150
hostname: php72
networks:
app_net:
ipv4_address: 172.16.238.206
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php73:
<<: *default-php
image: devilbox/php-fpm:7.3-prod-0.150
hostname: php73
networks:
app_net:
ipv4_address: 172.16.238.207
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php74:
<<: *default-php
image: devilbox/php-fpm:7.4-prod-0.150
hostname: php74
networks:
app_net:
ipv4_address: 172.16.238.208
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php80:
<<: *default-php
image: devilbox/php-fpm:8.0-prod-0.150
hostname: php80
networks:
app_net:
ipv4_address: 172.16.238.209
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php81:
<<: *default-php
image: devilbox/php-fpm:8.1-prod-0.150
hostname: php81
networks:
app_net:
ipv4_address: 172.16.238.210
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}
php82:
<<: *default-php
image: devilbox/php-fpm:8.2-prod-0.150
hostname: php82
networks:
app_net:
ipv4_address: 172.16.238.211
volumes:
# 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}
# 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-mail:/var/mail:rw${MOUNT_OPTIONS}

Some files were not shown because too many files have changed in this diff Show More