Compare commits

...

70 Commits

Author SHA1 Message Date
7f3b45b387 Update REAMDE 2022-12-30 14:21:39 +01:00
81c9bb0a93 Merge pull request #943 from cytopia/release/v3.0.0-beta-0.2
Release/v3.0.0 beta 0.2
2022-12-27 15:28:16 +01:00
cb07f319de Pin HTTPD server 2022-12-27 13:00:21 +01:00
cca1744145 Bump version date 2022-12-27 12:52:19 +01:00
9fc97586e6 Intranet: show local daemons if netstat is available 2022-12-27 12:28:42 +01:00
2db5ffff6b Pin PHP versions 2022-12-27 12:26:47 +01:00
0dc1b9cafb Intranet: Make vhost page less jumpy 2022-12-27 12:24:28 +01:00
b05f4240f3 Update vhost-gen templates 2022-12-27 02:58:40 +01:00
e18e923d87 Update Changelog 2022-12-26 23:01:57 +01:00
c6e1192429 Disable linkcheck2, works locally, breaks on CI 2022-12-26 23:01:34 +01:00
634b9af7e5 Intranet vhost page: accept HTTP 426 for project gathering 2022-12-26 22:59:13 +01:00
a1fa5724e8 Update vhost-gen templates 2022-12-26 16:03:05 +01:00
a786eb64b0 Update CHANGELOG 2022-12-26 14:51:25 +01:00
01d2f4afed Remove autostart mounts from compose override php images 2022-12-26 14:51:03 +01:00
873abc6c4c Update docker images 2022-12-26 14:50:37 +01:00
1ba3cd399c Intranet: Reverse Proxy/Websockets do not need a htdocs directory 2022-12-26 14:13:36 +01:00
299b765652 Websock: Allow HTTP 426 for DNS check (Upgrade) 2022-12-26 14:13:01 +01:00
6819619d8a Merge pull request #942 from cytopia/release/v3.0.0-beta-0.1
🎅🎄🎁
2022-12-25 20:42:06 +01:00
3ffb360c51 Update check-config.sh 2022-12-25 18:41:26 +01:00
025b45c48c Fix IPv6 handling 2022-12-25 18:11:25 +01:00
10571f7b51 Intranet: Show backend type on vhost page 2022-12-25 18:06:35 +01:00
ffba5d61b7 Remove obsolete mod/ directory 2022-12-25 17:40:02 +01:00
200f6ce0b1 Fix volume paths in php-multi compose files 2022-12-25 17:38:40 +01:00
8b0788b403 Add PHP version number to README files in cfg/ dir 2022-12-25 17:37:58 +01:00
dfda00d78a Pinned HTTPD images 2022-12-25 16:48:46 +01:00
98f05d7570 Updated UPDATING.md 2022-12-25 16:48:32 +01:00
a560926315 Removed obsolete supervisorctl config section 2022-12-25 16:48:15 +01:00
e60aa4e465 Remove obsolete points from README 2022-12-25 15:59:57 +01:00
d5858da3e0 Fix indentation 2022-12-25 15:42:10 +01:00
c64c4553d7 Remove obsolete mounts from docker-compose 2022-12-25 15:41:21 +01:00
55f0447ce1 Add some colored output for logs in C&C 2022-12-25 15:40:45 +01:00
0e3b963df2 Do not rely on external supervisord.conf for C&C web interface 2022-12-24 13:28:51 +01:00
0964c7bdd9 Fix hostnames in CHANGELOG 2022-12-24 13:01:58 +01:00
3b1c0b25a5 docs: fix bind links 2022-12-23 23:03:13 +01:00
32c7beda22 Fix magento install guide links 2022-12-23 22:56:36 +01:00
794bf0c27c Atom no longer available 2022-12-23 22:52:56 +01:00
e51f34c1ae Fix wrong link in docs 2022-12-23 22:28:43 +01:00
6b80453b92 Docs announce 2022-12-23 21:42:45 +01:00
6fa03e6961 Fix env var names in docs 2022-12-23 21:07:34 +01:00
e3b7c2d4db Adjust check-config.sh 2022-12-23 20:01:44 +01:00
2b4bf59a40 Add missing mariadb config directories 2022-12-23 19:59:14 +01:00
ee5988507e Update CHANGELOG 2022-12-23 19:45:20 +01:00
d354d84165 Update intranet and docker-compose 2022-12-23 19:37:50 +01:00
f2c0372618 Update DNS server to latest version 2022-12-23 19:36:10 +01:00
a35216fdfb Add Docker Compose Override File for Multi PHP versions 2022-12-23 19:35:54 +01:00
2828e837d9 Merge pull request #910 from minhchu/support-meilisearch
Add support for meilisearch
2022-12-20 10:46:40 +01:00
685e09f76b Merge branch 'master' into support-meilisearch 2022-12-20 00:03:23 +01:00
04c0e27ebf Merge pull request #920 from Cleancookie/master
shell.sh to fall back to docker compose (no dash)
2022-12-20 00:02:56 +01:00
7645068258 Merge branch 'master' into master 2022-12-18 23:31:03 +01:00
b5566c1c52 Merge pull request #941 from cytopia/release/v2.4.0
Release/v2.4.0
2022-12-18 22:56:34 +01:00
826859a1cd Merge branch 'master' into release/v2.4.0 2022-12-18 18:00:44 +01:00
71064a7296 Update CHANGELOG 2022-12-18 15:50:47 +01:00
f2088d63a7 Disable Drupal test due to removed drush 2022-12-18 15:49:28 +01:00
8b70a01a16 Update CHANGELOG and version 2022-12-18 15:05:54 +01:00
a5f28e80c3 Switching to Discord 2022-12-18 14:45:40 +01:00
48e7133825 Intranet: Improved installed tools overview 2022-12-18 14:38:19 +01:00
2e33d991b7 Fixed PostgreSQL database overview in intranet 2022-12-18 14:37:05 +01:00
8227605036 Refs #940, #936, #934, #930 Update PHP versions 2022-12-18 14:35:51 +01:00
565a5c7427 Updated MySQL versions 2022-12-18 14:34:12 +01:00
eb5ecc836c Merge branch 'cytopia:master' into support-meilisearch 2022-12-16 11:59:28 +07:00
c165fd2ba0 Merge pull request #904 from mmcev106/large-email-support
Delayed message body loading
2022-12-13 10:35:28 +01:00
d2d1ddfb63 PHP 5.3 fix 2022-12-12 13:54:33 -06:00
f7c58ddbc4 Fixed email unit test 2022-12-12 10:38:31 -06:00
8bde34caaf Merge branch 'master' into master 2022-12-11 14:20:50 +01:00
441adbb66d Merge branch 'master' into support-meilisearch 2022-12-11 14:14:50 +01:00
b5a6c0e6ad Merge branch 'master' into large-email-support 2022-12-11 06:24:22 +01:00
e8a6fe51e7 shell.sh now falls back to docker compose (no dash) 2022-11-30 13:57:58 +00:00
fb64b0bd31 Add docs for Meilisearch 2022-08-01 00:29:03 +07:00
12e613188e Add support for meilisearch 2022-07-31 01:06:13 +07:00
234bdd6419 Delayed message body loading 2022-06-20 15:13:20 -05:00
99 changed files with 2180 additions and 769 deletions

View File

@ -13,8 +13,8 @@ error_reporting(-1);
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
$DEVILBOX_VERSION = 'v2.3.0';
$DEVILBOX_DATE = '2022-12-04';
$DEVILBOX_VERSION = 'v3.0.0-beta-0.2';
$DEVILBOX_DATE = '2022-12-27';
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
//

View File

@ -36,31 +36,32 @@ 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'] == 'composer') {
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') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getComposerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drupalc') {
else if ($_GET['software'] == 'deployer') {
echo json_encode(array(
$_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
$_GET['software'] => (($version = loadClass('Php')->getDeployerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'git') {
@ -68,9 +69,24 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getGitVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'laravel') {
else if ($_GET['software'] == 'grunt_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getLaravelVersion()) !== false) ? $version : $no
$_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
));
}
else if ($_GET['software'] == 'mds') {
@ -78,6 +94,11 @@ 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
@ -88,20 +109,51 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getNpmVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'phalcon') {
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') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getPhalconVersion()) !== false) ? $version : $no
$_GET['software'] => (($version = loadClass('Php')->getPhpunitVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'symfony') {
else if ($_GET['software'] == 'stylelint') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getSymfonyVersion()) !== false) ? $version : $no
$_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
));
}
else if ($_GET['software'] == 'wpcli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== 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

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

@ -0,0 +1,179 @@
<?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 a change to any vhost settings, you can trigger a manual reload here.</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,10 +334,117 @@ $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> PHP Container Setup</div>
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> Available CLI Tools</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>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>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>
@ -374,78 +481,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
</tr>
</tbody>
</table>
<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>
<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>
@ -913,19 +949,28 @@ $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('drupalc');
updateVersions('drush7');
updateVersions('drush8');
updateVersions('drush9');
updateVersions('deployer');
updateVersions('git');
updateVersions('laravel');
updateVersions('grunt_cli');
updateVersions('gulp');
updateVersions('laravel_installer');
updateVersions('laravel_lumen');
updateVersions('mds');
updateVersions('mupdf_tools');
updateVersions('node');
updateVersions('npm');
updateVersions('phalcon');
updateVersions('symfony');
updateVersions('phalcon_devtools');
updateVersions('phpunit');
updateVersions('stylelint');
updateVersions('symfony_cli');
updateVersions('vue_cli');
updateVersions('webpack_cli');
updateVersions('wpcli');
updateVersions('yarn');
})();
</script>
</body>

View File

@ -24,6 +24,28 @@ 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'];
@ -171,17 +193,6 @@ $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>
@ -198,17 +209,13 @@ $messages = $MyMbox->get($sortOrderArr);
<tr id="mail-<?php echo $data['num'];?>" style="display:none">
<td></td>
<td colspan="5">
<?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; ?>
<div class="email-body"></div>
<div class="alert alert-warning" role="alert" style="display:none">
No valid body found
</div>
<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><?php echo $message;?></pre></div>
<div class="collapse" id="email-<?php echo $data['num'];?>"><pre class="raw-email-body"></pre></div>
</td>
</tr>
<?php endforeach; ?>
@ -227,12 +234,34 @@ $messages = $MyMbox->get($sortOrderArr);
<script>
$(function() {
$('.subject').click(function() {
var id = ($(this).attr('id'));
$('#mail-'+id).toggle();
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>
<script src="/assets/js/html-email.js"></script>
</body>
</html>

View File

@ -24,31 +24,28 @@
<tr>
<th>Project</th>
<th>DocumentRoot</th>
<th>Backend</th>
<th>Config</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>
<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>
<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'];?>">&nbsp;&nbsp;&nbsp;</td>
<td id="href-<?php echo $vHost['name'];?>"><?php echo $filler;?></td>
<td style="min-width:60px;" class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>"></td>
<td style="min-width:260px;" id="href-<?php echo $vHost['name'];?>"></td>
</tr>
<input type="hidden" name="vhost[]" class="vhost" value="<?php echo $vHost['name'];?>" />
<?php endforeach; ?>
@ -63,6 +60,60 @@
</div>
</div>
<?php
$cmd="netstat -wneeplt 2>/dev/null | sort | grep '\s1000\s' | awk '{print \"app=\"\$9\"|addr=\"\$4}' | sed 's/\(app=\)\([0-9]*\/\)/\\1/g' | sed 's/\(.*\)\(:[0-9][0-9]*\)/\\1|port=\\2/g' | sed 's/port=:/port=/g'";
$output=loadClass('Helper')->exec($cmd);
$daemons = array();
foreach (preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
$section = preg_split("/\|/", $line);
if (count($section) == 3) {
$tool = preg_split("/=/", $section[0]);
$addr = preg_split("/=/", $section[1]);
$port = preg_split("/=/", $section[2]);
$tool = $tool[1];
$addr = $addr[1];
$port = $port[1];
$daemons[] = array(
'tool' => $tool,
'addr' => $addr,
'port' => $port
);
}
}
?>
<?php if (count($daemons)): ?>
<br/>
<br/>
<div class="row">
<div class="col-md-12">
<h2>Local listening daemons</h2>
<table class="table table-striped">
<thead class="thead-inverse">
<tr>
<th>Application</th>
<th>Listen Address</th>
<th>Listen Port</th>
<th>Host</th>
</tr>
</thead>
<tbody>
<?php foreach ($daemons as $daemon): ?>
<tr>
<td><?php echo $daemon['tool']; ?></td>
<td><?php echo $daemon['addr']; ?></td>
<td><?php echo $daemon['port']; ?></td>
<td>php (172.16.238.10)</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<?php endif; ?>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
@ -81,7 +132,7 @@
var el_valid;
var el_href;
if (this.readyState == 4 && this.status == 200) {
if (this.readyState == 4 && this.status == 200 || this.status == 426) {
el_valid = document.getElementById('valid-' + vhost);
el_href = document.getElementById('href-' + vhost);
error = this.responseText;
@ -127,13 +178,14 @@
var el_href = document.getElementById('href-' + vhost);
var error = this.responseText;
if (this.readyState == 4 && this.status == 200) {
if (this.readyState == 4 && (this.status == 200 || this.status == 426)) {
clearTimeout(xmlHttpTimeout);
el_valid.className += ' bg-success';
if (el_valid.innerHTML != 'WARN') {
el_valid.innerHTML = 'OK';
}
el_href.innerHTML = '<a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>' + el_href.innerHTML;
//el_href.innerHTML = '(<a target="_blank" href="'+proto+'//localhost/devilbox-project/'+name+'">ext</a>) <a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>' + el_href.innerHTML;
el_href.innerHTML = '<a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>';
} else {
//console.log(vhost);
}

View File

@ -18,6 +18,10 @@ class Html
'name' => 'Virtual Hosts',
'path' => '/vhosts.php'
),
array(
'name' => 'C&C',
'path' => '/cnc.php'
),
array(
'name' => 'Emails',
'path' => '/mail.php'

View File

@ -70,6 +70,22 @@ 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.
*
@ -87,13 +103,7 @@ class Mail
// Get messages in reverse order (last entry first)
for ($n = $total; $n >= 0; --$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)
);
$messages[] = $this->getMessage($n);
}
// Optionally sort messages

View File

@ -29,10 +29,18 @@ class Httpd extends BaseClass implements BaseInterface
$url = 'http://'.$domain;
$error = array();
// 1. Check htdocs folder
if (!$this->_is_valid_dir($docroot)) {
$error[] = 'error';
$error[] = 'Missing <strong>'.$htdocs.'</strong> directory in: <strong>'.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/</strong>';
$backend = $this->getVhostBackend($vhost);
$pos_def = strpos($backend, 'default');
$pos_phpfpm = strpos($backend, 'tcp://');
// Only if backend 'default' or 'phpfpm', we need a htdocs/ directory
if ( ($pos_def !== false && $pos_def == 0) || ($pos_phpfpm !== false && $pos_phpfpm == 0) ) {
// 1. Check htdocs folder
if (!$this->_is_valid_dir($docroot)) {
$error[] = 'error';
$error[] = 'Missing <strong>'.$htdocs.'</strong> directory in: <strong>'.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/</strong>';
}
}
// 2. Check internal DNS server
@ -196,6 +204,33 @@ 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,7 +71,8 @@ class Pgsql extends BaseClass implements BaseInterface
public function __destruct()
{
if ($this->_link) {
pg_close($this->_link);
// DO NOT CLOSE. It is kind of shared.
//pg_close($this->_link);
}
}
@ -148,7 +149,7 @@ class Pgsql extends BaseClass implements BaseInterface
// Get schemas for each database
foreach ($databases as $name => &$database) {
$PSQL = new Pgsql(
$this->getIpAddress(),
$GLOBALS['PGSQL_HOST_NAME'],
array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),
@ -179,7 +180,7 @@ class Pgsql extends BaseClass implements BaseInterface
public function getSchemaSize($database, $schema)
{
$PSQL = new Pgsql(
$this->getIpAddress(),
$GLOBALS['PGSQL_HOST_NAME'],
array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),
@ -217,7 +218,7 @@ class Pgsql extends BaseClass implements BaseInterface
public function getTableCount($database, $schema)
{
$PSQL = new Pgsql(
$this->getIpAddress(),
$GLOBALS['PGSQL_HOST_NAME'],
array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),

View File

@ -35,9 +35,19 @@ class Php extends BaseClass implements BaseInterface
$uid = loadClass('Helper')->egrep('/[0-9]+/', $uid);
return $uid;
}
public function getGitVersion()
public function getAngularCliVersion()
{
$output = loadClass('Helper')->exec('git --version 2>/dev/null', $output);
$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);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getComposerVersion()
@ -45,15 +55,45 @@ 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 getDrushVersion($version)
public function getDeployerVersion()
{
$output = loadClass('Helper')->exec('drush'.$version.' --version 2>/dev/null', $output);
$output = loadClass('Helper')->exec('dep --version --no-ansi 2>/dev/null | grep -i ^Deploy', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getDrupalConsoleVersion()
public function getGitVersion()
{
$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);
$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);
}
public function getNodeVersion()
{
@ -65,31 +105,56 @@ 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 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()
public function getPhalconDevtoolsVersion()
{
$output = loadClass('Helper')->exec('phalcon --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getSymfonyVersion()
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()
{
$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 getWpcliVersion()
public function getVueCliVersion()
{
$output = loadClass('Helper')->exec('wp --version 2>/dev/null', $output);
$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);
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

@ -1,12 +1,18 @@
---
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 Gitter Chat
url: https://gitter.im/devilbox/Lobby
about: Please ask and answer questions here.
- name: Devilbox documentation
url: https://devilbox.readthedocs.io/
about: Find the Devilbox documentation here.

View File

@ -36,7 +36,7 @@ jobs:
target:
- build
- linkcheck
- linkcheck2
# - linkcheck2
name: "[Docs ${{ matrix.target }}]"
steps:

View File

@ -76,7 +76,7 @@ jobs:
cd "${GITHUB_WORKSPACE}/.tests/"
# Test full customization
make configure KEY=DEBUG_COMPOSE_ENTRYPOINT VAL="$(( RANDOM % 3 ))"
make configure KEY=DEBUG_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'

View File

@ -51,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_COMPOSE_ENTRYPOINT VAL=2
@$(MAKE) --no-print-directory configure KEY=DEBUG_ENTRYPOINT VAL=3
@$(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

@ -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" "8.0" "8.1" "8.2")
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_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' | tac | tac | grep '${MY_MESS}' >/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}"

View File

@ -6,6 +6,164 @@ Make sure to have a look at [UPDATING.md](https://github.com/cytopia/devilbox/bl
## Unreleased
## 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: 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

985
README.md

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,17 @@
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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version)
# Custom startup scripts (for PHP 5.2 only)
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 (per PHP version)
# Custom startup scripts (for PHP 5.3 only)
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 (per PHP version)
# Custom startup scripts (for PHP 5.4 only)
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 (per PHP version)
# Custom startup scripts (for PHP 5.5 only)
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 (per PHP version)
# Custom startup scripts (for PHP 5.6 only)
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 (per PHP version)
# Custom startup scripts (for PHP 7.0 only)
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 (per PHP version)
# Custom startup scripts (for PHP 7.1 only)
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 (per PHP version)
# Custom startup scripts (for PHP 7.2 only)
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 (per PHP version)
# Custom startup scripts (for PHP 7.3 only)
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 (per PHP version)
# Custom startup scripts (for PHP 7.4 only)
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 (per PHP version)
# Custom startup scripts (for PHP 8.0 only)
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 (per PHP version)
# Custom startup scripts (for PHP 8.1 only)
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 (per PHP version)
# Custom startup scripts (for PHP 8.2 only)
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,10 +34,23 @@
# __ERROR_LOG__
#
###
### Notes about Apache
###
#
# 1. Each same directive is checked in order of definition (last one wins)
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
# * Last match always takes precedence
#
# Exception: Directories, where shortest path is matched first
# Exception: ProxyPass and Alias first match and then stops
###
### Basic vHost skeleton
###
### Note: Reverse Proxy section must be last for Apache 2.2
###
vhost: |
<VirtualHost __DEFAULT_VHOST__:__PORT__>
ServerName __VHOST_NAME__
@ -45,11 +58,17 @@ vhost: |
CustomLog "__ACCESS_LOG__" combined
ErrorLog "__ERROR_LOG__"
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
ProxyRequests On
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://php:8000/
ProxyPassReverse / http://php:8000/
ProxyVia On
<Location />
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
ProxyPass http://php:8000/ retry=0
ProxyPassReverse http://php:8000/
</Location>
__REDIRECT__
__SSL__
@ -92,6 +111,7 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -101,10 +121,10 @@ features:
deny: |
# Deny Definition
<FilesMatch "__REGEX__">
<LocationMatch "__REGEX__">
Order allow,deny
Deny from all
</FilesMatch>
</LocationMatch>
server_status: |
# Status Page

View File

@ -40,10 +40,23 @@
# __PHP_PORT__
#
###
### Notes about Apache
###
#
# 1. Each same directive is checked in order of definition (last one wins)
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
# * Last match always takes precedence
#
# Exception: Directories, where shortest path is matched first
# Exception: ProxyPass and Alias first match and then stops
###
### Basic vHost skeleton
###
### Note: Reverse Proxy section must be last for Apache 2.2
###
vhost: |
<VirtualHost __DEFAULT_VHOST__:__PORT__>
ServerName __VHOST_NAME__
@ -54,13 +67,13 @@ vhost: |
__REDIRECT__
__SSL__
__VHOST_DOCROOT__
__VHOST_RPROXY__
__PHP_FPM__
__ALIASES__
__DENIES__
__SERVER_STATUS__
# Custom directives
__CUSTOM__
__VHOST_RPROXY__
</VirtualHost>
###
@ -84,13 +97,38 @@ vhost_type:
Allow from all
</Directory>
# Reverse Proxy (-r)
# Reverse Proxy (-r http(s)://ADDR:PORT)
rproxy: |
# Define the vhost to reverse proxy
ProxyRequests On
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
ProxyPassReverse __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
ProxyVia On
<Location __LOCATION__>
# Reverse Proxy
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
</Location>
# Reverse Proxy with websocket support (-r ws(s)://ADDR:PORT)
rproxy_ws: |
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On
ProxyVia On
<Location __LOCATION__>
# Websocket Rewrite Settings
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule ^/?(.*)$ __WS_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/$1 [P,L]
# Reverse Proxy
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
</Location>
###
@ -120,6 +158,7 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -129,10 +168,10 @@ features:
deny: |
# Deny Definition
<FilesMatch "__REGEX__">
<LocationMatch "__REGEX__">
Order allow,deny
Deny from all
</FilesMatch>
</LocationMatch>
server_status: |
# Status Page

View File

@ -34,6 +34,17 @@
# __ERROR_LOG__
#
###
### Notes about Apache
###
#
# 1. Each same directive is checked in order of definition (last one wins)
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
# * Last match always takes precedence
#
# Exception: Directories, where shortest path is matched first
# Exception: ProxyPass and Alias first match and then stops
###
### Basic vHost skeleton
@ -46,11 +57,19 @@ vhost: |
CustomLog "__ACCESS_LOG__" combined
ErrorLog "__ERROR_LOG__"
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
ProxyRequests On
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyAddHeaders: Add "X-Forward-*" headers
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://php:8000/
ProxyPassReverse / http://php:8000/
ProxyAddHeaders On
ProxyVia On
<Location />
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
ProxyPass http://php:8000/ retry=0
ProxyPassReverse http://php:8000/
</Location>
__REDIRECT__
__SSL__
@ -93,6 +112,7 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -103,10 +123,10 @@ features:
deny: |
# Deny Definition
<FilesMatch "__REGEX__">
<LocationMatch "__REGEX__">
Order allow,deny
Deny from all
</FilesMatch>
</LocationMatch>
server_status: |
# Status Page

View File

@ -40,6 +40,17 @@
# __PHP_PORT__
#
###
### Notes about Apache
###
#
# 1. Each same directive is checked in order of definition (last one wins)
# 2. Directives are ordered: Directory, DirectoryMatch, Files, and finally Location (last one wins)
# * Last match always takes precedence
#
# Exception: Directories, where shortest path is matched first
# Exception: ProxyPass and Alias first match and then stops
###
### Basic vHost skeleton
@ -86,13 +97,42 @@ vhost_type:
Require all granted
</Directory>
# Reverse Proxy (-r)
# Reverse Proxy (-r http(s)://ADDR:PORT)
rproxy: |
# Define the vhost to reverse proxy
ProxyRequests On
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyAddHeaders: Add "X-Forward-*" headers
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
ProxyPassReverse __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__
ProxyAddHeaders On
ProxyVia On
<Location __LOCATION__>
# Reverse Proxy
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
</Location>
# Reverse Proxy with websocket support (-r ws(s)://ADDR:PORT)
rproxy_ws: |
# ProxyRequests: Disable "Forward Proxy"
# ProxyPreserveHost: Pass "Host" header to remote
# ProxyAddHeaders: Add "X-Forward-*" headers
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On
ProxyAddHeaders On
ProxyVia On
<Location __LOCATION__>
# Websocket Rewrite Settings
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule ^/?(.*)$ __WS_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/$1 [P,L]
# Reverse Proxy
ProxyPass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/ retry=0
ProxyPassReverse __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__/
</Location>
###
@ -141,6 +181,7 @@ features:
# Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__
</Location>
<Directory "__PATH____ALIAS__">
@ -151,10 +192,10 @@ features:
deny: |
# Deny Definition
<FilesMatch "__REGEX__">
<LocationMatch "__REGEX__">
Order allow,deny
Deny from all
</FilesMatch>
</LocationMatch>
server_status: |
# Status Page

View File

@ -48,8 +48,11 @@ vhost: |
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# https://stackoverflow.com/a/72586833
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Proxy connection
proxy_pass http://php:8000;
}

View File

@ -75,12 +75,31 @@ vhost_type:
root "__DOCUMENT_ROOT__";
index __INDEX__;
# Reverse Proxy (-r)
# Reverse Proxy (-r http(s)://ADDR:PORT)
rproxy: |
# Define the vhost to reverse proxy
# Define Reverse Proxy
location __LOCATION__ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# https://stackoverflow.com/a/72586833
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Proxy connection
proxy_pass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__;
}
# Reverse Proxy with websocket support (-r ws(s)://ADDR:PORT)
rproxy_ws: |
# Define Reverse Proxy with Websock support
location __LOCATION__ {
# https://stackoverflow.com/a/72586833
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Websocket settings
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# Proxy connection
proxy_pass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__;
}

View File

@ -219,13 +219,13 @@ print_head_1 "Checking .env file values"
WRONG_ENV_FILES_VALUES=0
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}"
DEBUG_ENTRYPOINT="$( get_env_value "DEBUG_ENTRYPOINT" )"
if [ "${DEBUG_ENTRYPOINT}" != "0" ] && [ "${DEBUG_ENTRYPOINT}" != "1" ] && [ "${DEBUG_ENTRYPOINT}" != "2" ] && [ "${DEBUG_ENTRYPOINT}" != "3" ] && [ "${DEBUG_ENTRYPOINT}" != "3" ]; then
log_err "Variable 'DEBUG_ENTRYPOINT' should be 0, 1 or 2. Has: ${DEBUG_ENTRYPOINT}"
RET_CODE=$(( RET_CODE + 1))
WRONG_ENV_FILES_VALUES=1
else
log_debug "Variable 'DEBUG_COMPOSE_ENTRYPOINT' has correct value: ${DEBUG_COMPOSE_ENTRYPOINT}"
log_debug "Variable 'DEBUG_ENTRYPOINT' has correct value: ${DEBUG_ENTRYPOINT}"
fi
DOCKER_LOGS="$( get_env_value "DOCKER_LOGS" )"
@ -430,7 +430,7 @@ fi
#--------------------------------------------------------------------------------------------------
# Ensure cfg/, mod/ and log/ directories exist
# Ensure cfg/ and log/ directories exist
#--------------------------------------------------------------------------------------------------
print_head_1 "Checking required Devilbox core directories exist"
@ -464,21 +464,6 @@ 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
@ -522,7 +507,6 @@ DEVILBOX_DIRS=(
"cfg"
"compose"
"log"
"mod"
"supervisor"
)
@ -591,7 +575,6 @@ DEVILBOX_DIRS=(
"ca"
"cfg"
"compose"
"mod"
"supervisor"
)

View File

@ -243,6 +243,26 @@ 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
@ -252,3 +272,4 @@ volumes:
devilbox-solr:
devilbox-elastic:
devilbox-logstash:
devilbox-meilisearch:

View File

@ -0,0 +1,29 @@
# 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

@ -0,0 +1,231 @@
# 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.148
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.148
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.148
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.148
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.148
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.148
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.148
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.148
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.148
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.148
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.148
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}

View File

@ -34,7 +34,7 @@ services:
# Bind (DNS Server)
# ------------------------------------------------------------
bind:
image: cytopia/bind:alpine-0.34
image: cytopia/bind:alpine-0.35
hostname: bind
restart: always
ports:
@ -46,7 +46,7 @@ services:
##
## Debug?
##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
- DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT:-2}
##
## Memory consumption
@ -99,7 +99,7 @@ services:
# PHP
# ------------------------------------------------------------
php:
image: devilbox/php-fpm:${PHP_SERVER}-work-0.144
image: devilbox/php-fpm:${PHP_SERVER}-work-0.148
hostname: php
##
@ -112,11 +112,17 @@ services:
- ./.env
environment:
##
## Supervisord Management (to connect to HTTPD supvervisord)
##
- SVCTL_LISTEN_PORT=9001
- SVCTL_USER=${DEVILBOX_HTTPD_MGMT_USER:-supervisor}
- SVCTL_PASS=${DEVILBOX_HTTPD_MGMT_PASS:-mypassword}
##
## Debug/Logging
##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
- DEBUG_COMPOSE_ENTRYPOINT
- DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT:-2}
- DOCKER_LOGS
##
@ -197,10 +203,6 @@ services:
# to overwrite the default PHP-FPM configuration
- ${DEVILBOX_PATH}/cfg/php-fpm-${PHP_SERVER}:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# Mount devilbox user-defined *.so files in order
# to load custom PHP modules
- ${DEVILBOX_PATH}/mod/php-fpm-${PHP_SERVER}:/usr/lib64/php/custom-modules:ro${MOUNT_OPTIONS}
# Mount devilbox user-defined PHP-FPM startup *.sh scripts
- ${DEVILBOX_PATH}/cfg/php-startup-${PHP_SERVER}:/startup.1.d:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
@ -225,16 +227,26 @@ services:
# Web Server
# ------------------------------------------------------------
httpd:
image: devilbox/${HTTPD_SERVER}:${HTTPD_FLAVOUR:-alpine}-0.48
image: devilbox/${HTTPD_SERVER}:${HTTPD_FLAVOUR:-alpine}-1.0-beta2
hostname: httpd
environment:
##
## Supervisord Management
##
- SVCTL_ENABLE=1
- SVCTL_LISTEN_ADDR=0.0.0.0
- SVCTL_LISTEN_PORT=9001
- SVCTL_REMOTE_LOGS_ENABLE=1
- SVCTL_USER=${DEVILBOX_HTTPD_MGMT_USER:-supervisor}
- SVCTL_PASS=${DEVILBOX_HTTPD_MGMT_PASS:-mypassword}
##
## Debug/Logging
##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
- DEBUG_RUNTIME=${DEBUG_COMPOSE_ENTRYPOINT}
- DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT:-2}
- DEBUG_RUNTIME=1
- DOCKER_LOGS
##
@ -268,25 +280,23 @@ services:
- MAIN_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both}
- MAIN_VHOST_SSL_GEN=1
- MAIN_VHOST_SSL_CN=${DEVILBOX_UI_SSL_CN:-localhost}
- MAIN_VHOST_BACKEND=conf:phpfpm:tcp:172.16.238.10:9000
- MAIN_VHOST_BACKEND_TIMEOUT=${HTTPD_BACKEND_TIMEOUT:-180}
- MAIN_VHOST_ALIASES_ALLOW=/devilbox-api/:/var/www/default/api, /vhost.d/:/etc/httpd
##
## Enable Mass Vhosts
##
- MASS_VHOST_ENABLE=1
- MASS_VHOST_TLD=.${TLD_SUFFIX}
- MASS_VHOST_DOCROOT=${HTTPD_DOCROOT_DIR}
- MASS_VHOST_TPL=${HTTPD_TEMPLATE_DIR}
- MASS_VHOST_TLD_SUFFIX=.${TLD_SUFFIX}
- MASS_VHOST_DOCROOT_DIR=${HTTPD_DOCROOT_DIR}
- MASS_VHOST_TEMPLATE_DIR=${HTTPD_TEMPLATE_DIR}
- MASS_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both}
- MASS_VHOST_SSL_GEN=1
##
## PHP-FPM Remote Server
##
- COMPAT=${PHP_SERVER}
- PHP_FPM_ENABLE=1
- PHP_FPM_SERVER_ADDR=172.16.238.10
- PHP_FPM_SERVER_PORT=9000
- PHP_FPM_TIMEOUT=${HTTPD_TIMEOUT_TO_PHP_FPM:-180}
- MASS_VHOST_BACKEND=conf:phpfpm:tcp:172.16.238.10:9000
- MASS_VHOST_BACKEND_REWRITE=file:backend.cfg
- MASS_VHOST_BACKEND_TIMEOUT=${HTTPD_BACKEND_TIMEOUT:-180}
- MASS_VHOST_ALIASES_ALLOW=/devilbox-api/:/var/www/default/api:http(s)?://(.*)$$
ports:
# ---- Format: ----
@ -315,7 +325,7 @@ services:
- ${DEVILBOX_PATH}/cfg/vhost-gen:/etc/vhost-gen.d:rw${MOUNT_OPTIONS}
# Mount logs
- ${DEVILBOX_PATH}/log/${HTTPD_SERVER}:/var/log/${HTTPD_SERVER}:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/log/${HTTPD_SERVER}:/var/log/httpd:rw${MOUNT_OPTIONS}
# Certificate Authority public key
- ${DEVILBOX_PATH}/ca:/ca:rw${MOUNT_OPTIONS}
@ -329,7 +339,7 @@ services:
# MySQL Database
# ------------------------------------------------------------
mysql:
image: devilbox/mysql:${MYSQL_SERVER}-0.19
image: devilbox/mysql:${MYSQL_SERVER}-0.21
hostname: mysql
environment:

View File

@ -12,8 +12,8 @@
.. |ext_lnk_doc_bind_soa| raw:: html
<a target="_blank" href="https://bind9.readthedocs.io/en/latest/introduction.html?highlight=soa#secondary-servers">
BIND SOA <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
<a target="_blank" href="https://bind9.readthedocs.io/en/latest/reference.html">
BIND Reference <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a>
.. |ext_lnk_doc_wiki_database_timezones| raw:: html
@ -135,3 +135,16 @@
<a target="_blank" href="https://github.com/elastic/kibana">
GitHub: Kibana <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a>
.. |ext_lnk_meilisearch_github| raw:: html
<a target="_blank" href="https://github.com/meilisearch/meilisearch">
Github: Meilisearch <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a>
.. |ext_lnk_meilisearch_dockerhub| raw:: html
<a target="_blank" href="https://hub.docker.com/r/getmeili/meilisearch">
Dockerhub: Meilisearch <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a>

View File

@ -72,7 +72,7 @@
.. |ext_lnk_example_magento2_documentation| raw:: html
<a target="_blank" href="https://devdocs.magento.com/guides/v2.2/install-gde/bk-install-guide.html">
<a target="_blank" href="https://docs.magento.com/user-guide/v2.3/magento/installation.html">
Official Magento 2 Documentation <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a>

View File

@ -36,7 +36,7 @@
.. |ext_lnk_xdebug_ide_atom_php_debug| raw:: html
<a target="_blank" href="https://atom.io/packages/php-debug">
<a target="_blank" href="https://github.blog/2022-06-08-sunsetting-atom/">
php-debug <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a>

View File

@ -1,11 +1,11 @@
.. |ext_lnk_php_community_github_announce| raw:: html
.. |ext_lnk_devilbox_pr_announce| raw:: html
<a target="_blank" href="https://github.com/devilbox/docker-php-fpm-community/">
<strong>PHP-FPM Community <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" /></strong>
<a target="_blank" href="https://github.com/cytopia/devilbox/pull/942">
<strong>Release v3.0.0-beta-0.1 <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" /></strong>
</a>
.. attention::
You can now create your own **custom flavour** of PHP-FPM Community images and easily add them to the Devilbox: |ext_lnk_php_community_github_announce|
You can now run different PHP versions per project: |ext_lnk_devilbox_pr_announce|

View File

@ -12,6 +12,7 @@ However, each example also exists in its standalone file as shown below:
├── docker-compose.override.yml-blackfire
├── docker-compose.override.yml-elk
├── docker-compose.override.yml-mailhog
├── docker-compose.override.yml-meilisearch
├── docker-compose.override.yml-ngrok
├── docker-compose.override.yml-php-community
├── docker-compose.override.yml-python-flask

View File

@ -67,7 +67,7 @@ First you simply copy the while definition of the bind service from ``docker-com
##
## Debug?
##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
- DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT}
- DOCKER_LOGS=1
##

View File

@ -32,18 +32,18 @@ to ``.env`` to initially create it with sane defaults.
Core settings
=============
DEBUG_COMPOSE_ENTRYPOINT
------------------------
DEBUG_ENTRYPOINT
----------------
This variable controls the docker-compose log verbosity during service startup.
When set to ``1`` verbose output as well as executed commands are shown.
When set to ``0`` only warnings and errors are shown.
+------------------------------+----------------+---------------+
| Name | Allowed values | Default value |
+==============================+================+===============+
| ``DEBUG_COMPOSE_ENTRYPOINT`` | ``0`` or ``1`` | ``1`` |
+------------------------------+----------------+---------------+
+------------------------------+-----------------------------------+---------------+
| Name | Allowed values | Default value |
+==============================+===================================+===============+
| ``DEBUG_ENTRYPOINT`` | ``0``, ``1``, ``2``, ``3``, ``4`` | ``2`` |
+------------------------------+-----------------------------------+---------------+
.. _env_docker_logs:
@ -1505,8 +1505,8 @@ changing the server name or adding locations to other assets.
.. _env_httpd_timeout_to_php_fpm:
HTTPD_TIMEOUT_TO_PHP_FPM
^^^^^^^^^^^^^^^^^^^^^^^^
HTTPD_BACKEND_TIMEOUT
^^^^^^^^^^^^^^^^^^^^^
This variable specifies after how many seconds the webserver should quit an unanswered connection
to PHP-FPM.
@ -1515,17 +1515,17 @@ Ensure that this value is higher than PHP's ``max_execution_time``, otherwise th
could still run and the webserver will simply drop the connection before getting an answer
by PHP.
If ``HTTPD_TIMEOUT_TO_PHP_FPM`` is smaller then ``max_execution_time`` and a script runs longer
If ``HTTPD_BACKEND_TIMEOUT`` is smaller then ``max_execution_time`` and a script runs longer
than ``max_execution_time``, you will get a: ``504 Gateway timeout`` in the browser.
If ``HTTPD_TIMEOUT_TO_PHP_FPM`` is greater then ``max_execution_time`` and a script runs longer
If ``HTTPD_BACKEND_TIMEOUT`` is greater then ``max_execution_time`` and a script runs longer
than ``max_execution_time``, you will get a proper PHP error message in the browser.
+------------------------------+-------------------+------------------+
| Name | Allowed values | Default value |
+==============================+===================+==================+
| ``HTTPD_TIMEOUT_TO_PHP_FPM`` | positive integer | ``180`` |
| ``HTTPD_BACKEND_TIMEOUT`` | positive integer | ``180`` |
+------------------------------+-------------------+------------------+
HTTPD_NGINX_WORKER_PROCESSES

View File

@ -0,0 +1,153 @@
.. include:: /_includes/all.rst
.. include:: /_includes/snippets/__ANNOUNCEMENTS__.rst
.. _custom_container_enable_meilisearch:
********************************
Enable and configure Meilisearch
********************************
This section will guide you through getting Meilisearch integrated into the Devilbox.
.. seealso::
* |ext_lnk_meilisearch_github|
* |ext_lnk_meilisearch_dockerhub|
* :ref:`custom_container_enable_all_additional_container`
* :ref:`docker_compose_override_yml_how_does_it_work`
**Table of Contents**
.. contents:: :local:
Overview
========
Available overwrites
--------------------
.. include:: /_includes/snippets/docker-compose-override-tree-view.rst
Meilisearch settings
--------------------
In case of Meilisearch, the file is ``compose/docker-compose.override.yml-meilisearch``. This file
must be copied into the root of the Devilbox git directory.
+-----------------------+--------------------------------------------------------------------------------------------------------+
| What | How and where |
+=======================+========================================================================================================+
| Example compose file | ``compose/docker-compose.override.yml-all`` or |br| ``compose/docker-compose.override.yml-meilisearch``|
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Container IP address | ``172.16.238.203`` |
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Container host name | ``meilisearch`` |
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Container name | ``meilisearch`` |
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Mount points | via Docker volumes |
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Exposed port | ``7700`` (can be changed via ``.env``) |
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Available at | ``http://localhost:7700`` (API and Admin WebUI) |
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Further configuration | none |
+-----------------------+--------------------------------------------------------------------------------------------------------+
Meilisearch env variables
-------------------------
Additionally the following ``.env`` variables can be created for easy configuration:
+------------------------------+-------------------+----------------------------------------------------------------------------------+
| Variable | Default value | Description |
+==============================+===================+==================================================================================+
| ``HOST_PORT_MEILI`` | ``7700`` | Controls the host port on which Meilisearch API and WebUI will be available at. |
+------------------------------+-------------------+----------------------------------------------------------------------------------+
| ``MEILI_SERVER`` | ``latest`` | Controls the Meilisearch version to use. |
+------------------------------+-------------------+----------------------------------------------------------------------------------+
| ``MEILI_MASTER_KEY`` | none | Default Meilisearch master key. |
+------------------------------+-------------------+----------------------------------------------------------------------------------+
Instructions
============
1. Copy docker-compose.override.yml
-----------------------------------
Copy the Meilisearch Docker Compose overwrite file into the root of the Devilbox git directory.
(It must be at the same level as the default ``docker-compose.yml`` file).
.. code-block:: bash
host> cp compose/docker-compose.override.yml-meilisearch docker-compose.override.yml
.. seealso::
* :ref:`docker_compose_override_yml`
* :ref:`add_your_own_docker_image`
* :ref:`overwrite_existing_docker_image`
2. Adjust ``.env`` settings (optional)
--------------------------------------
Meilisearch is using sane defaults, which can be changed by adding variables to the ``.env`` file
and assigning custom values.
Add the following variables to ``.env`` and adjust them to your needs:
.. code-block:: bash
:caption: .env
# Meilisearch version to choose
#MEILI_SERVER=v0.26.0
#MEILI_SERVER=v0.27.0
#MEILI_SERVER=v0.28
MEILI_SERVER=latest
MEILI_MASTER_KEY=
HOST_PORT_MEILI=7700
.. seealso:: :ref:`env_file`
3. Start the Devilbox
---------------------
The final step is to start the Devilbox with Meilisearch.
Let's assume you want to start ``php``, ``httpd``, ``bind``, ``meilisearch``.
.. code-block:: bash
host> docker-compose up -d php httpd bind meilisearch
.. seealso:: :ref:`start_the_devilbox`
TL;DR
=====
For the lazy readers, here are all commands required to get you started.
Simply copy and paste the following block into your terminal from the root of your Devilbox git
directory:
.. code-block:: bash
# Copy compose-override.yml into place
cp compose/docker-compose.override.yml-meilisearch docker-compose.override.yml
# Create .env variable
echo "# Meilisearch version to choose" >> .env
echo "#MEILI_SERVER=v0.26.0" >> .env
echo "#MEILI_SERVER=v0.27.0" >> .env
echo "#MEILI_SERVER=v0.28" >> .env
echo "MEILI_SERVER=latest" >> .env
echo "MEILI_MASTER_KEY=" >> .env
echo "HOST_PORT_MEILI=7700" >> .env
# Start container
docker-compose up -d php httpd bind meilisearch

View File

@ -122,6 +122,7 @@ host is ready to be served with your custom domain.
custom-container/enable-blackfire
custom-container/enable-elk-stack
custom-container/enable-mailhog
custom-container/enable-meilisearch
custom-container/enable-ngrok
custom-container/enable-python-flask
custom-container/enable-rabbitmq

View File

@ -11,7 +11,7 @@ Enable/disable PHP modules
.. contents:: :local:
.. seealso::
https://github.com/devilbox/docker-php-fpm#user-content-php-modules
https://github.com/devilbox/docker-php-fpm/blob/master/doc/php-modules.md
Follow the link to see all available PHP modules for each different PHP-FPM server version.

View File

@ -28,10 +28,12 @@
### Show all executed commands in each
### docker image during docker-compose up?
###
### 0: Quiet
### 1: Verbose
### 2: More verbose
DEBUG_COMPOSE_ENTRYPOINT=2
### 0: Errors
### 1: Errors, Warnings
### 2: Errors, Warnings, Infos (Recommended)
### 3: Errors, Warnings, Infos, Debug
### 4: Errors, Warnings, Infos, Debug, Trace
DEBUG_ENTRYPOINT=2
###
@ -236,6 +238,12 @@ DEVILBOX_VENDOR_PHPMYADMIN_AUTOLOGIN=1
###
DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN=1
###
### HTTPD Supvervisord management
###
DEVILBOX_HTTPD_MGMT_USER=supervisord
DEVILBOX_HTTPD_MGMT_PASS=mypassword
################################################################################
@ -515,7 +523,7 @@ PHP_MODULES_ENABLE=
###
### PHP_MODULES_DISABLE=xdebug,imagick,swoole
###
PHP_MODULES_DISABLE=oci8,PDO_OCI,pdo_sqlsrv,sqlsrv,rdkafka,swoole
PHP_MODULES_DISABLE=oci8,PDO_OCI,pdo_sqlsrv,sqlsrv,rdkafka,swoole,psr,phalcon
###
@ -609,13 +617,16 @@ HTTPD_TEMPLATE_DIR=.devilbox
###
### Webserver timeout (in seconds) to upstream PHP-FPM server
### Remote (Upstream) Backend Timeout
###
### This value should be greater than PHP's max_execution_time,
### otherwise the php script could still run and the webserver will
### simply drop the connection before getting an answer by PHP.
### This setting specifies the Timeout for a remote Backend server,
### such as PHP-FPM or a Reverse Proxy.
###
HTTPD_TIMEOUT_TO_PHP_FPM=180
### As for PHP, keep in mind that this value should be greater than
### PHP's max_execution_time,otherwise the php script could still
### run and the webserver will simply drop the connection before getting an answer by PHP.
###
HTTPD_BACKEND_TIMEOUT=180
###

View File

@ -1,3 +0,0 @@
# Devilbox user-defined PHP modules
Use this folders to add your custom PHP modules.

View File

@ -1,3 +1,7 @@
#!/bin/sh
docker-compose exec --user devilbox php bash -l
if hash docker-compose 2>/dev/null; then
docker-compose exec --user devilbox php bash -l
else
docker compose exec --user devilbox php bash -l
fi