Skip to content

Commit 6abcbf9

Browse files
author
Gareth Midwood
committed
PHP container now mounts apache config dir volume
1 parent 474d00b commit 6abcbf9

5 files changed

Lines changed: 239 additions & 15 deletions

File tree

cdev.services.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
<argument type="service" id="symfony.filesystem" />
1818
</service>
1919

20-
<service id="cdev.docker_container_php"
21-
class="Cdev\Docker\Environment\Command\Container\Php">
20+
<service id="cdev.docker_container_php" class="Cdev\Docker\Environment\Command\Container\Php">
21+
<argument type="service" id="symfony.filesystem" />
2222
</service>
2323

2424
<service id="cdev.docker_container_mailcatcher"

src/Environment/Command/Container/Php.php

Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ class Php extends Container
1212
[
1313
'active' => true,
1414
'container_name' => 'project_php',
15-
'relative_webroot_dir' => '',
15+
'config-only' => [
16+
'relative_webroot_dir' => ''
17+
],
1618
'ports' => [
1719
'80:80'
1820
],
@@ -52,6 +54,13 @@ class Php extends Container
5254
]
5355
];
5456

57+
public function __construct(Filesystem $fs)
58+
{
59+
$this->_fs = $fs;
60+
61+
parent::__construct();
62+
}
63+
5564
protected function askQuestions()
5665
{
5766
$path = $this->_input->getOption('path');
@@ -90,9 +99,14 @@ protected function askQuestions()
9099

91100
$this->_config['environment']['VIRTUAL_HOST'] = '.' . $dockername . '.docker';
92101

102+
if ($volumeName) {
103+
$this->_config['volumes'] = [$volumeName . ':/var/www/html:nocopy'];
104+
} else {
105+
$this->_config['volumes'] = ['../' . $src . ':/var/www/html'];
106+
}
93107

94-
$useCustomWebroot = isset($this->_config['relative_webroot_dir'])
95-
&& strlen($this->_config['relative_webroot_dir']) > 0
108+
$useCustomWebroot = isset($this->_config['config-only']['relative_webroot_dir'])
109+
&& strlen($this->_config['config-only']['relative_webroot_dir']) > 0
96110
? true
97111
: false;
98112

@@ -104,7 +118,7 @@ protected function askQuestions()
104118
if ($useCustomWebroot) {
105119
$this->_editCustomWebroot();
106120
} else {
107-
$this->_config['relative_webroot_dir'] = '';
121+
$this->_config['config-only']['relative_webroot_dir'] = '';
108122
}
109123

110124
$editEnvironmentVariables = false;
@@ -119,12 +133,6 @@ protected function askQuestions()
119133
}
120134

121135
$this->_config['links'] = [];
122-
123-
if ($volumeName) {
124-
$this->_config['volumes'] = [$volumeName . ':/var/www/html:nocopy'];
125-
} else {
126-
$this->_config['volumes'] = ['../' . $src . ':/var/www/html'];
127-
}
128136
}
129137

130138
private function _editEnvironmentVariables()
@@ -201,11 +209,56 @@ private function _editCustomWebroot()
201209
{
202210
$this->askQuestion(
203211
'What is the webroot directory, relative to `src` directory (e.g. web)',
204-
$this->_config['relative_webroot_dir'],
212+
$this->_config['config-only']['relative_webroot_dir'],
205213
''
206214
);
215+
216+
$apacheConfigDirPath = '../config/apache';
217+
$absoluteApacheConfigDirPath = $path . '/' . $apacheConfigDirPath
218+
219+
// generate apache config file
220+
if (!$this->_fs->exists($absoluteApacheConfigDirPath)) {
221+
$this->_fs->mkdir($absoluteApacheConfigDirPath, 0740);
222+
}
223+
224+
$this->_copyApacheTemplateFiles(
225+
['000-default.conf', 'default-ssl.conf'],
226+
$absoluteApacheConfigDirPath,
227+
["[CUSTOM_WEBROOT]" => $this->_config['config-only']['relative_webroot_dir']]
228+
);
229+
230+
// add volume to config
231+
$this->_config['volumes'][] = [
232+
$apacheConfigDirPath . ':/etc/apache2/sites-available'
233+
];
207234
}
208235

209-
236+
/**
237+
* Copies apache templates to config dir, replaces config placeholders
238+
* with the configured details
239+
* @param array $filenames names of the files to copy
240+
* @param type $targetDirPath the location to copy the files to
241+
* @param array $stringReplacements the replacement text, using placeholder as the key
242+
* @return void
243+
*/
244+
private function _copyApacheTemplateFiles(
245+
array $filenames,
246+
$targetDirPath,
247+
array $stringReplacements
248+
) {
249+
foreach ($filenames as $filename) {
250+
$targetFilename = $targetDirPath . '/' . $filename;
251+
252+
$this->_fs->copy(__DIR__ . '/php/templates/' . $filename, $targetFilename);
253+
254+
$fileContents = file_get_contents($targetFilename);
255+
256+
foreach($stringReplacements as $original => $replacement) {
257+
$fileContents = str_replace($original, $replacement, $fileContents);
258+
}
259+
260+
file_put_contents($targetFilename, $fileContents);
261+
}
262+
}
210263

211264
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<VirtualHost *:80>
2+
# The ServerName directive sets the request scheme, hostname and port that
3+
# the server uses to identify itself. This is used when creating
4+
# redirection URLs. In the context of virtual hosts, the ServerName
5+
# specifies what hostname must appear in the request's Host: header to
6+
# match this virtual host. For the default virtual host (this file) this
7+
# value is not decisive as it is used as a last resort host regardless.
8+
# However, you must set it for any further virtual host explicitly.
9+
#ServerName www.example.com
10+
11+
ServerAdmin webmaster@localhost
12+
DocumentRoot /var/www/html/[CUSTOM_WEBROOT]
13+
14+
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
15+
# error, crit, alert, emerg.
16+
# It is also possible to configure the loglevel for particular
17+
# modules, e.g.
18+
#LogLevel info ssl:warn
19+
20+
ErrorLog ${APACHE_LOG_DIR}/error.log
21+
CustomLog ${APACHE_LOG_DIR}/access.log combined
22+
23+
# For most configuration files from conf-available/, which are
24+
# enabled or disabled at a global level, it is possible to
25+
# include a line for only one particular virtual host. For example the
26+
# following line enables the CGI configuration for this host only
27+
# after it has been globally disabled with "a2disconf".
28+
#Include conf-available/serve-cgi-bin.conf
29+
</VirtualHost>
30+
31+
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<IfModule mod_ssl.c>
2+
<VirtualHost _default_:443>
3+
ServerAdmin webmaster@localhost
4+
5+
DocumentRoot /var/www/html/[CUSTOM_WEBROOT]
6+
7+
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
8+
# error, crit, alert, emerg.
9+
# It is also possible to configure the loglevel for particular
10+
# modules, e.g.
11+
#LogLevel info ssl:warn
12+
13+
ErrorLog ${APACHE_LOG_DIR}/error.log
14+
CustomLog ${APACHE_LOG_DIR}/access.log combined
15+
16+
# For most configuration files from conf-available/, which are
17+
# enabled or disabled at a global level, it is possible to
18+
# include a line for only one particular virtual host. For example the
19+
# following line enables the CGI configuration for this host only
20+
# after it has been globally disabled with "a2disconf".
21+
#Include conf-available/serve-cgi-bin.conf
22+
23+
# SSL Engine Switch:
24+
# Enable/Disable SSL for this virtual host.
25+
SSLEngine on
26+
27+
# A self-signed (snakeoil) certificate can be created by installing
28+
# the ssl-cert package. See
29+
# /usr/share/doc/apache2/README.Debian.gz for more info.
30+
# If both key and certificate are stored in the same file, only the
31+
# SSLCertificateFile directive is needed.
32+
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
33+
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
34+
35+
# Server Certificate Chain:
36+
# Point SSLCertificateChainFile at a file containing the
37+
# concatenation of PEM encoded CA certificates which form the
38+
# certificate chain for the server certificate. Alternatively
39+
# the referenced file can be the same as SSLCertificateFile
40+
# when the CA certificates are directly appended to the server
41+
# certificate for convinience.
42+
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
43+
44+
# Certificate Authority (CA):
45+
# Set the CA certificate verification path where to find CA
46+
# certificates for client authentication or alternatively one
47+
# huge file containing all of them (file must be PEM encoded)
48+
# Note: Inside SSLCACertificatePath you need hash symlinks
49+
# to point to the certificate files. Use the provided
50+
# Makefile to update the hash symlinks after changes.
51+
#SSLCACertificatePath /etc/ssl/certs/
52+
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt
53+
54+
# Certificate Revocation Lists (CRL):
55+
# Set the CA revocation path where to find CA CRLs for client
56+
# authentication or alternatively one huge file containing all
57+
# of them (file must be PEM encoded)
58+
# Note: Inside SSLCARevocationPath you need hash symlinks
59+
# to point to the certificate files. Use the provided
60+
# Makefile to update the hash symlinks after changes.
61+
#SSLCARevocationPath /etc/apache2/ssl.crl/
62+
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl
63+
64+
# Client Authentication (Type):
65+
# Client certificate verification type and depth. Types are
66+
# none, optional, require and optional_no_ca. Depth is a
67+
# number which specifies how deeply to verify the certificate
68+
# issuer chain before deciding the certificate is not valid.
69+
#SSLVerifyClient require
70+
#SSLVerifyDepth 10
71+
72+
# SSL Engine Options:
73+
# Set various options for the SSL engine.
74+
# o FakeBasicAuth:
75+
# Translate the client X.509 into a Basic Authorisation. This means that
76+
# the standard Auth/DBMAuth methods can be used for access control. The
77+
# user name is the `one line' version of the client's X.509 certificate.
78+
# Note that no password is obtained from the user. Every entry in the user
79+
# file needs this password: `xxj31ZMTZzkVA'.
80+
# o ExportCertData:
81+
# This exports two additional environment variables: SSL_CLIENT_CERT and
82+
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
83+
# server (always existing) and the client (only existing when client
84+
# authentication is used). This can be used to import the certificates
85+
# into CGI scripts.
86+
# o StdEnvVars:
87+
# This exports the standard SSL/TLS related `SSL_*' environment variables.
88+
# Per default this exportation is switched off for performance reasons,
89+
# because the extraction step is an expensive operation and is usually
90+
# useless for serving static content. So one usually enables the
91+
# exportation for CGI and SSI requests only.
92+
# o OptRenegotiate:
93+
# This enables optimized SSL connection renegotiation handling when SSL
94+
# directives are used in per-directory context.
95+
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
96+
97+
<FilesMatch "\.(cgi|shtml|phtml|php)$">
98+
SSLOptions +StdEnvVars
99+
</FilesMatch>
100+
<Directory /usr/lib/cgi-bin>
101+
SSLOptions +StdEnvVars
102+
</Directory>
103+
104+
# SSL Protocol Adjustments:
105+
# The safe and default but still SSL/TLS standard compliant shutdown
106+
# approach is that mod_ssl sends the close notify alert but doesn't wait for
107+
# the close notify alert from client. When you need a different shutdown
108+
# approach you can use one of the following variables:
109+
# o ssl-unclean-shutdown:
110+
# This forces an unclean shutdown when the connection is closed, i.e. no
111+
# SSL close notify alert is send or allowed to received. This violates
112+
# the SSL/TLS standard but is needed for some brain-dead browsers. Use
113+
# this when you receive I/O errors because of the standard approach where
114+
# mod_ssl sends the close notify alert.
115+
# o ssl-accurate-shutdown:
116+
# This forces an accurate shutdown when the connection is closed, i.e. a
117+
# SSL close notify alert is send and mod_ssl waits for the close notify
118+
# alert of the client. This is 100% SSL/TLS standard compliant, but in
119+
# practice often causes hanging connections with brain-dead browsers. Use
120+
# this only for browsers where you know that their SSL implementation
121+
# works correctly.
122+
# Notice: Most problems of broken clients are also related to the HTTP
123+
# keep-alive facility, so you usually additionally want to disable
124+
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
125+
# Similarly, one has to force some clients to use HTTP/1.0 to workaround
126+
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
127+
# "force-response-1.0" for this.
128+
BrowserMatch "MSIE [2-6]" \
129+
nokeepalive ssl-unclean-shutdown \
130+
downgrade-1.0 force-response-1.0
131+
# MSIE 7 and newer should be able to use keepalive
132+
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
133+
134+
</VirtualHost>
135+
</IfModule>
136+
137+
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

src/Environment/Command/SetupEnvCommand.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,9 @@ private function saveDockerComposeConfig()
491491
$configFile = Config::CONFIG_DIR . $values['config'];
492492
$config = Yaml::parse(file_get_contents($configFile));
493493
unset($config['active']);
494+
if (isset($config['config-only'])) {
495+
unset($config['config-only']);
496+
}
494497

495498
$links = $this->getContainerLinks($values['node']);
496499
if ($links) {
@@ -506,7 +509,7 @@ private function saveDockerComposeConfig()
506509
$configArray['services'] = $activeServices;
507510

508511

509-
//check if volumes var is null. If is dont add to config file
512+
// check if volumes var is null. If is dont add to config file
510513
$volumes = isset($this->_config['config']['docker']['compose']['volumes']) ? $this->_config['config']['docker']['compose']['volumes'] : null;
511514
if(!is_null($volumes)){
512515
$configArray['volumes'] = $volumes;

0 commit comments

Comments
 (0)