2
0
mirror of https://github.com/frappe/frappe_docker.git synced 2024-11-09 23:00:56 +00:00

Merge pull request #492 from pratikbalar/patch-1

refactor: style as per google style guide (tried)
This commit is contained in:
Revant Nandgaonkar 2021-06-24 19:23:51 +05:30 committed by GitHub
commit b670b4a9d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 664 additions and 697 deletions

View File

@ -156,8 +156,9 @@ jobs:
- sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- sudo chmod +x /usr/local/bin/docker-compose - sudo chmod +x /usr/local/bin/docker-compose
- sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose - sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- sudo apt-get update && sudo apt-get -y install w3m - sudo apt-get update && sudo apt-get -y install w3m shellcheck
script: script:
- ./tests/check-format.sh
- docker build -t frappe/frappe-socketio:edge -f build/frappe-socketio/Dockerfile . - docker build -t frappe/frappe-socketio:edge -f build/frappe-socketio/Dockerfile .
- docker build -t frappe/frappe-worker:develop -f build/frappe-worker/Dockerfile . - docker build -t frappe/frappe-worker:develop -f build/frappe-worker/Dockerfile .
- docker build -t frappe/erpnext-worker:edge -f build/erpnext-worker/Dockerfile . - docker build -t frappe/erpnext-worker:edge -f build/erpnext-worker/Dockerfile .

View File

@ -36,3 +36,33 @@ Place relevant markdown file(s) in the `docs` directory and index them in README
# Wiki # Wiki
Add alternatives that can be used optionally along with frappe_docker. Add articles to list on home page as well. Add alternatives that can be used optionally along with frappe_docker. Add articles to list on home page as well.
# Prerequisites to pass CI
### Check shell script format
Use the following script
```shell
./tests/check-format.sh
```
### Build images locally
Use the following commands
```shell
docker build -t frappe/frappe-socketio:edge -f build/frappe-socketio/Dockerfile .
docker build -t frappe/frappe-worker:develop -f build/frappe-worker/Dockerfile .
docker build -t frappe/erpnext-worker:edge -f build/erpnext-worker/Dockerfile .
docker build -t frappe/frappe-nginx:develop -f build/frappe-nginx/Dockerfile .
docker build -t frappe/erpnext-nginx:edge -f build/erpnext-nginx/Dockerfile .
```
### Test running docker containers
Use the following script
```shell
./tests/docker-test.sh
```

View File

@ -1,36 +1,34 @@
#!/bin/bash #!/bin/bash
function configureEnv() { function configureEnv() {
if [ ! -f /home/frappe/frappe-bench/sites/common_site_config.json ]; then if [[ ! -f /home/frappe/frappe-bench/sites/common_site_config.json ]]; then
if [[ -z "$MARIADB_HOST" ]]; then if [[ -z "${MARIADB_HOST}" && -z "${POSTGRES_HOST}" ]]; then
if [[ -z "$POSTGRES_HOST" ]]; then echo "MARIADB_HOST or POSTGRES_HOST is not set" >&2
echo "MARIADB_HOST or POSTGRES_HOST is not set"
exit 1
fi
fi
if [[ -z "$REDIS_CACHE" ]]; then
echo "REDIS_CACHE is not set"
exit 1 exit 1
fi fi
if [[ -z "$REDIS_QUEUE" ]]; then if [[ -z "${REDIS_CACHE}" ]]; then
echo "REDIS_QUEUE is not set" echo "REDIS_CACHE is not set" >&2
exit 1 exit 1
fi fi
if [[ -z "$REDIS_SOCKETIO" ]]; then if [[ -z "${REDIS_QUEUE}" ]]; then
echo "REDIS_SOCKETIO is not set" echo "REDIS_QUEUE is not set" >&2
exit 1 exit 1
fi fi
if [[ -z "$SOCKETIO_PORT" ]]; then if [[ -z "${REDIS_SOCKETIO}" ]]; then
echo "SOCKETIO_PORT is not set" echo "REDIS_SOCKETIO is not set" >&2
exit 1 exit 1
fi fi
if [[ -z "$DB_PORT" ]]; then if [[ -z "${SOCKETIO_PORT}" ]]; then
echo "SOCKETIO_PORT is not set" >&2
exit 1
fi
if [[ -z "${DB_PORT}" ]]; then
export DB_PORT=3306 export DB_PORT=3306
fi fi
@ -41,147 +39,135 @@ function configureEnv() {
${REDIS_CACHE} ${REDIS_CACHE}
${REDIS_QUEUE} ${REDIS_QUEUE}
${REDIS_SOCKETIO} ${REDIS_SOCKETIO}
${SOCKETIO_PORT}' < /opt/frappe/common_site_config.json.template > /home/frappe/frappe-bench/sites/common_site_config.json ${SOCKETIO_PORT}' </opt/frappe/common_site_config.json.template >/home/frappe/frappe-bench/sites/common_site_config.json
fi fi
} }
function checkConnection() { function checkConnection() {
. /home/frappe/frappe-bench/env/bin/activate \ /home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/check_connection.py
&& python /home/frappe/frappe-bench/commands/check_connection.py
} }
function checkConfigExists() { function checkConfigExists() {
COUNTER=0 COUNTER=0
while [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json ]] && [[ $COUNTER -le 30 ]] ; do while [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json && ${COUNTER} -le 30 ]]; do
sleep 1 sleep 1
(( COUNTER=COUNTER+1 )) ((COUNTER = COUNTER + 1))
echo "config file not created, retry $COUNTER" echo "config file not created, retry ${COUNTER}" >&2
done done
if [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json ]]; then if [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json ]]; then
echo "timeout: config file not created" echo "timeout: config file not created" >&2
exit 1 exit 1
fi fi
} }
if [[ ! -e /home/frappe/frappe-bench/sites/apps.txt ]]; then if [[ ! -e /home/frappe/frappe-bench/sites/apps.txt ]]; then
find /home/frappe/frappe-bench/apps -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort -r > /home/frappe/frappe-bench/sites/apps.txt find /home/frappe/frappe-bench/apps -mindepth 1 -maxdepth 1 -type d -printf '%f\n' |
sort -r >/home/frappe/frappe-bench/sites/apps.txt
fi fi
# symlink node_modules # symlink node_modules
ln -sfn /home/frappe/frappe-bench/sites/assets/frappe/node_modules \ ln -sfn /home/frappe/frappe-bench/sites/assets/frappe/node_modules \
/home/frappe/frappe-bench/apps/frappe/node_modules /home/frappe/frappe-bench/apps/frappe/node_modules
if [ "$1" = 'start' ]; then case "$1" in
start)
configureEnv configureEnv
checkConnection checkConnection
if [[ -z "$WORKERS" ]]; then [[ -z "${WORKERS}" ]] && WORKERS='2'
export WORKERS=2
[[ -z "${FRAPPE_PORT}" ]] && FRAPPE_PORT='8000'
[[ -z "${WORKER_CLASS}" ]] && WORKER_CLASS='gthread'
LOAD_CONFIG_FILE=""
[[ "${WORKER_CLASS}" == "gevent" ]] &&
LOAD_CONFIG_FILE="-c /home/frappe/frappe-bench/commands/gevent_patch.py"
if [[ -n "${AUTO_MIGRATE}" ]]; then
/home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/auto_migrate.py
fi fi
if [[ -z "$FRAPPE_PORT" ]]; then /home/frappe/frappe-bench/env/bin/gunicorn ${LOAD_CONFIG_FILE} -b 0.0.0.0:${FRAPPE_PORT} \
export FRAPPE_PORT=8000
fi
if [[ -z "$WORKER_CLASS" ]]; then
export WORKER_CLASS=gthread
fi
export LOAD_CONFIG_FILE=""
if [ "$WORKER_CLASS" = "gevent" ]; then
export LOAD_CONFIG_FILE="-c /home/frappe/frappe-bench/commands/gevent_patch.py"
fi
if [[ ! -z "$AUTO_MIGRATE" ]]; then
. /home/frappe/frappe-bench/env/bin/activate \
&& python /home/frappe/frappe-bench/commands/auto_migrate.py
fi
. /home/frappe/frappe-bench/env/bin/activate
gunicorn $LOAD_CONFIG_FILE -b 0.0.0.0:$FRAPPE_PORT \
--worker-tmp-dir /dev/shm \ --worker-tmp-dir /dev/shm \
--threads=4 \ --threads=4 \
--workers $WORKERS \ --workers ${WORKERS} \
--worker-class=$WORKER_CLASS \ --worker-class=${WORKER_CLASS} \
--log-file=- \ --log-file=- \
-t 120 frappe.app:application --preload -t 120 frappe.app:application --preload
;;
elif [ "$1" = 'worker' ]; then worker)
checkConfigExists checkConfigExists
checkConnection checkConnection
# default WORKER_TYPE=default # default WORKER_TYPE=default
. /home/frappe/frappe-bench/env/bin/activate /home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/worker.py
python /home/frappe/frappe-bench/commands/worker.py ;;
elif [ "$1" = 'schedule' ]; then schedule)
checkConfigExists checkConfigExists
checkConnection checkConnection
. /home/frappe/frappe-bench/env/bin/activate /home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/background.py
python /home/frappe/frappe-bench/commands/background.py
elif [ "$1" = 'new' ]; then ;;
new)
checkConfigExists checkConfigExists
checkConnection checkConnection
. /home/frappe/frappe-bench/env/bin/activate /home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/new.py
python /home/frappe/frappe-bench/commands/new.py
exit exit
;;
elif [ "$1" = 'drop' ]; then drop)
checkConfigExists checkConfigExists
checkConnection checkConnection
. /home/frappe/frappe-bench/env/bin/activate /home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/drop.py
python /home/frappe/frappe-bench/commands/drop.py
exit exit
;;
elif [ "$1" = 'migrate' ]; then migrate)
/home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/migrate.py
. /home/frappe/frappe-bench/env/bin/activate \
&& python /home/frappe/frappe-bench/commands/migrate.py
exit exit
;;
elif [ "$1" = 'doctor' ]; then doctor)
/home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/doctor.py "${@:2}"
. /home/frappe/frappe-bench/env/bin/activate \
&& python /home/frappe/frappe-bench/commands/doctor.py ${@:2}
exit exit
;;
elif [ "$1" = 'backup' ]; then backup)
. /home/frappe/frappe-bench/env/bin/activate /home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/backup.py
python /home/frappe/frappe-bench/commands/backup.py
exit exit
;;
elif [ "$1" = 'console' ]; then console)
if [[ -z "$2" ]]; then if [[ -z "$2" ]]; then
echo "Need to specify a sitename with the command:" echo "Need to specify a sitename with the command:" >&2
echo "console <sitename>" echo "console <sitename>" >&2
exit 1 exit 1
fi fi
. /home/frappe/frappe-bench/env/bin/activate /home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/console.py "$2"
python /home/frappe/frappe-bench/commands/console.py "$2"
exit exit
;;
elif [ "$1" = 'push-backup' ]; then push-backup)
/home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/push_backup.py
. /home/frappe/frappe-bench/env/bin/activate \
&& python /home/frappe/frappe-bench/commands/push_backup.py
exit exit
;;
elif [ "$1" = 'restore-backup' ]; then restore-backup)
/home/frappe/frappe-bench/env/bin/python /home/frappe/frappe-bench/commands/restore_backup.py
. /home/frappe/frappe-bench/env/bin/activate \
&& python /home/frappe/frappe-bench/commands/restore_backup.py
exit exit
;;
else *)
exec "$@"
exec $@ ;;
esac
fi

View File

@ -2,44 +2,44 @@
set -ea set -ea
function getUrl() { function getUrl() {
cat ${1} | grep $2 | awk -v word=$2 '$word { gsub(/[",]/,"",$2); print $2}' | tr -d '\n' grep "$2" "$1" | awk -v word="$2" '$word { gsub(/[",]/,"",$2); print $2}' | tr -d '\n'
} }
COMMON_SITE_CONFIG_JSON='/home/frappe/frappe-bench/sites/common_site_config.json' COMMON_SITE_CONFIG_JSON='/home/frappe/frappe-bench/sites/common_site_config.json'
# Set DB Host and port # Set DB Host and port
DB_HOST=$(getUrl "$COMMON_SITE_CONFIG_JSON" "db_host") DB_HOST=$(getUrl "${COMMON_SITE_CONFIG_JSON}" "db_host")
DB_PORT=$(getUrl "$COMMON_SITE_CONFIG_JSON" "db_port") DB_PORT=$(getUrl "${COMMON_SITE_CONFIG_JSON}" "db_port")
if [[ -z "$DB_PORT" ]]; then if [[ -z "${DB_PORT}" ]]; then
DB_PORT=3306 DB_PORT=3306
fi fi
# Set REDIS host:port # Set REDIS host:port
REDIS_CACHE=$(getUrl "$COMMON_SITE_CONFIG_JSON" "redis_cache" | sed 's|redis://||g') REDIS_CACHE=$(getUrl "${COMMON_SITE_CONFIG_JSON}" "redis_cache" | sed 's|redis://||g')
if [[ "$REDIS_CACHE" == *"/"* ]]; then if [[ "${REDIS_CACHE}" == *"/"* ]]; then
REDIS_CACHE=$(echo $REDIS_CACHE | cut -f1 -d"/") REDIS_CACHE=$(echo ${REDIS_CACHE} | cut -f1 -d"/")
fi fi
REDIS_QUEUE=$(getUrl "$COMMON_SITE_CONFIG_JSON" "redis_queue" | sed 's|redis://||g') REDIS_QUEUE=$(getUrl "${COMMON_SITE_CONFIG_JSON}" "redis_queue" | sed 's|redis://||g')
if [[ "$REDIS_QUEUE" == *"/"* ]]; then if [[ "${REDIS_QUEUE}" == *"/"* ]]; then
REDIS_QUEUE=$(echo $REDIS_QUEUE | cut -f1 -d"/") REDIS_QUEUE=$(echo ${REDIS_QUEUE} | cut -f1 -d"/")
fi fi
REDIS_SOCKETIO=$(getUrl "$COMMON_SITE_CONFIG_JSON" "redis_socketio" | sed 's|redis://||g') REDIS_SOCKETIO=$(getUrl "${COMMON_SITE_CONFIG_JSON}" "redis_socketio" | sed 's|redis://||g')
if [[ "$REDIS_SOCKETIO" == *"/"* ]]; then if [[ "${REDIS_SOCKETIO}" == *"/"* ]]; then
REDIS_SOCKETIO=$(echo $REDIS_SOCKETIO | cut -f1 -d"/") REDIS_SOCKETIO=$(echo ${REDIS_SOCKETIO} | cut -f1 -d"/")
fi fi
echo "Check $DB_HOST:$DB_PORT" echo "Check ${DB_HOST}:${DB_PORT}"
wait-for-it "$DB_HOST:$DB_PORT" -t 1 wait-for-it "${DB_HOST}:${DB_PORT}" -t 1
echo "Check $REDIS_CACHE" echo "Check ${REDIS_CACHE}"
wait-for-it "$REDIS_CACHE" -t 1 wait-for-it "${REDIS_CACHE}" -t 1
echo "Check $REDIS_QUEUE" echo "Check ${REDIS_QUEUE}"
wait-for-it "$REDIS_QUEUE" -t 1 wait-for-it "${REDIS_QUEUE}" -t 1
echo "Check $REDIS_SOCKETIO" echo "Check ${REDIS_SOCKETIO}"
wait-for-it "$REDIS_SOCKETIO" -t 1 wait-for-it "${REDIS_SOCKETIO}" -t 1
if [[ "$1" = "-p" ]] || [[ "$1" = "--ping-service" ]]; then if [[ "$1" = "-p" || "$1" = "--ping-service" ]]; then
echo "Check $2" echo "Check $2"
wait-for-it "$2" -t 1 wait-for-it "$2" -t 1
fi fi

View File

@ -1,16 +1,10 @@
#!/bin/bash #!/bin/bash -ex
APP_NAME=${1} APP_NAME=${1}
APP_REPO=${2} APP_REPO=${2}
APP_BRANCH=${3} APP_BRANCH=${3}
cd /home/frappe/frappe-bench/ [[ -n "${APP_BRANCH}" ]] && BRANCH="-b ${APP_BRANCH}"
. env/bin/activate git clone --depth 1 -o upstream ${APP_REPO} ${BRANCH} /home/frappe/frappe-bench/apps/${APP_NAME}
/home/frappe/frappe-bench/env/bin/pip3 install --no-cache-dir -e /home/frappe/frappe-bench/apps/${APP_NAME}
cd ./apps
[ "${APP_BRANCH}" ] && BRANCH="-b ${APP_BRANCH}"
git clone --depth 1 -o upstream ${APP_REPO} ${BRANCH} ${APP_NAME}
pip3 install --no-cache-dir -e /home/frappe/frappe-bench/apps/${APP_NAME}

View File

@ -9,7 +9,7 @@ FRAPPE_BRANCH=${4}
mkdir -p /home/frappe/frappe-bench/sites/assets mkdir -p /home/frappe/frappe-bench/sites/assets
cd /home/frappe/frappe-bench cd /home/frappe/frappe-bench
echo -e "frappe\n${APP_NAME}" > /home/frappe/frappe-bench/sites/apps.txt echo -ne "frappe\n${APP_NAME}" >/home/frappe/frappe-bench/sites/apps.txt
mkdir -p apps mkdir -p apps
cd apps cd apps
@ -36,8 +36,8 @@ mkdir -p /home/frappe/frappe-bench/sites/assets/${APP_NAME}
cp -R /home/frappe/frappe-bench/apps/${APP_NAME}/${APP_NAME}/public/* /home/frappe/frappe-bench/sites/assets/${APP_NAME} cp -R /home/frappe/frappe-bench/apps/${APP_NAME}/${APP_NAME}/public/* /home/frappe/frappe-bench/sites/assets/${APP_NAME}
# Add frappe and all the apps available under in frappe-bench here # Add frappe and all the apps available under in frappe-bench here
echo "rsync -a --delete /var/www/html/assets/frappe /assets" > /rsync echo "rsync -a --delete /var/www/html/assets/frappe /assets" >/rsync
echo "rsync -a --delete /var/www/html/assets/${APP_NAME} /assets" >> /rsync echo "rsync -a --delete /var/www/html/assets/${APP_NAME} /assets" >>/rsync
chmod +x /rsync chmod +x /rsync
rm /home/frappe/frappe-bench/sites/apps.txt rm /home/frappe/frappe-bench/sites/apps.txt

View File

@ -1,63 +1,38 @@
#!/bin/bash #!/bin/bash -ae
## Thanks ## Thanks
# https://serverfault.com/a/919212 # https://serverfault.com/a/919212
## ##
set -e
rsync -a --delete /var/www/html/assets/* /assets rsync -a --delete /var/www/html/assets/* /assets
. /rsync /rsync
touch /var/www/html/sites/.build -r $(ls -td /assets/* | head -n 1) touch /var/www/html/sites/.build -r "$(ls -td /assets/* | head -n 1)"
if [[ -z "$FRAPPE_PY" ]]; then [[ -z "${FRAPPE_PY}" ]] && FRAPPE_PY='0.0.0.0'
export FRAPPE_PY=0.0.0.0
fi
if [[ -z "$FRAPPE_PY_PORT" ]]; then [[ -z "${FRAPPE_PY_PORT}" ]] && FRAPPE_PY_PORT='8000'
export FRAPPE_PY_PORT=8000
fi
if [[ -z "$FRAPPE_SOCKETIO" ]]; then [[ -z "${FRAPPE_SOCKETIO}" ]] && FRAPPE_SOCKETIO='0.0.0.0'
export FRAPPE_SOCKETIO=0.0.0.0
fi
if [[ -z "$SOCKETIO_PORT" ]]; then [[ -z "${SOCKETIO_PORT}" ]] && SOCKETIO_PORT='9000'
export SOCKETIO_PORT=9000
fi
if [[ -z "$HTTP_TIMEOUT" ]]; then [[ -z "${HTTP_TIMEOUT}" ]] && HTTP_TIMEOUT='120'
export HTTP_TIMEOUT=120
fi
if [[ -z "$UPSTREAM_REAL_IP_ADDRESS" ]]; then [[ -z "${UPSTREAM_REAL_IP_ADDRESS}" ]] && UPSTREAM_REAL_IP_ADDRESS='127.0.0.1'
export UPSTREAM_REAL_IP_ADDRESS=127.0.0.1
fi
if [[ -z "$UPSTREAM_REAL_IP_RECURSIVE" ]]; then [[ -z "${UPSTREAM_REAL_IP_RECURSIVE}" ]] && UPSTREAM_REAL_IP_RECURSIVE='off'
export UPSTREAM_REAL_IP_RECURSIVE=off
fi
if [[ -z "$UPSTREAM_REAL_IP_HEADER" ]]; then [[ -z "${UPSTREAM_REAL_IP_HEADER}" ]] && UPSTREAM_REAL_IP_HEADER='X-Forwarded-For'
export UPSTREAM_REAL_IP_HEADER="X-Forwarded-For"
fi
if [[ -z "$FRAPPE_SITE_NAME_HEADER" ]]; then [[ -z "${FRAPPE_SITE_NAME_HEADER}" ]] && FRAPPE_SITE_NAME_HEADER="\$host"
export FRAPPE_SITE_NAME_HEADER="\$host"
fi
if [[ -z "$HTTP_HOST" ]]; then [[ -z "${HTTP_HOST}" ]] && HTTP_HOST="\$http_host"
export HTTP_HOST="\$http_host"
fi
if [[ -z "$SKIP_NGINX_TEMPLATE_GENERATION" ]]; then [[ -z "${SKIP_NGINX_TEMPLATE_GENERATION}" ]] && SKIP_NGINX_TEMPLATE_GENERATION='0'
export SKIP_NGINX_TEMPLATE_GENERATION=0
fi
if [[ $SKIP_NGINX_TEMPLATE_GENERATION -eq 1 ]] if [[ ${SKIP_NGINX_TEMPLATE_GENERATION} == 1 ]]; then
then
echo "Skipping default NGINX template generation. Please mount your own NGINX config file inside /etc/nginx/conf.d" echo "Skipping default NGINX template generation. Please mount your own NGINX config file inside /etc/nginx/conf.d"
else else
echo "Generating default template" echo "Generating default template"
@ -71,14 +46,14 @@ else
${FRAPPE_SITE_NAME_HEADER} ${FRAPPE_SITE_NAME_HEADER}
${HTTP_HOST} ${HTTP_HOST}
${UPSTREAM_REAL_IP_HEADER}' \ ${UPSTREAM_REAL_IP_HEADER}' \
< /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf </etc/nginx/conf.d/default.conf.template >/etc/nginx/conf.d/default.conf
fi fi
echo "Waiting for frappe-python to be available on $FRAPPE_PY port $FRAPPE_PY_PORT" echo "Waiting for frappe-python to be available on ${FRAPPE_PY} port ${FRAPPE_PY_PORT}"
timeout 10 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; done' $FRAPPE_PY $FRAPPE_PY_PORT timeout 10 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; done' ${FRAPPE_PY} ${FRAPPE_PY_PORT}
echo "Frappe-python available on $FRAPPE_PY port $FRAPPE_PY_PORT" echo "Frappe-python available on ${FRAPPE_PY} port ${FRAPPE_PY_PORT}"
echo "Waiting for frappe-socketio to be available on $FRAPPE_SOCKETIO port $SOCKETIO_PORT" echo "Waiting for frappe-socketio to be available on ${FRAPPE_SOCKETIO} port ${SOCKETIO_PORT}"
timeout 10 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; done' $FRAPPE_SOCKETIO $SOCKETIO_PORT timeout 10 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; done' ${FRAPPE_SOCKETIO} ${SOCKETIO_PORT}
echo "Frappe-socketio available on $FRAPPE_SOCKETIO port $SOCKETIO_PORT" echo "Frappe-socketio available on ${FRAPPE_SOCKETIO} port ${SOCKETIO_PORT}"
exec "$@" exec "$@"

View File

@ -1,11 +1,11 @@
#!/bin/bash #!/bin/bash -e
function checkConfigExists() { function checkConfigExists() {
COUNTER=0 COUNTER=0
while [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json ]] && [[ $COUNTER -le 30 ]] ; do while [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json && ${COUNTER} -le 30 ]]; do
((COUNTER = COUNTER + 1))
echo "config file not created, retry ${COUNTER}"
sleep 1 sleep 1
let COUNTER=COUNTER+1
echo "config file not created, retry $COUNTER"
done done
if [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json ]]; then if [[ ! -e /home/frappe/frappe-bench/sites/common_site_config.json ]]; then
@ -14,16 +14,14 @@ function checkConfigExists() {
fi fi
} }
if [ "$1" = 'start' ]; then if [[ "$1" == 'start' ]]; then
checkConfigExists checkConfigExists
node /home/frappe/frappe-bench/apps/frappe/socketio.js node /home/frappe/frappe-bench/apps/frappe/socketio.js
elif [ "$1" = 'doctor' ]; then elif [[ "$1" == 'doctor' ]]; then
node /home/frappe/frappe-bench/apps/frappe/health.js node /home/frappe/frappe-bench/apps/frappe/health.js
else else
exec -c "$@" exec -c "$@"
fi fi

View File

@ -3,8 +3,7 @@
set -euo pipefail set -euo pipefail
IFS=$'\n\t' IFS=$'\n\t'
[ -z "$DEBUG" ] & [ "${DEBUG}" == 1 ] && set -o xtrace [[ -z "${DEBUG}" && "${DEBUG}" == 1 ]] && set -o xtrace
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$__dir" cd "$__dir"
@ -14,49 +13,50 @@ docker_nginx_url="https://github.com/evertramos/docker-compose-letsencrypt-nginx
frappe_docker_url="https://github.com/frappe/frappe_docker" frappe_docker_url="https://github.com/frappe/frappe_docker"
env_file="$__dir/.env" env_file="$__dir/.env"
function check_root() {
check_root() { if [[ $EUID != 0 ]]; then
if [[ $EUID -ne 0 ]]; then echo "This script must be run as root. Login as root or use sudo." >&2
echo "This script must be run as root. Login as root or use sudo." 1>&2
exit 1 exit 1
fi fi
} }
check_git() { function check_git() {
if [ ! -x "$(command -v git)" ]; then if [[ ! -x "$(command -v git)" ]]; then
echo "Git is not installed. Please install git before continuing." echo "Git is not installed. Please install git before continuing." >&2
exit 1 exit 1
fi fi
} }
check_docker() { function check_docker() {
if [ ! -x "$(command -v docker)" ]; then if [[ ! -x "$(command -v docker)" ]]; then
read -rp "No docker installation found. Press Enter to install docker or ctrl+c to exit." read -rp "No docker installation found. Press Enter to install docker or ctrl+c to exit." >&2
curl -fsSL https://get.docker.com | sh curl -fsSL https://get.docker.com | sh
fi fi
if [ ! -x "$(command -v docker)" ]; then if [[ ! -x "$(command -v docker)" ]]; then
echo "Docker installation failed. Exiting." echo "Docker installation failed. Exiting." >&2
exit 1 exit 1
fi fi
} }
check_env() { function check_env() {
if [ ! -f "$env_file" ]; then if [[ ! -f "$env_file" ]]; then
echo "No environment file found. This file is required for setting up Frappe/ERPNext Docker." cat <<CHOOSE >&2
echo "Would you like to fetch the default environment file?" No environment file found. This file is required for setting up Frappe/ERPNext Docker.
echo "(NOTE: You will be prompted to set it up later)" Would you like to fetch the default environment file?
(NOTE: You will be prompted to set it up later)
CHOOSE
read -rp "Press Enter to fetch the configuration file, or create a .env file and re-run the script." read -rp "Press Enter to fetch the configuration file, or create a .env file and re-run the script."
curl -fsSL "$env_url" -o "$env_file" curl -fsSL "$env_url" -o "$env_file"
fi fi
} }
clone_repository() { function clone_repository() {
echo "Cloning Repository: $1" echo "Cloning Repository: $1"
git clone "$2" git clone "$2"
} }
get_config() { function get_config() {
if [ -n "$2" ]; then if [[ -n "$2" ]]; then
config_file="$2" config_file="$2"
else else
config_file="$env_file" config_file="$env_file"
@ -65,22 +65,24 @@ get_config() {
line_result=$(echo "$line" | awk -F"=" '{print $2}') line_result=$(echo "$line" | awk -F"=" '{print $2}')
} }
get_install_version() { function get_install_version() {
echo "Choose a version you would like to setup [current: $1]:" cat <<CHOOSE >&2
echo "1. develop (edge)" Choose a version you would like to setup [current: $1]:
echo "2. version-12" 1. develop (edge)
echo "3. version-11" 2. version-12
echo "Please enter your choice [1-3]: " 3. version-11
Please enter your choice [1-3]:
CHOOSE
select choice in "1" "2" "3"; do select choice in "1" "2" "3"; do
case $choice in case ${choice} in
1 ) version="edge" ;; 1) version="edge" ;;
2 ) version="version-12" ;; 2) version="version-12" ;;
3 ) version="version-11" ;; 3) version="version-11" ;;
esac esac
done done
} }
prompt_config() { function prompt_config() {
# inspired by discourse_docker # inspired by discourse_docker
get_config "VERSION" get_config "VERSION"
local install_version=$line_result local install_version=$line_result
@ -95,20 +97,26 @@ prompt_config() {
echo "This is required if you wish to access the instance from other machines." echo "This is required if you wish to access the instance from other machines."
select choice in "y" "n"; do select choice in "y" "n"; do
case $choice in case $choice in
y ) setup_networking=1 ;; y) setup_networking=1 ;;
n ) setup_networking=0 n)
setup_letsencrypt=0 ;; setup_networking=0
setup_letsencrypt=0
;;
esac esac
done done
if [ -n "$letsencrypt_email" ] & [ "$setup_networking" -ne "0" ]; then if [[ -n "$letsencrypt_email" && "$setup_networking" -ne "0" ]]; then
echo "Would you like to setup LetsEncrypt? [y/n]" echo "Would you like to setup LetsEncrypt? [y/n]"
select choice in "y" "n"; do select choice in "y" "n"; do
case $choice in case $choice in
y ) setup_letsencrypt=1 y)
setup_letsencrypt=1
echo "Please ensure that all the required domains point to this IP address." echo "Please ensure that all the required domains point to this IP address."
read -rp "Enter an Email Address to setup LetsEncrypt with: " letsencrypt_email ;; read -rp "Enter an Email Address to setup LetsEncrypt with: " letsencrypt_email
n ) setup_letsencrypt=0 ;;
echo "Skipping LetsEncrypt Setup." ;; n)
setup_letsencrypt=0
echo "Skipping LetsEncrypt Setup."
;;
esac esac
done done
fi fi
@ -121,34 +129,34 @@ prompt_config() {
get_install_version "$install_version" get_install_version "$install_version"
install_version="$version" install_version="$version"
while [ "$config_state" = "n" ]; do while [[ "$config_state" == "n" ]]; do
if [ -n "$mysql_password" ]; then if [[ -n "$mysql_password" ]]; then
read -srp "Enter MySQL Password [$mysql_password]: " new_value read -srp "Enter MySQL Password [$mysql_password]: " new_value
if [ -n "$new_value" ]; then if [[ -n "$new_value" ]]; then
mysql_password="$new_value" mysql_password="$new_value"
fi fi
fi fi
if [ -n "$sites" ]; then if [[ -n "$sites" ]]; then
read -rp "Enter sitename to setup [$sites]: " new_value read -rp "Enter sitename to setup [$sites]: " new_value
if [ -n "$new_value" ]; then if [[ -n "$new_value" ]]; then
sites="$new_value" sites="$new_value"
fi fi
fi fi
if [ "$setup_letsencrypt" -ne "0" ]; then if [[ "$setup_letsencrypt" != "0" ]]; then
read -rp "Enter email address for LetsEncrypt [$letsencrypt_email]: " new_value read -rp "Enter email address for LetsEncrypt [$letsencrypt_email]: " new_value
if [ -n "$new_value" ]; then if [[ -n "$new_value" ]]; then
letsencrypt_email=$new_value letsencrypt_email=$new_value
fi fi
fi fi
echo "Current Configuration:" echo "Current Configuration:"
echo "Version: $([ "$install_version" = "edge" ] && echo "develop" || echo "$install_version")" echo "Version: $([[ "$install_version" == "edge" ]] && echo "develop" || echo "$install_version")"
echo "MySQL Root Password: $mysql_password" echo "MySQL Root Password: $mysql_password"
echo "Sites: $sites" echo "Sites: $sites"
if [ "$setup_letsencrypt" -ne "0" ]; then if [[ "$setup_letsencrypt" != "0" ]]; then
echo "LetsEncrypt Email Address: $letsencrypt_email" echo "LetsEncrypt Email Address: $letsencrypt_email"
fi fi
@ -159,7 +167,7 @@ prompt_config() {
echo "Saving the current configuration file to $env_file" echo "Saving the current configuration file to $env_file"
cat << EOF > "$env_file" cat <<EOF >"$env_file"
VERSION=$install_version VERSION=$install_version
MYSQL_ROOT_PASSWORD=$mysql_password MYSQL_ROOT_PASSWORD=$mysql_password
SITES=$sites SITES=$sites
@ -172,7 +180,7 @@ setup_user() {
echo "The rest of the setup requires a user account." echo "The rest of the setup requires a user account."
echo "You may use an existing account, or set up a new one right away." echo "You may use an existing account, or set up a new one right away."
read -rp "Enter username: " username read -rp "Enter username: " username
if grep -E "^$username" /etc/passwd > /dev/null; then if grep -E "^$username" /etc/passwd >/dev/null; then
echo "User $username already exists." echo "User $username already exists."
else else
read -rsp "Enter password: " password read -rsp "Enter password: " password
@ -186,7 +194,7 @@ setup_user() {
fi fi
fi fi
if ! getent group docker > /dev/null 2>&1 ; then if ! getent group docker >/dev/null 2>&1; then
echo "Creating group: docker" echo "Creating group: docker"
groupadd docker groupadd docker
fi fi
@ -196,24 +204,24 @@ setup_user() {
} }
install() { install() {
if [ "$setup_letsencrypt" -ne "0" ] & [ "$setup_networking" -ne "0" ]; then if [[ "$setup_letsencrypt" != "0" && "$setup_networking" != "0" ]]; then
echo "Setting up NGINX Proxy for LetsEncrypt" echo "Setting up NGINX Proxy for LetsEncrypt"
clone_repository "Docker Compose LetsEncrypt NGINX Proxy Companion" "$docker_nginx_url" clone_repository "Docker Compose LetsEncrypt NGINX Proxy Companion" "$docker_nginx_url"
cd "$(basename "$docker_nginx_url")" cd "$(basename "$docker_nginx_url")"
if [ -f .env.sample ]; then if [[ -f .env.sample ]]; then
cp .env.sample env cp .env.sample env
fi fi
./start.sh > /dev/null 2>&1 ./start.sh >/dev/null 2>&1
cd "$(eval echo ~"$username")" cd "$(eval echo ~"$username")"
fi fi
echo "Setting up Frappe/ERPNext" echo "Setting up Frappe/ERPNext"
clone_repository "Frappe/ERPNext Docker" "$frappe_docker_url" clone_repository "Frappe/ERPNext Docker" "$frappe_docker_url"
cd "$(basename "$frappe_docker_url")" cd "$(basename "$frappe_docker_url")"
echo "$setup_configuration" > .env echo "$setup_configuration" >.env
echo "Enter a name for the project." echo "Enter a name for the project."
read -rp "This project name will be used to setup the docker instance: [erpnext_docker]" project_name read -rp "This project name will be used to setup the docker instance: [erpnext_docker]" project_name
if [ -z "$project_name" ]; then if [[ -z "$project_name" ]]; then
echo "Setting the project name to erpnext_docker" echo "Setting the project name to erpnext_docker"
project_name="erpnext_docker" project_name="erpnext_docker"
fi fi
@ -224,7 +232,7 @@ install() {
-f installation/docker-compose-frappe.yml \ -f installation/docker-compose-frappe.yml \
-f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-erpnext.yml \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
"$( (( setup_networking == 1 )) && printf %s '-f installation/docker-compose-networks.yml' )" "$( ((setup_networking == 1)) && printf %s '-f installation/docker-compose-networks.yml')"
get_config "SITES" "$(pwd)/.env" get_config "SITES" "$(pwd)/.env"
local sites=$line_result local sites=$line_result

7
tests/check-format.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
echo "Checking bash scripts with shellcheck" >&2
while IFS= read -r shellfile; do
shellcheck --check-sourced --severity=style --color=always --exclude=SC2164,SC2086,SC2012,SC2016 ${shellfile}
done < <(find ./build -name "*.sh")

View File

@ -1,4 +1,7 @@
#!/bin/bash #!/bin/bash
ULINE='\e[1m\e[4m'
ENDULINE='\e[0m'
NEWLINE='\n'
function checkMigrationComplete() { function checkMigrationComplete() {
echo "Check Migration" echo "Check Migration"
@ -9,21 +12,21 @@ function checkMigrationComplete() {
-f installation/erpnext-publish.yml \ -f installation/erpnext-publish.yml \
ps -q erpnext-python) ps -q erpnext-python)
DOCKER_LOG=$(docker logs $CONTAINER_ID 2>&1 | grep "Starting gunicorn") DOCKER_LOG=$(docker logs ${CONTAINER_ID} 2>&1 | grep "Starting gunicorn")
INCREMENT=0 INCREMENT=0
while [[ $DOCKER_LOG != *"Starting gunicorn"* && $INCREMENT -lt 60 ]]; do while [[ ${DOCKER_LOG} != *"Starting gunicorn"* && ${INCREMENT} -lt 60 ]]; do
sleep 3 sleep 3
echo "Wait for migration to complete ..." echo "Wait for migration to complete ..."
((INCREMENT=INCREMENT+1)) ((INCREMENT = INCREMENT + 1))
DOCKER_LOG=$(docker logs $CONTAINER_ID 2>&1 | grep "Starting gunicorn") DOCKER_LOG=$(docker logs ${CONTAINER_ID} 2>&1 | grep "Starting gunicorn")
if [[ $DOCKER_LOG != *"Starting gunicorn"* && $INCREMENT -eq 60 ]]; then if [[ ${DOCKER_LOG} != *"Starting gunicorn"* && ${INCREMENT} -eq 60 ]]; then
docker logs $CONTAINER_ID docker logs ${CONTAINER_ID}
exit 1 exit 1
fi fi
done done
echo -e "\e[4mMigration Log\e[0m" echo -e "${ULINE}Migration Log${ENDULINE}"
docker logs $CONTAINER_ID docker logs ${CONTAINER_ID}
} }
function loopHealthCheck() { function loopHealthCheck() {
@ -35,24 +38,22 @@ function loopHealthCheck() {
echo "Loop Health Check" echo "Loop Health Check"
FRAPPE_LOG=$(docker logs frappe_doctor | grep "Health check successful" || echo "") FRAPPE_LOG=$(docker logs frappe_doctor | grep "Health check successful" || echo "")
while [[ -z "$FRAPPE_LOG" ]]; do while [[ -z "${FRAPPE_LOG}" ]]; do
sleep 1 sleep 1
CONTAINER=$(docker start frappe_doctor) CONTAINER=$(docker start frappe_doctor)
echo "Restarting $CONTAINER ..." echo "Restarting ${CONTAINER} ..."
FRAPPE_LOG=$(docker logs frappe_doctor | grep "Health check successful" || echo "") FRAPPE_LOG=$(docker logs frappe_doctor | grep "Health check successful" || echo "")
done done
echo "Health check successful" echo "Health check successful"
} }
echo -e "\e[1m\e[4mCopy env-example file\e[0m" echo -e "${ULINE}Copy env-example file${ENDULINE}"
cp env-example .env cp env-example .env
echo -e "\n"
echo -e "\e[1m\e[4mSet version to v13\e[0m" echo -e "${NEWLINE}${ULINE}Set version to v13${ENDULINE}"
sed -i -e "s/edge/v13/g" .env sed -i -e "s/edge/v13/g" .env
echo -e "\n"
echo -e "\e[1m\e[4mStart Services\e[0m" echo -e "${NEWLINE}${ULINE}Start Services${ENDULINE}"
docker-compose \ docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
@ -74,30 +75,25 @@ docker run --name postgresql -d \
postgres:11.8 postgres:11.8
loopHealthCheck loopHealthCheck
echo -e "\n"
echo -e "\e[1m\e[4mCreate new site (v13)\e[0m" echo -e "${NEWLINE}${ULINE}Create new site (v13)${ENDULINE}"
docker run -it \ docker run -it \
-e "SITE_NAME=test.localhost" \ -e "SITE_NAME=test.localhost" \
-e "INSTALL_APPS=erpnext" \ -e "INSTALL_APPS=erpnext" \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:v13 new frappe/erpnext-worker:v13 new
echo -e "\n"
echo -e "\e[1m\e[4mPing created site\e[0m" echo -e "${NEWLINE}${ULINE}Ping created site${ENDULINE}"
curl -sS http://test.localhost/api/method/version curl -sS http://test.localhost/api/method/version
echo -e "\n"
echo -e "\e[1m\e[4mCheck Created Site Index Page\e[0m" echo -e "${NEWLINE}${ULINE}Check Created Site Index Page${ENDULINE}"
curl -s http://test.localhost | w3m -T text/html -dump curl -s http://test.localhost | w3m -T text/html -dump
echo -e "\n"
echo -e "\e[1m\e[4mSet version to edge\e[0m" echo -e "${NEWLINE}${ULINE}Set version to edge${ENDULINE}"
sed -i -e "s/v13/edge/g" .env sed -i -e "s/v13/edge/g" .env
echo -e "\n"
echo -e "\e[1m\e[4mRestart containers with edge image\e[0m" echo -e "${NEWLINE}${ULINE}Restart containers with edge image${ENDULINE}"
docker-compose \ docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
@ -112,18 +108,15 @@ docker-compose \
up -d up -d
checkMigrationComplete checkMigrationComplete
echo -e "\n"
echo -e "\e[1m\e[4mPing migrated site\e[0m" echo -e "${NEWLINE}${ULINE}Ping migrated site${ENDULINE}"
sleep 3 sleep 3
curl -sS http://test.localhost/api/method/version curl -sS http://test.localhost/api/method/version
echo -e "\n"
echo -e "\e[1m\e[4mCheck Migrated Site Index Page\e[0m" echo -e "${NEWLINE}${ULINE}Check Migrated Site Index Page${ENDULINE}"
curl -s http://test.localhost | w3m -T text/html -dump curl -s http://test.localhost | w3m -T text/html -dump
echo -e "\n"
echo -e "\e[1m\e[4mCreate new site (pgsql)\e[0m" echo -e "${NEWLINE}${ULINE}Create new site (pgsql)${ENDULINE}"
docker run -it \ docker run -it \
-e "SITE_NAME=pgsql.localhost" \ -e "SITE_NAME=pgsql.localhost" \
-e "POSTGRES_HOST=postgresql" \ -e "POSTGRES_HOST=postgresql" \
@ -132,96 +125,86 @@ docker run -it \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge new frappe/erpnext-worker:edge new
echo -e "\n"
echo -e "\e[1m\e[4mCheck New PGSQL Site\e[0m" echo -e "${NEWLINE}${ULINE}Check New PGSQL Site${ENDULINE}"
sleep 3 sleep 3
RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "")
INCREMENT=0 INCREMENT=0
while [[ -z "$RESTORE_STATUS" && $INCREMENT -lt 60 ]]; do while [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -lt 60 ]]; do
sleep 1 sleep 1
echo -e "\e[1m\e[4mWait for restoration to complete ..." echo -e "${ULINE}Wait for restoration to complete ..."
RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "")
((INCREMENT=INCREMENT+1)) ((INCREMENT = INCREMENT + 1))
if [[ -z "$RESTORE_STATUS" && $INCREMENT -eq 60 ]]; then if [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -eq 60 ]]; then
CONTAINER_ID=$(docker-compose \ CONTAINER_ID=$(docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
-f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-erpnext.yml \
-f installation/erpnext-publish.yml \ -f installation/erpnext-publish.yml \
ps -q erpnext-python) ps -q erpnext-python)
docker logs $CONTAINER_ID docker logs ${CONTAINER_ID}
exit 1 exit 1
fi fi
done done
echo -e "\n"
echo -e "\e[1m\e[4mPing new pgsql site\e[0m" echo -e "${NEWLINE}${ULINE}Ping new pgsql site${ENDULINE}"
echo $RESTORE_STATUS echo $RESTORE_STATUS
echo -e "\n"
echo -e "\e[1m\e[4mCheck New PGSQL Index Page\e[0m" echo -e "${NEWLINE}${ULINE}Check New PGSQL Index Page${ENDULINE}"
curl -s http://pgsql.localhost | w3m -T text/html -dump curl -s http://pgsql.localhost | w3m -T text/html -dump
echo -e "\n"
echo -e "\e[1m\e[4mBackup site\e[0m" echo -e "${NEWLINE}${ULINE}Backup site${ENDULINE}"
docker run -it \ docker run -it \
-e "WITH_FILES=1" \ -e "WITH_FILES=1" \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge backup frappe/erpnext-worker:edge backup
echo -e "\n"
export MINIO_ACCESS_KEY="AKIAIOSFODNN7EXAMPLE" MINIO_ACCESS_KEY="AKIAIOSFODNN7EXAMPLE"
export MINIO_SECRET_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" MINIO_SECRET_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
echo -e "\e[1m\e[4mStart MinIO container for s3 compatible storage\e[0m" echo -e "${ULINE}Start MinIO container for s3 compatible storage${ENDULINE}"
docker run -d --name minio \ docker run -d --name minio \
-e "MINIO_ACCESS_KEY=$MINIO_ACCESS_KEY" \ -e "MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY}" \
-e "MINIO_SECRET_KEY=$MINIO_SECRET_KEY" \ -e "MINIO_SECRET_KEY=${MINIO_SECRET_KEY}" \
--network frappebench00_default \ --network frappebench00_default \
minio/minio server /data minio/minio server /data
echo -e "\n"
echo -e "\e[1m\e[4mCreate bucket named erpnext\e[0m" echo -e "${NEWLINE}${ULINE}Create bucket named erpnext${ENDULINE}"
docker run \ docker run \
--network frappebench00_default \ --network frappebench00_default \
vltgroup/s3cmd:latest s3cmd --access_key=$MINIO_ACCESS_KEY \ vltgroup/s3cmd:latest s3cmd --access_key=${MINIO_ACCESS_KEY} \
--secret_key=$MINIO_SECRET_KEY \ --secret_key=${MINIO_SECRET_KEY} \
--region=us-east-1 \ --region=us-east-1 \
--no-ssl \ --no-ssl \
--host=minio:9000 \ --host=minio:9000 \
--host-bucket=minio:9000 \ --host-bucket=minio:9000 \
mb s3://erpnext mb s3://erpnext
echo -e "\n"
echo -e "\e[1m\e[4mPush backup to MinIO s3\e[0m" echo -e "${NEWLINE}${NEWLINE}${ULINE}Push backup to MinIO s3${ENDULINE}"
docker run \ docker run \
-e BUCKET_NAME=erpnext \ -e BUCKET_NAME=erpnext \
-e REGION=us-east-1 \ -e REGION=us-east-1 \
-e BUCKET_DIR=local \ -e BUCKET_DIR=local \
-e ACCESS_KEY_ID=$MINIO_ACCESS_KEY \ -e ACCESS_KEY_ID=${MINIO_ACCESS_KEY} \
-e SECRET_ACCESS_KEY=$MINIO_SECRET_KEY \ -e SECRET_ACCESS_KEY=${MINIO_SECRET_KEY} \
-e ENDPOINT_URL=http://minio:9000 \ -e ENDPOINT_URL=http://minio:9000 \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge push-backup frappe/erpnext-worker:edge push-backup
echo -e "\n"
echo -e "\e[1m\e[4mStop Services\e[0m" echo -e "${NEWLINE}${ULINE}Stop Services${ENDULINE}"
docker-compose \ docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
-f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-erpnext.yml \
-f installation/erpnext-publish.yml \ -f installation/erpnext-publish.yml \
stop stop
echo -e "\n"
echo -e "\e[1m\e[4mPrune Containers\e[0m" echo -e "${NEWLINE}${ULINE}Prune Containers${ENDULINE}"
docker container prune -f && docker volume prune -f docker container prune -f && docker volume prune -f
echo -e "\n"
echo -e "\e[1m\e[4mStart Services\e[0m" echo -e "${NEWLINE}${ULINE}Start Services${ENDULINE}"
docker-compose \ docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
@ -230,120 +213,110 @@ docker-compose \
up -d up -d
loopHealthCheck loopHealthCheck
echo -e "\n"
echo -e "\e[1m\e[4mRestore backup from MinIO / S3\e[0m" echo -e "${NEWLINE}${ULINE}Restore backup from MinIO / S3${ENDULINE}"
docker run \ docker run \
-e MYSQL_ROOT_PASSWORD=admin \ -e MYSQL_ROOT_PASSWORD=admin \
-e BUCKET_NAME=erpnext \ -e BUCKET_NAME=erpnext \
-e BUCKET_DIR=local \ -e BUCKET_DIR=local \
-e ACCESS_KEY_ID=$MINIO_ACCESS_KEY \ -e ACCESS_KEY_ID=${MINIO_ACCESS_KEY} \
-e SECRET_ACCESS_KEY=$MINIO_SECRET_KEY \ -e SECRET_ACCESS_KEY=${MINIO_SECRET_KEY} \
-e ENDPOINT_URL=http://minio:9000 \ -e ENDPOINT_URL=http://minio:9000 \
-e REGION=us-east-1 \ -e REGION=us-east-1 \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge restore-backup frappe/erpnext-worker:edge restore-backup
echo -e "\n"
echo -e "\e[1m\e[4mCheck Restored Site (test)\e[0m" echo -e "${NEWLINE}${ULINE}Check Restored Site (test)${ENDULINE}"
sleep 3 sleep 3
RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "")
INCREMENT=0 INCREMENT=0
while [[ -z "$RESTORE_STATUS" && $INCREMENT -lt 60 ]]; do while [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -lt 60 ]]; do
sleep 1 sleep 1
echo "Wait for restoration to complete ..." echo "Wait for restoration to complete ..."
RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "")
((INCREMENT=INCREMENT+1)) ((INCREMENT = INCREMENT + 1))
if [[ -z "$RESTORE_STATUS" && $INCREMENT -eq 60 ]]; then if [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -eq 60 ]]; then
CONTAINER_ID=$(docker-compose \ CONTAINER_ID=$(docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
-f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-erpnext.yml \
-f installation/erpnext-publish.yml \ -f installation/erpnext-publish.yml \
ps -q erpnext-python) ps -q erpnext-python)
docker logs $CONTAINER_ID docker logs ${CONTAINER_ID}
exit 1 exit 1
fi fi
done done
echo -e "\e[1m\e[4mPing restored site (test)\e[0m" echo -e "${ULINE}Ping restored site (test)${ENDULINE}"
echo $RESTORE_STATUS echo ${RESTORE_STATUS}
echo -e "\n"
echo -e "\e[1m\e[4mCheck Restored Site Index Page (test)\e[0m" echo -e "${NEWLINE}${ULINE}Check Restored Site Index Page (test)${ENDULINE}"
curl -s http://test.localhost | w3m -T text/html -dump curl -s http://test.localhost | w3m -T text/html -dump
echo -e "\n"
echo -e "\e[1m\e[4mCheck Restored Site (pgsql)\e[0m" echo -e "${NEWLINE}${ULINE}Check Restored Site (pgsql)${ENDULINE}"
sleep 3 sleep 3
RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "")
INCREMENT=0 INCREMENT=0
while [[ -z "$RESTORE_STATUS" && $INCREMENT -lt 60 ]]; do while [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -lt 60 ]]; do
sleep 1 sleep 1
echo "Wait for restoration to complete ..." echo "Wait for restoration to complete ..."
RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://pgsql.localhost/api/method/version || echo "")
((INCREMENT=INCREMENT+1)) ((INCREMENT = INCREMENT + 1))
if [[ -z "$RESTORE_STATUS" && $INCREMENT -eq 60 ]]; then if [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -eq 60 ]]; then
CONTAINER_ID=$(docker-compose \ CONTAINER_ID=$(docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
-f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-erpnext.yml \
-f installation/erpnext-publish.yml \ -f installation/erpnext-publish.yml \
ps -q erpnext-python) ps -q erpnext-python)
docker logs $CONTAINER_ID docker logs ${CONTAINER_ID}
exit 1 exit 1
fi fi
done done
echo -e "\e[1m\e[4mPing restored site (pgsql)\e[0m" echo -e "${ULINE}Ping restored site (pgsql)${ENDULINE}"
echo $RESTORE_STATUS echo ${RESTORE_STATUS}
echo -e "\n"
echo -e "\e[1m\e[4mCheck Restored Site Index Page (pgsql)\e[0m" echo -e "${NEWLINE}${ULINE}Check Restored Site Index Page (pgsql)${ENDULINE}"
curl -s http://pgsql.localhost | w3m -T text/html -dump curl -s http://pgsql.localhost | w3m -T text/html -dump
echo -e "\n"
echo -e "\e[1m\e[4mCreate new site (edge)\e[0m" echo -e "${NEWLINE}${ULINE}Create new site (edge)${ENDULINE}"
docker run -it \ docker run -it \
-e "SITE_NAME=edge.localhost" \ -e "SITE_NAME=edge.localhost" \
-e "INSTALL_APPS=erpnext" \ -e "INSTALL_APPS=erpnext" \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge new frappe/erpnext-worker:edge new
echo -e "\n"
echo -e "\e[1m\e[4mCheck New Edge Site\e[0m" echo -e "${NEWLINE}${ULINE}Check New Edge Site${ENDULINE}"
sleep 3 sleep 3
RESTORE_STATUS=$(curl -sS http://edge.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://edge.localhost/api/method/version || echo "")
INCREMENT=0 INCREMENT=0
while [[ -z "$RESTORE_STATUS" && $INCREMENT -lt 60 ]]; do while [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -lt 60 ]]; do
sleep 1 sleep 1
echo -e "\e[1m\e[4mWait for restoration to complete ..." echo -e "${ULINE}Wait for restoration to complete ...${ENDULINE}"
RESTORE_STATUS=$(curl -sS http://edge.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://edge.localhost/api/method/version || echo "")
((INCREMENT=INCREMENT+1)) ((INCREMENT = INCREMENT + 1))
if [[ -z "$RESTORE_STATUS" && $INCREMENT -eq 60 ]]; then if [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -eq 60 ]]; then
CONTAINER_ID=$(docker-compose \ CONTAINER_ID=$(docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
-f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-erpnext.yml \
-f installation/erpnext-publish.yml \ -f installation/erpnext-publish.yml \
ps -q erpnext-python) ps -q erpnext-python)
docker logs $CONTAINER_ID docker logs ${CONTAINER_ID}
exit 1 exit 1
fi fi
done done
echo -e "\n"
echo -e "\e[1m\e[4mPing new edge site\e[0m" echo -e "${NEWLINE}${ULINE}Ping new edge site${ENDULINE}"
echo $RESTORE_STATUS echo ${RESTORE_STATUS}
echo -e "\n"
echo -e "\e[1m\e[4mCheck New Edge Index Page\e[0m" echo -e "${NEWLINE}${ULINE}Check New Edge Index Page${ENDULINE}"
curl -s http://edge.localhost | w3m -T text/html -dump curl -s http://edge.localhost | w3m -T text/html -dump
echo -e "\n"
echo -e "\e[1m\e[4mMigrate command in edge container\e[0m" echo -e "${NEWLINE}${ULINE}Migrate command in edge container${ENDULINE}"
docker run -it \ docker run -it \
-e "MAINTENANCE_MODE=1" \ -e "MAINTENANCE_MODE=1" \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
@ -352,79 +325,74 @@ docker run -it \
frappe/erpnext-worker:edge migrate frappe/erpnext-worker:edge migrate
checkMigrationComplete checkMigrationComplete
echo -e "\n"
echo -e "\e[1m\e[4mRestore backup from MinIO / S3 (Overwrite)\e[0m" echo -e "${NEWLINE}${ULINE}Restore backup from MinIO / S3 (Overwrite)${ENDULINE}"
docker run \ docker run \
-e MYSQL_ROOT_PASSWORD=admin \ -e MYSQL_ROOT_PASSWORD=admin \
-e BUCKET_NAME=erpnext \ -e BUCKET_NAME=erpnext \
-e BUCKET_DIR=local \ -e BUCKET_DIR=local \
-e ACCESS_KEY_ID=$MINIO_ACCESS_KEY \ -e ACCESS_KEY_ID=${MINIO_ACCESS_KEY} \
-e SECRET_ACCESS_KEY=$MINIO_SECRET_KEY \ -e SECRET_ACCESS_KEY=${MINIO_SECRET_KEY} \
-e ENDPOINT_URL=http://minio:9000 \ -e ENDPOINT_URL=http://minio:9000 \
-e REGION=us-east-1 \ -e REGION=us-east-1 \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge restore-backup frappe/erpnext-worker:edge restore-backup
echo -e "\n"
echo -e "\e[1m\e[4mCheck Overwritten Site\e[0m" echo -e "${NEWLINE}${ULINE}Check Overwritten Site${ENDULINE}"
sleep 3 sleep 3
RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "")
INCREMENT=0 INCREMENT=0
while [[ -z "$RESTORE_STATUS" && $INCREMENT -lt 60 ]]; do while [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -lt 60 ]]; do
sleep 1 sleep 1
echo -e "\e[1m\e[4mWait for restoration to complete ..." echo -e "${ULINE}Wait for restoration to complete ..."
RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "") RESTORE_STATUS=$(curl -sS http://test.localhost/api/method/version || echo "")
((INCREMENT=INCREMENT+1)) ((INCREMENT = INCREMENT + 1))
if [[ -z "$RESTORE_STATUS" && $INCREMENT -eq 60 ]]; then if [[ -z "${RESTORE_STATUS}" && ${INCREMENT} -eq 60 ]]; then
CONTAINER_ID=$(docker-compose \ CONTAINER_ID=$(docker-compose \
--project-name frappebench00 \ --project-name frappebench00 \
-f installation/docker-compose-common.yml \ -f installation/docker-compose-common.yml \
-f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-erpnext.yml \
-f installation/erpnext-publish.yml \ -f installation/erpnext-publish.yml \
ps -q erpnext-python) ps -q erpnext-python)
docker logs $CONTAINER_ID docker logs ${CONTAINER_ID}
exit 1 exit 1
fi fi
done done
echo -e "\n"
echo -e "\e[1m\e[4mPing overwritten site\e[0m" echo -e "${NEWLINE}${ULINE}Ping overwritten site${ENDULINE}"
echo $RESTORE_STATUS echo ${RESTORE_STATUS}
echo -e "\n"
echo -e "\e[1m\e[4mCheck Overwritten Index Page\e[0m" echo -e "${NEWLINE}${ULINE}Check Overwritten Index Page${ENDULINE}"
curl -s http://test.localhost | w3m -T text/html -dump curl -s http://test.localhost | w3m -T text/html -dump
echo -e "\n"
echo -e "\e[1m\e[4mCheck console command for site test.localhost\e[0m" echo -e "${NEWLINE}${ULINE}Check console command for site test.localhost${ENDULINE}"
docker run \ docker run \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge console test.localhost frappe/erpnext-worker:edge console test.localhost
echo -e "\e[1m\e[4mCheck console command for site pgsql.localhost\e[0m" echo -e "${NEWLINE}${ULINE}Check console command for site pgsql.localhost${ENDULINE}"
docker run \ docker run \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge console pgsql.localhost frappe/erpnext-worker:edge console pgsql.localhost
echo -e "\e[1m\e[4mCheck drop site: test.localhost (mariadb)\e[0m" echo -e "${NEWLINE}${ULINE}Check drop site: test.localhost (mariadb)${ENDULINE}"
docker run \ docker run \
-e SITE_NAME=test.localhost \ -e SITE_NAME=test.localhost \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge drop frappe/erpnext-worker:edge drop
echo -e "\e[1m\e[4mCheck drop site: pgsql.localhost (pgsql)\e[0m" echo -e "${NEWLINE}${ULINE}Check drop site: pgsql.localhost (pgsql)${ENDULINE}"
docker run \ docker run \
-e SITE_NAME=pgsql.localhost \ -e SITE_NAME=pgsql.localhost \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \
frappe/erpnext-worker:edge drop frappe/erpnext-worker:edge drop
echo -e "\e[1m\e[4mCheck bench --help\e[0m" echo -e "${NEWLINE}${ULINE}Check bench --help${ENDULINE}"
docker run \ docker run \
-v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \ -v frappebench00_sites-vol:/home/frappe/frappe-bench/sites \
--network frappebench00_default \ --network frappebench00_default \