From 9367c9540a419fa4e5bff807ba64759b582091e5 Mon Sep 17 00:00:00 2001 From: cytopia Date: Thu, 12 Nov 2020 14:19:49 +0100 Subject: [PATCH] Add check-config.sh script for local troubleshooting --- .github/ISSUE_TEMPLATE/bug_report.md | 36 +- .github/workflows/lint.yml | 6 + .gitignore | 6 +- CHANGELOG.md | 7 + cfg/php-startup-5.2/.keepme | 0 cfg/php-startup-5.3/.keepme | 0 cfg/php-startup-5.4/.keepme | 0 cfg/php-startup-5.5/.keepme | 0 cfg/php-startup-5.6/.keepme | 0 cfg/php-startup-7.0/.keepme | 0 cfg/php-startup-7.1/.keepme | 0 cfg/php-startup-7.2/.keepme | 0 cfg/php-startup-7.3/.keepme | 0 cfg/php-startup-7.4/.keepme | 0 cfg/php-startup-8.0/.keepme | 0 cfg/php-startup-8.1/.keepme | 0 cfg/varnish-4/.keepme | 0 cfg/varnish-5/.keepme | 0 cfg/varnish-6/.keepme | 0 check-config.sh | 501 +++++++++++++++++++++++++++ docker-compose.yml | 10 - docs/support/troubleshooting.rst | 8 + mod/php-fpm-5.2/.keepme | 0 mod/php-fpm-5.3/.keepme | 0 mod/php-fpm-7.3/.keepme | 0 mod/php-fpm-7.4/.keepme | 0 mod/php-fpm-8.0/.keepme | 0 mod/php-fpm-8.1/.keepme | 0 28 files changed, 545 insertions(+), 29 deletions(-) create mode 100644 cfg/php-startup-5.2/.keepme create mode 100644 cfg/php-startup-5.3/.keepme create mode 100644 cfg/php-startup-5.4/.keepme create mode 100644 cfg/php-startup-5.5/.keepme create mode 100644 cfg/php-startup-5.6/.keepme create mode 100644 cfg/php-startup-7.0/.keepme create mode 100644 cfg/php-startup-7.1/.keepme create mode 100644 cfg/php-startup-7.2/.keepme create mode 100644 cfg/php-startup-7.3/.keepme create mode 100644 cfg/php-startup-7.4/.keepme create mode 100644 cfg/php-startup-8.0/.keepme create mode 100644 cfg/php-startup-8.1/.keepme create mode 100644 cfg/varnish-4/.keepme create mode 100644 cfg/varnish-5/.keepme create mode 100644 cfg/varnish-6/.keepme create mode 100755 check-config.sh create mode 100644 mod/php-fpm-5.2/.keepme create mode 100644 mod/php-fpm-5.3/.keepme create mode 100644 mod/php-fpm-7.3/.keepme create mode 100644 mod/php-fpm-7.4/.keepme create mode 100644 mod/php-fpm-8.0/.keepme create mode 100644 mod/php-fpm-8.1/.keepme diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 60e008d5..277dbb05 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -25,9 +25,10 @@ assignees: '' ### Checklist * [ ] `.env` file is attached -* [ ] `docker-compose.override.yml` is attached (if it exists) -* [ ] Custom configs from `cfg/` dir are attached (if customized) -* [ ] `docker-compose logs` and `log/` output is added +* [ ] `./check-config.sh` output is added below +* [ ] `docker-compose logs` output is added below +* [ ] `docker-compose.override.yml` is attached (if exists) +* [ ] Custom configs from `cfg/` dir are attached (if exist) * [ ] I've looked through the docs: https://devilbox.readthedocs.io/en/latest/ * [ ] I've looked through existing issues: https://github.com/cytopia/devilbox/issues * [ ] I've read troubleshooting: https://devilbox.readthedocs.io/en/latest/support/troubleshooting.html @@ -35,10 +36,10 @@ assignees: '' ### OS / ENVIRONMENT -1. Host operating system and version: -2. (Windows) Native Docker or Docker Toolbox: -3. Docker version: -4. Docker Compose version: +1. Host operating system and version: +2. (Windows only) Native Docker or Docker Toolbox: +3. Docker version: +4. Docker Compose version: 5. (Linux) Is SELinux enabled?: 6. What git commit hash are you on?: @@ -68,18 +69,17 @@ assignees: '' $ docker-compose up... ``` -#### File and user permissions (Linux & MacOS) - -``` -$ id +#### Outputs + +```bash +$ ./check-config.sh + +<<< REPLACE THIS LINE WITH OUTPUT FROM ABOVE COMMAND >>> ``` - -``` -$ ls -la -``` + +```bash +$ docker-compose logs - -``` -$ ls -la data/www +<<< REPLACE THIS LINE WITH OUTPUT FROM ABOVE COMMAND >>> ``` diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index e064f588..e41d86e5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -48,3 +48,9 @@ jobs: run: | cd .tests/ make lint-tests + + - name: Check configuration + shell: bash + run: | + cp env-example .env + ./check-config.sh diff --git a/.gitignore b/.gitignore index 8a065cb2..41fa6bac 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ /cfg/mariadb-10.2/*.cnf /cfg/mariadb-10.3/*.cnf /cfg/mariadb-10.4/*.cnf +/cfg/mariadb-10.5/*.cnf /cfg/percona-5.5/*.cnf /cfg/percona-5.6/*.cnf /cfg/percona-5.7/*.cnf @@ -79,6 +80,7 @@ /cfg/php-fpm-7.3/*.conf /cfg/php-fpm-7.4/*.conf /cfg/php-fpm-8.0/*.conf +/cfg/php-fpm-8.1/*.conf # Ignore custom PHP-FPM startup scripts /autostart/*.sh @@ -93,6 +95,7 @@ /cfg/php-startup-7.3/*.sh /cfg/php-startup-7.4/*.sh /cfg/php-startup-8.0/*.sh +/cfg/php-startup-8.1/*.sh # Ignorecustom Varnish configs /cfg/varnish-4/*.vcl @@ -111,6 +114,7 @@ /mod/php-fpm-7.3/*.so /mod/php-fpm-7.4/*.so /mod/php-fpm-8.0/*.so +/mod/php-fpm-8.1/*.so # Ignore custom bash and other confi files /bash/* @@ -204,4 +208,4 @@ $RECYCLE.BIN/ *.bbproject ###### VS Code ###### -/.vscode \ No newline at end of file +/.vscode diff --git a/CHANGELOG.md b/CHANGELOG.md index fd4a6d76..7c84426e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ major versions. ## Unreleased +## Release v1.8.1 (2020-11-12) + +#### Added + +- Added `check-config.sh` script to check against correct Devilbox configuration + + ## Release v1.8.0 (2020-11-08) #### Fixed diff --git a/cfg/php-startup-5.2/.keepme b/cfg/php-startup-5.2/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-5.3/.keepme b/cfg/php-startup-5.3/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-5.4/.keepme b/cfg/php-startup-5.4/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-5.5/.keepme b/cfg/php-startup-5.5/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-5.6/.keepme b/cfg/php-startup-5.6/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-7.0/.keepme b/cfg/php-startup-7.0/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-7.1/.keepme b/cfg/php-startup-7.1/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-7.2/.keepme b/cfg/php-startup-7.2/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-7.3/.keepme b/cfg/php-startup-7.3/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-7.4/.keepme b/cfg/php-startup-7.4/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-8.0/.keepme b/cfg/php-startup-8.0/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/php-startup-8.1/.keepme b/cfg/php-startup-8.1/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/varnish-4/.keepme b/cfg/varnish-4/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/varnish-5/.keepme b/cfg/varnish-5/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/cfg/varnish-6/.keepme b/cfg/varnish-6/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/check-config.sh b/check-config.sh new file mode 100755 index 00000000..7b0992fb --- /dev/null +++ b/check-config.sh @@ -0,0 +1,501 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + + +#-------------------------------------------------------------------------------------------------- +# GLOBALS +#-------------------------------------------------------------------------------------------------- +RET_CODE=0 +MY_UID="$( id -u )" +MY_GID="$( id -g )" + + +#-------------------------------------------------------------------------------------------------- +# Functions +#-------------------------------------------------------------------------------------------------- + +### +### Logger functions +### +log_err() { + >&2 printf "\\e[1;31m[ERR] %s\\e[0m\\n" "${1}" +} + +log_info() { + printf "[INFO] %s\\n" "${1}" +} + +log_ok() { + printf "\\e[;32m[SUCC] %s\\e[0m\\n" "${1}" +} + +### +### Output functions +### +print_head_1() { + printf "\\n# " + printf "%0.s=" {1..78} + printf "\\n" + + printf "# %s\\n" "${1}" + + printf "# " + printf "%0.s=" {1..78} + printf "\\n" +} + +### +### File functions +### +file_get_uid() { + stat -c '%u' "${1}" +} + +file_get_gid() { + stat -c '%g' "${1}" +} + +# Returns 4-digit format +file_get_perm() { + local perm + local len + + if [ "$(uname)" = "Linux" ]; then + # If no special permissions are set (no sticky bit...), linux will + # only output the 3 digit number + perm="$( stat --format '%a' "${1}" )" + else + perm="$( stat -f '%OLp' "${1}" )" + fi + + # For special cases check the length and add a leading 0 + len="$(echo "${perm}" | awk '{ print length() }')" + if [ "${len}" = "3" ]; then + perm="0${perm}" + fi + + echo "${perm}" +} + + +#-------------------------------------------------------------------------------------------------- +# Check git +#-------------------------------------------------------------------------------------------------- +print_head_1 "Checking git" + +GIT_STATUS="$( git status -s )" +if [ -z "${GIT_STATUS}" ]; then + log_info "git is clean" +else + log_err "git is unclean" + echo "${GIT_STATUS}" + RET_CODE=$(( RET_CODE + 1)) +fi + + +#-------------------------------------------------------------------------------------------------- +# Check env file +#-------------------------------------------------------------------------------------------------- +print_head_1 "Checking .env file" + +if [ -f .env ]; then + log_ok ".env file exists" +else + log_err ".env file does not exist" + RET_CODE=$(( RET_CODE + 1)) +fi +if [ -r .env ]; then + log_ok ".env file is readable" +else + log_err ".env file is not readable" + RET_CODE=$(( RET_CODE + 1)) +fi + +# Ensure all variables exist in .env file +ENV_VAR_MISSING=0 +while read -r env_var; do + if ! grep -E "^${env_var}=" .env >/dev/null; then + log_err "Variable '${env_var}' missing in .env file" + RET_CODE=$(( RET_CODE + 1)) + ENV_VAR_MISSING=1 + fi +done < <(grep -E '^[A-Z].+=' env-example | awk -F'=' '{print $1}') +if [ "${ENV_VAR_MISSING}" = "0" ]; then + log_ok "All variables are present in .env file" +fi + +# Ensure variables are not duplicated in .env +ENV_VAR_DUPLICATED=0 +while read -r env_var; do + OCCURANCES="$( grep -Ec "^${env_var}=" .env )" + if [ "${OCCURANCES}" != "1" ]; then + log_err "Variable '${env_var}' should only be defined once. Occurances: ${OCCURANCES}" + RET_CODE=$(( RET_CODE + 1)) + ENV_VAR_DUPLICATED=1 + fi +done < <(grep -E '^[A-Z].+=' env-example | awk -F'=' '{print $1}') +if [ "${ENV_VAR_DUPLICATED}" = "0" ]; then + log_ok "No variables is duplicated in .env file" +fi + + +#-------------------------------------------------------------------------------------------------- +# Check env file values +#-------------------------------------------------------------------------------------------------- +print_head_1 "Checking .env file values" + +WRONG_ENV_FILES_VALUES=0 +DEBUG_COMPOSE_ENTRYPOINT="$( grep -E '^DEBUG_COMPOSE_ENTRYPOINT=' .env | awk -F'=' '{print $2}' )" +if [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "0" ] && [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "1" ] && [ "${DEBUG_COMPOSE_ENTRYPOINT}" != "2" ]; then + log_err "Variable 'DEBUG_COMPOSE_ENTRYPOINT' should be 0, 1 or 2. Has: ${DEBUG_COMPOSE_ENTRYPOINT}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi + +DOCKER_LOGS="$( grep -E '^DOCKER_LOGS=' .env | awk -F'=' '{print $2}' )" +if [ "${DOCKER_LOGS}" != "0" ] && [ "${DOCKER_LOGS}" != "1" ]; then + log_err "Variable 'DOCKER_LOGS' should be 0 or 1. Has: ${DOCKER_LOGS}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi + +DEVILBOX_PATH="$( grep -E '^DEVILBOX_PATH=' .env | awk -F'=' '{print $2}' )" +if [ ! -d "${DEVILBOX_PATH}" ]; then + log_err "Variable 'DEVILBOX_PATH' directory does not exist: ${DEVILBOX_PATH}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi +DEVILBOX_PATH_PERM="$( file_get_perm "${DEVILBOX_PATH}" )" +if [ "${DEVILBOX_PATH_PERM}" != "0755" ] && [ "${DEVILBOX_PATH_PERM}" != "0775" ] && [ "${DEVILBOX_PATH_PERM}" != "0777" ]; then + log_err "Variable 'DEVILBOX_PATH' directory must be 0755, 0775 or 0777. Has: ${DEVILBOX_PATH_PERM}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi +DEVILBOX_PATH_PERM="$( file_get_uid "${DEVILBOX_PATH}" )" +if [ "${DEVILBOX_PATH_PERM}" != "${MY_UID}" ]; then + log_err "Variable 'DEVILBOX_PATH' directory uid must be ${MY_UID}. Has: ${DEVILBOX_PATH_PERM}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi +DEVILBOX_PATH_PERM="$( file_get_gid "${DEVILBOX_PATH}" )" +if [ "${DEVILBOX_PATH_PERM}" != "${MY_GID}" ]; then + log_err "Variable 'DEVILBOX_PATH' directory gid must be ${MY_GID}. Has: ${DEVILBOX_PATH_PERM}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi + +if [ "${WRONG_ENV_FILES_VALUES}" = "0" ]; then + log_ok "All .env file variables have correct values" +fi + +HOST_PATH_HTTPD_DATADIR="$( grep -E '^HOST_PATH_HTTPD_DATADIR=' .env | awk -F'=' '{print $2}' )" +if [ ! -d "${HOST_PATH_HTTPD_DATADIR}" ]; then + log_err "Variable 'HOST_PATH_HTTPD_DATADIR' directory does not exist: ${HOST_PATH_HTTPD_DATADIR}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi +HOST_PATH_HTTPD_DATADIR_PERM="$( file_get_perm "${HOST_PATH_HTTPD_DATADIR}" )" +if [ "${HOST_PATH_HTTPD_DATADIR_PERM}" != "0755" ] && [ "${HOST_PATH_HTTPD_DATADIR_PERM}" != "0775" ] && [ "${HOST_PATH_HTTPD_DATADIR_PERM}" != "0777" ]; then + log_err "Variable 'HOST_PATH_HTTPD_DATADIR' directory must be 0755, 0775 or 0777. Has: ${HOST_PATH_HTTPD_DATADIR_PERM}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi +HOST_PATH_HTTPD_DATADIR_PERM="$( file_get_uid "${HOST_PATH_HTTPD_DATADIR}" )" +if [ "${HOST_PATH_HTTPD_DATADIR_PERM}" != "${MY_UID}" ]; then + log_err "Variable 'HOST_PATH_HTTPD_DATADIR' directory uid must be ${MY_UID}. Has: ${HOST_PATH_HTTPD_DATADIR_PERM}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi +HOST_PATH_HTTPD_DATADIR_PERM="$( file_get_gid "${HOST_PATH_HTTPD_DATADIR}" )" +if [ "${HOST_PATH_HTTPD_DATADIR_PERM}" != "${MY_GID}" ]; then + log_err "Variable 'HOST_PATH_HTTPD_DATADIR' directory gid must be ${MY_GID}. Has: ${HOST_PATH_HTTPD_DATADIR_PERM}" + RET_CODE=$(( RET_CODE + 1)) + WRONG_ENV_FILES_VALUES=1 +fi + +if [ "${WRONG_ENV_FILES_VALUES}" = "0" ]; then + log_ok "All .env file variables have correct values" +fi + + + +#-------------------------------------------------------------------------------------------------- +# Ensure cfg/, mod/ and log/ directories exist +#-------------------------------------------------------------------------------------------------- +print_head_1 "Checking required directories" + +# /cfg/php-fpm-VERSION +DIR_MISSING=0 +while read -r php_version; do + if [ ! -d "cfg/php-fpm-${php_version}" ]; then + log_err "Directory 'cfg/php-fpm-${php_version}' is missing" + RET_CODE=$(( RET_CODE + 1)) + DIR_MISSING=1 + fi +done < <(grep -E '^#?PHP_SERVER=' env-example | awk -F'=' '{print $2}') +if [ "${DIR_MISSING}" = "0" ]; then + log_ok "All PHP cfg/ sub directories are present" +fi + +# /log/php-fpm-VERSION +DIR_MISSING=0 +while read -r php_version; do + if [ ! -d "log/php-fpm-${php_version}" ]; then + log_err "Directory 'log/php-fpm-${php_version}' is missing" + RET_CODE=$(( RET_CODE + 1)) + DIR_MISSING=1 + fi +done < <(grep -E '^#?PHP_SERVER=' env-example | awk -F'=' '{print $2}') +if [ "${DIR_MISSING}" = "0" ]; then + log_ok "All PHP log/ sub directories are present" +fi + +# /mod/php-fpm-VERSION +DIR_MISSING=0 +while read -r php_version; do + if [ ! -d "mod/php-fpm-${php_version}" ]; then + log_err "Directory 'mod/php-fpm-${php_version}' is missing" + RET_CODE=$(( RET_CODE + 1)) + DIR_MISSING=1 + fi +done < <(grep -E '^#?PHP_SERVER=' env-example | awk -F'=' '{print $2}') +if [ "${DIR_MISSING}" = "0" ]; then + log_ok "All PHP mod/ sub directories are present" +fi + +# /cfg/apache|nginx-VERSION +DIR_MISSING=0 +while read -r httpd_version; do + if [ ! -d "cfg/${httpd_version}" ]; then + log_err "Directory 'cfg/${httpd_version}' is missing" + RET_CODE=$(( RET_CODE + 1)) + DIR_MISSING=1 + fi +done < <(grep -E '^#?HTTPD_SERVER=' env-example | awk -F'=' '{print $2}') +if [ "${DIR_MISSING}" = "0" ]; then + log_ok "All HTTPD cfg/ sub directories are present" +fi + +# /log/apache|nginx-VERSION +DIR_MISSING=0 +while read -r httpd_version; do + if [ ! -d "log/${httpd_version}" ]; then + log_err "Directory 'log/${httpd_version}' is missing" + RET_CODE=$(( RET_CODE + 1)) + DIR_MISSING=1 + fi +done < <(grep -E '^#?HTTPD_SERVER=' env-example | awk -F'=' '{print $2}') +if [ "${DIR_MISSING}" = "0" ]; then + log_ok "All HTTPD log/ sub directories are present" +fi + + +#-------------------------------------------------------------------------------------------------- +# Directory permissions +#-------------------------------------------------------------------------------------------------- +print_head_1 "Checking directory permissions" + +DEVILBOX_DIRS=( + "autostart" + "backups" + "bash" + "ca" + "cfg" + "compose" + "log" + "mod" +) + +# Check allowed directory permissions: 0755 0775 0777 +DEVILBOX_DIR_PERM_WRONG=0 +for search_dir in "${DEVILBOX_DIRS[@]}"; do + while read -r my_dir; do + PERM="$( file_get_perm "${my_dir}" )" + if [ "${PERM}" != "0755" ] && [ "${PERM}" != "0775" ] && [ "${PERM}" != "0777" ]; then + log_err "Directory '${my_dir}' should have 0755, 0775 or 0777 permissions. Has: ${PERM} permissions" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + done < <(find "${search_dir}" -type d) +done +if [ "${DEVILBOX_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All devilbox directories have correct permissions" +fi + +# Check allowed uid +DEVILBOX_DIR_PERM_WRONG=0 +for search_dir in "${DEVILBOX_DIRS[@]}"; do + while read -r my_dir; do + PERM="$( file_get_uid "${my_dir}" )" + if [ "${PERM}" != "${MY_UID}" ]; then + log_err "Directory '${my_dir}' should have uid '${MY_UID}' Has: '${PERM}'" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + done < <(find "${search_dir}" -type d) +done +if [ "${DEVILBOX_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All devilbox directories have correct uid" +fi + +# Check allowed gid +DEVILBOX_DIR_PERM_WRONG=0 +for search_dir in "${DEVILBOX_DIRS[@]}"; do + while read -r my_dir; do + PERM="$( file_get_gid "${my_dir}" )" + if [ "${PERM}" != "${MY_GID}" ]; then + log_err "Directory '${my_dir}' should have gid '${MY_GID}' Has: '${PERM}'" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + done < <(find "${search_dir}" -type d) +done +if [ "${DEVILBOX_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All devilbox directories have correct gid" +fi + + +#-------------------------------------------------------------------------------------------------- +# File permissions +#-------------------------------------------------------------------------------------------------- +print_head_1 "Checking file permissions" + +DEVILBOX_DIRS=( + "autostart" + "backups" + "ca" + "cfg" + "compose" + "mod" +) + +# Check allowed directory permissions: 0644 0664 0666 +DEVILBOX_DIR_PERM_WRONG=0 +for search_file in "${DEVILBOX_DIRS[@]}"; do + while read -r my_file; do + PERM="$( file_get_perm "${my_file}" )" + # Private CA file + if [ "${my_file}" = "ca/devilbox-ca.key" ]; then + if [ "${PERM}" != "0600" ]; then + log_err "File '${my_file}' should have 0600 permissions. Has: ${PERM} permissions" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + # Executable files + elif echo "${my_file}" | grep -E '.+\.sh(-example)?$' >/dev/null; then + if [ "${PERM}" != "0755" ] && [ "${PERM}" != "0775" ] && [ "${PERM}" != "0777" ]; then + log_err "File '${my_file}' should have 0755, 0775 or 0777 permissions. Has: ${PERM} permissions" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + # All other files + else + if [ "${PERM}" != "0644" ] && [ "${PERM}" != "0664" ] && [ "${PERM}" != "0666" ]; then + log_err "File '${my_file}' should have 0644, 0664 or 0666 permissions. Has: ${PERM} permissions" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + fi + done < <(find "${search_file}" -type f) +done +if [ "${DEVILBOX_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All devilbox files have correct permissions" +fi + +# Check allowed uid +DEVILBOX_DIR_PERM_WRONG=0 +for search_file in "${DEVILBOX_DIRS[@]}"; do + while read -r my_file; do + PERM="$( file_get_uid "${my_file}" )" + if [ "${PERM}" != "${MY_UID}" ]; then + log_err "File '${my_file}' should have uid '${MY_UID}' Has: '${PERM}'" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + done < <(find "${search_file}" -type f) +done +if [ "${DEVILBOX_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All devilbox files have correct uid" +fi + +# Check allowed gid +DEVILBOX_DIR_PERM_WRONG=0 +for search_file in "${DEVILBOX_DIRS[@]}"; do + while read -r my_file; do + PERM="$( file_get_gid "${my_file}" )" + if [ "${PERM}" != "${MY_GID}" ]; then + log_err "File '${my_file}' should have gid '${MY_GID}' Has: '${PERM}'" + RET_CODE=$(( RET_CODE + 1)) + DEVILBOX_DIR_PERM_WRONG=1 + fi + done < <(find "${search_file}" -type f) +done +if [ "${DEVILBOX_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All devilbox files have correct gid" +fi + + +#-------------------------------------------------------------------------------------------------- +# Check projects +#-------------------------------------------------------------------------------------------------- +print_head_1 "Checking projects" + +HOST_PATH_HTTPD_DATADIR="$( grep -E '^HOST_PATH_HTTPD_DATADIR=' .env | awk -F'=' '{print $2}' )" + +DATA_DIR_PERM_WRONG=0 +while read -r project; do + PERM="$( file_get_perm "${project}" )" + if [ "${PERM}" != "0755" ] && [ "${PERM}" != "0775" ] && [ "${PERM}" != "0777" ]; then + log_err "Directory '${project}' should have 0755, 0775 or 0777 permissions. Has: ${PERM} permissions" + RET_CODE=$(( RET_CODE + 1)) + DATA_DIR_PERM_WRONG=1 + fi +done < <(tree "${HOST_PATH_HTTPD_DATADIR}" -L 1 -d -f -i -n --noreport) +if [ "${DATA_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All project dirs have correct permissions" +fi + +DATA_DIR_PERM_WRONG=0 +while read -r project; do + PERM="$( file_get_uid "${project}" )" + if [ "${PERM}" != "${MY_UID}" ]; then + log_err "Directory '${project}' should have uid '${MY_UID}' Has: '${PERM}'" + RET_CODE=$(( RET_CODE + 1)) + DATA_DIR_PERM_WRONG=1 + fi +done < <(tree "${HOST_PATH_HTTPD_DATADIR}" -L 1 -d -f -i -n --noreport) +if [ "${DATA_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All project dirs have correct uid" +fi + +DATA_DIR_PERM_WRONG=0 +while read -r project; do + PERM="$( file_get_gid "${project}" )" + if [ "${PERM}" != "${MY_GID}" ]; then + log_err "Directory '${project}' should have gid '${MY_GID}' Has: '${PERM}'" + RET_CODE=$(( RET_CODE + 1)) + DATA_DIR_PERM_WRONG=1 + fi +done < <(tree "${HOST_PATH_HTTPD_DATADIR}" -L 1 -d -f -i -n --noreport) +if [ "${DATA_DIR_PERM_WRONG}" = "0" ]; then + log_ok "All project dirs have correct gid" +fi + + +#-------------------------------------------------------------------------------------------------- +# Summary +#-------------------------------------------------------------------------------------------------- +print_head_1 "SUMMARY" + +if [ "${RET_CODE}" -gt "0" ]; then + log_err "Found ${RET_CODE} error(s)" + log_err "Devilbox might not work properly" + log_err "Fix the errors before submitting a bug report" + exit 1 +else + log_ok "Found no errors" + exit 0 +fi diff --git a/docker-compose.yml b/docker-compose.yml index cc0563fb..2619091f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -375,9 +375,6 @@ services: # ---- Format: ---- # HOST-DIRECTORY : DOCKER-DIRECTORY - # Mount logs - - ${DEVILBOX_PATH}/log/pgsql-${PGSQL_SERVER}:/var/log/postgresql:rw${MOUNT_OPTIONS} - # Mount PostgreSQL Data directory - devilbox-pgsql-${PGSQL_SERVER}:/var/lib/postgresql/data/pgdata:rw${MOUNT_OPTIONS} @@ -428,13 +425,6 @@ services: app_net: ipv4_address: 172.16.238.15 - volumes: - # ---- Format: ---- - # HOST-DIRECTORY : DOCKER-DIRECTORY - - # Mount logs - - ${DEVILBOX_PATH}/log/memcd-${MEMCD_SERVER}:/var/log/memcd:rw${MOUNT_OPTIONS} - depends_on: - bind - php diff --git a/docs/support/troubleshooting.rst b/docs/support/troubleshooting.rst index 418bd5ac..60920c02 100644 --- a/docs/support/troubleshooting.rst +++ b/docs/support/troubleshooting.rst @@ -60,6 +60,14 @@ Before going into the issues below, always do the following host> docker-compose up php httpd bind +**4. Run config checker** + + .. code-block:: bash + + # Run the bash script in the Devilbox git directory + host> ./check-config.sh + + General ======= diff --git a/mod/php-fpm-5.2/.keepme b/mod/php-fpm-5.2/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/mod/php-fpm-5.3/.keepme b/mod/php-fpm-5.3/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/mod/php-fpm-7.3/.keepme b/mod/php-fpm-7.3/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/mod/php-fpm-7.4/.keepme b/mod/php-fpm-7.4/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/mod/php-fpm-8.0/.keepme b/mod/php-fpm-8.0/.keepme new file mode 100644 index 00000000..e69de29b diff --git a/mod/php-fpm-8.1/.keepme b/mod/php-fpm-8.1/.keepme new file mode 100644 index 00000000..e69de29b