mirror of
https://github.com/cytopia/devilbox.git
synced 2025-06-24 18:25:17 +00:00
Compare commits
66 Commits
Author | SHA1 | Date | |
---|---|---|---|
8c931cdf56 | |||
487b69331c | |||
6984d43ff9 | |||
a097b5b4d8 | |||
0b118486b5 | |||
c73d5a711f | |||
78244371ca | |||
a1fa4806e1 | |||
02e3f8cf6e | |||
f7741d88f9 | |||
bc16d8906e | |||
fa6a91350c | |||
d4e3b885da | |||
68f34be368 | |||
5679774a30 | |||
056bbfb057 | |||
fb77920460 | |||
a377209a72 | |||
c1fbb9c2c4 | |||
ca6f7f56ac | |||
163642aac7 | |||
37c82a334c | |||
844ca283bf | |||
63de90415c | |||
c67c66c8ef | |||
80b6582d91 | |||
d68adcbb01 | |||
112e24207b | |||
17232a5eb4 | |||
7d6c7a4aff | |||
a98c6146a4 | |||
175e4d8d02 | |||
c56243bb9d | |||
e294e6f6cd | |||
4691117100 | |||
d104e4e9a5 | |||
8aabde1b5a | |||
44bbf048ce | |||
84183c9688 | |||
c05a74fd5f | |||
0c5750b8bf | |||
886689ca64 | |||
bfdd3ffbfc | |||
3c12883ea1 | |||
51281ef5a0 | |||
bf140cf8cd | |||
ed8639c636 | |||
06830367c9 | |||
556b50d76c | |||
4d2839f6d5 | |||
87fe2ba593 | |||
cd82fa74a7 | |||
e48c8e96dc | |||
f29d552dfa | |||
304fc86329 | |||
d44905bfb5 | |||
1b9ef528d2 | |||
4f97eae8fe | |||
2e09f7f0f8 | |||
6fa7a84bd3 | |||
266c5b84a3 | |||
b75aa9f2ab | |||
99163bd525 | |||
dada924b41 | |||
75b6db7676 | |||
f90b53c79a |
@ -13,8 +13,8 @@ error_reporting(-1);
|
||||
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
|
||||
|
||||
|
||||
$DEVILBOX_VERSION = 'v1.4.0';
|
||||
$DEVILBOX_DATE = '2020-01-02';
|
||||
$DEVILBOX_VERSION = 'v1.7.0';
|
||||
$DEVILBOX_DATE = '2020-03-24';
|
||||
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
|
||||
|
||||
//
|
||||
|
391
.devilbox/www/htdocs/vendor/ocp.php
vendored
Normal file
391
.devilbox/www/htdocs/vendor/ocp.php
vendored
Normal file
@ -0,0 +1,391 @@
|
||||
<?php
|
||||
/*
|
||||
OCP - Opcache Control Panel (aka Zend Optimizer+ Control Panel for PHP)
|
||||
Author: _ck_ (with contributions by GK, stasilok)
|
||||
Version: 0.1.7
|
||||
Free for any kind of use or modification, I am not responsible for anything, please share your improvements
|
||||
|
||||
* revision history
|
||||
0.1.7 2015-09-01 regex fix for PHP7 phpinfo
|
||||
0.1.6 2013-04-12 moved meta to footer so graphs can be higher and reduce clutter
|
||||
0.1.5 2013-04-12 added graphs to visualize cache state, please report any browser/style bugs
|
||||
0.1.4 2013-04-09 added "recheck" to update files when using large revalidate_freq (or validate_timestamps=Off)
|
||||
0.1.3 2013-03-30 show host and php version, can bookmark with hashtag ie. #statistics - needs new layout asap
|
||||
0.1.2 2013-03-25 show optimization levels, number formatting, support for start_time in 7.0.2
|
||||
0.1.1 2013-03-18 today Zend completely renamed Optimizer+ to OPcache, adjusted OCP to keep working
|
||||
0.1.0 2013-03-17 added group/sort indicators, replaced "accelerator_" functions with "opcache_"
|
||||
0.0.6 2013-03-16 transition support as Zend renames product and functions for PHP 5.5 (stasilok)
|
||||
0.0.5 2013-03-10 added refresh button (GK)
|
||||
0.0.4 2013-02-18 added file grouping and sorting (click on headers) - code needs cleanup but gets the job done
|
||||
0.0.2 2013-02-14 first public release
|
||||
|
||||
* known problems/limitations:
|
||||
Unlike APC, the Zend OPcache API
|
||||
- cannot determine when a file was put into the cache
|
||||
- cannot change settings on the fly
|
||||
- cannot protect opcache functions by restricting execution to only specific scripts/paths
|
||||
|
||||
* todo:
|
||||
Extract variables for prefered ordering and better layout instead of just dumping into tables
|
||||
File list filter
|
||||
|
||||
*/
|
||||
|
||||
// ini_set('display_errors',1); error_reporting(-1);
|
||||
if ( count(get_included_files())>1 || php_sapi_name()=='cli' || empty($_SERVER['REMOTE_ADDR']) ) { die; } // weak block against indirect access
|
||||
|
||||
$time=time();
|
||||
define('CACHEPREFIX',function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));
|
||||
|
||||
if ( !empty($_GET['RESET']) ) {
|
||||
if ( function_exists(CACHEPREFIX.'reset') ) { call_user_func(CACHEPREFIX.'reset'); }
|
||||
header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( !empty($_GET['RECHECK']) ) {
|
||||
if ( function_exists(CACHEPREFIX.'invalidate') ) {
|
||||
$recheck=trim($_GET['RECHECK']); $files=call_user_func(CACHEPREFIX.'get_status');
|
||||
if (!empty($files['scripts'])) {
|
||||
foreach ($files['scripts'] as $file=>$value) {
|
||||
if ( $recheck==='1' || strpos($file,$recheck)===0 ) call_user_func(CACHEPREFIX.'invalidate',$file);
|
||||
}
|
||||
}
|
||||
header( 'Location: '.str_replace('?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI']) );
|
||||
} else { echo 'Sorry, this feature requires Zend Opcache newer than April 8th 2013'; }
|
||||
exit;
|
||||
}
|
||||
|
||||
?><!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>OCP - Opcache Control Panel</title>
|
||||
<meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" />
|
||||
|
||||
<style type="text/css">
|
||||
body {background-color: #fff; color: #000;}
|
||||
body, td, th, h1, h2 {font-family: sans-serif;}
|
||||
pre {margin: 0px; font-family: monospace;}
|
||||
a:link,a:visited {color: #000099; text-decoration: none;}
|
||||
a:hover {text-decoration: underline;}
|
||||
table {border-collapse: collapse; width: 600px; }
|
||||
.center {text-align: center;}
|
||||
.center table { margin-left: auto; margin-right: auto; text-align: left;}
|
||||
.center th { text-align: center !important; }
|
||||
.middle {vertical-align:middle;}
|
||||
td, th { border: 1px solid #000; font-size: 75%; vertical-align: baseline; padding: 3px; }
|
||||
h1 {font-size: 150%;}
|
||||
h2 {font-size: 125%;}
|
||||
.p {text-align: left;}
|
||||
.e {background-color: #ccccff; font-weight: bold; color: #000; width:50%; white-space:nowrap;}
|
||||
.h {background-color: #9999cc; font-weight: bold; color: #000;}
|
||||
.v {background-color: #cccccc; color: #000;}
|
||||
.vr {background-color: #cccccc; text-align: right; color: #000; white-space: nowrap;}
|
||||
.b {font-weight:bold;}
|
||||
.white, .white a {color:#fff;}
|
||||
img {float: right; border: 0px;}
|
||||
hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000;}
|
||||
.meta, .small {font-size: 75%; }
|
||||
.meta {margin: 2em 0;}
|
||||
.meta a, th a {padding: 10px; white-space:nowrap; }
|
||||
.buttons {margin:0 0 1em;}
|
||||
.buttons a {margin:0 15px; background-color: #9999cc; color:#fff; text-decoration:none; padding:1px; border:1px solid #000; display:inline-block; width:5em; text-align:center;}
|
||||
#files td.v a {font-weight:bold; color:#9999cc; margin:0 10px 0 5px; text-decoration:none; font-size:120%;}
|
||||
#files td.v a:hover {font-weight:bold; color:#ee0000;}
|
||||
.graph {display:inline-block; width:145px; margin:1em 0 1em 1px; border:0; vertical-align:top;}
|
||||
.graph table {width:100%; height:150px; border:0; padding:0; margin:5px 0 0 0; position:relative;}
|
||||
.graph td {vertical-align:middle; border:0; padding:0 0 0 5px;}
|
||||
.graph .bar {width:25px; text-align:right; padding:0 2px; color:#fff;}
|
||||
.graph .total {width:34px; text-align:center; padding:0 5px 0 0;}
|
||||
.graph .total div {border:1px dashed #888; border-right:0; height:99%; width:12px; position:absolute; bottom:0; left:17px; z-index:-1;}
|
||||
.graph .total span {background:#fff; font-weight:bold;}
|
||||
.graph .actual {text-align:right; font-weight:bold; padding:0 5px 0 0;}
|
||||
.graph .red {background:#ee0000;}
|
||||
.graph .green {background:#00cc00;}
|
||||
.graph .brown {background:#8B4513;}
|
||||
</style>
|
||||
<!--[if lt IE 9]><script type="text/javascript" defer="defer">
|
||||
window.onload=function(){var i,t=document.getElementsByTagName('table');for(i=0;i<t.length;i++){if(t[i].parentNode.className=='graph')t[i].style.height=150-(t[i].clientHeight-150)+'px';}}
|
||||
</script><![endif]-->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="center">
|
||||
|
||||
<h1><a href="?">Opcache Control Panel</a></h1>
|
||||
|
||||
<div class="buttons">
|
||||
<a href="?ALL=1">Details</a>
|
||||
<a href="?FILES=1&GROUP=2&SORT=3">Files</a>
|
||||
<a href="?RESET=1" onclick="return confirm('RESET cache ?')">Reset</a>
|
||||
<?php if ( function_exists(CACHEPREFIX.'invalidate') ) { ?>
|
||||
<a href="?RECHECK=1" onclick="return confirm('Recheck all files in the cache ?')">Recheck</a>
|
||||
<?php } ?>
|
||||
<a href="?" onclick="window.location.reload(true); return false">Refresh</a>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
if ( !function_exists(CACHEPREFIX.'get_status') ) { echo '<h2>Opcache not detected?</h2>'; die; }
|
||||
|
||||
if ( !empty($_GET['FILES']) ) { echo '<h2>files cached</h2>'; files_display(); echo '</div></body></html>'; exit; }
|
||||
|
||||
if ( !(isset($_REQUEST['GRAPHS']) && !$_REQUEST['GRAPHS']) && CACHEPREFIX=='opcache_') { graphs_display(); if ( !empty($_REQUEST['GRAPHS']) ) { exit; } }
|
||||
|
||||
ob_start(); phpinfo(8); $phpinfo = ob_get_contents(); ob_end_clean(); // some info is only available via phpinfo? sadly buffering capture has to be used
|
||||
if ( !preg_match( '/module\_Zend.(Optimizer\+|OPcache).+?(\<table[^>]*\>.+?\<\/table\>).+?(\<table[^>]*\>.+?\<\/table\>)/is', $phpinfo, $opcache) ) { } // todo
|
||||
|
||||
if ( function_exists(CACHEPREFIX.'get_configuration') ) { echo '<h2>general</h2>'; $configuration=call_user_func(CACHEPREFIX.'get_configuration'); }
|
||||
|
||||
$host=function_exists('gethostname')?@gethostname():@php_uname('n'); if (empty($host)) { $host=empty($_SERVER['SERVER_NAME'])?$_SERVER['HOST_NAME']:$_SERVER['SERVER_NAME']; }
|
||||
$version=array('Host'=>$host);
|
||||
$version['PHP Version']='PHP '.(defined('PHP_VERSION')?PHP_VERSION:'???').' '.(defined('PHP_SAPI')?PHP_SAPI:'').' '.(defined('PHP_OS')?' '.PHP_OS:'');
|
||||
$version['Opcache Version']=empty($configuration['version']['version'])?'???':$configuration['version'][CACHEPREFIX.'product_name'].' '.$configuration['version']['version'];
|
||||
print_table($version);
|
||||
|
||||
if ( !empty($opcache[2]) ) { echo preg_replace('/\<tr\>\<td class\="e"\>[^>]+\<\/td\>\<td class\="v"\>[0-9\,\. ]+\<\/td\>\<\/tr\>/','',$opcache[2]); }
|
||||
|
||||
if ( function_exists(CACHEPREFIX.'get_status') && $status=call_user_func(CACHEPREFIX.'get_status') ) {
|
||||
$uptime=array();
|
||||
if ( !empty($status[CACHEPREFIX.'statistics']['start_time']) ) {
|
||||
$uptime['uptime']=time_since($time,$status[CACHEPREFIX.'statistics']['start_time'],1,'');
|
||||
}
|
||||
if ( !empty($status[CACHEPREFIX.'statistics']['last_restart_time']) ) {
|
||||
$uptime['last_restart']=time_since($time,$status[CACHEPREFIX.'statistics']['last_restart_time']);
|
||||
}
|
||||
if (!empty($uptime)) {print_table($uptime);}
|
||||
|
||||
if ( !empty($status['cache_full']) ) { $status['memory_usage']['cache_full']=$status['cache_full']; }
|
||||
|
||||
echo '<h2 id="memory">memory</h2>';
|
||||
print_table($status['memory_usage']);
|
||||
unset($status[CACHEPREFIX.'statistics']['start_time'],$status[CACHEPREFIX.'statistics']['last_restart_time']);
|
||||
echo '<h2 id="statistics">statistics</h2>';
|
||||
print_table($status[CACHEPREFIX.'statistics']);
|
||||
}
|
||||
|
||||
if ( empty($_GET['ALL']) ) { meta_display(); exit; }
|
||||
|
||||
if ( !empty($configuration['blacklist']) ) { echo '<h2 id="blacklist">blacklist</h2>'; print_table($configuration['blacklist']); }
|
||||
|
||||
if ( !empty($opcache[3]) ) { echo '<h2 id="runtime">runtime</h2>'; echo $opcache[3]; }
|
||||
|
||||
$name='zend opcache'; $functions=get_extension_funcs($name);
|
||||
if (!$functions) { $name='zend optimizer+'; $functions=get_extension_funcs($name); }
|
||||
if ($functions) { echo '<h2 id="functions">functions</h2>'; print_table($functions); } else { $name=''; }
|
||||
|
||||
$level=trim(CACHEPREFIX,'_').'.optimization_level';
|
||||
if (isset($configuration['directives'][$level])) {
|
||||
echo '<h2 id="optimization">optimization levels</h2>';
|
||||
$levelset=strrev(base_convert($configuration['directives'][$level], 10, 2));
|
||||
$levels=array(
|
||||
1=>'<a href="http://wikipedia.org/wiki/Common_subexpression_elimination">Constants subexpressions elimination</a> (CSE) true, false, null, etc.<br />Optimize series of ADD_STRING / ADD_CHAR<br />Convert CAST(IS_BOOL,x) into BOOL(x)<br />Convert <a href="http://www.php.net/manual/internals2.opcodes.init-fcall-by-name.php">INIT_FCALL_BY_NAME</a> + <a href="http://www.php.net/manual/internals2.opcodes.do-fcall-by-name.php">DO_FCALL_BY_NAME</a> into <a href="http://www.php.net/manual/internals2.opcodes.do-fcall.php">DO_FCALL</a>',
|
||||
2=>'Convert constant operands to expected types<br />Convert conditional <a href="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a> with constant operands<br />Optimize static <a href="http://php.net/manual/internals2.opcodes.brk.php">BRK</a> and <a href="<a href="http://php.net/manual/internals2.opcodes.cont.php">CONT</a>',
|
||||
3=>'Convert $a = $a + expr into $a += expr<br />Convert $a++ into ++$a<br />Optimize series of <a href="http://php.net/manual/internals2.opcodes.jmp.php">JMP</a>',
|
||||
4=>'PRINT and ECHO optimization (<a href="https://github.com/zend-dev/ZendOptimizerPlus/issues/73">defunct</a>)',
|
||||
5=>'Block Optimization - most expensive pass<br />Performs many different optimization patterns based on <a href="http://wikipedia.org/wiki/Control_flow_graph">control flow graph</a> (CFG)',
|
||||
9=>'Optimize <a href="http://wikipedia.org/wiki/Register_allocation">register allocation</a> (allows re-usage of temporary variables)',
|
||||
10=>'Remove NOPs'
|
||||
);
|
||||
echo '<table width="600" border="0" cellpadding="3"><tbody><tr class="h"><th>Pass</th><th>Description</th></tr>';
|
||||
foreach ($levels as $pass=>$description) {
|
||||
$disabled=substr($levelset,$pass-1,1)!=='1' || $pass==4 ? ' white':'';
|
||||
echo '<tr><td class="v center middle'.$disabled.'">'.$pass.'</td><td class="v'.$disabled.'">'.$description.'</td></tr>';
|
||||
}
|
||||
echo '</table>';
|
||||
}
|
||||
|
||||
if ( isset($_GET['DUMP']) ) {
|
||||
if ($name) { echo '<h2 id="ini">ini</h2>'; print_table(ini_get_all($name,true)); }
|
||||
foreach ($configuration as $key=>$value) { echo '<h2>',$key,'</h2>'; print_table($configuration[$key]); }
|
||||
exit;
|
||||
}
|
||||
|
||||
meta_display();
|
||||
|
||||
echo '</div></body></html>';
|
||||
|
||||
exit;
|
||||
|
||||
function time_since($time,$original,$extended=0,$text='ago') {
|
||||
$time = $time - $original;
|
||||
$day = $extended? floor($time/86400) : round($time/86400,0);
|
||||
$amount=0; $unit='';
|
||||
if ( $time < 86400) {
|
||||
if ( $time < 60) { $amount=$time; $unit='second'; }
|
||||
elseif ( $time < 3600) { $amount=floor($time/60); $unit='minute'; }
|
||||
else { $amount=floor($time/3600); $unit='hour'; }
|
||||
}
|
||||
elseif ( $day < 14) { $amount=$day; $unit='day'; }
|
||||
elseif ( $day < 56) { $amount=floor($day/7); $unit='week'; }
|
||||
elseif ( $day < 672) { $amount=floor($day/30); $unit='month'; }
|
||||
else { $amount=intval(2*($day/365))/2; $unit='year'; }
|
||||
|
||||
if ( $amount!=1) {$unit.='s';}
|
||||
if ($extended && $time>60) { $text=' and '.time_since($time,$time<86400?($time<3600?$amount*60:$amount*3600):$day*86400,0,'').$text; }
|
||||
|
||||
return $amount.' '.$unit.' '.$text;
|
||||
}
|
||||
|
||||
function print_table($array,$headers=false) {
|
||||
if ( empty($array) || !is_array($array) ) {return;}
|
||||
echo '<table border="0" cellpadding="3" width="600">';
|
||||
if (!empty($headers)) {
|
||||
if (!is_array($headers)) {$headers=array_keys(reset($array));}
|
||||
echo '<tr class="h">';
|
||||
foreach ($headers as $value) { echo '<th>',$value,'</th>'; }
|
||||
echo '</tr>';
|
||||
}
|
||||
foreach ($array as $key=>$value) {
|
||||
echo '<tr>';
|
||||
if ( !is_numeric($key) ) {
|
||||
$key=ucwords(str_replace('_',' ',$key));
|
||||
echo '<td class="e">',$key,'</td>';
|
||||
if ( is_numeric($value) ) {
|
||||
if ( $value>1048576) { $value=round($value/1048576,1).'M'; }
|
||||
elseif ( is_float($value) ) { $value=round($value,1); }
|
||||
}
|
||||
}
|
||||
if ( is_array($value) ) {
|
||||
foreach ($value as $column) {
|
||||
echo '<td class="v">',$column,'</td>';
|
||||
}
|
||||
echo '</tr>';
|
||||
}
|
||||
else { echo '<td class="v">',$value,'</td></tr>'; }
|
||||
}
|
||||
echo '</table>';
|
||||
}
|
||||
|
||||
function files_display() {
|
||||
$status=call_user_func(CACHEPREFIX.'get_status');
|
||||
if ( empty($status['scripts']) ) {return;}
|
||||
if ( isset($_GET['DUMP']) ) { print_table($status['scripts']); exit;}
|
||||
$time=time(); $sort=0;
|
||||
$nogroup=preg_replace('/\&?GROUP\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
|
||||
$nosort=preg_replace('/\&?SORT\=[\-0-9]+/','',$_SERVER['REQUEST_URI']);
|
||||
$group=empty($_GET['GROUP'])?0:intval($_GET['GROUP']); if ( $group<0 || $group>9) { $group=1;}
|
||||
$groupset=array_fill(0,9,''); $groupset[$group]=' class="b" ';
|
||||
|
||||
echo '<div class="meta">
|
||||
<a ',$groupset[0],'href="',$nogroup,'">ungroup</a> |
|
||||
<a ',$groupset[1],'href="',$nogroup,'&GROUP=1">1</a> |
|
||||
<a ',$groupset[2],'href="',$nogroup,'&GROUP=2">2</a> |
|
||||
<a ',$groupset[3],'href="',$nogroup,'&GROUP=3">3</a> |
|
||||
<a ',$groupset[4],'href="',$nogroup,'&GROUP=4">4</a> |
|
||||
<a ',$groupset[5],'href="',$nogroup,'&GROUP=5">5</a>
|
||||
</div>';
|
||||
|
||||
if ( !$group ) { $files =& $status['scripts']; }
|
||||
else {
|
||||
$files=array();
|
||||
foreach ($status['scripts'] as $data) {
|
||||
if ( preg_match('@^[/]([^/]+[/]){'.$group.'}@',$data['full_path'],$path) ) {
|
||||
if ( empty($files[$path[0]])) { $files[$path[0]]=array('full_path'=>'','files'=>0,'hits'=>0,'memory_consumption'=>0,'last_used_timestamp'=>'','timestamp'=>''); }
|
||||
$files[$path[0]]['full_path']=$path[0];
|
||||
$files[$path[0]]['files']++;
|
||||
$files[$path[0]]['memory_consumption']+=$data['memory_consumption'];
|
||||
$files[$path[0]]['hits']+=$data['hits'];
|
||||
if ( $data['last_used_timestamp']>$files[$path[0]]['last_used_timestamp']) {$files[$path[0]]['last_used_timestamp']=$data['last_used_timestamp'];}
|
||||
if ( $data['timestamp']>$files[$path[0]]['timestamp']) {$files[$path[0]]['timestamp']=$data['timestamp'];}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !empty($_GET['SORT']) ) {
|
||||
$keys=array(
|
||||
'full_path'=>SORT_STRING,
|
||||
'files'=>SORT_NUMERIC,
|
||||
'memory_consumption'=>SORT_NUMERIC,
|
||||
'hits'=>SORT_NUMERIC,
|
||||
'last_used_timestamp'=>SORT_NUMERIC,
|
||||
'timestamp'=>SORT_NUMERIC
|
||||
);
|
||||
$titles=array('','path',$group?'files':'','size','hits','last used','created');
|
||||
$offsets=array_keys($keys);
|
||||
$key=intval($_GET['SORT']);
|
||||
$direction=$key>0?1:-1;
|
||||
$key=abs($key)-1;
|
||||
$key=isset($offsets[$key])&&!($key==1&&empty($group))?$offsets[$key]:reset($offsets);
|
||||
$sort=array_search($key,$offsets)+1;
|
||||
$sortflip=range(0,7); $sortflip[$sort]=-$direction*$sort;
|
||||
if ( $keys[$key]==SORT_STRING) {$direction=-$direction; }
|
||||
$arrow=array_fill(0,7,''); $arrow[$sort]=$direction>0?' ▼':' ▲';
|
||||
$direction=$direction>0?SORT_DESC:SORT_ASC;
|
||||
$column=array(); foreach ($files as $data) { $column[]=$data[$key]; }
|
||||
array_multisort($column, $keys[$key], $direction, $files);
|
||||
}
|
||||
|
||||
echo '<table border="0" cellpadding="3" width="960" id="files">
|
||||
<tr class="h">';
|
||||
foreach ($titles as $column=>$title) {
|
||||
if ($title) echo '<th><a href="',$nosort,'&SORT=',$sortflip[$column],'">',$title,$arrow[$column],'</a></th>';
|
||||
}
|
||||
echo ' </tr>';
|
||||
foreach ($files as $data) {
|
||||
echo '<tr>
|
||||
<td class="v" nowrap><a title="recheck" href="?RECHECK=',rawurlencode($data['full_path']),'">x</a>',$data['full_path'],'</td>',
|
||||
($group?'<td class="vr">'.number_format($data['files']).'</td>':''),
|
||||
'<td class="vr">',number_format(round($data['memory_consumption']/1024)),'K</td>',
|
||||
'<td class="vr">',number_format($data['hits']),'</td>',
|
||||
'<td class="vr">',time_since($time,$data['last_used_timestamp']),'</td>',
|
||||
'<td class="vr">',empty($data['timestamp'])?'':time_since($time,$data['timestamp']),'</td>
|
||||
</tr>';
|
||||
}
|
||||
echo '</table>';
|
||||
}
|
||||
|
||||
function graphs_display() {
|
||||
$graphs=array();
|
||||
$colors=array('green','brown','red');
|
||||
$primes=array(223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987);
|
||||
$configuration=call_user_func(CACHEPREFIX.'get_configuration');
|
||||
$status=call_user_func(CACHEPREFIX.'get_status');
|
||||
|
||||
$graphs['memory']['total']=$configuration['directives']['opcache.memory_consumption'];
|
||||
$graphs['memory']['free']=$status['memory_usage']['free_memory'];
|
||||
$graphs['memory']['used']=$status['memory_usage']['used_memory'];
|
||||
$graphs['memory']['wasted']=$status['memory_usage']['wasted_memory'];
|
||||
|
||||
$graphs['keys']['total']=$status[CACHEPREFIX.'statistics']['max_cached_keys'];
|
||||
foreach ($primes as $prime) { if ($prime>=$graphs['keys']['total']) { $graphs['keys']['total']=$prime; break;} }
|
||||
$graphs['keys']['free']=$graphs['keys']['total']-$status[CACHEPREFIX.'statistics']['num_cached_keys'];
|
||||
$graphs['keys']['scripts']=$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
|
||||
$graphs['keys']['wasted']=$status[CACHEPREFIX.'statistics']['num_cached_keys']-$status[CACHEPREFIX.'statistics']['num_cached_scripts'];
|
||||
|
||||
$graphs['hits']['total']=0;
|
||||
$graphs['hits']['hits']=$status[CACHEPREFIX.'statistics']['hits'];
|
||||
$graphs['hits']['misses']=$status[CACHEPREFIX.'statistics']['misses'];
|
||||
$graphs['hits']['blacklist']=$status[CACHEPREFIX.'statistics']['blacklist_misses'];
|
||||
$graphs['hits']['total']=array_sum($graphs['hits']);
|
||||
|
||||
$graphs['restarts']['total']=0;
|
||||
$graphs['restarts']['manual']=$status[CACHEPREFIX.'statistics']['manual_restarts'];
|
||||
$graphs['restarts']['keys']=$status[CACHEPREFIX.'statistics']['hash_restarts'];
|
||||
$graphs['restarts']['memory']=$status[CACHEPREFIX.'statistics']['oom_restarts'];
|
||||
$graphs['restarts']['total']=array_sum($graphs['restarts']);
|
||||
|
||||
foreach ( $graphs as $caption=>$graph) {
|
||||
echo '<div class="graph"><div class="h">',$caption,'</div><table border="0" cellpadding="0" cellspacing="0">';
|
||||
foreach ($graph as $label=>$value) {
|
||||
if ($label=='total') { $key=0; $total=$value; $totaldisplay='<td rowspan="3" class="total"><span>'.($total>999999?round($total/1024/1024).'M':($total>9999?round($total/1024).'K':$total)).'</span><div></div></td>'; continue;}
|
||||
$percent=$total?floor($value*100/$total):''; $percent=!$percent||$percent>99?'':$percent.'%';
|
||||
echo '<tr>',$totaldisplay,'<td class="actual">', ($value>999999?round($value/1024/1024).'M':($value>9999?round($value/1024).'K':$value)),'</td><td class="bar ',$colors[$key],'" height="',$percent,'">',$percent,'</td><td>',$label,'</td></tr>';
|
||||
$key++; $totaldisplay='';
|
||||
}
|
||||
echo '</table></div>',"\n";
|
||||
}
|
||||
}
|
||||
|
||||
function meta_display() {
|
||||
?>
|
||||
<div class="meta">
|
||||
<a href="http://files.zend.com/help/Zend-Server-6/content/zendoptimizerplus.html">directives guide</a> |
|
||||
<a href="http://files.zend.com/help/Zend-Server-6/content/zend_optimizer+_-_php_api.htm">functions guide</a> |
|
||||
<a href="https://wiki.php.net/rfc/optimizerplus">wiki.php.net</a> |
|
||||
<a href="http://pecl.php.net/package/ZendOpcache">pecl</a> |
|
||||
<a href="https://github.com/zend-dev/ZendOptimizerPlus/">Zend source</a> |
|
||||
<a href="https://gist.github.com/ck-on/4959032/?ocp.php">OCP latest</a>
|
||||
</div>
|
||||
<?php
|
||||
}
|
@ -112,6 +112,10 @@ class Html
|
||||
array(
|
||||
'name' => 'Opcache GUI',
|
||||
'path' => '/opcache.php'
|
||||
),
|
||||
array(
|
||||
'name' => 'Opcache Control Panel',
|
||||
'path' => '/vendor/ocp.php'
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -82,7 +82,7 @@ class Php extends BaseClass implements BaseInterface
|
||||
}
|
||||
public function getSymfonyVersion()
|
||||
{
|
||||
$output = loadClass('Helper')->exec('symfony --version 2>/dev/null', $output);
|
||||
$output = loadClass('Helper')->exec('symfony -V 2>/dev/null | tr -d "[:cntrl:]" | sed "s/\[[0-9]*m//g"', $output);
|
||||
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
|
||||
}
|
||||
public function getWpcliVersion()
|
||||
|
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
github: [cytopia]
|
||||
patreon: devilbox
|
7
.github/workflows/ci-smoke-linux.yml
vendored
7
.github/workflows/ci-smoke-linux.yml
vendored
@ -195,6 +195,13 @@ jobs:
|
||||
make test-smoke-framework-wordpress
|
||||
if: success() || failure()
|
||||
|
||||
- name: "Test Container"
|
||||
shell: bash
|
||||
run: |
|
||||
cd .tests/
|
||||
make test-smoke-container
|
||||
if: success() || failure()
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Finish
|
||||
# ------------------------------------------------------------
|
||||
|
7
.github/workflows/test-config.yml
vendored
7
.github/workflows/test-config.yml
vendored
@ -209,6 +209,13 @@ jobs:
|
||||
make test-smoke-framework-wordpress
|
||||
if: success() || failure()
|
||||
|
||||
- name: "Test Container"
|
||||
shell: bash
|
||||
run: |
|
||||
cd .tests/
|
||||
make test-smoke-container
|
||||
if: success() || failure()
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Finish
|
||||
# ------------------------------------------------------------
|
||||
|
7
.github/workflows/test-versions.yml
vendored
7
.github/workflows/test-versions.yml
vendored
@ -266,6 +266,13 @@ jobs:
|
||||
make test-smoke-framework-wordpress
|
||||
if: success() || failure()
|
||||
|
||||
- name: "Test Container"
|
||||
shell: bash
|
||||
run: |
|
||||
cd .tests/
|
||||
make test-smoke-container
|
||||
if: success() || failure()
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Finish
|
||||
# ------------------------------------------------------------
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -202,3 +202,6 @@ $RECYCLE.BIN/
|
||||
###### BBEdit ######
|
||||
*.bbprojectd
|
||||
*.bbproject
|
||||
|
||||
###### VS Code ######
|
||||
/.vscode
|
@ -57,6 +57,13 @@ start: ../.env
|
||||
@$(PWD)/scripts/compose-start.sh
|
||||
|
||||
|
||||
###
|
||||
### Stop Devilbox
|
||||
###
|
||||
stop:
|
||||
@$(PWD)/scripts/compose-stop.sh
|
||||
|
||||
|
||||
###
|
||||
### Show Docker logs
|
||||
###
|
||||
@ -107,6 +114,7 @@ test-smoke-vendors:
|
||||
$(PWD)/tests/vendor-phpmyadmin.sh
|
||||
$(PWD)/tests/vendor-phppgadmin.sh
|
||||
$(PWD)/tests/vendor-phpredmin.sh
|
||||
$(PWD)/tests/vendor-ocp.sh
|
||||
|
||||
|
||||
###
|
||||
@ -160,6 +168,13 @@ test-smoke-framework-wordpress:
|
||||
$(PWD)/tests/framework-wordpress.sh
|
||||
|
||||
|
||||
###
|
||||
### Container
|
||||
###
|
||||
test-smoke-container:
|
||||
$(PWD)/tests/container-mysql.sh
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Helper Targets
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
103
.tests/tests/container-mysql.sh
Executable file
103
.tests/tests/container-mysql.sh
Executable file
@ -0,0 +1,103 @@
|
||||
#!/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}/../scripts/.lib.sh"
|
||||
|
||||
RETRIES=10
|
||||
DISABLED_VERSIONS=("")
|
||||
|
||||
|
||||
echo
|
||||
echo "# --------------------------------------------------------------------------------------------------"
|
||||
echo "# [Container] MySQL"
|
||||
echo "# --------------------------------------------------------------------------------------------------"
|
||||
echo
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Pre-check
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
PHP_VERSION="$( get_php_version "${DVLBOX_PATH}" )"
|
||||
if [[ ${DISABLED_VERSIONS[*]} =~ ${PHP_VERSION} ]]; then
|
||||
printf "[SKIP] Skipping all checks for PHP %s\\n" "${PHP_VERSION}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# ENTRYPOINT
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
###
|
||||
### Get required env values
|
||||
###
|
||||
MYSQL_ROOT_PASSWORD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "MYSQL_ROOT_PASSWORD" )"
|
||||
|
||||
DB_NAME="my_db"
|
||||
TBL_NAME="my_table"
|
||||
|
||||
ROWS=2000 # how many insert statements
|
||||
GROUPED=1000 # how many grouped inserts: INSERT INTO tbl VALUES ('1') ('2') ('3');
|
||||
DATALEN=200 # Length of the data per value
|
||||
|
||||
|
||||
# Install pipe viewer
|
||||
run "docker-compose exec --user root -T php bash -c 'apt update && apt install -y pv'" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
|
||||
# Drop database
|
||||
run "docker-compose exec --user devilbox -T php bash -c 'mysql --host=mysql --user=root --password='\\''${MYSQL_ROOT_PASSWORD}'\\'' -e '\\''DROP DATABASE IF EXISTS ${DB_NAME};'\\'''" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
|
||||
# Delete mysql.sql file
|
||||
run "docker-compose exec --user devilbox -T php bash -c 'rm -f /home/devilbox/mysql.sql'" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
|
||||
# Create SQL File
|
||||
run "docker-compose exec --user devilbox -T php bash -c '
|
||||
(
|
||||
echo \"CREATE DATABASE ${DB_NAME} COLLATE '\\''utf8mb4_bin'\\'';\";
|
||||
echo \"USE ${DB_NAME};\";
|
||||
echo \"CREATE TABLE ${TBL_NAME} (
|
||||
id int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
dt varchar(256) COLLATE '\\''utf8mb4_bin'\\'' NOT NULL
|
||||
);\";
|
||||
|
||||
>&2 printf \"Creating random mysql.sql file: \";
|
||||
|
||||
for i in \$(seq ${ROWS}); do
|
||||
|
||||
MY_VAL=\$(openssl rand -hex ${DATALEN});
|
||||
MY_VAL=\${MY_VAL:$((DATALEN-1))};
|
||||
|
||||
echo \"INSERT INTO ${TBL_NAME} (dt) VALUES\";
|
||||
for num in \$( seq $((GROUPED-1)) ); do
|
||||
echo \" ('\\''\${i}-\${num} \${MY_VAL}'\\''), \";
|
||||
done
|
||||
echo \" ('\\''\${i}-\${GROUPED} \${MY_VAL}'\\''); \";
|
||||
>&2 printf \".\";
|
||||
done;
|
||||
) > /home/devilbox/mysql.sql
|
||||
'" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
printf "\\n"
|
||||
run "docker-compose exec --user devilbox -T php bash -c 'ls -lap /home/devilbox/mysql.sql'" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
|
||||
# Import SQL file
|
||||
run "docker-compose exec --user devilbox -T php bash -c 'pv -f -i 1 -p -t -e /home/devilbox/mysql.sql | mysql --host=mysql --user=root --password='\\''${MYSQL_ROOT_PASSWORD}'\\'''" "${RETRIES}" "${DVLBOX_PATH}"
|
||||
|
||||
# Compare inserted rows
|
||||
COUNT="$( run "docker-compose exec --user devilbox -T php bash -c 'mysql --host=mysql --user=root --password='\\''${MYSQL_ROOT_PASSWORD}'\\'' -e '\\''SELECT COUNT(*) AS cnt FROM ${DB_NAME}.${TBL_NAME};'\\''' | grep -Ei '[0-9]+'" "1" "${DVLBOX_PATH}" )"
|
||||
COUNT="$( echo "${COUNT}" | grep -Eo '[0-9]+' )"
|
||||
|
||||
if [ "${COUNT}" -ne "$(( ROWS * GROUPED ))" ]; then
|
||||
>&2 echo "Error, Expected rows $(( ROWS * GROUPED )), found rows: ${COUNT}"
|
||||
exit 1
|
||||
fi
|
||||
echo "Success, Expected rows $(( ROWS * GROUPED )), found rows: ${COUNT}"
|
81
.tests/tests/vendor-ocp.sh
Executable file
81
.tests/tests/vendor-ocp.sh
Executable file
@ -0,0 +1,81 @@
|
||||
#!/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}/../scripts/.lib.sh"
|
||||
|
||||
RETRIES=10
|
||||
DISABLED_VERSIONS=("")
|
||||
|
||||
|
||||
echo
|
||||
echo "# --------------------------------------------------------------------------------------------------"
|
||||
echo "# [Vendor] Opcache Control Panel"
|
||||
echo "# --------------------------------------------------------------------------------------------------"
|
||||
echo
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Pre-check
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
PHP_VERSION="$( get_php_version "${DVLBOX_PATH}" )"
|
||||
if [[ ${DISABLED_VERSIONS[*]} =~ ${PHP_VERSION} ]]; then
|
||||
printf "[SKIP] Skipping all checks for PHP %s\\n" "${PHP_VERSION}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# ENTRYPOINT
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
###
|
||||
### Get required env values
|
||||
###
|
||||
HOST_PORT_HTTPD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HOST_PORT_HTTPD" )"
|
||||
|
||||
|
||||
###
|
||||
### Ensure Opcache Control Panel works
|
||||
###
|
||||
URL="/vendor/ocp.php"
|
||||
printf "[TEST] Fetch %s" "${URL}"
|
||||
if [ "$( run "\
|
||||
curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}${URL}' \
|
||||
| tac \
|
||||
| tac \
|
||||
| grep -Ec 'Used Memory'" \
|
||||
"${RETRIES}" "" "0" )" != "1" ]; then
|
||||
printf "\\r[FAIL] Fetch %s\\n" "${URL}"
|
||||
run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}${URL}' || true"
|
||||
run "curl -sS -I 'http://localhost:${HOST_PORT_HTTPD}${URL}' || true"
|
||||
exit 1
|
||||
else
|
||||
printf "\\r[OK] Fetch %s\\n" "${URL}"
|
||||
fi
|
||||
|
||||
|
||||
URL="/vendor/ocp.php?FILES=1&GROUP=2&SORT=3"
|
||||
printf "[TEST] Fetch %s" "${URL}"
|
||||
if [ "$( run "\
|
||||
curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}${URL}' \
|
||||
| tac \
|
||||
| tac \
|
||||
| grep -Ec 'files cached'" \
|
||||
"${RETRIES}" "" "0" )" != "1" ]; then
|
||||
printf "\\r[FAIL] Fetch %s\\n" "${URL}"
|
||||
run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}${URL}' || true"
|
||||
run "curl -sS -I 'http://localhost:${HOST_PORT_HTTPD}${URL}' || true"
|
||||
exit 1
|
||||
else
|
||||
printf "\\r[OK] Fetch %s\\n" "${URL}"
|
||||
fi
|
@ -365,5 +365,6 @@ script:
|
||||
retry make test-smoke-autostart &&
|
||||
retry make test-smoke-framework-cakephp &&
|
||||
retry make test-smoke-framework-drupal &&
|
||||
retry make test-smoke-framework-wordpress;
|
||||
retry make test-smoke-framework-wordpress &&
|
||||
retry make test-smoke-container;
|
||||
fi
|
||||
|
49
CHANGELOG.md
49
CHANGELOG.md
@ -7,6 +7,55 @@ major versions.
|
||||
## Unreleased
|
||||
|
||||
|
||||
## Release v1.7.0 (2020-03-24)
|
||||
|
||||
#### Added
|
||||
- Python Flask
|
||||
|
||||
|
||||
## Bugfix Release v1.6.3 (2020-03-23)
|
||||
|
||||
#### Fixed
|
||||
- Fixed PHP FPM images
|
||||
- Fixed cert-gen for HAProxy
|
||||
- Various spelling errors in documentation
|
||||
- PostgreSQL startup without a password
|
||||
#### Added
|
||||
- [#686](https://github.com/cytopia/devilbox/pull/686) Added documentation for ExpressEngine
|
||||
- New .env var: `PGSQL_HOST_AUTH_METHOD`
|
||||
|
||||
|
||||
## Bugfix Release v1.6.2 (2020-02-06)
|
||||
|
||||
#### Added
|
||||
- [#670](https://github.com/cytopia/devilbox/issues/670) Add `phalcon` binary to PHP 7.3 and 7.4
|
||||
- [#664](https://github.com/cytopia/devilbox/issues/664) Add PHP `yaml` extension
|
||||
|
||||
|
||||
## Bugfix Release v1.6.1 (2020-01-05)
|
||||
|
||||
#### Fixed
|
||||
- [#662](https://github.com/cytopia/devilbox/issues/662) Update to latest Symfony CLI
|
||||
|
||||
|
||||
## Release v1.6.0 (2020-01-04)
|
||||
|
||||
#### Changed
|
||||
- [#642](https://github.com/cytopia/devilbox/issues/642) Make email catch-all configurable
|
||||
- [#265](https://github.com/cytopia/devilbox/issues/265) Make SSL vhost settings configurable
|
||||
|
||||
#### Added
|
||||
- [#615](https://github.com/cytopia/devilbox/issues/615) Add phpmd
|
||||
- [#378](https://github.com/cytopia/devilbox/issues/378) Allow to mount local `.ssh/` directory into PHP container (read-only)
|
||||
|
||||
|
||||
## Release v1.5.0 (2020-01-03)
|
||||
|
||||
#### Added
|
||||
- [#654](https://github.com/cytopia/devilbox/issues/654) Added Opcache Control Panel
|
||||
- Integration tests for MySQL Docker image
|
||||
|
||||
|
||||
## Release v1.4.0 (2020-01-02)
|
||||
|
||||
#### Fixed
|
||||
|
@ -4,7 +4,7 @@
|
||||
**Abstract**
|
||||
|
||||
The Devilbox is currently being developed in my spare time and mostly reflects the features that I
|
||||
am using for all the web projcets I have to handle. In order to better present it to the majority
|
||||
am using for all the web projects I have to handle. In order to better present it to the majority
|
||||
of other software developers I do require support to cope with all the feature requests.
|
||||
|
||||
|
||||
|
40
README.md
40
README.md
@ -16,15 +16,14 @@
|
||||
|
||||

|
||||
|
||||
[](https://travis-ci.org/cytopia/devilbox)
|
||||
[](https://devilbox.readthedocs.io)
|
||||
[](https://github.com/cytopia/devilbox/releases)
|
||||
[](https://github.com/cytopia/devilbox/releases)
|
||||
[](https://gitter.im/devilbox/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
[](https://devilbox.discourse.group)
|
||||
[](https://www.docker.com/)
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
|
||||
[](https://travis-ci.org/cytopia/devilbox)
|
||||
[](https://devilbox.readthedocs.io)
|
||||
[](https://github.com/cytopia/devilbox/actions?workflow=Lint)
|
||||
[](https://github.com/cytopia/devilbox/actions?workflow=Docs)
|
||||
[](https://github.com/cytopia/devilbox/actions?workflow=Linux)
|
||||
@ -92,12 +91,12 @@ Only the webserver and PHP container are mandatory, all others are optional and
|
||||
|
||||
Each of them is also available in multiple different versions in order to reflect your exact desired environment.
|
||||
|
||||
| Accel | Frontend | SQL | NoSQL | Queue | Search | ELK | Utils |
|
||||
|---------|------------|------------|-----------|----------|--------|---------------|-----------|
|
||||
| HAProxy | Apache | MariaDB | Memcached | RabbitMQ | Solr | ElasticSearch | Bind |
|
||||
| Varnish | Nginx | MySQL | MongoDB | | | Logstash | Blackfire |
|
||||
| | PHP | PerconaDB | Redis | | | Kibana | MailHog |
|
||||
| | | PostgreSQL | | | | | Ngrok |
|
||||
| Accel | Web | App | SQL | NoSQL | Queue / Search | ELK | Utils |
|
||||
|---------|------------|----------------|------------|-----------|----------------|---------------|-----------|
|
||||
| HAProxy | Apache | PHP | MariaDB | Memcached | RabbitMQ | ElasticSearch | Bind |
|
||||
| Varnish | Nginx | Python (Flask) | MySQL | MongoDB | Solr | Logstash | Blackfire |
|
||||
| | | | PerconaDB | Redis | | Kibana | MailHog |
|
||||
| | | | PostgreSQL | | | | Ngrok |
|
||||
|
||||
> **Documentation:**
|
||||
> [Available Container](https://devilbox.readthedocs.io/en/latest/readings/available-container.html)
|
||||
@ -375,6 +374,7 @@ Additionally to the default stack, there are a variety of other services that ca
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Python (Flask)</th>
|
||||
<th>Blackfire</th>
|
||||
<th>ELK</th>
|
||||
<th>MailHog</th>
|
||||
@ -387,6 +387,7 @@ Additionally to the default stack, there are a variety of other services that ca
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a target="_blank" title="Python 2.7 " href="https://github.com/devilbox/docker-python-flask">2.7</a></td>
|
||||
<td><a target="_blank" title="Blackfire 1.8" href="https://github.com/blackfireio/docker">1.8</a></td>
|
||||
<td><a target="_blank" title="ELK stack" href="https://www.docker.elastic.co">5.x.y</a></td>
|
||||
<td><a target="_blank" title="MailHog v1.0.0" href="https://github.com/mailhog/MailHog">v1.0.0</a></td>
|
||||
@ -397,6 +398,7 @@ Additionally to the default stack, there are a variety of other services that ca
|
||||
<td><a target="_blank" title="Varnish 4" href="https://github.com/devilbox/docker-varnish">4</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>...</td>
|
||||
<td>...</td>
|
||||
<td><a target="_blank" title="ELK stack" href="https://www.docker.elastic.co">6.x.y</a></td>
|
||||
<td><a target="_blank" title="MailHog latest" href="https://github.com/mailhog/MailHog">latest</a></td>
|
||||
@ -407,6 +409,7 @@ Additionally to the default stack, there are a variety of other services that ca
|
||||
<td><a target="_blank" title="Varnish 5" href="https://github.com/devilbox/docker-varnish">5</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a target="_blank" title="Python 3.7 " href="https://github.com/devilbox/docker-python-flask">3.7</a></td>
|
||||
<td><a target="_blank" title="Blackfire 1.18.0" href="https://github.com/blackfireio/docker">1.18.0</a></td>
|
||||
<td><a target="_blank" title="ELK stack" href="https://www.docker.elastic.co">7.x.y</a></td>
|
||||
<td></td>
|
||||
@ -417,6 +420,7 @@ Additionally to the default stack, there are a variety of other services that ca
|
||||
<td><a target="_blank" title="Varnish 6" href="https://github.com/devilbox/docker-varnish">6</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a target="_blank" title="Python 3.8 " href="https://github.com/devilbox/docker-python-flask">3.8</a></td>
|
||||
<td><a target="_blank" title="Blackfire latest" href="https://github.com/blackfireio/docker">latest</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
@ -651,8 +655,8 @@ The following tools will assist you on creating new projects easily as well as h
|
||||
<td><code>pm2</code> is Node.js Production Process Manager with a built-in Load Balancer.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>:wrench: <a href="https://github.com/brigade/scss-lint/">scss-lint</a></td>
|
||||
<td><code>scss-lint</code> is a css/scss linter.</td>
|
||||
<td>:wrench: <a href="https://github.com/stylelint/stylelint">stylelint</a></td>
|
||||
<td><code>stylelint</code> is a css/scss linter.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>:wrench: <a href="https://github.com/symfony/symfony-installer">symfony installer</a></td>
|
||||
@ -795,7 +799,7 @@ The Devilbox is a development stack, so it is made sure that a lot of PHP module
|
||||
| sysvshm | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 |
|
||||
| tidy | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 |
|
||||
| tokenizer | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| uploadprogress | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 |
|
||||
| uploadprogress | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | |
|
||||
| wddx | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | | |
|
||||
| xdebug | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | |
|
||||
| xml | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
@ -803,6 +807,7 @@ The Devilbox is a development stack, so it is made sure that a lot of PHP module
|
||||
| xmlrpc | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 |
|
||||
| xmlwriter | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| xsl | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 |
|
||||
| yaml | | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | |
|
||||
| Zend OPcache | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 |
|
||||
| zip | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 | 🗸 |
|
||||
| zlib | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
@ -821,7 +826,7 @@ PHP modules can be enabled or disabled on demand to reflect the state of your ta
|
||||
|
||||
You can also copy any custom modules into `mod/(php-fpm)-<VERSION>` and add a custom `*.ini` file to load them.
|
||||
|
||||
#### Supported Frameworks
|
||||
#### Supported PHP Frameworks
|
||||
|
||||
As far as tested there are no limitations and you can use any Framework or CMS just as you would on your live environment. Below are a few examples of extensively tested Frameworks and CMS:
|
||||
|
||||
@ -867,12 +872,13 @@ As far as tested there are no limitations and you can use any Framework or CMS j
|
||||
#### Supported reverse proxied applications
|
||||
|
||||
As far as tested there are no limitations and you can use any application that creates an open port.
|
||||
These ports will be reverse proxied by the web server and even allow you to use valid HTTPS for them.
|
||||
By the built-in autostart feature of the Devilbox you can ensure that your application automatically
|
||||
These ports will be reverse proxied by the web server and even allow you to use **valid HTTPS** for them.
|
||||
By the built-in **autostart feature** of the Devilbox you can ensure that your application automatically
|
||||
starts up as soon as you run `docker-compose up`.
|
||||
|
||||
<a target="_blank" title="NodeJS" href="https://nodejs.org"><img width="64" style="width:64px;" src="docs/img/logo_tools/nodejs.png" alt="Devilbox"/></a>
|
||||
<a target="_blank" title="Sphinx" href="https://www.sphinx-doc.org/en/stable/"><img width="64" style="width:64px;" src="docs/img/logo_tools/sphinx.png" alt="Devilbox"/></a>
|
||||
<a target="_blank" title="NodeJS" href="https://nodejs.org"><img width="64" style="width:64px;" src="docs/img/logo_tools/nodejs.png" alt="NodeJS"/></a>
|
||||
<a target="_blank" title="Python Flask" href="https://github.com/pallets/flask"><img width="64" style="width:64px;" src="docs/img/logo_tools/flask.png" alt="Python Flask"/></a>
|
||||
<a target="_blank" title="Sphinx" href="https://www.sphinx-doc.org/en/stable/"><img width="64" style="width:64px;" src="docs/img/logo_tools/sphinx.png" alt="Sphinx"/></a>
|
||||
|
||||
> **Documentation:**<br/>
|
||||
> [Setup reverse proxy NodeJs](https://devilbox.readthedocs.io/en/latest/examples/setup-reverse-proxy-nodejs.html) |
|
||||
|
10
UPDATING.md
10
UPDATING.md
@ -3,6 +3,16 @@
|
||||
This document will hold all information on how to update between major versions.
|
||||
|
||||
|
||||
## Update from `v1.6.2` to `v1.6.3`
|
||||
|
||||
**PR:** https://github.com/cytopia/devilbox/pull/689
|
||||
|
||||
The following affects you if you have a PostgreSQL root password set:
|
||||
|
||||
Ensure to diff `env-example` against `.env` as a new environment variable (`PGSQL_HOST_AUTH_METHOD`)
|
||||
has been introduced. A default value has been set in `docker-compose.yml` to make migration seamless.
|
||||
|
||||
|
||||
## Update from `v1.1.0` to `v1.2.0`
|
||||
|
||||
**PR:** https://github.com/cytopia/devilbox/pull/647
|
||||
|
@ -132,7 +132,7 @@ services:
|
||||
- httpd
|
||||
|
||||
haproxy:
|
||||
image: devilbox/haproxy:0.2
|
||||
image: devilbox/haproxy:0.3
|
||||
hostname: haproxy
|
||||
ports:
|
||||
- "${LOCAL_LISTEN_ADDR}${HOST_PORT_HAPROXY:-8080}:80"
|
||||
@ -208,6 +208,34 @@ services:
|
||||
depends_on:
|
||||
- elastic
|
||||
|
||||
# -----------------------------------------------------------------------------------------------
|
||||
# Python Flask
|
||||
# -----------------------------------------------------------------------------------------------
|
||||
|
||||
# You can add more than one service here if you have multiple flask projects.
|
||||
# Just duplicate the block and adjust service name, hostname and ip address.
|
||||
flask1:
|
||||
image: devilbox/python-flask:${PYTHON_VERSION:-3.8}-dev
|
||||
hostname: flask1
|
||||
ports:
|
||||
- "${LOCAL_LISTEN_ADDR}${HOST_PORT_FLASK:-3000}:${FLASK_PORT:-3000}"
|
||||
networks:
|
||||
app_net:
|
||||
ipv4_address: 172.16.238.250
|
||||
volumes:
|
||||
# Mount custom mass virtual hosting
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
environment:
|
||||
- FLASK_PROJECT=${FLASK_PROJECT}
|
||||
- FLASK_PORT=${FLASK_PORT:-3000}
|
||||
- FLASK_APP_DIR=${FLASK_APP_DIR:-htdocs}
|
||||
- FLASK_APP_FILE=${FLASK_APP_FILE:-main.py}
|
||||
- NEW_UID
|
||||
- NEW_GID
|
||||
depends_on:
|
||||
- bind
|
||||
- httpd
|
||||
|
||||
|
||||
###
|
||||
### Volumes
|
||||
|
33
compose/docker-compose.override.yml-python-flask.yml
Normal file
33
compose/docker-compose.override.yml-python-flask.yml
Normal file
@ -0,0 +1,33 @@
|
||||
# vim: set ft=yaml:
|
||||
---
|
||||
version: '2.3'
|
||||
|
||||
services:
|
||||
|
||||
# -----------------------------------------------------------------------------------------------
|
||||
# Python Flask
|
||||
# -----------------------------------------------------------------------------------------------
|
||||
|
||||
# You can add more than one service here if you have multiple flask projects.
|
||||
# Just duplicate the block and adjust service name, hostname and ip address.
|
||||
flask1:
|
||||
image: devilbox/python-flask:${PYTHON_VERSION:-3.8}-dev
|
||||
hostname: flask1
|
||||
ports:
|
||||
- "${LOCAL_LISTEN_ADDR}${HOST_PORT_FLASK:-3000}:${FLASK_PORT:-3000}"
|
||||
networks:
|
||||
app_net:
|
||||
ipv4_address: 172.16.238.250
|
||||
volumes:
|
||||
# Mount custom mass virtual hosting
|
||||
- ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}
|
||||
environment:
|
||||
- FLASK_PROJECT=${FLASK_PROJECT}
|
||||
- FLASK_PORT=${FLASK_PORT:-3000}
|
||||
- FLASK_APP_DIR=${FLASK_APP_DIR:-htdocs}
|
||||
- FLASK_APP_FILE=${FLASK_APP_FILE:-main.py}
|
||||
- NEW_UID
|
||||
- NEW_GID
|
||||
depends_on:
|
||||
- bind
|
||||
- httpd
|
@ -29,7 +29,7 @@ services:
|
||||
- httpd
|
||||
|
||||
haproxy:
|
||||
image: devilbox/haproxy:0.2
|
||||
image: devilbox/haproxy:0.3
|
||||
hostname: haproxy
|
||||
ports:
|
||||
- "${LOCAL_LISTEN_ADDR}${HOST_PORT_HAPROXY:-8080}:80"
|
||||
|
@ -95,7 +95,7 @@ services:
|
||||
# PHP
|
||||
# ------------------------------------------------------------
|
||||
php:
|
||||
image: devilbox/php-fpm:${PHP_SERVER}-work-0.98
|
||||
image: devilbox/php-fpm:${PHP_SERVER}-work-0.106
|
||||
hostname: php
|
||||
|
||||
##
|
||||
@ -135,7 +135,7 @@ services:
|
||||
##
|
||||
## Mail-catching
|
||||
##
|
||||
- ENABLE_MAIL=2
|
||||
- ENABLE_MAIL=${PHP_MAIL_CATCH_ALL:-2}
|
||||
|
||||
##
|
||||
## Enable 127.0.0.1 Port-forwarding
|
||||
@ -202,6 +202,9 @@ services:
|
||||
# Certificate Authority public key
|
||||
- ${DEVILBOX_PATH}/ca:/ca:rw${MOUNT_OPTIONS}
|
||||
|
||||
# Users SSH directory (read-only)
|
||||
- ${HOST_PATH_SSH_DIR}:/home/devilbox/.ssh:ro${MOUNT_OPTIONS}
|
||||
|
||||
depends_on:
|
||||
- bind
|
||||
|
||||
@ -245,7 +248,7 @@ services:
|
||||
- MAIN_VHOST_ENABLE=${DEVILBOX_UI_ENABLE}
|
||||
- MAIN_VHOST_STATUS_ENABLE=1
|
||||
- MAIN_VHOST_STATUS_ALIAS=/devilbox-httpd-status
|
||||
- MAIN_VHOST_SSL_TYPE=both
|
||||
- MAIN_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both}
|
||||
- MAIN_VHOST_SSL_GEN=1
|
||||
- MAIN_VHOST_SSL_CN=${DEVILBOX_UI_SSL_CN:-localhost}
|
||||
|
||||
@ -256,7 +259,7 @@ services:
|
||||
- MASS_VHOST_TLD=.${TLD_SUFFIX}
|
||||
- MASS_VHOST_DOCROOT=${HTTPD_DOCROOT_DIR}
|
||||
- MASS_VHOST_TPL=${HTTPD_TEMPLATE_DIR}
|
||||
- MASS_VHOST_SSL_TYPE=both
|
||||
- MASS_VHOST_SSL_TYPE=${HTTPD_VHOST_SSL_TYPE:-both}
|
||||
- MASS_VHOST_SSL_GEN=1
|
||||
|
||||
##
|
||||
@ -264,7 +267,7 @@ services:
|
||||
##
|
||||
- COMPAT=${PHP_SERVER}
|
||||
- PHP_FPM_ENABLE=1
|
||||
- PHP_FPM_SERVER_ADDR=php
|
||||
- PHP_FPM_SERVER_ADDR=172.16.238.10
|
||||
- PHP_FPM_SERVER_PORT=9000
|
||||
- PHP_FPM_TIMEOUT=${HTTPD_TIMEOUT_TO_PHP_FPM:-180}
|
||||
|
||||
@ -352,6 +355,7 @@ services:
|
||||
|
||||
- POSTGRES_USER=${PGSQL_ROOT_USER}
|
||||
- POSTGRES_PASSWORD=${PGSQL_ROOT_PASSWORD}
|
||||
- POSTGRES_HOST_AUTH_METHOD=${PGSQL_HOST_AUTH_METHOD:-trust}
|
||||
- PGDATA=/var/lib/postgresql/data/pgdata
|
||||
|
||||
ports:
|
||||
|
@ -24,13 +24,11 @@ help:
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
linkcheck2:
|
||||
ifeq ($(wildcard file1),)
|
||||
bash -c 'curl -Ss -o linkcheck https://raw.githubusercontent.com/cytopia/linkcheck/master/linkcheck 2>/dev/null'
|
||||
else
|
||||
bash -c 'curl -Ss -o linkcheck -z linkcheck https://raw.githubusercontent.com/cytopia/linkcheck/master/linkcheck 2>/dev/null'
|
||||
endif
|
||||
chmod +x linkcheck
|
||||
./linkcheck -l -k -r 60 -t 30 -e rst _includes/
|
||||
docker run \
|
||||
--rm \
|
||||
$$(tty -s && echo "-it" || echo) \
|
||||
-v $(PWD):/data \
|
||||
cytopia/linkcheck -l -k -r 60 -t 30 -e rst -c '200,204' _includes/
|
||||
|
||||
linkcheck:
|
||||
docker run \
|
||||
|
@ -28,6 +28,24 @@
|
||||
Official Drupal Documentation <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
|
||||
</a>
|
||||
|
||||
.. |ext_lnk_example_expressionengine_documentation| raw:: html
|
||||
|
||||
<a target="_blank" href="https://docs.expressionengine.com/latest/index.html">
|
||||
Official ExpressionEngine Documentation <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
|
||||
</a>
|
||||
|
||||
.. |ext_lnk_example_expressionengine_primer| raw:: html
|
||||
|
||||
<a target="_blank" href="https://docs.expressionengine.com/latest/getting-started/ten-minute-primer.html">
|
||||
10 Minute Primer <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
|
||||
</a>
|
||||
|
||||
.. |ext_lnk_example_expressionengine_instal_documentation| raw:: html
|
||||
|
||||
<a target="_blank" href="https://docs.expressionengine.com/latest/installation/installation.html">
|
||||
Official ExpressionEngine Installation Documentation <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
|
||||
</a>
|
||||
|
||||
.. |ext_lnk_example_joomla_documentation| raw:: html
|
||||
|
||||
<a target="_blank" href="https://docs.joomla.org/J3.x:Installing_Joomla">
|
||||
|
@ -183,6 +183,12 @@
|
||||
PHP Code Beautifier and Fixer <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
|
||||
</a>
|
||||
|
||||
.. |ext_lnk_tool_phpmd| raw:: html
|
||||
|
||||
<a target="_blank" href="https://phpmd.org/">
|
||||
PHP Mess Detector <img src="https://raw.githubusercontent.com/cytopia/icons/master/11x11/ext-link.png" />
|
||||
</a>
|
||||
|
||||
.. |ext_lnk_tool_phpunit| raw:: html
|
||||
|
||||
<a target="_blank" href="https://phpunit.de/">
|
||||
|
@ -21,3 +21,5 @@
|
||||
+-------------------------------------+-----------+-----------+----------------+
|
||||
| ELK: Kibana | kibana | kibana | 172.16.238.242 |
|
||||
+-------------------------------------+-----------+-----------+----------------+
|
||||
| Python Flask | flask1 | flask1 | 172.16.238.250 |
|
||||
+-------------------------------------+-----------+-----------+----------------+
|
||||
|
@ -13,11 +13,12 @@ However, each example also exists in its standalone file as shown below:
|
||||
├── docker-compose.override.yml-elk
|
||||
├── docker-compose.override.yml-mailhog
|
||||
├── docker-compose.override.yml-ngrok
|
||||
├── docker-compose.override.yml-python-flask
|
||||
├── docker-compose.override.yml-rabbitmq
|
||||
├── docker-compose.override.yml-solr
|
||||
├── docker-compose.override.yml-varnish
|
||||
└── README.md
|
||||
|
||||
0 directories, 8 files
|
||||
0 directories, 10 files
|
||||
|
||||
.. seealso:: :ref:`custom_container_enable_all_additional_container`
|
||||
|
@ -923,6 +923,23 @@ always be ``/shared/httpd/``.
|
||||
``docker-compose rm``.
|
||||
|
||||
|
||||
HOST_PATH_SSH_DIR
|
||||
-----------------
|
||||
|
||||
The path on your host OS of the ssh directory to be mounted into the
|
||||
PHP container into ``/home/devilbox/.ssh``.
|
||||
|
||||
.. note::
|
||||
The path is mounted read-only to ensure you cannot accidentally
|
||||
delete any ssh keys from inside the php container.
|
||||
|
||||
+------------------------------+----------------+----------------+
|
||||
| Name | Allowed values | Default value |
|
||||
+==============================+================+================+
|
||||
| ``HOST_PATH_SSH_DIR`` | valid path | ``~/.ssh`` |
|
||||
+------------------------------+----------------+----------------+
|
||||
|
||||
|
||||
Docker host ports
|
||||
=================
|
||||
|
||||
@ -1164,6 +1181,36 @@ Example:
|
||||
# Disable Xdebug, Imagick and Swoole
|
||||
PHP_MODULES_DISABLE=xdebug,imagick,swoole
|
||||
|
||||
PHP_MAIL_CATCH_ALL
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Postfix settings for email catch-all.
|
||||
|
||||
When set to ``0`` postfix will be disabled and not started.
|
||||
|
||||
When set to ``1`` postfix is normally started and made available. However you still need
|
||||
to configure it to your needs yourself. For that you can use the autostart scripts
|
||||
and define a couple of ``postconf -e name=value`` commands.
|
||||
|
||||
When set to ``2`` (email catch-all) postfix is started, but no mail will leave the Devilbox. It is automatically
|
||||
internally routed the the devilbox mail account and you can see each sent mail
|
||||
in the bundled intranet: https://localhost/mail.php
|
||||
|
||||
+-------------------------+--------------------------------------+---------------------------------------------------+
|
||||
| Name | Allowed values | Default value |
|
||||
+=========================+======================================+===================================================+
|
||||
| ``PHP_MAIL_CATCH_ALL`` | ``0``, ``1``, ``2`` | ``2`` |
|
||||
+-------------------------+--------------------------------------+---------------------------------------------------+
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: bash
|
||||
:caption: .env
|
||||
:emphasize-lines: 2
|
||||
|
||||
# Enable Postfix without email catch-all
|
||||
PHP_MAIL_CATCH_ALL=1
|
||||
|
||||
Custom variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
@ -1205,6 +1252,27 @@ This will then output ``development``.
|
||||
Web server
|
||||
----------
|
||||
|
||||
HTTPD_SSL_TYPE
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
SSL (HTTP/HTTPS) settings for automated vhost generation.
|
||||
|
||||
By default each project will have two vhosts (one for HTTP and one for HTTPS).
|
||||
You can control the SSL settings for your projects via the below stated values.
|
||||
|
||||
This is internally achieved via the ``-m`` argument of |ext_lnk_project_vhost_gen|
|
||||
|
||||
* ``both`` will serve HTTP and HTTPS for all projects
|
||||
* ``redir`` will always redirect HTTP to HTTPS
|
||||
* ``ssl`` will only serve HTTPS
|
||||
* ``plain`` will only serve HTTP
|
||||
|
||||
+-----------------------+-----------------------------------------+------------------+
|
||||
| Name | Allowed values | Default value |
|
||||
+=======================+=========================================+==================+
|
||||
| ``HTTPD_SSL_TYPE`` | ``both``, ``redir``, ``ssl``, ``plain`` | ``both`` |
|
||||
+-----------------------+-----------------------------------------+------------------+
|
||||
|
||||
.. _env_httpd_docroot_dir:
|
||||
|
||||
HTTPD_DOCROOT_DIR
|
||||
@ -1514,6 +1582,19 @@ connect to PostgreSQL and will not be able to display information inside the bun
|
||||
Keep this variable in sync with the actual PostgreSQL password.
|
||||
|
||||
|
||||
PGSQL_HOST_AUTH_METHOD
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This variable has been set to ``trust`` by default to allow empty PostgreSQL root user passwords.
|
||||
If you want to set a password for the root user, ensure this variable is empty.
|
||||
|
||||
+----------------------------+---------------------+---------------------+
|
||||
| Name | Allowed values | Default value |
|
||||
+============================+=====================+=====================+
|
||||
| ``PGSQL_HOST_AUTH_METHOD`` | ``trust`` or empty | ``trust`` |
|
||||
+----------------------------+---------------------+---------------------+
|
||||
|
||||
|
||||
.. _env_redis:
|
||||
|
||||
Redis
|
||||
|
@ -60,6 +60,7 @@ In order to fully customize each container, refer to their own documentation sec
|
||||
* :ref:`custom_container_enable_elk_stack`
|
||||
* :ref:`custom_container_enable_mailhog`
|
||||
* :ref:`custom_container_enable_ngrok`
|
||||
* :ref:`custom_container_enable_python_flask`
|
||||
* :ref:`custom_container_enable_rabbitmq`
|
||||
* :ref:`custom_container_enable_solr`
|
||||
* :ref:`custom_container_enable_varnish`
|
||||
|
149
docs/custom-container/enable-python-flask.rst
Normal file
149
docs/custom-container/enable-python-flask.rst
Normal file
@ -0,0 +1,149 @@
|
||||
.. include:: /_includes/all.rst
|
||||
.. include:: /_includes/snippets/__ANNOUNCEMENTS__.rst
|
||||
|
||||
.. _custom_container_enable_python_flask:
|
||||
|
||||
*********************************
|
||||
Enable and configure Python Flask
|
||||
*********************************
|
||||
|
||||
This section will guide you through getting Python Flask integrated into the Devilbox.
|
||||
|
||||
.. seealso::
|
||||
* :ref:`example_setup_reverse_proxy_python_flask`
|
||||
* :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
|
||||
|
||||
|
||||
Python Flask settings
|
||||
---------------------
|
||||
|
||||
In case of Python Flask, the file is ``compose/docker-compose.override.yml-python-flask``. 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-python-flask`` |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
| Container IP address | ``172.16.238.250`` |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
| Container host name | ``flask1`` |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
| Container name | ``flask1`` |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
| Mount points | ``data/www``` |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
| Exposed port | none |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
| Available at | Devilbox intranet via Reverse Proxy configuration |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
| Further configuration | :ref:`example_setup_reverse_proxy_python_flask` |
|
||||
+-----------------------+----------------------------------------------------------------------------------------------------------+
|
||||
|
||||
Python Flask env variables
|
||||
--------------------------
|
||||
|
||||
Additionally the following ``.env`` variables can be created for easy configuration:
|
||||
|
||||
+------------------------------+-------------------+----------------------------------------------------------------------------+
|
||||
| Variable | Default value | Description |
|
||||
+==============================+===================+============================================================================+
|
||||
| ``FLASK_PROJECT`` | none | Specifies your Python Flask project dir in data/www. |
|
||||
+------------------------------+-------------------+----------------------------------------------------------------------------+
|
||||
| ``PYTHON_VERSION`` | ``3.8`` | Specifies the Python version to use for Flask. |
|
||||
+------------------------------+-------------------+----------------------------------------------------------------------------+
|
||||
|
||||
|
||||
Instructions
|
||||
============
|
||||
|
||||
1. Copy docker-compose.override.yml
|
||||
-----------------------------------
|
||||
|
||||
Copy the Python Flask 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-python-flask 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)
|
||||
--------------------------------------
|
||||
|
||||
Python Flask 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
|
||||
|
||||
# Project directory in data/www
|
||||
FLASK_PROJECT=my-flask
|
||||
|
||||
# Python version to choose
|
||||
#PYTHON_VERSION=2.7
|
||||
#PYTHON_VERSION=3.5
|
||||
#PYTHON_VERSION=3.6
|
||||
#PYTHON_VERSION=3.7
|
||||
PYTHON_VERSION=3.8
|
||||
|
||||
.. seealso:: :ref:`env_file`
|
||||
|
||||
|
||||
3. Configure Reverse Proxy
|
||||
--------------------------
|
||||
|
||||
Before starting up the devilbox you will need to configure your python flask project and the
|
||||
reverse proxy settings.
|
||||
|
||||
.. seealso:: :ref:`example_setup_reverse_proxy_python_flask`
|
||||
|
||||
|
||||
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-flask1 docker-compose.override.yml
|
||||
|
||||
# Create .env variable
|
||||
echo "# Project directory in data/www" > .env
|
||||
echo "FLASK_PROJECT=my-flask" >> .env
|
||||
echo "# Python version to choose" >> .env
|
||||
echo "#PYTHON_VERSION=2.7" >> .env
|
||||
echo "#PYTHON_VERSION=3.5" >> .env
|
||||
echo "#PYTHON_VERSION=3.6" >> .env
|
||||
echo "#PYTHON_VERSION=3.7" >> .env
|
||||
echo "PYTHON_VERSION=3.8" >> .env
|
||||
|
||||
before starting up the devilbox you will need to configure your python flask project and the
|
||||
reverse proxy settings.
|
||||
|
||||
.. seealso:: :ref:`example_setup_reverse_proxy_python_flask`
|
@ -127,7 +127,7 @@ Add the following variables to ``.env`` and adjust them to your needs:
|
||||
.. seealso:: :ref:`env_file`
|
||||
|
||||
|
||||
4. Start the Devilbox
|
||||
3. Start the Devilbox
|
||||
---------------------
|
||||
|
||||
The final step is to start the Devilbox with RabbitMQ.
|
||||
|
@ -114,7 +114,7 @@ Add the following variables to ``.env`` and adjust them to your needs:
|
||||
.. seealso:: :ref:`env_file`
|
||||
|
||||
|
||||
4. Start the Devilbox
|
||||
3. Start the Devilbox
|
||||
---------------------
|
||||
|
||||
The final step is to start the Devilbox with Solr.
|
||||
|
205
docs/examples/setup-expressionengine.rst
Normal file
205
docs/examples/setup-expressionengine.rst
Normal file
@ -0,0 +1,205 @@
|
||||
.. include:: /_includes/all.rst
|
||||
.. include:: /_includes/snippets/__ANNOUNCEMENTS__.rst
|
||||
|
||||
.. _example_setup_expressionengine:
|
||||
|
||||
**********************
|
||||
Setup ExpressionEngine
|
||||
**********************
|
||||
|
||||
This example will use ``curl`` to install ExpressionEngine from within the Devilbox PHP container.
|
||||
|
||||
After completing the below listed steps, you will have a working ExpressionEngine setup ready to be
|
||||
served via http and https.
|
||||
|
||||
.. seealso:: |ext_lnk_example_expressionengine_documentation|
|
||||
|
||||
|
||||
**Table of Contents**
|
||||
|
||||
.. contents:: :local:
|
||||
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
The following configuration will be used:
|
||||
|
||||
+--------------+--------------------------+-------------+------------+-------------------------------------------------+
|
||||
| Project name | VirtualHost directory | Database | TLD_SUFFIX | Project URL |
|
||||
+==============+==========================+=============+============+=================================================+
|
||||
| my-ee | /shared/httpd/my-ee | my_ee | loc | http://my-ee.loc |br| https://my-ee.loc |
|
||||
+--------------+--------------------------+-------------+------------+-------------------------------------------------+
|
||||
|
||||
.. note::
|
||||
* Inside the Devilbox PHP container, projects are always in ``/shared/httpd/``.
|
||||
* On your host operating system, projects are by default in ``./data/www/`` inside the
|
||||
Devilbox git directory. This path can be changed via :ref:`env_httpd_datadir`.
|
||||
|
||||
|
||||
Walk through
|
||||
============
|
||||
|
||||
It will be ready in eight simple steps:
|
||||
|
||||
1. Enter the PHP container
|
||||
2. Create a new VirtualHost directory
|
||||
3. Download and extract ExpressionEngine
|
||||
4. Symlink webroot directory
|
||||
5. Add MySQL Database
|
||||
6. Setup DNS record
|
||||
7. Install ExpressionEngine
|
||||
8. View your site
|
||||
|
||||
|
||||
1. Enter the PHP container
|
||||
--------------------------
|
||||
|
||||
All work will be done inside the PHP container as it provides you with all required command line
|
||||
tools.
|
||||
|
||||
Navigate to the Devilbox git directory and execute ``shell.sh`` (or ``shell.bat`` on Windows) to
|
||||
enter the running PHP container.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> ./shell.sh
|
||||
|
||||
.. seealso::
|
||||
* :ref:`enter_the_php_container`
|
||||
* :ref:`work_inside_the_php_container`
|
||||
* :ref:`available_tools`
|
||||
|
||||
|
||||
2. Create new vhost directory
|
||||
-----------------------------
|
||||
|
||||
The vhost directory defines the name under which your project will be available. |br|
|
||||
( ``<vhost dir>.TLD_SUFFIX`` will be the final URL ).
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd $ mkdir my-ee
|
||||
|
||||
.. seealso:: :ref:`env_tld_suffix`
|
||||
|
||||
|
||||
3. Download and extract ExpressionEngine
|
||||
----------------------------------------
|
||||
|
||||
Navigate into your newly created vhost directory and install ExpressionEngine.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd $ cd my-ee
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-ee $ curl 'https://expressionengine.com/?ACT=243' -H 'Referer: https://expressionengine.com/' --compressed -o ee.zip
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-ee $ mkdir ee
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-ee $ unzip ee.zip -d ee
|
||||
|
||||
How does the directory structure look after installation:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-ee $ tree -L 1
|
||||
.
|
||||
├── ee
|
||||
└── ee.zip
|
||||
|
||||
1 directory, 1 file
|
||||
|
||||
|
||||
4. Symlink webroot
|
||||
------------------
|
||||
|
||||
Symlinking the actual webroot directory to ``htdocs`` is important. The web server expects every
|
||||
project's document root to be in ``<vhost dir>/htdocs/``. This is the path where it will serve
|
||||
the files. This is also the path where your frameworks entrypoint (usually ``index.php``) should
|
||||
be found.
|
||||
|
||||
Some frameworks however provide its actual content in nested directories of unknown levels.
|
||||
This would be impossible to figure out by the web server, so you manually have to symlink it back
|
||||
to its expected path.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-ee $ ln -s ee/ htdocs
|
||||
|
||||
How does the directory structure look after symlinking it:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-ee $ tree -L 1
|
||||
.
|
||||
├── ee
|
||||
├── ee.zip
|
||||
└── htdocs -> ee
|
||||
|
||||
2 directories, 1 file
|
||||
|
||||
As you can see from the above directory structure, ``htdocs`` is available in its expected
|
||||
path and points to the frameworks entrypoint.
|
||||
|
||||
.. important::
|
||||
When using **Docker Toolbox**, you need to **explicitly allow** the usage of **symlinks**.
|
||||
See below for instructions:
|
||||
|
||||
* Docker Toolbox and :ref:`howto_docker_toolbox_and_the_devilbox_windows_symlinks`
|
||||
|
||||
|
||||
5. Add MySQL Database
|
||||
---------------------
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-ee $ mysql -u root -h 127.0.0.1 -p -e 'CREATE DATABASE my_ee CHARACTER SET utf8 COLLATE utf8_unicode_ci;'
|
||||
|
||||
.. note::
|
||||
* Remember the database name you create here. It will be needed again during the installation process.
|
||||
|
||||
6. DNS record
|
||||
-------------
|
||||
If you **have** Auto DNS configured already, you can skip this section, because DNS entries will
|
||||
be available automatically by the bundled DNS server.
|
||||
|
||||
If you **don't have** Auto DNS configured, you will need to add the following line to your
|
||||
host operating systems ``/etc/hosts`` file (or ``C:\Windows\System32\drivers\etc`` on Windows):
|
||||
|
||||
.. code-block:: bash
|
||||
:caption: /etc/hosts
|
||||
|
||||
127.0.0.1 my-ee.loc
|
||||
|
||||
.. seealso::
|
||||
|
||||
* :ref:`howto_add_project_hosts_entry_on_mac`
|
||||
* :ref:`howto_add_project_hosts_entry_on_win`
|
||||
* :ref:`setup_auto_dns`
|
||||
|
||||
|
||||
7. Install ExpressionEngine
|
||||
---------------------------
|
||||
|
||||
Point your browser to http://my-ee.loc/admin.php or https://my-ee.loc/admin.php and follow the on-screen instructions to install ExpressionEngine.
|
||||
|
||||
.. important::
|
||||
Once the Installation Wizard is finished, you should rename or remove the system/ee/installer/ directory from your install directory if it was not done by the install wizard.
|
||||
|
||||
.. seealso:: |ext_lnk_example_expressionengine_instal_documentation|
|
||||
|
||||
|
||||
8. View Your Site
|
||||
-----------------
|
||||
|
||||
All set now, you can visit your site's homepage by opening http://my-ee.loc or https://my-ee.loc in your browser.
|
||||
|
||||
Your control panel will also be available by opening http://my-ee.loc/admin.php or https://my-ee.loc/admin.php in your browser.
|
||||
|
||||
.. note::
|
||||
* If you chose not to install the default theme, your site’s homepage will appear blank because no templates or content has been created yet.
|
||||
* If you’re new to ExpressionEngine, get started with the |ext_lnk_example_expressionengine_primer|
|
||||
|
||||
|
||||
Next steps
|
||||
==========
|
||||
|
||||
.. include:: /_includes/snippets/examples/next-steps.rst
|
449
docs/examples/setup-reverse-proxy-python-flask.rst
Normal file
449
docs/examples/setup-reverse-proxy-python-flask.rst
Normal file
@ -0,0 +1,449 @@
|
||||
.. include:: /_includes/all.rst
|
||||
.. include:: /_includes/snippets/__ANNOUNCEMENTS__.rst
|
||||
|
||||
.. _example_setup_reverse_proxy_python_flask:
|
||||
|
||||
********************************
|
||||
Setup reverse proxy Python Flask
|
||||
********************************
|
||||
|
||||
This example will walk you through adding a version specific Python Flask docker container,
|
||||
creating a simple Flask hello world application and have its requirements specified in
|
||||
``requirements.txt`` automatically installed. Once setup, your application will be ready via
|
||||
``docker-compose up``, proxied to the web server and can be reached via valid HTTPS.
|
||||
|
||||
|
||||
.. note::
|
||||
This example is using an additional Docker image, so you are able to specify any Python version
|
||||
you like and even be able to add multiple Docker images with different versions.
|
||||
|
||||
|
||||
**Table of Contents**
|
||||
|
||||
.. contents:: :local:
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
The following configuration will be used:
|
||||
|
||||
+--------------+--------------------------+-------------+------------+-----------------------------------------------+
|
||||
| Project name | VirtualHost directory | Database | TLD_SUFFIX | Project URL |
|
||||
+==============+==========================+=============+============+===============================================+
|
||||
| my-flask | /shared/httpd/my-flask | - | loc | http://my-flask.loc |br| https://my-flask.loc |
|
||||
+--------------+--------------------------+-------------+------------+-----------------------------------------------+
|
||||
|
||||
.. note::
|
||||
* Inside the Devilbox PHP container, projects are always in ``/shared/httpd/``.
|
||||
* On your host operating system, projects are by default in ``./data/www/`` inside the
|
||||
Devilbox git directory. This path can be changed via :ref:`env_httpd_datadir`.
|
||||
|
||||
The following Devilbox configuration is required:
|
||||
|
||||
+--------------+------------------------------------------------------------------------------------------------+
|
||||
| Service | Implications |
|
||||
+==============+================================================================================================+
|
||||
| Webserver | Reverse proxy vhost-gen template need to be applied |
|
||||
+--------------+------------------------------------------------------------------------------------------------+
|
||||
| Python Flask | Docker Compose override file must be applied. |
|
||||
+--------------+------------------------------------------------------------------------------------------------+
|
||||
| ``.env`` | ``FLASK_PROJECT`` variable must be declared and set. |
|
||||
+--------------+------------------------------------------------------------------------------------------------+
|
||||
| ``.env`` | ``PYTHON_VERSION`` variable can be declared and set. |
|
||||
+--------------+------------------------------------------------------------------------------------------------+
|
||||
|
||||
Additionally we will set the listening port of the Flask appliation to ``3000``.
|
||||
|
||||
.. seealso::
|
||||
For a detailed overview about the Compose file see: :ref:`custom_container_enable_python_flask`
|
||||
|
||||
|
||||
Walk through
|
||||
============
|
||||
|
||||
It will be ready in ten simple steps:
|
||||
|
||||
1. Configure Python Flask project name and versoin
|
||||
2. Enter the PHP container
|
||||
3. Create a new VirtualHost directory
|
||||
4. Create Flask hello world application
|
||||
5. Symlink *virtual* docroot directory
|
||||
6. Add reverse proxy vhost-gen config files
|
||||
7. Copy Python Flask compose file
|
||||
8. Setup DNS record
|
||||
9. Restart the Devilbox
|
||||
10. Visit http://my-flask.loc in your browser
|
||||
|
||||
|
||||
1. Configure Python Flask project name and version
|
||||
--------------------------------------------------
|
||||
|
||||
The Python Flask container will only serve a single project. In order for it to know where
|
||||
to find your project, you will have to add an environment variable (``FLASK_PROJECT``),
|
||||
telling it what the directory name of your project is.
|
||||
|
||||
Additionally you can define the Python version (``PYTHON_VERSION``) under which you want to run
|
||||
your Flask project.
|
||||
|
||||
.. seealso:: Available Python versions can be seen here: https://github.com/devilbox/docker-python-flask
|
||||
|
||||
Add the following variable to the very end of your ``.env`` file:
|
||||
|
||||
.. code-block:: bash
|
||||
:caption: .env
|
||||
|
||||
FLASK_PROJECT=my-flask
|
||||
|
||||
#PYTHON_VERSION=2.7
|
||||
#PYTHON_VERSION=3.5
|
||||
#PYTHON_VERSION=3.6
|
||||
#PYTHON_VERSION=3.7
|
||||
PYTHON_VERSION=3.8
|
||||
|
||||
|
||||
2. Enter the PHP container
|
||||
--------------------------
|
||||
|
||||
All work will be done inside the PHP container as it provides you with all required command line
|
||||
tools.
|
||||
|
||||
Navigate to the Devilbox git directory and execute ``shell.sh`` (or ``shell.bat`` on Windows) to
|
||||
enter the running PHP container.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> ./shell.sh
|
||||
|
||||
.. seealso::
|
||||
* :ref:`enter_the_php_container`
|
||||
* :ref:`work_inside_the_php_container`
|
||||
* :ref:`available_tools`
|
||||
|
||||
|
||||
3. Create new VirtualHost directory
|
||||
-----------------------------------
|
||||
|
||||
The vhost directory defines the name under which your project will be available. |br|
|
||||
( ``<vhost dir>.TLD_SUFFIX`` will be the final URL ).
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd $ mkdir my-flask
|
||||
|
||||
.. seealso:: :ref:`env_tld_suffix`
|
||||
|
||||
|
||||
4. Create Flask hello world application
|
||||
---------------------------------------
|
||||
|
||||
4.1 Add your code
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Navigate to your project directory
|
||||
devilbox@php-7.0.20 in /shared/httpd $ cd my-flask
|
||||
|
||||
# Create a directory which will hold the source code
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-flask $ mkdir app
|
||||
|
||||
# Create the main.py file with your favourite editor
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-flask/app $ vi main.py
|
||||
|
||||
.. code-block:: python
|
||||
:caption: main.py
|
||||
|
||||
"""Flask example application."""
|
||||
from flask import Flask
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
"""Serve the default index page."""
|
||||
return "Hello World!"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
"""Ensure Flask listens on all interfaces."""
|
||||
app.run(host='0.0.0.0')
|
||||
|
||||
4.2 Add dependencies
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
You can optionally add a ``requirements.txt`` file which will be read during startup. The Python
|
||||
Flask container will then automatically install all Python libraries specified in that file.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Navigate to your project directory
|
||||
devilbox@php-7.0.20 in /shared/httpd $ cd my-flask
|
||||
|
||||
# Create and open the file with your favourite editor
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-flask $ vi requirements.txt
|
||||
|
||||
.. code-block:: ini
|
||||
:caption: data/www/my-flask/requirements.txt
|
||||
|
||||
requests
|
||||
|
||||
|
||||
5. Symlink *virtual* docroot directory
|
||||
--------------------------------------
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Navigate to your project directory
|
||||
devilbox@php-7.0.20 in /shared/httpd $ cd my-flask
|
||||
|
||||
# Create the docroot directory
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-flask $ ln -s app htdocs
|
||||
|
||||
.. seealso:: :ref:`env_httpd_docroot_dir`
|
||||
|
||||
|
||||
6. Add reverse proxy vhost-gen config files
|
||||
-------------------------------------------
|
||||
|
||||
6.1 Create vhost-gen template directory
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Before we can copy the vhost-gen templates, we must create the ``.devilbox`` template directory
|
||||
inside the project directory.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Navigate to your project directory
|
||||
devilbox@php-7.0.20 in /shared/httpd $ cd my-flask
|
||||
|
||||
# Create the .devilbox template directory
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-flask $ mkdir .devilbox
|
||||
|
||||
|
||||
.. seealso:: :ref:`env_httpd_template_dir`
|
||||
|
||||
6.2 Copy vhost-gen templates
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Now we can copy and adjust the vhost-gen reverse proxy files for Apache 2.2, Apache 2.4 and Nginx.
|
||||
|
||||
|
||||
The reverse vhost-gen templates are available in ``cfg/vhost-gen``:
|
||||
|
||||
.. code-block:: bash
|
||||
:emphasize-lines: 4,6,8
|
||||
|
||||
host> tree -L 1 cfg/vhost-gen/
|
||||
|
||||
cfg/vhost-gen/
|
||||
├── apache22.yml-example-rproxy
|
||||
├── apache22.yml-example-vhost
|
||||
├── apache24.yml-example-rproxy
|
||||
├── apache24.yml-example-vhost
|
||||
├── nginx.yml-example-rproxy
|
||||
├── nginx.yml-example-vhost
|
||||
└── README.md
|
||||
|
||||
0 directories, 7 files
|
||||
|
||||
For this example we will copy all ``*-example-rproxy`` files into ``data/www/my-flask/.devilbox/``
|
||||
(Inside container: ``/shared/httpd/my-flask/.devilbox``) to ensure this will work with all web servers.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> cd /path/to/devilbox
|
||||
host> cp cfg/vhost-gen/apache22.yml-example-rproxy data/www/my-flask/.devilbox/apache22.yml
|
||||
host> cp cfg/vhost-gen/apache24.yml-example-rproxy data/www/my-flask/.devilbox/apache24.yml
|
||||
host> cp cfg/vhost-gen/nginx.yml-example-rproxy data/www/my-flask/.devilbox/nginx.yml
|
||||
|
||||
|
||||
6.3 Adjust ports and backend
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
By default, all vhost-gen templates will forward requests to port ``8000`` into the PHP container.
|
||||
Our current example however uses port ``3000`` and backend IP ``172.16.238.250`` (as defined
|
||||
in the Flask docker compose override file), so we must change that accordingly for all three
|
||||
templates.
|
||||
|
||||
6.3.1 Adjust Apache 2.2 template
|
||||
""""""""""""""""""""""""""""""""
|
||||
|
||||
Open the ``apache22.yml`` vhost-gen template in your project:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> cd /path/to/devilbox
|
||||
host> vi data/www/my-flask/.devilbox/apache22.yml
|
||||
|
||||
|
||||
Find the two lines with ``ProxyPass`` and ``ProxyPassReverse`` and change the port from ``8000``
|
||||
to ``3000`` as well as the backend server from ``php`` to ``172.16.238.250``.
|
||||
|
||||
.. code-block:: yaml
|
||||
:caption: data/www/my-flask/.devilbox/apache22.yml
|
||||
:emphasize-lines: 16,17
|
||||
|
||||
# ... more lines above ... #
|
||||
|
||||
###
|
||||
### Basic vHost skeleton
|
||||
###
|
||||
vhost: |
|
||||
<VirtualHost __DEFAULT_VHOST__:__PORT__>
|
||||
ServerName __VHOST_NAME__
|
||||
|
||||
CustomLog "__ACCESS_LOG__" combined
|
||||
ErrorLog "__ERROR_LOG__"
|
||||
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
ProxyRequests On
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://172.16.238.250:3000/
|
||||
ProxyPassReverse / http://172.16.238.250:3000/
|
||||
|
||||
# ... more lines below ... #
|
||||
|
||||
6.3.2 Adjust Apache 2.4 template
|
||||
""""""""""""""""""""""""""""""""
|
||||
|
||||
Open the ``apache24.yml`` vhost-gen template in your project:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> cd /path/to/devilbox
|
||||
host> vi data/www/my-flask/.devilbox/apache24.yml
|
||||
|
||||
|
||||
Find the two lines with ``ProxyPass`` and ``ProxyPassReverse`` and change the port from ``8000``
|
||||
to ``3000``
|
||||
|
||||
.. code-block:: yaml
|
||||
:caption: data/www/my-flask/.devilbox/apache24.yml
|
||||
:emphasize-lines: 16,17
|
||||
|
||||
# ... more lines above ... #
|
||||
|
||||
###
|
||||
### Basic vHost skeleton
|
||||
###
|
||||
vhost: |
|
||||
<VirtualHost __DEFAULT_VHOST__:__PORT__>
|
||||
ServerName __VHOST_NAME__
|
||||
|
||||
CustomLog "__ACCESS_LOG__" combined
|
||||
ErrorLog "__ERROR_LOG__"
|
||||
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
ProxyRequests On
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://172.16.238.250:3000/
|
||||
ProxyPassReverse / http://172.16.238.250:3000/
|
||||
|
||||
# ... more lines below ... #
|
||||
|
||||
6.3.3 Adjust Nginx template
|
||||
"""""""""""""""""""""""""""
|
||||
|
||||
Open the ``nginx.yml`` vhost-gen template in your project:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> cd /path/to/devilbox
|
||||
host> vi data/www/my-flask/.devilbox/nginx.yml
|
||||
|
||||
|
||||
Find the lines with ``proxy_pass`` and change the port from ``8000`` to ``3000``
|
||||
|
||||
.. code-block:: yaml
|
||||
:caption: data/www/my-flask/.devilbox/nginx.yml
|
||||
:emphasize-lines: 18
|
||||
|
||||
# ... more lines above ... #
|
||||
|
||||
###
|
||||
### Basic vHost skeleton
|
||||
###
|
||||
vhost: |
|
||||
server {
|
||||
listen __PORT____DEFAULT_VHOST__;
|
||||
server_name __VHOST_NAME__;
|
||||
|
||||
access_log "__ACCESS_LOG__" combined;
|
||||
error_log "__ERROR_LOG__" warn;
|
||||
|
||||
# Reverse Proxy definition (Ensure to adjust the port, currently '8000')
|
||||
location / {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_pass http://172.16.238.250:3000;
|
||||
}
|
||||
|
||||
# ... more lines below ... #
|
||||
|
||||
|
||||
7. Copy Python Flask compose file
|
||||
---------------------------------
|
||||
|
||||
Python Flask comes with its own Docker container and can be added to the Devilbox stack via
|
||||
the ``docker-compose.override.yml`` file. A fully functional template already exists in the
|
||||
``compose/`` directory. All you will have to do is copy it over.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> cd /path/to/devilbox
|
||||
host> cp compose/docker-compose.override.yml-python-flask.yml docker-compose.override.yml
|
||||
|
||||
.. seealso:: :ref:`docker_compose_override_yml`
|
||||
|
||||
|
||||
8. DNS record
|
||||
-------------
|
||||
|
||||
If you **have** Auto DNS configured already, you can skip this section, because DNS entries will
|
||||
be available automatically by the bundled DNS server.
|
||||
|
||||
If you **don't have** Auto DNS configured, you will need to add the following line to your
|
||||
host operating systems ``/etc/hosts`` file (or ``C:\Windows\System32\drivers\etc`` on Windows):
|
||||
|
||||
.. code-block:: bash
|
||||
:caption: /etc/hosts
|
||||
|
||||
127.0.0.1 my-flask.loc
|
||||
|
||||
.. seealso::
|
||||
|
||||
* :ref:`howto_add_project_hosts_entry_on_mac`
|
||||
* :ref:`howto_add_project_hosts_entry_on_win`
|
||||
* :ref:`setup_auto_dns`
|
||||
|
||||
|
||||
9. Restart the Devilbox
|
||||
-----------------------
|
||||
|
||||
Now for those changes to take affect, you will have to restart the Devilbox.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
host> cd /path/to/devilbox
|
||||
|
||||
# Stop the Devilbox
|
||||
host> docker-compose down
|
||||
host> docker-compose rm -f
|
||||
|
||||
# Start the Devilbox
|
||||
host> docker-compose up -d php httpd bind flask1
|
||||
|
||||
|
||||
10. Open your browser
|
||||
---------------------
|
||||
|
||||
All set now, you can visit http://my-flask.loc or https://my-flask.loc in your browser.
|
||||
The Python Flask application has been started up automatically and the reverse proxy will direct all
|
||||
requests to it.
|
||||
|
||||
|
||||
|
||||
Next steps
|
||||
==========
|
||||
|
||||
.. include:: /_includes/snippets/examples/next-steps.rst
|
@ -390,7 +390,7 @@ host operating systems ``/etc/hosts`` file (or ``C:\Windows\System32\drivers\etc
|
||||
.. code-block:: bash
|
||||
:caption: /etc/hosts
|
||||
|
||||
127.0.0.1 my-node.loc
|
||||
127.0.0.1 my-sphinx.loc
|
||||
|
||||
.. seealso::
|
||||
|
||||
|
@ -40,15 +40,14 @@ The following configuration will be used:
|
||||
Walk through
|
||||
============
|
||||
|
||||
It will be ready in seven simple steps:
|
||||
It will be ready in six simple steps:
|
||||
|
||||
1. Enter the PHP container
|
||||
2. Create a new VirtualHost directory
|
||||
3. Install Symfony
|
||||
4. Symlink webroot directory
|
||||
5. Enable Symfony prod (``app.php``)
|
||||
6. Setup DNS record
|
||||
7. Visit http://my-symfony.loc in your browser
|
||||
5. Setup DNS record
|
||||
6. Visit http://my-symfony.loc in your browser
|
||||
|
||||
|
||||
1. Enter the PHP container
|
||||
@ -78,7 +77,7 @@ The vhost directory defines the name under which your project will be available.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd $ mkdir my-symfony
|
||||
devilbox@php-7.2.29 in /shared/httpd $ mkdir my-symfony
|
||||
|
||||
.. seealso:: :ref:`env_tld_suffix`
|
||||
|
||||
@ -90,14 +89,14 @@ Navigate into your newly created vhost directory and install Symfony with ``symf
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd $ cd my-symfony
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-symfony $ symfony new symfony
|
||||
devilbox@php-7.2.29 in /shared/httpd $ cd my-symfony
|
||||
devilbox@php-7.2.29 in /shared/httpd/my-symfony $ symfony new symfony
|
||||
|
||||
How does the directory structure look after installation:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-symfony $ tree -L 1
|
||||
devilbox@php-7.2.29 in /shared/httpd/my-symfony $ tree -L 1
|
||||
.
|
||||
└── symfony
|
||||
|
||||
@ -118,16 +117,16 @@ to its expected path.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-symfony $ ln -s symfony/web/ htdocs
|
||||
devilbox@php-7.2.29 in /shared/httpd/my-symfony $ ln -s symfony/public/ htdocs
|
||||
|
||||
How does the directory structure look after symlinking:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-sw $ tree -L 1
|
||||
devilbox@php-7.2.29 in /shared/httpd/my-sw $ tree -L 1
|
||||
.
|
||||
├── symfony
|
||||
└── htdocs -> symfony/web
|
||||
└── htdocs -> symfony/public
|
||||
|
||||
2 directories, 0 files
|
||||
|
||||
@ -141,16 +140,7 @@ path and points to the frameworks entrypoint.
|
||||
* Docker Toolbox and :ref:`howto_docker_toolbox_and_the_devilbox_windows_symlinks`
|
||||
|
||||
|
||||
5. Enable Symfony prod (``app.php``)
|
||||
------------------------------------
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-symfony $ cd symfony/web
|
||||
devilbox@php-7.0.20 in /shared/httpd/my-symfony/symfony/web $ ln -s app.php index.php
|
||||
|
||||
|
||||
6. DNS record
|
||||
5. DNS record
|
||||
-------------
|
||||
|
||||
If you **have** Auto DNS configured already, you can skip this section, because DNS entries will
|
||||
@ -171,7 +161,7 @@ host operating systems ``/etc/hosts`` file (or ``C:\Windows\System32\drivers\etc
|
||||
* :ref:`setup_auto_dns`
|
||||
|
||||
|
||||
7. Open your browser
|
||||
6. Open your browser
|
||||
--------------------
|
||||
|
||||
Open your browser at http://my-symfony.loc or https://my-symfony.loc
|
||||
|
@ -200,6 +200,7 @@ their articles:
|
||||
* :ref:`example_setup_codeigniter`
|
||||
* :ref:`example_setup_craftcms`
|
||||
* :ref:`example_setup_drupal`
|
||||
* :ref:`example_setup_expressionengine`
|
||||
* :ref:`example_setup_joomla`
|
||||
* :ref:`example_setup_laravel`
|
||||
* :ref:`example_setup_magento`
|
||||
|
BIN
docs/img/logo_tools/flask.png
Normal file
BIN
docs/img/logo_tools/flask.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
@ -122,6 +122,7 @@ host is ready to be served with your custom domain.
|
||||
custom-container/enable-elk-stack
|
||||
custom-container/enable-mailhog
|
||||
custom-container/enable-ngrok
|
||||
custom-container/enable-python-flask
|
||||
custom-container/enable-rabbitmq
|
||||
custom-container/enable-solr
|
||||
custom-container/enable-varnish
|
||||
@ -178,6 +179,7 @@ host is ready to be served with your custom domain.
|
||||
examples/setup-contao
|
||||
examples/setup-craftcms
|
||||
examples/setup-drupal
|
||||
examples/setup-expressionengine
|
||||
examples/setup-joomla
|
||||
examples/setup-laravel
|
||||
examples/setup-magento2
|
||||
@ -199,6 +201,7 @@ host is ready to be served with your custom domain.
|
||||
|
||||
examples/setup-reverse-proxy-nodejs
|
||||
examples/setup-reverse-proxy-sphinx-docs
|
||||
examples/setup-reverse-proxy-python-flask
|
||||
|
||||
|
||||
.. toctree::
|
||||
|
@ -77,6 +77,8 @@ The PHP container is your workhorse and these are your tools:
|
||||
+----------------------+---------------------------------------+
|
||||
| ``phpcbf`` | |ext_lnk_tool_phpcbf| |
|
||||
+----------------------+---------------------------------------+
|
||||
| ``phpmd`` | |ext_lnk_tool_phpmd| |
|
||||
+----------------------+---------------------------------------+
|
||||
| ``phpunit`` | |ext_lnk_tool_phpunit| |
|
||||
+----------------------+---------------------------------------+
|
||||
| ``photon`` | |ext_lnk_tool_photon| |
|
||||
|
@ -38,7 +38,7 @@ Let's imagine you have added a custom Python Docker image to the Devilbox which
|
||||
application listening on port ``3000``.
|
||||
|
||||
* :ref:`env_TLD_SUFFIX`: ``loc``
|
||||
* Desired DNS name: ``my-pthon.loc``
|
||||
* Desired DNS name: ``my-python.loc``
|
||||
* :ref:`env_httpd_datadir` on the host: ``./data/www``
|
||||
* :ref:`env_httpd_template_dir`: ``.devilbox``
|
||||
* Listening port: ``3000``
|
||||
|
@ -180,6 +180,12 @@ Does it work with Drupal?
|
||||
Yes, see :ref:`example_setup_drupal`
|
||||
|
||||
|
||||
Does it work with ExpressionEngine?
|
||||
-----------------------------------
|
||||
|
||||
Yes, see :ref:`example_setup_expressionengine`
|
||||
|
||||
|
||||
Does it work with Joomla?
|
||||
-------------------------
|
||||
|
||||
|
72
env-example
72
env-example
@ -28,9 +28,10 @@
|
||||
### Show all executed commands in each
|
||||
### docker image during docker-compose up?
|
||||
###
|
||||
### 1: Yes
|
||||
### 0: No
|
||||
DEBUG_COMPOSE_ENTRYPOINT=1
|
||||
### 0: Quiet
|
||||
### 1: Verbose
|
||||
### 2: More verbose
|
||||
DEBUG_COMPOSE_ENTRYPOINT=2
|
||||
|
||||
|
||||
###
|
||||
@ -298,7 +299,7 @@ MYSQL_SERVER=mariadb-10.3
|
||||
###
|
||||
### 1.4 Choose PostgreSQL Server Image
|
||||
###
|
||||
### IMPORTANT: Apline based images might cause issues on Docker Toolbox or OSX
|
||||
### IMPORTANT: Alpine based images might cause issues on Docker Toolbox or OSX
|
||||
### https://github.com/docker/toolbox/issues/510
|
||||
###
|
||||
#PGSQL_SERVER=9.0
|
||||
@ -360,7 +361,7 @@ PGSQL_SERVER=12.1
|
||||
###
|
||||
### 1.5 Choose Redis Server Image
|
||||
###
|
||||
### IMPORTANT: Apline based images might cause issues on Docker Toolbox or OSX
|
||||
### IMPORTANT: Alpine based images might cause issues on Docker Toolbox or OSX
|
||||
### https://github.com/docker/toolbox/issues/510
|
||||
###
|
||||
#REDIS_SERVER=2.8
|
||||
@ -379,7 +380,7 @@ REDIS_SERVER=5.0
|
||||
###
|
||||
### 1.6 Choose Memcached Server Image
|
||||
###
|
||||
### IMPORTANT: Apline based images might cause issues on Docker Toolbox or OSX
|
||||
### IMPORTANT: Alpine based images might cause issues on Docker Toolbox or OSX
|
||||
### https://github.com/docker/toolbox/issues/510
|
||||
###
|
||||
#MEMCD_SERVER=1.4
|
||||
@ -418,7 +419,7 @@ MONGO_SERVER=4.2
|
||||
### existing mount options.
|
||||
###
|
||||
### Note: If no mount options are specified, leave this variable empty
|
||||
### and do not add a leading ',' (comman).
|
||||
### and do not add a leading ',' (comma).
|
||||
###
|
||||
### MOUNT_OPTIONS=,cached
|
||||
### MOUNT_OPTIONS=
|
||||
@ -441,6 +442,16 @@ MOUNT_OPTIONS=
|
||||
HOST_PATH_HTTPD_DATADIR=./data/www
|
||||
|
||||
|
||||
###
|
||||
### The path on your host OS of the ssh directory to be mounted into the
|
||||
### PHP container into /home/devilbox/.ssh.
|
||||
###
|
||||
### IMPORTANT: The path is mounted read-only to ensure you cannot accidentally
|
||||
## delete anything inside the php container.
|
||||
###
|
||||
HOST_PATH_SSH_DIR=~/.ssh
|
||||
|
||||
|
||||
|
||||
################################################################################
|
||||
###
|
||||
@ -470,6 +481,25 @@ PHP_MODULES_ENABLE=
|
||||
PHP_MODULES_DISABLE=oci8,PDO_OCI,pdo_sqlsrv,sqlsrv,rdkafka,swoole
|
||||
|
||||
|
||||
###
|
||||
### Postfix settings for email catch-all
|
||||
###
|
||||
### When set to '1' postfix is normally started and made available. However you still need
|
||||
### to configure it to your needs yourself. For that you can use the autostart scripts
|
||||
### and define a couple of 'postconf -e name=value' commands.
|
||||
###
|
||||
### When set to '2' (email catch-all), no mail will leave the Devilbox. It is automatically
|
||||
### internally routed the the devilbox mail account and you can see each sent mail
|
||||
### in the bundled intranet: https://localhost/mail.php
|
||||
###
|
||||
### Values:
|
||||
### 0: Disable postfix (do not start it)
|
||||
### 1: Enable/Start postfix
|
||||
### 2: Enable/Start postfix and enable email catch-all
|
||||
###
|
||||
PHP_MAIL_CATCH_ALL=2
|
||||
|
||||
|
||||
###
|
||||
### Configure everything else about PHP in
|
||||
### * cfg/php-ini-X.X/*.ini
|
||||
@ -490,6 +520,23 @@ HOST_PORT_HTTPD=80
|
||||
HOST_PORT_HTTPD_SSL=443
|
||||
|
||||
|
||||
###
|
||||
### SSL (HTTP/HTTPS) settings for automated vhost generation
|
||||
###
|
||||
### By default each project will have two vhosts (one for HTTP and one for HTTPS).
|
||||
### You can control the SSL settings for your projects via the below stated values.
|
||||
###
|
||||
### This is internally achieved via the '-m' argument of https://github.com/devilbox/vhost-gen
|
||||
###
|
||||
### Values:
|
||||
### * both: Serve HTTP and HTTPS for all projects
|
||||
### * redir: HTTP always redirects to HTTPS
|
||||
### * ssl: Only serve HTTPS
|
||||
### * plain: Only serve HTTP
|
||||
###
|
||||
HTTPD_VHOST_SSL_TYPE=both
|
||||
|
||||
|
||||
###
|
||||
### Document Root Subdirectory
|
||||
###
|
||||
@ -579,9 +626,18 @@ PGSQL_ROOT_USER=postgres
|
||||
###
|
||||
### PostgreSQL 'root' user password
|
||||
###
|
||||
### If you want to set a password, ensure to remove 'trust' from
|
||||
### PGSQL_HOST_AUTH_METHOD below
|
||||
###
|
||||
PGSQL_ROOT_PASSWORD=
|
||||
|
||||
|
||||
###
|
||||
### In order to not use a password for PostgreSQL, keep this value at 'trust'
|
||||
###
|
||||
PGSQL_HOST_AUTH_METHOD=trust
|
||||
|
||||
|
||||
###
|
||||
### Expose PostgreSQL Port to Host
|
||||
###
|
||||
@ -659,12 +715,14 @@ HOST_PORT_MONGO=27017
|
||||
###
|
||||
HOST_PORT_BIND=1053
|
||||
|
||||
|
||||
###
|
||||
### Add comma separated DNS server from which you want to receive DNS
|
||||
### You can also add DNS servers from your LAN (if any are available)
|
||||
###
|
||||
BIND_DNS_RESOLVER=8.8.8.8,8.8.4.4
|
||||
|
||||
|
||||
###
|
||||
### Validate DNSSEC
|
||||
###
|
||||
|
Reference in New Issue
Block a user