Compare commits

...

84 Commits

Author SHA1 Message Date
cytopia
986f04637f
Merge pull request #957 from nickchomey/patch-1
fix typos in check-config.sh
2023-01-30 11:21:52 +01:00
nickchomey
8621ce1b55
fix typos in check-config.sh 2023-01-27 20:48:20 -06:00
cytopia
10b20c0745
Merge pull request #944 from cytopia/release/v3.0.0-beta-0.3
Release/v3.0.0 beta 0.3
2023-01-03 01:32:23 +01:00
cytopia
1c2143095a
Update PHP modules 2023-01-02 23:31:26 +01:00
cytopia
22ed5edc4e
Intranet: be more clear about watcherd restart 2023-01-02 23:29:02 +01:00
cytopia
9d23981173
Pin PHP image 2023-01-02 23:28:45 +01:00
cytopia
6fa4d4a386
Refs #919 Added host.docker.internal to connect to host system 2023-01-02 12:40:26 +01:00
cytopia
51a127dda3
Update PHP image 2023-01-02 11:29:40 +01:00
cytopia
76c6467806
Docs: Update available PHP exts 2023-01-02 00:33:09 +01:00
cytopia
617241ce42
Fixup README 2023-01-01 15:19:26 +01:00
cytopia
2fa1641bc2
Fix shellcheck 2023-01-01 15:17:49 +01:00
cytopia
de8d40822c
Adjust Readme 2023-01-01 14:37:28 +01:00
cytopia
b773fcd1b7
Adjust tests 2022-12-31 09:18:02 +01:00
cytopia
7c461870f0
Remove obsolete entries 2022-12-31 08:55:40 +01:00
cytopia
ecb674f859
Update CHANGELOG 2022-12-31 08:19:41 +01:00
cytopia
8e39202fc9
Update HTTPD server 2022-12-31 08:19:29 +01:00
cytopia
8c81bcc1a1
Fix TLD_SUFFIX section in env_example 2022-12-31 07:05:23 +01:00
cytopia
8a1a720e8c
Show PHP 8.3 link in support section 2022-12-31 07:01:12 +01:00
cytopia
fb173e0ed6
Intranet vhost: vhost table width jumping 2022-12-31 06:58:37 +01:00
cytopia
9f54138567
Intranet index: vhost table width jumping 2022-12-31 06:52:23 +01:00
cytopia
364f4aa3a6
Syntax highlighting for httpd configs 2022-12-31 06:47:59 +01:00
cytopia
c7c2b4f2cb
Update CHANGELOG 2022-12-31 06:05:51 +01:00
cytopia
0b561dfdd2
Intranet: Show wscat version 2022-12-31 06:05:19 +01:00
cytopia
794e3d8961
Intranet vhosts.php b64 encode modal html targets 2022-12-31 05:56:07 +01:00
cytopia
a84e18be67
Use TLD_SUFFIX=dvl.to which always points to 127.0.0.1 2022-12-31 05:44:25 +01:00
cytopia
894706ab09
Docs: Show available tools per version in README.md 2022-12-31 05:26:31 +01:00
cytopia
448054bece
Intranet: vhost overview now shows listening ports 2022-12-31 05:23:49 +01:00
cytopia
e18bfd3f4f
Intranet: vhosts.php Use modals to show config 2022-12-31 05:20:32 +01:00
cytopia
d1894b3eb2
Refs #798 Added ctype_xdigit check around hexdec 2022-12-31 03:33:09 +01:00
cytopia
7f3b45b387
Update REAMDE 2022-12-30 14:21:39 +01:00
cytopia
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
cytopia
cb07f319de
Pin HTTPD server 2022-12-27 13:00:21 +01:00
cytopia
cca1744145
Bump version date 2022-12-27 12:52:19 +01:00
cytopia
9fc97586e6
Intranet: show local daemons if netstat is available 2022-12-27 12:28:42 +01:00
cytopia
2db5ffff6b
Pin PHP versions 2022-12-27 12:26:47 +01:00
cytopia
0dc1b9cafb
Intranet: Make vhost page less jumpy 2022-12-27 12:24:28 +01:00
cytopia
b05f4240f3
Update vhost-gen templates 2022-12-27 02:58:40 +01:00
cytopia
e18e923d87
Update Changelog 2022-12-26 23:01:57 +01:00
cytopia
c6e1192429
Disable linkcheck2, works locally, breaks on CI 2022-12-26 23:01:34 +01:00
cytopia
634b9af7e5
Intranet vhost page: accept HTTP 426 for project gathering 2022-12-26 22:59:13 +01:00
cytopia
a1fa5724e8
Update vhost-gen templates 2022-12-26 16:03:05 +01:00
cytopia
a786eb64b0
Update CHANGELOG 2022-12-26 14:51:25 +01:00
cytopia
01d2f4afed
Remove autostart mounts from compose override php images 2022-12-26 14:51:03 +01:00
cytopia
873abc6c4c
Update docker images 2022-12-26 14:50:37 +01:00
cytopia
1ba3cd399c
Intranet: Reverse Proxy/Websockets do not need a htdocs directory 2022-12-26 14:13:36 +01:00
cytopia
299b765652
Websock: Allow HTTP 426 for DNS check (Upgrade) 2022-12-26 14:13:01 +01:00
cytopia
6819619d8a
Merge pull request #942 from cytopia/release/v3.0.0-beta-0.1
🎅🎄🎁
2022-12-25 20:42:06 +01:00
cytopia
3ffb360c51
Update check-config.sh 2022-12-25 18:41:26 +01:00
cytopia
025b45c48c
Fix IPv6 handling 2022-12-25 18:11:25 +01:00
cytopia
10571f7b51
Intranet: Show backend type on vhost page 2022-12-25 18:06:35 +01:00
cytopia
ffba5d61b7
Remove obsolete mod/ directory 2022-12-25 17:40:02 +01:00
cytopia
200f6ce0b1
Fix volume paths in php-multi compose files 2022-12-25 17:38:40 +01:00
cytopia
8b0788b403
Add PHP version number to README files in cfg/ dir 2022-12-25 17:37:58 +01:00
cytopia
dfda00d78a
Pinned HTTPD images 2022-12-25 16:48:46 +01:00
cytopia
98f05d7570
Updated UPDATING.md 2022-12-25 16:48:32 +01:00
cytopia
a560926315
Removed obsolete supervisorctl config section 2022-12-25 16:48:15 +01:00
cytopia
e60aa4e465
Remove obsolete points from README 2022-12-25 15:59:57 +01:00
cytopia
d5858da3e0
Fix indentation 2022-12-25 15:42:10 +01:00
cytopia
c64c4553d7
Remove obsolete mounts from docker-compose 2022-12-25 15:41:21 +01:00
cytopia
55f0447ce1
Add some colored output for logs in C&C 2022-12-25 15:40:45 +01:00
cytopia
0e3b963df2
Do not rely on external supervisord.conf for C&C web interface 2022-12-24 13:28:51 +01:00
cytopia
0964c7bdd9
Fix hostnames in CHANGELOG 2022-12-24 13:01:58 +01:00
cytopia
3b1c0b25a5
docs: fix bind links 2022-12-23 23:03:13 +01:00
cytopia
32c7beda22
Fix magento install guide links 2022-12-23 22:56:36 +01:00
cytopia
794bf0c27c
Atom no longer available 2022-12-23 22:52:56 +01:00
cytopia
e51f34c1ae
Fix wrong link in docs 2022-12-23 22:28:43 +01:00
cytopia
6b80453b92
Docs announce 2022-12-23 21:42:45 +01:00
cytopia
6fa03e6961
Fix env var names in docs 2022-12-23 21:07:34 +01:00
cytopia
e3b7c2d4db
Adjust check-config.sh 2022-12-23 20:01:44 +01:00
cytopia
2b4bf59a40
Add missing mariadb config directories 2022-12-23 19:59:14 +01:00
cytopia
ee5988507e
Update CHANGELOG 2022-12-23 19:45:20 +01:00
cytopia
d354d84165
Update intranet and docker-compose 2022-12-23 19:37:50 +01:00
cytopia
f2c0372618
Update DNS server to latest version 2022-12-23 19:36:10 +01:00
cytopia
a35216fdfb
Add Docker Compose Override File for Multi PHP versions 2022-12-23 19:35:54 +01:00
cytopia
2828e837d9
Merge pull request #910 from minhchu/support-meilisearch
Add support for meilisearch
2022-12-20 10:46:40 +01:00
cytopia
685e09f76b
Merge branch 'master' into support-meilisearch 2022-12-20 00:03:23 +01:00
cytopia
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
cytopia
7645068258
Merge branch 'master' into master 2022-12-18 23:31:03 +01:00
Minh Chu
eb5ecc836c
Merge branch 'cytopia:master' into support-meilisearch 2022-12-16 11:59:28 +07:00
cytopia
8bde34caaf
Merge branch 'master' into master 2022-12-11 14:20:50 +01:00
cytopia
441adbb66d
Merge branch 'master' into support-meilisearch 2022-12-11 14:14:50 +01:00
Alex
e8a6fe51e7 shell.sh now falls back to docker compose (no dash) 2022-11-30 13:57:58 +00:00
Minh Chu
fb64b0bd31 Add docs for Meilisearch 2022-08-01 00:29:03 +07:00
Minh Chu
12e613188e Add support for meilisearch 2022-07-31 01:06:13 +07:00
101 changed files with 2183 additions and 825 deletions

View File

@ -13,8 +13,8 @@ error_reporting(-1);
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1'); putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
$DEVILBOX_VERSION = 'v2.4.0'; $DEVILBOX_VERSION = 'v3.0.0-beta-0.3';
$DEVILBOX_DATE = '2022-12-18'; $DEVILBOX_DATE = '2023-01-02';
$DEVILBOX_API_PAGE = 'devilbox-api/status.json'; $DEVILBOX_API_PAGE = 'devilbox-api/status.json';
// //

View File

@ -150,6 +150,11 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'wscat') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getWscatVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'yarn') { else if ($_GET['software'] == 'yarn') {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getYarnVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getYarnVersion()) !== false) ? $version : $no

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 any changes to vhost settings (vhost-gen templates or backend configuration) or to the webserver configuration itself, you can trigger a manual reload of <code>watcherd</code> here to apply them. No need to restart the Docker Compose stack.</p>
<table class="table table-striped">
<thead class="thead-inverse">
<tr>
<th>Daemon</th>
<th>Status</th>
<th>Pid</th>
<th>Uptime</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td><?php echo $data_w['name']; ?></td>
<td><?php echo $data_w['state']; ?></td>
<td><?php echo $data_w['pid']; ?></td>
<td><?php echo $data_w['uptime']; ?></td>
<td><form method="post"><button type="submit" name="watcherd" value="reload" class="btn btn-primary">Reload</button></form></td>
</tr>
<tr>
<td><?php echo $data_h['name']; ?></td>
<td><?php echo $data_h['state']; ?></td>
<td><?php echo $data_h['pid']; ?></td>
<td><?php echo $data_h['uptime']; ?></td>
<td></td>
</tr>
</tbody>
</table>
<br/>
<br/>
<h3>watcherd stderr</h3>
<br/>
<?php
$output = run_supervisor_command('tail -1000000 watcherd stderr');
echo '<pre>';
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
if ( strpos($line, "[ERR]") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "[emerg]") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "Syntax error") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "[WARN]") !== false ) {
echo '<span style="color: #ccaa00">' . $line . '</span>';
} else {
echo $line;
}
echo "\n";
}
echo '</pre>';
?>
<h3>watcherd stdout</h3>
<br/>
<?php
$output = run_supervisor_command('tail -1000000 watcherd');
echo '<pre>';
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
$pos_info = strpos($line, "[INFO]");
$pos_ok = strpos($line, "[OK]");
if ( $pos_ok !== false ) {
echo '<span style="color: #669a00"><strong>' . $line . '</strong></span>';
} else if ( $pos_info !== false && $pos_info == 0 ) {
echo '<span style="color: #0088cd">' . $line . '</span>';
} else {
echo $line;
}
echo "\n";
}
echo '</pre>';
?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
<script>
$(function() {
$('.subject').click(function() {
const id = ($(this).attr('id'));
const row = $('#mail-'+id);
row.toggle();
const bodyElement = row.find('.email-body')[0];
if(bodyElement.shadowRoot !== null){
// We've already fetched the message content.
return;
}
bodyElement.attachShadow({ mode: 'open' });
bodyElement.shadowRoot.innerHTML = 'Loading...';
$.get('?get-body=' + id, function(response){
response = JSON.parse(response);
row.find('.raw-email-body').html(response.raw);
const body = response.body;
if(body === null){
row.find('.alert').show();
}
else{
bodyElement.shadowRoot.innerHTML = body;
}
})
})
// Handler for .ready() called.
});
</script>
</body>
</html>

View File

@ -345,7 +345,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<th>Angular Cli</th> <th style="width: 50%;">Angular Cli</th>
<td id="app_angular_cli"></td> <td id="app_angular_cli"></td>
</tr> </tr>
<tr> <tr>
@ -428,6 +428,10 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<th>Wordpress Cli</th> <th>Wordpress Cli</th>
<td id="app_wpcli"></td> <td id="app_wpcli"></td>
</tr> </tr>
<tr>
<th>Wscat</th>
<td id="app_wscat"></td>
</tr>
<tr> <tr>
<th>Yarn</th> <th>Yarn</th>
<td id="app_yarn"></td> <td id="app_yarn"></td>
@ -970,6 +974,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
updateVersions('vue_cli'); updateVersions('vue_cli');
updateVersions('webpack_cli'); updateVersions('webpack_cli');
updateVersions('wpcli'); updateVersions('wpcli');
updateVersions('wscat');
updateVersions('yarn'); updateVersions('yarn');
})(); })();
</script> </script>

View File

@ -1,66 +0,0 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
if (!isset($_GET['name'])) {
loadClass('Helper')->redirect('/vhosts.php');
}
if (!strlen($_GET['name'])) {
loadClass('Helper')->redirect('/vhosts.php');
}
$vhost = $_GET['name'];
$found = false;
$vhosts = loadClass('Httpd')->getVirtualHosts();
foreach ($vhosts as $v) {
if ($vhost == $v['name']) {
$found = true;
break;
}
}
// Be safe before using outputs
$vhost = htmlentities($vhost);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(true); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<h1>vhost-gen: <?php echo $vhost;?></h1>
<br/>
<br/>
<div class="row">
<div class="col-md-12">
<?php if (!$found): ?>
<p>The Virtual Host "<?php echo $vhost; ?>" does not exist.</p>
<?php else: ?>
<?php $tpl = loadClass('Httpd')->getVhostgenTemplatePath($vhost); ?>
<?php if (!$tpl): ?>
<p>No custom vhost-gen configuration found for "<?php echo $vhost; ?>".</p>
<?php else: ?>
<p>Note: If the resulting virtual host config does not reflect the vhost-gen template changes, you will need to restart the Devilbox.</p>
<a href="/vhosts.php"><i class="fa fa-chevron-left" aria-hidden="true"></i> Overview</a><br/>
<br/><h3>virtual host config</h3><br/>
<a title="Virtual host: <?php echo $vhost;?>.conf" target="_blank" href="/vhost.d/<?php echo $vhost;?>.conf">
<i class="fa fa-external-link" aria-hidden="true"></i> <?php echo $vhost;?>.conf
</a>
<br/><br/><h3>vhost-gen config</h3><br/>
<code><?php echo $tpl; ?></code><br/><br/>
<?php $lines = file($tpl); ?>
<pre style="border: 1px solid black; padding:5px;"><code><?php foreach ($lines as $line): ?><?php echo $line; ?><?php endforeach; ?></code></pre>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
</body>
</html>

View File

@ -250,7 +250,7 @@ $messages = $MyMbox->get($sortOrderArr);
$.get('?get-body=' + id, function(response){ $.get('?get-body=' + id, function(response){
response = JSON.parse(response); response = JSON.parse(response);
row.find('.raw-email-body').html(response.raw); row.find('.raw-email-body').html(response.raw);
const body = response.body; const body = response.body;
if(body === null){ if(body === null){
row.find('.alert').show(); row.find('.alert').show();

View File

@ -66,6 +66,10 @@
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.2">docker-php-fpm-8.2</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.2">docker-php-fpm-8.2</a></td>
<td>PHP 8.2 base images (<code>amd64</code> and <code>arm64</code>)</td> <td>PHP 8.2 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.3">docker-php-fpm-8.3</a></td>
<td>PHP 8.3 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm">docker-php-fpm</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm">docker-php-fpm</a></td>
<td>PHP-FPM Devilbox images (<code>amd64</code> and <code>arm64</code>)</td> <td>PHP-FPM Devilbox images (<code>amd64</code> and <code>arm64</code>)</td>

View File

@ -24,31 +24,95 @@
<tr> <tr>
<th>Project</th> <th>Project</th>
<th>DocumentRoot</th> <th>DocumentRoot</th>
<th>Backend</th>
<th>Config</th> <th>Config</th>
<th>Valid</th> <th style="width:60px;">Valid</th>
<th>URL</th> <th style="width:260px;">URL</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php
$totals = 70;
$filler = '&nbsp;';
for ($i=0; $i<$totals; $i++) {
$filler = $filler. '&nbsp;';
}
?>
<?php foreach ($vHosts as $vHost): ?> <?php foreach ($vHosts as $vHost): ?>
<tr> <tr>
<td><?php echo $vHost['name'];?></td> <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('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> <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 $id_vhost_httpd = str_replace('=', '', base64_encode('vhost_httpd_conf_' . $vHost['name'])); ?>
<?php if (($vhostGen = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?> <?php $id_vhost_vhostgen = str_replace('=', '', base64_encode('vhost_vhost_gen_' . $vHost['name'])); ?>
<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>
<!-- [httpd.conf] Button trigger modal -->
<a href="#"><i class="fa fa-cog" aria-hidden="true" data-toggle="modal" data-target="#<?php echo $id_vhost_httpd;?>"></i></a>
<!-- [httpd.conf] Modal -->
<div class="modal" id="<?php echo $id_vhost_httpd;?>" tabindex="-1" role="dialog" aria-labelledby="<?php echo $id_vhost_httpd;?>Label" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="<?php echo $id_vhost_httpd;?>Label"><?php echo '<strong>httpd.conf: </strong><code>'.$vHost['name'].'.'.loadClass('Httpd')->getTldSuffix(). '</code>'; ?></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<?php $url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]"; ?>
<?php $src = file_get_contents($url.'/vhost.d/' . $vHost['name'] . '.conf'); ?>
<?php //$src = htmlentities($src); ?>
<?php $src = str_replace('<', '&lt;', $src); ?>
<?php $src = str_replace('>', '&gt;', $src); ?>
<?php $src = preg_replace('/&lt;(\/?.*)&gt;/m', '<strong>&lt;\1&gt;</strong>', $src); // Apache directives ?>
<?php $src = preg_replace('/(.*{\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php $src = preg_replace('/^(\s*}\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php //$src = preg_replace('/"(.+)"/m', '<span style="color: blue;">"\1"</span>', $src); ?>
<?php $src = preg_replace('/^(\s*(?!<#)[^#"]*)"(.*)"/m', '\1<span style="color: blue;">"\2"</span>', $src); // double quotes?>
<?php $src = preg_replace("/^(\s*(?!<#)[^#']*)'(.*)'/m", '\1<span style="color: blue;">"\2"</span>', $src); // single quotes ?>
<?php $src = preg_replace('/^(\s*#)(.*)$/m', '<span style="color: gray;">\1\2</span>', $src); // comments ?>
<?php echo '<pre><code>' . $src . '</code></pre>';?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<?php if (($vhostGenPath = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
<!-- [vhost-gen] Button trigger modal -->
<a href="#"><i class="fa fa-filter" aria-hidden="true" data-toggle="modal" data-target="#<?php echo $id_vhost_vhostgen;?>"></i></a>
<!-- [vhost-gen] Modal -->
<div class="modal" id="<?php echo $id_vhost_vhostgen;?>" tabindex="-1" role="dialog" aria-labelledby="<?php echo $id_vhost_vhostgen;?>Label" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="<?php echo $id_vhost_vhostgen;?>Label"><?php echo '<code>'.$vhostGenPath.'</code>'; ?></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<?php $src = file_get_contents($vhostGenPath); ?>
<?php //$src = htmlentities($src); ?>
<?php $src = str_replace('<', '&lt;', $src); ?>
<?php $src = str_replace('>', '&gt;', $src); ?>
<?php $src = preg_replace('/&lt;(\/?.*)&gt;/m', '<strong>&lt;\1&gt;</strong>', $src); // Apache directives ?>
<?php $src = preg_replace('/(.*{\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php $src = preg_replace('/^(\s*}\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php //$src = preg_replace('/"(.+)"/m', '<span style="color: blue;">"\1"</span>', $src); ?>
<?php //$src = preg_replace("/'(.+)'/m", '<span style="color: blue;">'."'".'\1'."'".'</span>', $src); ?>
<?php $src = preg_replace('/^(\s*(?!<#)[^#"]*)"(.*)"/m', '\1<span style="color: blue;">"\2"</span>', $src); // double quotes ?>
<?php $src = preg_replace("/^(\s*(?!<#)[^#']*)'(.*)'/m", '\1<span style="color: blue;">"\2"</span>', $src); // single quotes ?>
<?php $src = preg_replace('/^(\s*#)(.*)$/m', '<span style="color: gray;">\1\2</span>', $src); // comments ?>
<?php $src = preg_replace('/^(\s*[_a-z]+):/m', '<span style="color: green;"><strong>\1</strong></span>:', $src); // yaml keys ?>
<?php $src = preg_replace('/(__[_A-Z]+__)/m', '<span style="color: red;">\1</span>', $src); // variables ?>
<?php echo '<pre><code>' . $src . '</code></pre>';?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<?php endif; ?> <?php endif; ?>
</td> </td>
<td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>">&nbsp;&nbsp;&nbsp;</td> <td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>"></td>
<td id="href-<?php echo $vHost['name'];?>"><?php echo $filler;?></td> <td id="href-<?php echo $vHost['name'];?>"></td>
</tr> </tr>
<input type="hidden" name="vhost[]" class="vhost" value="<?php echo $vHost['name'];?>" /> <input type="hidden" name="vhost[]" class="vhost" value="<?php echo $vHost['name'];?>" />
<?php endforeach; ?> <?php endforeach; ?>
@ -63,6 +127,60 @@
</div> </div>
</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 --> </div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?> <?php echo loadClass('Html')->getFooter(); ?>
@ -81,7 +199,7 @@
var el_valid; var el_valid;
var el_href; 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_valid = document.getElementById('valid-' + vhost);
el_href = document.getElementById('href-' + vhost); el_href = document.getElementById('href-' + vhost);
error = this.responseText; error = this.responseText;
@ -127,13 +245,14 @@
var el_href = document.getElementById('href-' + vhost); var el_href = document.getElementById('href-' + vhost);
var error = this.responseText; var error = this.responseText;
if (this.readyState == 4 && this.status == 200) { if (this.readyState == 4 && (this.status == 200 || this.status == 426)) {
clearTimeout(xmlHttpTimeout); clearTimeout(xmlHttpTimeout);
el_valid.className += ' bg-success'; el_valid.className += ' bg-success';
if (el_valid.innerHTML != 'WARN') { if (el_valid.innerHTML != 'WARN') {
el_valid.innerHTML = 'OK'; 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 { } else {
//console.log(vhost); //console.log(vhost);
} }

View File

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

View File

@ -29,10 +29,18 @@ class Httpd extends BaseClass implements BaseInterface
$url = 'http://'.$domain; $url = 'http://'.$domain;
$error = array(); $error = array();
// 1. Check htdocs folder
if (!$this->_is_valid_dir($docroot)) { $backend = $this->getVhostBackend($vhost);
$error[] = 'error'; $pos_def = strpos($backend, 'default');
$error[] = 'Missing <strong>'.$htdocs.'</strong> directory in: <strong>'.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/</strong>'; $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 // 2. Check internal DNS server
@ -196,6 +204,33 @@ class Httpd extends BaseClass implements BaseInterface
return false; 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

@ -140,6 +140,11 @@ class Php extends BaseClass implements BaseInterface
$output = loadClass('Helper')->exec('wp --version 2>/dev/null | grep -i ^WP', $output); $output = loadClass('Helper')->exec('wp --version 2>/dev/null | grep -i ^WP', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getWscatVersion()
{
$output = loadClass('Helper')->exec('wscat --version 2>/dev/null | head -1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getYarnVersion() public function getYarnVersion()
{ {
$output = loadClass('Helper')->exec('yarn --version 2>/dev/null', $output); $output = loadClass('Helper')->exec('yarn --version 2>/dev/null', $output);

View File

@ -28,8 +28,8 @@
* - Redistributions in binary form must reproduce the above copyright * - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* - Neither the name of the authors, nor the names of its contributors * - Neither the name of the authors, nor the names of its contributors
* may be used to endorse or promote products derived from this * may be used to endorse or promote products derived from this
* software without specific prior written permission. * software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
@ -142,11 +142,11 @@ class Mail_mimeDecode extends PEAR
/** /**
* Flag to determine whether to decode headers * Flag to determine whether to decode headers
* (set to UTF8 to iconv convert headers) * (set to UTF8 to iconv convert headers)
* @var mixed * @var mixed
* @access private * @access private
*/ */
var $_decode_headers; var $_decode_headers;
/** /**
* Flag to determine whether to include attached messages * Flag to determine whether to include attached messages
@ -182,7 +182,7 @@ class Mail_mimeDecode extends PEAR
{ {
$this->__construct($input); $this->__construct($input);
} }
/** /**
* Begins the decoding process. If called statically * Begins the decoding process. If called statically
@ -197,7 +197,7 @@ class Mail_mimeDecode extends PEAR
* of the parts. (Transfer encoding) * of the parts. (Transfer encoding)
* decode_headers - Whether to decode headers, * decode_headers - Whether to decode headers,
* - use "UTF8//IGNORE" to convert charset. * - use "UTF8//IGNORE" to convert charset.
* *
* input - If called statically, this will be treated * input - If called statically, this will be treated
* as the input * as the input
* @return object Decoded results * @return object Decoded results
@ -229,17 +229,17 @@ class Mail_mimeDecode extends PEAR
$params['decode_headers'] : false; $params['decode_headers'] : false;
$this->_rfc822_bodies = isset($params['rfc_822bodies']) ? $this->_rfc822_bodies = isset($params['rfc_822bodies']) ?
$params['rfc_822bodies'] : false; $params['rfc_822bodies'] : false;
if (is_string($this->_decode_headers) && !function_exists('iconv')) { if (is_string($this->_decode_headers) && !function_exists('iconv')) {
PEAR::raiseError('header decode conversion requested, however iconv is missing'); PEAR::raiseError('header decode conversion requested, however iconv is missing');
} }
$structure = $this->_decode($this->_header, $this->_body); $structure = $this->_decode($this->_header, $this->_body);
if ($structure === false) { if ($structure === false) {
$structure = $this->raiseError($this->_error); $structure = $this->raiseError($this->_error);
} }
} }
return $structure; return $structure;
} }
@ -320,10 +320,10 @@ class Mail_mimeDecode extends PEAR
$encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit'; $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
$this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null; $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null;
break; break;
case 'multipart/signed': // PGP case 'multipart/signed': // PGP
$parts = $this->_boundarySplit($body, $content_type['other']['boundary'], true); $parts = $this->_boundarySplit($body, $content_type['other']['boundary'], true);
$return->parts['msg_body'] = $parts[0]; $return->parts['msg_body'] = $parts[0];
list($part_header, $part_body) = $this->_splitBodyHeader($parts[1]); list($part_header, $part_body) = $this->_splitBodyHeader($parts[1]);
$return->parts['sig_hdr'] = $part_header; $return->parts['sig_hdr'] = $part_header;
$return->parts['sig_body'] = $part_body; $return->parts['sig_body'] = $part_body;
@ -404,7 +404,7 @@ class Mail_mimeDecode extends PEAR
} }
for ($i = 0; $i < count($structure->parts); $i++) { for ($i = 0; $i < count($structure->parts); $i++) {
if (!empty($structure->headers['content-type']) AND substr(strtolower($structure->headers['content-type']), 0, 8) == 'message/') { if (!empty($structure->headers['content-type']) AND substr(strtolower($structure->headers['content-type']), 0, 8) == 'message/') {
$prepend = $prepend . $mime_number . '.'; $prepend = $prepend . $mime_number . '.';
$_mime_number = ''; $_mime_number = '';
@ -424,7 +424,7 @@ class Mail_mimeDecode extends PEAR
$structure->mime_id = $prepend . $mime_number; $structure->mime_id = $prepend . $mime_number;
$no_refs ? $return[$prepend . $mime_number] = '' : $return[$prepend . $mime_number] = &$structure; $no_refs ? $return[$prepend . $mime_number] = '' : $return[$prepend . $mime_number] = &$structure;
} }
return $return; return $return;
} }
@ -442,7 +442,7 @@ class Mail_mimeDecode extends PEAR
if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $input, $match)) { if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $input, $match)) {
return array($match[1], $match[2]); return array($match[1], $match[2]);
} }
// bug #17325 - empty bodies are allowed. - we just check that at least one line // bug #17325 - empty bodies are allowed. - we just check that at least one line
// of headers exist.. // of headers exist..
if (count(explode("\n",$input))) { if (count(explode("\n",$input))) {
return array($input, ''); return array($input, '');
@ -466,11 +466,11 @@ class Mail_mimeDecode extends PEAR
// Unfold the input // Unfold the input
$input = preg_replace("/\r?\n/", "\r\n", $input); $input = preg_replace("/\r?\n/", "\r\n", $input);
//#7065 - wrapping.. with encoded stuff.. - probably not needed, //#7065 - wrapping.. with encoded stuff.. - probably not needed,
// wrapping space should only get removed if the trailing item on previous line is a // wrapping space should only get removed if the trailing item on previous line is a
// encoded character // encoded character
$input = preg_replace("/=\r\n(\t| )+/", '=', $input); $input = preg_replace("/=\r\n(\t| )+/", '=', $input);
$input = preg_replace("/\r\n(\t| )+/", ' ', $input); $input = preg_replace("/\r\n(\t| )+/", ' ', $input);
$headers = explode("\r\n", trim($input)); $headers = explode("\r\n", trim($input));
$got_start = false; $got_start = false;
foreach ($headers as $value) { foreach ($headers as $value) {
@ -485,7 +485,7 @@ class Mail_mimeDecode extends PEAR
$got_start = true; $got_start = true;
} }
} }
$hdr_name = substr($value, 0, $pos = strpos($value, ':')); $hdr_name = substr($value, 0, $pos = strpos($value, ':'));
$hdr_value = substr($value, $pos+1); $hdr_value = substr($value, $pos+1);
if($hdr_value[0] == ' ') { if($hdr_value[0] == ' ') {
@ -520,7 +520,7 @@ class Mail_mimeDecode extends PEAR
* filename*0*=ENC'lang'urlencoded data. * filename*0*=ENC'lang'urlencoded data.
* filename*1*=ENC'lang'urlencoded data. * filename*1*=ENC'lang'urlencoded data.
* *
* *
* *
* @param string Header value to parse * @param string Header value to parse
* @return array Contains parsed result * @return array Contains parsed result
@ -554,7 +554,7 @@ class Mail_mimeDecode extends PEAR
$lq = ''; // last quote.. $lq = ''; // last quote..
while ($i < $l) { while ($i < $l) {
$c = $input[$i]; $c = $input[$i];
//var_dump(array('i'=>$i,'c'=>$c,'q'=>$q, 'lq'=>$lq, 'key'=>$key, 'val' =>$val)); //var_dump(array('i'=>$i,'c'=>$c,'q'=>$q, 'lq'=>$lq, 'key'=>$key, 'val' =>$val));
@ -566,7 +566,7 @@ class Mail_mimeDecode extends PEAR
} }
$escaped = true; $escaped = true;
$c = $input[$i]; $c = $input[$i];
} }
// state - in key.. // state - in key..
@ -588,7 +588,7 @@ class Mail_mimeDecode extends PEAR
$i++; $i++;
continue; continue;
} }
// state - in value.. (as $val is set..) // state - in value.. (as $val is set..)
if ($q === false) { if ($q === false) {
@ -597,10 +597,10 @@ class Mail_mimeDecode extends PEAR
$i++; $i++;
continue; // skip leading spaces after '=' or after '"' continue; // skip leading spaces after '=' or after '"'
} }
// do not de-quote 'xxx*= itesm.. // do not de-quote 'xxx*= itesm..
$key_is_trans = $key[strlen($key)-1] == '*'; $key_is_trans = $key[strlen($key)-1] == '*';
if (!$key_is_trans && !$escaped && ($c == '"' || $c == "'")) { if (!$key_is_trans && !$escaped && ($c == '"' || $c == "'")) {
// start quoted area.. // start quoted area..
$q = $c; $q = $c;
@ -612,7 +612,7 @@ class Mail_mimeDecode extends PEAR
} }
// got end.... // got end....
if (!$escaped && $c == ';') { if (!$escaped && $c == ';') {
$return['other'][$key] = trim($val); $return['other'][$key] = trim($val);
$val = false; $val = false;
$key = ''; $key = '';
@ -625,31 +625,31 @@ class Mail_mimeDecode extends PEAR
$i++; $i++;
continue; continue;
} }
// state - in quote.. // state - in quote..
if (!$escaped && $c == $q) { // potential exit state.. if (!$escaped && $c == $q) { // potential exit state..
// end of quoted string.. // end of quoted string..
$lq = $q; $lq = $q;
$q = false; $q = false;
$i++; $i++;
continue; continue;
} }
// normal char inside of quoted string.. // normal char inside of quoted string..
$val.= $c; $val.= $c;
$i++; $i++;
} }
// do we have anything left.. // do we have anything left..
if (strlen(trim($key)) || $val !== false) { if (strlen(trim($key)) || $val !== false) {
$val = trim($val); $val = trim($val);
$return['other'][$key] = $val; $return['other'][$key] = $val;
} }
$clean_others = array(); $clean_others = array();
// merge added values. eg. *1[*] // merge added values. eg. *1[*]
foreach($return['other'] as $key =>$val) { foreach($return['other'] as $key =>$val) {
@ -659,12 +659,12 @@ class Mail_mimeDecode extends PEAR
$clean_others[$key] .= $val; $clean_others[$key] .= $val;
continue; continue;
} }
} }
$clean_others[$key] = $val; $clean_others[$key] = $val;
} }
// handle language translation of '*' ending others. // handle language translation of '*' ending others.
foreach( $clean_others as $key =>$val) { foreach( $clean_others as $key =>$val) {
if ( $key[strlen($key)-1] != '*') { if ( $key[strlen($key)-1] != '*') {
@ -677,26 +677,26 @@ class Mail_mimeDecode extends PEAR
// extended-other-values // extended-other-values
$match = array(); $match = array();
$info = preg_match("/^([^']+)'([^']*)'(.*)$/", $val, $match); $info = preg_match("/^([^']+)'([^']*)'(.*)$/", $val, $match);
$clean_others[$key] = urldecode($match[3]); $clean_others[$key] = urldecode($match[3]);
$clean_others[strtolower($key)] = $clean_others[$key]; $clean_others[strtolower($key)] = $clean_others[$key];
$clean_others[strtolower($key).'-charset'] = $match[1]; $clean_others[strtolower($key).'-charset'] = $match[1];
$clean_others[strtolower($key).'-language'] = $match[2]; $clean_others[strtolower($key).'-language'] = $match[2];
} }
$return['other'] = $clean_others; $return['other'] = $clean_others;
// decode values. // decode values.
foreach($return['other'] as $key =>$val) { foreach($return['other'] as $key =>$val) {
$charset = isset($return['other'][$key . '-charset']) ? $charset = isset($return['other'][$key . '-charset']) ?
$return['other'][$key . '-charset'] : false; $return['other'][$key . '-charset'] : false;
$return['other'][$key] = $this->_decodeHeader($val, $charset); $return['other'][$key] = $this->_decodeHeader($val, $charset);
} }
return $return; return $return;
} }
@ -729,7 +729,7 @@ class Mail_mimeDecode extends PEAR
$parts[] = $tmp[$i]; $parts[] = $tmp[$i];
} }
} }
// add the last part on if it does not end with the 'closing indicator' // add the last part on if it does not end with the 'closing indicator'
if (!empty($tmp[$len]) && strlen(trim($tmp[$len])) && $tmp[$len][0] != '-') { if (!empty($tmp[$len]) && strlen(trim($tmp[$len])) && $tmp[$len][0] != '-') {
$parts[] = $tmp[$len]; $parts[] = $tmp[$len];
@ -781,12 +781,12 @@ class Mail_mimeDecode extends PEAR
} }
$input = str_replace($encoded, $text, $input); $input = str_replace($encoded, $text, $input);
} }
if ($default_charset && is_string($this->_decode_headers)) { if ($default_charset && is_string($this->_decode_headers)) {
$conv = @iconv($charset, $this->_decode_headers, $input); $conv = @iconv($charset, $this->_decode_headers, $input);
$input = ($conv === false) ? $input : $conv; $input = ($conv === false) ? $input : $conv;
} }
return $input; return $input;
} }
@ -832,10 +832,12 @@ class Mail_mimeDecode extends PEAR
// Remove soft line breaks // Remove soft line breaks
$input = preg_replace("/=\r?\n/", '', $input); $input = preg_replace("/=\r?\n/", '', $input);
// cytopia edit
if (version_compare(PHP_VERSION, '7.2.0', '>=')) { if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
$cb = function($matches) { $cb = function($matches) {
return chr(hexdec($matches[0])); // cytopia edit (added ctype_xdigit() check around)
if (ctype_xdigit($matches[0])) {
return chr(hexdec($matches[0]));
}
}; };
} else { } else {
// Replace encoded characters // Replace encoded characters
@ -924,7 +926,7 @@ class Mail_mimeDecode extends PEAR
/** /**
* getSendArray() returns the arguments required for Mail::send() * getSendArray() returns the arguments required for Mail::send()
* used to build the arguments for a mail::send() call * used to build the arguments for a mail::send() call
* *
* Usage: * Usage:
* $mailtext = Full email (for example generated by a template) * $mailtext = Full email (for example generated by a template)
@ -966,7 +968,7 @@ class Mail_mimeDecode extends PEAR
} }
$to = substr($to,1); $to = substr($to,1);
return array($to,$header,$this->_body); return array($to,$header,$this->_body);
} }
/** /**
* Returns a xml copy of the output of * Returns a xml copy of the output of

View File

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

View File

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

View File

@ -6,12 +6,24 @@ endif
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
# Misc Targets # Misc Targets
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
update-readme: .PHONY: update-readme
update-readme: _update-readme-modules
update-readme: _update-readme-tools
.PHONY: _update-readme-modules
_update-readme-modules:
cat "../README.md" \ cat "../README.md" \
| perl -0 -pe "s#<!-- modules -->.*<!-- /modules -->#<!-- modules -->\n$$(./scripts/get-modules.sh)\n<!-- /modules -->#s" \ | perl -0 -pe "s#<!-- modules -->.*<!-- /modules -->#<!-- modules -->\n$$(./scripts/get-modules.sh)\n<!-- /modules -->#s" \
> "../README.md.tmp" > "../README.md.tmp"
yes | mv -f "../README.md.tmp" "../README.md" yes | mv -f "../README.md.tmp" "../README.md"
.PHONY: _update-readme-tools
_update-readme-tools:
cat "../README.md" \
| perl -0 -pe "s#<!-- tools -->.*<!-- /tools -->#<!-- tools -->\n$$(./scripts/get-tools.sh)\n<!-- /tools -->#s" \
> "../README.md.tmp"
yes | mv -f "../README.md.tmp" "../README.md"
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
# Linting Targets # Linting Targets
@ -51,7 +63,7 @@ pull: ../.env
### ###
start: ../.env start: ../.env
@$(MAKE) --no-print-directory configure KEY=HOST_PATH_HTTPD_DATADIR VAL=.tests/www @$(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_UID VAL=$$(id -u)
@$(MAKE) --no-print-directory configure KEY=NEW_GID VAL=$$(id -g) @$(MAKE) --no-print-directory configure KEY=NEW_GID VAL=$$(id -g)
@$(PWD)/scripts/compose-start.sh @$(PWD)/scripts/compose-start.sh

View File

@ -94,7 +94,7 @@ MODS="$( echo "${PHP52_MODS}, ${PHP53_MODS}, ${PHP54_MODS}, ${PHP55_MODS}, ${PHP
### ###
### Get disabled modules ### Get disabled modules
### ###
DISABLED=",blackfire,ioncube,phalcon,psr,$( grep -E '^PHP_MODULES_DISABLE=' "${DVLBOX_PATH}/env-example" | sed 's/.*=//g' )," DISABLED=",blackfire,ioncube,phalcon,psr,xhprof,$( grep -E '^PHP_MODULES_DISABLE=' "${DVLBOX_PATH}/env-example" | sed 's/.*=//g' ),"
#echo $DISABLED #echo $DISABLED
B="✔" # Enabled base modules (cannot be disabled) B="✔" # Enabled base modules (cannot be disabled)
E="🗸" # Enabled mods modules (can be disabled) E="🗸" # Enabled mods modules (can be disabled)

25
.tests/scripts/get-tools.sh Executable file
View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
# NOTE: Parsing curl to tac to circumnvent "failed writing body"
# https://stackoverflow.com/questions/16703647/why-curl-return-and-error-23-failed-writing-body
set -e
set -u
set -o pipefail
SCRIPT_PATH="$( cd "$(dirname "$0")" && pwd -P )"
DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
# shellcheck disable=SC1090
. "${SCRIPT_PATH}/.lib.sh"
RETRIES=10
# -------------------------------------------------------------------------------------------------
# FUNCTIONS
# -------------------------------------------------------------------------------------------------
PHP_TAG="$( grep 'devilbox/php' "${DVLBOX_PATH}/docker-compose.yml" | sed 's/^.*-work-//g' )"
PHP_TOOLS="$( run "curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/doc/available-tools.md'" "${RETRIES}" )";
echo "${PHP_TOOLS}" | grep -A 1000000 'TOOLS_WORK_START'

View File

@ -54,7 +54,7 @@ fi
HOST_PORT_HTTPD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HOST_PORT_HTTPD" )" HOST_PORT_HTTPD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HOST_PORT_HTTPD" )"
TLD_SUFFIX="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "TLD_SUFFIX" )" TLD_SUFFIX="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "TLD_SUFFIX" )"
HTTPD_DOCROOT_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_DOCROOT_DIR" )" HTTPD_DOCROOT_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_DOCROOT_DIR" )"
HTTPD_TEMPLATE_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_TEMPLATE_DIR" )" #HTTPD_TEMPLATE_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_TEMPLATE_DIR" )"
### ###
@ -128,14 +128,14 @@ fi
### ###
### Vhost config link is available ### Vhost config link is available
### ###
printf "[TEST] vhost.d config link is available" #printf "[TEST] vhost.d config link is available"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'vhost.d/${VHOST}.conf' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'vhost.d/${VHOST}.conf' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost.d config link is available\\n" # printf "\\r[FAIL] vhost.d config link is available\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost.d config link is available\\n" # printf "\\r[OK] vhost.d config link is available\\n"
fi #fi
### ###
@ -154,62 +154,62 @@ fi
### ###
### vhost-gen config link should appear ### vhost-gen config link should appear
### ###
run "docker-compose exec --user devilbox -T php mkdir -p /shared/httpd/${VHOST}/${HTTPD_TEMPLATE_DIR}" "${RETRIES}" "${DVLBOX_PATH}" #run "docker-compose exec --user devilbox -T php mkdir -p /shared/httpd/${VHOST}/${HTTPD_TEMPLATE_DIR}" "${RETRIES}" "${DVLBOX_PATH}"
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache22.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" "${RETRIES}" #run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache22.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" "${RETRIES}"
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache24.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" "${RETRIES}" #run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache24.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" "${RETRIES}"
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/nginx.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" "${RETRIES}" #run "cp ${DVLBOX_PATH}/cfg/vhost-gen/nginx.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" "${RETRIES}"
#
printf "[TEST] vhost-gen config link is available" #printf "[TEST] vhost-gen config link is available"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'info_vhostgen.php?name=${VHOST}' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'info_vhostgen.php?name=${VHOST}' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost-gen config link is available\\n" # printf "\\r[FAIL] vhost-gen config link is available\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost-gen config link is available\\n" # printf "\\r[OK] vhost-gen config link is available\\n"
fi #fi
### ###
### vhost-gen config should be available ### vhost-gen config should be available
### ###
printf "[TEST] vhost-gen config is available" #printf "[TEST] vhost-gen config is available"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__VHOST_NAME__' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__VHOST_NAME__' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost-gen config is available\\n" # printf "\\r[FAIL] vhost-gen config is available\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost-gen config is available\\n" # printf "\\r[OK] vhost-gen config is available\\n"
fi #fi
### ###
### vhost-gen config changes are shown in intranet ### vhost-gen config changes are shown in intranet
### ###
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" #replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml"
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" #replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml"
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" #replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml"
#
printf "[TEST] vhost-gen config changes are shown" #printf "[TEST] vhost-gen config changes are shown"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__MY_GREP_VALUE__' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__MY_GREP_VALUE__' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost-gen config changes are shown\\n" # printf "\\r[FAIL] vhost-gen config changes are shown\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost-gen config changes are shown\\n" # printf "\\r[OK] vhost-gen config changes are shown\\n"
fi #fi
### ###
### Vhost disappears after removing its dir ### Vhost disappears after removing its dir
### ###
run "docker-compose exec --user devilbox -T php rm -rf /shared/httpd/${VHOST}" "${RETRIES}" "${DVLBOX_PATH}" #run "docker-compose exec --user devilbox -T php rm -rf /shared/httpd/${VHOST}" "${RETRIES}" "${DVLBOX_PATH}"
run "sleep 4" #run "sleep 4"
#
printf "[TEST] vhost disappears after removing its dir" #printf "[TEST] vhost disappears after removing its dir"
if ! run "test \"\$(curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep -c '${VHOST}')\" = \"0\"" "${RETRIES}" "" "0"; then #if ! run "test \"\$(curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep -c '${VHOST}')\" = \"0\"" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost disappears after removing its dir\\n" # printf "\\r[FAIL] vhost disappears after removing its dir\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep '${VHOST}' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep '${VHOST}' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost disappears after removing its dir\\n" # printf "\\r[OK] vhost disappears after removing its dir\\n"
fi #fi

View File

@ -6,6 +6,137 @@ Make sure to have a look at [UPDATING.md](https://github.com/cytopia/devilbox/bl
## Unreleased ## Unreleased
## Release v3.0.0-beta-0.3 (2022-01-02)
This release provides the `dvl.to` domain to be used with `TLD_SUFFIX` (set to default), which eliminates the need to set any entries in `/etc/hosts`, as all of its subdomain will point to `127.0.0.1` via official DNS. Domain has been acquired thanks to awesome sponsors!
### Fixed
- Intranet: mail.php fixed deprecation warnings [#798](https://github.com/cytopia/devilbox/issues/798)
- Added `host.docker.internal` to extra_hosts to be able to connect to the host system [#919](https://github.com/cytopia/devilbox/issues/919)
### Changed
- Use `dvl.to` as default `TLD_SUFFIX` (it always poits to `127.0.0.1` removing the need to create `/etc/hosts` entries)
### Added
- Intranet: vhost overview shows listening ports
- Intranet: vhost overview now has modals to show httpd and vhost-gen configs
- Docs: Show available tools per version in README.md
- Added `xhprof` PHP extension
## Release v3.0.0-beta-0.2 (2022-12-27)
The Backend configuration now supports websockets as well:
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```bash
# PHP-FPM backend
conf:phpfpm:tcp:php80:9000
# HTTP Reverse Proxy backend
conf:rproxy:http:172.16.238.10:3000
# HTTPS Reverse Proxy backend
conf:rproxy:https:172.16.238.10:3000
# Websocket Reverse Proxy backend
conf:rproxy:ws:172.16.238.10:3000
# SSL Websocket Reverse Proxy backend
conf:rproxy:wss:172.16.238.10:3000
```
Once you're done with `backend.cfg` changes, head over to the Intranet C&C page (http://localhost/cnc.php) and Reload `watcherd`.
### Fixed
- Intranet: vhost overview: allow HTTP 426 to succeed in vhost page (websocket projects)
- Intranet: vhost overview: Reverse Proxy or Websocket backends do not require a `htdocs/` dir for healthcheck
- Fixed reverse proxy template generation for Apache 2.2 and Apache 2.4 [vhost-gen #51](https://github.com/devilbox/vhost-gen/pull/51)
- Fixed Nginx hash bucket size length to allow long hostnames
### Added
- Reverse Proxy automation for websocket projects (`ws://<host>:<port>` or `wss:<host>:<port>`) (Does not work with Apache 2.2)
- Added tool `wscat` to be able to test websocket connections
- Intranet: show `wscat` version
- Intranet: vhost overview now also shows websocket projects
### Changed
- Do not mount any startup/autostart script directories for multi-php compose as they do not contain tools
- Updated vhost-gen templates in `cfg/vhost-gen` (replace your project templates with new ones)
## Release v3.0.0-beta-0.1 (2022-12-24) 🎅🎄🎁
This is a beta release, using a completely rewritten set of HTTPD server, which allow easy reverse Proxy integration and different PHP versions per project:
* https://github.com/devilbox/docker-nginx-stable/pull/55
* https://github.com/devilbox/docker-nginx-mainline/pull/57
* https://github.com/devilbox/docker-apache-2.2/pull/53
* https://github.com/devilbox/docker-apache-2.4/pull/54
Once it has been tested by the community, and potential errors have been addressed, a new major version will be released.
**IMPORTANT:** This release required you to copy `env-example` over onto `.env` due to some changes in variables.
### TL;DR
1. **Multiple PHP Versions**<br/>
Here is an example to run one project with a specific PHP version<br/>
```bash
# Enable all PHP versions
cp compose/docker-compose.override.yml-php-multi.yml docker-compose.override.yml
# Start default set and php80
docker-compose up php httpd bind php80
```
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```
conf:phpfpm:tcp:php80:9000
```
2. **Automated Reverse Proxy setup**<br/>
Here is an example to proxy one project to a backend service (e.g. NodeJS or Python application, which runs in the PHP container on port 3000)<br/>
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```
conf:rproxy:http:127.0.0.1:3000
```
#### PHP hostnames and IP addresses
| PHP Version | Hostname | IP address |
|-------------|----------|----------------|
| 5.4 | php54 | 172.16.238.201 |
| 5.5 | php55 | 172.16.238.202 |
| 5.6 | php56 | 172.16.238.203 |
| 7.0 | php70 | 172.16.238.204 |
| 7.1 | php71 | 172.16.238.205 |
| 7.2 | php72 | 172.16.238.206 |
| 7.3 | php73 | 172.16.238.207 |
| 7.4 | php74 | 172.16.238.208 |
| 8.0 | php80 | 172.16.238.209 |
| 8.1 | php81 | 172.16.238.210 |
| 8.2 | php82 | 172.16.238.211 |
### Fixed
- Fixed Protocol substitution bug in Reverse Proxy generation for Apache 2.2 and Apache 2.4 [vhost-gen #49](https://github.com/devilbox/vhost-gen/pull/49) [vhost-gen #50](https://github.com/devilbox/vhost-gen/pull/50)
- Fixed missing module `mod_proxy_html` in Apache 2.4 as per requirement from `vhost-gen` for Reverse Proxy setup
- Fixed encoding issue with Apache 2.4 Reverse Proxy by enabling `mod_xml2enc` module (Required by `mod_proxy_html`)
- Allow to run different PHP versions per project. fixes [#146](https://github.com/cytopia/devilbox/issues/146)
### Added
- New HTTPD server capable of auto reverse proxy creation (and different PHP versions per project)
- Intranet: Added Command & Control center to view watcherd logs and retrigger config in case of vhost changes
- Intranet: vhost page now also shows the configured Backend
- Environment variable `DEVILBOX_HTTPD_MGMT_PASS`
- Environment variable `DEVILBOX_HTTPD_MGMT_USER`
- New Docker Compose Override file `docker-compose.override.yml-php-multi.yml` (allows to run multiple PHP versions).
- Update Bind to latest version
### Changed
- Disabled `psr` extension by default [php-psr #78](https://github.com/jbboehr/php-psr/issues/78#issuecomment-722290110)
- Disabled `phalcon` extension by default
- Environment variable `DEBUG_COMPOSE_ENTRYPOINT` renamed to `DEBUG_ENTRYPOINT`
- Environment variable `HTTPD_TIMEOUT_TO_PHP_FPM` renamed to `HTTPD_BACKEND_TIMEOUT`
## Release v2.4.0 (2022-12-18) ## 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. 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.

1151
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. 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` ## Update from `v1.8.1` to `v1.8.2`
**PR:** https://github.com/cytopia/devilbox/pull/750 **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 ## General

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 8.2 ini directory
## General ## 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 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. 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 This is useful to apply your custom settings such as installing software that usually requires

View File

@ -34,10 +34,23 @@
# __ERROR_LOG__ # __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 ### Basic vHost skeleton
### ###
### Note: Reverse Proxy section must be last for Apache 2.2
###
vhost: | vhost: |
<VirtualHost __DEFAULT_VHOST__:__PORT__> <VirtualHost __DEFAULT_VHOST__:__PORT__>
ServerName __VHOST_NAME__ ServerName __VHOST_NAME__
@ -45,11 +58,17 @@ vhost: |
CustomLog "__ACCESS_LOG__" combined CustomLog "__ACCESS_LOG__" combined
ErrorLog "__ERROR_LOG__" ErrorLog "__ERROR_LOG__"
# Reverse Proxy definition (Ensure to adjust the port, currently '8000') # ProxyRequests: Disable "Forward Proxy"
ProxyRequests On # ProxyPreserveHost: Pass "Host" header to remote
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On ProxyPreserveHost On
ProxyPass / http://php:8000/ ProxyVia On
ProxyPassReverse / http://php:8000/ <Location />
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
ProxyPass http://php:8000/ retry=0
ProxyPassReverse http://php:8000/
</Location>
__REDIRECT__ __REDIRECT__
__SSL__ __SSL__
@ -92,6 +111,7 @@ features:
# Alias Definition # Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__" Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__"> <Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__ __XDOMAIN_REQ__
</Location> </Location>
<Directory "__PATH____ALIAS__"> <Directory "__PATH____ALIAS__">
@ -101,10 +121,10 @@ features:
deny: | deny: |
# Deny Definition # Deny Definition
<FilesMatch "__REGEX__"> <LocationMatch "__REGEX__">
Order allow,deny Order allow,deny
Deny from all Deny from all
</FilesMatch> </LocationMatch>
server_status: | server_status: |
# Status Page # Status Page
@ -114,13 +134,16 @@ features:
Allow from all Allow from all
</Location> </Location>
# https://stackoverflow.com/a/42558499
# https://fetch.spec.whatwg.org/#forbidden-header-name
xdomain_request: | xdomain_request: |
# Allow cross domain request from these hosts # Allow cross domain request from these hosts
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0 SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "0" Header always set Access-Control-Max-Age "0"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request. # Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS RewriteCond %{REQUEST_METHOD} OPTIONS

View File

@ -40,10 +40,23 @@
# __PHP_PORT__ # __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 ### Basic vHost skeleton
### ###
### Note: Reverse Proxy section must be last for Apache 2.2
###
vhost: | vhost: |
<VirtualHost __DEFAULT_VHOST__:__PORT__> <VirtualHost __DEFAULT_VHOST__:__PORT__>
ServerName __VHOST_NAME__ ServerName __VHOST_NAME__
@ -54,13 +67,13 @@ vhost: |
__REDIRECT__ __REDIRECT__
__SSL__ __SSL__
__VHOST_DOCROOT__ __VHOST_DOCROOT__
__VHOST_RPROXY__
__PHP_FPM__ __PHP_FPM__
__ALIASES__ __ALIASES__
__DENIES__ __DENIES__
__SERVER_STATUS__ __SERVER_STATUS__
# Custom directives # Custom directives
__CUSTOM__ __CUSTOM__
__VHOST_RPROXY__
</VirtualHost> </VirtualHost>
### ###
@ -84,13 +97,38 @@ vhost_type:
Allow from all Allow from all
</Directory> </Directory>
# Reverse Proxy (-r) # Reverse Proxy (-r http(s)://ADDR:PORT)
rproxy: | rproxy: |
# Define the vhost to reverse proxy # ProxyRequests: Disable "Forward Proxy"
ProxyRequests On # ProxyPreserveHost: Pass "Host" header to remote
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On ProxyPreserveHost On
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__ ProxyVia On
ProxyPassReverse __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__ <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 Definition
Alias "__ALIAS__" "__PATH____ALIAS__" Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__"> <Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__ __XDOMAIN_REQ__
</Location> </Location>
<Directory "__PATH____ALIAS__"> <Directory "__PATH____ALIAS__">
@ -129,10 +168,10 @@ features:
deny: | deny: |
# Deny Definition # Deny Definition
<FilesMatch "__REGEX__"> <LocationMatch "__REGEX__">
Order allow,deny Order allow,deny
Deny from all Deny from all
</FilesMatch> </LocationMatch>
server_status: | server_status: |
# Status Page # Status Page
@ -142,13 +181,16 @@ features:
Allow from all Allow from all
</Location> </Location>
# https://stackoverflow.com/a/42558499
# https://fetch.spec.whatwg.org/#forbidden-header-name
xdomain_request: | xdomain_request: |
# Allow cross domain request from these hosts # Allow cross domain request from these hosts
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0 SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "0" Header always set Access-Control-Max-Age "0"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request. # Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS RewriteCond %{REQUEST_METHOD} OPTIONS

View File

@ -34,6 +34,17 @@
# __ERROR_LOG__ # __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 ### Basic vHost skeleton
@ -46,11 +57,19 @@ vhost: |
CustomLog "__ACCESS_LOG__" combined CustomLog "__ACCESS_LOG__" combined
ErrorLog "__ERROR_LOG__" ErrorLog "__ERROR_LOG__"
# Reverse Proxy definition (Ensure to adjust the port, currently '8000') # ProxyRequests: Disable "Forward Proxy"
ProxyRequests On # ProxyPreserveHost: Pass "Host" header to remote
# ProxyAddHeaders: Add "X-Forward-*" headers
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On ProxyPreserveHost On
ProxyPass / http://php:8000/ ProxyAddHeaders On
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__ __REDIRECT__
__SSL__ __SSL__
@ -93,6 +112,7 @@ features:
# Alias Definition # Alias Definition
Alias "__ALIAS__" "__PATH____ALIAS__" Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__"> <Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__ __XDOMAIN_REQ__
</Location> </Location>
<Directory "__PATH____ALIAS__"> <Directory "__PATH____ALIAS__">
@ -103,10 +123,10 @@ features:
deny: | deny: |
# Deny Definition # Deny Definition
<FilesMatch "__REGEX__"> <LocationMatch "__REGEX__">
Order allow,deny Order allow,deny
Deny from all Deny from all
</FilesMatch> </LocationMatch>
server_status: | server_status: |
# Status Page # Status Page
@ -117,13 +137,16 @@ features:
Require all granted Require all granted
</Location> </Location>
# https://stackoverflow.com/a/42558499
# https://fetch.spec.whatwg.org/#forbidden-header-name
xdomain_request: | xdomain_request: |
# Allow cross domain request from these hosts # Allow cross domain request from these hosts
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0 SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "0" Header always set Access-Control-Max-Age "0"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request. # Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS RewriteCond %{REQUEST_METHOD} OPTIONS

View File

@ -40,6 +40,17 @@
# __PHP_PORT__ # __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 ### Basic vHost skeleton
@ -86,13 +97,42 @@ vhost_type:
Require all granted Require all granted
</Directory> </Directory>
# Reverse Proxy (-r) # Reverse Proxy (-r http(s)://ADDR:PORT)
rproxy: | rproxy: |
# Define the vhost to reverse proxy # ProxyRequests: Disable "Forward Proxy"
ProxyRequests On # ProxyPreserveHost: Pass "Host" header to remote
# ProxyAddHeaders: Add "X-Forward-*" headers
# ProxyVia: Add "Via" header
ProxyRequests Off
ProxyPreserveHost On ProxyPreserveHost On
ProxyPass __LOCATION__ __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT____LOCATION__ ProxyAddHeaders On
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
# 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 Definition
Alias "__ALIAS__" "__PATH____ALIAS__" Alias "__ALIAS__" "__PATH____ALIAS__"
<Location "__ALIAS__"> <Location "__ALIAS__">
ProxyPass !
__XDOMAIN_REQ__ __XDOMAIN_REQ__
</Location> </Location>
<Directory "__PATH____ALIAS__"> <Directory "__PATH____ALIAS__">
@ -151,10 +192,10 @@ features:
deny: | deny: |
# Deny Definition # Deny Definition
<FilesMatch "__REGEX__"> <LocationMatch "__REGEX__">
Order allow,deny Order allow,deny
Deny from all Deny from all
</FilesMatch> </LocationMatch>
server_status: | server_status: |
# Status Page # Status Page
@ -165,13 +206,16 @@ features:
Require all granted Require all granted
</Location> </Location>
# https://stackoverflow.com/a/42558499
# https://fetch.spec.whatwg.org/#forbidden-header-name
xdomain_request: | xdomain_request: |
# Allow cross domain request from these hosts # Allow cross domain request from these hosts
SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0 SetEnvIf Origin "__REGEX__" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Allow-Methods "HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "0" Header always set Access-Control-Max-Age "0"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
# Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request. # Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
RewriteEngine On RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS RewriteCond %{REQUEST_METHOD} OPTIONS

View File

@ -48,8 +48,11 @@ vhost: |
# Reverse Proxy definition (Ensure to adjust the port, currently '8000') # Reverse Proxy definition (Ensure to adjust the port, currently '8000')
location / { location / {
proxy_set_header Host $host; # https://stackoverflow.com/a/72586833
proxy_set_header X-Real-IP $remote_addr; 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; proxy_pass http://php:8000;
} }
@ -111,11 +114,12 @@ features:
xdomain_request: | xdomain_request: |
# Allow cross domain request from these hosts # Allow cross domain request from these hosts
# https://fetch.spec.whatwg.org/#forbidden-header-name
if ( $http_origin ~* (__REGEX__) ) { if ( $http_origin ~* (__REGEX__) ) {
add_header "Access-Control-Allow-Origin" "$http_origin"; add_header "Access-Control-Allow-Origin" "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Methods' 'HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Headers' 'Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Security-Policy, Location';
add_header 'Access-Control-Max-Age' 0; add_header 'Access-Control-Max-Age' 0;
return 200; return 200;
} }

View File

@ -75,12 +75,31 @@ vhost_type:
root "__DOCUMENT_ROOT__"; root "__DOCUMENT_ROOT__";
index __INDEX__; index __INDEX__;
# Reverse Proxy (-r) # Reverse Proxy (-r http(s)://ADDR:PORT)
rproxy: | rproxy: |
# Define the vhost to reverse proxy # Define Reverse Proxy
location __LOCATION__ { location __LOCATION__ {
proxy_set_header Host $host; # https://stackoverflow.com/a/72586833
proxy_set_header X-Real-IP $remote_addr; 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__; proxy_pass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__;
} }
@ -147,11 +166,12 @@ features:
xdomain_request: | xdomain_request: |
# Allow cross domain request from these hosts # Allow cross domain request from these hosts
# https://fetch.spec.whatwg.org/#forbidden-header-name
if ( $http_origin ~* (__REGEX__) ) { if ( $http_origin ~* (__REGEX__) ) {
add_header "Access-Control-Allow-Origin" "$http_origin"; add_header "Access-Control-Allow-Origin" "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Methods' 'HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Headers' 'Accept, Authorization, Content-Security-Policy, Content-Type, Location, Origin, X-Requested-With';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Security-Policy, Location';
add_header 'Access-Control-Max-Age' 0; add_header 'Access-Control-Max-Age' 0;
return 200; return 200;
} }

View File

@ -219,13 +219,13 @@ print_head_1 "Checking .env file values"
WRONG_ENV_FILES_VALUES=0 WRONG_ENV_FILES_VALUES=0
DEBUG_COMPOSE_ENTRYPOINT="$( get_env_value "DEBUG_COMPOSE_ENTRYPOINT" )" DEBUG_ENTRYPOINT="$( get_env_value "DEBUG_ENTRYPOINT" )"
if [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "0" ] && [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "1" ] && [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "2" ]; then if [ "${DEBUG_ENTRYPOINT}" != "0" ] && [ "${DEBUG_ENTRYPOINT}" != "1" ] && [ "${DEBUG_ENTRYPOINT}" != "2" ] && [ "${DEBUG_ENTRYPOINT}" != "3" ] && [ "${DEBUG_ENTRYPOINT}" != "4" ]; then
log_err "Variable 'DEBUG_COMPOSE_ENTRYPOINT' should be 0, 1 or 2. Has: ${DEBUG_COMPOSE_ENTRYPOINT}" log_err "Variable 'DEBUG_ENTRYPOINT' should be 0, 1, 2, 3 or 4. Has: ${DEBUG_ENTRYPOINT}"
RET_CODE=$(( RET_CODE + 1)) RET_CODE=$(( RET_CODE + 1))
WRONG_ENV_FILES_VALUES=1 WRONG_ENV_FILES_VALUES=1
else else
log_debug "Variable 'DEBUG_COMPOSE_ENTRYPOINT' has correct value: ${DEBUG_COMPOSE_ENTRYPOINT}" log_debug "Variable 'DEBUG_ENTRYPOINT' has correct value: ${DEBUG_ENTRYPOINT}"
fi fi
DOCKER_LOGS="$( get_env_value "DOCKER_LOGS" )" 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" 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" log_ok "All PHP log/ sub directories are present"
fi 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 # /cfg/apache|nginx-VERSION
DIR_MISSING=0 DIR_MISSING=0
while read -r httpd_version; do while read -r httpd_version; do
@ -522,7 +507,6 @@ DEVILBOX_DIRS=(
"cfg" "cfg"
"compose" "compose"
"log" "log"
"mod"
"supervisor" "supervisor"
) )
@ -591,7 +575,6 @@ DEVILBOX_DIRS=(
"ca" "ca"
"cfg" "cfg"
"compose" "compose"
"mod"
"supervisor" "supervisor"
) )

View File

@ -243,6 +243,26 @@ services:
- bind - bind
- httpd - 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 ### Volumes
@ -252,3 +272,4 @@ volumes:
devilbox-solr: devilbox-solr:
devilbox-elastic: devilbox-elastic:
devilbox-logstash: 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.150
hostname: php54
networks:
app_net:
ipv4_address: 172.16.238.201
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-5.4:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-5.4:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-5.4:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php55:
<<: *default-php
image: devilbox/php-fpm:5.5-prod-0.150
hostname: php55
networks:
app_net:
ipv4_address: 172.16.238.202
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-5.5:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-5.5:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-5.5:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php56:
<<: *default-php
image: devilbox/php-fpm:5.6-prod-0.150
hostname: php56
networks:
app_net:
ipv4_address: 172.16.238.203
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-5.6:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-5.6:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-5.6:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php70:
<<: *default-php
image: devilbox/php-fpm:7.0-prod-0.150
hostname: php70
networks:
app_net:
ipv4_address: 172.16.238.204
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-7.0:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-7.0:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-7.0:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php71:
<<: *default-php
image: devilbox/php-fpm:7.1-prod-0.150
hostname: php71
networks:
app_net:
ipv4_address: 172.16.238.205
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-7.1:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-7.1:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-7.1:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php72:
<<: *default-php
image: devilbox/php-fpm:7.2-prod-0.150
hostname: php72
networks:
app_net:
ipv4_address: 172.16.238.206
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-7.2:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-7.2:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-7.2:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php73:
<<: *default-php
image: devilbox/php-fpm:7.3-prod-0.150
hostname: php73
networks:
app_net:
ipv4_address: 172.16.238.207
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-7.3:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-7.3:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-7.3:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php74:
<<: *default-php
image: devilbox/php-fpm:7.4-prod-0.150
hostname: php74
networks:
app_net:
ipv4_address: 172.16.238.208
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-7.4:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-7.4:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-7.4:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php80:
<<: *default-php
image: devilbox/php-fpm:8.0-prod-0.150
hostname: php80
networks:
app_net:
ipv4_address: 172.16.238.209
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-8.0:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-8.0:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-8.0:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php81:
<<: *default-php
image: devilbox/php-fpm:8.1-prod-0.150
hostname: php81
networks:
app_net:
ipv4_address: 172.16.238.210
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-8.1:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-8.1:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-8.1:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}
php82:
<<: *default-php
image: devilbox/php-fpm:8.2-prod-0.150
hostname: php82
networks:
app_net:
ipv4_address: 172.16.238.211
volumes:
# Specific volumes
- ${DEVILBOX_PATH}/cfg/php-ini-8.2:/etc/php-custom.d:ro${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/cfg/php-fpm-8.2:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/cfg/php-startup-8.2:/startup.1.d:rw${MOUNT_OPTIONS}
# Generic volumes
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/supervisor:/etc/supervisor/custom.d:rw${MOUNT_OPTIONS}
# - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
- devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}

View File

@ -34,7 +34,7 @@ services:
# Bind (DNS Server) # Bind (DNS Server)
# ------------------------------------------------------------ # ------------------------------------------------------------
bind: bind:
image: cytopia/bind:alpine-0.34 image: cytopia/bind:alpine-0.35
hostname: bind hostname: bind
restart: always restart: always
ports: ports:
@ -46,7 +46,7 @@ services:
## ##
## Debug? ## Debug?
## ##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT} - DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT:-2}
## ##
## Memory consumption ## Memory consumption
@ -89,6 +89,7 @@ services:
extra_hosts: extra_hosts:
docker.for.lin.host.internal: 172.16.238.1 docker.for.lin.host.internal: 172.16.238.1
docker.for.lin.localhost: 172.16.238.1 docker.for.lin.localhost: 172.16.238.1
host.docker.internal: host-gateway
networks: networks:
app_net: app_net:
@ -99,7 +100,7 @@ services:
# PHP # PHP
# ------------------------------------------------------------ # ------------------------------------------------------------
php: php:
image: devilbox/php-fpm:${PHP_SERVER}-work-0.147 image: devilbox/php-fpm:${PHP_SERVER}-work-0.150
hostname: php hostname: php
## ##
@ -112,11 +113,17 @@ services:
- ./.env - ./.env
environment: 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/Logging
## ##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT} - DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT:-2}
- DEBUG_COMPOSE_ENTRYPOINT
- DOCKER_LOGS - DOCKER_LOGS
## ##
@ -165,6 +172,7 @@ services:
extra_hosts: extra_hosts:
docker.for.lin.host.internal: 172.16.238.1 docker.for.lin.host.internal: 172.16.238.1
docker.for.lin.localhost: 172.16.238.1 docker.for.lin.localhost: 172.16.238.1
host.docker.internal: host-gateway
networks: networks:
app_net: app_net:
@ -197,10 +205,6 @@ services:
# to overwrite the default PHP-FPM configuration # to overwrite the default PHP-FPM configuration
- ${DEVILBOX_PATH}/cfg/php-fpm-${PHP_SERVER}:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS} - ${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 # Mount devilbox user-defined PHP-FPM startup *.sh scripts
- ${DEVILBOX_PATH}/cfg/php-startup-${PHP_SERVER}:/startup.1.d:rw${MOUNT_OPTIONS} - ${DEVILBOX_PATH}/cfg/php-startup-${PHP_SERVER}:/startup.1.d:rw${MOUNT_OPTIONS}
- ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS} - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}
@ -225,16 +229,26 @@ services:
# Web Server # Web Server
# ------------------------------------------------------------ # ------------------------------------------------------------
httpd: httpd:
image: devilbox/${HTTPD_SERVER}:${HTTPD_FLAVOUR:-alpine}-0.48 image: devilbox/${HTTPD_SERVER}:${HTTPD_FLAVOUR:-alpine}-1.0
hostname: httpd hostname: httpd
environment: 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/Logging
## ##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT} - DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT:-2}
- DEBUG_RUNTIME=${DEBUG_COMPOSE_ENTRYPOINT} - DEBUG_RUNTIME=1
- DOCKER_LOGS - DOCKER_LOGS
## ##
@ -268,25 +282,23 @@ services:
- MAIN_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both} - MAIN_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both}
- MAIN_VHOST_SSL_GEN=1 - MAIN_VHOST_SSL_GEN=1
- MAIN_VHOST_SSL_CN=${DEVILBOX_UI_SSL_CN:-localhost} - 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 ## Enable Mass Vhosts
## ##
- MASS_VHOST_ENABLE=1 - MASS_VHOST_ENABLE=1
- MASS_VHOST_TLD=.${TLD_SUFFIX} - MASS_VHOST_TLD_SUFFIX=.${TLD_SUFFIX}
- MASS_VHOST_DOCROOT=${HTTPD_DOCROOT_DIR} - MASS_VHOST_DOCROOT_DIR=${HTTPD_DOCROOT_DIR}
- MASS_VHOST_TPL=${HTTPD_TEMPLATE_DIR} - MASS_VHOST_TEMPLATE_DIR=${HTTPD_TEMPLATE_DIR}
- MASS_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both} - MASS_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both}
- MASS_VHOST_SSL_GEN=1 - MASS_VHOST_SSL_GEN=1
- MASS_VHOST_BACKEND=conf:phpfpm:tcp:172.16.238.10:9000
## - MASS_VHOST_BACKEND_REWRITE=file:backend.cfg
## PHP-FPM Remote Server - MASS_VHOST_BACKEND_TIMEOUT=${HTTPD_BACKEND_TIMEOUT:-180}
## - MASS_VHOST_ALIASES_ALLOW=/devilbox-api/:/var/www/default/api:http(s)?://(.*)$$
- 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}
ports: ports:
# ---- Format: ---- # ---- Format: ----
@ -315,7 +327,7 @@ services:
- ${DEVILBOX_PATH}/cfg/vhost-gen:/etc/vhost-gen.d:rw${MOUNT_OPTIONS} - ${DEVILBOX_PATH}/cfg/vhost-gen:/etc/vhost-gen.d:rw${MOUNT_OPTIONS}
# Mount logs # 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 # Certificate Authority public key
- ${DEVILBOX_PATH}/ca:/ca:rw${MOUNT_OPTIONS} - ${DEVILBOX_PATH}/ca:/ca:rw${MOUNT_OPTIONS}

View File

@ -12,8 +12,8 @@
.. |ext_lnk_doc_bind_soa| raw:: html .. |ext_lnk_doc_bind_soa| raw:: html
<a target="_blank" href="https://bind9.readthedocs.io/en/latest/introduction.html?highlight=soa#secondary-servers"> <a target="_blank" href="https://bind9.readthedocs.io/en/latest/reference.html">
BIND SOA <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" /> BIND Reference <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a> </a>
.. |ext_lnk_doc_wiki_database_timezones| raw:: html .. |ext_lnk_doc_wiki_database_timezones| raw:: html
@ -135,3 +135,16 @@
<a target="_blank" href="https://github.com/elastic/kibana"> <a target="_blank" href="https://github.com/elastic/kibana">
GitHub: Kibana <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" /> GitHub: Kibana <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a> </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 .. |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" /> Official Magento 2 Documentation <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a> </a>

View File

@ -36,7 +36,7 @@
.. |ext_lnk_xdebug_ide_atom_php_debug| raw:: html .. |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" /> php-debug <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
</a> </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/"> <a target="_blank" href="https://github.com/cytopia/devilbox/pull/942">
<strong>PHP-FPM Community <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" /></strong> <strong>Release v3.0.0-beta-0.1 <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" /></strong>
</a> </a>
.. attention:: .. 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-blackfire
├── docker-compose.override.yml-elk ├── docker-compose.override.yml-elk
├── docker-compose.override.yml-mailhog ├── docker-compose.override.yml-mailhog
├── docker-compose.override.yml-meilisearch
├── docker-compose.override.yml-ngrok ├── docker-compose.override.yml-ngrok
├── docker-compose.override.yml-php-community ├── docker-compose.override.yml-php-community
├── docker-compose.override.yml-python-flask ├── 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?
## ##
- DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT} - DEBUG_ENTRYPOINT=${DEBUG_ENTRYPOINT}
- DOCKER_LOGS=1 - DOCKER_LOGS=1
## ##

View File

@ -32,18 +32,18 @@ to ``.env`` to initially create it with sane defaults.
Core settings Core settings
============= =============
DEBUG_COMPOSE_ENTRYPOINT DEBUG_ENTRYPOINT
------------------------ ----------------
This variable controls the docker-compose log verbosity during service startup. 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 ``1`` verbose output as well as executed commands are shown.
When set to ``0`` only warnings and errors are shown. When set to ``0`` only warnings and errors are shown.
+------------------------------+----------------+---------------+ +------------------------------+-----------------------------------+---------------+
| Name | Allowed values | Default value | | Name | Allowed values | Default value |
+==============================+================+===============+ +==============================+===================================+===============+
| ``DEBUG_COMPOSE_ENTRYPOINT`` | ``0`` or ``1`` | ``1`` | | ``DEBUG_ENTRYPOINT`` | ``0``, ``1``, ``2``, ``3``, ``4`` | ``2`` |
+------------------------------+----------------+---------------+ +------------------------------+-----------------------------------+---------------+
.. _env_docker_logs: .. _env_docker_logs:
@ -1505,8 +1505,8 @@ changing the server name or adding locations to other assets.
.. _env_httpd_timeout_to_php_fpm: .. _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 This variable specifies after how many seconds the webserver should quit an unanswered connection
to PHP-FPM. 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 could still run and the webserver will simply drop the connection before getting an answer
by PHP. 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. 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. than ``max_execution_time``, you will get a proper PHP error message in the browser.
+------------------------------+-------------------+------------------+ +------------------------------+-------------------+------------------+
| Name | Allowed values | Default value | | Name | Allowed values | Default value |
+==============================+===================+==================+ +==============================+===================+==================+
| ``HTTPD_TIMEOUT_TO_PHP_FPM`` | positive integer | ``180`` | | ``HTTPD_BACKEND_TIMEOUT`` | positive integer | ``180`` |
+------------------------------+-------------------+------------------+ +------------------------------+-------------------+------------------+
HTTPD_NGINX_WORKER_PROCESSES 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

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

View File

@ -11,7 +11,7 @@ Enable/disable PHP modules
.. contents:: :local: .. contents:: :local:
.. seealso:: .. 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. 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 ### Show all executed commands in each
### docker image during docker-compose up? ### docker image during docker-compose up?
### ###
### 0: Quiet ### 0: Errors
### 1: Verbose ### 1: Errors, Warnings
### 2: More verbose ### 2: Errors, Warnings, Infos (Recommended)
DEBUG_COMPOSE_ENTRYPOINT=2 ### 3: Errors, Warnings, Infos, Debug
### 4: Errors, Warnings, Infos, Debug, Trace
DEBUG_ENTRYPOINT=2
### ###
@ -88,17 +90,20 @@ LOCAL_LISTEN_ADDR=
### ###
### Note: In addition to period or dot character ('.'), only ALPHA ([a-zA-Z]+) characters are supported. ### Note: In addition to period or dot character ('.'), only ALPHA ([a-zA-Z]+) characters are supported.
### Mac users should not use the .local TLD, as this will not resolve properly due Apple's ### Mac users should not use the .local TLD, as this will not resolve properly due Apple's
### use of Multicast DNS.## ### use of Multicast DNS.
###
### Note: If you use 'dvl.to' then there is no need for additional DNS as this always points
### to 127.0.0.1 by default.
### ###
### Example: ### Example:
### TLD_SUFFIX=loc ### TLD_SUFFIX=loc
### Makes your project available under xxxx.loc ### Makes your project available under <project>.loc
### ###
### Example: ### Example:
### TLD_SUFFIX=local ### TLD_SUFFIX=local
### Makes your project available under xxxx.local ### Makes your project available under <project>.local
### ###
TLD_SUFFIX=loc TLD_SUFFIX=dvl.to
### ###
@ -236,6 +241,12 @@ DEVILBOX_VENDOR_PHPMYADMIN_AUTOLOGIN=1
### ###
DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN=1 DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN=1
###
### HTTPD Supvervisord management
###
DEVILBOX_HTTPD_MGMT_USER=supervisord
DEVILBOX_HTTPD_MGMT_PASS=mypassword
################################################################################ ################################################################################
@ -515,7 +526,7 @@ PHP_MODULES_ENABLE=
### ###
### PHP_MODULES_DISABLE=xdebug,imagick,swoole ### 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 +620,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, ### This setting specifies the Timeout for a remote Backend server,
### otherwise the php script could still run and the webserver will ### such as PHP-FPM or a Reverse Proxy.
### simply drop the connection before getting an answer by PHP.
### ###
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.

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