From e07ee7d07d8bd7f3091ac333fbd90b3b29a2153e Mon Sep 17 00:00:00 2001 From: Madson Jr Date: Wed, 18 Jul 2018 13:25:16 -0300 Subject: [PATCH 001/861] GraphViz support in workspace Issue #1003 --- docker-compose.yml | 1 + env-example | 1 + workspace/Dockerfile | 11 +++++++++++ 3 files changed, 13 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 2e6a7ea583..22049d0e7f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -88,6 +88,7 @@ services: - INSTALL_PG_CLIENT=${WORKSPACE_INSTALL_PG_CLIENT} - INSTALL_SWOOLE=${WORKSPACE_INSTALL_SWOOLE} - INSTALL_LIBPNG=${WORKSPACE_INSTALL_LIBPNG} + - INSTALL_GRAPHVIZ=${WORKSPACE_INSTALL_GRAPHVIZ} - PUID=${WORKSPACE_PUID} - PGID=${WORKSPACE_PGID} - CHROME_DRIVER_VERSION=${WORKSPACE_CHROME_DRIVER_VERSION} diff --git a/env-example b/env-example index 25ebcb7e92..b0cb7dcdda 100644 --- a/env-example +++ b/env-example @@ -114,6 +114,7 @@ WORKSPACE_INSTALL_DUSK_DEPS=false WORKSPACE_INSTALL_PG_CLIENT=false WORKSPACE_INSTALL_SWOOLE=false WORKSPACE_INSTALL_LIBPNG=false +WORKSPACE_INSTALL_GRAPHVIZ=false WORKSPACE_PUID=1000 WORKSPACE_PGID=1000 WORKSPACE_CHROME_DRIVER_VERSION=2.32 diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 4f1e464545..6d25236412 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -377,6 +377,17 @@ RUN if [ ${INSTALL_LIBPNG} = true ]; then \ apt install libpng16-16 \ ;fi +########################################################################### +# GraphViz extension +########################################################################### + +ARG INSTALL_GRAPHVIZ=false + +RUN if [ ${INSTALL_GRAPHVIZ} = true ]; then \ + apt-get update && \ + apt-get install -y graphviz \ +;fi + ########################################################################### # Drupal Console: ########################################################################### From 7aba9991f658d78eda59db04f67c3ff5d11bc4c1 Mon Sep 17 00:00:00 2001 From: Madson Jr Date: Wed, 18 Jul 2018 13:26:27 -0300 Subject: [PATCH 002/861] Conflict merge --- docker-compose.yml | 2 +- .../docker-entrypoint-initdb.d/createdb.sql.example | 12 ++++++------ nginx/sites/{default.conf => default.conf.example} | 0 workspace/Dockerfile | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename nginx/sites/{default.conf => default.conf.example} (100%) diff --git a/docker-compose.yml b/docker-compose.yml index d9566e8502..8b2cbd13a8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -685,7 +685,7 @@ services: networks: - frontend - backend - + ### Solr ################################################ solr: build: diff --git a/mysql/docker-entrypoint-initdb.d/createdb.sql.example b/mysql/docker-entrypoint-initdb.d/createdb.sql.example index 6420afb8e3..dc48e59b02 100644 --- a/mysql/docker-entrypoint-initdb.d/createdb.sql.example +++ b/mysql/docker-entrypoint-initdb.d/createdb.sql.example @@ -16,13 +16,13 @@ # mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql # -#CREATE DATABASE IF NOT EXISTS `dev_db_1` COLLATE 'utf8_general_ci' ; -#GRANT ALL ON `dev_db_1`.* TO 'default'@'%' ; +CREATE DATABASE IF NOT EXISTS `finance_control` COLLATE 'utf8_general_ci' ; +GRANT ALL ON `finance_control`.* TO 'fincon'@'%' IDENTIFIED BY 'fincon'; -#CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ; -#GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ; +-- CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ; +-- GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ; -#CREATE DATABASE IF NOT EXISTS `dev_db_3` COLLATE 'utf8_general_ci' ; -#GRANT ALL ON `dev_db_3`.* TO 'default'@'%' ; +-- CREATE DATABASE IF NOT EXISTS `dev_db_3` COLLATE 'utf8_general_ci' ; +-- GRANT ALL ON `dev_db_3`.* TO 'default'@'%' ; FLUSH PRIVILEGES ; diff --git a/nginx/sites/default.conf b/nginx/sites/default.conf.example similarity index 100% rename from nginx/sites/default.conf rename to nginx/sites/default.conf.example diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 6d25236412..36e44375ca 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -787,7 +787,7 @@ RUN if [ ${INSTALL_PG_CLIENT} = true ]; then \ USER root RUN apt-get update -yqq \ - && apt-get -yqq install nasm + && apt-get -yqq install nasm ########################################################################### # Dusk Dependencies: From d04fa78a75f614819faf873ee1dc94e97998ec56 Mon Sep 17 00:00:00 2001 From: Madson Jr Date: Wed, 18 Jul 2018 13:39:52 -0300 Subject: [PATCH 003/861] Removed invalid example file --- .../createdb.sql.example | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 mysql/docker-entrypoint-initdb.d/createdb.sql.example diff --git a/mysql/docker-entrypoint-initdb.d/createdb.sql.example b/mysql/docker-entrypoint-initdb.d/createdb.sql.example deleted file mode 100644 index dc48e59b02..0000000000 --- a/mysql/docker-entrypoint-initdb.d/createdb.sql.example +++ /dev/null @@ -1,28 +0,0 @@ -# -# Copy createdb.sql.example to createdb.sql -# then uncomment then set database name and username to create you need databases -# -# example: .env MYSQL_USER=appuser and need db name is myshop_db -# -# CREATE DATABASE IF NOT EXISTS `myshop_db` ; -# GRANT ALL ON `myshop_db`.* TO 'appuser'@'%' ; -# -# -# this sql script will auto run when the mysql container starts and the $DATA_PATH_HOST/mysql not found. -# -# if your $DATA_PATH_HOST/mysql exists and you do not want to delete it, you can run by manual execution: -# -# docker-compose exec mysql bash -# mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql -# - -CREATE DATABASE IF NOT EXISTS `finance_control` COLLATE 'utf8_general_ci' ; -GRANT ALL ON `finance_control`.* TO 'fincon'@'%' IDENTIFIED BY 'fincon'; - --- CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ; --- GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ; - --- CREATE DATABASE IF NOT EXISTS `dev_db_3` COLLATE 'utf8_general_ci' ; --- GRANT ALL ON `dev_db_3`.* TO 'default'@'%' ; - -FLUSH PRIVILEGES ; From e526e46e60beff6d2bf5ecb5395d8265f3994a36 Mon Sep 17 00:00:00 2001 From: Madson Jr Date: Fri, 20 Jul 2018 19:14:11 -0300 Subject: [PATCH 004/861] MySQL create DB example. --- .../createdb.sql.example | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 mysql/docker-entrypoint-initdb.d/createdb.sql.example diff --git a/mysql/docker-entrypoint-initdb.d/createdb.sql.example b/mysql/docker-entrypoint-initdb.d/createdb.sql.example new file mode 100644 index 0000000000..6420afb8e3 --- /dev/null +++ b/mysql/docker-entrypoint-initdb.d/createdb.sql.example @@ -0,0 +1,28 @@ +# +# Copy createdb.sql.example to createdb.sql +# then uncomment then set database name and username to create you need databases +# +# example: .env MYSQL_USER=appuser and need db name is myshop_db +# +# CREATE DATABASE IF NOT EXISTS `myshop_db` ; +# GRANT ALL ON `myshop_db`.* TO 'appuser'@'%' ; +# +# +# this sql script will auto run when the mysql container starts and the $DATA_PATH_HOST/mysql not found. +# +# if your $DATA_PATH_HOST/mysql exists and you do not want to delete it, you can run by manual execution: +# +# docker-compose exec mysql bash +# mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql +# + +#CREATE DATABASE IF NOT EXISTS `dev_db_1` COLLATE 'utf8_general_ci' ; +#GRANT ALL ON `dev_db_1`.* TO 'default'@'%' ; + +#CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ; +#GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ; + +#CREATE DATABASE IF NOT EXISTS `dev_db_3` COLLATE 'utf8_general_ci' ; +#GRANT ALL ON `dev_db_3`.* TO 'default'@'%' ; + +FLUSH PRIVILEGES ; From 5a61c134f34cc3387d2831fc87bd3c425d76b249 Mon Sep 17 00:00:00 2001 From: Nazariy Hazdun Date: Fri, 17 Aug 2018 14:24:48 +0300 Subject: [PATCH 005/861] Add Weaver-athenapdf --- weaver/conf/sample.env | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 weaver/conf/sample.env diff --git a/weaver/conf/sample.env b/weaver/conf/sample.env new file mode 100644 index 0000000000..ccb48de5f5 --- /dev/null +++ b/weaver/conf/sample.env @@ -0,0 +1,19 @@ +GIN_MODE=debug + +# Weaver +WEAVER_AUTH_KEY=arachnys-weaver +WEAVER_ATHENA_CMD=athenapdf -S +WEAVER_MAX_WORKERS=10 +WEAVER_MAX_CONVERSION_QUEUE=50 +WEAVER_WORKER_TIMEOUT=90 +WEAVER_CONVERSION_FALLBACK=false + +# CloudConvert +# API key can be found: https://cloudconvert.com/user/profile +# CLOUDCONVERT_API=https://api.cloudconvert.com +# CLOUDCONVERT_KEY= + +# Monitoring +# STATSD_ADDRESS= +# STATSD_PREFIX= +# SENTRY_DSN= \ No newline at end of file From 006946ce6a8c48110efe4236b4bb5e1353d266e7 Mon Sep 17 00:00:00 2001 From: Nazariy Hazdun Date: Fri, 17 Aug 2018 14:31:38 +0300 Subject: [PATCH 006/861] Add Weaver-athenapdf --- docker-compose.yml | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e1a6f18c02..276ea89ebc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -685,7 +685,7 @@ services: networks: - frontend - backend - + ### Solr ################################################ solr: build: @@ -730,15 +730,15 @@ services: context: ./gitlab environment: GITLAB_OMNIBUS_CONFIG: | - external_url '${GITLAB_DOMAIN_NAME}' - redis['enable'] = false - nginx['listen_https'] = false - nginx['listen_port'] = 80 - postgresql['enable'] = false - gitlab_rails['trusted_proxies'] = ['caddy','nginx','apache2'] - gitlab_rails['redis_host'] = 'redis' + external_url '${GITLAB_DOMAIN_NAME}' + redis['enable'] = false + nginx['listen_https'] = false + nginx['listen_port'] = 80 + postgresql['enable'] = false + gitlab_rails['trusted_proxies'] = ['caddy','nginx','apache2'] + gitlab_rails['redis_host'] = 'redis' gitlab_rails['redis_database'] = 8 - gitlab_rails['db_host'] = 'postgres' + gitlab_rails['db_host'] = 'postgres' gitlab_rails['db_username'] = 'laradock_gitlab' gitlab_rails['db_password'] = 'laradock_gitlab' gitlab_rails['db_database'] = 'laradock_gitlab' @@ -765,7 +765,7 @@ services: - ${DATA_PATH_HOST}/gitlab/runner:/etc/gitlab-runner - /var/run/docker.sock:/var/run/docker.sock:rw restart: always - + ### JupyterHub ######################################### jupyterhub: build: @@ -876,7 +876,7 @@ services: - backend depends_on: - mongo - + ### Metabase ################################################# metabase: image: metabase/metabase:latest @@ -889,3 +889,14 @@ services: networks: - backend +### Weaver (Athena PDF) ################################################ + weaver: + image: arachnysdocker/athenapdf-service + ports: + - "8080:8080" + env_file: + - ./weaver/conf/sample.env + networks: + - backend + depends_on: + - workspace \ No newline at end of file From d178613e660cd11aac2d529ee6c4523b236f9b03 Mon Sep 17 00:00:00 2001 From: Nazariy Hazdun Date: Fri, 17 Aug 2018 14:33:24 +0300 Subject: [PATCH 007/861] code style fix --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 276ea89ebc..ad5f23630e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -889,7 +889,7 @@ services: networks: - backend -### Weaver (Athena PDF) ################################################ +### Weaver (Athena PDF) ################################################# weaver: image: arachnysdocker/athenapdf-service ports: From ee89ff96d5d2441bd65e227aeea82462a2eefdb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9F=E5=8B=87?= Date: Tue, 4 Dec 2018 00:52:59 +0800 Subject: [PATCH 008/861] [U] ignore self-signed certificate --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 890c25c1cd..4235e773da 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /.project .docker-sync /jenkins/jenkins_home +/nginx/ssl/ From 2de32fe97fb5edd36a0de199b8504bcd3877818c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9F=E5=8B=87?= Date: Tue, 4 Dec 2018 01:35:21 +0800 Subject: [PATCH 009/861] [F] fix latest version for mysql8.0.13 --- mysql/my.cnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql/my.cnf b/mysql/my.cnf index e03ccf8828..399eaac27c 100644 --- a/mysql/my.cnf +++ b/mysql/my.cnf @@ -7,4 +7,4 @@ [mysqld] sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" -character-set-server=utf8 +character-set-server=utf8mb4 From 28e82813c4bbc84547cfac1c91e21342dfeed588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9F=E5=8B=87?= Date: Tue, 4 Dec 2018 01:57:37 +0800 Subject: [PATCH 010/861] [F] fix mysql cann't start when version is 8.* --- docker-compose.yml | 1 + mysql/my.cnf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 0c3ff899ad..2965a67863 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -303,6 +303,7 @@ services: context: ./mysql args: - MYSQL_VERSION=${MYSQL_VERSION} + command: "--innodb_use_native_aio=0" environment: - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} diff --git a/mysql/my.cnf b/mysql/my.cnf index 399eaac27c..68578ef0b3 100644 --- a/mysql/my.cnf +++ b/mysql/my.cnf @@ -6,5 +6,5 @@ [mysql] [mysqld] -sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" +sql-mode="STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" character-set-server=utf8mb4 From cb7ea58b57b19fbaa7e94a98977c19d0981bdc1f Mon Sep 17 00:00:00 2001 From: Rony Debnath Date: Thu, 10 Jan 2019 17:13:58 +0600 Subject: [PATCH 011/861] specifying which files to Gzip compress and increase grade in Google page speed --- nginx/nginx.conf | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index e747e98393..76f6e1b54c 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -23,6 +23,27 @@ http { error_log /dev/stderr; gzip on; gzip_disable "msie6"; + gzip_comp_level 5; + gzip_min_length 256; + gzip_proxied any; + gzip_vary on; + + gzip_types + application/atom+xml + application/javascript + application/json + application/rss+xml + application/vnd.ms-fontobject + application/x-font-ttf + application/x-web-app-manifest+json + application/xhtml+xml + application/xml + font/opentype + image/svg+xml + image/x-icon + text/css + text/plain + text/x-component; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; From 3ad37405c6cd91304a0e286dcc2d75f8931beffa Mon Sep 17 00:00:00 2001 From: Pavel Date: Thu, 24 Jan 2019 20:25:08 +0300 Subject: [PATCH 012/861] Chmod --- mariadb/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mariadb/Dockerfile b/mariadb/Dockerfile index 0dcb948199..1929726a3c 100644 --- a/mariadb/Dockerfile +++ b/mariadb/Dockerfile @@ -4,6 +4,8 @@ LABEL maintainer="Mahmoud Zalt " COPY my.cnf /etc/mysql/conf.d/my.cnf +RUN chmod -R 644 /etc/mysql/conf.d/my.cnf + CMD ["mysqld"] EXPOSE 3306 From 897b5704dcdfee7147a443b2c8419521a1cc0c40 Mon Sep 17 00:00:00 2001 From: Lan Phan Date: Sat, 16 Mar 2019 14:17:58 +0700 Subject: [PATCH 013/861] update adminer to support SQL Server --- adminer/Dockerfile | 18 +++++++++--------- docker-compose.yml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/adminer/Dockerfile b/adminer/Dockerfile index cb39977164..61ca8d9206 100644 --- a/adminer/Dockerfile +++ b/adminer/Dockerfile @@ -9,19 +9,19 @@ VOLUME /sessions # SQL SERVER: ##################################### USER root + ARG INSTALL_MSSQL=false ENV INSTALL_MSSQL ${INSTALL_MSSQL} + RUN if [ ${INSTALL_MSSQL} = true ]; then \ set -xe \ - # && apk --update add --no-cache --virtual .phpize-deps $PHPIZE_DEPS unixodbc unixodbc-dev \ - # && pecl channel-update pecl.php.net \ - # && pecl install pdo_sqlsrv-4.1.8preview sqlsrv-4.1.8preview \ - # && echo "extension=sqlsrv.so" > /usr/local/etc/php/conf.d/20-sqlsrv.ini \ - # && echo "extension=pdo_sqlsrv.so" > /usr/local/etc/php/conf.d/20-pdo_sqlsrv.ini \ - && apk --update add --no-cache freetds unixodbc \ - && apk --update add --no-cache --virtual .build-deps $PHPIZE_DEPS freetds-dev unixodbc-dev \ - && docker-php-ext-install pdo_dblib \ - && apk del .build-deps \ + && apk update \ + && apk add --no-cache --virtual .php-build-dependencies unixodbc-dev freetds-dev \ + && apk add --virtual .php-runtime-dependencies unixodbc freetds \ + && docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \ + && docker-php-ext-install pdo_odbc pdo_dblib \ + && apk del .php-build-dependencies \ + && rm -rf /var/cache/apk/* \ ;fi USER adminer diff --git a/docker-compose.yml b/docker-compose.yml index aeb6d16336..f5ccf4a405 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -359,7 +359,7 @@ services: - SA_PASSWORD=${MSSQL_PASSWORD} - ACCEPT_EULA=Y volumes: - - ${DATA_PATH_HOST}/mssql:/var/opt/mssql + - mssql:/var/opt/mssql ports: - "${MSSQL_PORT}:1433" networks: From 8027a98f72d2d30161c0a193ceef467c05e629df Mon Sep 17 00:00:00 2001 From: Anton Sannikov Date: Mon, 20 May 2019 22:36:08 +0200 Subject: [PATCH 014/861] Confluence config added --- docker-compose.yml | 20 +++++++++ env-example | 8 ++++ .../docker-entrypoint-initdb.d/.gitignore | 1 + .../init_confluence_db.sh | 44 +++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 postgres/docker-entrypoint-initdb.d/init_confluence_db.sh diff --git a/docker-compose.yml b/docker-compose.yml index 52f0cf31ca..b022bbd4cc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,6 +41,8 @@ volumes: driver: ${VOLUMES_DRIVER} mosquitto: driver: ${VOLUMES_DRIVER} + confluence: + driver: ${VOLUMES_DRIVER} sonarqube: driver: ${VOLUMES_DRIVER} @@ -414,6 +416,10 @@ services: - SONARQUBE_POSTGRES_DB=${SONARQUBE_POSTGRES_DB} - SONARQUBE_POSTGRES_USER=${SONARQUBE_POSTGRES_USER} - SONARQUBE_POSTGRES_PASSWORD=${SONARQUBE_POSTGRES_PASSWORD} + - POSTGRES_CONFLUENCE_INIT=${CONFLUENCE_POSTGRES_INIT} + - POSTGRES_CONFLUENCE_DB=${CONFLUENCE_POSTGRES_DB} + - POSTGRES_CONFLUENCE_USER=${CONFLUENCE_POSTGRES_USER} + - POSTGRES_CONFLUENCE_PASSWORD=${CONFLUENCE_POSTGRES_PASSWORD} networks: - backend @@ -1459,3 +1465,17 @@ services: networks: - backend - frontend +### CONFLUENCE ################################################ + confluence: + container_name: Confluence + image: atlassian/confluence-server:${CONFLUENCE_VERSION} + restart: always + ports: + - "${CONFLUENCE_HOST_HTTP_PORT}:8090" + networks: + - frontend + - backend + depends_on: + - postgres + volumes: + - ${DATA_PATH_HOST}/Confluence:/var/atlassian/application-data \ No newline at end of file diff --git a/env-example b/env-example index b5986c19d1..9ba3cddaad 100644 --- a/env-example +++ b/env-example @@ -366,6 +366,14 @@ JENKINS_HOST_HTTP_PORT=8090 JENKINS_HOST_SLAVE_AGENT_PORT=50000 JENKINS_HOME=./jenkins/jenkins_home +### CONFLUENCE ############################################### +CONFLUENCE_POSTGRES_INIT=true +CONFLUENCE_VERSION=6.13-ubuntu-18.04-adoptopenjdk8 +CONFLUENCE_POSTGRES_DB=laradock_confluence +CONFLUENCE_POSTGRES_USER=laradock_confluence +CONFLUENCE_POSTGRES_PASSWORD=laradock_confluence +CONFLUENCE_HOST_HTTP_PORT=8090 + ### GRAFANA ############################################### GRAFANA_PORT=3000 diff --git a/postgres/docker-entrypoint-initdb.d/.gitignore b/postgres/docker-entrypoint-initdb.d/.gitignore index 0721338b15..a56b450c07 100644 --- a/postgres/docker-entrypoint-initdb.d/.gitignore +++ b/postgres/docker-entrypoint-initdb.d/.gitignore @@ -2,3 +2,4 @@ !init_gitlab_db.sh !init_jupyterhub_db.sh !init_sonarqube_db.sh +!init_confluence_db.sh \ No newline at end of file diff --git a/postgres/docker-entrypoint-initdb.d/init_confluence_db.sh b/postgres/docker-entrypoint-initdb.d/init_confluence_db.sh new file mode 100644 index 0000000000..ce5e9f7209 --- /dev/null +++ b/postgres/docker-entrypoint-initdb.d/init_confluence_db.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# +# Copy createdb.sh.example to createdb.sh +# then uncomment then set database name and username to create you need databases +# +# example: .env POSTGRES_USER=appuser and need db name is myshop_db +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER myuser WITH PASSWORD 'mypassword'; +# CREATE DATABASE myshop_db; +# GRANT ALL PRIVILEGES ON DATABASE myshop_db TO myuser; +# EOSQL +# +# this sh script will auto run when the postgres container starts and the $DATA_PATH_HOST/postgres not found. +# +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER db1 WITH PASSWORD 'db1'; +# CREATE DATABASE db1; +# GRANT ALL PRIVILEGES ON DATABASE db1 TO db1; +# EOSQL +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER db2 WITH PASSWORD 'db2'; +# CREATE DATABASE db2; +# GRANT ALL PRIVILEGES ON DATABASE db2 TO db2; +# EOSQL +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER db3 WITH PASSWORD 'db3'; +# CREATE DATABASE db3; +# GRANT ALL PRIVILEGES ON DATABASE db3 TO db3; +# EOSQL +# +### default database and user for confluence ############################################## +if [ "$POSTGRES_CONFLUENCE_INIT" == 'true' ]; then + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + CREATE USER $POSTGRES_CONFLUENCE_USER WITH PASSWORD '$POSTGRES_CONFLUENCE_PASSWORD'; + CREATE DATABASE $POSTGRES_CONFLUENCE_DB; + GRANT ALL PRIVILEGES ON DATABASE $POSTGRES_CONFLUENCE_DB TO $POSTGRES_CONFLUENCE_USER; + ALTER ROLE $POSTGRES_CONFLUENCE_USER CREATEROLE SUPERUSER; + EOSQL + echo +fi \ No newline at end of file From f23149115d7f8c8ecfe18f82b62f57f02d4d56bc Mon Sep 17 00:00:00 2001 From: Anton Sannikov Date: Mon, 20 May 2019 22:51:36 +0200 Subject: [PATCH 015/861] Confluence docs added --- DOCUMENTATION/content/documentation/index.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index 0704aba46e..22aa559c55 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -1023,8 +1023,21 @@ _Note: You can customize the port on which beanstalkd console is listening by ch +
+ +## Use Confluence + +1 - Run the Confluence Container (`confluence`) with the `docker-compose up` command. Example: + +```bash +docker-compose up -d confluence +``` + +2 - Open your browser and visit the localhost on port **8090**: `http://localhost:8090` +**Note:** You can you trial version and then you have to buy a licence to use it. +You can set custom confluence version in `CONFLUENCE_VERSION`. [Find more info in section 'Versioning'](https://hub.docker.com/r/atlassian/confluence-server/)
From d1015e5e9687d31bf178ec75243825c606cc49e4 Mon Sep 17 00:00:00 2001 From: Anton Sannikov Date: Wed, 19 Jun 2019 11:19:20 +0200 Subject: [PATCH 016/861] Confluence container added (#2140) * Confluence config added * Confluence docs added --- DOCUMENTATION/content/documentation/index.md | 13 ++++++ docker-compose.yml | 20 +++++++++ env-example | 8 ++++ .../docker-entrypoint-initdb.d/.gitignore | 1 + .../init_confluence_db.sh | 44 +++++++++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 postgres/docker-entrypoint-initdb.d/init_confluence_db.sh diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index 47796d46ae..f5232592e3 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -1056,8 +1056,21 @@ _Note: You can customize the port on which beanstalkd console is listening by ch +
+ +## Use Confluence + +1 - Run the Confluence Container (`confluence`) with the `docker-compose up` command. Example: + +```bash +docker-compose up -d confluence +``` + +2 - Open your browser and visit the localhost on port **8090**: `http://localhost:8090` +**Note:** You can you trial version and then you have to buy a licence to use it. +You can set custom confluence version in `CONFLUENCE_VERSION`. [Find more info in section 'Versioning'](https://hub.docker.com/r/atlassian/confluence-server/)
diff --git a/docker-compose.yml b/docker-compose.yml index bd3d4ae623..1a729e87be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,6 +41,8 @@ volumes: driver: ${VOLUMES_DRIVER} mosquitto: driver: ${VOLUMES_DRIVER} + confluence: + driver: ${VOLUMES_DRIVER} sonarqube: driver: ${VOLUMES_DRIVER} @@ -436,6 +438,10 @@ services: - SONARQUBE_POSTGRES_DB=${SONARQUBE_POSTGRES_DB} - SONARQUBE_POSTGRES_USER=${SONARQUBE_POSTGRES_USER} - SONARQUBE_POSTGRES_PASSWORD=${SONARQUBE_POSTGRES_PASSWORD} + - POSTGRES_CONFLUENCE_INIT=${CONFLUENCE_POSTGRES_INIT} + - POSTGRES_CONFLUENCE_DB=${CONFLUENCE_POSTGRES_DB} + - POSTGRES_CONFLUENCE_USER=${CONFLUENCE_POSTGRES_USER} + - POSTGRES_CONFLUENCE_PASSWORD=${CONFLUENCE_POSTGRES_PASSWORD} networks: - backend @@ -1481,3 +1487,17 @@ services: networks: - backend - frontend +### CONFLUENCE ################################################ + confluence: + container_name: Confluence + image: atlassian/confluence-server:${CONFLUENCE_VERSION} + restart: always + ports: + - "${CONFLUENCE_HOST_HTTP_PORT}:8090" + networks: + - frontend + - backend + depends_on: + - postgres + volumes: + - ${DATA_PATH_HOST}/Confluence:/var/atlassian/application-data \ No newline at end of file diff --git a/env-example b/env-example index b1c0e73d07..6bc5a3f3a5 100644 --- a/env-example +++ b/env-example @@ -375,6 +375,14 @@ JENKINS_HOST_HTTP_PORT=8090 JENKINS_HOST_SLAVE_AGENT_PORT=50000 JENKINS_HOME=./jenkins/jenkins_home +### CONFLUENCE ############################################### +CONFLUENCE_POSTGRES_INIT=true +CONFLUENCE_VERSION=6.13-ubuntu-18.04-adoptopenjdk8 +CONFLUENCE_POSTGRES_DB=laradock_confluence +CONFLUENCE_POSTGRES_USER=laradock_confluence +CONFLUENCE_POSTGRES_PASSWORD=laradock_confluence +CONFLUENCE_HOST_HTTP_PORT=8090 + ### GRAFANA ############################################### GRAFANA_PORT=3000 diff --git a/postgres/docker-entrypoint-initdb.d/.gitignore b/postgres/docker-entrypoint-initdb.d/.gitignore index 0721338b15..a56b450c07 100644 --- a/postgres/docker-entrypoint-initdb.d/.gitignore +++ b/postgres/docker-entrypoint-initdb.d/.gitignore @@ -2,3 +2,4 @@ !init_gitlab_db.sh !init_jupyterhub_db.sh !init_sonarqube_db.sh +!init_confluence_db.sh \ No newline at end of file diff --git a/postgres/docker-entrypoint-initdb.d/init_confluence_db.sh b/postgres/docker-entrypoint-initdb.d/init_confluence_db.sh new file mode 100644 index 0000000000..ce5e9f7209 --- /dev/null +++ b/postgres/docker-entrypoint-initdb.d/init_confluence_db.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# +# Copy createdb.sh.example to createdb.sh +# then uncomment then set database name and username to create you need databases +# +# example: .env POSTGRES_USER=appuser and need db name is myshop_db +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER myuser WITH PASSWORD 'mypassword'; +# CREATE DATABASE myshop_db; +# GRANT ALL PRIVILEGES ON DATABASE myshop_db TO myuser; +# EOSQL +# +# this sh script will auto run when the postgres container starts and the $DATA_PATH_HOST/postgres not found. +# +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER db1 WITH PASSWORD 'db1'; +# CREATE DATABASE db1; +# GRANT ALL PRIVILEGES ON DATABASE db1 TO db1; +# EOSQL +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER db2 WITH PASSWORD 'db2'; +# CREATE DATABASE db2; +# GRANT ALL PRIVILEGES ON DATABASE db2 TO db2; +# EOSQL +# +# psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL +# CREATE USER db3 WITH PASSWORD 'db3'; +# CREATE DATABASE db3; +# GRANT ALL PRIVILEGES ON DATABASE db3 TO db3; +# EOSQL +# +### default database and user for confluence ############################################## +if [ "$POSTGRES_CONFLUENCE_INIT" == 'true' ]; then + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + CREATE USER $POSTGRES_CONFLUENCE_USER WITH PASSWORD '$POSTGRES_CONFLUENCE_PASSWORD'; + CREATE DATABASE $POSTGRES_CONFLUENCE_DB; + GRANT ALL PRIVILEGES ON DATABASE $POSTGRES_CONFLUENCE_DB TO $POSTGRES_CONFLUENCE_USER; + ALTER ROLE $POSTGRES_CONFLUENCE_USER CREATEROLE SUPERUSER; + EOSQL + echo +fi \ No newline at end of file From ca80dd169474c6994efc347eaf79cb3e8fee815e Mon Sep 17 00:00:00 2001 From: Artyom Mezin Date: Wed, 19 Jun 2019 12:21:28 +0300 Subject: [PATCH 017/861] Add laravel installer for root user (#2176) --- workspace/Dockerfile | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 4d405da991..3a07eee286 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -124,6 +124,10 @@ COPY ./auth.json /home/laradock/.composer/auth.json # Make sure that ~/.composer belongs to laradock RUN chown -R laradock:laradock /home/laradock/.composer +# Export composer vendor path +RUN echo "" >> ~/.bashrc && \ + echo 'export PATH="$HOME/.composer/vendor/bin:$PATH"' >> ~/.bashrc + USER laradock # Check if global install need to be ran @@ -715,6 +719,15 @@ RUN if [ ${INSTALL_LARAVEL_ENVOY} = true ]; then \ USER laradock +ARG INSTALL_LARAVEL_INSTALLER=false + +RUN if [ ${INSTALL_LARAVEL_INSTALLER} = true ]; then \ + # Install the Laravel Installer + composer global require "laravel/installer" \ +;fi + +USER root + ARG COMPOSER_REPO_PACKAGIST ENV COMPOSER_REPO_PACKAGIST ${COMPOSER_REPO_PACKAGIST} From a2c7b467662706ba1af118048baeaf6e27f6a74d Mon Sep 17 00:00:00 2001 From: StefanT123 Date: Wed, 19 Jun 2019 16:46:22 +0200 Subject: [PATCH 018/861] Added graylog to the list of softwares. (#2177) --- DOCUMENTATION/content/documentation/index.md | 46 +- docker-compose.yml | 32 +- env-example | 18 +- graylog/Dockerfile | 3 + graylog/config/graylog.conf | 481 +++++++++++++++++++ graylog/config/log4j2.xml | 35 ++ 6 files changed, 603 insertions(+), 12 deletions(-) create mode 100644 graylog/Dockerfile create mode 100644 graylog/config/graylog.conf create mode 100644 graylog/config/log4j2.xml diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index f5232592e3..91693705e7 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -398,29 +398,29 @@ Always download the latest version of [Loaders for ionCube ](http://www.ioncube. ## Install SonarQube (automatic code review tool) -SonarQube® is an automatic code review tool to detect bugs, vulnerabilities and code smells in your code. It can integrate with your existing workflow to enable continuous code inspection across your project branches and pull requests. +SonarQube® is an automatic code review tool to detect bugs, vulnerabilities and code smells in your code. It can integrate with your existing workflow to enable continuous code inspection across your project branches and pull requests.
-1 - Open the `.env` file +1 - Open the `.env` file
-2 - Search for the `SONARQUBE_HOSTNAME=sonar.example.com` argument +2 - Search for the `SONARQUBE_HOSTNAME=sonar.example.com` argument
-3 - Set it to your-domain `sonar.example.com` +3 - Set it to your-domain `sonar.example.com`
-4 - `docker-compose up -d sonarqube` +4 - `docker-compose up -d sonarqube`
5 - Open your browser: http://localhost:9000/ -Troubleshooting: +Troubleshooting: if you encounter a database error: ``` -docker-compose exec --user=root postgres +docker-compose exec --user=root postgres source docker-entrypoint-initdb.d/init_sonarqube_db.sh ``` If you encounter logs error: ``` -docker-compose run --user=root --rm sonarqube chown sonarqube:sonarqube /opt/sonarqube/logs +docker-compose run --user=root --rm sonarqube chown sonarqube:sonarqube /opt/sonarqube/logs ``` [**SonarQube Documentation Here**](https://docs.sonarqube.org/latest/) @@ -1267,6 +1267,36 @@ docker-compose up -d grafana +
+ +## Use Graylog + +1 - Boot the container `docker-compose up -d graylog` + +2 - Open your Laravel's `.env` file and set the `GRAYLOG_PASSWORD` to some passsword, and `GRAYLOG_SHA256_PASSWORD` to the sha256 representation of your password (`GRAYLOG_SHA256_PASSWORD` is what matters, `GRAYLOG_PASSWORD` is just a reminder of your password). + +> Your password must be at least 16 characters long +> You can generate sha256 of some password with the following command `echo -n somesupersecretpassword | sha256sum` + +```env +GRAYLOG_PASSWORD=somesupersecretpassword +GRAYLOG_SHA256_PASSWORD=b1cb6e31e172577918c9e7806c572b5ed8477d3f57aa737bee4b5b1db3696f09 +``` + +3 - Go to `http://localhost:9000/` (if your port is not changed) + +4 - Authenticate from the app. + +> Username: admin +> Password: somesupersecretpassword (if you haven't changed the password) + +5 - Go to the system->inputs and launch new input + + + + + +
## Use Traefik diff --git a/docker-compose.yml b/docker-compose.yml index 1a729e87be..a136f74176 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -821,6 +821,36 @@ services: networks: - backend +### Graylog ####################################### + graylog: + build: ./graylog + environment: + - GRAYLOG_PASSWORD_SECRET=${GRAYLOG_PASSWORD} + - GRAYLOG_ROOT_PASSWORD_SHA2=${GRAYLOG_SHA256_PASSWORD} + - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:${GRAYLOG_PORT}/ + links: + - mongo + - elasticsearch + depends_on: + - mongo + - elasticsearch + ports: + # Graylog web interface and REST API + - ${GRAYLOG_PORT}:9000 + # Syslog TCP + - ${GRAYLOG_SYSLOG_TCP_PORT}:514 + # Syslog UDP + - ${GRAYLOG_SYSLOG_UDP_PORT}:514/udp + # GELF TCP + - ${GRAYLOG_GELF_TCP_PORT}:12201 + # GELF UDP + - ${GRAYLOG_GELF_UDP_PORT}:12201/udp + user: root + volumes: + - ./graylog/config:/usr/share/graylog/data/config + networks: + - backend + ### Laravel Echo Server ####################################### laravel-echo-server: build: @@ -1461,7 +1491,7 @@ services: ports: - "${MANTICORE_API_PORT}:9312" - "${MANTICORE_SPHINXQL_PORT}:9306" - - "${MANTICORE_HTTP_PORT}:9308" + - "${MANTICORE_HTTP_PORT}:9308" networks: - backend diff --git a/env-example b/env-example index 6bc5a3f3a5..8a7545249b 100644 --- a/env-example +++ b/env-example @@ -387,6 +387,18 @@ CONFLUENCE_HOST_HTTP_PORT=8090 GRAFANA_PORT=3000 +### GRAYLOG ############################################### + +# password must be 16 characters long +GRAYLOG_PASSWORD=somesupersecretpassword +# sha256 representation of the password +GRAYLOG_SHA256_PASSWORD=b1cb6e31e172577918c9e7806c572b5ed8477d3f57aa737bee4b5b1db3696f09 +GRAYLOG_PORT=9000 +GRAYLOG_SYSLOG_TCP_PORT=514 +GRAYLOG_SYSLOG_UDP_PORT=514 +GRAYLOG_GELF_TCP_PORT=12201 +GRAYLOG_GELF_UDP_PORT=12201 + ### BLACKFIRE ############################################# # Create an account on blackfire.io. Don't enable blackfire and xDebug at the same time. # visit https://blackfire.io/docs/24-days/06-installation#install-probe-debian for more info. @@ -704,12 +716,12 @@ PGADMIN_DEFAULT_EMAIL=pgadmin4@pgadmin.org PGADMIN_DEFAULT_PASSWORD=admin ### SONARQUBE ################################################ -## docker-compose up -d sonarqube +## docker-compose up -d sonarqube ## (If you encounter a database error) -## docker-compose exec --user=root postgres +## docker-compose exec --user=root postgres ## source docker-entrypoint-initdb.d/init_sonarqube_db.sh ## (If you encounter logs error) -## docker-compose run --user=root --rm sonarqube chown sonarqube:sonarqube /opt/sonarqube/logs +## docker-compose run --user=root --rm sonarqube chown sonarqube:sonarqube /opt/sonarqube/logs SONARQUBE_HOSTNAME=sonar.example.com SONARQUBE_PORT=9000 diff --git a/graylog/Dockerfile b/graylog/Dockerfile new file mode 100644 index 0000000000..c9b220946d --- /dev/null +++ b/graylog/Dockerfile @@ -0,0 +1,3 @@ +FROM graylog/graylog:3.0 + +EXPOSE 9000 diff --git a/graylog/config/graylog.conf b/graylog/config/graylog.conf new file mode 100644 index 0000000000..ff8200bbfc --- /dev/null +++ b/graylog/config/graylog.conf @@ -0,0 +1,481 @@ +############################ +# GRAYLOG CONFIGURATION FILE +############################ +# +# This is the Graylog configuration file. The file has to use ISO 8859-1/Latin-1 character encoding. +# Characters that cannot be directly represented in this encoding can be written using Unicode escapes +# as defined in https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.3, using the \u prefix. +# For example, \u002c. +# +# * Entries are generally expected to be a single line of the form, one of the following: +# +# propertyName=propertyValue +# propertyName:propertyValue +# +# * White space that appears between the property name and property value is ignored, +# so the following are equivalent: +# +# name=Stephen +# name = Stephen +# +# * White space at the beginning of the line is also ignored. +# +# * Lines that start with the comment characters ! or # are ignored. Blank lines are also ignored. +# +# * The property value is generally terminated by the end of the line. White space following the +# property value is not ignored, and is treated as part of the property value. +# +# * A property value can span several lines if each line is terminated by a backslash (‘\’) character. +# For example: +# +# targetCities=\ +# Detroit,\ +# Chicago,\ +# Los Angeles +# +# This is equivalent to targetCities=Detroit,Chicago,Los Angeles (white space at the beginning of lines is ignored). +# +# * The characters newline, carriage return, and tab can be inserted with characters \n, \r, and \t, respectively. +# +# * The backslash character must be escaped as a double backslash. For example: +# +# path=c:\\docs\\doc1 +# + +# If you are running more than one instances of Graylog server you have to select one of these +# instances as master. The master will perform some periodical tasks that non-masters won't perform. +is_master = true + +# The auto-generated node ID will be stored in this file and read after restarts. It is a good idea +# to use an absolute file path here if you are starting Graylog server from init scripts or similar. +node_id_file = /usr/share/graylog/data/config/node-id + +# You MUST set a secret to secure/pepper the stored user passwords here. Use at least 64 characters. +# Generate one by using for example: pwgen -N 1 -s 96 +password_secret = replacethiswithyourownsecret! + +# The default root user is named 'admin' +#root_username = admin + +# You MUST specify a hash password for the root user (which you only need to initially set up the +# system and in case you lose connectivity to your authentication backend) +# This password cannot be changed using the API or via the web interface. If you need to change it, +# modify it in this file. +# Create one by using for example: echo -n yourpassword | shasum -a 256 +# and put the resulting hash value into the following line + +# Default password: admin +# CHANGE THIS! +root_password_sha2 = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 + +# The email address of the root user. +# Default is empty +#root_email = "" + +# The time zone setting of the root user. See http://www.joda.org/joda-time/timezones.html for a list of valid time zones. +# Default is UTC +#root_timezone = UTC + +# Set plugin directory here (relative or absolute) +plugin_dir = /usr/share/graylog/plugin + +############### +# HTTP settings +############### + +#### HTTP bind address +# +# The network interface used by the Graylog HTTP interface. +# +# This network interface must be accessible by all Graylog nodes in the cluster and by all clients +# using the Graylog web interface. +# +# If the port is omitted, Graylog will use port 9000 by default. +# +# Default: 127.0.0.1:9000 +#http_bind_address = 127.0.0.1:9000 +#http_bind_address = [2001:db8::1]:9000 +http_bind_address = 0.0.0.0:9000 + +#### HTTP publish URI +# +# The HTTP URI of this Graylog node which is used to communicate with the other Graylog nodes in the cluster and by all +# clients using the Graylog web interface. +# +# The URI will be published in the cluster discovery APIs, so that other Graylog nodes will be able to find and connect to this Graylog node. +# +# This configuration setting has to be used if this Graylog node is available on another network interface than $http_bind_address, +# for example if the machine has multiple network interfaces or is behind a NAT gateway. +# +# If $http_bind_address contains a wildcard IPv4 address (0.0.0.0), the first non-loopback IPv4 address of this machine will be used. +# This configuration setting *must not* contain a wildcard address! +# +# Default: http://$http_bind_address/ +#http_publish_uri = http://192.168.1.1:9000/ + +#### External Graylog URI +# +# The public URI of Graylog which will be used by the Graylog web interface to communicate with the Graylog REST API. +# +# The external Graylog URI usually has to be specified, if Graylog is running behind a reverse proxy or load-balancer +# and it will be used to generate URLs addressing entities in the Graylog REST API (see $http_bind_address). +# +# When using Graylog Collector, this URI will be used to receive heartbeat messages and must be accessible for all collectors. +# +# This setting can be overriden on a per-request basis with the "X-Graylog-Server-URL" HTTP request header. +# +# Default: $http_publish_uri +#http_external_uri = + +#### Enable CORS headers for HTTP interface +# +# This is necessary for JS-clients accessing the server directly. +# If these are disabled, modern browsers will not be able to retrieve resources from the server. +# This is enabled by default. Uncomment the next line to disable it. +#http_enable_cors = false + +#### Enable GZIP support for HTTP interface +# +# This compresses API responses and therefore helps to reduce +# overall round trip times. This is enabled by default. Uncomment the next line to disable it. +#http_enable_gzip = false + +# The maximum size of the HTTP request headers in bytes. +#http_max_header_size = 8192 + +# The size of the thread pool used exclusively for serving the HTTP interface. +#http_thread_pool_size = 16 + +################ +# HTTPS settings +################ + +#### Enable HTTPS support for the HTTP interface +# +# This secures the communication with the HTTP interface with TLS to prevent request forgery and eavesdropping. +# +# Default: false +#http_enable_tls = true + +# The X.509 certificate chain file in PEM format to use for securing the HTTP interface. +#http_tls_cert_file = /path/to/graylog.crt + +# The PKCS#8 private key file in PEM format to use for securing the HTTP interface. +#http_tls_key_file = /path/to/graylog.key + +# The password to unlock the private key used for securing the HTTP interface. +#http_tls_key_password = secret + + +# Comma separated list of trusted proxies that are allowed to set the client address with X-Forwarded-For +# header. May be subnets, or hosts. +#trusted_proxies = 127.0.0.1/32, 0:0:0:0:0:0:0:1/128 + +# List of Elasticsearch hosts Graylog should connect to. +# Need to be specified as a comma-separated list of valid URIs for the http ports of your elasticsearch nodes. +# If one or more of your elasticsearch hosts require authentication, include the credentials in each node URI that +# requires authentication. +# +# Default: http://127.0.0.1:9200 +elasticsearch_hosts = http://elasticsearch:9200 + +# Maximum amount of time to wait for successfull connection to Elasticsearch HTTP port. +# +# Default: 10 Seconds +#elasticsearch_connect_timeout = 10s + +# Maximum amount of time to wait for reading back a response from an Elasticsearch server. +# +# Default: 60 seconds +#elasticsearch_socket_timeout = 60s + +# Maximum idle time for an Elasticsearch connection. If this is exceeded, this connection will +# be tore down. +# +# Default: inf +#elasticsearch_idle_timeout = -1s + +# Maximum number of total connections to Elasticsearch. +# +# Default: 20 +#elasticsearch_max_total_connections = 20 + +# Maximum number of total connections per Elasticsearch route (normally this means per +# elasticsearch server). +# +# Default: 2 +#elasticsearch_max_total_connections_per_route = 2 + +# Maximum number of times Graylog will retry failed requests to Elasticsearch. +# +# Default: 2 +#elasticsearch_max_retries = 2 + +# Enable automatic Elasticsearch node discovery through Nodes Info, +# see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/cluster-nodes-info.html +# +# WARNING: Automatic node discovery does not work if Elasticsearch requires authentication, e. g. with Shield. +# +# Default: false +#elasticsearch_discovery_enabled = true + +# Filter for including/excluding Elasticsearch nodes in discovery according to their custom attributes, +# see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/cluster.html#cluster-nodes +# +# Default: empty +#elasticsearch_discovery_filter = rack:42 + +# Frequency of the Elasticsearch node discovery. +# +# Default: 30s +# elasticsearch_discovery_frequency = 30s + +# Enable payload compression for Elasticsearch requests. +# +# Default: false +#elasticsearch_compression_enabled = true + +# Disable checking the version of Elasticsearch for being compatible with this Graylog release. +# WARNING: Using Graylog with unsupported and untested versions of Elasticsearch may lead to data loss! +#elasticsearch_disable_version_check = true + +# Disable message retention on this node, i. e. disable Elasticsearch index rotation. +#no_retention = false + +# Do you want to allow searches with leading wildcards? This can be extremely resource hungry and should only +# be enabled with care. See also: http://docs.graylog.org/en/2.1/pages/queries.html +allow_leading_wildcard_searches = false + +# Do you want to allow searches to be highlighted? Depending on the size of your messages this can be memory hungry and +# should only be enabled after making sure your Elasticsearch cluster has enough memory. +allow_highlighting = false + +# Global request timeout for Elasticsearch requests (e. g. during search, index creation, or index time-range +# calculations) based on a best-effort to restrict the runtime of Elasticsearch operations. +# Default: 1m +#elasticsearch_request_timeout = 1m + +# Global timeout for index optimization (force merge) requests. +# Default: 1h +#elasticsearch_index_optimization_timeout = 1h + +# Maximum number of concurrently running index optimization (force merge) jobs. +# If you are using lots of different index sets, you might want to increase that number. +# Default: 20 +#elasticsearch_index_optimization_jobs = 20 + +# Time interval for index range information cleanups. This setting defines how often stale index range information +# is being purged from the database. +# Default: 1h +#index_ranges_cleanup_interval = 1h + +# Batch size for the Elasticsearch output. This is the maximum (!) number of messages the Elasticsearch output +# module will get at once and write to Elasticsearch in a batch call. If the configured batch size has not been +# reached within output_flush_interval seconds, everything that is available will be flushed at once. Remember +# that every outputbuffer processor manages its own batch and performs its own batch write calls. +# ("outputbuffer_processors" variable) +output_batch_size = 500 + +# Flush interval (in seconds) for the Elasticsearch output. This is the maximum amount of time between two +# batches of messages written to Elasticsearch. It is only effective at all if your minimum number of messages +# for this time period is less than output_batch_size * outputbuffer_processors. +output_flush_interval = 1 + +# As stream outputs are loaded only on demand, an output which is failing to initialize will be tried over and +# over again. To prevent this, the following configuration options define after how many faults an output will +# not be tried again for an also configurable amount of seconds. +output_fault_count_threshold = 5 +output_fault_penalty_seconds = 30 + +# The number of parallel running processors. +# Raise this number if your buffers are filling up. +processbuffer_processors = 5 +outputbuffer_processors = 3 + +# The following settings (outputbuffer_processor_*) configure the thread pools backing each output buffer processor. +# See https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html for technical details + +# When the number of threads is greater than the core (see outputbuffer_processor_threads_core_pool_size), +# this is the maximum time in milliseconds that excess idle threads will wait for new tasks before terminating. +# Default: 5000 +#outputbuffer_processor_keep_alive_time = 5000 + +# The number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set +# Default: 3 +#outputbuffer_processor_threads_core_pool_size = 3 + +# The maximum number of threads to allow in the pool +# Default: 30 +#outputbuffer_processor_threads_max_pool_size = 30 + +# UDP receive buffer size for all message inputs (e. g. SyslogUDPInput). +#udp_recvbuffer_sizes = 1048576 + +# Wait strategy describing how buffer processors wait on a cursor sequence. (default: sleeping) +# Possible types: +# - yielding +# Compromise between performance and CPU usage. +# - sleeping +# Compromise between performance and CPU usage. Latency spikes can occur after quiet periods. +# - blocking +# High throughput, low latency, higher CPU usage. +# - busy_spinning +# Avoids syscalls which could introduce latency jitter. Best when threads can be bound to specific CPU cores. +processor_wait_strategy = blocking + +# Size of internal ring buffers. Raise this if raising outputbuffer_processors does not help anymore. +# For optimum performance your LogMessage objects in the ring buffer should fit in your CPU L3 cache. +# Must be a power of 2. (512, 1024, 2048, ...) +ring_size = 65536 + +inputbuffer_ring_size = 65536 +inputbuffer_processors = 2 +inputbuffer_wait_strategy = blocking + +# Enable the disk based message journal. +message_journal_enabled = true + +# The directory which will be used to store the message journal. The directory must me exclusively used by Graylog and +# must not contain any other files than the ones created by Graylog itself. +# +# ATTENTION: +# If you create a seperate partition for the journal files and use a file system creating directories like 'lost+found' +# in the root directory, you need to create a sub directory for your journal. +# Otherwise Graylog will log an error message that the journal is corrupt and Graylog will not start. +message_journal_dir = /usr/share/graylog/data/journal + +# Journal hold messages before they could be written to Elasticsearch. +# For a maximum of 12 hours or 5 GB whichever happens first. +# During normal operation the journal will be smaller. +#message_journal_max_age = 12h +#message_journal_max_size = 5gb + +#message_journal_flush_age = 1m +#message_journal_flush_interval = 1000000 +#message_journal_segment_age = 1h +#message_journal_segment_size = 100mb + +# Number of threads used exclusively for dispatching internal events. Default is 2. +#async_eventbus_processors = 2 + +# How many seconds to wait between marking node as DEAD for possible load balancers and starting the actual +# shutdown process. Set to 0 if you have no status checking load balancers in front. +lb_recognition_period_seconds = 3 + +# Journal usage percentage that triggers requesting throttling for this server node from load balancers. The feature is +# disabled if not set. +#lb_throttle_threshold_percentage = 95 + +# Every message is matched against the configured streams and it can happen that a stream contains rules which +# take an unusual amount of time to run, for example if its using regular expressions that perform excessive backtracking. +# This will impact the processing of the entire server. To keep such misbehaving stream rules from impacting other +# streams, Graylog limits the execution time for each stream. +# The default values are noted below, the timeout is in milliseconds. +# If the stream matching for one stream took longer than the timeout value, and this happened more than "max_faults" times +# that stream is disabled and a notification is shown in the web interface. +#stream_processing_timeout = 2000 +#stream_processing_max_faults = 3 + +# Length of the interval in seconds in which the alert conditions for all streams should be checked +# and alarms are being sent. +#alert_check_interval = 60 + +# Since 0.21 the Graylog server supports pluggable output modules. This means a single message can be written to multiple +# outputs. The next setting defines the timeout for a single output module, including the default output module where all +# messages end up. +# +# Time in milliseconds to wait for all message outputs to finish writing a single message. +#output_module_timeout = 10000 + +# Time in milliseconds after which a detected stale master node is being rechecked on startup. +#stale_master_timeout = 2000 + +# Time in milliseconds which Graylog is waiting for all threads to stop on shutdown. +#shutdown_timeout = 30000 + +# MongoDB connection string +# See https://docs.mongodb.com/manual/reference/connection-string/ for details +mongodb_uri = mongodb://mongo/graylog + +# Authenticate against the MongoDB server +#mongodb_uri = mongodb://grayloguser:secret@mongo:27017/graylog + +# Use a replica set instead of a single host +#mongodb_uri = mongodb://grayloguser:secret@mongo:27017,mongo:27018,mongo:27019/graylog + +# Increase this value according to the maximum connections your MongoDB server can handle from a single client +# if you encounter MongoDB connection problems. +mongodb_max_connections = 100 + +# Number of threads allowed to be blocked by MongoDB connections multiplier. Default: 5 +# If mongodb_max_connections is 100, and mongodb_threads_allowed_to_block_multiplier is 5, +# then 500 threads can block. More than that and an exception will be thrown. +# http://api.mongodb.com/java/current/com/mongodb/MongoOptions.html#threadsAllowedToBlockForConnectionMultiplier +mongodb_threads_allowed_to_block_multiplier = 5 + +# Drools Rule File (Use to rewrite incoming log messages) +# See: http://docs.graylog.org/en/2.1/pages/drools.html +#rules_file = /etc/graylog/server/rules.drl + +# Email transport +#transport_email_enabled = false +#transport_email_hostname = mail.example.com +#transport_email_port = 587 +#transport_email_use_auth = true +#transport_email_use_tls = true +#transport_email_use_ssl = true +#transport_email_auth_username = you@example.com +#transport_email_auth_password = secret +#transport_email_subject_prefix = [graylog] +#transport_email_from_email = graylog@example.com + +# Specify and uncomment this if you want to include links to the stream in your stream alert mails. +# This should define the fully qualified base url to your web interface exactly the same way as it is accessed by your users. +#transport_email_web_interface_url = https://graylog.example.com + +# The default connect timeout for outgoing HTTP connections. +# Values must be a positive duration (and between 1 and 2147483647 when converted to milliseconds). +# Default: 5s +#http_connect_timeout = 5s + +# The default read timeout for outgoing HTTP connections. +# Values must be a positive duration (and between 1 and 2147483647 when converted to milliseconds). +# Default: 10s +#http_read_timeout = 10s + +# The default write timeout for outgoing HTTP connections. +# Values must be a positive duration (and between 1 and 2147483647 when converted to milliseconds). +# Default: 10s +#http_write_timeout = 10s + +# HTTP proxy for outgoing HTTP connections +#http_proxy_uri = + +# The threshold of the garbage collection runs. If GC runs take longer than this threshold, a system notification +# will be generated to warn the administrator about possible problems with the system. Default is 1 second. +#gc_warning_threshold = 1s + +# Connection timeout for a configured LDAP server (e. g. ActiveDirectory) in milliseconds. +#ldap_connection_timeout = 2000 + +# Disable the use of SIGAR for collecting system stats +#disable_sigar = false + +# The default cache time for dashboard widgets. (Default: 10 seconds, minimum: 1 second) +#dashboard_widget_default_cache_time = 10s + +# Automatically load content packs in "content_packs_dir" on the first start of Graylog. +content_packs_loader_enabled = true + +# The directory which contains content packs which should be loaded on the first start of Graylog. +content_packs_dir = /usr/share/graylog/data/contentpacks + +# A comma-separated list of content packs (files in "content_packs_dir") which should be applied on +# the first start of Graylog. +# Default: empty +content_packs_auto_load = grok-patterns.json + +# For some cluster-related REST requests, the node must query all other nodes in the cluster. This is the maximum number +# of threads available for this. Increase it, if '/cluster/*' requests take long to complete. +# Should be http_thread_pool_size * average_cluster_size if you have a high number of concurrent users. +proxied_requests_thread_pool_size = 32 diff --git a/graylog/config/log4j2.xml b/graylog/config/log4j2.xml new file mode 100644 index 0000000000..03d1d12da2 --- /dev/null +++ b/graylog/config/log4j2.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5d56cc83e64b4311854c22a024a4c7c652e95fda Mon Sep 17 00:00:00 2001 From: "Daniel F. J. Dantur" Date: Sat, 29 Jun 2019 01:34:49 -0300 Subject: [PATCH 019/861] Add LOG_STDOUT and LOG_SDERR required environment variables Fixes Apache crashes due permission errors related to log files docker.stdout and docker.stderr. Logs are now created in /var/log/apache2 as defined in docker-compose.yml apahce2 volumes. Logs are named access.log and error.log like the Apache default log names are. --- apache2/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apache2/Dockerfile b/apache2/Dockerfile index 71cad50153..58cc12ff48 100644 --- a/apache2/Dockerfile +++ b/apache2/Dockerfile @@ -13,6 +13,10 @@ ENV WEB_DOCUMENT_ROOT=${DOCUMENT_ROOT} ENV WEB_PHP_TIMEOUT=${PHP_UPSTREAM_TIMEOUT} +ENV LOG_STDOUT=/var/log/apache2/access.log + +ENV LOG_STDERR=/var/log/apache2/error.log + EXPOSE 80 443 WORKDIR /var/www/ From e9eacfafa7d2fe23bf23ff2aaaeb6adcd63027bd Mon Sep 17 00:00:00 2001 From: skipworkgh Date: Tue, 2 Jul 2019 16:11:58 +0200 Subject: [PATCH 020/861] Added support for the mailparse php pecl extension --- docker-compose.yml | 2 ++ env-example | 2 ++ php-fpm/Dockerfile | 13 +++++++++++++ workspace/Dockerfile | 10 ++++++++++ 4 files changed, 27 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index a136f74176..4babebc3eb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -106,6 +106,7 @@ services: - INSTALL_MYSQL_CLIENT=${WORKSPACE_INSTALL_MYSQL_CLIENT} - INSTALL_PING=${WORKSPACE_INSTALL_PING} - INSTALL_SSHPASS=${WORKSPACE_INSTALL_SSHPASS} + - INSTALL_MAILPARSE=${WORKSPACE_INSTALL_MAILPARSE} - PUID=${WORKSPACE_PUID} - PGID=${WORKSPACE_PGID} - CHROME_DRIVER_VERSION=${WORKSPACE_CHROME_DRIVER_VERSION} @@ -183,6 +184,7 @@ services: - INSTALL_MYSQL_CLIENT=${PHP_FPM_INSTALL_MYSQL_CLIENT} - INSTALL_PING=${PHP_FPM_INSTALL_PING} - INSTALL_SSHPASS=${PHP_FPM_INSTALL_SSHPASS} + - INSTALL_MAILPARSE=${PHP_FPM_INSTALL_MAILPARSE} - ADDITIONAL_LOCALES=${PHP_FPM_ADDITIONAL_LOCALES} - INSTALL_FFMPEG=${PHP_FPM_FFMPEG} - http_proxy diff --git a/env-example b/env-example index 8a7545249b..2e38d39ff0 100644 --- a/env-example +++ b/env-example @@ -137,6 +137,7 @@ WORKSPACE_INSTALL_PING=false WORKSPACE_INSTALL_SSHPASS=false WORKSPACE_INSTALL_INOTIFY=false WORKSPACE_INSTALL_FSWATCH=false +WORKSPACE_INSTALL_MAILPARSE=true WORKSPACE_PUID=1000 WORKSPACE_PGID=1000 WORKSPACE_CHROME_DRIVER_VERSION=2.42 @@ -188,6 +189,7 @@ PHP_FPM_INSTALL_ADDITIONAL_LOCALES=false PHP_FPM_INSTALL_MYSQL_CLIENT=false PHP_FPM_INSTALL_PING=false PHP_FPM_INSTALL_SSHPASS=false +PHP_FPM_INSTALL_MAILPARSE=true PHP_FPM_FFMPEG=false PHP_FPM_ADDITIONAL_LOCALES="es_ES.UTF-8 fr_FR.UTF-8" diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index ab6ba6b086..bc7112a43b 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -725,6 +725,19 @@ RUN if [ ${INSTALL_FFMPEG} = true ]; then \ apt-get -y install ffmpeg \ ;fi +########################################################################### +# Mailparse extension: +########################################################################### + +ARG INSTALL_MAILPARSE=false + +RUN if [ ${INSTALL_MAILPARSE} = true ]; then \ + # Install mailparse extension + printf "\n" | pecl install -o -f mailparse \ + && rm -rf /tmp/pear \ + && docker-php-ext-enable mailparse \ +;fi + ########################################################################### # Check PHP version: ########################################################################### diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 3a07eee286..32d2c24c12 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -1057,6 +1057,16 @@ RUN if [ ${INSTALL_FFMPEG} = true ]; then \ apt-get -y install ffmpeg \ ;fi +########################################################################### +# Mailparse extension: +########################################################################### + +ARG INSTALL_MAILPARSE=false + +RUN if [ ${INSTALL_MAILPARSE} = true ]; then \ + apt-get install -yqq php-mailparse \ +;fi + ########################################################################### # GNU Parallel: ########################################################################### From 9a0f9cfa74876b0bcda19561e270c63a360cd810 Mon Sep 17 00:00:00 2001 From: skipworkgh Date: Tue, 2 Jul 2019 16:36:08 +0200 Subject: [PATCH 021/861] Lets not enable them by default... --- env-example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/env-example b/env-example index 2e38d39ff0..f0fa329757 100644 --- a/env-example +++ b/env-example @@ -137,7 +137,7 @@ WORKSPACE_INSTALL_PING=false WORKSPACE_INSTALL_SSHPASS=false WORKSPACE_INSTALL_INOTIFY=false WORKSPACE_INSTALL_FSWATCH=false -WORKSPACE_INSTALL_MAILPARSE=true +WORKSPACE_INSTALL_MAILPARSE=false WORKSPACE_PUID=1000 WORKSPACE_PGID=1000 WORKSPACE_CHROME_DRIVER_VERSION=2.42 @@ -189,7 +189,7 @@ PHP_FPM_INSTALL_ADDITIONAL_LOCALES=false PHP_FPM_INSTALL_MYSQL_CLIENT=false PHP_FPM_INSTALL_PING=false PHP_FPM_INSTALL_SSHPASS=false -PHP_FPM_INSTALL_MAILPARSE=true +PHP_FPM_INSTALL_MAILPARSE=false PHP_FPM_FFMPEG=false PHP_FPM_ADDITIONAL_LOCALES="es_ES.UTF-8 fr_FR.UTF-8" From f73a66da131c374758ef706f2e89e2424a33f379 Mon Sep 17 00:00:00 2001 From: Rex Tsou Date: Thu, 4 Jul 2019 15:05:03 +0800 Subject: [PATCH 022/861] Fix php-fpm build fail (php5) pecl redis no longer support php5 --- php-fpm/Dockerfile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index ab6ba6b086..fb306b3b7f 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -197,9 +197,13 @@ ARG INSTALL_PHPREDIS=false RUN if [ ${INSTALL_PHPREDIS} = true ]; then \ # Install Php Redis Extension - printf "\n" | pecl install -o -f redis \ - && rm -rf /tmp/pear \ - && docker-php-ext-enable redis \ + if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \ + pecl install -o -f redis-4.3.0; \ + else \ + pecl install -o -f redis; \ + fi \ + && rm -rf /tmp/pear \ + && docker-php-ext-enable redis \ ;fi ########################################################################### From f8ec06ac1cd32aee0f5083fe847b6b510c04fa02 Mon Sep 17 00:00:00 2001 From: anribras Date: Sat, 6 Jul 2019 17:41:11 +0800 Subject: [PATCH 023/861] Add mariadb timezone setting via WORKSPACE_TIMEZONE in .env --- docker-compose.yml | 1 + mariadb/Dockerfile | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index a136f74176..49a4c3a9d4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -407,6 +407,7 @@ services: ports: - "${MARIADB_PORT}:3306" environment: + - TZ=${WORKSPACE_TIMEZONE} - MYSQL_DATABASE=${MARIADB_DATABASE} - MYSQL_USER=${MARIADB_USER} - MYSQL_PASSWORD=${MARIADB_PASSWORD} diff --git a/mariadb/Dockerfile b/mariadb/Dockerfile index 0dcb948199..7538b4e26c 100644 --- a/mariadb/Dockerfile +++ b/mariadb/Dockerfile @@ -2,6 +2,13 @@ FROM mariadb:latest LABEL maintainer="Mahmoud Zalt " +##################################### +# Set Timezone +##################################### + +ARG TZ=UTC +ENV TZ ${TZ} +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && chown -R mysql:root /var/lib/mysql/ COPY my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"] From cd80ca59df6589b88bb3e00b205ee23c3b82f835 Mon Sep 17 00:00:00 2001 From: Caesar Chi Date: Mon, 8 Jul 2019 23:36:07 +0800 Subject: [PATCH 024/861] gcloud registry auth step for docker build nowaday, the docker image build from gcloud registry, so you need auth the configure and login the gcloud first to build the docker image. --- DOCUMENTATION/content/getting-started/index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/DOCUMENTATION/content/getting-started/index.md b/DOCUMENTATION/content/getting-started/index.md index 8262ead11f..be9dba43b8 100644 --- a/DOCUMENTATION/content/getting-started/index.md +++ b/DOCUMENTATION/content/getting-started/index.md @@ -8,6 +8,7 @@ weight: 2 - [Git](https://git-scm.com/downloads) - [Docker](https://www.docker.com/products/docker/) `>= 17.12` +- [gcloud](https://cloud.google.com/sdk/install) @@ -24,6 +25,17 @@ Choose the setup the best suits your needs. - [A.2) Don't have a PHP project yet](#A2) - [B) Setup for Multiple Projects](#B) +### Setup gcloud for docker registry + +``` +gcloud auth configure-docker +``` + +and login to gcloud for use the registry and auth the permission. + +``` +gcloud auth login +``` ### A) Setup for Single Project From cd8dc6cc2226380a1da8b90ab389abdbb36b5b94 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Tue, 9 Jul 2019 21:50:05 +0200 Subject: [PATCH 025/861] fix the main image and update sponsors section --- .github/README.md | 13 +++--- DOCUMENTATION/content/introduction/index.md | 46 +++++++++------------ 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/.github/README.md b/.github/README.md index 834b878949..6a6148e062 100644 --- a/.github/README.md +++ b/.github/README.md @@ -24,16 +24,12 @@

- Laradock Docs + Laradock Docs

-## Sponsors - -Support this project by becoming a sponsor. - -Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website. [[Become a sponsor](https://opencollective.com/laradock#sponsor)] +## Sponsors @@ -43,9 +39,10 @@ Your logo will show up on the [github repository](https://github.com/laradock/la - - +For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io. + +Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website. ## Contributors diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 82c5b319f5..1fdd83e4f1 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -9,12 +9,29 @@ weight: 1 A full PHP development environment for Docker. -Includes pre-packaged Docker Images, all pre-configured to provide a wonderful PHP development environment. +Includes a lot of useful Docker Images, all pre-configured to provide a wonderful PHP development environment. -Laradock is well known in the Laravel community, as the project started with single focus on running Laravel projects on Docker. Later and due to the large adoption from the PHP community, it started supporting other PHP projects like Symfony, CodeIgniter, WordPress, Drupal... +![](https://raw.githubusercontent.com/laradock/laradock/master/.github/home-page-images/laradock-logo.jpg) -![](https://s19.postimg.org/jblfytw9f/laradock-logo.jpg) + + + + +## Sponsors + + + + + + + + + + +For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io. +
+Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website. ## Quick Overview @@ -116,29 +133,6 @@ If you can't find your Software in the list, build it yourself and submit it. Co -## Sponsors - - - - - -Support this project by becoming a sponsor. - -Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website. [[Become a sponsor](https://opencollective.com/laradock#sponsor)] - - - - - - - - - - - - - - ## What is Docker? From 9df9a90b12bd96d887088d811f1a5fd13865c9b7 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Tue, 9 Jul 2019 21:50:31 +0200 Subject: [PATCH 026/861] add txt file for google ads --- DOCUMENTATION/static/ads.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 DOCUMENTATION/static/ads.txt diff --git a/DOCUMENTATION/static/ads.txt b/DOCUMENTATION/static/ads.txt new file mode 100644 index 0000000000..2230196568 --- /dev/null +++ b/DOCUMENTATION/static/ads.txt @@ -0,0 +1 @@ +google.com, pub-9826129398689742, DIRECT, f08c47fec0942fa0 From 6003de2754167dc19f85a746a1fdc8eb1cc68db3 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Tue, 9 Jul 2019 21:57:10 +0200 Subject: [PATCH 027/861] update documentation button design --- .github/README.md | 2 +- .../home-page-images/documentation-button.png | Bin 0 -> 24622 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 .github/home-page-images/documentation-button.png diff --git a/.github/README.md b/.github/README.md index 6a6148e062..7614dd3b8f 100644 --- a/.github/README.md +++ b/.github/README.md @@ -24,7 +24,7 @@

- Laradock Docs + Laradock Docs

diff --git a/.github/home-page-images/documentation-button.png b/.github/home-page-images/documentation-button.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab17161925d30691efbe141f077d7be113ce6fe GIT binary patch literal 24622 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 literal 0 HcmV?d00001 From 8ae02d5d96ce7e7f6984c550a75496671ded7881 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Tue, 9 Jul 2019 21:58:23 +0200 Subject: [PATCH 028/861] fix button extension --- .github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 7614dd3b8f..dc3765378b 100644 --- a/.github/README.md +++ b/.github/README.md @@ -24,7 +24,7 @@

- Laradock Docs + Laradock Docs

From 60afd8feb3cfabbf84c7e4d4982a38c9c32574e0 Mon Sep 17 00:00:00 2001 From: Mahdi Hazaveh Date: Fri, 12 Jul 2019 09:57:17 +0800 Subject: [PATCH 029/861] run apt-get update before attempting to install php-redis on workspace container Fixes E: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/p/php-redis/php-redis_4.2.0-1+ubuntu16.04.1+deb.sury.org+1_amd64.deb 404 Not Found --- workspace/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 3a07eee286..6cb8bde842 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -414,6 +414,7 @@ RUN if [ ${INSTALL_AMQP} = true ]; then \ ARG INSTALL_PHPREDIS=false RUN if [ ${INSTALL_PHPREDIS} = true ]; then \ + apt-get update -yqq && \ apt-get install -yqq php-redis \ ;fi From 6eaf587803a8eb2957fc67ff68dafbab1cd387ad Mon Sep 17 00:00:00 2001 From: anribras Date: Sun, 14 Jul 2019 11:41:12 +0800 Subject: [PATCH 030/861] Add mariadb timezone setting via WORKSPACE_TIMEZONE in .env (#2197) --- docker-compose.yml | 1 + mariadb/Dockerfile | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index a136f74176..49a4c3a9d4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -407,6 +407,7 @@ services: ports: - "${MARIADB_PORT}:3306" environment: + - TZ=${WORKSPACE_TIMEZONE} - MYSQL_DATABASE=${MARIADB_DATABASE} - MYSQL_USER=${MARIADB_USER} - MYSQL_PASSWORD=${MARIADB_PASSWORD} diff --git a/mariadb/Dockerfile b/mariadb/Dockerfile index 0dcb948199..7538b4e26c 100644 --- a/mariadb/Dockerfile +++ b/mariadb/Dockerfile @@ -2,6 +2,13 @@ FROM mariadb:latest LABEL maintainer="Mahmoud Zalt " +##################################### +# Set Timezone +##################################### + +ARG TZ=UTC +ENV TZ ${TZ} +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && chown -R mysql:root /var/lib/mysql/ COPY my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"] From ce00c5ea278df5b29781d3c29e6e8cdfaddc945b Mon Sep 17 00:00:00 2001 From: airguillaume Date: Sun, 14 Jul 2019 05:44:21 +0200 Subject: [PATCH 031/861] Update to Elasticsearch 7.1.1 (#2179) * Update Elasticsearch to 7.1.1 * Removed unnecessary quotes --- docker-compose.yml | 4 +++- elasticsearch/Dockerfile | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 49a4c3a9d4..09d7ffb467 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -662,8 +662,10 @@ services: - elasticsearch:/usr/share/elasticsearch/data environment: - cluster.name=laradock-cluster + - node.name=laradock-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - cluster.initial_master_nodes=laradock-node ulimits: memlock: soft: -1 @@ -1531,4 +1533,4 @@ services: depends_on: - postgres volumes: - - ${DATA_PATH_HOST}/Confluence:/var/atlassian/application-data \ No newline at end of file + - ${DATA_PATH_HOST}/Confluence:/var/atlassian/application-data diff --git a/elasticsearch/Dockerfile b/elasticsearch/Dockerfile index d3ff4f4eca..dcc28741f8 100644 --- a/elasticsearch/Dockerfile +++ b/elasticsearch/Dockerfile @@ -1,3 +1,3 @@ -FROM docker.elastic.co/elasticsearch/elasticsearch:6.6.0 +FROM docker.elastic.co/elasticsearch/elasticsearch:7.1.1 EXPOSE 9200 9300 From 01eb934863ccf6b9b566470ebcbe0a53c4db2b15 Mon Sep 17 00:00:00 2001 From: Meng Ye <4025839+jk2K@users.noreply.github.com> Date: Sun, 14 Jul 2019 11:44:52 +0800 Subject: [PATCH 032/861] fix: exec: zookeeper: not found (#2199) refer to [Zookeeper latest 3.5.5 Dockerfile](https://github.com/31z4/zookeeper-docker/blob/c978f835bc33509324b51cb210c8c5c9934c38ff/3.5.5/Dockerfile) --- zookeeper/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zookeeper/Dockerfile b/zookeeper/Dockerfile index 8d5723deda..3fc8abd74b 100644 --- a/zookeeper/Dockerfile +++ b/zookeeper/Dockerfile @@ -7,4 +7,4 @@ VOLUME /datalog EXPOSE 2181 -CMD ["zookeeper"] +CMD ["zkServer.sh", "start-foreground"] From 4e257c8e8f810f9688c5dfbae7a6dc0b0e730696 Mon Sep 17 00:00:00 2001 From: zslavis <50221726+zslavis@users.noreply.github.com> Date: Sat, 13 Jul 2019 20:46:21 -0700 Subject: [PATCH 033/861] Update to include MARIADB_VERSION in env file which sets the mariadb version (#2185) --- docker-compose.yml | 1 + env-example | 1 + mariadb/Dockerfile | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 09d7ffb467..7edfa77c3c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -401,6 +401,7 @@ services: - http_proxy - https_proxy - no_proxy + - MARIADB_VERSION=${MARIADB_VERSION} volumes: - ${DATA_PATH_HOST}/mariadb:/var/lib/mysql - ${MARIADB_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d diff --git a/env-example b/env-example index 8a7545249b..a7bf59bc8f 100644 --- a/env-example +++ b/env-example @@ -269,6 +269,7 @@ MSSQL_PORT=1433 ### MARIADB ############################################### +MARIADB_VERSION=latest MARIADB_DATABASE=default MARIADB_USER=default MARIADB_PASSWORD=secret diff --git a/mariadb/Dockerfile b/mariadb/Dockerfile index 7538b4e26c..1d04826517 100644 --- a/mariadb/Dockerfile +++ b/mariadb/Dockerfile @@ -1,4 +1,5 @@ -FROM mariadb:latest +ARG MARIADB_VERSION=latest +FROM mariadb:${MARIADB_VERSION} LABEL maintainer="Mahmoud Zalt " From 4814490e2ad80e4bfcab1bd5bd9218072bf319ce Mon Sep 17 00:00:00 2001 From: Mahmoudz Date: Mon, 15 Jul 2019 18:59:43 +0200 Subject: [PATCH 034/861] enhance documentation readability --- .github/README.md | 14 +- DOCUMENTATION/config.toml | 16 +- DOCUMENTATION/content/contributing/index.md | 2 +- DOCUMENTATION/content/documentation/index.md | 162 +-- .../content/getting-started/index.md | 18 +- DOCUMENTATION/content/guides/index.md | 967 +++++++++--------- DOCUMENTATION/content/help/index.md | 120 ++- DOCUMENTATION/content/introduction/index.md | 135 ++- DOCUMENTATION/content/license/index.md | 2 +- .../content/related-projects/index.md | 2 +- 10 files changed, 729 insertions(+), 709 deletions(-) diff --git a/.github/README.md b/.github/README.md index dc3765378b..29b2cca83f 100644 --- a/.github/README.md +++ b/.github/README.md @@ -42,7 +42,7 @@ For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io. -Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website. +*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website.* ## Contributors @@ -71,18 +71,18 @@ Your logo will show up on the [github repository](https://github.com/laradock/la > Help keeping the project development going, by [contributing](http://laradock.io/contributing) or donating a little. > Thanks in advance. -Donate directly via [Paypal](https://www.paypal.me/mzalt) +Donate directly via [Paypal](https://paypal.me/mzmmzz) -[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/mzalt) - -or become a backer on [Open Collective](https://opencollective.com/laradock#backer) - - +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/mzmmzz) or show your support via [Beerpay](https://beerpay.io/laradock/laradock) [![Beerpay](https://beerpay.io/laradock/laradock/badge.svg?style=flat)](https://beerpay.io/laradock/laradock) +or become a backer on [Open Collective](https://opencollective.com/laradock#backer) + + + ## License diff --git a/DOCUMENTATION/config.toml b/DOCUMENTATION/config.toml index 91fd0724cc..8fd60626f9 100644 --- a/DOCUMENTATION/config.toml +++ b/DOCUMENTATION/config.toml @@ -48,42 +48,42 @@ googleAnalytics = "UA-37514928-9" # ------- MENU START ----------------------------------------- [[menu.main]] - name = "Introduction" + name = "1. Introduction" url = "introduction/" weight = 1 [[menu.main]] - name = "Getting Started" + name = "2. Getting Started" url = "getting-started/" weight = 2 [[menu.main]] - name = "Documentation" + name = "3. Documentation" url = "documentation/" weight = 3 [[menu.main]] - name = "Guides" + name = "4. Guides" url = "guides/" weight = 4 [[menu.main]] - name = "Help & Questions" + name = "5. Help & Questions" url = "help/" weight = 5 [[menu.main]] - name = "Related Projects" + name = "6. Related Projects" url = "related-projects/" weight = 6 [[menu.main]] - name = "Contributing" + name = "7. Contributing" url = "contributing/" weight = 7 [[menu.main]] - name = "License" + name = "8. License" url = "license/" weight = 8 diff --git a/DOCUMENTATION/content/contributing/index.md b/DOCUMENTATION/content/contributing/index.md index 24ab633528..1d58dcfc57 100644 --- a/DOCUMENTATION/content/contributing/index.md +++ b/DOCUMENTATION/content/contributing/index.md @@ -1,5 +1,5 @@ --- -title: Contributing +title: 7. Contributing type: index weight: 7 --- diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index 91693705e7..2560a8e56b 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -1,5 +1,5 @@ --- -title: Documentation +title: 3. Documentation type: index weight: 3 --- @@ -320,21 +320,6 @@ PHP_FPM_INSTALL_PHPDBG=true ``` - -## Setup remote debugging for PhpStorm on Linux - - - Make sure you have followed the steps above in the [Install Xdebug section](#install-xdebug). - - - Make sure Xdebug accepts connections and listens on port 9000. (Should be default configuration). - -![Debug Configuration](/images/photos/PHPStorm/linux/configuration/debugConfiguration.png "Debug Configuration"). - - - Create a server with name `laradock` (matches **PHP_IDE_CONFIG** key in environment file) and make sure to map project root path with server correctly. - -![Server Configuration](/images/photos/PHPStorm/linux/configuration/serverConfiguration.png "Server Configuration"). - - - Start listening for debug connections, place a breakpoint and you are good to go ! -
@@ -2029,22 +2014,6 @@ Remote debug Laravel web and phpunit tests. -
- -## Upgrading Laradock - -Moving from Docker Toolbox (VirtualBox) to Docker Native (for Mac/Windows). Requires upgrading Laradock from v3.* to v4.*: - -1. Stop the docker VM `docker-machine stop {default}` -2. Install Docker for [Mac](https://docs.docker.com/docker-for-mac/) or [Windows](https://docs.docker.com/docker-for-windows/). -3. Upgrade Laradock to `v4.*.*` (`git pull origin master`) -4. Use Laradock as you used to do: `docker-compose up -d nginx mysql`. - -**Note:** If you face any problem with the last step above: rebuild all your containers -`docker-compose build --no-cache` -"Warning Containers Data might be lost!" - - @@ -2212,126 +2181,17 @@ docker-compose up ... - - - -
- -## Common Problems - -*Here's a list of the common problems you might face, and the possible solutions.* - - - - - - -
-## I see a blank (white) page instead of the Laravel 'Welcome' page! - -Run the following command from the Laravel root directory: - -```bash -sudo chmod -R 777 storage bootstrap/cache -``` - - - - - - -
-## I see "Welcome to nginx" instead of the Laravel App! - -Use `http://127.0.0.1` instead of `http://localhost` in your browser. - - - - - - -
-## I see an error message containing `address already in use` or `port is already allocated` - -Make sure the ports for the services that you are trying to run (22, 80, 443, 3306, etc.) are not being used already by other programs on the host, such as a built in `apache`/`httpd` service or other development tools you have installed. - - - - - - -
-## I get NGINX error 404 Not Found on Windows. - -1. Go to docker Settings on your Windows machine. -2. Click on the `Shared Drives` tab and check the drive that contains your project files. -3. Enter your windows username and password. -4. Go to the `reset` tab and click restart docker. - - - - - - -
-## The time in my services does not match the current time - -1. Make sure you've [changed the timezone](#Change-the-timezone). -2. Stop and rebuild the containers (`docker-compose up -d --build `) - - - - - - -
-## I get MySQL connection refused - -This error sometimes happens because your Laravel application isn't running on the container localhost IP (Which is 127.0.0.1). Steps to fix it: - -* Option A - 1. Check your running Laravel application IP by dumping `Request::ip()` variable using `dd(Request::ip())` anywhere on your application. The result is the IP of your Laravel container. - 2. Change the `DB_HOST` variable on env with the IP that you received from previous step. -* Option B - 1. Change the `DB_HOST` value to the same name as the MySQL docker container. The Laradock docker-compose file currently has this as `mysql` - -## I get stuck when building nginx on `fetch http://mirrors.aliyun.com/alpine/v3.5/main/x86_64/APKINDEX.tar.gz` - -As stated on [#749](https://github.com/laradock/laradock/issues/749#issuecomment-419652646), Already fixed,just set `CHANGE_SOURCE` to false. - -## Custom composer repo packagist url and npm registry url - -In China, the origin source of composer and npm is very slow. You can add `WORKSPACE_NPM_REGISTRY` and `WORKSPACE_COMPOSER_REPO_PACKAGIST` config in `.env` to use your custom source. - -Example: -```bash -WORKSPACE_NPM_REGISTRY=https://registry.npm.taobao.org -WORKSPACE_COMPOSER_REPO_PACKAGIST=https://packagist.phpcomposer.com -``` -
+ +## Upgrade Laradock -## I get `Module build failed: Error: write EPIPE` while compiling react application - -When you run `npm build` or `yarn dev` building a react application using webpack with elixir you may receive a `Error: write EPIPE` while processing .jpg images. - -This is caused of an outdated library for processing **.jpg files** in ubuntu 16.04. - -To fix the problem you can follow those steps - -1 - Open the `.env`. - -2 - Search for `WORKSPACE_INSTALL_LIBPNG` or add the key if missing. - -3 - Set the value to true: - -```dotenv -WORKSPACE_INSTALL_LIBPNG=true -``` - -4 - Finally rebuild the workspace image +Moving from Docker Toolbox (VirtualBox) to Docker Native (for Mac/Windows). Requires upgrading Laradock from v3.* to v4.*: -```bash -docker-compose build workspace -``` +1. Stop the docker VM `docker-machine stop {default}` +2. Install Docker for [Mac](https://docs.docker.com/docker-for-mac/) or [Windows](https://docs.docker.com/docker-for-windows/). +3. Upgrade Laradock to `v4.*.*` (`git pull origin master`) +4. Use Laradock as you used to do: `docker-compose up -d nginx mysql`. +**Note:** If you face any problem with the last step above: rebuild all your containers +`docker-compose build --no-cache` +"Warning Containers Data might be lost!" diff --git a/DOCUMENTATION/content/getting-started/index.md b/DOCUMENTATION/content/getting-started/index.md index 8262ead11f..d4f6d54445 100644 --- a/DOCUMENTATION/content/getting-started/index.md +++ b/DOCUMENTATION/content/getting-started/index.md @@ -1,10 +1,10 @@ --- -title: Getting Started +title: 2. Getting Started type: index weight: 2 --- -## Requirements +## 2.1 Requirements - [Git](https://git-scm.com/downloads) - [Docker](https://www.docker.com/products/docker/) `>= 17.12` @@ -12,10 +12,7 @@ weight: 2 - - - -## Installation +## 2.2 Installation Choose the setup the best suits your needs. @@ -110,9 +107,11 @@ Your folder structure should look like this: + project-2 ``` -2 - Go to `nginx/sites` and create config files to point to different project directory when visiting different domains. +2 - Go to your web server and create config files to point to different project directory when visiting different domains: -Laradock by default includes `app.conf.example`, `laravel.conf.example` and `symfony.conf.example` as working samples. +For **Nginx** go to `nginx/sites`, for **Apache2** `apache2/sites`. + +Laradock by default includes some sample files for you to copy `app.conf.example`, `laravel.conf.example` and `symfony.conf.example`. 3 - change the default names `*.conf`: @@ -125,6 +124,7 @@ You can rename the config files, project folders and domains as you like, just m 127.0.0.1 project-2.test ... ``` + If you use Chrome 63 or above for development, don't use `.dev`. [Why?](https://laravel-news.com/chrome-63-now-forces-dev-domains-https). Instead use `.localhost`, `.invalid`, `.test`, or `.example`. > **Now jump to the [Usage](#Usage) section.** @@ -136,7 +136,7 @@ If you use Chrome 63 or above for development, don't use `.dev`. [Why?](https:// -## Usage +## 2.3 Usage **Read Before starting:** diff --git a/DOCUMENTATION/content/guides/index.md b/DOCUMENTATION/content/guides/index.md index 388edf4246..451c002753 100644 --- a/DOCUMENTATION/content/guides/index.md +++ b/DOCUMENTATION/content/guides/index.md @@ -1,21 +1,14 @@ --- -title: Guides +title: 4. Guides type: index weight: 4 --- - -* [Production Setup on Digital Ocean](#Digital-Ocean) -* [PHPStorm XDebug Setup](#PHPStorm-Debugging) -* [Running Laravel Dusk Test](#Laravel-Dusk) - - - -# Production Setup on Digital Ocean +## Production Setup on Digital Ocean -## Install Docker +### Install Docker - Visit [DigitalOcean](https://cloud.digitalocean.com/login) and login. - Click the `Create Droplet` button. @@ -24,7 +17,7 @@ weight: 4 - Continue creating the droplet as you normally would. - If needed, check your e-mail for the droplet root password. -## SSH to your Server +### SSH to your Server Find the IP address of the droplet in the DigitalOcean interface. Use it to connect to the server. @@ -40,7 +33,7 @@ You can now check if Docker is available: $root@server:~# docker ``` -## Set Up Your Laravel Project +### Set Up Your Laravel Project ``` $root@server:~# apt-get install git @@ -50,12 +43,12 @@ $root@server:~/laravel/ git submodule add https://github.com/Laradock/laradock.g $root@server:~/laravel/ cd laradock ``` -## Enter the laradock folder and rename env-example to .env. +### Enter the laradock folder and rename env-example to .env. ``` $root@server:~/laravel/laradock# cp env-example .env ``` -## Create Your Laradock Containers +### Create Your Laradock Containers ``` $root@server:~/laravel/laradock# docker-compose up -d nginx mysql @@ -63,13 +56,13 @@ $root@server:~/laravel/laradock# docker-compose up -d nginx mysql Note that more containers are available, find them in the [docs](http://laradock.io/introduction/#supported-software-containers) or the `docker-compose.yml` file. -## Go to Your Workspace +### Go to Your Workspace ``` docker-compose exec workspace bash ``` -## Execute commands +### Execute commands If you want to only execute some command and don't want to enter bash, you can execute `docker-compose run workspace `. @@ -77,7 +70,7 @@ If you want to only execute some command and don't want to enter bash, you can e docker-compose run workspace php artisan migrate ``` -## Install and configure Laravel +### Install and configure Laravel Let's install Laravel's dependencies, add the `.env` file, generate the key and give proper permissions to the cache folder. @@ -100,7 +93,7 @@ It should show you the Laravel default welcome page. However, we want it to show up using your custom domain name, as well. -## Using Your Own Domain Name +### Using Your Own Domain Name Login to your DNS provider, such as Godaddy, Namecheap. @@ -118,7 +111,7 @@ Visit: https://cloud.digitalocean.com/networking/domains Add your domain name and choose the server IP you'd provision earlier. -## Serving Site With NGINX (HTTP ONLY) +### Serving Site With NGINX (HTTP ONLY) Go back to command line. @@ -142,14 +135,14 @@ And add `server_name` (your custom domain) server_name yourdomain.com; ``` -## Rebuild Your Nginx +### Rebuild Your Nginx ``` $root@server:~/laravel/laradock# docker-compose down $root@server:~/laravel/laradock# docker-compose build nginx ``` -## Re Run Your Containers MYSQL and NGINX +### Re Run Your Containers MYSQL and NGINX ``` $root@server:~/laravel/laradock/nginx# docker-compose up -d nginx mysql @@ -157,7 +150,7 @@ $root@server:~/laravel/laradock/nginx# docker-compose up -d nginx mysql **View Your Site with HTTP ONLY (http://yourdomain.com)** -## Run Site on SSL with Let's Encrypt Certificate +### Run Site on SSL with Let's Encrypt Certificate **Note: You need to Use Caddy here Instead of Nginx** @@ -196,7 +189,7 @@ tls serverbreaker@gmai.com This is needed Prior to Creating Let's Encypt -## Run Your Caddy Container without the -d flag and Generate SSL with Let's Encrypt +### Run Your Caddy Container without the -d flag and Generate SSL with Let's Encrypt ``` $root@server:~/laravel/laradock# docker-compose up caddy @@ -217,7 +210,7 @@ caddy_1 | http://yourdomain.com After it finishes, press `Ctrl` + `C` to exit. -## Stop All Containers and ReRun Caddy and Other Containers on Background +### Stop All Containers and ReRun Caddy and Other Containers on Background ``` $root@server:~/laravel/laradock# docker-compose down @@ -238,325 +231,319 @@ View your Site in the Browser Securely Using HTTPS (https://yourdomain.com) - [https://caddyserver.com/docs/tls](https://caddyserver.com/docs/tls) - [https://caddyserver.com/docs/caddyfile](https://caddyserver.com/docs/caddyfile) - - - -




- -# PHPStorm XDebug Setup - -- [Intro](#Intro) -- [Installation](#Installation) - - [Customize laradock/docker-compose.yml](#CustomizeDockerCompose) - - [Clean House](#InstallCleanHouse) - - [Laradock Dial Tone](#InstallLaradockDialTone) - - [hosts](#AddToHosts) - - [Firewall](#FireWall) - - [Enable xDebug on php-fpm](#enablePhpXdebug) - - [PHPStorm Settings](#InstallPHPStorm) - - [Configs](#InstallPHPStormConfigs) -- [Usage](#Usage) - - [Laravel](#UsageLaravel) - - [Run ExampleTest](#UsagePHPStormRunExampleTest) - - [Debug ExampleTest](#UsagePHPStormDebugExampleTest) - - [Debug Web Site](#UsagePHPStormDebugSite) -- [SSH into workspace](#SSHintoWorkspace) - - [KiTTY](#InstallKiTTY) - - -## Intro - -Wiring up [Laravel](https://laravel.com/), [Laradock](https://github.com/Laradock/laradock) [Laravel+Docker] and [PHPStorm](https://www.jetbrains.com/phpstorm/) to play nice together complete with remote xdebug'ing as icing on top! Although this guide is based on `PHPStorm Windows`, -you should be able to adjust accordingly. This guide was written based on Docker for Windows Native. - - -## Installation + +## Running Laravel Dusk Tests -- This guide assumes the following: - - you have already installed and are familiar with Laravel, Laradock and PHPStorm. - - you have installed Laravel as a parent of `laradock`. This guide assumes `/c/_dk/laravel`. +### Option 1: Without Selenium - -## hosts -- Add `laravel` to your hosts file located on Windows 10 at `C:\Windows\System32\drivers\etc\hosts`. It should be set to the IP of your running container. Mine is: `10.0.75.2` -On Windows you can find it by opening Windows `Hyper-V Manager`. - - ![Windows Hyper-V Manager](images/photos/PHPStorm/Settings/WindowsHyperVManager.png) +- [Intro](#option1-dusk-intro) +- [Workspace Setup](#option1-workspace-setup) +- [Application Setup](#option1-application-setup) +- [Choose Chrome Driver Version (Optional)](#option1-choose-chrome-driver-version) +- [Run Dusk Tests](#option1-run-dusk-tests) -- [Hosts File Editor](https://github.com/scottlerch/HostsFileEditor) makes it easy to change your hosts file. - - Set `laravel` to your docker host IP. See [Example](images/photos/SimpleHostsEditor/AddHost_laravel.png). +#### Intro +This is a guide to run Dusk tests in your `workspace` container with headless +google-chrome and chromedriver. It has been tested with Laravel 5.4 and 5.5. - -## Firewall -Your PHPStorm will need to be able to receive a connection from PHP xdebug either your running workspace or php-fpm containers on port 9000. This means that your Windows Firewall should either enable connections from the Application PHPStorm OR the port. +#### Workspace Setup -- It is important to note that if the Application PHPStorm is NOT enabled in the firewall, you will not be able to recreate a rule to override that. -- Also be aware that if you are installing/upgrade different versions of PHPStorm, you MAY have orphaned references to PHPStorm in your Firewall! You may decide to remove orphaned references however in either case, make sure that they are set to receive public TCP traffic. +Update your .env with following entries: -### Edit laradock/docker-compose.yml -Set the following variables: ``` -### Workspace Utilities Container ############### +... +# Install Laravel installer bin to setup demo app +WORKSPACE_INSTALL_LARAVEL_INSTALLER=true +... +# Install all the necessary dependencies for running Dusk tests +WORKSPACE_INSTALL_DUSK_DEPS=true +... +``` - workspace: - build: - context: ./workspace - args: - - INSTALL_XDEBUG=true - - INSTALL_WORKSPACE_SSH=true - ... +Then run below to build your workspace. +``` +docker-compose build workspace +``` -### PHP-FPM Container ##################### +#### Application Setup - php-fpm: - build: - context: ./php-fpm - args: - - INSTALL_XDEBUG=true - ... +Run a `workspace` container and you will be inside the container at `/var/www` directory. ``` +docker-compose run workspace bash -### Edit xdebug.ini files -- `laradock/workspace/xdebug.ini` -- `laradock/php-fpm/xdebug.ini` +/var/www#> _ +``` -Set the following variables: +Create new Laravel application named `dusk-test` and install Laravel Dusk package. ``` -xdebug.remote_autostart=1 -xdebug.remote_enable=1 -xdebug.remote_connect_back=1 -xdebug.cli_color=1 +/var/www> laravel new dusk-test +/var/www> cd dusk-test +/var/www/dusk-test> composer require --dev laravel/dusk +/var/www/dusk-test> php artisan dusk:install ``` +Create `.env.dusk.local` by copying from `.env` file. - -### Need to clean house first? +``` +/var/www/dusk-test> cp .env .env.dusk.local +``` -Make sure you are starting with a clean state. For example, do you have other Laradock containers and images? -Here are a few things I use to clean things up. +Update the `APP_URL` entry in `.env.dusk.local` to local Laravel server. -- Delete all containers using `grep laradock_` on the names, see: [Remove all containers based on docker image name](https://linuxconfig.org/remove-all-containners-based-on-docker-image-name). +``` +APP_URL=http://localhost:8000 +``` -`docker ps -a | awk '{ print $1,$2 }' | grep laradock_ | awk '{print $1}' | xargs -I {} docker rm {}` +You will need to run chromedriver with `headless` and `no-sandbox` flag. In Laravel Dusk 2.x it is +already set `headless` so you just need to add `no-sandbox` flag. If you on previous version 1.x, +you will need to update your `DustTestCase#driver` as shown below. -- Delete all images containing `laradock`. -`docker images | awk '{print $1,$2,$3}' | grep laradock_ | awk '{print $3}' | xargs -I {} docker rmi {}` -**Note:** This will only delete images that were built with `Laradock`, **NOT** `laradock/*` which are pulled down by `Laradock` such as `laradock/workspace`, etc. -**Note:** Some may fail with: -`Error response from daemon: conflict: unable to delete 3f38eaed93df (cannot be forced) - image has dependent child images` +``` +addArguments([ + '--disable-gpu', + '--headless', + '--no-sandbox' + ]); + + return RemoteWebDriver::create( + 'http://localhost:9515', DesiredCapabilities::chrome()->setCapability( + ChromeOptions::CAPABILITY, $options + ) + ); + } } ``` -- If you frequently switch configurations for Laradock, you may find that adding the following and added to your `.bashrc` or equivalent useful: +#### Choose Chrome Driver Version (Optional) -``` -# remove laravel* containers -# remove laravel_* images -dcleanlaradockfunction() -{ - echo 'Removing ALL containers associated with laradock' - docker ps -a | awk '{ print $1,$2 }' | grep laradock | awk '{print $1}' | xargs -I {} docker rm {} +You could choose to use either: - # remove ALL images associated with laradock_ - # does NOT delete laradock/* which are hub images - echo 'Removing ALL images associated with laradock_' - docker images | awk '{print $1,$2,$3}' | grep laradock_ | awk '{print $3}' | xargs -I {} docker rmi {} +1. Chrome Driver shipped with Laravel Dusk. (Default) +2. Chrome Driver installed in `workspace` container. (Required tweak on DuskTestCase class) - echo 'Listing all laradock docker hub images...' - docker images | grep laradock +For Laravel 2.x, you need to update `DuskTestCase#prepare` method if you wish to go with option #2. - echo 'dcleanlaradock completed' -} -# associate the above function with an alias -# so can recall/lookup by typing 'alias' -alias dcleanlaradock=dcleanlaradockfunction ``` - -## Let's get a dial-tone with Laravel +3306/tcp -laradock_nginx_1 nginx Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp -laradock_php-fpm_1 php-fpm Up 9000/tcp -laradock_volumes_data_1 true Exit 0 -laradock_volumes_source_1 true Exit 0 -laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp ``` + -## Enable xDebug on php-fpm +... +use Symfony\Component\Process\ProcessBuilder; -In a host terminal sitting in the laradock folder, run: `./php-fpm/xdebug status` -You should see something like the following: +abstract class DuskTestCase extends BaseTestCase +{ + ... -``` -xDebug status -laradock_php-fpm_1 -PHP 7.0.9 (cli) (built: Aug 10 2016 19:45:48) ( NTS ) -Copyright (c) 1997-2016 The PHP Group -Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies - with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans + /** + * Only add this method if you wish to use chrome driver installed in workspace container + */ + protected static function buildChromeProcess() + { + return (new ProcessBuilder()) + ->setPrefix('chromedriver') + ->getProcess() + ->setEnv(static::chromeEnvironment()); + } + + ... +} ``` -Other commands include `./php-fpm/xdebug start | stop`. +#### Run Dusk Tests -If you have enabled `xdebug=true` in `docker-compose.yml/php-fpm`, `xdebug` will already be running when -`php-fpm` is started and listening for debug info on port 9000. +Run local server in `workspace` container and run Dusk tests. +``` +# alias to run Laravel server in the background (php artisan serve --quiet &) +/var/www/dusk-test> serve +# alias to run Dusk tests (php artisan dusk) +/var/www/dusk-test> dusk - -## PHPStorm Settings +PHPUnit 6.4.0 by Sebastian Bergmann and contributors. -- Here are some settings that are known to work: - - `Settings/BuildDeploymentConnection` - - ![Settings/BuildDeploymentConnection](/images/photos/PHPStorm/Settings/BuildDeploymentConnection.png) +. 1 / 1 (100%) - - `Settings/BuildDeploymentConnectionMappings` - - ![Settings/BuildDeploymentConnectionMappings](/images/photos/PHPStorm/Settings/BuildDeploymentConnectionMappings.png) +Time: 837 ms, Memory: 6.00MB +``` - - `Settings/BuildDeploymentDebugger` - - ![Settings/BuildDeploymentDebugger](/images/photos/PHPStorm/Settings/BuildDeploymentDebugger.png) +### Option 2: With Selenium - - `Settings/EditRunConfigurationRemoteWebDebug` - - ![Settings/EditRunConfigurationRemoteWebDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteWebDebug.png) +- [Intro](#dusk-intro) +- [DNS Setup](#dns-setup) +- [Docker Compose Setup](#docker-compose) +- [Laravel Dusk Setup](#laravel-dusk-setup) +- [Running Laravel Dusk Tests](#running-tests) - - `Settings/EditRunConfigurationRemoteExampleTestDebug` - - ![Settings/EditRunConfigurationRemoteExampleTestDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteExampleTestDebug.png) +#### Intro +Setting up Laravel Dusk tests to run with Laradock appears be something that +eludes most Laradock users. This guide is designed to show you how to wire them +up to work together. This guide is written with macOS and Linux in mind. As such, +it's only been tested on macOS. Feel free to create pull requests to update the guide +for Windows-specific instructions. - - `Settings/LangsPHPDebug` - - ![Settings/LangsPHPDebug](/images/photos/PHPStorm/Settings/LangsPHPDebug.png) +This guide assumes you know how to use a DNS forwarder such as `dnsmasq` or are comfortable +with editing the `/etc/hosts` file for one-off DNS changes. - - `Settings/LangsPHPInterpreters` - - ![Settings/LangsPHPInterpreters](/images/photos/PHPStorm/Settings/LangsPHPInterpreters.png) +#### DNS Setup +According to RFC-2606, only four TLDs are reserved for local testing[^1]: - - `Settings/LangsPHPPHPUnit` - - ![Settings/LangsPHPPHPUnit](/images/photos/PHPStorm/Settings/LangsPHPPHPUnit.png) +- `.test` +- `.example` +- `.invalid` +- `.localhost` - - `Settings/LangsPHPServers` - - ![Settings/LangsPHPServers](/images/photos/PHPStorm/Settings/LangsPHPServers.png) +A common TLD used for local development is `.dev`, but newer versions of Google +Chrome (such as the one bundled with the Selenium Docker image), will fail to +resolve that DNS as there will appear to be a name collision. - - `RemoteHost` - To switch on this view, go to: `Menu/Tools/Deployment/Browse Remote Host`. - - ![RemoteHost](/images/photos/PHPStorm/RemoteHost.png) +The recommended extension is `.test` for your Laravel web apps because you're +running tests. Using a DNS forwarder such as `dnsmasq` or by editing the `/etc/hosts` +file, configure the host to point to `localhost`. - - `RemoteWebDebug` - - ![DebugRemoteOn](/images/photos/PHPStorm/DebugRemoteOn.png) +For example, in your `/etc/hosts` file: +``` +## +# Host Database +# +# localhost is used to configure the loopback interface +# when the system is booting. Do not change this entry. +## +127.0.0.1 localhost +255.255.255.255 broadcasthost +::1 localhost +127.0.0.1 myapp.test +``` - - `EditRunConfigurationRemoteWebDebug` - Go to: `Menu/Run/Edit Configurations`. - - ![EditRunConfigurationRemoteWebDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteWebDebug.png) +This will ensure that when navigating to `myapp.test`, it will route the +request to `127.0.0.1` which will be handled by Nginx in Laradock. - - `EditRunConfigurationRemoteExampleTestDebug` - Go to: `Menu/Run/Edit Configurations`. - - ![EditRunConfigurationRemoteExampleTestDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteExampleTestDebug.png) +#### Docker Compose setup +In order to make the Selenium container talk to the Nginx container appropriately, +the `docker-compose.yml` needs to be edited to accommodate this. Make the following +changes: - - `WindowsFirewallAllowedApps` - Go to: `Control Panel\All Control Panel Items\Windows Firewall\Allowed apps`. - - ![WindowsFirewallAllowedApps.png](/images/photos/PHPStorm/Settings/WindowsFirewallAllowedApps.png) +```yaml +... +selenium: + ... + depends_on: + - nginx + links: + - nginx: +``` - - `hosts` - Edit: `C:\Windows\System32\drivers\etc\hosts`. - - ![WindowsFirewallAllowedApps.png](/images/photos/PHPStorm/Settings/hosts.png) +This allows network communication between the Nginx and Selenium containers +and it also ensures that when starting the Selenium container, the Nginx +container starts up first unless it's already running. This allows +the Selenium container to make requests to the Nginx container, which is +necessary for running Dusk tests. These changes also link the `nginx` environment +variable to the domain you wired up in your hosts file. - - [Enable xDebug on php-fpm](#enablePhpXdebug) +#### Laravel Dusk Setup +In order to make Laravel Dusk make the proper request to the Selenium container, +you have to edit the `DuskTestCase.php` file that's provided on the initial +installation of Laravel Dusk. The change you have to make deals with the URL the +Remote Web Driver attempts to use to set up the Selenium session. +One recommendation for this is to add a separate config option in your `.env.dusk.local` +so it's still possible to run your Dusk tests locally should you want to. - -## Usage +##### .env.dusk.local +``` +... +USE_SELENIUM=true +``` - -### Run ExampleTest -- right-click on `tests/ExampleTest.php` - - Select: `Run 'ExampleTest.php'` or `Ctrl+Shift+F10`. - - Should pass!! You just ran a remote test via SSH! +##### DuskTestCase.php +```php +abstract class DuskTestCase extends BaseTestCase +{ +... + protected function driver() + { + if (env('USE_SELENIUM', 'false') == 'true') { + return RemoteWebDriver::create( + 'http://selenium:4444/wd/hub', DesiredCapabilities::chrome() + ); + } else { + return RemoteWebDriver::create( + 'http://localhost:9515', DesiredCapabilities::chrome() + ); + } + } +} +``` - -### Debug ExampleTest -- Open to edit: `tests/ExampleTest.php` -- Add a BreakPoint on line 16: `$this->visit('/')` -- right-click on `tests/ExampleTest.php` - - Select: `Debug 'ExampleTest.php'`. - - Should have stopped at the BreakPoint!! You are now debugging locally against a remote Laravel project via SSH! - - ![Remote Test Debugging Success](/images/photos/PHPStorm/RemoteTestDebuggingSuccess.png) +#### Running Laravel Dusk Tests +Now that you have everything set up, to run your Dusk tests, you have to SSH +into the workspace container as you normally would: +```docker-compose exec --user=laradock workspace bash``` - -### Debug WebSite -- In case xDebug is disabled, from the `laradock` folder run: -`./php-fpm/xdebug start`. - - To switch xdebug off, run: -`./php-fpm/xdebug stop` +Once inside, you can change directory to your application and run: -- Start Remote Debugging - - ![DebugRemoteOn](/images/photos/PHPStorm/DebugRemoteOn.png) +```php artisan dusk``` -- Open to edit: `bootstrap/app.php` -- Add a BreakPoint on line 14: `$app = new Illuminate\Foundation\Application(` -- Reload [Laravel Site](http://laravel/) - - Should have stopped at the BreakPoint!! You are now debugging locally against a remote Laravel project via SSH! - - ![Remote Debugging Success](/images/photos/PHPStorm/RemoteDebuggingSuccess.png) +One way to make this easier from your project is to create a helper script. Here's one such example: +```bash +#!/usr/bin/env sh +LARADOCK_HOME="path/to/laradock" - -## Let's shell into workspace -Assuming that you are in laradock folder, type: -`ssh -i workspace/insecure_id_rsa -p2222 root@laravel` -**Cha Ching!!!!** -- `workspace/insecure_id_rsa.ppk` may become corrupted. In which case: - - fire up `puttygen` - - import `workspace/insecure_id_rsa` - - save private key to `workspace/insecure_id_rsa.ppk` +pushd ${LARADOCK_HOME} + +docker-compose exec --user=laradock workspace bash -c "cd my-project && php artisan dusk && exit" +``` - +This invokes the Dusk command from inside the workspace container but when the script completes +execution, it returns your session to your project directory. -### KiTTY -[Kitty](http://www.9bis.net/kitty/) KiTTY is a fork from version 0.67 of PuTTY. +[^1]: [Don't Use .dev for Development](https://iyware.com/dont-use-dev-for-development/) -- Here are some settings that are working for me: - - ![Session](/images/photos/KiTTY/Session.png) - - ![Terminal](/images/photos/KiTTY/Terminal.png) - - ![Window](/images/photos/KiTTY/Window.png) - - ![WindowAppearance](/images/photos/KiTTY/WindowAppearance.png) - - ![Connection](/images/photos/KiTTY/Connection.png) - - ![ConnectionData](/images/photos/KiTTY/ConnectionData.png) - - ![ConnectionSSH](/images/photos/KiTTY/ConnectionSSH.png) - - ![ConnectionSSHAuth](/images/photos/KiTTY/ConnectionSSHAuth.png) - - ![TerminalShell](/images/photos/KiTTY/TerminalShell.png)

@@ -564,324 +551,318 @@ Assuming that you are in laradock folder, type:

- -# Running Laravel Dusk Tests - -- [Option 1: Without Selenium](#option1-dusk) -- [Option 2: With Selenium](#option2-dusk) - - -## Option 1: Without Selenium + +## PHPStorm XDebug Setup -- [Intro](#option1-dusk-intro) -- [Workspace Setup](#option1-workspace-setup) -- [Application Setup](#option1-application-setup) -- [Choose Chrome Driver Version (Optional)](#option1-choose-chrome-driver-version) -- [Run Dusk Tests](#option1-run-dusk-tests) +- [Intro](#Intro) +- [Installation](#Installation) + - [Customize laradock/docker-compose.yml](#CustomizeDockerCompose) + - [Clean House](#InstallCleanHouse) + - [Laradock Dial Tone](#InstallLaradockDialTone) + - [hosts](#AddToHosts) + - [Firewall](#FireWall) + - [Enable xDebug on php-fpm](#enablePhpXdebug) + - [PHPStorm Settings](#InstallPHPStorm) + - [Configs](#InstallPHPStormConfigs) +- [Usage](#Usage) + - [Laravel](#UsageLaravel) + - [Run ExampleTest](#UsagePHPStormRunExampleTest) + - [Debug ExampleTest](#UsagePHPStormDebugExampleTest) + - [Debug Web Site](#UsagePHPStormDebugSite) +- [SSH into workspace](#SSHintoWorkspace) + - [KiTTY](#InstallKiTTY) - ### Intro -This is a guide to run Dusk tests in your `workspace` container with headless -google-chrome and chromedriver. It has been tested with Laravel 5.4 and 5.5. +Wiring up [Laravel](https://laravel.com/), [Laradock](https://github.com/Laradock/laradock) [Laravel+Docker] and [PHPStorm](https://www.jetbrains.com/phpstorm/) to play nice together complete with remote xdebug'ing as icing on top! Although this guide is based on `PHPStorm Windows`, +you should be able to adjust accordingly. This guide was written based on Docker for Windows Native. - -### Workspace Setup +### Installation -Update your .env with following entries: +- This guide assumes the following: + - you have already installed and are familiar with Laravel, Laradock and PHPStorm. + - you have installed Laravel as a parent of `laradock`. This guide assumes `/c/_dk/laravel`. -``` -... -# Install Laravel installer bin to setup demo app -WORKSPACE_INSTALL_LARAVEL_INSTALLER=true -... -# Install all the necessary dependencies for running Dusk tests -WORKSPACE_INSTALL_DUSK_DEPS=true -... -``` +### hosts +- Add `laravel` to your hosts file located on Windows 10 at `C:\Windows\System32\drivers\etc\hosts`. It should be set to the IP of your running container. Mine is: `10.0.75.2` +On Windows you can find it by opening Windows `Hyper-V Manager`. + - ![Windows Hyper-V Manager](images/photos/PHPStorm/Settings/WindowsHyperVManager.png) -Then run below to build your workspace. +- [Hosts File Editor](https://github.com/scottlerch/HostsFileEditor) makes it easy to change your hosts file. + - Set `laravel` to your docker host IP. See [Example](images/photos/SimpleHostsEditor/AddHost_laravel.png). -``` -docker-compose build workspace -``` - -### Application Setup +### Firewall +Your PHPStorm will need to be able to receive a connection from PHP xdebug either your running workspace or php-fpm containers on port 9000. This means that your Windows Firewall should either enable connections from the Application PHPStorm OR the port. -Run a `workspace` container and you will be inside the container at `/var/www` directory. +- It is important to note that if the Application PHPStorm is NOT enabled in the firewall, you will not be able to recreate a rule to override that. +- Also be aware that if you are installing/upgrade different versions of PHPStorm, you MAY have orphaned references to PHPStorm in your Firewall! You may decide to remove orphaned references however in either case, make sure that they are set to receive public TCP traffic. +#### Edit laradock/docker-compose.yml +Set the following variables: ``` -docker-compose run workspace bash +### Workspace Utilities Container ############### -/var/www#> _ -``` + workspace: + build: + context: ./workspace + args: + - INSTALL_XDEBUG=true + - INSTALL_WORKSPACE_SSH=true + ... -Create new Laravel application named `dusk-test` and install Laravel Dusk package. -``` -/var/www> laravel new dusk-test -/var/www> cd dusk-test -/var/www/dusk-test> composer require --dev laravel/dusk -/var/www/dusk-test> php artisan dusk:install -``` +### PHP-FPM Container ##################### -Create `.env.dusk.local` by copying from `.env` file. + php-fpm: + build: + context: ./php-fpm + args: + - INSTALL_XDEBUG=true + ... -``` -/var/www/dusk-test> cp .env .env.dusk.local ``` -Update the `APP_URL` entry in `.env.dusk.local` to local Laravel server. +#### Edit xdebug.ini files +- `laradock/workspace/xdebug.ini` +- `laradock/php-fpm/xdebug.ini` + +Set the following variables: ``` -APP_URL=http://localhost:8000 +xdebug.remote_autostart=1 +xdebug.remote_enable=1 +xdebug.remote_connect_back=1 +xdebug.cli_color=1 ``` -You will need to run chromedriver with `headless` and `no-sandbox` flag. In Laravel Dusk 2.x it is -already set `headless` so you just need to add `no-sandbox` flag. If you on previous version 1.x, -you will need to update your `DustTestCase#driver` as shown below. +#### Need to clean house first? + +Make sure you are starting with a clean state. For example, do you have other Laradock containers and images? +Here are a few things I use to clean things up. + +- Delete all containers using `grep laradock_` on the names, see: [Remove all containers based on docker image name](https://linuxconfig.org/remove-all-containners-based-on-docker-image-name). + +`docker ps -a | awk '{ print $1,$2 }' | grep laradock_ | awk '{print $1}' | xargs -I {} docker rm {}` + +- Delete all images containing `laradock`. + +`docker images | awk '{print $1,$2,$3}' | grep laradock_ | awk '{print $3}' | xargs -I {} docker rmi {}` +**Note:** This will only delete images that were built with `Laradock`, **NOT** `laradock/*` which are pulled down by `Laradock` such as `laradock/workspace`, etc. +**Note:** Some may fail with: +`Error response from daemon: conflict: unable to delete 3f38eaed93df (cannot be forced) - image has dependent child images` + +- I added this to my `.bashrc` to remove orphaned images. ``` -addArguments([ - '--disable-gpu', - '--headless', - '--no-sandbox' - ]); + # remove ALL images associated with laradock_ + # does NOT delete laradock/* which are hub images + echo 'Removing ALL images associated with laradock_' + docker images | awk '{print $1,$2,$3}' | grep laradock_ | awk '{print $3}' | xargs -I {} docker rmi {} - return RemoteWebDriver::create( - 'http://localhost:9515', DesiredCapabilities::chrome()->setCapability( - ChromeOptions::CAPABILITY, $options - ) - ); - } + echo 'Listing all laradock docker hub images...' + docker images | grep laradock + + echo 'dcleanlaradock completed' } +# associate the above function with an alias +# so can recall/lookup by typing 'alias' +alias dcleanlaradock=dcleanlaradockfunction ``` - -### Choose Chrome Driver Version (Optional) -You could choose to use either: +### Let's get a dial-tone with Laravel -1. Chrome Driver shipped with Laravel Dusk. (Default) -2. Chrome Driver installed in `workspace` container. (Required tweak on DuskTestCase class) +``` +# barebones at this point +docker-compose up -d nginx mysql -For Laravel 2.x, you need to update `DuskTestCase#prepare` method if you wish to go with option #2. +# run +docker-compose ps +# Should see: + Name Command State Ports +----------------------------------------------------------------------------------------------------------- +laradock_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp +laradock_nginx_1 nginx Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp +laradock_php-fpm_1 php-fpm Up 9000/tcp +laradock_volumes_data_1 true Exit 0 +laradock_volumes_source_1 true Exit 0 +laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp ``` -setPrefix('chromedriver') - ->getProcess() - ->setEnv(static::chromeEnvironment()); - } +- Here are some settings that are known to work: + - `Settings/BuildDeploymentConnection` + - ![Settings/BuildDeploymentConnection](/images/photos/PHPStorm/Settings/BuildDeploymentConnection.png) - ... -} -``` + - `Settings/BuildDeploymentConnectionMappings` + - ![Settings/BuildDeploymentConnectionMappings](/images/photos/PHPStorm/Settings/BuildDeploymentConnectionMappings.png) - -### Run Dusk Tests + - `Settings/BuildDeploymentDebugger` + - ![Settings/BuildDeploymentDebugger](/images/photos/PHPStorm/Settings/BuildDeploymentDebugger.png) -Run local server in `workspace` container and run Dusk tests. + - `Settings/EditRunConfigurationRemoteWebDebug` + - ![Settings/EditRunConfigurationRemoteWebDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteWebDebug.png) -``` -# alias to run Laravel server in the background (php artisan serve --quiet &) -/var/www/dusk-test> serve -# alias to run Dusk tests (php artisan dusk) -/var/www/dusk-test> dusk + - `Settings/EditRunConfigurationRemoteExampleTestDebug` + - ![Settings/EditRunConfigurationRemoteExampleTestDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteExampleTestDebug.png) -PHPUnit 6.4.0 by Sebastian Bergmann and contributors. + - `Settings/LangsPHPDebug` + - ![Settings/LangsPHPDebug](/images/photos/PHPStorm/Settings/LangsPHPDebug.png) -. 1 / 1 (100%) + - `Settings/LangsPHPInterpreters` + - ![Settings/LangsPHPInterpreters](/images/photos/PHPStorm/Settings/LangsPHPInterpreters.png) -Time: 837 ms, Memory: 6.00MB -``` + - `Settings/LangsPHPPHPUnit` + - ![Settings/LangsPHPPHPUnit](/images/photos/PHPStorm/Settings/LangsPHPPHPUnit.png) - -## Option 2: With Selenium + - `Settings/LangsPHPServers` + - ![Settings/LangsPHPServers](/images/photos/PHPStorm/Settings/LangsPHPServers.png) -- [Intro](#dusk-intro) -- [DNS Setup](#dns-setup) -- [Docker Compose Setup](#docker-compose) -- [Laravel Dusk Setup](#laravel-dusk-setup) -- [Running Laravel Dusk Tests](#running-tests) + - `RemoteHost` + To switch on this view, go to: `Menu/Tools/Deployment/Browse Remote Host`. + - ![RemoteHost](/images/photos/PHPStorm/RemoteHost.png) - -### Intro -Setting up Laravel Dusk tests to run with Laradock appears be something that -eludes most Laradock users. This guide is designed to show you how to wire them -up to work together. This guide is written with macOS and Linux in mind. As such, -it's only been tested on macOS. Feel free to create pull requests to update the guide -for Windows-specific instructions. + - `RemoteWebDebug` + - ![DebugRemoteOn](/images/photos/PHPStorm/DebugRemoteOn.png) -This guide assumes you know how to use a DNS forwarder such as `dnsmasq` or are comfortable -with editing the `/etc/hosts` file for one-off DNS changes. + - `EditRunConfigurationRemoteWebDebug` + Go to: `Menu/Run/Edit Configurations`. + - ![EditRunConfigurationRemoteWebDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteWebDebug.png) - -### DNS Setup -According to RFC-2606, only four TLDs are reserved for local testing[^1]: + - `EditRunConfigurationRemoteExampleTestDebug` + Go to: `Menu/Run/Edit Configurations`. + - ![EditRunConfigurationRemoteExampleTestDebug](/images/photos/PHPStorm/Settings/EditRunConfigurationRemoteExampleTestDebug.png) -- `.test` -- `.example` -- `.invalid` -- `.localhost` + - `WindowsFirewallAllowedApps` + Go to: `Control Panel\All Control Panel Items\Windows Firewall\Allowed apps`. + - ![WindowsFirewallAllowedApps.png](/images/photos/PHPStorm/Settings/WindowsFirewallAllowedApps.png) -A common TLD used for local development is `.dev`, but newer versions of Google -Chrome (such as the one bundled with the Selenium Docker image), will fail to -resolve that DNS as there will appear to be a name collision. + - `hosts` + Edit: `C:\Windows\System32\drivers\etc\hosts`. + - ![WindowsFirewallAllowedApps.png](/images/photos/PHPStorm/Settings/hosts.png) -The recommended extension is `.test` for your Laravel web apps because you're -running tests. Using a DNS forwarder such as `dnsmasq` or by editing the `/etc/hosts` -file, configure the host to point to `localhost`. + - [Enable xDebug on php-fpm](#enablePhpXdebug) -For example, in your `/etc/hosts` file: -``` -## -# Host Database -# -# localhost is used to configure the loopback interface -# when the system is booting. Do not change this entry. -## -127.0.0.1 localhost -255.255.255.255 broadcasthost -::1 localhost -127.0.0.1 myapp.test -``` -This will ensure that when navigating to `myapp.test`, it will route the -request to `127.0.0.1` which will be handled by Nginx in Laradock. - -### Docker Compose setup -In order to make the Selenium container talk to the Nginx container appropriately, -the `docker-compose.yml` needs to be edited to accommodate this. Make the following -changes: +### Usage -```yaml -... -selenium: - ... - depends_on: - - nginx - links: - - nginx: -``` +#### Run ExampleTest +- right-click on `tests/ExampleTest.php` + - Select: `Run 'ExampleTest.php'` or `Ctrl+Shift+F10`. + - Should pass!! You just ran a remote test via SSH! -This allows network communication between the Nginx and Selenium containers -and it also ensures that when starting the Selenium container, the Nginx -container starts up first unless it's already running. This allows -the Selenium container to make requests to the Nginx container, which is -necessary for running Dusk tests. These changes also link the `nginx` environment -variable to the domain you wired up in your hosts file. +#### Debug ExampleTest +- Open to edit: `tests/ExampleTest.php` +- Add a BreakPoint on line 16: `$this->visit('/')` +- right-click on `tests/ExampleTest.php` + - Select: `Debug 'ExampleTest.php'`. + - Should have stopped at the BreakPoint!! You are now debugging locally against a remote Laravel project via SSH! + - ![Remote Test Debugging Success](/images/photos/PHPStorm/RemoteTestDebuggingSuccess.png) - -### Laravel Dusk Setup +#### Debug WebSite +- In case xDebug is disabled, from the `laradock` folder run: +`./php-fpm/xdebug start`. + - To switch xdebug off, run: +`./php-fpm/xdebug stop` -In order to make Laravel Dusk make the proper request to the Selenium container, -you have to edit the `DuskTestCase.php` file that's provided on the initial -installation of Laravel Dusk. The change you have to make deals with the URL the -Remote Web Driver attempts to use to set up the Selenium session. +- Start Remote Debugging + - ![DebugRemoteOn](/images/photos/PHPStorm/DebugRemoteOn.png) -One recommendation for this is to add a separate config option in your `.env.dusk.local` -so it's still possible to run your Dusk tests locally should you want to. +- Open to edit: `bootstrap/app.php` +- Add a BreakPoint on line 14: `$app = new Illuminate\Foundation\Application(` +- Reload [Laravel Site](http://laravel/) + - Should have stopped at the BreakPoint!! You are now debugging locally against a remote Laravel project via SSH! + - ![Remote Debugging Success](/images/photos/PHPStorm/RemoteDebuggingSuccess.png) -#### .env.dusk.local -``` -... -USE_SELENIUM=true -``` -#### DuskTestCase.php -```php -abstract class DuskTestCase extends BaseTestCase -{ -... - protected function driver() - { - if (env('USE_SELENIUM', 'false') == 'true') { - return RemoteWebDriver::create( - 'http://selenium:4444/wd/hub', DesiredCapabilities::chrome() - ); - } else { - return RemoteWebDriver::create( - 'http://localhost:9515', DesiredCapabilities::chrome() - ); - } - } -} -``` +### Let's shell into workspace +Assuming that you are in laradock folder, type: +`ssh -i workspace/insecure_id_rsa -p2222 root@laravel` +**Cha Ching!!!!** +- `workspace/insecure_id_rsa.ppk` may become corrupted. In which case: + - fire up `puttygen` + - import `workspace/insecure_id_rsa` + - save private key to `workspace/insecure_id_rsa.ppk` - -### Running Laravel Dusk Tests +#### KiTTY +[Kitty](http://www.9bis.net/kitty/) KiTTY is a fork from version 0.67 of PuTTY. -Now that you have everything set up, to run your Dusk tests, you have to SSH -into the workspace container as you normally would: -```docker-compose exec --user=laradock workspace bash``` +- Here are some settings that are working for me: + - ![Session](/images/photos/KiTTY/Session.png) + - ![Terminal](/images/photos/KiTTY/Terminal.png) + - ![Window](/images/photos/KiTTY/Window.png) + - ![WindowAppearance](/images/photos/KiTTY/WindowAppearance.png) + - ![Connection](/images/photos/KiTTY/Connection.png) + - ![ConnectionData](/images/photos/KiTTY/ConnectionData.png) + - ![ConnectionSSH](/images/photos/KiTTY/ConnectionSSH.png) + - ![ConnectionSSHAuth](/images/photos/KiTTY/ConnectionSSHAuth.png) + - ![TerminalShell](/images/photos/KiTTY/TerminalShell.png) -Once inside, you can change directory to your application and run: +
+
+
+
+
-```php artisan dusk``` + +## Setup remote debugging for PhpStorm on Linux -One way to make this easier from your project is to create a helper script. Here's one such example: -```bash -#!/usr/bin/env sh + - Make sure you have followed the steps above in the [Install Xdebug section](#install-xdebug). -LARADOCK_HOME="path/to/laradock" + - Make sure Xdebug accepts connections and listens on port 9000. (Should be default configuration). -pushd ${LARADOCK_HOME} +![Debug Configuration](/images/photos/PHPStorm/linux/configuration/debugConfiguration.png "Debug Configuration"). -docker-compose exec --user=laradock workspace bash -c "cd my-project && php artisan dusk && exit" -``` + - Create a server with name `laradock` (matches **PHP_IDE_CONFIG** key in environment file) and make sure to map project root path with server correctly. -This invokes the Dusk command from inside the workspace container but when the script completes -execution, it returns your session to your project directory. +![Server Configuration](/images/photos/PHPStorm/linux/configuration/serverConfiguration.png "Server Configuration"). -[^1]: [Don't Use .dev for Development](https://iyware.com/dont-use-dev-for-development/) + - Start listening for debug connections, place a breakpoint and you are good to go ! diff --git a/DOCUMENTATION/content/help/index.md b/DOCUMENTATION/content/help/index.md index 3f2342de30..1d971c51ea 100644 --- a/DOCUMENTATION/content/help/index.md +++ b/DOCUMENTATION/content/help/index.md @@ -1,5 +1,5 @@ --- -title: Help & Questions +title: 5. Help & Questions type: index weight: 5 --- @@ -7,3 +7,121 @@ weight: 5 Join the chat room on [Gitter](https://gitter.im/Laradock/laradock) and get help and support from the community. You can as well can open an [issue](https://github.com/laradock/laradock/issues) on Github (will be labeled as Question) and discuss it with people on [Gitter](https://gitter.im/Laradock/laradock). + + +
+ +# Common Problems + +*Here's a list of the common problems you might face, and the possible solutions.* + + +
+## I see a blank (white) page instead of the Laravel 'Welcome' page! + +Run the following command from the Laravel root directory: + +```bash +sudo chmod -R 777 storage bootstrap/cache +``` + + + + + + +
+## I see "Welcome to nginx" instead of the Laravel App! + +Use `http://127.0.0.1` instead of `http://localhost` in your browser. + + + + + + +
+## I see an error message containing `address already in use` or `port is already allocated` + +Make sure the ports for the services that you are trying to run (22, 80, 443, 3306, etc.) are not being used already by other programs on the host, such as a built in `apache`/`httpd` service or other development tools you have installed. + + + + + + +
+## I get NGINX error 404 Not Found on Windows. + +1. Go to docker Settings on your Windows machine. +2. Click on the `Shared Drives` tab and check the drive that contains your project files. +3. Enter your windows username and password. +4. Go to the `reset` tab and click restart docker. + + + + + + +
+## The time in my services does not match the current time + +1. Make sure you've [changed the timezone](#Change-the-timezone). +2. Stop and rebuild the containers (`docker-compose up -d --build `) + + + + + + +
+## I get MySQL connection refused + +This error sometimes happens because your Laravel application isn't running on the container localhost IP (Which is 127.0.0.1). Steps to fix it: + +* Option A + 1. Check your running Laravel application IP by dumping `Request::ip()` variable using `dd(Request::ip())` anywhere on your application. The result is the IP of your Laravel container. + 2. Change the `DB_HOST` variable on env with the IP that you received from previous step. +* Option B + 1. Change the `DB_HOST` value to the same name as the MySQL docker container. The Laradock docker-compose file currently has this as `mysql` + +## I get stuck when building nginx on `fetch http://mirrors.aliyun.com/alpine/v3.5/main/x86_64/APKINDEX.tar.gz` + +As stated on [#749](https://github.com/laradock/laradock/issues/749#issuecomment-419652646), Already fixed,just set `CHANGE_SOURCE` to false. + +## Custom composer repo packagist url and npm registry url + +In China, the origin source of composer and npm is very slow. You can add `WORKSPACE_NPM_REGISTRY` and `WORKSPACE_COMPOSER_REPO_PACKAGIST` config in `.env` to use your custom source. + +Example: +```bash +WORKSPACE_NPM_REGISTRY=https://registry.npm.taobao.org +WORKSPACE_COMPOSER_REPO_PACKAGIST=https://packagist.phpcomposer.com +``` + +
+ +## I get `Module build failed: Error: write EPIPE` while compiling react application + +When you run `npm build` or `yarn dev` building a react application using webpack with elixir you may receive a `Error: write EPIPE` while processing .jpg images. + +This is caused of an outdated library for processing **.jpg files** in ubuntu 16.04. + +To fix the problem you can follow those steps + +1 - Open the `.env`. + +2 - Search for `WORKSPACE_INSTALL_LIBPNG` or add the key if missing. + +3 - Set the value to true: + +```dotenv +WORKSPACE_INSTALL_LIBPNG=true +``` + +4 - Finally rebuild the workspace image + +```bash +docker-compose build workspace +``` + diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 1fdd83e4f1..610f031e96 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -1,5 +1,5 @@ --- -title: Introduction +title: 1. Introduction type: index weight: 1 --- @@ -9,7 +9,7 @@ weight: 1 A full PHP development environment for Docker. -Includes a lot of useful Docker Images, all pre-configured to provide a wonderful PHP development environment. +Supports a variety of useful Docker Images, pre-configured to provide a wonderful PHP development environment. ![](https://raw.githubusercontent.com/laradock/laradock/master/.github/home-page-images/laradock-logo.jpg) @@ -31,11 +31,11 @@ Includes a lot of useful Docker Images, all pre-configured to provide a wonderfu For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io.
-Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website. +*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website.* ## Quick Overview -Let's see how easy it is to install `NGINX`, `PHP`, `Composer`, `MySQL`, `Redis` and `Beanstalkd`: +Let's see how easy it is to setup our demo stack `PHP`, `NGINX`, `MySQL`, `Redis` and `Composer`: 1 - Clone Laradock inside your PHP project: @@ -77,8 +77,8 @@ That's it! enjoy :) - Easy switch between PHP versions: 7.3, 7.2, 7.1, 5.6... - Choose your favorite database engine: MySQL, Postgres, MariaDB... -- Run your own combination of software: Memcached, HHVM, Beanstalkd... -- Every software runs on a separate container: PHP-FPM, NGINX, PHP-CLI... +- Run your own stack: Memcached, HHVM, RabbitMQ... +- Each software runs on its own container: PHP-FPM, NGINX, PHP-CLI... - Easy to customize any container, with simple edit to the `Dockerfile`. - All Images extends from an official base Image. (Trusted base Images). - Pre-configured NGINX to host any code at your root directory. @@ -88,39 +88,101 @@ That's it! enjoy :) - Latest version of the Docker Compose file (`docker-compose`). - Everything is visible and editable. - Fast Images Builds. -- More to come every week.. - ## Supported Software (Images) -In adhering to the separation of concerns principle as promoted by Docker, Laradock runs each software on its own Container. -You can turn On/Off as many instances of as any container without worrying about the configurations, everything works like a charm. +> Laradock, adheres to the 'separation of concerns' principle, thus it runs each software on its own Docker Container. +> You can turn On/Off as many instances of as any container without worrying about the configurations. -- **Database Engines:** -MySQL - MariaDB - Percona - MongoDB - Neo4j - RethinkDB - MSSQL - PostgreSQL - Postgres-PostGIS. -- **Database Management:** -PhpMyAdmin - Adminer - PgAdmin -- **Cache Engines:** -Redis - Memcached - Aerospike -- **PHP Servers:** -NGINX - Apache2 - Caddy -- **PHP Compilers:** -PHP FPM - HHVM -- **Message Queueing:** -Beanstalkd - RabbitMQ - PHP Worker -- **Queueing Management:** -Beanstalkd Console - RabbitMQ Console -- **Random Tools:** -Mailu - HAProxy - Certbot - Blackfire - Selenium - Jenkins - ElasticSearch - Kibana - Grafana - Gitlab - Mailhog - MailDev - Minio - Varnish - Swoole - NetData - Portainer - Laravel Echo - Phalcon... +> To run a chosen container from the list below, run `docker-compose up -d {container-name}`. +> The container name `{container-name}` is the same as its folder name. Example to run the "PHP FPM" container use the name "php-fpm". -Laradock introduces the **Workspace** Image, as a development environment. -It contains a rich set of helpful tools, all pre-configured to work and integrate with almost any combination of Containers and tools you may choose. +- **Web Servers:** + * NGINX + * Apache2 + * Caddy + * HAProxy -**Workspace Image Tools** -PHP CLI - Composer - Git - Linuxbrew - Node - V8JS - Gulp - SQLite - xDebug - Envoy - Deployer - Vim - Yarn - SOAP - Drush - WP-CLI... +- **PHP Compilers:** + * PHP FPM + * HHVM + +- **Database Management Systems:** + * MySQL + * MariaDB + * Percona + * MongoDB + * Neo4j + * RethinkDB + * MSSQL + * PostgreSQL + * Postgres-PostGIS + +- **Database Management Apps:** + * PhpMyAdmin + * Adminer + * PgAdmin + +- **Cache Engines:** + * Redis + * Memcached + * Aerospike + * Varnish + +- **Message Brokers:** + * RabbitMQ (+ Admin Console) + * Beanstalkd (+ Admin Console) + * PHP Worker + +- **Mail Servers:** + * Mailu + * Mailhog + * MailDev + +- **Testing:** + * Selenium + +- **Monitoring:** + * Grafana + * NetData + +- **More Tools:** + * Certbot *(Automatically enable HTTPS on your website)* + * Swoole *(Production-Grade Async programming Framework for PHP)* + * ElasticSearch *(Search engine based on the Lucene library)* + * Kibana *(Visualize your Elasticsearch data and navigate the Elastic Stack)* + * Portainer *(Build and manage your Docker environments with ease)* + * Jenkins (automation server) + * Gitlab *(A single application for the entire software development lifecycle)* + * Blackfire *(Empowers all PHP developers and IT/Ops to continuously verify and improve their app's performance)* + * Laravel Echo *(Bring the power of WebSockets to your Laravel applications)* + * Phalcon *(A PHP web framework based on the model–view–controller pattern)* + * Minio *(Cloud storage server released under Apache License v2, compatible with Amazon S3)* + +- **Workspace Image Tools** + +> Laradock introduces the **Workspace** Image, as a development environment. +> It contains a rich set of helpful tools, all pre-configured to work and integrate with almost any combination of tools you choose. + + * PHP CLI + * Composer + * Git + * Vim + * xDebug + * Linuxbrew + * Node + * V8JS + * Gulp + * SQLite + * Envoy + * Deployer + * Yarn + * SOAP + * Drush + * Wordpress CLI You can choose, which tools to install in your workspace container and other containers, from the `.env` file. @@ -166,7 +228,6 @@ Most importantly Docker can run on Development and on Production (same environme What's better than a **Demo Video**: -- Laradock v5.* (should be next!) - Laradock [v4.*](https://www.youtube.com/watch?v=TQii1jDa96Y) - Laradock [v2.*](https://www.youtube.com/watch?v=-DamFMczwDA) - Laradock [v0.3](https://www.youtube.com/watch?v=jGkyO6Is_aI) @@ -195,14 +256,14 @@ You are welcome to join our chat room on Gitter. > Help keeping the project development going, by [contributing](http://laradock.io/contributing) or donating a little. > Thanks in advance. -Donate directly via [Paypal](https://www.paypal.me/mzalt) - -[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/mzalt) +Donate directly via [Paypal](https://paypal.me/mzmmzz) -or become a backer on [Open Collective](https://opencollective.com/laradock#backer) - - +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/mzmmzz) or show your support via [Beerpay](https://beerpay.io/laradock/laradock) [![Beerpay](https://beerpay.io/laradock/laradock/badge.svg?style=flat)](https://beerpay.io/laradock/laradock) + +or become a backer on [Open Collective](https://opencollective.com/laradock#backer) + + diff --git a/DOCUMENTATION/content/license/index.md b/DOCUMENTATION/content/license/index.md index 795d4c8931..312b13d145 100644 --- a/DOCUMENTATION/content/license/index.md +++ b/DOCUMENTATION/content/license/index.md @@ -1,5 +1,5 @@ --- -title: License +title: 8. License type: index weight: 8 --- diff --git a/DOCUMENTATION/content/related-projects/index.md b/DOCUMENTATION/content/related-projects/index.md index bc37d9b543..a55343fb75 100644 --- a/DOCUMENTATION/content/related-projects/index.md +++ b/DOCUMENTATION/content/related-projects/index.md @@ -1,5 +1,5 @@ --- -title: Related Projects +title: 6. Related Projects type: index weight: 6 --- From c79d0671e2c20534d61057c29c74e08292987da7 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Mon, 15 Jul 2019 20:47:29 +0200 Subject: [PATCH 035/861] add missing supported images to the docs --- DOCUMENTATION/content/introduction/index.md | 167 ++++++++++++-------- 1 file changed, 98 insertions(+), 69 deletions(-) diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 610f031e96..82e6ad9cc1 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -92,97 +92,126 @@ That's it! enjoy :) -## Supported Software (Images) +## Supported Software (Docker Images) > Laradock, adheres to the 'separation of concerns' principle, thus it runs each software on its own Docker Container. -> You can turn On/Off as many instances of as any container without worrying about the configurations. +> You can turn On/Off as many instances as you want without worrying about the configurations. > To run a chosen container from the list below, run `docker-compose up -d {container-name}`. > The container name `{container-name}` is the same as its folder name. Example to run the "PHP FPM" container use the name "php-fpm". - **Web Servers:** - * NGINX - * Apache2 - * Caddy - * HAProxy + - NGINX + - Apache2 + - Caddy + +- **Load Balancers:** + - HAProxy + - Traefik - **PHP Compilers:** - * PHP FPM - * HHVM + - PHP FPM + - HHVM - **Database Management Systems:** - * MySQL - * MariaDB - * Percona - * MongoDB - * Neo4j - * RethinkDB - * MSSQL - * PostgreSQL - * Postgres-PostGIS + - MySQL + - PostgreSQL + - PostGIS + - MariaDB + - Percona + - MSSQL + - MongoDB + - MongoDB Web UI + - Neo4j + - CouchDB + - RethinkDB + - **Database Management Apps:** - * PhpMyAdmin - * Adminer - * PgAdmin + - PhpMyAdmin + - Adminer + - PgAdmin - **Cache Engines:** - * Redis - * Memcached - * Aerospike - * Varnish + - Redis + - Redis Web UI + - Redis Cluster + - Memcached + - Aerospike + - Varnish - **Message Brokers:** - * RabbitMQ (+ Admin Console) - * Beanstalkd (+ Admin Console) - * PHP Worker + - RabbitMQ + - RabbitMQ Admin Console + - Beanstalkd + - Beanstalkd Admin Console + - Eclipse Mosquitto + - PHP Worker + - Laravel Horizon - **Mail Servers:** - * Mailu - * Mailhog - * MailDev + - Mailu + - Mailhog + - MailDev + +- **Log Management:** + - GrayLog - **Testing:** - * Selenium + - Selenium - **Monitoring:** - * Grafana - * NetData - -- **More Tools:** - * Certbot *(Automatically enable HTTPS on your website)* - * Swoole *(Production-Grade Async programming Framework for PHP)* - * ElasticSearch *(Search engine based on the Lucene library)* - * Kibana *(Visualize your Elasticsearch data and navigate the Elastic Stack)* - * Portainer *(Build and manage your Docker environments with ease)* - * Jenkins (automation server) - * Gitlab *(A single application for the entire software development lifecycle)* - * Blackfire *(Empowers all PHP developers and IT/Ops to continuously verify and improve their app's performance)* - * Laravel Echo *(Bring the power of WebSockets to your Laravel applications)* - * Phalcon *(A PHP web framework based on the model–view–controller pattern)* - * Minio *(Cloud storage server released under Apache License v2, compatible with Amazon S3)* - -- **Workspace Image Tools** - -> Laradock introduces the **Workspace** Image, as a development environment. -> It contains a rich set of helpful tools, all pre-configured to work and integrate with almost any combination of tools you choose. - - * PHP CLI - * Composer - * Git - * Vim - * xDebug - * Linuxbrew - * Node - * V8JS - * Gulp - * SQLite - * Envoy - * Deployer - * Yarn - * SOAP - * Drush - * Wordpress CLI + - Grafana + - NetData + +- **Search Engines:** + - ElasticSearch + - Apache Solr + - Manticore Search + +- **IDE's** + - ICE Coder + - Theia + - Web IDE + +- **Miscellaneous:** + - Workspace: *(Laradock container that includes a rich set of pre-configured useful tools)* + - `PHP CLI` + - `Composer` + - `Git` + - `Vim` + - `xDebug` + - `Linuxbrew` + - `Node` + - `V8JS` + - `Gulp` + - `SQLite` + - `Laravel Envoy` + - `Deployer` + - `Yarn` + - `SOAP` + - `Drush` + - `Wordpress CLI` + - Apache ZooKeeper *(Centralized service for distributed systems to a hierarchical key-value store)* + - Kibana *(Visualize your Elasticsearch data and navigate the Elastic Stack)* + - LogStash *(Server-side data processing pipeline that ingests data from a multitude of sources simultaneously)* + - Jenkins *(automation server, that provides plugins to support building, deploying and automating any project)* + - Certbot *(Automatically enable HTTPS on your website)* + - Swoole *(Production-Grade Async programming Framework for PHP)* + - SonarQube *(continuous inspection of code quality to perform automatic reviews with static analysis of code to detect bugs and more)* + - Gitlab *(A single application for the entire software development lifecycle)* + - PostGIS *(Database extender for PostgreSQL. It adds support for geographic objects allowing location queries to be run in SQL)* + - Blackfire *(Empowers all PHP developers and IT/Ops to continuously verify and improve their app's performance)* + - Laravel Echo *(Bring the power of WebSockets to your Laravel applications)* + - Phalcon *(A PHP web framework based on the model–view–controller pattern)* + - Minio *(Cloud storage server released under Apache License v2, compatible with Amazon S3)* + - AWS EB CLI *(CLI that helps you deploy and manage your AWS Elastic Beanstalk applications and environments)* + - Thumbor *(Photo thumbnail service)* + - IPython *(Provides a rich architecture for interactive computing)* + - Jupyter Hub *(Jupyter notebook for multiple users)* + - Portainer *(Build and manage your Docker environments with ease)* + - Docker Registry *(The Docker Registry implementation for storing and distributing Docker images)* + - Docker Web UI *(A browser-based solution for browsing and modifying a private Docker registry)* You can choose, which tools to install in your workspace container and other containers, from the `.env` file. @@ -191,7 +220,7 @@ You can choose, which tools to install in your workspace container and other con -If you can't find your Software in the list, build it yourself and submit it. Contributions are welcomed :) +*If you can't find your Software in the list, build it yourself and submit it. Contributions are welcomed :)* From 26184055c5126dc51f2aadadd7a3b4a9506a1d04 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Mon, 15 Jul 2019 20:47:50 +0200 Subject: [PATCH 036/861] rename aws image to aws-eb-cli --- {aws => aws-eb-cli}/.gitignore | 0 {aws => aws-eb-cli}/Dockerfile | 0 docker-compose.yml | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename {aws => aws-eb-cli}/.gitignore (100%) rename {aws => aws-eb-cli}/Dockerfile (100%) diff --git a/aws/.gitignore b/aws-eb-cli/.gitignore similarity index 100% rename from aws/.gitignore rename to aws-eb-cli/.gitignore diff --git a/aws/Dockerfile b/aws-eb-cli/Dockerfile similarity index 100% rename from aws/Dockerfile rename to aws-eb-cli/Dockerfile diff --git a/docker-compose.yml b/docker-compose.yml index 7edfa77c3c..86dfda7ab5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1003,7 +1003,7 @@ services: ### AWS EB-CLI ################################################ aws: build: - context: ./aws + context: ./aws-eb-cli volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} depends_on: From db1a7cdbbc2258fb9ab4c0e7299935516ff1f07a Mon Sep 17 00:00:00 2001 From: Takafumi Enomoto Date: Mon, 22 Jul 2019 23:28:39 +0900 Subject: [PATCH 037/861] Add memcached extension support for PHP 7.3 (#2195) --- php-fpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index ab6ba6b086..cab7a83898 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -353,7 +353,7 @@ RUN if [ ${INSTALL_MEMCACHED} = true ]; then \ if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \ curl -L -o /tmp/memcached.tar.gz "https://github.com/php-memcached-dev/php-memcached/archive/2.2.0.tar.gz"; \ else \ - curl -L -o /tmp/memcached.tar.gz "https://github.com/php-memcached-dev/php-memcached/archive/php7.tar.gz"; \ + curl -L -o /tmp/memcached.tar.gz "https://github.com/php-memcached-dev/php-memcached/archive/master.tar.gz"; \ fi \ && mkdir -p memcached \ && tar -C memcached -zxvf /tmp/memcached.tar.gz --strip 1 \ From 69aa0b2b6a64a44659c815742039a9e24612b1a7 Mon Sep 17 00:00:00 2001 From: Yuqi Hao <45658979+haoyq02@users.noreply.github.com> Date: Mon, 22 Jul 2019 22:29:37 +0800 Subject: [PATCH 038/861] fix:laravel-horizon (#2181) --- docker-compose.yml | 1 + laravel-horizon/Dockerfile | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 86dfda7ab5..69b5dc69ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -245,6 +245,7 @@ services: - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL} - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED} + - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} - ./laravel-horizon/supervisord.d:/etc/supervisord.d diff --git a/laravel-horizon/Dockerfile b/laravel-horizon/Dockerfile index f21dfddedd..e89468e8fc 100644 --- a/laravel-horizon/Dockerfile +++ b/laravel-horizon/Dockerfile @@ -32,6 +32,12 @@ RUN if [ ${INSTALL_BCMATH} = true ]; then \ docker-php-ext-install bcmath \ ;fi +#Install Sockets package: +ARG INSTALL_AMQP=false +RUN if [ ${INSTALL_AMQP} = true ]; then \ + docker-php-ext-install sockets \ + ;fi + # Install PostgreSQL drivers: ARG INSTALL_PGSQL=false RUN if [ ${INSTALL_PGSQL} = true ]; then \ From 3a4c9158d26ef8a13bf5040762095a815bbc8481 Mon Sep 17 00:00:00 2001 From: Marco Manieri Date: Mon, 22 Jul 2019 16:31:46 +0200 Subject: [PATCH 039/861] Cannot load Xdebug - it was already loaded (#2123) zend_extension=xdebug.so is already in /etc/php/7.2/cli/conf.d/20-xdebug.ini rediefing the alias causes the was already loaded notice. also /var/www/vendor/bin/phpunit instead of ./vendor/bin/phpunit breaks the alias when vendor directory is not directly under the root app directory --- workspace/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 3a07eee286..bdc0349fbe 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -314,8 +314,7 @@ ARG INSTALL_XDEBUG=false RUN if [ ${INSTALL_XDEBUG} = true ]; then \ # Load the xdebug extension only with phpunit commands apt-get install -y php${LARADOCK_PHP_VERSION}-xdebug && \ - sed -i 's/^;//g' /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/20-xdebug.ini && \ - echo "alias phpunit='php -dzend_extension=xdebug.so /var/www/vendor/bin/phpunit'" >> ~/.bashrc \ + sed -i 's/^;//g' /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/20-xdebug.ini \ ;fi # ADD for REMOTE debugging From 63a5c45bf86a037d16b31b024108ec96856b537a Mon Sep 17 00:00:00 2001 From: Hany alsamman Date: Tue, 23 Jul 2019 07:08:56 +0300 Subject: [PATCH 040/861] Add PCNTL option to php-fpm --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 69b5dc69ea..9e6bce9ce4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -183,6 +183,7 @@ services: - INSTALL_MYSQL_CLIENT=${PHP_FPM_INSTALL_MYSQL_CLIENT} - INSTALL_PING=${PHP_FPM_INSTALL_PING} - INSTALL_SSHPASS=${PHP_FPM_INSTALL_SSHPASS} + - INSTALL_PCNTL=${PHP_FPM_INSTALL_PCNTL} - ADDITIONAL_LOCALES=${PHP_FPM_ADDITIONAL_LOCALES} - INSTALL_FFMPEG=${PHP_FPM_FFMPEG} - http_proxy From 440d865fc4579657f57eba24035674295cb4fdc5 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Tue, 23 Jul 2019 22:45:05 +0200 Subject: [PATCH 041/861] documentation text updates --- .github/README.md | 12 ++--- DOCUMENTATION/content/documentation/index.md | 52 +++++++------------ .../content/getting-started/index.md | 19 +++++-- DOCUMENTATION/content/introduction/index.md | 6 +-- 4 files changed, 42 insertions(+), 47 deletions(-) diff --git a/.github/README.md b/.github/README.md index 29b2cca83f..529d83229a 100644 --- a/.github/README.md +++ b/.github/README.md @@ -2,7 +2,7 @@ Laradock Logo

-

A Docker PHP development environment that facilitates running PHP Apps on Docker

+

PHP development environment that runs on Docker

Build status @@ -13,7 +13,7 @@ contributions welcome

-

Use Docker First And Learn About It Later

+

Use Docker First - Then Learn About It Later

forthebadge @@ -44,9 +44,9 @@ For basic sponsorships go to [Open Collective](https://opencollective.com/larado *Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website.* -## Contributors +## People -#### Core contributors: +#### Maintainers: - [Mahmoud Zalt](https://github.com/Mahmoudz) @mahmoudz | [Twitter](https://twitter.com/Mahmoud_Zalt) | [Site](http://zalt.me) - [Bo-Yi Wu](https://github.com/appleboy) @appleboy | [Twitter](https://twitter.com/appleboy) - [Philippe Trépanier](https://github.com/philtrep) @philtrep @@ -59,9 +59,9 @@ For basic sponsorships go to [Open Collective](https://opencollective.com/larado - [Milan Urukalo](https://github.com/urukalo) @urukalo - [Vince Chu](https://github.com/vwchu) @vwchu - [Huadong Zuo](https://github.com/zuohuadong) @zuohuadong -- Join us, by submitting 20 useful PR's. +- Join us. -#### Awesome contributors: +#### Awesome Contributors: diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index 2560a8e56b..a9aeb8a17e 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -297,6 +297,24 @@ e) set it to `true` For information on how to configure xDebug with your IDE and work it out, check this [Repository](https://github.com/LarryEitel/laravel-laradock-phpstorm) or follow up on the next section if you use linux and PhpStorm. + + +
+ +## Start/Stop xDebug: + +By installing xDebug, you are enabling it to run on startup by default. + +To control the behavior of xDebug (in the `php-fpm` Container), you can run the following commands from the Laradock root folder, (at the same prompt where you run docker-compose): + +- Stop xDebug from running by default: `.php-fpm/xdebug stop`. +- Start xDebug by default: `.php-fpm/xdebug start`. +- See the status: `.php-fpm/xdebug status`. + +Note: If `.php-fpm/xdebug` doesn't execute and gives `Permission Denied` error the problem can be that file `xdebug` doesn't have execution access. This can be fixed by running `chmod` command with desired access permissions. + + +
## Install phpdbg @@ -321,22 +339,6 @@ PHP_FPM_INSTALL_PHPDBG=true -
- -## Start/Stop xDebug: - -By installing xDebug, you are enabling it to run on startup by default. - -To control the behavior of xDebug (in the `php-fpm` Container), you can run the following commands from the Laradock root folder, (at the same prompt where you run docker-compose): - -- Stop xDebug from running by default: `.php-fpm/xdebug stop`. -- Start xDebug by default: `.php-fpm/xdebug start`. -- See the status: `.php-fpm/xdebug status`. - -Note: If `.php-fpm/xdebug` doesn't execute and gives `Permission Denied` error the problem can be that file `xdebug` doesn't have execution access. This can be fixed by running `chmod` command with desired access permissions. - - -
@@ -1566,22 +1568,6 @@ Available versions are: 5.5, 5.6, 5.7, 8.0, or latest. See https://store.docker -
- -## MySQL access from host - -You can forward the MySQL/MariaDB port to your host by making sure these lines are added to the `mysql` or `mariadb` section of the `docker-compose.yml` or in your [environment specific Compose](https://docs.docker.com/compose/extends/) file. - -``` -ports: - - "3306:3306" -``` - - - - - -
## MySQL root access @@ -1682,7 +1668,7 @@ Enabling Global Composer Install during the build for the container allows you t
-## Magento 2 authentication credential (composer install) +## Add authentication credential for Magento 2 1 - Open the `.env` file diff --git a/DOCUMENTATION/content/getting-started/index.md b/DOCUMENTATION/content/getting-started/index.md index d4f6d54445..f71661dad5 100644 --- a/DOCUMENTATION/content/getting-started/index.md +++ b/DOCUMENTATION/content/getting-started/index.md @@ -41,7 +41,7 @@ Note: If you are not using Git yet for your project, you can use `git clone` ins *To keep track of your Laradock changes, between your projects and also keep Laradock updated [check these docs](/documentation/#keep-track-of-your-laradock-changes)* -Your folder structure should look like this: +2 - Make sure your folder structure should look like this: ``` + project-a @@ -52,7 +52,7 @@ Your folder structure should look like this: *(It's important to rename the laradock folders to unique name in each project, if you want to run laradock per project).* -> **Now jump to the [Usage](#Usage) section.** +3 - Go to the [Usage](#Usage) section. ### A.2) Don't have a PHP project yet: @@ -86,7 +86,7 @@ APP_CODE_PATH_HOST=../project-z/ Make sure to replace `project-z` with your project folder name. -> **Now jump to the [Usage](#Usage) section.** +3 - Go to the [Usage](#Usage) section. @@ -127,7 +127,7 @@ You can rename the config files, project folders and domains as you like, just m If you use Chrome 63 or above for development, don't use `.dev`. [Why?](https://laravel-news.com/chrome-63-now-forces-dev-domains-https). Instead use `.localhost`, `.invalid`, `.test`, or `.example`. -> **Now jump to the [Usage](#Usage) section.** +4 - Go to the [Usage](#Usage) section. @@ -213,7 +213,16 @@ Open your PHP project's `.env` file or whichever configuration file you are read DB_HOST=mysql ``` +You need to use the Laradock's default DB credentials which can be found in the `.env` file (ex: `MYSQL_USER=`). +Or you can change them and rebuild the container. + *If you want to install Laravel as PHP project, see [How to Install Laravel in a Docker Container](#Install-Laravel).*
-5 - Open your browser and visit your localhost address `http://localhost/`. If you followed the multiple projects setup, you can visit `http://project-1.test/` and `http://project-2.test/`. +5 - Open your browser and visit your localhost address. + +If you followed the multiple projects setup, you can visit `http://project-1.test/` and `http://project-2.test/`. + +[http://localhost:8080](http://localhost:8080) + +Make sure you add use the right port number as provided by your running server. Ex: NGINX uses port 8080 by default while Apache2 uses 80. diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 82e6ad9cc1..4874e43760 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -5,9 +5,9 @@ weight: 1 --- +## Use Docker First - Then Learn About It Later - -A full PHP development environment for Docker. +Laradock is a PHP development environment that runs on Docker. Supports a variety of useful Docker Images, pre-configured to provide a wonderful PHP development environment. @@ -175,7 +175,7 @@ That's it! enjoy :) - Web IDE - **Miscellaneous:** - - Workspace: *(Laradock container that includes a rich set of pre-configured useful tools)* + - Workspace *(Laradock container that includes a rich set of pre-configured useful tools)* - `PHP CLI` - `Composer` - `Git` From c604de0af0f2230dca3c53e96fd4a23bf3fc45e2 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Tue, 23 Jul 2019 22:45:54 +0200 Subject: [PATCH 042/861] add @lanphan and @ahkui to project maintainers --- .github/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/README.md b/.github/README.md index 529d83229a..c3b5c842ce 100644 --- a/.github/README.md +++ b/.github/README.md @@ -59,6 +59,8 @@ For basic sponsorships go to [Open Collective](https://opencollective.com/larado - [Milan Urukalo](https://github.com/urukalo) @urukalo - [Vince Chu](https://github.com/vwchu) @vwchu - [Huadong Zuo](https://github.com/zuohuadong) @zuohuadong +- [Lan Phan](https://github.com/lanphan) @lanphan +- [Ahkui](https://github.com/ahkui) @ahkui - Join us. #### Awesome Contributors: From 768f14b6dd13529842af521323776ee97d87efef Mon Sep 17 00:00:00 2001 From: Feng Hao Date: Wed, 24 Jul 2019 21:06:36 +0800 Subject: [PATCH 043/861] fix: apt error after imap installed (#2212) --- php-fpm/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index cab7a83898..a25e5f42f4 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -573,7 +573,6 @@ ARG INSTALL_IMAP=false RUN if [ ${INSTALL_IMAP} = true ]; then \ apt-get install -y libc-client-dev libkrb5-dev && \ - rm -r /var/lib/apt/lists/* && \ docker-php-ext-configure imap --with-kerberos --with-imap-ssl && \ docker-php-ext-install imap \ ;fi From 9a852e7bc7ad256a3dfd38e9cdb7b61f0e2fd7e9 Mon Sep 17 00:00:00 2001 From: Stefan Neuhaus Date: Thu, 25 Jul 2019 08:02:59 +0200 Subject: [PATCH 044/861] Implementing Cassandra DB & PHP Extension --- cassandra/Dockerfile | 5 +++++ docker-compose.yml | 38 ++++++++++++++++++++++++++++++++++++++ env-example | 36 ++++++++++++++++++++++++++++++++++++ laravel-horizon/Dockerfile | 22 ++++++++++++++++++++++ php-worker/Dockerfile | 20 ++++++++++++++++++++ workspace/Dockerfile | 31 +++++++++++++++++++++++++++++++ 6 files changed, 152 insertions(+) create mode 100644 cassandra/Dockerfile diff --git a/cassandra/Dockerfile b/cassandra/Dockerfile new file mode 100644 index 0000000000..cdf280aab7 --- /dev/null +++ b/cassandra/Dockerfile @@ -0,0 +1,5 @@ +ARG CASSANDRA_VERSION=latest +FROM bitnami/cassandra:${CASSANDRA_VERSION} + +LABEL maintainer="Stefan Neuhaus " + diff --git a/docker-compose.yml b/docker-compose.yml index 69b5dc69ea..6773264b54 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -45,6 +45,8 @@ volumes: driver: ${VOLUMES_DRIVER} sonarqube: driver: ${VOLUMES_DRIVER} + cassandra: + driver: ${VOLUMES_DRIVER} services: @@ -67,6 +69,7 @@ services: - INSTALL_IMAP=${WORKSPACE_INSTALL_IMAP} - INSTALL_MONGO=${WORKSPACE_INSTALL_MONGO} - INSTALL_AMQP=${WORKSPACE_INSTALL_AMQP} + - INSTALL_CASSANDRA=${WORKSPACE_INSTALL_CASSANDRA} - INSTALL_PHPREDIS=${WORKSPACE_INSTALL_PHPREDIS} - INSTALL_MSSQL=${WORKSPACE_INSTALL_MSSQL} - INSTALL_NODE=${WORKSPACE_INSTALL_NODE} @@ -153,6 +156,7 @@ services: - INSTALL_IMAP=${PHP_FPM_INSTALL_IMAP} - INSTALL_MONGO=${PHP_FPM_INSTALL_MONGO} - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} + - INSTALL_CASSANDRA=${PHP_FPM_INSTALL_CASSANDRA} - INSTALL_MSSQL=${PHP_FPM_INSTALL_MSSQL} - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} - INSTALL_GMP=${PHP_FPM_INSTALL_GMP} @@ -220,6 +224,7 @@ services: - INSTALL_ZIP_ARCHIVE=${PHP_WORKER_INSTALL_ZIP_ARCHIVE} - INSTALL_MYSQL_CLIENT=${PHP_WORKER_INSTALL_MYSQL_CLIENT} - INSTALL_AMQP=${PHP_WORKER_INSTALL_AMQP} + - INSTALL_CASSANDRA=${PHP_WORKER_INSTALL_CASSANDRA} - INSTALL_GHOSTSCRIPT=${PHP_WORKER_INSTALL_GHOSTSCRIPT} - INSTALL_SWOOLE=${PHP_WORKER_INSTALL_SWOOLE} - INSTALL_TAINT=${PHP_WORKER_INSTALL_TAINT} @@ -246,6 +251,7 @@ services: - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED} - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} + - INSTALL_CASSANDRA=${PHP_FPM_INSTALL_CASSANDRA} volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} - ./laravel-horizon/supervisord.d:/etc/supervisord.d @@ -584,6 +590,38 @@ services: networks: - backend +### Cassandra ############################################ + cassandra: + build: ./cassandra + ports: + - "${CASSANDRA_TRANSPORT_PORT_NUMBER}:7000" + - "${CASSANDRA_JMX_PORT_NUMBER}:7199" + - "${CASSANDRA_CQL_PORT_NUMBER}:9042" + privileged: true + environment: + - CASSANDRA_VERSION=${CASSANDRA_VERSION} + - CASSANDRA_TRANSPORT_PORT_NUMBER=${CASSANDRA_TRANSPORT_PORT_NUMBER} + - CASSANDRA_JMX_PORT_NUMBER=${CASSANDRA_JMX_PORT_NUMBER} + - CASSANDRA_CQL_PORT_NUMBER=${CASSANDRA_CQL_PORT_NUMBER} + - CASSANDRA_USER=${CASSANDRA_USER} + - CASSANDRA_PASSWORD_SEEDER=${CASSANDRA_PASSWORD_SEEDER} + - CASSANDRA_PASSWORD=${CASSANDRA_PASSWORD} + - CASSANDRA_NUM_TOKENS=${CASSANDRA_NUM_TOKENS} + - CASSANDRA_HOST=${CASSANDRA_HOST} + - CASSANDRA_CLUSTER_NAME=${CASSANDRA_CLUSTER_NAME} + - CASSANDRA_SEEDS=${CASSANDRA_SEEDS} + - CASSANDRA_ENDPOINT_SNITCH=${CASSANDRA_ENDPOINT_SNITCH} + - CASSANDRA_ENABLE_RPC=${CASSANDRA_ENABLE_RPC} + - CASSANDRA_DATACENTER=${CASSANDRA_DATACENTER} + - CASSANDRA_RACK=${CASSANDRA_RACK} + hostname: laradock-cassandra + volumes: + - ${DATA_PATH_HOST}/cassandra:/var/lib/cassandra + depends_on: + - php-fpm + networks: + - backend + ### Beanstalkd Console ################################### beanstalkd-console: build: ./beanstalkd-console diff --git a/env-example b/env-example index a7bf59bc8f..a4793a7cd0 100644 --- a/env-example +++ b/env-example @@ -106,6 +106,7 @@ WORKSPACE_INSTALL_XSL=false WORKSPACE_INSTALL_IMAP=false WORKSPACE_INSTALL_MONGO=false WORKSPACE_INSTALL_AMQP=false +WORKSPACE_INSTALL_CASSANDRA=false WORKSPACE_INSTALL_MSSQL=false WORKSPACE_INSTALL_DRUSH=false WORKSPACE_DRUSH_VERSION=8.1.17 @@ -161,6 +162,7 @@ PHP_FPM_INSTALL_PHPDBG=false PHP_FPM_INSTALL_IMAP=false PHP_FPM_INSTALL_MONGO=false PHP_FPM_INSTALL_AMQP=false +PHP_FPM_INSTALL_CASSANDRA=false PHP_FPM_INSTALL_MSSQL=false PHP_FPM_INSTALL_SSH2=false PHP_FPM_INSTALL_SOAP=false @@ -205,6 +207,7 @@ PHP_WORKER_INSTALL_SWOOLE=false PHP_WORKER_INSTALL_TAINT=false PHP_WORKER_INSTALL_FFMPEG=false PHP_WORKER_INSTALL_GMP=false +PHP_WORKER_INSTALL_CASSANDRA=false PHP_WORKER_PUID=1000 PHP_WORKER_PGID=1000 @@ -731,3 +734,36 @@ SONARQUBE_POSTGRES_HOST=postgres SONARQUBE_POSTGRES_DB=sonar SONARQUBE_POSTGRES_USER=sonar SONARQUBE_POSTGRES_PASSWORD=sonarPass + +### CASSANDRA ################################################ + +# Cassandra Version, supported tags can be found at https://hub.docker.com/r/bitnami/cassandra/ +CASSANDRA_VERSION=latest +# Inter-node cluster communication port. Default: 7000 +CASSANDRA_TRANSPORT_PORT_NUMBER=7000 +# JMX connections port. Default: 7199 +CASSANDRA_JMX_PORT_NUMBER=7199 +# Client port. Default: 9042. +CASSANDRA_CQL_PORT_NUMBER=9042 +# Cassandra user name. Defaults: cassandra +CASSANDRA_USER=cassandra +# Password seeder will change the Cassandra default credentials at initialization. In clusters, only one node should be marked as password seeder. Default: no +CASSANDRA_PASSWORD_SEEDER=no +# Cassandra user password. Default: cassandra +CASSANDRA_PASSWORD=cassandra +# Number of tokens for the node. Default: 256. +CASSANDRA_NUM_TOKENS=256 +# Hostname used to configure Cassandra. It can be either an IP or a domain. If left empty, it will be resolved to the machine IP. +CASSANDRA_HOST= +# Cluster name to configure Cassandra.. Defaults: My Cluster +CASSANDRA_CLUSTER_NAME="My Cluster" +# : Hosts that will act as Cassandra seeds. No defaults. +CASSANDRA_SEEDS= + # Snitch name (which determines which data centers and racks nodes belong to). Default SimpleSnitch +CASSANDRA_ENDPOINT_SNITCH=SimpleSnitch + # Enable the thrift RPC endpoint. Default :true +CASSANDRA_ENABLE_RPC=true +# Datacenter name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: dc1. +CASSANDRA_DATACENTER=dc1 +# Rack name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: rack1. +CASSANDRA_RACK=rack1 \ No newline at end of file diff --git a/laravel-horizon/Dockerfile b/laravel-horizon/Dockerfile index e89468e8fc..c94861636e 100644 --- a/laravel-horizon/Dockerfile +++ b/laravel-horizon/Dockerfile @@ -45,6 +45,28 @@ RUN if [ ${INSTALL_PGSQL} = true ]; then \ && docker-php-ext-install pdo_pgsql \ ;fi +# Install Cassandra drivers: +ARG INSTALL_CASSANDRA=false +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + apk --update add cassandra-cpp-driver \ + ;fi + +WORKDIR /usr/src +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + git clone https://github.com/datastax/php-driver.git \ + && cd php-driver/ext \ + && phpize \ + && mkdir -p /usr/src/php-driver/build \ + && cd /usr/src/php-driver/build \ + && ../ext/configure > /dev/null \ + && make clean >/dev/null \ + && make >/dev/null 2>&1 \ + && make install \ + && docker-php-ext-enable cassandra \ +;fi + + + ########################################################################### # PHP Memcached: ########################################################################### diff --git a/php-worker/Dockerfile b/php-worker/Dockerfile index 5297c7b54e..b8d482d209 100644 --- a/php-worker/Dockerfile +++ b/php-worker/Dockerfile @@ -85,6 +85,26 @@ RUN if [ ${INSTALL_AMQP} = true ]; then \ docker-php-ext-install sockets \ ;fi +# Install Cassandra drivers: +ARG INSTALL_CASSANDRA=false +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + apk --update add cassandra-cpp-driver \ + ;fi + +WORKDIR /usr/src +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + git clone https://github.com/datastax/php-driver.git \ + && cd php-driver/ext \ + && phpize \ + && mkdir -p /usr/src/php-driver/build \ + && cd /usr/src/php-driver/build \ + && ../ext/configure --with-php-config=/usr/bin/php-config7.1 > /dev/null \ + && make clean >/dev/null \ + && make >/dev/null 2>&1 \ + && make install \ + && docker-php-ext-enable cassandra \ +;fi + # Install Phalcon ext ARG INSTALL_PHALCON=false ARG PHALCON_VERSION diff --git a/workspace/Dockerfile b/workspace/Dockerfile index bdc0349fbe..cbbeb2e9f3 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -406,6 +406,37 @@ RUN if [ ${INSTALL_AMQP} = true ]; then \ ln -s /etc/php/${LARADOCK_PHP_VERSION}/mods-available/amqp.ini /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/30-amqp.ini \ ;fi +########################################################################### +# CASSANDRA: +########################################################################### + +ARG INSTALL_CASSANDRA=false + +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + apt-get install libgmp-dev -y && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/dependencies/libuv/v1.28.0/libuv1-dev_1.28.0-1_amd64.deb -o libuv1-dev.deb && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/dependencies/libuv/v1.28.0/libuv1_1.28.0-1_amd64.deb -o libuv1.deb && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/cassandra/v2.12.0/cassandra-cpp-driver-dev_2.12.0-1_amd64.deb -o cassandra-cpp-driver-dev.deb && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/cassandra/v2.12.0/cassandra-cpp-driver_2.12.0-1_amd64.deb -o cassandra-cpp-driver.deb && \ + dpkg -i libuv1.deb && \ + dpkg -i libuv1-dev.deb && \ + dpkg -i cassandra-cpp-driver.deb && \ + dpkg -i cassandra-cpp-driver-dev.deb && \ + rm libuv1.deb libuv1-dev.deb cassandra-cpp-driver-dev.deb cassandra-cpp-driver.deb && \ + cd /usr/src && \ + git clone https://github.com/datastax/php-driver.git && \ + cd /usr/src/php-driver/ext && \ + phpize && \ + mkdir /usr/src/php-driver/build && \ + cd /usr/src/php-driver/build && \ + ../ext/configure > /dev/null && \ + make clean >/dev/null && \ + make >/dev/null 2>&1 && \ + make install && \ + echo "extension=cassandra.so" >> /etc/php/${LARADOCK_PHP_VERSION}/mods-available/cassandra.ini && \ + ln -s /etc/php/${LARADOCK_PHP_VERSION}/mods-available/cassandra.ini /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/30-cassandra.ini \ +;fi + ########################################################################### # PHP REDIS EXTENSION ########################################################################### From 99ceef7b458973251d53c606eebf6277dcb0fe62 Mon Sep 17 00:00:00 2001 From: Stefan Neuhaus Date: Thu, 25 Jul 2019 08:08:01 +0200 Subject: [PATCH 045/861] Update documentation for Cassandra --- DOCUMENTATION/content/introduction/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 4874e43760..143faa206a 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -125,6 +125,7 @@ That's it! enjoy :) - Neo4j - CouchDB - RethinkDB + - Cassandra - **Database Management Apps:** From 4cb6ffc76655c8c70dc326f5f548d41cc2b37814 Mon Sep 17 00:00:00 2001 From: Stefan Neuhaus Date: Thu, 25 Jul 2019 08:14:50 +0200 Subject: [PATCH 046/861] Added Cassandra for testing CI --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d473177106..8773aa3290 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ env: - PHP_VERSION=NA BUILD_SERVICE=solr - PHP_VERSION=NA BUILD_SERVICE="mssql rethinkdb aerospike" - - PHP_VERSION=NA BUILD_SERVICE="blackfire minio percona nginx caddy apache2 mysql mariadb postgres postgres-postgis neo4j mongo redis" + - PHP_VERSION=NA BUILD_SERVICE="blackfire minio percona nginx caddy apache2 mysql mariadb postgres postgres-postgis neo4j mongo redis cassandra" - PHP_VERSION=NA BUILD_SERVICE="adminer phpmyadmin pgadmin" - PHP_VERSION=NA BUILD_SERVICE="memcached beanstalkd beanstalkd-console rabbitmq elasticsearch certbot mailhog maildev selenium jenkins proxy proxy2 haproxy" - PHP_VERSION=NA BUILD_SERVICE="kibana grafana laravel-echo-server" From 1602ff2dd054afd085881cffd5426246f880bfea Mon Sep 17 00:00:00 2001 From: stefan Date: Thu, 25 Jul 2019 10:18:33 +0200 Subject: [PATCH 047/861] Implement Cassandra DB & PHP Extension (#2214) * Implementing Cassandra DB & PHP Extension * Update documentation for Cassandra * Added Cassandra for testing CI --- .travis.yml | 2 +- DOCUMENTATION/content/introduction/index.md | 1 + cassandra/Dockerfile | 5 +++ docker-compose.yml | 38 +++++++++++++++++++++ env-example | 36 +++++++++++++++++++ laravel-horizon/Dockerfile | 22 ++++++++++++ php-worker/Dockerfile | 20 +++++++++++ workspace/Dockerfile | 31 +++++++++++++++++ 8 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 cassandra/Dockerfile diff --git a/.travis.yml b/.travis.yml index d473177106..8773aa3290 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ env: - PHP_VERSION=NA BUILD_SERVICE=solr - PHP_VERSION=NA BUILD_SERVICE="mssql rethinkdb aerospike" - - PHP_VERSION=NA BUILD_SERVICE="blackfire minio percona nginx caddy apache2 mysql mariadb postgres postgres-postgis neo4j mongo redis" + - PHP_VERSION=NA BUILD_SERVICE="blackfire minio percona nginx caddy apache2 mysql mariadb postgres postgres-postgis neo4j mongo redis cassandra" - PHP_VERSION=NA BUILD_SERVICE="adminer phpmyadmin pgadmin" - PHP_VERSION=NA BUILD_SERVICE="memcached beanstalkd beanstalkd-console rabbitmq elasticsearch certbot mailhog maildev selenium jenkins proxy proxy2 haproxy" - PHP_VERSION=NA BUILD_SERVICE="kibana grafana laravel-echo-server" diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 4874e43760..143faa206a 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -125,6 +125,7 @@ That's it! enjoy :) - Neo4j - CouchDB - RethinkDB + - Cassandra - **Database Management Apps:** diff --git a/cassandra/Dockerfile b/cassandra/Dockerfile new file mode 100644 index 0000000000..cdf280aab7 --- /dev/null +++ b/cassandra/Dockerfile @@ -0,0 +1,5 @@ +ARG CASSANDRA_VERSION=latest +FROM bitnami/cassandra:${CASSANDRA_VERSION} + +LABEL maintainer="Stefan Neuhaus " + diff --git a/docker-compose.yml b/docker-compose.yml index 69b5dc69ea..6773264b54 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -45,6 +45,8 @@ volumes: driver: ${VOLUMES_DRIVER} sonarqube: driver: ${VOLUMES_DRIVER} + cassandra: + driver: ${VOLUMES_DRIVER} services: @@ -67,6 +69,7 @@ services: - INSTALL_IMAP=${WORKSPACE_INSTALL_IMAP} - INSTALL_MONGO=${WORKSPACE_INSTALL_MONGO} - INSTALL_AMQP=${WORKSPACE_INSTALL_AMQP} + - INSTALL_CASSANDRA=${WORKSPACE_INSTALL_CASSANDRA} - INSTALL_PHPREDIS=${WORKSPACE_INSTALL_PHPREDIS} - INSTALL_MSSQL=${WORKSPACE_INSTALL_MSSQL} - INSTALL_NODE=${WORKSPACE_INSTALL_NODE} @@ -153,6 +156,7 @@ services: - INSTALL_IMAP=${PHP_FPM_INSTALL_IMAP} - INSTALL_MONGO=${PHP_FPM_INSTALL_MONGO} - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} + - INSTALL_CASSANDRA=${PHP_FPM_INSTALL_CASSANDRA} - INSTALL_MSSQL=${PHP_FPM_INSTALL_MSSQL} - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} - INSTALL_GMP=${PHP_FPM_INSTALL_GMP} @@ -220,6 +224,7 @@ services: - INSTALL_ZIP_ARCHIVE=${PHP_WORKER_INSTALL_ZIP_ARCHIVE} - INSTALL_MYSQL_CLIENT=${PHP_WORKER_INSTALL_MYSQL_CLIENT} - INSTALL_AMQP=${PHP_WORKER_INSTALL_AMQP} + - INSTALL_CASSANDRA=${PHP_WORKER_INSTALL_CASSANDRA} - INSTALL_GHOSTSCRIPT=${PHP_WORKER_INSTALL_GHOSTSCRIPT} - INSTALL_SWOOLE=${PHP_WORKER_INSTALL_SWOOLE} - INSTALL_TAINT=${PHP_WORKER_INSTALL_TAINT} @@ -246,6 +251,7 @@ services: - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED} - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} + - INSTALL_CASSANDRA=${PHP_FPM_INSTALL_CASSANDRA} volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} - ./laravel-horizon/supervisord.d:/etc/supervisord.d @@ -584,6 +590,38 @@ services: networks: - backend +### Cassandra ############################################ + cassandra: + build: ./cassandra + ports: + - "${CASSANDRA_TRANSPORT_PORT_NUMBER}:7000" + - "${CASSANDRA_JMX_PORT_NUMBER}:7199" + - "${CASSANDRA_CQL_PORT_NUMBER}:9042" + privileged: true + environment: + - CASSANDRA_VERSION=${CASSANDRA_VERSION} + - CASSANDRA_TRANSPORT_PORT_NUMBER=${CASSANDRA_TRANSPORT_PORT_NUMBER} + - CASSANDRA_JMX_PORT_NUMBER=${CASSANDRA_JMX_PORT_NUMBER} + - CASSANDRA_CQL_PORT_NUMBER=${CASSANDRA_CQL_PORT_NUMBER} + - CASSANDRA_USER=${CASSANDRA_USER} + - CASSANDRA_PASSWORD_SEEDER=${CASSANDRA_PASSWORD_SEEDER} + - CASSANDRA_PASSWORD=${CASSANDRA_PASSWORD} + - CASSANDRA_NUM_TOKENS=${CASSANDRA_NUM_TOKENS} + - CASSANDRA_HOST=${CASSANDRA_HOST} + - CASSANDRA_CLUSTER_NAME=${CASSANDRA_CLUSTER_NAME} + - CASSANDRA_SEEDS=${CASSANDRA_SEEDS} + - CASSANDRA_ENDPOINT_SNITCH=${CASSANDRA_ENDPOINT_SNITCH} + - CASSANDRA_ENABLE_RPC=${CASSANDRA_ENABLE_RPC} + - CASSANDRA_DATACENTER=${CASSANDRA_DATACENTER} + - CASSANDRA_RACK=${CASSANDRA_RACK} + hostname: laradock-cassandra + volumes: + - ${DATA_PATH_HOST}/cassandra:/var/lib/cassandra + depends_on: + - php-fpm + networks: + - backend + ### Beanstalkd Console ################################### beanstalkd-console: build: ./beanstalkd-console diff --git a/env-example b/env-example index a7bf59bc8f..a4793a7cd0 100644 --- a/env-example +++ b/env-example @@ -106,6 +106,7 @@ WORKSPACE_INSTALL_XSL=false WORKSPACE_INSTALL_IMAP=false WORKSPACE_INSTALL_MONGO=false WORKSPACE_INSTALL_AMQP=false +WORKSPACE_INSTALL_CASSANDRA=false WORKSPACE_INSTALL_MSSQL=false WORKSPACE_INSTALL_DRUSH=false WORKSPACE_DRUSH_VERSION=8.1.17 @@ -161,6 +162,7 @@ PHP_FPM_INSTALL_PHPDBG=false PHP_FPM_INSTALL_IMAP=false PHP_FPM_INSTALL_MONGO=false PHP_FPM_INSTALL_AMQP=false +PHP_FPM_INSTALL_CASSANDRA=false PHP_FPM_INSTALL_MSSQL=false PHP_FPM_INSTALL_SSH2=false PHP_FPM_INSTALL_SOAP=false @@ -205,6 +207,7 @@ PHP_WORKER_INSTALL_SWOOLE=false PHP_WORKER_INSTALL_TAINT=false PHP_WORKER_INSTALL_FFMPEG=false PHP_WORKER_INSTALL_GMP=false +PHP_WORKER_INSTALL_CASSANDRA=false PHP_WORKER_PUID=1000 PHP_WORKER_PGID=1000 @@ -731,3 +734,36 @@ SONARQUBE_POSTGRES_HOST=postgres SONARQUBE_POSTGRES_DB=sonar SONARQUBE_POSTGRES_USER=sonar SONARQUBE_POSTGRES_PASSWORD=sonarPass + +### CASSANDRA ################################################ + +# Cassandra Version, supported tags can be found at https://hub.docker.com/r/bitnami/cassandra/ +CASSANDRA_VERSION=latest +# Inter-node cluster communication port. Default: 7000 +CASSANDRA_TRANSPORT_PORT_NUMBER=7000 +# JMX connections port. Default: 7199 +CASSANDRA_JMX_PORT_NUMBER=7199 +# Client port. Default: 9042. +CASSANDRA_CQL_PORT_NUMBER=9042 +# Cassandra user name. Defaults: cassandra +CASSANDRA_USER=cassandra +# Password seeder will change the Cassandra default credentials at initialization. In clusters, only one node should be marked as password seeder. Default: no +CASSANDRA_PASSWORD_SEEDER=no +# Cassandra user password. Default: cassandra +CASSANDRA_PASSWORD=cassandra +# Number of tokens for the node. Default: 256. +CASSANDRA_NUM_TOKENS=256 +# Hostname used to configure Cassandra. It can be either an IP or a domain. If left empty, it will be resolved to the machine IP. +CASSANDRA_HOST= +# Cluster name to configure Cassandra.. Defaults: My Cluster +CASSANDRA_CLUSTER_NAME="My Cluster" +# : Hosts that will act as Cassandra seeds. No defaults. +CASSANDRA_SEEDS= + # Snitch name (which determines which data centers and racks nodes belong to). Default SimpleSnitch +CASSANDRA_ENDPOINT_SNITCH=SimpleSnitch + # Enable the thrift RPC endpoint. Default :true +CASSANDRA_ENABLE_RPC=true +# Datacenter name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: dc1. +CASSANDRA_DATACENTER=dc1 +# Rack name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: rack1. +CASSANDRA_RACK=rack1 \ No newline at end of file diff --git a/laravel-horizon/Dockerfile b/laravel-horizon/Dockerfile index e89468e8fc..c94861636e 100644 --- a/laravel-horizon/Dockerfile +++ b/laravel-horizon/Dockerfile @@ -45,6 +45,28 @@ RUN if [ ${INSTALL_PGSQL} = true ]; then \ && docker-php-ext-install pdo_pgsql \ ;fi +# Install Cassandra drivers: +ARG INSTALL_CASSANDRA=false +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + apk --update add cassandra-cpp-driver \ + ;fi + +WORKDIR /usr/src +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + git clone https://github.com/datastax/php-driver.git \ + && cd php-driver/ext \ + && phpize \ + && mkdir -p /usr/src/php-driver/build \ + && cd /usr/src/php-driver/build \ + && ../ext/configure > /dev/null \ + && make clean >/dev/null \ + && make >/dev/null 2>&1 \ + && make install \ + && docker-php-ext-enable cassandra \ +;fi + + + ########################################################################### # PHP Memcached: ########################################################################### diff --git a/php-worker/Dockerfile b/php-worker/Dockerfile index 5297c7b54e..b8d482d209 100644 --- a/php-worker/Dockerfile +++ b/php-worker/Dockerfile @@ -85,6 +85,26 @@ RUN if [ ${INSTALL_AMQP} = true ]; then \ docker-php-ext-install sockets \ ;fi +# Install Cassandra drivers: +ARG INSTALL_CASSANDRA=false +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + apk --update add cassandra-cpp-driver \ + ;fi + +WORKDIR /usr/src +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + git clone https://github.com/datastax/php-driver.git \ + && cd php-driver/ext \ + && phpize \ + && mkdir -p /usr/src/php-driver/build \ + && cd /usr/src/php-driver/build \ + && ../ext/configure --with-php-config=/usr/bin/php-config7.1 > /dev/null \ + && make clean >/dev/null \ + && make >/dev/null 2>&1 \ + && make install \ + && docker-php-ext-enable cassandra \ +;fi + # Install Phalcon ext ARG INSTALL_PHALCON=false ARG PHALCON_VERSION diff --git a/workspace/Dockerfile b/workspace/Dockerfile index bdc0349fbe..cbbeb2e9f3 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -406,6 +406,37 @@ RUN if [ ${INSTALL_AMQP} = true ]; then \ ln -s /etc/php/${LARADOCK_PHP_VERSION}/mods-available/amqp.ini /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/30-amqp.ini \ ;fi +########################################################################### +# CASSANDRA: +########################################################################### + +ARG INSTALL_CASSANDRA=false + +RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ + apt-get install libgmp-dev -y && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/dependencies/libuv/v1.28.0/libuv1-dev_1.28.0-1_amd64.deb -o libuv1-dev.deb && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/dependencies/libuv/v1.28.0/libuv1_1.28.0-1_amd64.deb -o libuv1.deb && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/cassandra/v2.12.0/cassandra-cpp-driver-dev_2.12.0-1_amd64.deb -o cassandra-cpp-driver-dev.deb && \ + curl https://downloads.datastax.com/cpp-driver/ubuntu/18.04/cassandra/v2.12.0/cassandra-cpp-driver_2.12.0-1_amd64.deb -o cassandra-cpp-driver.deb && \ + dpkg -i libuv1.deb && \ + dpkg -i libuv1-dev.deb && \ + dpkg -i cassandra-cpp-driver.deb && \ + dpkg -i cassandra-cpp-driver-dev.deb && \ + rm libuv1.deb libuv1-dev.deb cassandra-cpp-driver-dev.deb cassandra-cpp-driver.deb && \ + cd /usr/src && \ + git clone https://github.com/datastax/php-driver.git && \ + cd /usr/src/php-driver/ext && \ + phpize && \ + mkdir /usr/src/php-driver/build && \ + cd /usr/src/php-driver/build && \ + ../ext/configure > /dev/null && \ + make clean >/dev/null && \ + make >/dev/null 2>&1 && \ + make install && \ + echo "extension=cassandra.so" >> /etc/php/${LARADOCK_PHP_VERSION}/mods-available/cassandra.ini && \ + ln -s /etc/php/${LARADOCK_PHP_VERSION}/mods-available/cassandra.ini /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/30-cassandra.ini \ +;fi + ########################################################################### # PHP REDIS EXTENSION ########################################################################### From 044261b06fe461c5193581c9863531b06cc343df Mon Sep 17 00:00:00 2001 From: Stefan Neuhaus Date: Thu, 25 Jul 2019 12:03:21 +0200 Subject: [PATCH 048/861] Implement Gearman Message broker & PHP Extension --- .travis.yml | 2 +- DOCUMENTATION/content/introduction/index.md | 1 + docker-compose.yml | 36 +++++++++++++++ env-example | 50 ++++++++++++++++++++- gearman/Dockerfile | 5 +++ php-fpm/Dockerfile | 24 ++++++++++ php-worker/Dockerfile | 7 +++ workspace/Dockerfile | 12 +++++ 8 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 gearman/Dockerfile diff --git a/.travis.yml b/.travis.yml index 8773aa3290..8d92a02bec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ env: - PHP_VERSION=NA BUILD_SERVICE="mssql rethinkdb aerospike" - PHP_VERSION=NA BUILD_SERVICE="blackfire minio percona nginx caddy apache2 mysql mariadb postgres postgres-postgis neo4j mongo redis cassandra" - PHP_VERSION=NA BUILD_SERVICE="adminer phpmyadmin pgadmin" - - PHP_VERSION=NA BUILD_SERVICE="memcached beanstalkd beanstalkd-console rabbitmq elasticsearch certbot mailhog maildev selenium jenkins proxy proxy2 haproxy" + - PHP_VERSION=NA BUILD_SERVICE="memcached beanstalkd beanstalkd-console rabbitmq elasticsearch certbot mailhog maildev selenium jenkins proxy proxy2 haproxy gearman" - PHP_VERSION=NA BUILD_SERVICE="kibana grafana laravel-echo-server" - PHP_VERSION=NA BUILD_SERVICE="ipython-controller manticore" # - PHP_VERSION=NA BUILD_SERVICE="aws" diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 143faa206a..48acd7481a 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -149,6 +149,7 @@ That's it! enjoy :) - Eclipse Mosquitto - PHP Worker - Laravel Horizon + - Gearman - **Mail Servers:** - Mailu diff --git a/docker-compose.yml b/docker-compose.yml index 6773264b54..6712fd4691 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -70,6 +70,7 @@ services: - INSTALL_MONGO=${WORKSPACE_INSTALL_MONGO} - INSTALL_AMQP=${WORKSPACE_INSTALL_AMQP} - INSTALL_CASSANDRA=${WORKSPACE_INSTALL_CASSANDRA} + - INSTALL_GEARMAN=${WORKSPACE_INSTALL_GEARMAN} - INSTALL_PHPREDIS=${WORKSPACE_INSTALL_PHPREDIS} - INSTALL_MSSQL=${WORKSPACE_INSTALL_MSSQL} - INSTALL_NODE=${WORKSPACE_INSTALL_NODE} @@ -157,6 +158,7 @@ services: - INSTALL_MONGO=${PHP_FPM_INSTALL_MONGO} - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} - INSTALL_CASSANDRA=${PHP_FPM_INSTALL_CASSANDRA} + - INSTALL_GEARMAN=${PHP_FPM_INSTALL_GEARMAN} - INSTALL_MSSQL=${PHP_FPM_INSTALL_MSSQL} - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} - INSTALL_GMP=${PHP_FPM_INSTALL_GMP} @@ -225,6 +227,7 @@ services: - INSTALL_MYSQL_CLIENT=${PHP_WORKER_INSTALL_MYSQL_CLIENT} - INSTALL_AMQP=${PHP_WORKER_INSTALL_AMQP} - INSTALL_CASSANDRA=${PHP_WORKER_INSTALL_CASSANDRA} + - INSTALL_GEARMAN=${PHP_WORKER_INSTALL_GEARMAN} - INSTALL_GHOSTSCRIPT=${PHP_WORKER_INSTALL_GHOSTSCRIPT} - INSTALL_SWOOLE=${PHP_WORKER_INSTALL_SWOOLE} - INSTALL_TAINT=${PHP_WORKER_INSTALL_TAINT} @@ -622,6 +625,39 @@ services: networks: - backend +### Gearman ############################################ + gearman: + build: ./gearman + ports: + - "${GEARMAN_PORT}:4730" + privileged: true + environment: + - GEARMAN_VERSION=${GEARMAN_VERSION} + - GEARMAN_VERBOSE=${GEARMAN_VERBOSE} + - GEARMAN_QUEUE_TYPE=${GEARMAN_QUEUE_TYPE} + - GEARMAN_THREADS=${GEARMAN_THREADS} + - GEARMAN_BACKLOG=${GEARMAN_BACKLOG} + - GEARMAN_FILE_DESCRIPTORS=${GEARMAN_FILE_DESCRIPTORS} + - GEARMAN_JOB_RETRIES=${GEARMAN_JOB_RETRIES} + - GEARMAN_ROUND_ROBIN=${GEARMAN_ROUND_ROBIN} + - GEARMAN_WORKER_WAKEUP=${GEARMAN_WORKER_WAKEUP} + - GEARMAN_KEEPALIVE=${GEARMAN_KEEPALIVE} + - GEARMAN_KEEPALIVE_IDLE=${GEARMAN_KEEPALIVE_IDLE} + - GEARMAN_KEEPALIVE_INTERVAL=${GEARMAN_KEEPALIVE_INTERVAL} + - GEARMAN_KEEPALIVE_COUNT=${GEARMAN_KEEPALIVE_COUNT} + - GEARMAN_MYSQL_HOST=${GEARMAN_MYSQL_HOST} + - GEARMAN_MYSQL_PORT=${GEARMAN_MYSQL_PORT} + - GEARMAN_MYSQL_USER=${GEARMAN_MYSQL_USER} + - GEARMAN_MYSQL_PASSWORD=${GEARMAN_MYSQL_PASSWORD} + - GEARMAN_MYSQL_PASSWORD_FILE=${GEARMAN_MYSQL_PASSWORD_FILE} + - GEARMAN_MYSQL_DB=${GEARMAN_MYSQL_DB} + - GEARMAN_MYSQL_TABLE=${GEARMAN_MYSQL_TABLE} + hostname: laradock-gearman + depends_on: + - php-fpm + networks: + - backend + ### Beanstalkd Console ################################### beanstalkd-console: build: ./beanstalkd-console diff --git a/env-example b/env-example index a4793a7cd0..d8749d17a3 100644 --- a/env-example +++ b/env-example @@ -107,6 +107,7 @@ WORKSPACE_INSTALL_IMAP=false WORKSPACE_INSTALL_MONGO=false WORKSPACE_INSTALL_AMQP=false WORKSPACE_INSTALL_CASSANDRA=false +WORKSPACE_INSTALL_GEARMAN=false WORKSPACE_INSTALL_MSSQL=false WORKSPACE_INSTALL_DRUSH=false WORKSPACE_DRUSH_VERSION=8.1.17 @@ -163,6 +164,7 @@ PHP_FPM_INSTALL_IMAP=false PHP_FPM_INSTALL_MONGO=false PHP_FPM_INSTALL_AMQP=false PHP_FPM_INSTALL_CASSANDRA=false +PHP_FPM_INSTALL_GEARMAN=false PHP_FPM_INSTALL_MSSQL=false PHP_FPM_INSTALL_SSH2=false PHP_FPM_INSTALL_SOAP=false @@ -208,6 +210,7 @@ PHP_WORKER_INSTALL_TAINT=false PHP_WORKER_INSTALL_FFMPEG=false PHP_WORKER_INSTALL_GMP=false PHP_WORKER_INSTALL_CASSANDRA=false +PHP_WORKER_INSTALL_GEARMAN=false PHP_WORKER_PUID=1000 PHP_WORKER_PGID=1000 @@ -766,4 +769,49 @@ CASSANDRA_ENABLE_RPC=true # Datacenter name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: dc1. CASSANDRA_DATACENTER=dc1 # Rack name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: rack1. -CASSANDRA_RACK=rack1 \ No newline at end of file +CASSANDRA_RACK=rack1 + +### GEARMAN ################################################## + +# Gearman version to use. See available tags at https://hub.docker.com/r/artefactual/gearmand +GEARMAN_VERSION=latest +# Port to use (Default: 6379) +GEARMAN_PORT=6379 +# Logging Level (Default: INFO) +GEARMAN_VERBOSE=INFO +# Persistent queue type to use (Default: builtin) +GEARMAN_QUEUE_TYPE=builtin +# Number of I/O threads to use (Default: 4) +GEARMAN_THREADS=4 +# Number of backlog connections for listen (Default: 32) +GEARMAN_BACKLOG=32 +# Number of file descriptors to allow for the process (Default is max allowed for user) +GEARMAN_FILE_DESCRIPTORS= +# Number of attempts to run the job before the job server removes it. (Default: no limit = 0) +GEARMAN_JOB_RETRIES=0 +# Assign work in round-robin order per worker connection (Default: 0) +GEARMAN_ROUND_ROBIN=0 +# Number of workers to wakeup for each job received (Default: 0) +GEARMAN_WORKER_WAKEUP=0 +# Enable keepalive on sockets (Default: 0) +GEARMAN_KEEPALIVE=0 +# The duration between two keepalive transmissions in idle condition (Default: 30) +GEARMAN_KEEPALIVE_IDLE=30 +# The duration between two successive keepalive retransmissions, if acknowledgement to the previous keepalive transmission is not received (Default: 10) +GEARMAN_KEEPALIVE_INTERVAL=10 +# The number of retransmissions to be carried out before declaring that remote end is not available (Default: 5) +GEARMAN_KEEPALIVE_COUNT=5 +# Mysql server host (Default: localhost) +GEARMAN_MYSQL_HOST=localhost +# Mysql server port (Default: 3306) +GEARMAN_MYSQL_PORT=3306 +# Mysql server user (Default: root) +GEARMAN_MYSQL_USER=root +# Mysql password +GEARMAN_MYSQL_PASSWORD= +# Path to file with mysql password(Docker secrets) +GEARMAN_MYSQL_PASSWORD_FILE= +# Database to use by Gearman (Default: Gearmand) +GEARMAN_MYSQL_DB=Gearmand +# Table to use by Gearman (Default: gearman_queue) +GEARMAN_MYSQL_TABLE=gearman_queue \ No newline at end of file diff --git a/gearman/Dockerfile b/gearman/Dockerfile new file mode 100644 index 0000000000..79a0e75b60 --- /dev/null +++ b/gearman/Dockerfile @@ -0,0 +1,5 @@ +ARG GEARMAN_VERSION=latest +FROM artefactual/gearmand:${GEARMAN_VERSION} + +LABEL maintainer="Stefan Neuhaus " + diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index a25e5f42f4..54207db773 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -306,6 +306,30 @@ RUN if [ ${INSTALL_AMQP} = true ]; then \ docker-php-ext-install sockets \ ;fi +########################################################################### +# GEARMAN: +########################################################################### + +ARG INSTALL_GEARMAN=false + +RUN if [ ${INSTALL_GEARMAN} = true ]; then \ + apt-get update && \ + apt-get -y install libgearman-dev && \ + cd /tmp && \ + curl -L https://github.com/wcgallego/pecl-gearman/archive/gearman-2.0.5.zip -O && \ + unzip gearman-2.0.5.zip && \ + mv pecl-gearman-gearman-2.0.5 pecl-gearman && \ + cd /tmp/pecl-gearman && \ + phpize && \ + ./configure && \ + make -j$(nproc) && \ + make install && \ + cd / && \ + rm /tmp/gearman-2.0.5.zip && \ + rm -r /tmp/pecl-gearman && \ + docker-php-ext-enable gearman \ +;fi + ########################################################################### # pcntl ########################################################################### diff --git a/php-worker/Dockerfile b/php-worker/Dockerfile index b8d482d209..fdd527cde8 100644 --- a/php-worker/Dockerfile +++ b/php-worker/Dockerfile @@ -85,6 +85,13 @@ RUN if [ ${INSTALL_AMQP} = true ]; then \ docker-php-ext-install sockets \ ;fi +# Install Gearman: +ARG INSTALL_GEARMAN=false + +RUN if [ ${INSTALL_GEARMAN} = true ]; then \ + docker-php-ext-install gearman \ +;fi + # Install Cassandra drivers: ARG INSTALL_CASSANDRA=false RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ diff --git a/workspace/Dockerfile b/workspace/Dockerfile index cbbeb2e9f3..06567f2cef 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -437,6 +437,18 @@ RUN if [ ${INSTALL_CASSANDRA} = true ]; then \ ln -s /etc/php/${LARADOCK_PHP_VERSION}/mods-available/cassandra.ini /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/30-cassandra.ini \ ;fi +########################################################################### +# Gearman: +########################################################################### + +ARG INSTALL_GEARMAN=false + +RUN if [ ${INSTALL_GEARMAN} = true ]; then \ + add-apt-repository -y ppa:ondrej/pkg-gearman && \ + apt-get update && \ + apt-get install php-gearman -y \ +;fi + ########################################################################### # PHP REDIS EXTENSION ########################################################################### From 58d1eb876e199fb804c55d6a303fe34d0bad8472 Mon Sep 17 00:00:00 2001 From: Mahmoudz Date: Mon, 29 Jul 2019 16:52:27 +0200 Subject: [PATCH 049/861] add funding.yml --- .github/FUNDING.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..61a5c98382 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,6 @@ +# DO NOT CHANGE THIS FILE PLEASE. + +open_collective: laradock +ko_fi: laradock +issuehunt: laradock +custom: ['beerpay.io/laradock/laradock', 'paypal.me/mzmmzz'] From 51c6d3549ccffa8f813ac3d7ed727ca0711bd47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E6=AD=A3=E6=B5=B7?= Date: Tue, 30 Jul 2019 12:47:43 +0800 Subject: [PATCH 050/861] fix: fix install xhprof error (#2141) * feat: Add PHP_FPM_INSTALL_XHPROF as an option to install xhprof extension * fix: INSTALL_XHPROF default value set false * fix: install xhprof error * fix: nginx build * fix: when INSTALL_XHPROF = false, rm xhprof.ini --- docker-compose.yml | 1 + php-fpm/Dockerfile | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 6773264b54..00377e96aa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -189,6 +189,7 @@ services: - INSTALL_SSHPASS=${PHP_FPM_INSTALL_SSHPASS} - ADDITIONAL_LOCALES=${PHP_FPM_ADDITIONAL_LOCALES} - INSTALL_FFMPEG=${PHP_FPM_FFMPEG} + - INSTALL_XHPROF=${PHP_FPM_INSTALL_XHPROF} - http_proxy - https_proxy - no_proxy diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index a25e5f42f4..68a1933e0e 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -263,7 +263,7 @@ ARG INSTALL_XHPROF=false RUN if [ ${INSTALL_XHPROF} = true ]; then \ # Install the php xhprof extension if [ $(php -r "echo PHP_MAJOR_VERSION;") = 7 ]; then \ - curl -L -o /tmp/xhprof.tar.gz "https://github.com/tideways/php-xhprof-extension/archive/v4.1.6.tar.gz"; \ + curl -L -o /tmp/xhprof.tar.gz "https://github.com/tideways/php-xhprof-extension/archive/v4.1.7.tar.gz"; \ else \ curl -L -o /tmp/xhprof.tar.gz "https://codeload.github.com/phacility/xhprof/tar.gz/master"; \ fi \ @@ -282,6 +282,10 @@ RUN if [ ${INSTALL_XHPROF} = true ]; then \ COPY ./xhprof.ini /usr/local/etc/php/conf.d +RUN if [ ${INSTALL_XHPROF} = false ]; then \ + rm /usr/local/etc/php/conf.d/xhprof.ini \ +;fi + ########################################################################### # AMQP: ########################################################################### From 2e928a492829cf41709f456f5e731c27e3afdc89 Mon Sep 17 00:00:00 2001 From: Valentino Lauciani Date: Tue, 30 Jul 2019 06:48:24 +0200 Subject: [PATCH 051/861] laravel-horizon: Install 'sockets' without install 'AMQP` (#2211) * Add LARAVEL_HORIZON_INSTALL_SOCKETS variable. Issue #2209 * Get LARAVEL_HORIZON_INSTALL_SOCKETS from .env. Issue #2209 * Get INSTALL_SOCKETS variable and install 'sockets' ext. Issue #2209 --- docker-compose.yml | 2 +- env-example | 4 ++++ laravel-horizon/Dockerfile | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 00377e96aa..e4a4fc4b38 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -251,7 +251,7 @@ services: - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL} - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED} - - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} + - INSTALL_SOCKETS=${LARAVEL_HORIZON_INSTALL_SOCKETS} - INSTALL_CASSANDRA=${PHP_FPM_INSTALL_CASSANDRA} volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} diff --git a/env-example b/env-example index a4793a7cd0..0e80c21bdc 100644 --- a/env-example +++ b/env-example @@ -222,6 +222,10 @@ NGINX_PHP_UPSTREAM_CONTAINER=php-fpm NGINX_PHP_UPSTREAM_PORT=9000 NGINX_SSL_PATH=./nginx/ssl/ +### LARAVEL_HORIZON ################################################ + +LARAVEL_HORIZON_INSTALL_SOCKETS=false + ### APACHE ################################################ APACHE_HOST_HTTP_PORT=80 diff --git a/laravel-horizon/Dockerfile b/laravel-horizon/Dockerfile index c94861636e..9cc9ba8d93 100644 --- a/laravel-horizon/Dockerfile +++ b/laravel-horizon/Dockerfile @@ -33,8 +33,8 @@ RUN if [ ${INSTALL_BCMATH} = true ]; then \ ;fi #Install Sockets package: -ARG INSTALL_AMQP=false -RUN if [ ${INSTALL_AMQP} = true ]; then \ +ARG INSTALL_SOCKETS=false +RUN if [ ${INSTALL_SOCKETS} = true ]; then \ docker-php-ext-install sockets \ ;fi From 8254c3464743d86f42e9d7c83764bf3c385b6ad8 Mon Sep 17 00:00:00 2001 From: Majid Hadavand Date: Tue, 30 Jul 2019 09:24:56 +0430 Subject: [PATCH 052/861] Fix:Issue #2038 Install mongodb php extension (#2167) * Fix:Issue #2038 Install mongodb php extension - Make sure `INSTALL_MONGO` flag is `true` - Run pecl install mongodb and enable the extentions in `laravel-horizon` and `php-worker` images - Remember to rebuild images * INSTALL flag default set false --- laravel-horizon/Dockerfile | 2 +- php-worker/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/laravel-horizon/Dockerfile b/laravel-horizon/Dockerfile index 9cc9ba8d93..ee5b9ffd98 100644 --- a/laravel-horizon/Dockerfile +++ b/laravel-horizon/Dockerfile @@ -24,7 +24,7 @@ RUN apk --update add wget \ procps RUN docker-php-ext-install mysqli mbstring pdo pdo_mysql tokenizer xml pcntl -RUN pecl channel-update pecl.php.net && pecl install memcached mcrypt-1.0.1 && docker-php-ext-enable memcached +RUN pecl channel-update pecl.php.net && pecl install memcached mcrypt-1.0.1 mongodb && docker-php-ext-enable memcached mongodb #Install BCMath package: ARG INSTALL_BCMATH=false diff --git a/php-worker/Dockerfile b/php-worker/Dockerfile index b8d482d209..b2e496f301 100644 --- a/php-worker/Dockerfile +++ b/php-worker/Dockerfile @@ -24,7 +24,7 @@ RUN apk --update add wget \ supervisor RUN docker-php-ext-install mysqli mbstring pdo pdo_mysql tokenizer xml pcntl -RUN pecl channel-update pecl.php.net && pecl install memcached mcrypt-1.0.1 && docker-php-ext-enable memcached +RUN pecl channel-update pecl.php.net && pecl install memcached mcrypt-1.0.1 mongodb && docker-php-ext-enable memcached mongodb # Add a non-root user: ARG PUID=1000 From c4a99cce57da0d47632586c6ee73de9c59d7d9ab Mon Sep 17 00:00:00 2001 From: Zack Craig Date: Fri, 2 Aug 2019 09:02:52 -0400 Subject: [PATCH 053/861] Add en_US.UTF-8 to the default list of extra locales Feel free to decline this, but I thought maybe adding US English to the default list of extra locales may be beneficial? --- env-example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/env-example b/env-example index 0e80c21bdc..214b828bad 100644 --- a/env-example +++ b/env-example @@ -191,7 +191,7 @@ PHP_FPM_INSTALL_MYSQL_CLIENT=false PHP_FPM_INSTALL_PING=false PHP_FPM_INSTALL_SSHPASS=false PHP_FPM_FFMPEG=false -PHP_FPM_ADDITIONAL_LOCALES="es_ES.UTF-8 fr_FR.UTF-8" +PHP_FPM_ADDITIONAL_LOCALES="en_US.UTF-8 es_ES.UTF-8 fr_FR.UTF-8" ### PHP_WORKER ############################################ @@ -770,4 +770,4 @@ CASSANDRA_ENABLE_RPC=true # Datacenter name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: dc1. CASSANDRA_DATACENTER=dc1 # Rack name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: rack1. -CASSANDRA_RACK=rack1 \ No newline at end of file +CASSANDRA_RACK=rack1 From b2de93cc1ba10c06c39f5ff6cc58756c484e5960 Mon Sep 17 00:00:00 2001 From: Alec Joy Date: Sun, 4 Aug 2019 14:07:05 -0400 Subject: [PATCH 054/861] Add support for pcov code coverage driver --- DOCUMENTATION/content/documentation/index.md | 23 ++++++++++++++++++++ docker-compose.yml | 2 ++ env-example | 2 ++ php-fpm/Dockerfile | 19 ++++++++++++++++ workspace/Dockerfile | 19 ++++++++++++++++ 5 files changed, 65 insertions(+) diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index a9aeb8a17e..55fbb1fda3 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -299,6 +299,29 @@ For information on how to configure xDebug with your IDE and work it out, check +
+ +## Install pcov + +1 - First install `pcov` in the Workspace and the PHP-FPM Containers: +
+a) open the `.env` file +
+b) search for the `WORKSPACE_INSTALL_PCOV` argument under the Workspace Container +
+c) set it to `true` +
+d) search for the `PHP_FPM_INSTALL_PCOV` argument under the PHP-FPM Container +
+e) set it to `true` + +2 - Re-build the containers `docker-compose build workspace php-fpm` + +Note that pcov is only supported on PHP 7.1 or newer. For more information on setting up pcov optimally, check the recommended section +of the [README](https://github.com/krakjoe/pcov) + + +
## Start/Stop xDebug: diff --git a/docker-compose.yml b/docker-compose.yml index e4a4fc4b38..5374b8d2aa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,6 +59,7 @@ services: - LARADOCK_PHALCON_VERSION=${PHALCON_VERSION} - INSTALL_SUBVERSION=${WORKSPACE_INSTALL_SUBVERSION} - INSTALL_XDEBUG=${WORKSPACE_INSTALL_XDEBUG} + - INSTALL_PCOV=${WORKSPACE_INSTALL_PCOV} - INSTALL_PHPDBG=${WORKSPACE_INSTALL_PHPDBG} - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE} - INSTALL_SSH2=${WORKSPACE_INSTALL_SSH2} @@ -148,6 +149,7 @@ services: - LARADOCK_PHP_VERSION=${PHP_VERSION} - LARADOCK_PHALCON_VERSION=${PHALCON_VERSION} - INSTALL_XDEBUG=${PHP_FPM_INSTALL_XDEBUG} + - INSTALL_PCOV=${PHP_FPM_INSTALL_PCOV} - INSTALL_PHPDBG=${PHP_FPM_INSTALL_PHPDBG} - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE} - INSTALL_SSH2=${PHP_FPM_INSTALL_SSH2} diff --git a/env-example b/env-example index 0e80c21bdc..39dd35cb35 100644 --- a/env-example +++ b/env-example @@ -97,6 +97,7 @@ WORKSPACE_INSTALL_PHPREDIS=true WORKSPACE_INSTALL_WORKSPACE_SSH=false WORKSPACE_INSTALL_SUBVERSION=false WORKSPACE_INSTALL_XDEBUG=false +WORKSPACE_INSTALL_PCOV=true WORKSPACE_INSTALL_PHPDBG=false WORKSPACE_INSTALL_SSH2=false WORKSPACE_INSTALL_LDAP=false @@ -157,6 +158,7 @@ PHP_FPM_INSTALL_IMAGE_OPTIMIZERS=true PHP_FPM_INSTALL_PHPREDIS=true PHP_FPM_INSTALL_MEMCACHED=false PHP_FPM_INSTALL_XDEBUG=false +PHP_FPM_INSTALL_PCOV=false PHP_FPM_INSTALL_XHPROF=false PHP_FPM_INSTALL_PHPDBG=false PHP_FPM_INSTALL_IMAP=false diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 68a1933e0e..bc748698c4 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -164,6 +164,25 @@ RUN sed -i "s/xdebug.remote_autostart=0/xdebug.remote_autostart=1/" /usr/local/e sed -i "s/xdebug.remote_enable=0/xdebug.remote_enable=1/" /usr/local/etc/php/conf.d/xdebug.ini && \ sed -i "s/xdebug.cli_color=0/xdebug.cli_color=1/" /usr/local/etc/php/conf.d/xdebug.ini +########################################################################### +# pcov: +########################################################################### + +USER root + +ARG INSTALL_PCOV=false + +RUN if [ ${INSTALL_PCOV} = true ]; then \ + if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ]; then \ + if [ $(php -r "echo PHP_MAJOR_VERSION;") != "0" ]; then \ + pecl install pcov && \ + echo "extension=pcov.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini && \ + echo "pcov.enabled" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini \ + ;fi \ + ;fi \ +;fi + + ########################################################################### # Phpdbg: ########################################################################### diff --git a/workspace/Dockerfile b/workspace/Dockerfile index cbbeb2e9f3..788244bdc6 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -324,6 +324,25 @@ RUN sed -i "s/xdebug.remote_autostart=0/xdebug.remote_autostart=1/" /etc/php/${L sed -i "s/xdebug.remote_enable=0/xdebug.remote_enable=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini && \ sed -i "s/xdebug.cli_color=0/xdebug.cli_color=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini +########################################################################### +# pcov: +########################################################################### + +USER root + +ARG INSTALL_PCOV=false + +RUN if [ ${INSTALL_PCOV} = true ]; then \ + if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ]; then \ + if [ $(php -r "echo PHP_MAJOR_VERSION;") != "0" ]; then \ + pecl install pcov && \ + echo "extension=pcov.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini && \ + echo "pcov.enabled" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini \ + ;fi \ + ;fi \ +;fi + + ########################################################################### # Phpdbg: ########################################################################### From c2caf730db7459469cb23d1a3fbc91806047c849 Mon Sep 17 00:00:00 2001 From: Alec Joy Date: Sun, 4 Aug 2019 14:14:32 -0400 Subject: [PATCH 055/861] Accidentally left the PCOV env file to defaul true and moved Pcov documentation section below all xdebug entries --- DOCUMENTATION/content/documentation/index.md | 32 ++++++++++---------- env-example | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index 55fbb1fda3..79d2e416b0 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -299,6 +299,22 @@ For information on how to configure xDebug with your IDE and work it out, check +
+ +## Start/Stop xDebug: + +By installing xDebug, you are enabling it to run on startup by default. + +To control the behavior of xDebug (in the `php-fpm` Container), you can run the following commands from the Laradock root folder, (at the same prompt where you run docker-compose): + +- Stop xDebug from running by default: `.php-fpm/xdebug stop`. +- Start xDebug by default: `.php-fpm/xdebug start`. +- See the status: `.php-fpm/xdebug status`. + +Note: If `.php-fpm/xdebug` doesn't execute and gives `Permission Denied` error the problem can be that file `xdebug` doesn't have execution access. This can be fixed by running `chmod` command with desired access permissions. + + +
## Install pcov @@ -322,22 +338,6 @@ of the [README](https://github.com/krakjoe/pcov) -
- -## Start/Stop xDebug: - -By installing xDebug, you are enabling it to run on startup by default. - -To control the behavior of xDebug (in the `php-fpm` Container), you can run the following commands from the Laradock root folder, (at the same prompt where you run docker-compose): - -- Stop xDebug from running by default: `.php-fpm/xdebug stop`. -- Start xDebug by default: `.php-fpm/xdebug start`. -- See the status: `.php-fpm/xdebug status`. - -Note: If `.php-fpm/xdebug` doesn't execute and gives `Permission Denied` error the problem can be that file `xdebug` doesn't have execution access. This can be fixed by running `chmod` command with desired access permissions. - - -
## Install phpdbg diff --git a/env-example b/env-example index 39dd35cb35..3861cd7bfd 100644 --- a/env-example +++ b/env-example @@ -97,7 +97,7 @@ WORKSPACE_INSTALL_PHPREDIS=true WORKSPACE_INSTALL_WORKSPACE_SSH=false WORKSPACE_INSTALL_SUBVERSION=false WORKSPACE_INSTALL_XDEBUG=false -WORKSPACE_INSTALL_PCOV=true +WORKSPACE_INSTALL_PCOV=false WORKSPACE_INSTALL_PHPDBG=false WORKSPACE_INSTALL_SSH2=false WORKSPACE_INSTALL_LDAP=false From 47bb995cad1fb16c5e1dff001b917ad3f9c6a608 Mon Sep 17 00:00:00 2001 From: Alec Joy Date: Mon, 5 Aug 2019 09:53:36 -0400 Subject: [PATCH 056/861] Typo in PHP version check --- workspace/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 788244bdc6..c70be9193c 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -334,7 +334,7 @@ ARG INSTALL_PCOV=false RUN if [ ${INSTALL_PCOV} = true ]; then \ if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ]; then \ - if [ $(php -r "echo PHP_MAJOR_VERSION;") != "0" ]; then \ + if [ $(php -r "echo PHP_MINOR_VERSION;") != "0" ]; then \ pecl install pcov && \ echo "extension=pcov.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini && \ echo "pcov.enabled" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini \ From bdf2a285a7d9f7d036794b410e85f97ee61aa8c0 Mon Sep 17 00:00:00 2001 From: Alec Joy Date: Mon, 5 Aug 2019 09:54:15 -0400 Subject: [PATCH 057/861] Typo in PHP Version check --- php-fpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index bc748698c4..59d64b9e07 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -174,7 +174,7 @@ ARG INSTALL_PCOV=false RUN if [ ${INSTALL_PCOV} = true ]; then \ if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ]; then \ - if [ $(php -r "echo PHP_MAJOR_VERSION;") != "0" ]; then \ + if [ $(php -r "echo PHP_MINOR_VERSION;") != "0" ]; then \ pecl install pcov && \ echo "extension=pcov.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini && \ echo "pcov.enabled" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini \ From ff640a0ca2070b3e02773959504232a1ec494231 Mon Sep 17 00:00:00 2001 From: Alec Joy Date: Mon, 5 Aug 2019 10:45:12 -0400 Subject: [PATCH 058/861] Use docker command to enable pcov --- php-fpm/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 59d64b9e07..527d9c4503 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -176,8 +176,7 @@ RUN if [ ${INSTALL_PCOV} = true ]; then \ if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ]; then \ if [ $(php -r "echo PHP_MINOR_VERSION;") != "0" ]; then \ pecl install pcov && \ - echo "extension=pcov.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini && \ - echo "pcov.enabled" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini \ + docker-php-ext-enable pcov \ ;fi \ ;fi \ ;fi From f64adc211430a668021833f53a14db978f71c04e Mon Sep 17 00:00:00 2001 From: mouyong Date: Fri, 9 Aug 2019 08:52:32 +0800 Subject: [PATCH 059/861] workspace and php-fpm change source --- docker-compose.yml | 5 +++++ mysql/my.cnf | 8 +++++++- .../sites/{default.conf => default.conf.example} | 0 php-fpm/Dockerfile | 10 ++++++++++ php-fpm/debian.sources.list | 8 ++++++++ php-fpm/xdebug.ini | 9 +++++++-- workspace/Dockerfile | 9 +++++++++ workspace/ubuntu.sources.list | 15 +++++++++++++++ workspace/xdebug.ini | 9 +++++++-- 9 files changed, 68 insertions(+), 5 deletions(-) rename nginx/sites/{default.conf => default.conf.example} (100%) create mode 100644 php-fpm/debian.sources.list create mode 100644 workspace/ubuntu.sources.list diff --git a/docker-compose.yml b/docker-compose.yml index 462b085d63..2b9bff3454 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,6 +55,7 @@ services: build: context: ./workspace args: + - CHANGE_SOURCE=${CHANGE_SOURCE} - LARADOCK_PHP_VERSION=${PHP_VERSION} - LARADOCK_PHALCON_VERSION=${PHALCON_VERSION} - INSTALL_SUBVERSION=${WORKSPACE_INSTALL_SUBVERSION} @@ -126,6 +127,7 @@ services: - no_proxy volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} + - "./workspace/crontab/laradock:/etc/cron.d/laradock" extra_hosts: - "dockerhost:${DOCKER_HOST_IP}" ports: @@ -145,6 +147,7 @@ services: build: context: ./php-fpm args: + - CHANGE_SOURCE=${CHANGE_SOURCE} - LARADOCK_PHP_VERSION=${PHP_VERSION} - LARADOCK_PHALCON_VERSION=${PHALCON_VERSION} - INSTALL_XDEBUG=${PHP_FPM_INSTALL_XDEBUG} @@ -200,6 +203,7 @@ services: - "9000" extra_hosts: - "dockerhost:${DOCKER_HOST_IP}" + dns: 114.114.114.114 environment: - PHP_IDE_CONFIG=${PHP_IDE_CONFIG} - DOCKER_HOST=tcp://docker-in-docker:2375 @@ -211,6 +215,7 @@ services: links: - docker-in-docker + ### PHP Worker ############################################ php-worker: build: diff --git a/mysql/my.cnf b/mysql/my.cnf index 68578ef0b3..a7facd5ccf 100644 --- a/mysql/my.cnf +++ b/mysql/my.cnf @@ -6,5 +6,11 @@ [mysql] [mysqld] -sql-mode="STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" +sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" character-set-server=utf8mb4 +skip-name-resolve +symbolic-links=0 +explicit_defaults_for_timestamp +default_authentication_plugin=mysql_native_password +#skip-grant-tables=1 + diff --git a/nginx/sites/default.conf b/nginx/sites/default.conf.example similarity index 100% rename from nginx/sites/default.conf rename to nginx/sites/default.conf.example diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 68a1933e0e..183bd3cf2a 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -24,6 +24,16 @@ ARG LARADOCK_PHP_VERSION # Set Environment Variables ENV DEBIAN_FRONTEND noninteractive +# If you're in China, or you need to change sources, will be set CHANGE_SOURCE to true in .env. + +ADD debian.sources.list /etc/apt/debian.sources.list +ARG CHANGE_SOURCE=false +RUN if [ ${CHANGE_SOURCE} = true ]; then \ + mv /etc/apt/sources.list /etc/apt/sources.list.back && \ + mv /etc/apt/debian.sources.list /etc/apt/sources.list \ +;fi + + # always run apt update when start and after add new source list, then clean up at end. RUN set -xe; \ apt-get update -yqq && \ diff --git a/php-fpm/debian.sources.list b/php-fpm/debian.sources.list new file mode 100644 index 0000000000..4cf497671a --- /dev/null +++ b/php-fpm/debian.sources.list @@ -0,0 +1,8 @@ +deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib +deb http://mirrors.aliyun.com/debian-security stretch/updates main +deb-src http://mirrors.aliyun.com/debian-security stretch/updates main +deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib +deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib +deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib \ No newline at end of file diff --git a/php-fpm/xdebug.ini b/php-fpm/xdebug.ini index c3f32ece3c..42a7c9b7d5 100644 --- a/php-fpm/xdebug.ini +++ b/php-fpm/xdebug.ini @@ -5,14 +5,19 @@ xdebug.remote_connect_back=1 xdebug.remote_port=9000 xdebug.idekey=PHPSTORM -xdebug.remote_autostart=0 +xdebug.remote_autostart=1 xdebug.remote_enable=0 -xdebug.cli_color=0 +xdebug.cli_color=1 xdebug.profiler_enable=0 xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling" xdebug.remote_handler=dbgp xdebug.remote_mode=req +xdebug.remote_log=/var/log/php/xdebug_remote.log + +xdebug.auto_trace = 1 +xdebug.collect_params = 1 +xdebug.collect_return = 1 xdebug.var_display_max_children=-1 xdebug.var_display_max_data=-1 diff --git a/workspace/Dockerfile b/workspace/Dockerfile index cbbeb2e9f3..fa2ea64c28 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -24,6 +24,15 @@ ARG LARADOCK_PHP_VERSION # Set Environment Variables ENV DEBIAN_FRONTEND noninteractive +# If you're in China, or you need to change sources, will be set CHANGE_SOURCE to true in .env. + +ADD ubuntu.sources.list /etc/apt/ubuntu.sources.list +ARG CHANGE_SOURCE=false +RUN if [ ${CHANGE_SOURCE} = true ]; then \ + mv /etc/apt/sources.list /etc/apt/sources.list.back && \ + mv /etc/apt/ubuntu.sources.list /etc/apt/sources.list \ +;fi + # Start as root USER root diff --git a/workspace/ubuntu.sources.list b/workspace/ubuntu.sources.list new file mode 100644 index 0000000000..6edaa130a3 --- /dev/null +++ b/workspace/ubuntu.sources.list @@ -0,0 +1,15 @@ +deb http://mirrors.aliyun.com/ubuntu/ xenial main +deb-src http://mirrors.aliyun.com/ubuntu/ xenial main + +deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main +deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main + +deb http://mirrors.aliyun.com/ubuntu/ xenial universe +deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe +deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe +deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe + +deb http://mirrors.aliyun.com/ubuntu/ xenial-security main +deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main +deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe +deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe \ No newline at end of file diff --git a/workspace/xdebug.ini b/workspace/xdebug.ini index c3f32ece3c..42a7c9b7d5 100644 --- a/workspace/xdebug.ini +++ b/workspace/xdebug.ini @@ -5,14 +5,19 @@ xdebug.remote_connect_back=1 xdebug.remote_port=9000 xdebug.idekey=PHPSTORM -xdebug.remote_autostart=0 +xdebug.remote_autostart=1 xdebug.remote_enable=0 -xdebug.cli_color=0 +xdebug.cli_color=1 xdebug.profiler_enable=0 xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling" xdebug.remote_handler=dbgp xdebug.remote_mode=req +xdebug.remote_log=/var/log/php/xdebug_remote.log + +xdebug.auto_trace = 1 +xdebug.collect_params = 1 +xdebug.collect_return = 1 xdebug.var_display_max_children=-1 xdebug.var_display_max_data=-1 From f01cab7742eca0c4fbc7a3e9afc11acabcb903d0 Mon Sep 17 00:00:00 2001 From: mouyong Date: Fri, 9 Aug 2019 09:08:49 +0800 Subject: [PATCH 060/861] set xdebug.remote_autostart=0 https://github.com/laradock/laradock/issues/2112#issuecomment-489603086 --- php-fpm/xdebug.ini | 2 +- workspace/xdebug.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/php-fpm/xdebug.ini b/php-fpm/xdebug.ini index 42a7c9b7d5..1fef05808b 100644 --- a/php-fpm/xdebug.ini +++ b/php-fpm/xdebug.ini @@ -5,7 +5,7 @@ xdebug.remote_connect_back=1 xdebug.remote_port=9000 xdebug.idekey=PHPSTORM -xdebug.remote_autostart=1 +xdebug.remote_autostart=0 xdebug.remote_enable=0 xdebug.cli_color=1 xdebug.profiler_enable=0 diff --git a/workspace/xdebug.ini b/workspace/xdebug.ini index 42a7c9b7d5..1fef05808b 100644 --- a/workspace/xdebug.ini +++ b/workspace/xdebug.ini @@ -5,7 +5,7 @@ xdebug.remote_connect_back=1 xdebug.remote_port=9000 xdebug.idekey=PHPSTORM -xdebug.remote_autostart=1 +xdebug.remote_autostart=0 xdebug.remote_enable=0 xdebug.cli_color=1 xdebug.profiler_enable=0 From 48933479809a318cb17bed7742655f65da4aac03 Mon Sep 17 00:00:00 2001 From: mouyong Date: Fri, 9 Aug 2019 09:14:10 +0800 Subject: [PATCH 061/861] remove setting remote_log --- php-fpm/xdebug.ini | 3 +-- workspace/xdebug.ini | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/php-fpm/xdebug.ini b/php-fpm/xdebug.ini index 1fef05808b..9bc6578f34 100644 --- a/php-fpm/xdebug.ini +++ b/php-fpm/xdebug.ini @@ -6,14 +6,13 @@ xdebug.remote_port=9000 xdebug.idekey=PHPSTORM xdebug.remote_autostart=0 -xdebug.remote_enable=0 +xdebug.remote_enable=1 xdebug.cli_color=1 xdebug.profiler_enable=0 xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling" xdebug.remote_handler=dbgp xdebug.remote_mode=req -xdebug.remote_log=/var/log/php/xdebug_remote.log xdebug.auto_trace = 1 xdebug.collect_params = 1 diff --git a/workspace/xdebug.ini b/workspace/xdebug.ini index 1fef05808b..9bc6578f34 100644 --- a/workspace/xdebug.ini +++ b/workspace/xdebug.ini @@ -6,14 +6,13 @@ xdebug.remote_port=9000 xdebug.idekey=PHPSTORM xdebug.remote_autostart=0 -xdebug.remote_enable=0 +xdebug.remote_enable=1 xdebug.cli_color=1 xdebug.profiler_enable=0 xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling" xdebug.remote_handler=dbgp xdebug.remote_mode=req -xdebug.remote_log=/var/log/php/xdebug_remote.log xdebug.auto_trace = 1 xdebug.collect_params = 1 From b8a971e634275bd290bc6f880e39f54f3344e1fd Mon Sep 17 00:00:00 2001 From: mouyong Date: Fri, 9 Aug 2019 09:26:40 +0800 Subject: [PATCH 062/861] fix in aliyun mirrors, hash check error. --- php-fpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 183bd3cf2a..d5aba61dee 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -574,7 +574,7 @@ USER root ARG INSTALL_IMAGEMAGICK=false RUN if [ ${INSTALL_IMAGEMAGICK} = true ]; then \ - apt-get install -y libmagickwand-dev imagemagick && \ + apt-get install -f -y libmagickwand-dev imagemagick && \ pecl install imagick && \ docker-php-ext-enable imagick \ ;fi From ab3a325ea3396fe95175986ab33290a630822cdf Mon Sep 17 00:00:00 2001 From: mouyong Date: Fri, 9 Aug 2019 13:11:03 +0800 Subject: [PATCH 063/861] fix apt install fail --- php-fpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index d5aba61dee..3b0b6007d0 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -574,7 +574,7 @@ USER root ARG INSTALL_IMAGEMAGICK=false RUN if [ ${INSTALL_IMAGEMAGICK} = true ]; then \ - apt-get install -f -y libmagickwand-dev imagemagick && \ + apt-get install --fix-missing -y libmagickwand-dev imagemagick && \ pecl install imagick && \ docker-php-ext-enable imagick \ ;fi From 4184f45fbd9630ce393a5291c29765eea8ca0c1f Mon Sep 17 00:00:00 2001 From: Adrian Nuta Date: Sat, 10 Aug 2019 11:04:26 +0200 Subject: [PATCH 064/861] update manticore log folder --- docker-compose.yml | 2 +- manticore/config/sphinx.conf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e4a4fc4b38..c3e0125c50 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1531,7 +1531,7 @@ services: volumes: - ${MANTICORE_CONFIG_PATH}:/etc/sphinxsearch - ${DATA_PATH_HOST}/manticore/data:/var/lib/manticore/data - - ${DATA_PATH_HOST}/manticore/log:/var/lib/manticore/log + - ${DATA_PATH_HOST}/manticore/log:/var/log/manticore ports: - "${MANTICORE_API_PORT}:9312" - "${MANTICORE_SPHINXQL_PORT}:9306" diff --git a/manticore/config/sphinx.conf b/manticore/config/sphinx.conf index 0a992b97c7..9824175707 100644 --- a/manticore/config/sphinx.conf +++ b/manticore/config/sphinx.conf @@ -11,12 +11,12 @@ searchd { listen = 9312 listen = 9308:http listen = 9306:mysql41 - log = /var/lib/manticore/log/searchd.log + log = /var/log/manticore/searchd.log # you can also send query_log to /dev/stdout to be shown in docker logs - query_log = /var/lib/manticore/log/query.log + query_log = /var/log/manticore/query.log read_timeout = 5 max_children = 30 - pid_file = /var/run/searchd.pid + pid_file = /var/run/manticore/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 From 493fc1a01047f285fb2bc768dbbaf62fdd804e02 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Mon, 12 Aug 2019 21:46:34 +0200 Subject: [PATCH 065/861] add spo 1 logo --- .github/README.md | 15 +++++++++++---- .github/home-page-images/sponsor-1.png | Bin 0 -> 71605 bytes DOCUMENTATION/config.toml | 2 +- DOCUMENTATION/content/introduction/index.md | 12 +++++++++++- DOCUMENTATION/static/custom-style.css | 13 +++++++++++++ .../layouts/partials/drawer.html | 2 +- 6 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 .github/home-page-images/sponsor-1.png create mode 100644 DOCUMENTATION/static/custom-style.css diff --git a/.github/README.md b/.github/README.md index c3b5c842ce..6b79353d42 100644 --- a/.github/README.md +++ b/.github/README.md @@ -16,7 +16,7 @@

Use Docker First - Then Learn About It Later

- forthebadge + forthebadge

@@ -24,13 +24,20 @@

- Laradock Docs + Laradock Documentation

- ## Sponsors +

+ + + Writing essays service Edubirdie + +

+ + @@ -42,7 +49,7 @@ For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io. -*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website.* +*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page.* ## People diff --git a/.github/home-page-images/sponsor-1.png b/.github/home-page-images/sponsor-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc9bbd948f9ce7b7126b5eb85e0e258443e50847 GIT binary patch literal 71605 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 ## Sponsors +

+ + + Writing essays service Edubirdie + +

+ +
+ + @@ -31,7 +41,7 @@ Supports a variety of useful Docker Images, pre-configured to provide a wonderfu For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io.
-*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page, with a link to your website.* +*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page.* ## Quick Overview diff --git a/DOCUMENTATION/static/custom-style.css b/DOCUMENTATION/static/custom-style.css new file mode 100644 index 0000000000..0f3957fc57 --- /dev/null +++ b/DOCUMENTATION/static/custom-style.css @@ -0,0 +1,13 @@ +/* Custom CSS */ + +.article a { + border-bottom: none; +} +.project .logo { + width: 200px; + padding-right: 0; +} +.project .banner { + height: 70px; + padding: 25px; +} diff --git a/DOCUMENTATION/themes/hugo-material-docs/layouts/partials/drawer.html b/DOCUMENTATION/themes/hugo-material-docs/layouts/partials/drawer.html index 62e6fa2c38..7fd69c9cad 100644 --- a/DOCUMENTATION/themes/hugo-material-docs/layouts/partials/drawer.html +++ b/DOCUMENTATION/themes/hugo-material-docs/layouts/partials/drawer.html @@ -5,7 +5,7 @@ - Laradock + {{ end }} From fa1f33bc518f23b850e8056fccc04a58e5185eca Mon Sep 17 00:00:00 2001 From: "Shao Yu-Lung (Allen)" Date: Thu, 15 Aug 2019 10:02:21 +0800 Subject: [PATCH 066/861] php-fpm: update base image (#2239) --- php-fpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 68a1933e0e..9d8b9b24fd 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -15,7 +15,7 @@ ARG LARADOCK_PHP_VERSION # FROM laradock/php-fpm:2.2-${LARADOCK_PHP_VERSION} -FROM letsdockerize/laradock-php-fpm:2.4-${LARADOCK_PHP_VERSION} +FROM letsdockerize/laradock-php-fpm:2.4.1-${LARADOCK_PHP_VERSION} LABEL maintainer="Mahmoud Zalt " From 5e4fda465982d60a09b801c8b4c738ebf810e352 Mon Sep 17 00:00:00 2001 From: Mahmoudz Date: Thu, 22 Aug 2019 09:53:30 +0200 Subject: [PATCH 067/861] replace the letsdockerize base images with the original once after creating tags for the images. Closing #26 #27 --- DOCUMENTATION/content/documentation/index.md | 1 - env-example | 4 ++-- php-fpm/Dockerfile | 3 +-- workspace/Dockerfile | 3 +-- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/DOCUMENTATION/content/documentation/index.md b/DOCUMENTATION/content/documentation/index.md index a9aeb8a17e..d83b44221d 100644 --- a/DOCUMENTATION/content/documentation/index.md +++ b/DOCUMENTATION/content/documentation/index.md @@ -250,7 +250,6 @@ docker-compose build php-fpm
## Change the PHP-CLI Version -By default **PHP-CLI 7.0** is running. >Note: it's not very essential to edit the PHP-CLI version. The PHP-CLI is only used for the Artisan Commands & Composer. It doesn't serve your Application code, this is the PHP-FPM job. diff --git a/env-example b/env-example index 0e80c21bdc..76a4af3125 100644 --- a/env-example +++ b/env-example @@ -38,7 +38,7 @@ COMPOSE_PROJECT_NAME=laradock ### PHP Version ########################################### # Select a PHP version of the Workspace and PHP-FPM containers (Does not apply to HHVM). Accepted values: 7.3 - 7.2 - 7.1 - 7.0 - 5.6 -PHP_VERSION=7.2 +PHP_VERSION=7.3 ### Phalcon Version ########################################### @@ -770,4 +770,4 @@ CASSANDRA_ENABLE_RPC=true # Datacenter name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: dc1. CASSANDRA_DATACENTER=dc1 # Rack name for the cluster. Ignored in SimpleSnitch endpoint snitch. Default: rack1. -CASSANDRA_RACK=rack1 \ No newline at end of file +CASSANDRA_RACK=rack1 diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 9d8b9b24fd..27dcec74c9 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -14,8 +14,7 @@ ARG LARADOCK_PHP_VERSION -# FROM laradock/php-fpm:2.2-${LARADOCK_PHP_VERSION} -FROM letsdockerize/laradock-php-fpm:2.4.1-${LARADOCK_PHP_VERSION} +FROM laradock/php-fpm:2.5-${LARADOCK_PHP_VERSION} LABEL maintainer="Mahmoud Zalt " diff --git a/workspace/Dockerfile b/workspace/Dockerfile index f41f1634d0..0fd26b62a8 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -14,8 +14,7 @@ ARG LARADOCK_PHP_VERSION -# FROM laradock/workspace:2.2-${LARADOCK_PHP_VERSION} -FROM letsdockerize/laradock-workspace:2.4-${LARADOCK_PHP_VERSION} +FROM laradock/workspace:2.5-${LARADOCK_PHP_VERSION} LABEL maintainer="Mahmoud Zalt " From e2160e388d6e889d46d59b85c2f7fc3072b2f294 Mon Sep 17 00:00:00 2001 From: Bharat Gupta Date: Sat, 24 Aug 2019 13:08:41 +0530 Subject: [PATCH 068/861] fixed reference link to list of container --- DOCUMENTATION/content/getting-started/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DOCUMENTATION/content/getting-started/index.md b/DOCUMENTATION/content/getting-started/index.md index f71661dad5..a79b480dc4 100644 --- a/DOCUMENTATION/content/getting-started/index.md +++ b/DOCUMENTATION/content/getting-started/index.md @@ -178,7 +178,7 @@ docker-compose up -d nginx mysql **Note**: All the web server containers `nginx`, `apache` ..etc depends on `php-fpm`, which means if you run any of them, they will automatically launch the `php-fpm` container for you, so no need to explicitly specify it in the `up` command. If you have to do so, you may need to run them as follows: `docker-compose up -d nginx php-fpm mysql`. -You can select your own combination of containers from [this list](http://laradock.io/introduction/#supported-software-images). +You can select your own combination of containers from [this list](https://laradock.io/introduction/#supported-software-docker-images). *(Please note that sometimes we forget to update the docs, so check the `docker-compose.yml` file to see an updated list of all available containers).* From ae64a619b713b4d574967c1a7bbe318f8c6b1834 Mon Sep 17 00:00:00 2001 From: xiagw Date: Sun, 25 Aug 2019 17:24:17 +0800 Subject: [PATCH 069/861] add tomcat --- docker-compose.yml | 17 ++++++++++++++++- env-example | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1a729e87be..2d06b7f8e7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1487,6 +1487,7 @@ services: networks: - backend - frontend + ### CONFLUENCE ################################################ confluence: container_name: Confluence @@ -1500,4 +1501,18 @@ services: depends_on: - postgres volumes: - - ${DATA_PATH_HOST}/Confluence:/var/atlassian/application-data \ No newline at end of file + - ${DATA_PATH_HOST}/Confluence:/var/atlassian/application-data + +### tomcat #################################################### + tomcat: + container_name: tomcat + image: tomcat:${TOMCAT_VERSION} + ports: + - "${TOMCAT_HOST_HTTP_PORT}:8080" + networks: + - frontend + - backend + volumes: + - ${DATA_PATH_HOST}/tomcat/webapps:/usr/local/tomcat/webapps + - ${DATA_PATH_HOST}/tomcat/logs:/usr/local/tomcat/logs + # restart: always \ No newline at end of file diff --git a/env-example b/env-example index 6bc5a3f3a5..cf0ab26a8f 100644 --- a/env-example +++ b/env-example @@ -718,3 +718,7 @@ SONARQUBE_POSTGRES_HOST=postgres SONARQUBE_POSTGRES_DB=sonar SONARQUBE_POSTGRES_USER=sonar SONARQUBE_POSTGRES_PASSWORD=sonarPass + +### TOMCAT ################################################ +TOMCAT_VERSION=8.5.43 +TOMCAT_HOST_HTTP_PORT=8080 From 4e306a6be0ac368cba8411325dbbd0385cc07f97 Mon Sep 17 00:00:00 2001 From: Atef Ben Ali Date: Thu, 29 Aug 2019 11:25:08 +0100 Subject: [PATCH 070/861] Fix typo It's `Laravel Dusk v2.x` not `Laravel v2.x` ! --- DOCUMENTATION/content/guides/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DOCUMENTATION/content/guides/index.md b/DOCUMENTATION/content/guides/index.md index 451c002753..9ffd014053 100644 --- a/DOCUMENTATION/content/guides/index.md +++ b/DOCUMENTATION/content/guides/index.md @@ -345,7 +345,7 @@ You could choose to use either: 1. Chrome Driver shipped with Laravel Dusk. (Default) 2. Chrome Driver installed in `workspace` container. (Required tweak on DuskTestCase class) -For Laravel 2.x, you need to update `DuskTestCase#prepare` method if you wish to go with option #2. +For Laravel Dusk 2.x, you need to update `DuskTestCase#prepare` method if you wish to go with option #2. ``` @@ -365,7 +365,7 @@ abstract class DuskTestCase extends BaseTestCase } ``` -For Laravel 1.x, you need to add `DuskTestCase#buildChromeProcess` method if you wish to go with option #2. +For Laravel Dusk 1.x, you need to add `DuskTestCase#buildChromeProcess` method if you wish to go with option #2. ``` Date: Wed, 11 Sep 2019 16:59:56 +0800 Subject: [PATCH 071/861] fix(compose file): add missing config for inotify and fswatch --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index e4a4fc4b38..9306d6d379 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -109,6 +109,8 @@ services: - INSTALL_MYSQL_CLIENT=${WORKSPACE_INSTALL_MYSQL_CLIENT} - INSTALL_PING=${WORKSPACE_INSTALL_PING} - INSTALL_SSHPASS=${WORKSPACE_INSTALL_SSHPASS} + - INSTALL_INOTIFY=${WORKSPACE_INSTALL_INOTIFY} + - INSTALL_FSWATCH=${WORKSPACE_INSTALL_FSWATCH} - PUID=${WORKSPACE_PUID} - PGID=${WORKSPACE_PGID} - CHROME_DRIVER_VERSION=${WORKSPACE_CHROME_DRIVER_VERSION} From 2d444e094cd3bbfdc480ce44875dcc409429847a Mon Sep 17 00:00:00 2001 From: xiagw Date: Thu, 12 Sep 2019 08:36:11 +0800 Subject: [PATCH 072/861] php-fpm implement CHANGE_SOURCE WIP #2238 --- php-fpm/Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 27dcec74c9..be2d159c84 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -23,6 +23,12 @@ ARG LARADOCK_PHP_VERSION # Set Environment Variables ENV DEBIAN_FRONTEND noninteractive +ARG CHANGE_SOURCE=false +RUN if [ ${CHANGE_SOURCE} = true ]; then \ + # Change application source from deb.debian.org to aliyun source + sed -i 's/deb.debian.org/mirrors.aliyun.com/' /etc/apt/sources.list \ +;fi + # always run apt update when start and after add new source list, then clean up at end. RUN set -xe; \ apt-get update -yqq && \ From 559acc278b0f461bdfb165fdbaa1bfde191d9df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joa=CC=83o=20Zonta?= Date: Wed, 11 Sep 2019 23:54:29 -0300 Subject: [PATCH 073/861] Added support for OCI8 extension in workspace and php-fpm containers. PHP 5.6, 7.0, 7.1, 7.2 and 7.3 --- docker-compose.yml | 2 ++ env-example | 2 ++ php-fpm/Dockerfile | 45 ++++++++++++++++++++++++++++++++++++++++++++ workspace/Dockerfile | 41 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index e4a4fc4b38..cf2c53c5f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,6 +83,7 @@ services: - INSTALL_WP_CLI=${WORKSPACE_INSTALL_WP_CLI} - INSTALL_DRUPAL_CONSOLE=${WORKSPACE_INSTALL_DRUPAL_CONSOLE} - INSTALL_AEROSPIKE=${WORKSPACE_INSTALL_AEROSPIKE} + - INSTALL_OCI8=${WORKSPACE_INSTALL_OCI8} - INSTALL_V8JS=${WORKSPACE_INSTALL_V8JS} - COMPOSER_GLOBAL_INSTALL=${WORKSPACE_COMPOSER_GLOBAL_INSTALL} - COMPOSER_AUTH=${WORKSPACE_COMPOSER_AUTH} @@ -165,6 +166,7 @@ services: - INSTALL_OPCACHE=${PHP_FPM_INSTALL_OPCACHE} - INSTALL_EXIF=${PHP_FPM_INSTALL_EXIF} - INSTALL_AEROSPIKE=${PHP_FPM_INSTALL_AEROSPIKE} + - INSTALL_OCI8=${PHP_FPM_INSTALL_OCI8} - INSTALL_MYSQLI=${PHP_FPM_INSTALL_MYSQLI} - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL} - INSTALL_PG_CLIENT=${PHP_FPM_INSTALL_PG_CLIENT} diff --git a/env-example b/env-example index 76a4af3125..f5d74eee4d 100644 --- a/env-example +++ b/env-example @@ -113,6 +113,7 @@ WORKSPACE_DRUSH_VERSION=8.1.17 WORKSPACE_INSTALL_DRUPAL_CONSOLE=false WORKSPACE_INSTALL_WP_CLI=false WORKSPACE_INSTALL_AEROSPIKE=false +WORKSPACE_INSTALL_OCI8=false WORKSPACE_INSTALL_V8JS=false WORKSPACE_INSTALL_LARAVEL_ENVOY=false WORKSPACE_INSTALL_LARAVEL_INSTALLER=false @@ -170,6 +171,7 @@ PHP_FPM_INSTALL_XSL=false PHP_FPM_INSTALL_GMP=false PHP_FPM_INSTALL_EXIF=false PHP_FPM_INSTALL_AEROSPIKE=false +PHP_FPM_INSTALL_OCI8=false PHP_FPM_INSTALL_PGSQL=false PHP_FPM_INSTALL_GHOSTSCRIPT=false PHP_FPM_INSTALL_LDAP=false diff --git a/php-fpm/Dockerfile b/php-fpm/Dockerfile index 27dcec74c9..e769454efd 100644 --- a/php-fpm/Dockerfile +++ b/php-fpm/Dockerfile @@ -423,6 +423,51 @@ RUN set -xe; \ && docker-php-ext-enable aerospike \ ;fi +########################################################################### +# PHP OCI8: +########################################################################### + +ARG INSTALL_OCI8=false + +ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_12_1" +ENV OCI_HOME="/opt/oracle/instantclient_12_1" +ENV OCI_LIB_DIR="/opt/oracle/instantclient_12_1" +ENV OCI_INCLUDE_DIR="/opt/oracle/instantclient_12_1/sdk/include" +ENV OCI_VERSION=12 + +RUN if [ ${INSTALL_OCI8} = true ]; then \ + # Install wget + apt-get update && apt-get install --no-install-recommends -y wget \ + # Install Oracle Instantclient + && mkdir /opt/oracle \ + && cd /opt/oracle \ + && wget https://github.com/diogomascarenha/oracle-instantclient/raw/master/instantclient-basic-linux.x64-12.1.0.2.0.zip \ + && wget https://github.com/diogomascarenha/oracle-instantclient/raw/master/instantclient-sdk-linux.x64-12.1.0.2.0.zip \ + && unzip /opt/oracle/instantclient-basic-linux.x64-12.1.0.2.0.zip -d /opt/oracle \ + && unzip /opt/oracle/instantclient-sdk-linux.x64-12.1.0.2.0.zip -d /opt/oracle \ + && ln -s /opt/oracle/instantclient_12_1/libclntsh.so.12.1 /opt/oracle/instantclient_12_1/libclntsh.so \ + && ln -s /opt/oracle/instantclient_12_1/libclntshcore.so.12.1 /opt/oracle/instantclient_12_1/libclntshcore.so \ + && ln -s /opt/oracle/instantclient_12_1/libocci.so.12.1 /opt/oracle/instantclient_12_1/libocci.so \ + && rm -rf /opt/oracle/*.zip \ + # Install PHP extensions deps + && apt-get update \ + && apt-get install --no-install-recommends -y \ + libaio-dev \ + freetds-dev && \ + # Install PHP extensions + if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \ + echo 'instantclient,/opt/oracle/instantclient_12_1/' | pecl install oci8-2.0.10; \ + else \ + echo 'instantclient,/opt/oracle/instantclient_12_1/' | pecl install oci8; \ + fi \ + && docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,/opt/oracle/instantclient_12_1,12.1 \ + && docker-php-ext-configure pdo_dblib --with-libdir=/lib/x86_64-linux-gnu \ + && docker-php-ext-install \ + pdo_oci \ + && docker-php-ext-enable \ + oci8 \ + ;fi + ########################################################################### # IonCube Loader: ########################################################################### diff --git a/workspace/Dockerfile b/workspace/Dockerfile index 0fd26b62a8..6cc6b975ed 100644 --- a/workspace/Dockerfile +++ b/workspace/Dockerfile @@ -708,6 +708,47 @@ RUN set -xe; \ && echo 'aerospike.udf.lua_user_path=/usr/local/aerospike/usr-lua' >> /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/aerospike.ini \ ;fi +########################################################################### +# PHP OCI8: +########################################################################### + +USER root +ARG INSTALL_OCI8=false + +ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_12_1" +ENV OCI_HOME="/opt/oracle/instantclient_12_1" +ENV OCI_LIB_DIR="/opt/oracle/instantclient_12_1" +ENV OCI_INCLUDE_DIR="/opt/oracle/instantclient_12_1/sdk/include" +ENV OCI_VERSION=12 + +RUN if [ ${INSTALL_OCI8} = true ]; then \ + # Install wget + apt-get update && apt-get install --no-install-recommends -y wget \ + # Install Oracle Instantclient + && mkdir /opt/oracle \ + && cd /opt/oracle \ + && wget https://github.com/diogomascarenha/oracle-instantclient/raw/master/instantclient-basic-linux.x64-12.1.0.2.0.zip \ + && wget https://github.com/diogomascarenha/oracle-instantclient/raw/master/instantclient-sdk-linux.x64-12.1.0.2.0.zip \ + && unzip /opt/oracle/instantclient-basic-linux.x64-12.1.0.2.0.zip -d /opt/oracle \ + && unzip /opt/oracle/instantclient-sdk-linux.x64-12.1.0.2.0.zip -d /opt/oracle \ + && ln -s /opt/oracle/instantclient_12_1/libclntsh.so.12.1 /opt/oracle/instantclient_12_1/libclntsh.so \ + && ln -s /opt/oracle/instantclient_12_1/libclntshcore.so.12.1 /opt/oracle/instantclient_12_1/libclntshcore.so \ + && ln -s /opt/oracle/instantclient_12_1/libocci.so.12.1 /opt/oracle/instantclient_12_1/libocci.so \ + && rm -rf /opt/oracle/*.zip \ + # Install PHP extensions deps + && apt-get update \ + && apt-get install --no-install-recommends -y \ + libaio-dev && \ + # Install PHP extensions + if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \ + echo 'instantclient,/opt/oracle/instantclient_12_1/' | pecl install oci8-2.0.10; \ + else \ + echo 'instantclient,/opt/oracle/instantclient_12_1/' | pecl install oci8; \ + fi \ + && echo "extension=oci8.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/php.ini \ + && php -m | grep -q 'oci8' \ +;fi + ########################################################################### # PHP V8JS: ########################################################################### From 9acb18aee158887a1ad1bb5f6bc1d62e049daa8e Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Fri, 13 Sep 2019 12:24:14 +0200 Subject: [PATCH 074/861] Redesign the README and update docs --- .github/README.md | 98 -------- .github/home-page-images/join-us.png | Bin 0 -> 130641 bytes .github/home-page-images/sponsor-1.png | Bin 71605 -> 0 bytes DOCUMENTATION/content/introduction/index.md | 224 +++++++++++++++--- .github/README-zh.md => README-zh.md | 0 README.md | 249 ++++++++++++++++++++ 6 files changed, 441 insertions(+), 130 deletions(-) delete mode 100644 .github/README.md create mode 100644 .github/home-page-images/join-us.png delete mode 100644 .github/home-page-images/sponsor-1.png rename .github/README-zh.md => README-zh.md (100%) create mode 100644 README.md diff --git a/.github/README.md b/.github/README.md deleted file mode 100644 index 6b79353d42..0000000000 --- a/.github/README.md +++ /dev/null @@ -1,98 +0,0 @@ -

- Laradock Logo -

- -

PHP development environment that runs on Docker

- -

- Build status - GitHub stars - GitHub forks - GitHub issues - GitHub license - contributions welcome -

- -

Use Docker First - Then Learn About It Later

- -

- forthebadge -

- - ---- - -

- - Laradock Documentation - -

- -## Sponsors - -

- - - Writing essays service Edubirdie - -

- - - - - - - - - - - -For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io. - -*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page.* - -## People - -#### Maintainers: -- [Mahmoud Zalt](https://github.com/Mahmoudz) @mahmoudz | [Twitter](https://twitter.com/Mahmoud_Zalt) | [Site](http://zalt.me) -- [Bo-Yi Wu](https://github.com/appleboy) @appleboy | [Twitter](https://twitter.com/appleboy) -- [Philippe Trépanier](https://github.com/philtrep) @philtrep -- [Mike Erickson](https://github.com/mikeerickson) @mikeerickson -- [Dwi Fahni Denni](https://github.com/zeroc0d3) @zeroc0d3 -- [Thor Erik](https://github.com/thorerik) @thorerik -- [Winfried van Loon](https://github.com/winfried-van-loon) @winfried-van-loon -- [TJ Miller](https://github.com/sixlive) @sixlive -- [Yu-Lung Shao (Allen)](https://github.com/bestlong) @bestlong -- [Milan Urukalo](https://github.com/urukalo) @urukalo -- [Vince Chu](https://github.com/vwchu) @vwchu -- [Huadong Zuo](https://github.com/zuohuadong) @zuohuadong -- [Lan Phan](https://github.com/lanphan) @lanphan -- [Ahkui](https://github.com/ahkui) @ahkui -- Join us. - -#### Awesome Contributors: - - - - -## Donations - -> Help keeping the project development going, by [contributing](http://laradock.io/contributing) or donating a little. -> Thanks in advance. - -Donate directly via [Paypal](https://paypal.me/mzmmzz) - -[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/mzmmzz) - -or show your support via [Beerpay](https://beerpay.io/laradock/laradock) - -[![Beerpay](https://beerpay.io/laradock/laradock/badge.svg?style=flat)](https://beerpay.io/laradock/laradock) - -or become a backer on [Open Collective](https://opencollective.com/laradock#backer) - - - - -## License - -[MIT License](https://github.com/laradock/laradock/blob/master/LICENSE) diff --git a/.github/home-page-images/join-us.png b/.github/home-page-images/join-us.png new file mode 100644 index 0000000000000000000000000000000000000000..c97f75f9fdb2354fd5a47e56e2717ea430761a79 GIT binary patch literal 130641 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

A*|? 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 literal 0 HcmV?d00001 diff --git a/.github/home-page-images/sponsor-1.png b/.github/home-page-images/sponsor-1.png deleted file mode 100644 index fc9bbd948f9ce7b7126b5eb85e0e258443e50847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71605 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 ## Sponsors -

- - - Writing essays service Edubirdie - -

- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Support Laradock with your [organization](https://opencollective.com/laradock/contribute/).
- - - - - - - - - - - -For basic sponsorships go to [Open Collective](https://opencollective.com/laradock#sponsor), for golden sponsorships contact support@laradock.io. +Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page.
-*Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page.* +For more info contact support@laradock.io. + +--- ## Quick Overview @@ -233,7 +271,7 @@ You can choose, which tools to install in your workspace container and other con *If you can't find your Software in the list, build it yourself and submit it. Contributions are welcomed :)* - +--- ## What is Docker? @@ -286,24 +324,146 @@ You are welcome to join our chat room on Gitter. [![Gitter](https://badges.gitter.im/Laradock/laradock.svg)](https://gitter.im/Laradock/laradock?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +## Awesome People +Laradock exists thanks to all the people who contribute. + +### Project Maintainers + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ Mahmoud Zalt +
+ @mahmoudz +
+ +
+ Bo-Yi Wu +
+ @appleboy +
+ +
+ Philippe Trépanier +
+ @philtrep +
+ +
+ Mike Erickson +
+ @mikeerickson +
+ +
+ Dwi Fahni Denni +
+ @zeroc0d3 +
+ +
+ Thor Erik +
+ @thorerik +
+ +
+ Winfried van Loon +
+ @winfried-van-loon +
+ +
+ TJ Miller +
+ @sixlive +
+ +
+ Yu-Lung Shao (Allen) +
+ @bestlong +
+ +
+ Milan Urukalo +
+ @urukalo +
+ +
+ Vince Chu +
+ @vwchu +
+ +
+ Huadong Zuo +
+ @zuohuadong +
+ +
+ Lan Phan +
+ @lanphan +
+ +
+ Ahkui +
+ @ahkui +
+ +
+ < Join Us > +
+ @laradock +
+ +### Code Contributors + + - - +--- -## Donations +## Financial Contributors -> Help keeping the project development going, by [contributing](http://laradock.io/contributing) or donating a little. -> Thanks in advance. +Contribute and help us sustain the project. -Donate directly via [Paypal](https://paypal.me/mzmmzz) +Option 1: Donate directly to [Paypal](https://paypal.me/mzmmzz). -[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/mzmmzz) +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/mzmmzz) -or show your support via [Beerpay](https://beerpay.io/laradock/laradock) +Option 2: Support us via [BeerPay](https://beerpay.io/laradock/laradock). [![Beerpay](https://beerpay.io/laradock/laradock/badge.svg?style=flat)](https://beerpay.io/laradock/laradock) -or become a backer on [Open Collective](https://opencollective.com/laradock#backer) +Option 3: Become a backer on [Open Collective](https://opencollective.com/laradock/contribute). - + diff --git a/.github/README-zh.md b/README-zh.md similarity index 100% rename from .github/README-zh.md rename to README-zh.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..d01fad527a --- /dev/null +++ b/README.md @@ -0,0 +1,249 @@ +

+ Laradock Logo +

+ +--- + +

PHP development environment that runs on Docker

+ + +

+ contributions welcome + GitHub forks + GitHub issues + GitHub stars + Build status + GitHub license +

+ +

+ forthebadge +

+ + + +

Use Docker First - Then Learn About It Later

+ +

+ + Laradock Documentation + +

+ +--- + +## Awesome People +Laradock exists thanks to all the people who contribute. + +### Project Maintainers + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ Mahmoud Zalt +
+ @mahmoudz +
+ +
+ Bo-Yi Wu +
+ @appleboy +
+ +
+ Philippe Trépanier +
+ @philtrep +
+ +
+ Mike Erickson +
+ @mikeerickson +
+ +
+ Dwi Fahni Denni +
+ @zeroc0d3 +
+ +
+ Thor Erik +
+ @thorerik +
+ +
+ Winfried van Loon +
+ @winfried-van-loon +
+ +
+ TJ Miller +
+ @sixlive +
+ +
+ Yu-Lung Shao (Allen) +
+ @bestlong +
+ +
+ Milan Urukalo +
+ @urukalo +
+ +
+ Vince Chu +
+ @vwchu +
+ +
+ Huadong Zuo +
+ @zuohuadong +
+ +
+ Lan Phan +
+ @lanphan +
+ +
+ Ahkui +
+ @ahkui +
+ +
+ < Join Us > +
+ @laradock +
+ +### Code Contributors + + + +### Financial Contributors + +Contribute and help us sustain the project. + +Option 1: Donate directly to [Paypal](https://paypal.me/mzmmzz). + +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/mzmmzz) + +Option 2: Support us via [BeerPay](https://beerpay.io/laradock/laradock). + +[![Beerpay](https://beerpay.io/laradock/laradock/badge.svg?style=flat)](https://beerpay.io/laradock/laradock) + +Option 3: Become a backer on [Open Collective](https://opencollective.com/laradock/contribute). + + + + + + + + + +## Sponsors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Support Laradock with your [organization](https://opencollective.com/laradock/contribute/). +
+Your logo will show up on the [github repository](https://github.com/laradock/laradock/) index page and the [documentation](http://laradock.io/) main page. +
+For more info contact support@laradock.io. + +## License + +[MIT License](https://github.com/laradock/laradock/blob/master/LICENSE) From 308f813e452ba143084470da32940784f6411e00 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Fri, 13 Sep 2019 18:17:09 +0200 Subject: [PATCH 075/861] Enhance the design and readability of the docs --- DOCUMENTATION/content/introduction/index.md | 98 +++++-------------- DOCUMENTATION/static/custom-style.css | 17 ++++ .../hugo-material-docs/layouts/index.html | 48 +++++---- README.md | 14 +-- 4 files changed, 73 insertions(+), 104 deletions(-) diff --git a/DOCUMENTATION/content/introduction/index.md b/DOCUMENTATION/content/introduction/index.md index 25555ffdd9..8493fed842 100644 --- a/DOCUMENTATION/content/introduction/index.md +++ b/DOCUMENTATION/content/introduction/index.md @@ -4,19 +4,34 @@ type: index weight: 1 --- -![](https://raw.githubusercontent.com/laradock/laradock/master/.github/home-page-images/laradock-logo.jpg) +Laradock is a full PHP development environment based on Docker. -## Use Docker First - Then Learn About It Later - -Laradock is a PHP development environment that runs on Docker. - -Supports a variety of useful Docker Images, pre-configured to provide a wonderful PHP development environment. +Supporting a variety of common services, all pre-configured to provide a full PHP development environment. + +## Features +- Easy switch between PHP versions: 7.3, 7.2, 7.1, 5.6... +- Choose your favorite database engine: MySQL, Postgres, MariaDB... +- Run your own stack: Memcached, HHVM, RabbitMQ... +- Each software runs on its own container: PHP-FPM, NGINX, PHP-CLI... +- Easy to customize any container, with simple edit to the `Dockerfile`. +- All Images extends from an official base Image. (Trusted base Images). +- Pre-configured NGINX to host any code at your root directory. +- Can use Laradock per project, or single Laradock for all projects. +- Easy to install/remove software's in Containers using environment variables. +- Clean and well structured Dockerfiles (`Dockerfile`). +- Latest version of the Docker Compose file (`docker-compose`). +- Everything is visible and editable. +- Fast Images Builds. +
--- +### Use Docker First - Then Learn About It Later +--- + ## Sponsors @@ -79,7 +94,8 @@ Your logo will show up on the [github repository](https://github.com/laradock/la
For more info contact support@laradock.io. ---- +
+ ## Quick Overview @@ -120,25 +136,6 @@ That's it! enjoy :) - -## Features - -- Easy switch between PHP versions: 7.3, 7.2, 7.1, 5.6... -- Choose your favorite database engine: MySQL, Postgres, MariaDB... -- Run your own stack: Memcached, HHVM, RabbitMQ... -- Each software runs on its own container: PHP-FPM, NGINX, PHP-CLI... -- Easy to customize any container, with simple edit to the `Dockerfile`. -- All Images extends from an official base Image. (Trusted base Images). -- Pre-configured NGINX to host any code at your root directory. -- Can use Laradock per project, or single Laradock for all projects. -- Easy to install/remove software's in Containers using environment variables. -- Clean and well structured Dockerfiles (`Dockerfile`). -- Latest version of the Docker Compose file (`docker-compose`). -- Everything is visible and editable. -- Fast Images Builds. - - - ## Supported Software (Docker Images) @@ -273,48 +270,6 @@ You can choose, which tools to install in your workspace container and other con --- - -## What is Docker? - -[Docker](https://www.docker.com) is an open platform for developing, shipping, and running applications. -Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. -With Docker, you can manage your infrastructure in the same ways you manage your applications. -By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production. - - - - - - -## Why Docker not Vagrant!? - -[Vagrant](https://www.vagrantup.com) creates Virtual Machines in minutes while Docker creates Virtual Containers in seconds. - -Instead of providing a full Virtual Machines, like you get with Vagrant, Docker provides you **lightweight** Virtual Containers, that share the same kernel and allow to safely execute independent processes. - -In addition to the speed, Docker gives tons of features that cannot be achieved with Vagrant. - -Most importantly Docker can run on Development and on Production (same environment everywhere). While Vagrant is designed for Development only, (so you have to re-provision your server on Production every time). - - - - - - - -## Demo Video - -What's better than a **Demo Video**: - -- Laradock [v4.*](https://www.youtube.com/watch?v=TQii1jDa96Y) -- Laradock [v2.*](https://www.youtube.com/watch?v=-DamFMczwDA) -- Laradock [v0.3](https://www.youtube.com/watch?v=jGkyO6Is_aI) -- Laradock [v0.1](https://www.youtube.com/watch?v=3YQsHe6oF80) - - - - - @@ -324,10 +279,11 @@ You are welcome to join our chat room on Gitter. [![Gitter](https://badges.gitter.im/Laradock/laradock.svg)](https://gitter.im/Laradock/laradock?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) -## Awesome People +--- + Laradock exists thanks to all the people who contribute. -### Project Maintainers +## Project Maintainers @@ -445,7 +401,7 @@ Laradock exists thanks to all the people who contribute.
-### Code Contributors +## Code Contributors diff --git a/DOCUMENTATION/static/custom-style.css b/DOCUMENTATION/static/custom-style.css index 0f3957fc57..d25a5ac145 100644 --- a/DOCUMENTATION/static/custom-style.css +++ b/DOCUMENTATION/static/custom-style.css @@ -11,3 +11,20 @@ height: 70px; padding: 25px; } +.palette-primary-deep-purple .article h1{ + color: #7e57c2; + font-size: 35px; +} +.palette-primary-deep-purple .article h2{ + + color: #ce2046; + font-size: 25px; +} +.palette-primary-deep-purple .article h3{ + color: #851d54; + font-size: 18px; +} +.palette-primary-deep-purple .article code{ + color: #851d54; + background: #eeeeeea8; +} diff --git a/DOCUMENTATION/themes/hugo-material-docs/layouts/index.html b/DOCUMENTATION/themes/hugo-material-docs/layouts/index.html index 5ee52d1cb1..502cd68ce2 100644 --- a/DOCUMENTATION/themes/hugo-material-docs/layouts/index.html +++ b/DOCUMENTATION/themes/hugo-material-docs/layouts/index.html @@ -1,8 +1,8 @@ {{ partial "head" . }} {{ if (eq (trim .Site.Params.provider " " | lower) "github") | and (isset .Site.Params "repo_url") }} - {{ $repo_id := replace .Site.Params.repo_url "https://github.com/" ""}} - {{ .Scratch.Set "repo_id" $repo_id }} + {{ $repo_id := replace .Site.Params.repo_url "https://github.com/" ""}} + {{ .Scratch.Set "repo_id" $repo_id }} {{ end }}
@@ -25,26 +25,32 @@
- -
- - - - - - - -
+ +
+ + + + + + + +
+ +


+ laradock logo {{ range where .Site.Pages "Type" "index" }} -

{{ .Title }} {{ if .IsDraft }} (Draft){{ end }}

+





+
+
+

{{ .Title }} {{ if .IsDraft }} (Draft){{ end }}

- {{ .Content }} + {{ .Content }} {{ end }}