2025-01-07 09:34:26 +07:00
#!/usr/bin/bash
export PATH = /usr/sbin:$PATH
export DEBIAN_FRONTEND = noninteractive
set -euo pipefail
DEPLOY_PATH = $( pwd ) /deployment
2025-01-07 17:52:17 +07:00
SETUP_PATH = $( pwd ) /setup
2025-01-14 18:08:41 +07:00
2025-01-15 08:54:15 +07:00
PIP = $( pwd ) /venv/bin/pip
PYTHON = $( pwd ) /venv/bin/python
2025-01-15 18:19:11 +07:00
ODOO_ADDONS = ${ DEPLOY_PATH } /addons
ODOO_CONFIG = ${ DEPLOY_PATH } /etc
ODOO_BACKUP = ${ DEPLOY_PATH } /backup
2025-01-07 09:34:26 +07:00
# System
2025-01-14 18:08:41 +07:00
DEPENDS_PACKAGE = ( 'wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'postgresql-client' )
DEPENDS_COMMAND = ( 'wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'psql' )
2025-01-07 09:34:26 +07:00
( ( EUID) ) && sudo_cmd = "sudo" || sudo_cmd = ""
readonly MINIMUM_DOCER_VERSION = "20"
UNAME_U = " $( uname -s) "
readonly UNAME_U
readonly COLOUR_RESET = '\e[0m'
readonly aCOLOUR = (
'\e[38;5;154m' # green | Lines, bullets and separators
'\e[1m' # Bold white | Main descriptions
'\e[90m' # Grey | Credits
'\e[91m' # Red | Update notifications Alert
'\e[33m' # Yellow | Emphasis
)
trap 'onCtrlC' INT
onCtrlC( ) {
echo -e " ${ COLOUR_RESET } "
exit 1
}
Show( ) {
# OK
if ( ( $1 = = 0) ) ; then
echo -e " ${ aCOLOUR [2] } [ $COLOUR_RESET ${ aCOLOUR [0] } OK $COLOUR_RESET ${ aCOLOUR [2] } ] $COLOUR_RESET $2 "
# FAILED
elif ( ( $1 = = 1) ) ; then
echo -e " ${ aCOLOUR [2] } [ $COLOUR_RESET ${ aCOLOUR [3] } FAILED $COLOUR_RESET ${ aCOLOUR [2] } ] $COLOUR_RESET $2 "
exit 1
# INFO
elif ( ( $1 = = 2) ) ; then
echo -e " ${ aCOLOUR [2] } [ $COLOUR_RESET ${ aCOLOUR [0] } INFO $COLOUR_RESET ${ aCOLOUR [2] } ] $COLOUR_RESET $2 "
# NOTICE
elif ( ( $1 = = 3) ) ; then
echo -e " ${ aCOLOUR [2] } [ $COLOUR_RESET ${ aCOLOUR [4] } NOTICE $COLOUR_RESET ${ aCOLOUR [2] } ] $COLOUR_RESET $2 "
fi
}
Warn( ) {
echo -e " ${ aCOLOUR [3] } $1 $COLOUR_RESET "
}
GreyStart( ) {
echo -e " ${ aCOLOUR [2] } \c "
}
ColorReset( ) {
echo -e " $COLOUR_RESET \c "
}
Update_Package_Resource( ) {
GreyStart
if [ -x " $( command -v apk) " ] ; then
${ sudo_cmd } apk update
elif [ -x " $( command -v apt) " ] ; then
${ sudo_cmd } apt update
elif [ -x " $( command -v dnf) " ] ; then
${ sudo_cmd } dnf check-update
elif [ -x " $( command -v zypper) " ] ; then
${ sudo_cmd } zypper update
elif [ -x " $( command -v yum) " ] ; then
${ sudo_cmd } yum update
fi
ColorReset
}
# 3 Check OS
Check_OS( ) {
if [ [ $UNAME_U = = *Linux* ] ] ; then
Show 0 " Your System is : $UNAME_U "
else
Show 1 "This script is only for Linux."
exit 1
fi
}
Install_Depends( ) {
for ( ( i = 0; i < ${# DEPENDS_COMMAND [@] } ; i++) ) ; do
cmd = ${ DEPENDS_COMMAND [i] }
if [ [ ! -x $( ${ sudo_cmd } which " $cmd " ) ] ] ; then
packagesNeeded = ${ DEPENDS_PACKAGE [i] }
Show 2 " Install the necessary dependencies: \e[33m $packagesNeeded \e[0m "
GreyStart
if [ -x " $( command -v apk) " ] ; then
${ sudo_cmd } apk add --no-cache " $packagesNeeded "
elif [ -x " $( command -v apt-get) " ] ; then
${ sudo_cmd } apt-get -y -q install " $packagesNeeded " --no-upgrade
elif [ -x " $( command -v dnf) " ] ; then
${ sudo_cmd } dnf install " $packagesNeeded "
elif [ -x " $( command -v zypper) " ] ; then
${ sudo_cmd } zypper install " $packagesNeeded "
elif [ -x " $( command -v yum) " ] ; then
${ sudo_cmd } yum install " $packagesNeeded "
elif [ -x " $( command -v pacman) " ] ; then
${ sudo_cmd } pacman -S " $packagesNeeded "
elif [ -x " $( command -v paru) " ] ; then
${ sudo_cmd } paru -S " $packagesNeeded "
else
Show 1 " Package manager not found. You must manually install: \e[33m $packagesNeeded \e[0m "
fi
ColorReset
else
Show 2 " \e[33m ${ DEPENDS_COMMAND [i] } \e[0m Installed "
fi
done
}
Check_Dependency_Installation( ) {
for ( ( i = 0; i < ${# DEPENDS_COMMAND [@] } ; i++) ) ; do
cmd = ${ DEPENDS_COMMAND [i] }
if [ [ ! -x $( ${ sudo_cmd } which " $cmd " ) ] ] ; then
packagesNeeded = ${ DEPENDS_PACKAGE [i] }
Show 1 " Dependency \e[33m $packagesNeeded \e[0m installation failed, please try again manually! "
exit 1
fi
done
}
Check_Docker_Install( ) {
if [ [ -x " $( command -v docker) " ] ] ; then
Docker_Version = $( ${ sudo_cmd } docker version --format '{{.Server.Version}}' )
if [ [ $? -ne 0 ] ] ; then
Install_Docker
elif [ [ ${ Docker_Version : 0 : 2 } -lt " ${ MINIMUM_DOCER_VERSION } " ] ] ; then
Show 1 " Recommended minimum Docker version is \e[33m ${ MINIMUM_DOCER_VERSION } .xx.xx\e[0m,\Current Docker verison is \e[33m ${ Docker_Version } \e[0m,\nPlease uninstall current Docker and rerun the CasaOS installation script. "
exit 1
else
Show 0 " Current Docker verison is ${ Docker_Version } . "
fi
else
Install_Docker
fi
}
Install_Docker( ) {
Show 2 "Install the necessary dependencies: \e[33mDocker \e[0m"
if [ [ ! -d " ${ PREFIX } /etc/apt/sources.list.d " ] ] ; then
${ sudo_cmd } mkdir -p " ${ PREFIX } /etc/apt/sources.list.d "
fi
GreyStart
if [ [ " ${ REGION } " = "CN" ] ] ; then
${ sudo_cmd } curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
else
${ sudo_cmd } curl -fsSL https://get.docker.com | bash
fi
ColorReset
if [ [ $? -ne 0 ] ] ; then
Show 1 "Installation failed, please try again."
exit 1
else
Check_Docker_Install_Final
fi
}
Check_Docker_Install_Final( ) {
if [ [ -x " $( command -v docker) " ] ] ; then
Docker_Version = $( ${ sudo_cmd } docker version --format '{{.Server.Version}}' )
if [ [ $? -ne 0 ] ] ; then
Install_Docker
elif [ [ ${ Docker_Version : 0 : 2 } -lt " ${ MINIMUM_DOCER_VERSION } " ] ] ; then
Show 1 " Recommended minimum Docker version is \e[33m ${ MINIMUM_DOCER_VERSION } .xx.xx\e[0m,\Current Docker verison is \e[33m ${ Docker_Version } \e[0m,\nPlease uninstall current Docker and rerun the CasaOS installation script. "
exit 1
else
Show 0 " Current Docker verison is ${ Docker_Version } . "
Check_Docker_Running
fi
else
Show 1 "Installation failed, please run 'curl -fsSL https://get.docker.com | bash' and rerun the CasaOS installation script."
exit 1
fi
}
2025-01-14 18:08:41 +07:00
Generate_Config_Docker( ) {
ODOO_IMAGE = ${ 1 :- }
ODOO_TAG = ${ 2 :- }
ODOO_CONTAINER = ${ 3 :- }
if [ [ ! -f " ${ DEPLOY_PATH } /.env " ] ] ; then
cp " ${ DEPLOY_PATH } /env.template " " ${ DEPLOY_PATH } /.env "
fi
2025-01-15 11:58:00 +07:00
USER = " ${ REPO_NAME :- "default_repo" } "
# Convert to lowercase
USER = " ${ USER ,, } "
${ PYTHON } " $SETUP_PATH /gen_config_docker.py " --db_port 5432 --db_user $USER --deploy_path " $DEPLOY_PATH " \
2025-01-14 18:08:41 +07:00
--image " ${ ODOO_IMAGE } " --container " ${ ODOO_CONTAINER } " --tag " ${ ODOO_TAG : =latest } " \
2025-01-15 16:30:04 +07:00
--addons " ${ ODOO_ADDONS } " --config " ${ ODOO_CONFIG } " --backup " ${ ODOO_BACKUP } "
2025-01-14 18:08:41 +07:00
Show 0 " Generate Config Complete"
}
Generate_Config_Native( ) {
2025-01-15 10:25:27 +07:00
# Load environment variables from .env file
2025-01-15 10:51:08 +07:00
Show 2 "Environment variables loaded:"
printenv | sort
2025-01-14 18:08:41 +07:00
ADDONS = ${ 1 :- }
REPO_NAME = $( basename " $( git rev-parse --show-toplevel) " | sed -E 's/[.-]/_/g' )
USER = " ${ REPO_NAME :- "default_repo" } "
2025-01-15 11:37:04 +07:00
# Convert to lowercase
USER = " ${ USER ,, } "
2025-01-14 18:08:41 +07:00
PASSWORD = " $( openssl rand -hex 24) "
# Check if the user already exists
2025-01-15 11:21:48 +07:00
USER_EXISTS = $( psql " postgresql:// ${ DB_USER } : ${ DB_PASSWORD } @ ${ DB_SERVER } : ${ DB_PORT } /postgres " -t -A -c " SELECT COUNT(*) FROM pg_roles WHERE rolname=' $USER '; " )
2025-01-14 18:08:41 +07:00
2025-01-15 11:37:04 +07:00
if [ $USER_EXISTS -eq 0 ] ; then
# User does not exist, create the user
Show 2 " Create the new PostgreSQL username: $USER with password: $PASSWORD "
psql " postgresql:// ${ DB_USER } : ${ DB_PASSWORD } @ ${ DB_SERVER } : ${ DB_PORT } /postgres " -c " CREATE USER $USER WITH PASSWORD ' $PASSWORD '; "
Show 2 " Grant $USER superuser (admin) privileges "
psql " postgresql:// ${ DB_USER } : ${ DB_PASSWORD } @ ${ DB_SERVER } : ${ DB_PORT } /postgres " -c " ALTER USER $USER WITH SUPERUSER; "
else
# User exists, update the password (do not try to create)
Show 2 " User $USER already exists, updating password to $PASSWORD "
psql " postgresql:// ${ DB_USER } : ${ DB_PASSWORD } @ ${ DB_SERVER } : ${ DB_PORT } /postgres " -c " ALTER USER $USER WITH PASSWORD ' $PASSWORD '; "
fi
2025-01-15 08:54:15 +07:00
${ PYTHON } " $SETUP_PATH /gen_config.py " --db_user $USER --db_pass $PASSWORD --deploy_path " $( pwd ) " \
2025-01-15 11:28:13 +07:00
--addons_path $ADDONS --db_port $DB_PORT --db_server $DB_SERVER
2025-01-14 18:08:41 +07:00
Show 0 " Generate Config Complete"
}
main( ) {
TYPE = ${ 1 :- }
Check_OS
# Update_Package_Resource
# Install_Depends
# Check_Dependency_Installation
# Check_Docker_Install
case " $TYPE " in
--native)
Generate_Config_Native $2
; ;
--docker)
2025-01-15 16:30:04 +07:00
Generate_Config_Docker $2 $3 $4
2025-01-14 18:08:41 +07:00
; ;
*)
# else
Show 1 "Invalid argument (--docker|--native)"
; ;
esac
}
2025-01-15 16:30:04 +07:00
main ${ 1 :- } ${ 2 :- } ${ 3 :- } ${ 4 :- }