#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' [[ -z "${DEBUG}" && "${DEBUG}" == 1 ]] && set -o xtrace __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$__dir" env_url="https://raw.githubusercontent.com/frappe/frappe_docker/master/installation/env-example" docker_nginx_url="https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion" frappe_docker_url="https://github.com/frappe/frappe_docker" env_file="$__dir/.env" function check_root() { if [[ $EUID != 0 ]]; then echo "This script must be run as root. Login as root or use sudo." >&2 exit 1 fi } function check_git() { if [[ ! -x "$(command -v git)" ]]; then echo "Git is not installed. Please install git before continuing." >&2 exit 1 fi } function check_docker() { if [[ ! -x "$(command -v docker)" ]]; then read -rp "No docker installation found. Press Enter to install docker or ctrl+c to exit." >&2 curl -fsSL https://get.docker.com | sh fi if [[ ! -x "$(command -v docker)" ]]; then echo "Docker installation failed. Exiting." >&2 exit 1 fi } function check_env() { if [[ ! -f "$env_file" ]]; then cat <&2 No environment file found. This file is required for setting up Frappe/ERPNext Docker. 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." curl -fsSL "$env_url" -o "$env_file" fi } function clone_repository() { echo "Cloning Repository: $1" git clone "$2" } function get_config() { if [[ -n "$2" ]]; then config_file="$2" else config_file="$env_file" fi line=$(grep -E "^$=" "$config_file") line_result=$(echo "$line" | awk -F"=" '{print $2}') } function get_install_version() { cat <&2 Choose a version you would like to setup [current: $1]: 1. develop (edge) 2. version-12 3. version-11 Please enter your choice [1-3]: CHOOSE select choice in "1" "2" "3"; do case ${choice} in 1) version="edge" ;; 2) version="version-12" ;; 3) version="version-11" ;; esac done } function prompt_config() { # inspired by discourse_docker get_config "VERSION" local install_version=$line_result get_config "MYSQL_ROOT_PASSWORD" local mysql_password=$line_result get_config "SITES" local sites=$line_result get_config "LETSENCRYPT_EMAIL" local letsencrypt_email=$line_result echo "Would you like to setup networking for docker? [y/n]" echo "This is required if you wish to access the instance from other machines." select choice in "y" "n"; do case $choice in y) setup_networking=1 ;; n) setup_networking=0 setup_letsencrypt=0 ;; esac done if [[ -n "$letsencrypt_email" && "$setup_networking" -ne "0" ]]; then echo "Would you like to setup LetsEncrypt? [y/n]" select choice in "y" "n"; do case $choice in y) setup_letsencrypt=1 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 ;; n) setup_letsencrypt=0 echo "Skipping LetsEncrypt Setup." ;; esac done fi local new_value="" local config_state="n" echo get_install_version "$install_version" install_version="$version" while [[ "$config_state" == "n" ]]; do if [[ -n "$mysql_password" ]]; then read -srp "Enter MySQL Password [$mysql_password]: " new_value if [[ -n "$new_value" ]]; then mysql_password="$new_value" fi fi if [[ -n "$sites" ]]; then read -rp "Enter sitename to setup [$sites]: " new_value if [[ -n "$new_value" ]]; then sites="$new_value" fi fi if [[ "$setup_letsencrypt" != "0" ]]; then read -rp "Enter email address for LetsEncrypt [$letsencrypt_email]: " new_value if [[ -n "$new_value" ]]; then letsencrypt_email=$new_value fi fi echo "Current Configuration:" echo "Version: $([[ "$install_version" == "edge" ]] && echo "develop" || echo "$install_version")" echo "MySQL Root Password: $mysql_password" echo "Sites: $sites" if [[ "$setup_letsencrypt" != "0" ]]; then echo "LetsEncrypt Email Address: $letsencrypt_email" fi echo echo "Does this configuration look okay?" read -rp "Press Enter to continue, 'n' to try again, or ctrl+c to exit: " config_state done echo "Saving the current configuration file to $env_file" cat <"$env_file" VERSION=$install_version MYSQL_ROOT_PASSWORD=$mysql_password SITES=$sites $([ "$setup_letsencrypt" -ne "0" ] && echo "LETSENCRYPT_EMAIL=$letsencrypt_email") EOF setup_configuration=$(<"$env_file") } setup_user() { 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." read -rp "Enter username: " username if grep -E "^$username" /etc/passwd >/dev/null; then echo "User $username already exists." else read -rsp "Enter password: " password password="$(perl -e 'print crypt($ARGV[0], "password")' "$password")" if useradd -m -p "$password" "$username" -s "$(command -v bash)"; then echo "User $username has been added to the system." else echo "Failed to add user to the system." echo "Please add a user manually and re-run the script." exit 1 fi fi if ! getent group docker >/dev/null 2>&1; then echo "Creating group: docker" groupadd docker fi echo "Adding user $username to group: docker" usermod -aG docker "$username" newgrp docker } install() { if [[ "$setup_letsencrypt" != "0" && "$setup_networking" != "0" ]]; then echo "Setting up NGINX Proxy for LetsEncrypt" clone_repository "Docker Compose LetsEncrypt NGINX Proxy Companion" "$docker_nginx_url" cd "$(basename "$docker_nginx_url")" if [[ -f .env.sample ]]; then cp .env.sample env fi ./start.sh >/dev/null 2>&1 cd "$(eval echo ~"$username")" fi echo "Setting up Frappe/ERPNext" clone_repository "Frappe/ERPNext Docker" "$frappe_docker_url" cd "$(basename "$frappe_docker_url")" echo "$setup_configuration" >.env echo "Enter a name for the project." read -rp "This project name will be used to setup the docker instance: [erpnext_docker]" project_name if [[ -z "$project_name" ]]; then echo "Setting the project name to erpnext_docker" project_name="erpnext_docker" fi docker-compose \ --project-name "$project_name" \ --project-directory . up -d \ -f installation/docker-compose-frappe.yml \ -f installation/docker-compose-erpnext.yml \ -f installation/docker-compose-common.yml \ "$( ((setup_networking == 1)) && printf %s '-f installation/docker-compose-networks.yml')" get_config "SITES" "$(pwd)/.env" local sites=$line_result docker exec \ -e "SITE_NAME=$sites" \ -e "INSTALL_ERPNEXT=1" \ -it "$project_name"_erpnext-python_1 docker-entrypoint.sh new echo "Installation Complete!" } check_root check_git check_docker check_env prompt_config setup_user install