diff --git a/.devilbox/www/config.php b/.devilbox/www/config.php
index a0081677..3898e29f 100644
--- a/.devilbox/www/config.php
+++ b/.devilbox/www/config.php
@@ -81,8 +81,17 @@ function loadClass($class) {
$_LOADED_LIBS[$class] = \devilbox\Postgres::getInstance($Docker->getEnv('POSTGRES_USER'), $Docker->getEnv('POSTGRES_PASSWORD'), $POSTGRES_HOST_ADDR);
break;
+ // Get optional docker classes
default:
- exit('Class does not exist: '.$class);
+ // Redis
+ if ($class == 'Redis' && loadClass('Docker')->getEnv('COMPOSE_OPTIONAL') == 1) {
+ require $LIB_DIR . DIRECTORY_SEPARATOR . $class . '.php';
+ $_LOADED_LIBS[$class] = \devilbox\Redis::getInstance('redis');
+ break;
+
+ } else {
+ exit('Class does not exist: '.$class);
+ }
}
return $_LOADED_LIBS[$class];
}
@@ -94,3 +103,4 @@ function loadClass($class) {
// Temporarily disable due to:
// https://github.com/cytopia/devilbox/issues/8
$ENABLE_VHOST_DNS_CHECK = false;
+
diff --git a/.devilbox/www/htdocs/index.php b/.devilbox/www/htdocs/index.php
index 6d12d0c7..319b5812 100644
--- a/.devilbox/www/htdocs/index.php
+++ b/.devilbox/www/htdocs/index.php
@@ -316,6 +316,74 @@
+
+
+
+
+
+ getEnv('COMPOSE_OPTIONAL') == 1): ?>
+
+
+
+
+
+
Additional Docker container
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Redis docker |
+
+
+
+
+ IP |
+ |
+
+
+ Hostname |
+ |
+
+
+
+
+
+
+
+
+
+
@@ -435,6 +503,38 @@
+
+
+
+
+
+ getEnv('COMPOSE_OPTIONAL') == 1): ?>
+
+
+
+
+
+
+
+
+ Redis docker |
+ host |
+
+
+
+
+ Log directory |
+ ./log |
+
+
+
+
+
+
+
+
+
+
diff --git a/.devilbox/www/include/lib/Redis.php b/.devilbox/www/include/lib/Redis.php
new file mode 100644
index 00000000..eb2f3e16
--- /dev/null
+++ b/.devilbox/www/include/lib/Redis.php
@@ -0,0 +1,207 @@
+error('Instance has errors:' . "\r\n" . var_export(static::$instance, true) . "\r\n");
+ //return null;
+ }
+ return static::$instance;
+ }
+
+ /**
+ * Connect to Redis
+ *
+ * @param string $err Reference to error message
+ * @param string $host Redis hostname
+ * @return boolean
+ */
+ public static function testConnection(&$err, $host)
+ {
+ $err = false;
+
+ // Silence errors and try to connect
+ error_reporting(0);
+ $redis = new \Redis();
+
+ if (!$redis->connect($host, 6379)) {
+ $err = 'Failed to connect to Redis host on '.$host.': ' .$redis->getLastError();
+ error_reporting(-1);
+ return false;
+ }
+ error_reporting(-1);
+ $redis->close();
+ return true;
+ }
+
+
+
+ /*********************************************************************************
+ *
+ * Private Variables
+ *
+ *********************************************************************************/
+
+ /**
+ * Redis instance
+ * @var object|null
+ */
+ private $_redis = null;
+
+ /**
+ * Connection error string
+ * @var string
+ */
+ private $_connect_error = '';
+
+ /**
+ * Connection error code
+ * @var integer
+ */
+ private $_connect_errno = 0;
+
+ /**
+ * Error string
+ * @var string
+ */
+ private $_error = '';
+
+
+ /**
+ * Error code
+ * @var integer
+ */
+ private $_errno = 0;
+
+
+
+ /*********************************************************************************
+ *
+ * Construct/Destructor
+ *
+ *********************************************************************************/
+
+ /**
+ * Use singleton getInstance() instead.
+ *
+ * @param string $user Username
+ * @param string $pass Password
+ * @param string $host Host
+ */
+ public function __construct($host)
+ {
+ // Silence errors and try to connect
+ error_reporting(0);
+ $redis = new \Redis();
+
+ if (!$redis->connect($host, 6379)) {
+ $this->_connect_error = 'Failed to connect to Redis host on '.$host.': ' .$redis->getLastError();
+ $this->_connect_errno = 1;
+ loadClass('Logger')->error($this->_connect_error);
+ } else {
+ $this->_redis = $redis;
+ }
+ error_reporting(-1);
+ }
+
+ /**
+ * Destructor
+ */
+ public function __destruct()
+ {
+ if ($this->_redis) {
+ $this->_redis->close();
+ }
+ }
+
+ /*********************************************************************************
+ *
+ * Redis Select functions
+ *
+ *********************************************************************************/
+
+ public function getVersion()
+ {
+ $info = $this->_redis->info();
+ return 'Redis '.$info['redis_version'];
+ }
+
+
+
+ /*********************************************************************************
+ *
+ * MySQL Error functions
+ *
+ *********************************************************************************/
+
+ /**
+ * Return connection error message.
+ *
+ * @return string Error message
+ */
+ public function getConnectError()
+ {
+ return $this->_connect_error;
+ }
+
+ /**
+ * Return connection errno code.
+ *
+ * @return integer Error code
+ */
+ public function getConnectErrno()
+ {
+ return $this->_connect_errno;
+ }
+
+ /**
+ * Return error message.
+ *
+ * @return string Error message
+ */
+ public function getError()
+ {
+ return $this->_error;
+ }
+
+ /**
+ * Return errno code.
+ *
+ * @return integer Error code
+ */
+ public function getErrno()
+ {
+ return $this->_errno;
+ }
+}
diff --git a/README.md b/README.md
index 57c15f35..a0696d33 100644
--- a/README.md
+++ b/README.md
@@ -52,10 +52,20 @@ $ cp env-example .env
# Edit your configuration
$ vim .env
-# Start the dockers
+# Start the containers (base-stack)
$ docker-compose up
+
+# Or instead of the above base-stack, you can also additionally load the
+# optional stack.
+# Use this command instead:
+$ docker-compose -f docker-compose.optional.yml up
```
+## Updates
+
+In case you update this repository locally on the master branch (e.g.: `git pull origin master`), make sure to repull all docker containers as they very likely have also been up updated.
+Otherwise you might run into problems.
+
[What is the `.env` file?](https://docs.docker.com/compose/env-file/)
## Documentation
@@ -75,8 +85,15 @@ Select your prefered setup.
No need to install and configure different versions locally. Simply choose your required LAMP/LEMP stack combination during startup and it is up and running instantly.
+**Note:** Some docker container combinations might not work well. See the overall build-matrix for possible problems: \[ [](https://travis-ci.org/cytopia/devilbox) \]
+
**Base stack**
+If you only want to use the base stack, use `docker-compose.yml` (default):
+```shell
+$ docker-compose up
+```
+
| Webserver | MySQL | PostgreSQL | PHP |
|-----------|-------|------------|-----|
| [](https://travis-ci.org/cytopia/docker-apache-2.2) [Apache 2.2](https://github.com/cytopia/docker-apache-2.2) | [](https://travis-ci.org/cytopia/docker-mysql-5.5) [MySQL 5.5](https://github.com/cytopia/docker-mysql-5.5) | [](https://travis-ci.org/docker-library/postgres/branches) [PgSQL 9.2](https://hub.docker.com/_/postgres/) | [](https://travis-ci.org/cytopia/docker-php-fpm-5.4) [PHP 5.4](https://github.com/cytopia/docker-php-fpm-5.4) |
@@ -88,17 +105,20 @@ No need to install and configure different versions locally. Simply choose your
| | [](https://travis-ci.org/cytopia/docker-mariadb-10.1) [MariaDB 10.1](https://github.com/cytopia/docker-mariadb-10.1) | |
| | [](https://travis-ci.org/cytopia/docker-mariadb-10.2) [MariaDB 10.2](https://github.com/cytopia/docker-mariadb-10.2) | |
-**Incompatible choices:**
-- Apache 2.2 and HHVM do not work together
**Optional NoSQL stack**
+In order to also use the docker containers below, use the `docker-compose.optional.yml` instead:
+```shell
+$ docker-compose -f docker-compose.optional.yml up
+```
+
| Cassandra | CouchDB | Memcached | MongoDB | Redis |
|-----------|---------|-----------|---------|-------|
-| Cassandra 2.1 | CouchDB 1.6 | Memcached latest | MongoDB 2.6 | Redis 2.8 |
-| Cassandra 2.2 | CouchDB 2.0 | | MongoDB 3.0 | Redis 3.0 |
-| Cassandra 3.0 | | | MongoDB 3.2 | Redis 3.2 |
-| | | | MongoDB 3.4 | Redis unstable |
+| Cassandra 2.1 | CouchDB 1.6 | Memcached latest | MongoDB 2.6 | [](https://travis-ci.org/docker-library/redis/branches) [Redis 2.8](https://github.com/docker-library/redis) |
+| Cassandra 2.2 | CouchDB 2.0 | | MongoDB 3.0 | [](https://travis-ci.org/docker-library/redis/branches) [Redis 3.0](https://github.com/docker-library/redis) |
+| Cassandra 3.0 | | | MongoDB 3.2 | [](https://travis-ci.org/docker-library/redis/branches) [Redis 3.2](https://github.com/docker-library/redis) |
+| | | | MongoDB 3.4 | |
**Note:** Entries without links or without build-status are not yet available, but are coming soon. See [ROADMAP](https://github.com/cytopia/devilbox/issues/23) for tasks and upcoming features.
diff --git a/docker-compose.optional.yml b/docker-compose.optional.yml
new file mode 100644
index 00000000..392ab902
--- /dev/null
+++ b/docker-compose.optional.yml
@@ -0,0 +1,352 @@
+##
+## -------------------------
+## | D E V I L S T A C K |
+## -------------------------
+##
+## Local LAMP/LEMP stack
+##
+##
+##
+##
+##
+## -- DO NOT EDIT THIS FILE --
+##
+## Edit '.env' for configuration.
+##
+## If '.env' does not exist, copy 'env-example' to '.env'
+## $ cp env-example .env
+##
+
+
+version: '2'
+
+
+################################################################################
+# SERVICES
+################################################################################
+services:
+
+ # ----------------------------------------
+ # HTTP
+ # ----------------------------------------
+ httpd:
+ # TODO: remove latest, once it is ready for the next release
+ image: cytopia/${HTTPD_SERVER}:latest
+
+ # Manually build via `docker-compose build`
+ #build:
+ #context: https://github.com/cytopia/docker-${HTTPD_SERVER}.git#1
+ # context: https://github.com/cytopia/docker-${HTTPD_SERVER}.git
+
+ environment:
+
+ # Show all executed commands during docker entrypoint?
+ - DEBUG_COMPOSE_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
+
+ # Adjust timezone
+ - TIMEZONE=${TIMEZONE}
+
+ # Enable PHP-FPM support
+ - PHP_FPM_ENABLE=1
+ - PHP_FPM_SERVER_ADDR=172.16.238.11
+ - PHP_FPM_SERVER_PORT=9000
+
+ # Tell the webserver to look into this directory
+ # for additional configuration files.
+ #
+ # @see volumes:: - ./etc/${HTTPD_SERVER}:/etc/${HTTPD_SERVER}
+ - CUSTOM_HTTPD_CONF_DIR=/etc/${HTTPD_SERVER}
+
+ ports:
+ # ---- Format: ----
+ # [HOST-ADDR : ] HOST-PORT : DOCKER-PORT
+ - "${LOCAL_LISTEN_ADDR}${HOST_PORT_HTTPD}:80"
+
+ networks:
+ app_net:
+ ipv4_address: 172.16.238.10
+
+ volumes:
+ # ---- Format: ----
+ # HOST-DIRECTORY : DOCKER-DIRECTORY
+
+ # Custom scripts/binaries required for httpd server vhost
+ # configuration to work.
+ # (configured in /etc/${HTTPD_SERVER}/02-vhost-mass.conf)
+ - ${DEVILBOX_PATH}/.devilbox/bin/${HTTPD_SERVER}:/opt/bin:ro
+
+ # Mount user-defined httpd configuration files
+ # @see environment::CUSTOM_HTTPD_CONF_DIR for how this
+ # is added in httpd server
+ - ${DEVILBOX_PATH}/.devilbox/etc/${HTTPD_SERVER}:/etc/${HTTPD_SERVER}:ro
+
+ # Mount custom intranet
+ # (configured in /etc/${HTTPD_SERVER}/01-vhost-default.conf)
+ - ${DEVILBOX_PATH}/.devilbox/www:/var/www/default:ro
+
+ # Mount user-defined httpd log
+ # @see ./etc/${HTTPD_SERVER}/*.conf for log defines
+ - ${DEVILBOX_PATH}/log/${HTTPD_SERVER}:/var/log/${HTTPD_SERVER}
+
+ # Mount custom mass virtual hosting
+ # (configured in /etc/${HTTPD_SERVER}/02-vhost-mass.conf)
+ - ${HOST_PATH_TO_WWW_DOCROOTS}:/shared/httpd:ro
+
+ depends_on:
+ - php
+
+
+ # ----------------------------------------
+ # PHP-FPM
+ # ----------------------------------------
+ php:
+ # TODO: remove latest, once it is ready for the next release
+ image: cytopia/${PHP_SERVER}:latest
+
+ # Manually build via `docker-compose build`
+ #build:
+ #context: https://github.com/cytopia/docker-${PHP_SERVER}.git#1
+ # context: https://github.com/cytopia/docker-${PHP_SERVER}.git
+
+ environment:
+
+ # Show all executed commands during docker entrypoint?
+ - DEBUG_COMPOSE_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
+
+ # Adjust timezone
+ - TIMEZONE=${TIMEZONE}
+
+ ##
+ ## PHP Xdebug
+ ##
+ - PHP_XDEBUG_ENABLE=${PHP_XDEBUG_ENABLE}
+ - PHP_XDEBUG_REMOTE_PORT=${PHP_XDEBUG_REMOTE_PORT}
+ - PHP_XDEBUG_REMOTE_HOST=${PHP_XDEBUG_REMOTE_HOST}
+
+ ##
+ ## Postfix on
+ ##
+ - ENABLE_MAIL=1
+
+ ##
+ ## Map remote MySQL Port to 127.0.0.1
+ ##
+ - FORWARD_MYSQL_PORT_TO_LOCALHOST=1
+ - MYSQL_REMOTE_ADDR=172.16.238.12
+ - MYSQL_REMOTE_PORT=3306
+ - MYSQL_LOCAL_PORT=3306
+
+ ##
+ ## Mount remote MySQL socket file to local disk
+ ##
+ - MOUNT_MYSQL_SOCKET_TO_LOCALDISK=1
+ - MYSQL_SOCKET_PATH=/tmp/mysql/mysqld.sock
+
+ ##
+ ## Map remote PostgreSQL Port to 127.0.0.1
+ ##
+ # TODO
+
+ ##
+ ## Mount remote PostgreSQL socket file to local disk
+ ##
+ # TODO
+
+ ##
+ ## Additional variables needed by custom intranet
+ ##
+ - HOST_PATH_TO_WWW_DOCROOTS=${HOST_PATH_TO_WWW_DOCROOTS}
+ - HOST_PORT_HTTPD=${HOST_PORT_HTTPD}
+ - HOST_PATH_TO_MYSQL_DATADIR=${HOST_PATH_TO_MYSQL_DATADIR}
+ - HOST_PATH_TO_POSTGRES_DATADIR=${HOST_PATH_TO_POSTGRES_DATADIR}
+ - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
+ - POSTGRES_USER=${POSTGRES_USER}
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
+
+ ##
+ ## Register optional enabled docker containers to PHP
+ ##
+ - COMPOSE_OPTIONAL=1
+
+
+ networks:
+ app_net:
+ ipv4_address: 172.16.238.11
+
+ volumes:
+ # ---- Format: ----
+ # HOST-DIRECTORY : DOCKER-DIRECTORY
+
+ # Mount custom intranet
+ # (configured in /etc/${HTTPD_SERVER}/01-vhost-default.conf)
+ - ${DEVILBOX_PATH}/.devilbox/www:/var/www/default:ro
+
+ # Mount logs
+ - ${DEVILBOX_PATH}/log/${PHP_SERVER}:/var/log/php-fpm
+
+ # Mount MySQL Socket directory
+ - mysql_socket_volume:/tmp/mysql
+
+ # Mount Mail directory
+ #- ${DEVILBOX_PATH}/run/mail:/var/mail
+
+ # Mount devilbox user-defined *.ini files in order
+ # to overwrite the default PHP configuration
+ - ${DEVILBOX_PATH}/cfg/${PHP_SERVER}:/etc/php-custom.d:ro
+
+
+ # Mount custom mass virtual hosting
+ # (configured in /etc/${HTTPD_SERVER}/02-vhost-mass.conf)
+ - ${HOST_PATH_TO_WWW_DOCROOTS}:/shared/httpd
+
+ depends_on:
+ - mysql
+ - postgres
+ - redis
+
+
+ # ----------------------------------------
+ # DATABASE
+ # ----------------------------------------
+ mysql:
+ # TODO: remove latest, once it is ready for the next release
+ image: cytopia/${MYSQL_SERVER}:latest
+
+ # Manually build via `docker-compose build`
+ #build:
+ #context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git#1
+ # context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git
+
+ environment:
+
+ # Show all executed commands during docker entrypoint?
+ - DEBUG_COMPOSE_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
+
+ # Adjust timezone
+ - TIMEZONE=${TIMEZONE}
+
+
+ - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
+ - MYSQL_SOCKET_DIR=/tmp/mysql
+
+ # Runtime settings
+ - MYSQL_GENERAL_LOG=${MYSQL_GENERAL_LOG}
+
+ ports:
+ # [local-machine:]local-port:docker-port
+ - "${LOCAL_LISTEN_ADDR}${HOST_PORT_MYSQL}:3306"
+
+ networks:
+ app_net:
+ ipv4_address: 172.16.238.12
+
+ volumes:
+ # ---- Format: ----
+ # HOST-DIRECTORY : DOCKER-DIRECTORY
+
+ # Mount logs
+ - ${DEVILBOX_PATH}/log/${MYSQL_SERVER}:/var/log/mysql
+
+ # Mount MySQL Socket directory
+ - mysql_socket_volume:/tmp/mysql
+
+ # Mount devilbox default overwrites
+ - ${DEVILBOX_PATH}/.devilbox/etc/${MYSQL_SERVER}:/etc/mysql/docker-default.d:ro
+
+ # Mount devilbox user-defined cnf files in order
+ # to overwrite the MySQL server configuration
+ - ${DEVILBOX_PATH}/cfg/${MYSQL_SERVER}:/etc/mysql/conf.d:ro
+
+ # Mount MySQL Data directory
+ - ${HOST_PATH_TO_MYSQL_DATADIR}:/var/lib/mysql
+
+
+ # ----------------------------------------
+ # POSTGRES
+ # ----------------------------------------
+ postgres:
+ image: postgres:${POSTGRES_SERVER}
+
+ # Manually build via `docker-compose build`
+ #build:
+ #context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git#1
+ # context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git
+
+ environment:
+
+ - POSTGRES_USER=${POSTGRES_USER}
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
+ - PGDATA=/var/lib/postgresql/data/pgdata
+
+ ports:
+ # [local-machine:]local-port:docker-port
+ - "${LOCAL_LISTEN_ADDR}${HOST_PORT_POSTGRES}:5432"
+
+ networks:
+ app_net:
+ ipv4_address: 172.16.238.13
+
+ volumes:
+ # ---- Format: ----
+ # HOST-DIRECTORY : DOCKER-DIRECTORY
+
+ # Mount logs
+ - ${DEVILBOX_PATH}/log/postgres-${POSTGRES_SERVER}:/var/log/postgresql
+
+ # Mount PostgreSQL Socket directory
+ - pgsql_socket_volume:/var/run/postgresql
+
+ # Mount PostgreSQL Data directory
+ - ${HOST_PATH_TO_POSTGRES_DATADIR}:/var/lib/postgresql/data/pgdata
+
+
+ # ----------------------------------------
+ # Redis
+ # ----------------------------------------
+ redis:
+ image: redis:${REDIS_SERVER}
+
+ ports:
+ # [local-machine:]local-port:docker-port
+ - "${LOCAL_LISTEN_ADDR}${HOST_PORT_REDIS}:6379"
+
+ networks:
+ app_net:
+ ipv4_address: 172.16.238.14
+
+ volumes:
+ # ---- Format: ----
+ # HOST-DIRECTORY : DOCKER-DIRECTORY
+
+ # Mount logs
+ - ${DEVILBOX_PATH}/log/redis-${REDIS_SERVER}:/var/log/redis
+
+
+################################################################################
+# VOLUMES
+################################################################################
+volumes:
+ # Create volume for mysql socket.
+ # This removes the need to mount the socket to the host
+ # but be able to mount it to different containers (from another container)
+ mysql_socket_volume:
+
+ # Create volume for postgresql socket.
+ # This removes the need to mount the socket to the host
+ # but be able to mount it to different containers (from another container)
+ pgsql_socket_volume:
+
+
+################################################################################
+# NETWORK
+################################################################################
+networks:
+ app_net:
+ driver: bridge
+ driver_opts:
+ com.docker.network.enable_ipv6: "false"
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.16.238.0/24
+ gateway: 172.16.238.1
diff --git a/env-example b/env-example
index a5ddca28..5fe443a1 100644
--- a/env-example
+++ b/env-example
@@ -101,7 +101,17 @@ PHP_SERVER=php-fpm-7.0
###
-### 1.5 Timezone for all dockers and service config files
+### 1.5 Choose Redis Server Image
+### (only for docker-compose.optional.yml)
+### $ docker-compose -f docker-compose.optional.yml up
+###
+REDIS_SERVER=2.8
+#REDIS_SERVER=3.0
+#REDIS_SERVER=3.2
+
+
+###
+### 1.6 Timezone for all dockers and service config files
###
TIMEZONE=Europe/Berlin
@@ -228,3 +238,16 @@ PHP_XDEBUG_REMOTE_PORT=9000
# where your ide/editor is listening for xdebug connections.
PHP_XDEBUG_REMOTE_HOST=172.20.10.2
## TODO: Check if it works by automatically sending it to the broadcast address
+
+
+
+################################################################################
+###
+### 7. Redis Docker Settings
+###
+################################################################################
+
+###
+### Expost Redis Port to Host
+###
+HOST_PORT_REDIS=6379