hst-install-debian.sh 86 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458
  1. #!/bin/bash
  2. # ======================================================== #
  3. #
  4. # Hestia Control Panel Installer for Debian
  5. # https://www.hestiacp.com/
  6. #
  7. # Currently Supported Versions:
  8. # Debian 10, 11
  9. #
  10. # ======================================================== #
  11. #----------------------------------------------------------#
  12. # Variables&Functions #
  13. #----------------------------------------------------------#
  14. export PATH=$PATH:/sbin
  15. export DEBIAN_FRONTEND=noninteractive
  16. RHOST='apt.hestiacp.com'
  17. VERSION='debian'
  18. HESTIA='/usr/local/hestia'
  19. LOG="/root/hst_install_backups/hst_install-$(date +%d%m%Y%H%M).log"
  20. memory=$(grep 'MemTotal' /proc/meminfo | tr ' ' '\n' | grep [0-9])
  21. hst_backups="/root/hst_install_backups/$(date +%d%m%Y%H%M)"
  22. spinner="/-\|"
  23. os='debian'
  24. release="$(cat /etc/debian_version | tr "." "\n" | head -n1)"
  25. codename="$(cat /etc/os-release | grep VERSION= | cut -f 2 -d \( | cut -f 1 -d \))"
  26. architecture="$(arch)"
  27. HESTIA_INSTALL_DIR="$HESTIA/install/deb"
  28. HESTIA_COMMON_DIR="$HESTIA/install/common"
  29. VERBOSE='no'
  30. # Define software versions
  31. HESTIA_INSTALL_VER='1.9.0~alpha'
  32. # Supported PHP versions
  33. multiphp_v=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2" "8.3")
  34. # One of the following PHP versions is required for Roundcube / phpmyadmin
  35. multiphp_required=("7.3" "7.4" "8.0" "8.1" "8.2","8.3")
  36. # Default PHP version if none supplied
  37. fpm_v="8.2"
  38. # MariaDB version
  39. mariadb_v="10.11"
  40. # Defining software pack for all distros
  41. software="acl apache2 apache2-suexec-custom apache2-suexec-pristine apache2-utils awstats bc bind9 bsdmainutils bsdutils
  42. clamav-daemon cron curl dnsutils dovecot-imapd dovecot-managesieved dovecot-pop3d dovecot-sieve e2fslibs e2fsprogs
  43. exim4 exim4-daemon-heavy expect fail2ban flex ftp git hestia=${HESTIA_INSTALL_VER} hestia-nginx hestia-php hestia-web-terminal
  44. idn2 imagemagick ipset jq libapache2-mod-fcgid libapache2-mod-php$fpm_v libapache2-mpm-itk libmail-dkim-perl lsb-release
  45. lsof mariadb-client mariadb-common mariadb-server mc mysql-client mysql-common mysql-server net-tools nginx nodejs openssh-server
  46. php$fpm_v php$fpm_v-apcu php$fpm_v-bz2 php$fpm_v-cgi php$fpm_v-cli php$fpm_v-common php$fpm_v-curl php$fpm_v-gd
  47. php$fpm_v-imagick php$fpm_v-imap php$fpm_v-intl php$fpm_v-ldap php$fpm_v-mbstring php$fpm_v-mysql php$fpm_v-opcache
  48. php$fpm_v-pgsql php$fpm_v-pspell php$fpm_v-readline php$fpm_v-xml php$fpm_v-zip postgresql postgresql-contrib
  49. proftpd-basic quota rrdtool rsyslog spamd sudo sysstat unrar-free unzip util-linux vim-common vsftpd xxd whois zip zstd jailkit"
  50. installer_dependencies="apt-transport-https ca-certificates curl dirmngr gnupg openssl wget"
  51. # Defining help function
  52. help() {
  53. echo "Usage: $0 [OPTIONS]
  54. -a, --apache Install Apache [yes|no] default: yes
  55. -w, --phpfpm Install PHP-FPM [yes|no] default: yes
  56. -o, --multiphp Install MultiPHP [yes|no] default: no
  57. -v, --vsftpd Install VSFTPD [yes|no] default: yes
  58. -j, --proftpd Install ProFTPD [yes|no] default: no
  59. -k, --named Install BIND [yes|no] default: yes
  60. -m, --mysql Install MariaDB [yes|no] default: yes
  61. -M, --mysql8 Install MySQL 8 [yes|no] default: no
  62. -g, --postgresql Install PostgreSQL [yes|no] default: no
  63. -x, --exim Install Exim [yes|no] default: yes
  64. -z, --dovecot Install Dovecot [yes|no] default: yes
  65. -Z, --sieve Install Sieve [yes|no] default: no
  66. -c, --clamav Install ClamAV [yes|no] default: yes
  67. -t, --spamassassin Install SpamAssassin [yes|no] default: yes
  68. -i, --iptables Install iptables [yes|no] default: yes
  69. -b, --fail2ban Install Fail2Ban [yes|no] default: yes
  70. -q, --quota Filesystem Quota [yes|no] default: no
  71. -W, --webterminal Web Terminal [yes|no] default: no
  72. -d, --api Activate API [yes|no] default: yes
  73. -r, --port Change Backend Port default: 8083
  74. -l, --lang Default language default: en
  75. -y, --interactive Interactive install [yes|no] default: yes
  76. -s, --hostname Set hostname
  77. -e, --email Set admin email
  78. -u, --username Set admin user
  79. -p, --password Set admin password
  80. -D, --with-debs Path to Hestia debs
  81. -f, --force Force installation
  82. -h, --help Print this help
  83. Example: bash $0 -e demo@hestiacp.com -p p4ssw0rd --multiphp yes"
  84. exit 1
  85. }
  86. # Defining file download function
  87. download_file() {
  88. wget $1 -q --show-progress --progress=bar:force
  89. }
  90. # Defining password-gen function
  91. gen_pass() {
  92. matrix=$1
  93. length=$2
  94. if [ -z "$matrix" ]; then
  95. matrix="A-Za-z0-9"
  96. fi
  97. if [ -z "$length" ]; then
  98. length=16
  99. fi
  100. head /dev/urandom | tr -dc $matrix | head -c$length
  101. }
  102. # Defining return code check function
  103. check_result() {
  104. if [ $1 -ne 0 ]; then
  105. echo "Error: $2"
  106. exit $1
  107. fi
  108. }
  109. # Source conf in installer
  110. source_conf() {
  111. while IFS='= ' read -r lhs rhs; do
  112. if [[ ! $lhs =~ ^\ *# && -n $lhs ]]; then
  113. rhs="${rhs%%^\#*}" # Del in line right comments
  114. rhs="${rhs%%*( )}" # Del trailing spaces
  115. rhs="${rhs%\'*}" # Del opening string quotes
  116. rhs="${rhs#\'*}" # Del closing string quotes
  117. declare -g $lhs="$rhs"
  118. fi
  119. done < $1
  120. }
  121. # Defining function to set default value
  122. set_default_value() {
  123. eval variable=\$$1
  124. if [ -z "$variable" ]; then
  125. eval $1=$2
  126. fi
  127. if [ "$variable" != 'yes' ] && [ "$variable" != 'no' ]; then
  128. eval $1=$2
  129. fi
  130. }
  131. # Defining function to set default language value
  132. set_default_lang() {
  133. if [ -z "$lang" ]; then
  134. eval lang=$1
  135. fi
  136. lang_list="ar az bg bn bs ca cs da de el en es fa fi fr hr hu id it ja ka ku ko nl no pl pt pt-br ro ru sk sq sr sv th tr uk ur vi zh-cn zh-tw"
  137. if ! (echo $lang_list | grep -w $lang > /dev/null 2>&1); then
  138. eval lang=$1
  139. fi
  140. }
  141. # Define the default backend port
  142. set_default_port() {
  143. if [ -z "$port" ]; then
  144. eval port=$1
  145. fi
  146. }
  147. # Write configuration KEY/VALUE pair to $HESTIA/conf/hestia.conf
  148. write_config_value() {
  149. local key="$1"
  150. local value="$2"
  151. echo "$key='$value'" >> $HESTIA/conf/hestia.conf
  152. }
  153. # Sort configuration file values
  154. # Write final copy to $HESTIA/conf/hestia.conf for active usage
  155. # Duplicate file to $HESTIA/conf/defaults/hestia.conf to restore known good installation values
  156. sort_config_file() {
  157. sort $HESTIA/conf/hestia.conf -o /tmp/updconf
  158. mv $HESTIA/conf/hestia.conf $HESTIA/conf/hestia.conf.bak
  159. mv /tmp/updconf $HESTIA/conf/hestia.conf
  160. rm -f $HESTIA/conf/hestia.conf.bak
  161. if [ ! -d "$HESTIA/conf/defaults/" ]; then
  162. mkdir -p "$HESTIA/conf/defaults/"
  163. fi
  164. cp $HESTIA/conf/hestia.conf $HESTIA/conf/defaults/hestia.conf
  165. }
  166. # todo add check for usernames that are blocked
  167. validate_username() {
  168. if [[ "$username" =~ ^[[:alnum:]][-|\.|_[:alnum:]]{0,28}[[:alnum:]]$ ]]; then
  169. if [ -n "$(grep ^$username: /etc/passwd /etc/group)" ]; then
  170. echo -e "\nUsername or Group allready exists please select a new user name or delete the user and / or group."
  171. else
  172. return 1
  173. fi
  174. else
  175. echo -e "\nPlease use a valid username (ex. user)."
  176. return 0
  177. fi
  178. }
  179. validate_password() {
  180. if [ -z "$vpass" ]; then
  181. return 0
  182. else
  183. return 1
  184. fi
  185. }
  186. # Validate hostname according to RFC1178
  187. validate_hostname() {
  188. # remove extra .
  189. servername=$(echo "$servername" | sed -e "s/[.]*$//g")
  190. servername=$(echo "$servername" | sed -e "s/^[.]*//")
  191. if [[ $(echo "$servername" | grep -o "\." | wc -l) -gt 1 ]] && [[ ! $servername =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  192. # Hostname valid
  193. return 1
  194. else
  195. # Hostname invalid
  196. return 0
  197. fi
  198. }
  199. validate_email() {
  200. if [[ ! "$email" =~ ^[A-Za-z0-9._%+-]+@[[:alnum:].-]+\.[A-Za-z]{2,63}$ ]]; then
  201. # Email invalid
  202. return 0
  203. else
  204. # Email valid
  205. return 1
  206. fi
  207. }
  208. version_ge() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1" -o -n "$1" -a "$1" = "$2"; }
  209. #----------------------------------------------------------#
  210. # Verifications #
  211. #----------------------------------------------------------#
  212. # Creating temporary file
  213. tmpfile=$(mktemp -p /tmp)
  214. # Translating argument to --gnu-long-options
  215. for arg; do
  216. delim=""
  217. case "$arg" in
  218. --apache) args="${args}-a " ;;
  219. --phpfpm) args="${args}-w " ;;
  220. --vsftpd) args="${args}-v " ;;
  221. --proftpd) args="${args}-j " ;;
  222. --named) args="${args}-k " ;;
  223. --mysql) args="${args}-m " ;;
  224. --mariadb) args="${args}-m " ;;
  225. --mysql-classic) args="${args}-M " ;;
  226. --mysql8) args="${args}-M " ;;
  227. --postgresql) args="${args}-g " ;;
  228. --exim) args="${args}-x " ;;
  229. --dovecot) args="${args}-z " ;;
  230. --sieve) args="${args}-Z " ;;
  231. --clamav) args="${args}-c " ;;
  232. --spamassassin) args="${args}-t " ;;
  233. --iptables) args="${args}-i " ;;
  234. --fail2ban) args="${args}-b " ;;
  235. --multiphp) args="${args}-o " ;;
  236. --quota) args="${args}-q " ;;
  237. --webterminal) args="${args}-W " ;;
  238. --port) args="${args}-r " ;;
  239. --lang) args="${args}-l " ;;
  240. --interactive) args="${args}-y " ;;
  241. --api) args="${args}-d " ;;
  242. --hostname) args="${args}-s " ;;
  243. --email) args="${args}-e " ;;
  244. --username) args="${args}-u " ;;
  245. --password) args="${args}-p " ;;
  246. --force) args="${args}-f " ;;
  247. --with-debs) args="${args}-D " ;;
  248. --help) args="${args}-h " ;;
  249. *)
  250. [[ "${arg:0:1}" == "-" ]] || delim="\""
  251. args="${args}${delim}${arg}${delim} "
  252. ;;
  253. esac
  254. done
  255. eval set -- "$args"
  256. # Parsing arguments
  257. while getopts "a:w:v:j:k:m:M:g:d:x:z:Z:c:t:i:b:r:o:q:l:y:s:u:e:p:W:D:fh" Option; do
  258. case $Option in
  259. a) apache=$OPTARG ;; # Apache
  260. w) phpfpm=$OPTARG ;; # PHP-FPM
  261. o) multiphp=$OPTARG ;; # Multi-PHP
  262. v) vsftpd=$OPTARG ;; # Vsftpd
  263. j) proftpd=$OPTARG ;; # Proftpd
  264. k) named=$OPTARG ;; # Named
  265. m) mysql=$OPTARG ;; # MariaDB
  266. M) mysql8=$OPTARG ;; # MySQL
  267. g) postgresql=$OPTARG ;; # PostgreSQL
  268. x) exim=$OPTARG ;; # Exim
  269. z) dovecot=$OPTARG ;; # Dovecot
  270. Z) sieve=$OPTARG ;; # Sieve
  271. c) clamd=$OPTARG ;; # ClamAV
  272. t) spamd=$OPTARG ;; # SpamAssassin
  273. i) iptables=$OPTARG ;; # Iptables
  274. b) fail2ban=$OPTARG ;; # Fail2ban
  275. q) quota=$OPTARG ;; # FS Quota
  276. W) webterminal=$OPTARG ;; # Web Terminal
  277. r) port=$OPTARG ;; # Backend Port
  278. l) lang=$OPTARG ;; # Language
  279. d) api=$OPTARG ;; # Activate API
  280. y) interactive=$OPTARG ;; # Interactive install
  281. s) servername=$OPTARG ;; # Hostname
  282. e) email=$OPTARG ;; # Admin email
  283. u) username=$OPTARG ;; # Admin username
  284. p) vpass=$OPTARG ;; # Admin password
  285. D) withdebs=$OPTARG ;; # Hestia debs path
  286. f) force='yes' ;; # Force install
  287. h) help ;; # Help
  288. *) help ;; # Print help (default)
  289. esac
  290. done
  291. if [ -n "$multiphp" ]; then
  292. if [ "$multiphp" != 'no' ] && [ "$multiphp" != 'yes' ]; then
  293. php_versions=$(echo $multiphp | tr ',' "\n")
  294. multiphp_version=()
  295. for php_version in "${php_versions[@]}"; do
  296. if [[ $(echo "${multiphp_v[@]}" | fgrep -w "$php_version") ]]; then
  297. multiphp_version=(${multiphp_version[@]} "$php_version")
  298. else
  299. echo "$php_version is not supported"
  300. exit 1
  301. fi
  302. done
  303. multiphp_v=()
  304. for version in "${multiphp_version[@]}"; do
  305. multiphp_v=(${multiphp_v[@]} $version)
  306. done
  307. fpm_old=$fpm_v
  308. multiphp="yes"
  309. fpm_v=$(printf "%s\n" "${multiphp_version[@]}" | sort -V | tail -n1)
  310. fpm_last=$(printf "%s\n" "${multiphp_required[@]}" | sort -V | tail -n1)
  311. # Allow Maintainer to set minimum fpm version to make sure phpmyadmin and roundcube keep working
  312. if [[ -z $(echo "${multiphp_required[@]}" | fgrep -w $fpm_v) ]]; then
  313. if version_ge $fpm_v $fpm_last; then
  314. multiphp_version=(${multiphp_version[@]} $fpm_last)
  315. fpm_v=$fpm_last
  316. else
  317. # Roundcube and PHPmyadmin doesn't support the version selected.
  318. echo "Selected PHP versions are not supported any more by Dependencies..."
  319. exit 1
  320. fi
  321. fi
  322. software=$(echo "$software" | sed -e "s/php$fpm_old/php$fpm_v/g")
  323. fi
  324. fi
  325. # Defining default software stack
  326. set_default_value 'nginx' 'yes'
  327. set_default_value 'apache' 'yes'
  328. set_default_value 'phpfpm' 'yes'
  329. set_default_value 'multiphp' 'no'
  330. set_default_value 'vsftpd' 'yes'
  331. set_default_value 'proftpd' 'no'
  332. set_default_value 'named' 'yes'
  333. set_default_value 'mysql' 'yes'
  334. set_default_value 'mysql8' 'no'
  335. set_default_value 'postgresql' 'no'
  336. set_default_value 'exim' 'yes'
  337. set_default_value 'dovecot' 'yes'
  338. set_default_value 'sieve' 'no'
  339. if [ $memory -lt 1500000 ]; then
  340. set_default_value 'clamd' 'no'
  341. set_default_value 'spamd' 'no'
  342. elif [ $memory -lt 3000000 ]; then
  343. set_default_value 'clamd' 'no'
  344. set_default_value 'spamd' 'yes'
  345. else
  346. set_default_value 'clamd' 'yes'
  347. set_default_value 'spamd' 'yes'
  348. fi
  349. set_default_value 'iptables' 'yes'
  350. set_default_value 'fail2ban' 'yes'
  351. set_default_value 'quota' 'no'
  352. set_default_value 'webterminal' 'no'
  353. set_default_value 'interactive' 'yes'
  354. set_default_value 'api' 'yes'
  355. set_default_port '8083'
  356. set_default_lang 'en'
  357. # Checking software conflicts
  358. if [ "$proftpd" = 'yes' ]; then
  359. vsftpd='no'
  360. fi
  361. if [ "$exim" = 'no' ]; then
  362. clamd='no'
  363. spamd='no'
  364. dovecot='no'
  365. fi
  366. if [ "$dovecot" = 'no' ]; then
  367. sieve='no'
  368. fi
  369. if [ "$iptables" = 'no' ]; then
  370. fail2ban='no'
  371. fi
  372. if [ "$apache" = 'no' ]; then
  373. phpfpm='yes'
  374. fi
  375. if [ "$mysql" = 'yes' ] && [ "$mysql8" = 'yes' ]; then
  376. mysql='no'
  377. fi
  378. if [ "$mysql8" = 'yes' ] && [ "$architecture" = 'aarch64' ]; then
  379. check_result 1 "Mysql 8 does not support ARM64 yet for Debian please use Ubuntu. Unable to continue"
  380. fi
  381. # Checking root permissions
  382. if [ "x$(id -u)" != 'x0' ]; then
  383. check_result 1 "Script can be run executed only by root"
  384. fi
  385. if [ -d "/usr/local/hestia" ]; then
  386. check_result 1 "Hestia install detected. Unable to continue"
  387. fi
  388. # Clear the screen once launch permissions have been verified
  389. clear
  390. # Configure apt to retry downloading on error
  391. if [ ! -f /etc/apt/apt.conf.d/80-retries ]; then
  392. echo "APT::Acquire::Retries \"3\";" > /etc/apt/apt.conf.d/80-retries
  393. fi
  394. # Welcome message
  395. echo "Welcome to the Hestia Control Panel installer!"
  396. echo
  397. echo "Please wait, the installer is now checking for missing dependencies..."
  398. echo
  399. # Update apt repository
  400. apt-get -qq update
  401. # Creating backup directory
  402. mkdir -p "$hst_backups"
  403. # Pre-install packages
  404. echo "[ * ] Installing dependencies..."
  405. apt-get -y install $installer_dependencies >> $LOG
  406. check_result $? "Package installation failed, check log file for more details."
  407. # Check if apparmor is installed
  408. if [ $(dpkg-query -W -f='${Status}' apparmor 2> /dev/null | grep -c "ok installed") -eq 0 ]; then
  409. apparmor='no'
  410. else
  411. apparmor='yes'
  412. fi
  413. # Check repository availability
  414. wget --quiet "https://$RHOST" -O /dev/null
  415. check_result $? "Unable to connect to the Hestia APT repository"
  416. # Check installed packages
  417. tmpfile=$(mktemp -p /tmp)
  418. dpkg --get-selections > $tmpfile
  419. conflicts_pkg="exim4 mariadb-server apache2 nginx hestia postfix"
  420. # Drop postfix from the list if exim should not be installed
  421. if [ "$exim" = 'no' ]; then
  422. conflicts_pkg=$(echo $conflicts_pkg | sed 's/postfix//g' | xargs)
  423. fi
  424. for pkg in $conflicts_pkg; do
  425. if [ -n "$(grep $pkg $tmpfile)" ]; then
  426. conflicts="$pkg* $conflicts"
  427. fi
  428. done
  429. rm -f $tmpfile
  430. if [ -n "$conflicts" ] && [ -z "$force" ]; then
  431. echo '!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!'
  432. echo
  433. echo 'WARNING: The following packages are already installed'
  434. echo "$conflicts"
  435. echo
  436. echo 'It is highly recommended that you remove them before proceeding.'
  437. echo
  438. echo '!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!'
  439. echo
  440. read -p 'Would you like to remove the conflicting packages? [y/N] ' answer
  441. if [ "$answer" = 'y' ] || [ "$answer" = 'Y' ]; then
  442. apt-get -qq purge $conflicts -y
  443. check_result $? 'apt-get remove failed'
  444. unset $answer
  445. else
  446. check_result 1 "Hestia Control Panel should be installed on a clean server."
  447. fi
  448. fi
  449. # Check network configuration
  450. if [ -d /etc/netplan ] && [ -z "$force" ]; then
  451. if [ -z "$(ls -A /etc/netplan)" ]; then
  452. echo '!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!'
  453. echo
  454. echo 'WARNING: Your network configuration may not be set up correctly.'
  455. echo 'Details: The netplan configuration directory is empty.'
  456. echo ''
  457. echo 'You may have a network configuration file that was created using'
  458. echo 'systemd-networkd.'
  459. echo ''
  460. echo 'It is strongly recommended to migrate to netplan, which is now the'
  461. echo 'default network configuration system in newer releases of Ubuntu.'
  462. echo ''
  463. echo 'While you can leave your configuration as-is, please note that you'
  464. echo 'will not be able to use additional IPs properly.'
  465. echo ''
  466. echo 'If you wish to continue and force the installation,'
  467. echo 'run this script with -f option:'
  468. echo "Example: bash $0 --force"
  469. echo
  470. echo '!!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!'
  471. echo
  472. check_result 1 "Unable to detect netplan configuration."
  473. fi
  474. fi
  475. # Validate whether installation script matches release version before continuing with install
  476. if [ -z "$withdebs" ] || [ ! -d "$withdebs" ]; then
  477. release_branch_ver=$(curl -s https://raw.githubusercontent.com/hestiacp/hestiacp/release/src/deb/hestia/control | grep "Version:" | awk '{print $2}')
  478. if [ "$HESTIA_INSTALL_VER" != "$release_branch_ver" ]; then
  479. echo
  480. echo -e "\e[91mInstallation aborted\e[0m"
  481. echo "===================================================================="
  482. echo -e "\e[33mERROR: Install script version does not match package version!\e[0m"
  483. echo -e "\e[33mPlease download the installer from the release branch in order to continue:\e[0m"
  484. echo ""
  485. echo -e "\e[33mhttps://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh\e[0m"
  486. echo ""
  487. echo -e "\e[33mTo test pre-release versions, build the .deb packages and re-run the installer:\e[0m"
  488. echo -e " \e[33m./hst_autocompile.sh \e[1m--hestia branchname no\e[21m\e[0m"
  489. echo -e " \e[33m./hst-install.sh .. \e[1m--with-debs /tmp/hestiacp-src/debs\e[21m\e[0m"
  490. echo ""
  491. check_result 1 "Installation aborted"
  492. fi
  493. fi
  494. case $architecture in
  495. x86_64)
  496. ARCH="amd64"
  497. ;;
  498. aarch64)
  499. ARCH="arm64"
  500. ;;
  501. *)
  502. echo
  503. echo -e "\e[91mInstallation aborted\e[0m"
  504. echo "===================================================================="
  505. echo -e "\e[33mERROR: $architecture is currently not supported!\e[0m"
  506. echo -e "\e[33mPlease verify the achitecture used is currenlty supported\e[0m"
  507. echo ""
  508. echo -e "\e[33mhttps://github.com/hestiacp/hestiacp/blob/main/README.md\e[0m"
  509. echo ""
  510. check_result 1 "Installation aborted"
  511. ;;
  512. esac
  513. #----------------------------------------------------------#
  514. # Brief Info #
  515. #----------------------------------------------------------#
  516. install_welcome_message() {
  517. DISPLAY_VER=$(echo $HESTIA_INSTALL_VER | sed "s|~alpha||g" | sed "s|~beta||g")
  518. echo
  519. echo ' _ _ _ _ ____ ____ '
  520. echo ' | | | | ___ ___| |_(_) __ _ / ___| _ \ '
  521. echo ' | |_| |/ _ \/ __| __| |/ _` | | | |_) | '
  522. echo ' | _ | __/\__ \ |_| | (_| | |___| __/ '
  523. echo ' |_| |_|\___||___/\__|_|\__,_|\____|_| '
  524. echo " "
  525. echo " Hestia Control Panel "
  526. if [[ "$HESTIA_INSTALL_VER" =~ "beta" ]]; then
  527. echo " BETA RELEASE "
  528. fi
  529. if [[ "$HESTIA_INSTALL_VER" =~ "alpha" ]]; then
  530. echo " DEVELOPMENT SNAPSHOT "
  531. echo " NOT INTENDED FOR PRODUCTION USE "
  532. echo " USE AT YOUR OWN RISK "
  533. fi
  534. echo " ${DISPLAY_VER} "
  535. echo " www.hestiacp.com "
  536. echo
  537. echo "========================================================================"
  538. echo
  539. echo "Thank you for downloading Hestia Control Panel! In a few moments,"
  540. echo "we will begin installing the following components on your server:"
  541. echo
  542. }
  543. # Printing nice ASCII logo
  544. clear
  545. install_welcome_message
  546. # Web stack
  547. echo ' - NGINX Web / Proxy Server'
  548. if [ "$apache" = 'yes' ]; then
  549. echo ' - Apache Web Server (as backend)'
  550. fi
  551. if [ "$phpfpm" = 'yes' ] && [ "$multiphp" = 'no' ]; then
  552. echo ' - PHP-FPM Application Server'
  553. fi
  554. if [ "$multiphp" = 'yes' ]; then
  555. phpfpm='yes'
  556. echo -n ' - Multi-PHP Environment: Version'
  557. for version in "${multiphp_v[@]}"; do
  558. echo -n " php$version"
  559. done
  560. echo ''
  561. fi
  562. # DNS stack
  563. if [ "$named" = 'yes' ]; then
  564. echo ' - Bind DNS Server'
  565. fi
  566. # Mail stack
  567. if [ "$exim" = 'yes' ]; then
  568. echo -n ' - Exim Mail Server'
  569. if [ "$clamd" = 'yes' ] || [ "$spamd" = 'yes' ]; then
  570. echo -n ' + '
  571. if [ "$clamd" = 'yes' ]; then
  572. echo -n 'ClamAV '
  573. fi
  574. if [ "$spamd" = 'yes' ]; then
  575. if [ "$clamd" = 'yes' ]; then
  576. echo -n '+ '
  577. fi
  578. echo -n 'SpamAssassin'
  579. fi
  580. fi
  581. echo
  582. if [ "$dovecot" = 'yes' ]; then
  583. echo -n ' - Dovecot POP3/IMAP Server'
  584. if [ "$sieve" = 'yes' ]; then
  585. echo -n '+ Sieve'
  586. fi
  587. fi
  588. fi
  589. echo
  590. # Database stack
  591. if [ "$mysql" = 'yes' ]; then
  592. echo ' - MariaDB Database Server'
  593. fi
  594. if [ "$mysql8" = 'yes' ]; then
  595. echo ' - MySQL8 Database Server'
  596. fi
  597. if [ "$postgresql" = 'yes' ]; then
  598. echo ' - PostgreSQL Database Server'
  599. fi
  600. # FTP stack
  601. if [ "$vsftpd" = 'yes' ]; then
  602. echo ' - Vsftpd FTP Server'
  603. fi
  604. if [ "$proftpd" = 'yes' ]; then
  605. echo ' - ProFTPD FTP Server'
  606. fi
  607. if [ "$webterminal" = 'yes' ]; then
  608. echo ' - Web terminal'
  609. fi
  610. # Firewall stack
  611. if [ "$iptables" = 'yes' ]; then
  612. echo -n ' - Firewall (iptables)'
  613. fi
  614. if [ "$iptables" = 'yes' ] && [ "$fail2ban" = 'yes' ]; then
  615. echo -n ' + Fail2Ban Access Monitor'
  616. fi
  617. echo -e "\n"
  618. echo "========================================================================"
  619. echo -e "\n"
  620. # Asking for confirmation to proceed
  621. if [ "$interactive" = 'yes' ]; then
  622. read -p 'Would you like to continue with the installation? [y/N]: ' answer
  623. if [ "$answer" != 'y' ] && [ "$answer" != 'Y' ]; then
  624. echo 'Goodbye'
  625. exit 1
  626. fi
  627. fi
  628. #Validate Username / Password / Email / Hostname even when interactive = no
  629. if [ -z "$username" ]; then
  630. while validate_username; do
  631. read -p 'Please enter administrator username: ' username
  632. done
  633. else
  634. if validate_username; then
  635. exit 1
  636. fi
  637. fi
  638. #Ask for the password
  639. if [ -z "$vpass" ]; then
  640. while validate_password; do
  641. read -p 'Please enter administrator password: ' vpass
  642. done
  643. else
  644. if validate_password; then
  645. echo "Please use a valid password"
  646. exit 1
  647. fi
  648. fi
  649. # Validate Email / Hostname even when interactive = no
  650. # Asking for contact email
  651. if [ -z "$email" ]; then
  652. while validate_email; do
  653. echo -e "\nPlease use a valid emailadress (ex. info@domain.tld)."
  654. read -p 'Please enter admin email address: ' email
  655. done
  656. else
  657. if validate_email; then
  658. echo "Please use a valid emailadress (ex. info@domain.tld)."
  659. exit 1
  660. fi
  661. fi
  662. # Asking to set FQDN hostname
  663. if [ -z "$servername" ]; then
  664. # Ask and validate FQDN hostname.
  665. read -p "Please enter FQDN hostname [$(hostname -f)]: " servername
  666. # Set hostname if it wasn't set
  667. if [ -z "$servername" ]; then
  668. servername=$(hostname -f)
  669. fi
  670. # Validate Hostname, go to loop if the validation fails.
  671. while validate_hostname; do
  672. echo -e "\nPlease use a valid hostname according to RFC1178 (ex. hostname.domain.tld)."
  673. read -p "Please enter FQDN hostname [$(hostname -f)]: " servername
  674. done
  675. else
  676. # Validate FQDN hostname if it is preset
  677. if validate_hostname; then
  678. echo "Please use a valid hostname according to RFC1178 (ex. hostname.domain.tld)."
  679. exit 1
  680. fi
  681. fi
  682. # Generating admin password if it wasn't set
  683. displaypass="The password you chose during installation."
  684. if [ -z "$vpass" ]; then
  685. vpass=$(gen_pass)
  686. displaypass=$vpass
  687. fi
  688. # Set FQDN if it wasn't set
  689. mask1='(([[:alnum:]](-?[[:alnum:]])*)\.)'
  690. mask2='*[[:alnum:]](-?[[:alnum:]])+\.[[:alnum:]]{2,}'
  691. if ! [[ "$servername" =~ ^${mask1}${mask2}$ ]]; then
  692. if [[ -n "$servername" ]]; then
  693. servername="$servername.example.com"
  694. else
  695. servername="example.com"
  696. fi
  697. echo "127.0.0.1 $servername" >> /etc/hosts
  698. fi
  699. if [[ -z $(grep -i "$servername" /etc/hosts) ]]; then
  700. echo "127.0.0.1 $servername" >> /etc/hosts
  701. fi
  702. # Set email if it wasn't set
  703. if [[ -z "$email" ]]; then
  704. email="admin@$servername"
  705. fi
  706. # Defining backup directory
  707. echo -e "Installation backup directory: $hst_backups"
  708. # Print Log File Path
  709. echo "Installation log file: $LOG"
  710. # Print new line
  711. echo
  712. #----------------------------------------------------------#
  713. # Checking swap #
  714. #----------------------------------------------------------#
  715. # Checking swap on small instances
  716. if [ -z "$(swapon -s)" ] && [ "$memory" -lt 1000000 ]; then
  717. fallocate -l 1G /swapfile
  718. chmod 600 /swapfile
  719. mkswap /swapfile
  720. swapon /swapfile
  721. echo "/swapfile none swap sw 0 0" >> /etc/fstab
  722. fi
  723. #----------------------------------------------------------#
  724. # Install repository #
  725. #----------------------------------------------------------#
  726. # Define apt conf location
  727. apt=/etc/apt/sources.list.d
  728. # Create new folder if not all-ready exists
  729. mkdir -p /root/.gnupg/ && chmod 700 /root/.gnupg/
  730. # Updating system
  731. echo "Adding required repositories to proceed with installation:"
  732. echo
  733. # Installing Nginx repo
  734. echo "[ * ] NGINX"
  735. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://nginx.org/packages/mainline/$VERSION/ $codename nginx" > $apt/nginx.list
  736. curl -s https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-keyring.gpg > /dev/null 2>&1
  737. # Installing sury PHP repo
  738. echo "[ * ] PHP"
  739. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/sury-keyring.gpg] https://packages.sury.org/php/ $codename main" > $apt/php.list
  740. curl -s https://packages.sury.org/php/apt.gpg | gpg --dearmor | tee /usr/share/keyrings/sury-keyring.gpg > /dev/null 2>&1
  741. # Installing sury Apache2 repo
  742. if [ "$apache" = 'yes' ]; then
  743. echo "[ * ] Apache2"
  744. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/apache2-keyring.gpg] https://packages.sury.org/apache2/ $codename main" > $apt/apache2.list
  745. curl -s https://packages.sury.org/apache2/apt.gpg | gpg --dearmor | tee /usr/share/keyrings/apache2-keyring.gpg > /dev/null 2>&1
  746. fi
  747. # Installing MariaDB repo
  748. if [ "$mysql" = 'yes' ]; then
  749. if [ "$release" != '12' ]; then
  750. echo "[ * ] MariaDB"
  751. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/mariadb-keyring.gpg] https://dlm.mariadb.com/repo/mariadb-server/$mariadb_v/repo/$VERSION $codename main" > $apt/mariadb.list
  752. curl -s https://mariadb.org/mariadb_release_signing_key.asc | gpg --dearmor | tee /usr/share/keyrings/mariadb-keyring.gpg > /dev/null 2>&1
  753. else
  754. echo "[ * ] MariaDB"
  755. echo "#deb [arch=$ARCH signed-by=/usr/share/keyrings/mariadb-keyring.gpg] https://dlm.mariadb.com/repo/mariadb-server/$mariadb_v/repo/$VERSION $codename main" > $apt/mariadb.list
  756. curl -s https://mariadb.org/mariadb_release_signing_key.asc | gpg --dearmor | tee /usr/share/keyrings/mariadb-keyring.gpg > /dev/null 2>&1
  757. fi
  758. fi
  759. # Installing Mysql8 repo
  760. if [ "$mysql8" = 'yes' ]; then
  761. echo "[ * ] Mysql 8"
  762. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ $codename mysql-apt-config" >> /etc/apt/sources.list.d/mysql.list
  763. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ $codename mysql-8.0" >> /etc/apt/sources.list.d/mysql.list
  764. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ $codename mysql-tools" >> /etc/apt/sources.list.d/mysql.list
  765. echo "#deb [arch=$ARCH signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ $codename mysql-tools-preview" >> /etc/apt/sources.list.d/mysql.list
  766. echo "deb-src [arch=$ARCH signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ $codename mysql-8.0" >> /etc/apt/sources.list.d/mysql.list
  767. GNUPGHOME="$(mktemp -d)"
  768. export GNUPGHOME
  769. for keyserver in $(shuf -e ha.pool.sks-keyservers.net hkp://p80.pool.sks-keyservers.net:80 keyserver.ubuntu.com hkp://keyserver.ubuntu.com:80); do
  770. gpg --no-default-keyring --keyring /usr/share/keyrings/mysql-keyring.gpg --keyserver "${keyserver}" --recv-keys "B7B3B788A8D3785C" > /dev/null 2>&1 && break
  771. done
  772. fi
  773. # Installing HestiaCP repo
  774. echo "[ * ] Hestia Control Panel"
  775. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/hestia-keyring.gpg] https://$RHOST/ $codename main" > $apt/hestia.list
  776. gpg --no-default-keyring --keyring /usr/share/keyrings/hestia-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys A189E93654F0B0E5 > /dev/null 2>&1
  777. # Installing Node.js 20.x repo
  778. echo "[ * ] Node.js 20.x"
  779. echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x $codename main" > $apt/nodesource.list
  780. echo "deb-src [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x $codename main" >> $apt/nodesource.list
  781. curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | tee /usr/share/keyrings/nodesource.gpg > /dev/null 2>&1
  782. # Installing PostgreSQL repo
  783. if [ "$postgresql" = 'yes' ]; then
  784. echo "[ * ] PostgreSQL"
  785. echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/postgresql-keyring.gpg] https://apt.postgresql.org/pub/repos/apt/ $codename-pgdg main" > $apt/postgresql.list
  786. curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/postgresql-keyring.gpg > /dev/null 2>&1
  787. fi
  788. # Echo for a new line
  789. echo
  790. # Updating system
  791. echo -ne "Updating currently installed packages, please wait... "
  792. apt-get -qq update
  793. apt-get -y upgrade >> $LOG &
  794. BACK_PID=$!
  795. # Check if package installation is done, print a spinner
  796. spin_i=1
  797. while kill -0 $BACK_PID > /dev/null 2>&1; do
  798. printf "\b${spinner:spin_i++%${#spinner}:1}"
  799. sleep 0.5
  800. done
  801. # Do a blank echo to get the \n back
  802. echo
  803. # Check Installation result
  804. wait $BACK_PID
  805. check_result $? 'apt-get upgrade failed'
  806. #----------------------------------------------------------#
  807. # Backup #
  808. #----------------------------------------------------------#
  809. # Creating backup directory tree
  810. mkdir -p $hst_backups
  811. cd $hst_backups
  812. mkdir nginx apache2 php vsftpd proftpd bind exim4 dovecot clamd
  813. mkdir spamassassin mysql postgresql openssl hestia
  814. # Backup OpenSSL configuration
  815. cp /etc/ssl/openssl.cnf $hst_backups/openssl > /dev/null 2>&1
  816. # Backup nginx configuration
  817. systemctl stop nginx > /dev/null 2>&1
  818. cp -r /etc/nginx/* $hst_backups/nginx > /dev/null 2>&1
  819. # Backup Apache configuration
  820. systemctl stop apache2 > /dev/null 2>&1
  821. cp -r /etc/apache2/* $hst_backups/apache2 > /dev/null 2>&1
  822. rm -f /etc/apache2/conf.d/* > /dev/null 2>&1
  823. # Backup PHP-FPM configuration
  824. systemctl stop php*-fpm > /dev/null 2>&1
  825. cp -r /etc/php/* $hst_backups/php > /dev/null 2>&1
  826. # Backup Bind configuration
  827. systemctl stop bind9 > /dev/null 2>&1
  828. cp -r /etc/bind/* $hst_backups/bind > /dev/null 2>&1
  829. # Backup Vsftpd configuration
  830. systemctl stop vsftpd > /dev/null 2>&1
  831. cp /etc/vsftpd.conf $hst_backups/vsftpd > /dev/null 2>&1
  832. # Backup ProFTPD configuration
  833. systemctl stop proftpd > /dev/null 2>&1
  834. cp /etc/proftpd/* $hst_backups/proftpd > /dev/null 2>&1
  835. # Backup Exim configuration
  836. systemctl stop exim4 > /dev/null 2>&1
  837. cp -r /etc/exim4/* $hst_backups/exim4 > /dev/null 2>&1
  838. # Backup ClamAV configuration
  839. systemctl stop clamav-daemon > /dev/null 2>&1
  840. cp -r /etc/clamav/* $hst_backups/clamav > /dev/null 2>&1
  841. # Backup SpamAssassin configuration
  842. systemctl stop spamassassin > /dev/null 2>&1
  843. cp -r /etc/spamassassin/* $hst_backups/spamassassin > /dev/null 2>&1
  844. # Backup Dovecot configuration
  845. systemctl stop dovecot > /dev/null 2>&1
  846. cp /etc/dovecot.conf $hst_backups/dovecot > /dev/null 2>&1
  847. cp -r /etc/dovecot/* $hst_backups/dovecot > /dev/null 2>&1
  848. # Backup MySQL/MariaDB configuration and data
  849. systemctl stop mysql > /dev/null 2>&1
  850. killall -9 mysqld > /dev/null 2>&1
  851. mv /var/lib/mysql $hst_backups/mysql/mysql_datadir > /dev/null 2>&1
  852. cp -r /etc/mysql/* $hst_backups/mysql > /dev/null 2>&1
  853. mv -f /root/.my.cnf $hst_backups/mysql > /dev/null 2>&1
  854. # Backup Hestia
  855. systemctl stop hestia > /dev/null 2>&1
  856. cp -r $HESTIA/* $hst_backups/hestia > /dev/null 2>&1
  857. apt-get -y purge hestia hestia-nginx hestia-php > /dev/null 2>&1
  858. rm -rf $HESTIA > /dev/null 2>&1
  859. #----------------------------------------------------------#
  860. # Package Includes #
  861. #----------------------------------------------------------#
  862. if [ "$phpfpm" = 'yes' ]; then
  863. fpm="php$fpm_v php$fpm_v-common php$fpm_v-bcmath php$fpm_v-cli
  864. php$fpm_v-curl php$fpm_v-fpm php$fpm_v-gd php$fpm_v-intl
  865. php$fpm_v-mysql php$fpm_v-soap php$fpm_v-xml php$fpm_v-zip
  866. php$fpm_v-mbstring php$fpm_v-bz2 php$fpm_v-pspell
  867. php$fpm_v-imagick"
  868. software="$software $fpm"
  869. fi
  870. #----------------------------------------------------------#
  871. # Package Excludes #
  872. #----------------------------------------------------------#
  873. # Excluding packages
  874. software=$(echo "$software" | sed -e "s/apache2.2-common//")
  875. if [ $release -lt 12 ]; then
  876. software=$(echo "$software" | sed -e "s/spamd/spamassassin/g")
  877. fi
  878. if [ "$apache" = 'no' ]; then
  879. software=$(echo "$software" | sed -e "s/apache2 //")
  880. software=$(echo "$software" | sed -e "s/apache2-bin//")
  881. software=$(echo "$software" | sed -e "s/apache2-utils//")
  882. software=$(echo "$software" | sed -e "s/apache2-suexec-custom//")
  883. software=$(echo "$software" | sed -e "s/apache2.2-common//")
  884. software=$(echo "$software" | sed -e "s/libapache2-mod-rpaf//")
  885. software=$(echo "$software" | sed -e "s/libapache2-mod-fcgid//")
  886. software=$(echo "$software" | sed -e "s/libapache2-mod-php$fpm_v//")
  887. fi
  888. if [ "$vsftpd" = 'no' ]; then
  889. software=$(echo "$software" | sed -e "s/vsftpd//")
  890. fi
  891. if [ "$proftpd" = 'no' ]; then
  892. software=$(echo "$software" | sed -e "s/proftpd-basic//")
  893. software=$(echo "$software" | sed -e "s/proftpd-mod-vroot//")
  894. fi
  895. if [ "$named" = 'no' ]; then
  896. software=$(echo "$software" | sed -e "s/bind9//")
  897. fi
  898. if [ "$exim" = 'no' ]; then
  899. software=$(echo "$software" | sed -e "s/exim4 //")
  900. software=$(echo "$software" | sed -e "s/exim4-daemon-heavy//")
  901. software=$(echo "$software" | sed -e "s/dovecot-imapd//")
  902. software=$(echo "$software" | sed -e "s/dovecot-pop3d//")
  903. software=$(echo "$software" | sed -e "s/clamav-daemon//")
  904. software=$(echo "$software" | sed -e "s/spamassassin//")
  905. software=$(echo "$software" | sed -e "s/dovecot-sieve//")
  906. software=$(echo "$software" | sed -e "s/dovecot-managesieved//")
  907. fi
  908. if [ "$clamd" = 'no' ]; then
  909. software=$(echo "$software" | sed -e "s/clamav-daemon//")
  910. fi
  911. if [ "$spamd" = 'no' ]; then
  912. software=$(echo "$software" | sed -e "s/spamassassin//")
  913. software=$(echo "$software" | sed -e "s/spamd//")
  914. fi
  915. if [ "$dovecot" = 'no' ]; then
  916. software=$(echo "$software" | sed -e "s/dovecot-imapd//")
  917. software=$(echo "$software" | sed -e "s/dovecot-pop3d//")
  918. fi
  919. if [ "$sieve" = 'no' ]; then
  920. software=$(echo "$software" | sed -e "s/dovecot-sieve//")
  921. software=$(echo "$software" | sed -e "s/dovecot-managesieved//")
  922. fi
  923. if [ "$mysql" = 'no' ]; then
  924. software=$(echo "$software" | sed -e "s/mariadb-server//")
  925. software=$(echo "$software" | sed -e "s/mariadb-client//")
  926. software=$(echo "$software" | sed -e "s/mariadb-common//")
  927. fi
  928. if [ "$mysql8" = 'no' ]; then
  929. software=$(echo "$software" | sed -e "s/mysql-server//")
  930. software=$(echo "$software" | sed -e "s/mysql-client//")
  931. software=$(echo "$software" | sed -e "s/mysql-common//")
  932. fi
  933. if [ "$mysql" = 'no' ] && [ "$mysql8" = 'no' ]; then
  934. software=$(echo "$software" | sed -e "s/php$fpm_v-mysql//")
  935. fi
  936. if [ "$postgresql" = 'no' ]; then
  937. software=$(echo "$software" | sed -e "s/postgresql-contrib//")
  938. software=$(echo "$software" | sed -e "s/postgresql//")
  939. software=$(echo "$software" | sed -e "s/php$fpm_v-pgsql//")
  940. fi
  941. if [ "$fail2ban" = 'no' ]; then
  942. software=$(echo "$software" | sed -e "s/fail2ban//")
  943. fi
  944. if [ "$iptables" = 'no' ]; then
  945. software=$(echo "$software" | sed -e "s/ipset//")
  946. software=$(echo "$software" | sed -e "s/fail2ban//")
  947. fi
  948. if [ "$webterminal" = 'no' ]; then
  949. software=$(echo "$software" | sed -e "s/nodejs//")
  950. software=$(echo "$software" | sed -e "s/hestia-web-terminal//")
  951. fi
  952. if [ "$phpfpm" = 'yes' ]; then
  953. software=$(echo "$software" | sed -e "s/php$fpm_v-cgi//")
  954. software=$(echo "$software" | sed -e "s/libapache2-mpm-itk//")
  955. software=$(echo "$software" | sed -e "s/libapache2-mod-ruid2//")
  956. software=$(echo "$software" | sed -e "s/libapache2-mod-php$fpm_v//")
  957. fi
  958. if [ -d "$withdebs" ]; then
  959. software=$(echo "$software" | sed -e "s/hestia-nginx//")
  960. software=$(echo "$software" | sed -e "s/hestia-php//")
  961. software=$(echo "$software" | sed -e "s/hestia-web-terminal//")
  962. software=$(echo "$software" | sed -e "s/hestia=${HESTIA_INSTALL_VER}//")
  963. fi
  964. #----------------------------------------------------------#
  965. # Install packages #
  966. #----------------------------------------------------------#
  967. # Enable en_US.UTF-8
  968. sed -i "s/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g" /etc/locale.gen
  969. locale-gen > /dev/null 2>&1
  970. # Disabling daemon autostart on apt-get install
  971. echo -e '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d
  972. chmod a+x /usr/sbin/policy-rc.d
  973. # Installing apt packages
  974. echo "The installer is now downloading and installing all required packages."
  975. echo -ne "NOTE: This process may take 10 to 15 minutes to complete, please wait... "
  976. echo
  977. apt-get -y install $software > $LOG
  978. BACK_PID=$!
  979. # Check if package installation is done, print a spinner
  980. spin_i=1
  981. while kill -0 $BACK_PID > /dev/null 2>&1; do
  982. printf "\b${spinner:spin_i++%${#spinner}:1}"
  983. sleep 0.5
  984. done
  985. # Do a blank echo to get the \n back
  986. echo
  987. # Check Installation result
  988. wait $BACK_PID
  989. check_result $? "apt-get install failed"
  990. echo
  991. echo "========================================================================"
  992. echo
  993. # Install Hestia packages from local folder
  994. if [ -n "$withdebs" ] && [ -d "$withdebs" ]; then
  995. echo "[ * ] Installing local package files..."
  996. echo " - hestia core package"
  997. dpkg -i $withdebs/hestia_*.deb > /dev/null 2>&1
  998. if [ -z $(ls $withdebs/hestia-php_*.deb 2> /dev/null) ]; then
  999. echo " - hestia-php backend package (from apt)"
  1000. apt-get -y install hestia-php > /dev/null 2>&1
  1001. else
  1002. echo " - hestia-php backend package"
  1003. dpkg -i $withdebs/hestia-php_*.deb > /dev/null 2>&1
  1004. fi
  1005. if [ -z $(ls $withdebs/hestia-nginx_*.deb 2> /dev/null) ]; then
  1006. echo " - hestia-nginx backend package (from apt)"
  1007. apt-get -y install hestia-nginx > /dev/null 2>&1
  1008. else
  1009. echo " - hestia-nginx backend package"
  1010. dpkg -i $withdebs/hestia-nginx_*.deb > /dev/null 2>&1
  1011. fi
  1012. if [ "$webterminal" = "yes" ]; then
  1013. if [ -z $(ls $withdebs/hestia-web-terminal_*.deb 2> /dev/null) ]; then
  1014. echo " - hestia-web-terminal package (from apt)"
  1015. apt-get -y install hestia-web-terminal > /dev/null 2>&1
  1016. else
  1017. echo " - hestia-web-terminal"
  1018. dpkg -i $withdebs/hestia-web-terminal_*.deb > /dev/null 2>&1
  1019. fi
  1020. fi
  1021. fi
  1022. # Restoring autostart policy
  1023. rm -f /usr/sbin/policy-rc.d
  1024. #----------------------------------------------------------#
  1025. # Configure system #
  1026. #----------------------------------------------------------#
  1027. echo "[ * ] Configuring system settings..."
  1028. # Generate a random password
  1029. random_password=$(gen_pass '32')
  1030. # Create the new hestiaweb user
  1031. /usr/sbin/useradd "hestiaweb" -c "$email" --no-create-home
  1032. # do not allow login into hestiaweb user
  1033. echo hestiaweb:$random_password | sudo chpasswd -e
  1034. # Create user for php-fpm configs
  1035. /usr/sbin/useradd "hestiamail" -c "$email" --no-create-home
  1036. # Enable SFTP subsystem for SSH
  1037. sftp_subsys_enabled=$(grep -iE "^#?.*subsystem.+(sftp )?sftp-server" /etc/ssh/sshd_config)
  1038. if [ -n "$sftp_subsys_enabled" ]; then
  1039. sed -i -E "s/^#?.*Subsystem.+(sftp )?sftp-server/Subsystem sftp internal-sftp/g" /etc/ssh/sshd_config
  1040. fi
  1041. # Reduce SSH login grace time
  1042. sed -i "s/[#]LoginGraceTime [[:digit:]]m/LoginGraceTime 1m/g" /etc/ssh/sshd_config
  1043. # Disable SSH suffix broadcast
  1044. if [ -z "$(grep "^DebianBanner no" /etc/ssh/sshd_config)" ]; then
  1045. sed -i '/^[#]Banner .*/a DebianBanner no' /etc/ssh/sshd_config
  1046. if [ -z "$(grep "^DebianBanner no" /etc/ssh/sshd_config)" ]; then
  1047. # If first attempt fails just add it
  1048. echo '' >> /etc/ssh/sshd_config
  1049. echo 'DebianBanner no' >> /etc/ssh/sshd_config
  1050. fi
  1051. fi
  1052. # Restart SSH daemon
  1053. systemctl restart ssh
  1054. # Disable AWStats cron
  1055. rm -f /etc/cron.d/awstats
  1056. # Replace awstatst function
  1057. cp -f $HESTIA_INSTALL_DIR/logrotate/httpd-prerotate/* /etc/logrotate.d/httpd-prerotate/
  1058. # Set directory color
  1059. if [ -z "$(grep 'LS_COLORS="$LS_COLORS:di=00;33"' /etc/profile)" ]; then
  1060. echo 'LS_COLORS="$LS_COLORS:di=00;33"' >> /etc/profile
  1061. fi
  1062. # Register /sbin/nologin and /usr/sbin/nologin
  1063. if [ -z "$(grep ^/sbin/nologin /etc/shells)" ]; then
  1064. echo "/sbin/nologin" >> /etc/shells
  1065. fi
  1066. if [ -z "$(grep ^/usr/sbin/nologin /etc/shells)" ]; then
  1067. echo "/usr/sbin/nologin" >> /etc/shells
  1068. fi
  1069. # Configuring NTP
  1070. if [ ! -f "/etc/default/ntpsec-ntpdate " ]; then
  1071. sed -i 's/#NTP=/NTP=pool.ntp.org/' /etc/systemd/timesyncd.conf
  1072. systemctl enable systemd-timesyncd
  1073. systemctl start systemd-timesyncd
  1074. fi
  1075. # Restrict access to /proc fs
  1076. # - Prevent unpriv users from seeing each other running processes
  1077. mount -o remount,defaults,hidepid=2 /proc > /dev/null 2>&1
  1078. if [ $? -ne 0 ]; then
  1079. echo "Info: Cannot remount /proc (LXC containers require additional perm added to host apparmor profile)"
  1080. else
  1081. echo "@reboot root sleep 5 && mount -o remount,defaults,hidepid=2 /proc" > /etc/cron.d/hestia-proc
  1082. fi
  1083. #----------------------------------------------------------#
  1084. # Configure Hestia #
  1085. #----------------------------------------------------------#
  1086. echo "[ * ] Configuring Hestia Control Panel..."
  1087. # Installing sudo configuration
  1088. mkdir -p /etc/sudoers.d
  1089. cp -f $HESTIA_COMMON_DIR/sudo/hestiaweb /etc/sudoers.d/
  1090. chmod 440 /etc/sudoers.d/hestiaweb
  1091. # Add Hestia global config
  1092. if [[ ! -e /etc/hestiacp/hestia.conf ]]; then
  1093. mkdir -p /etc/hestiacp
  1094. echo -e "# Do not edit this file, will get overwritten on next upgrade, use /etc/hestiacp/local.conf instead\n\nexport HESTIA='/usr/local/hestia'\n\n[[ -f /etc/hestiacp/local.conf ]] && source /etc/hestiacp/local.conf" > /etc/hestiacp/hestia.conf
  1095. fi
  1096. # Configuring system env
  1097. echo "export HESTIA='$HESTIA'" > /etc/profile.d/hestia.sh
  1098. echo 'PATH=$PATH:'$HESTIA'/bin' >> /etc/profile.d/hestia.sh
  1099. echo 'export PATH' >> /etc/profile.d/hestia.sh
  1100. chmod 755 /etc/profile.d/hestia.sh
  1101. source /etc/profile.d/hestia.sh
  1102. # Configuring logrotate for Hestia logs
  1103. cp -f $HESTIA_INSTALL_DIR/logrotate/hestia /etc/logrotate.d/hestia
  1104. # Create log path and symbolic link
  1105. rm -f /var/log/hestia
  1106. mkdir -p /var/log/hestia
  1107. ln -s /var/log/hestia $HESTIA/log
  1108. # Building directory tree and creating some blank files for Hestia
  1109. mkdir -p $HESTIA/conf $HESTIA/ssl $HESTIA/data/ips \
  1110. $HESTIA/data/queue $HESTIA/data/users $HESTIA/data/firewall \
  1111. $HESTIA/data/sessions
  1112. touch $HESTIA/data/queue/backup.pipe $HESTIA/data/queue/disk.pipe \
  1113. $HESTIA/data/queue/webstats.pipe $HESTIA/data/queue/restart.pipe \
  1114. $HESTIA/data/queue/traffic.pipe $HESTIA/data/queue/daily.pipe $HESTIA/log/system.log \
  1115. $HESTIA/log/nginx-error.log $HESTIA/log/auth.log $HESTIA/log/backup.log
  1116. chmod 750 $HESTIA/conf $HESTIA/data/users $HESTIA/data/ips $HESTIA/log
  1117. chmod -R 750 $HESTIA/data/queue
  1118. chmod 660 /var/log/hestia/*
  1119. chmod 770 $HESTIA/data/sessions
  1120. # Generating Hestia configuration
  1121. rm -f $HESTIA/conf/hestia.conf > /dev/null 2>&1
  1122. touch $HESTIA/conf/hestia.conf
  1123. chmod 660 $HESTIA/conf/hestia.conf
  1124. # Write default port value to hestia.conf
  1125. # If a custom port is specified it will be set at the end of the installation process.
  1126. write_config_value "BACKEND_PORT" "8083"
  1127. # Web stack
  1128. if [ "$apache" = 'yes' ]; then
  1129. write_config_value "WEB_SYSTEM" "apache2"
  1130. write_config_value "WEB_RGROUPS" "www-data"
  1131. write_config_value "WEB_PORT" "8080"
  1132. write_config_value "WEB_SSL_PORT" "8443"
  1133. write_config_value "WEB_SSL" "mod_ssl"
  1134. write_config_value "PROXY_SYSTEM" "nginx"
  1135. write_config_value "PROXY_PORT" "80"
  1136. write_config_value "PROXY_SSL_PORT" "443"
  1137. write_config_value "STATS_SYSTEM" "awstats"
  1138. fi
  1139. if [ "$apache" = 'no' ]; then
  1140. write_config_value "WEB_SYSTEM" "nginx"
  1141. write_config_value "WEB_PORT" "80"
  1142. write_config_value "WEB_SSL_PORT" "443"
  1143. write_config_value "WEB_SSL" "openssl"
  1144. write_config_value "STATS_SYSTEM" "awstats"
  1145. fi
  1146. if [ "$phpfpm" = 'yes' ]; then
  1147. write_config_value "WEB_BACKEND" "php-fpm"
  1148. fi
  1149. # Database stack
  1150. if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
  1151. installed_db_types='mysql'
  1152. fi
  1153. if [ "$postgresql" = 'yes' ]; then
  1154. installed_db_types="$installed_db_types,pgsql"
  1155. fi
  1156. if [ -n "$installed_db_types" ]; then
  1157. db=$(echo "$installed_db_types" \
  1158. | sed "s/,/\n/g" \
  1159. | sort -r -u \
  1160. | sed "/^$/d" \
  1161. | sed ':a;N;$!ba;s/\n/,/g')
  1162. write_config_value "DB_SYSTEM" "$db"
  1163. fi
  1164. # FTP stack
  1165. if [ "$vsftpd" = 'yes' ]; then
  1166. write_config_value "FTP_SYSTEM" "vsftpd"
  1167. fi
  1168. if [ "$proftpd" = 'yes' ]; then
  1169. write_config_value "FTP_SYSTEM" "proftpd"
  1170. fi
  1171. # DNS stack
  1172. if [ "$named" = 'yes' ]; then
  1173. write_config_value "DNS_SYSTEM" "bind9"
  1174. fi
  1175. # Mail stack
  1176. if [ "$exim" = 'yes' ]; then
  1177. write_config_value "MAIL_SYSTEM" "exim4"
  1178. if [ "$clamd" = 'yes' ]; then
  1179. write_config_value "ANTIVIRUS_SYSTEM" "clamav-daemon"
  1180. fi
  1181. if [ "$spamd" = 'yes' ]; then
  1182. if [ "$release" = '10' ] || [ "$release" = '11' ]; then
  1183. write_config_value "ANTISPAM_SYSTEM" "spamassassin"
  1184. else
  1185. write_config_value "ANTISPAM_SYSTEM" "spamd"
  1186. fi
  1187. fi
  1188. if [ "$dovecot" = 'yes' ]; then
  1189. write_config_value "IMAP_SYSTEM" "dovecot"
  1190. fi
  1191. if [ "$sieve" = 'yes' ]; then
  1192. write_config_value "SIEVE_SYSTEM" "yes"
  1193. fi
  1194. fi
  1195. # Cron daemon
  1196. write_config_value "CRON_SYSTEM" "cron"
  1197. # Firewall stack
  1198. if [ "$iptables" = 'yes' ]; then
  1199. write_config_value "FIREWALL_SYSTEM" "iptables"
  1200. fi
  1201. if [ "$iptables" = 'yes' ] && [ "$fail2ban" = 'yes' ]; then
  1202. write_config_value "FIREWALL_EXTENSION" "fail2ban"
  1203. fi
  1204. # Disk quota
  1205. if [ "$quota" = 'yes' ]; then
  1206. write_config_value "DISK_QUOTA" "yes"
  1207. else
  1208. write_config_value "DISK_QUOTA" "no"
  1209. fi
  1210. write_config_value "WEB_TERMINAL_PORT" "8085"
  1211. # Backups
  1212. write_config_value "BACKUP_SYSTEM" "local"
  1213. write_config_value "BACKUP_GZIP" "4"
  1214. write_config_value "BACKUP_MODE" "zstd"
  1215. # Language
  1216. write_config_value "LANGUAGE" "$lang"
  1217. # Login in screen
  1218. write_config_value "LOGIN_STYLE" "default"
  1219. # Theme
  1220. write_config_value "THEME" "dark"
  1221. # Inactive session timeout
  1222. write_config_value "INACTIVE_SESSION_TIMEOUT" "60"
  1223. # Version & Release Branch
  1224. write_config_value "VERSION" "${HESTIA_INSTALL_VER}"
  1225. write_config_value "RELEASE_BRANCH" "release"
  1226. # Email notifications after upgrade
  1227. write_config_value "UPGRADE_SEND_EMAIL" "true"
  1228. write_config_value "UPGRADE_SEND_EMAIL_LOG" "false"
  1229. # Set "root" user
  1230. write_config_value "ROOT_USER" "$username"
  1231. # Installing hosting packages
  1232. cp -rf $HESTIA_COMMON_DIR/packages $HESTIA/data/
  1233. # Update nameservers in hosting package
  1234. IFS='.' read -r -a domain_elements <<< "$servername"
  1235. if [ -n "${domain_elements[-2]}" ] && [ -n "${domain_elements[-1]}" ]; then
  1236. serverdomain="${domain_elements[-2]}.${domain_elements[-1]}"
  1237. sed -i s/"domain.tld"/"$serverdomain"/g $HESTIA/data/packages/*.pkg
  1238. fi
  1239. # Installing templates
  1240. cp -rf $HESTIA_INSTALL_DIR/templates $HESTIA/data/
  1241. cp -rf $HESTIA_COMMON_DIR/templates/web/ $HESTIA/data/templates
  1242. cp -rf $HESTIA_COMMON_DIR/templates/dns/ $HESTIA/data/templates
  1243. mkdir -p /var/www/html
  1244. mkdir -p /var/www/document_errors
  1245. # Install default success page
  1246. cp -rf $HESTIA_COMMON_DIR/templates/web/unassigned/index.html /var/www/html/
  1247. cp -rf $HESTIA_COMMON_DIR/templates/web/skel/document_errors/* /var/www/document_errors/
  1248. # Installing firewall rules
  1249. cp -rf $HESTIA_COMMON_DIR/firewall $HESTIA/data/
  1250. rm -f $HESTIA/data/firewall/ipset/blacklist.sh $HESTIA/data/firewall/ipset/blacklist.ipv6.sh
  1251. # Delete rules for services that are not installed
  1252. if [ "$vsftpd" = "no" ] && [ "$proftpd" = "no" ]; then
  1253. # Remove FTP
  1254. sed -i "/COMMENT='FTP'/d" $HESTIA/data/firewall/rules.conf
  1255. fi
  1256. if [ "$exim" = "no" ]; then
  1257. # Remove SMTP
  1258. sed -i "/COMMENT='SMTP'/d" $HESTIA/data/firewall/rules.conf
  1259. fi
  1260. if [ "$dovecot" = "no" ]; then
  1261. # Remove IMAP / Dovecot
  1262. sed -i "/COMMENT='IMAP'/d" $HESTIA/data/firewall/rules.conf
  1263. sed -i "/COMMENT='POP3'/d" $HESTIA/data/firewall/rules.conf
  1264. fi
  1265. if [ "$named" = "no" ]; then
  1266. # Remove IMAP / Dovecot
  1267. sed -i "/COMMENT='DNS'/d" $HESTIA/data/firewall/rules.conf
  1268. fi
  1269. # Installing apis
  1270. cp -rf $HESTIA_COMMON_DIR/api $HESTIA/data/
  1271. # Configuring server hostname
  1272. $HESTIA/bin/v-change-sys-hostname $servername > /dev/null 2>&1
  1273. # Configuring global OpenSSL options
  1274. echo "[ * ] Configuring OpenSSL to improve TLS performance..."
  1275. tls13_ciphers="TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384"
  1276. if [ "$release" = "10" ] || [ "$release" = "11" ]; then
  1277. sed -i '/^system_default = system_default_sect$/a system_default = hestia_openssl_sect\n\n[hestia_openssl_sect]\nCiphersuites = '"$tls13_ciphers"'\nOptions = PrioritizeChaCha' /etc/ssl/openssl.cnf
  1278. elif [ "$release" = "12" ]; then
  1279. if ! grep -qw "^ssl_conf = ssl_sect$" /etc/ssl/openssl.cnf 2> /dev/null; then
  1280. sed -i '/providers = provider_sect$/a ssl_conf = ssl_sect' /etc/ssl/openssl.cnf
  1281. fi
  1282. if ! grep -qw "^[ssl_sect]$" /etc/ssl/openssl.cnf 2> /dev/null; then
  1283. sed -i '$a \\n[ssl_sect]\nsystem_default = hestia_openssl_sect\n\n[hestia_openssl_sect]\nCiphersuites = '"$tls13_ciphers"'\nOptions = PrioritizeChaCha' /etc/ssl/openssl.cnf
  1284. elif grep -qw "^system_default = system_default_sect$" /etc/ssl/openssl.cnf 2> /dev/null; then
  1285. sed -i '/^system_default = system_default_sect$/a system_default = hestia_openssl_sect\n\n[hestia_openssl_sect]\nCiphersuites = '"$tls13_ciphers"'\nOptions = PrioritizeChaCha' /etc/ssl/openssl.cnf
  1286. fi
  1287. fi
  1288. # Generating SSL certificate
  1289. echo "[ * ] Generating default self-signed SSL certificate..."
  1290. $HESTIA/bin/v-generate-ssl-cert $(hostname) '' 'US' 'California' \
  1291. 'San Francisco' 'Hestia Control Panel' 'IT' > /tmp/hst.pem
  1292. crt_end=$(grep -n "END CERTIFICATE-" /tmp/hst.pem | cut -f 1 -d:)
  1293. if [ "$release" = "12" ]; then
  1294. key_start=$(grep -n "BEGIN PRIVATE KEY" /tmp/hst.pem | cut -f 1 -d:)
  1295. key_end=$(grep -n "END PRIVATE KEY" /tmp/hst.pem | cut -f 1 -d:)
  1296. else
  1297. key_start=$(grep -n "BEGIN RSA" /tmp/hst.pem | cut -f 1 -d:)
  1298. key_end=$(grep -n "END RSA" /tmp/hst.pem | cut -f 1 -d:)
  1299. fi
  1300. # Adding SSL certificate
  1301. echo "[ * ] Adding SSL certificate to Hestia Control Panel..."
  1302. cd $HESTIA/ssl
  1303. sed -n "1,${crt_end}p" /tmp/hst.pem > certificate.crt
  1304. sed -n "$key_start,${key_end}p" /tmp/hst.pem > certificate.key
  1305. chown root:mail $HESTIA/ssl/*
  1306. chmod 660 $HESTIA/ssl/*
  1307. rm /tmp/hst.pem
  1308. # Install dhparam.pem
  1309. cp -f $HESTIA_INSTALL_DIR/ssl/dhparam.pem /etc/ssl
  1310. # Enable sftp jail
  1311. echo "[ * ] Enabling SFTP jail..."
  1312. $HESTIA/bin/v-add-sys-sftp-jail > /dev/null 2>&1
  1313. check_result $? "can't enable sftp jail"
  1314. # Enable ssh jail
  1315. echo "[ * ] Enabling SSH jail..."
  1316. $HESTIA/bin/v-add-sys-ssh-jail > /dev/null 2>&1
  1317. check_result $? "can't enable ssh jail"
  1318. # Adding Hestia admin account
  1319. echo "[ * ] Creating default admin account..."
  1320. $HESTIA/bin/v-add-user "$username" "$vpass" "$email" "default" "System Administrator"
  1321. check_result $? "can't create admin user"
  1322. $HESTIA/bin/v-change-user-shell "$username" nologin no
  1323. $HESTIA/bin/v-change-user-role "$username" admin
  1324. $HESTIA/bin/v-change-user-language "$username" "$lang"
  1325. $HESTIA/bin/v-change-sys-config-value 'POLICY_SYSTEM_PROTECTED_ADMIN' 'yes'
  1326. #----------------------------------------------------------#
  1327. # Configure Nginx #
  1328. #----------------------------------------------------------#
  1329. echo "[ * ] Configuring NGINX..."
  1330. rm -f /etc/nginx/conf.d/*.conf
  1331. cp -f $HESTIA_INSTALL_DIR/nginx/nginx.conf /etc/nginx/
  1332. cp -f $HESTIA_INSTALL_DIR/nginx/status.conf /etc/nginx/conf.d/
  1333. cp -f $HESTIA_INSTALL_DIR/nginx/0rtt-anti-replay.conf /etc/nginx/conf.d/
  1334. cp -f $HESTIA_INSTALL_DIR/nginx/agents.conf /etc/nginx/conf.d/
  1335. # Copy over cloudflare.inc incase in the next step there are connection issues with CF
  1336. cp -f $HESTIA_INSTALL_DIR/nginx/cloudflare.inc /etc/nginx/conf.d/
  1337. cp -f $HESTIA_INSTALL_DIR/nginx/phpmyadmin.inc /etc/nginx/conf.d/
  1338. cp -f $HESTIA_INSTALL_DIR/nginx/phppgadmin.inc /etc/nginx/conf.d/
  1339. cp -f $HESTIA_INSTALL_DIR/logrotate/nginx /etc/logrotate.d/
  1340. mkdir -p /etc/nginx/conf.d/domains
  1341. mkdir -p /etc/nginx/conf.d/main
  1342. mkdir -p /etc/nginx/modules-enabled
  1343. mkdir -p /var/log/nginx/domains
  1344. # Update dns servers in nginx.conf
  1345. for nameserver in $(grep -is '^nameserver' /etc/resolv.conf | cut -d' ' -f2 | tr '\r\n' ' ' | xargs); do
  1346. if [[ "$nameserver" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
  1347. if [ -z "$resolver" ]; then
  1348. resolver="$nameserver"
  1349. else
  1350. resolver="$resolver $nameserver"
  1351. fi
  1352. fi
  1353. done
  1354. if [ -n "$resolver" ]; then
  1355. sed -i "s/1.0.0.1 8.8.4.4 1.1.1.1 8.8.8.8/$resolver/g" /etc/nginx/nginx.conf
  1356. fi
  1357. # https://github.com/ergin/nginx-cloudflare-real-ip/
  1358. cf_ips="$(curl -fsLm5 --retry 2 https://api.cloudflare.com/client/v4/ips)"
  1359. if [ -n "$cf_ips" ] && [ "$(echo "$cf_ips" | jq -r '.success//""')" = "true" ]; then
  1360. cf_inc="/etc/nginx/conf.d/cloudflare.inc"
  1361. echo "[ * ] Updating Cloudflare IP Ranges for Nginx..."
  1362. echo "# Cloudflare IP Ranges" > $cf_inc
  1363. echo "" >> $cf_inc
  1364. echo "# IPv4" >> $cf_inc
  1365. for ipv4 in $(echo "$cf_ips" | jq -r '.result.ipv4_cidrs[]//""' | sort); do
  1366. echo "set_real_ip_from $ipv4;" >> $cf_inc
  1367. done
  1368. echo "" >> $cf_inc
  1369. echo "# IPv6" >> $cf_inc
  1370. for ipv6 in $(echo "$cf_ips" | jq -r '.result.ipv6_cidrs[]//""' | sort); do
  1371. echo "set_real_ip_from $ipv6;" >> $cf_inc
  1372. done
  1373. echo "" >> $cf_inc
  1374. echo "real_ip_header CF-Connecting-IP;" >> $cf_inc
  1375. fi
  1376. update-rc.d nginx defaults > /dev/null 2>&1
  1377. systemctl start nginx >> $LOG
  1378. check_result $? "nginx start failed"
  1379. #----------------------------------------------------------#
  1380. # Configure Apache #
  1381. #----------------------------------------------------------#
  1382. if [ "$apache" = 'yes' ]; then
  1383. echo "[ * ] Configuring Apache Web Server..."
  1384. mkdir -p /etc/apache2/conf.d
  1385. mkdir -p /etc/apache2/conf.d/domains
  1386. # Copy configuration files
  1387. cp -f $HESTIA_INSTALL_DIR/apache2/apache2.conf /etc/apache2/
  1388. cp -f $HESTIA_INSTALL_DIR/apache2/status.conf /etc/apache2/mods-available/hestia-status.conf
  1389. cp -f /etc/apache2/mods-available/status.load /etc/apache2/mods-available/hestia-status.load
  1390. cp -f $HESTIA_INSTALL_DIR/logrotate/apache2 /etc/logrotate.d/
  1391. # Enable needed modules
  1392. a2enmod rewrite > /dev/null 2>&1
  1393. a2enmod suexec > /dev/null 2>&1
  1394. a2enmod ssl > /dev/null 2>&1
  1395. a2enmod actions > /dev/null 2>&1
  1396. a2dismod --quiet status > /dev/null 2>&1
  1397. a2enmod --quiet hestia-status > /dev/null 2>&1
  1398. # Enable mod_ruid/mpm_itk or mpm_event
  1399. if [ "$phpfpm" = 'yes' ]; then
  1400. # Disable prefork and php, enable event
  1401. a2dismod php$fpm_v > /dev/null 2>&1
  1402. a2dismod mpm_prefork > /dev/null 2>&1
  1403. a2enmod mpm_event > /dev/null 2>&1
  1404. cp -f $HESTIA_INSTALL_DIR/apache2/hestia-event.conf /etc/apache2/conf.d/
  1405. else
  1406. a2enmod mpm_itk > /dev/null 2>&1
  1407. fi
  1408. echo "# Powered by hestia" > /etc/apache2/sites-available/default
  1409. echo "# Powered by hestia" > /etc/apache2/sites-available/default-ssl
  1410. echo "# Powered by hestia" > /etc/apache2/ports.conf
  1411. echo -e "/home\npublic_html/cgi-bin" > /etc/apache2/suexec/www-data
  1412. touch /var/log/apache2/access.log /var/log/apache2/error.log
  1413. mkdir -p /var/log/apache2/domains
  1414. chmod a+x /var/log/apache2
  1415. chmod 640 /var/log/apache2/access.log /var/log/apache2/error.log
  1416. chmod 751 /var/log/apache2/domains
  1417. # Prevent remote access to server-status page
  1418. sed -i '/Allow from all/d' /etc/apache2/mods-available/hestia-status.conf
  1419. update-rc.d apache2 defaults > /dev/null 2>&1
  1420. systemctl start apache2 >> $LOG
  1421. check_result $? "apache2 start failed"
  1422. else
  1423. update-rc.d apache2 disable > /dev/null 2>&1
  1424. systemctl stop apache2 > /dev/null 2>&1
  1425. fi
  1426. #----------------------------------------------------------#
  1427. # Configure PHP-FPM #
  1428. #----------------------------------------------------------#
  1429. if [ "$phpfpm" = "yes" ]; then
  1430. if [ "$multiphp" = 'yes' ]; then
  1431. for v in "${multiphp_v[@]}"; do
  1432. echo "[ * ] Installing PHP $v..."
  1433. $HESTIA/bin/v-add-web-php "$v" > /dev/null 2>&1
  1434. done
  1435. else
  1436. echo "[ * ] Installing PHP $fpm_v..."
  1437. $HESTIA/bin/v-add-web-php "$fpm_v" > /dev/null 2>&1
  1438. fi
  1439. echo "[ * ] Configuring PHP-FPM $fpm_v..."
  1440. # Create www.conf for webmail and php(*)admin
  1441. cp -f $HESTIA_INSTALL_DIR/php-fpm/www.conf /etc/php/$fpm_v/fpm/pool.d/www.conf
  1442. update-rc.d php$fpm_v-fpm defaults > /dev/null 2>&1
  1443. systemctl start php$fpm_v-fpm >> $LOG
  1444. check_result $? "php-fpm start failed"
  1445. # Set default php version to $fpm_v
  1446. update-alternatives --set php /usr/bin/php$fpm_v > /dev/null 2>&1
  1447. fi
  1448. #----------------------------------------------------------#
  1449. # Configure PHP #
  1450. #----------------------------------------------------------#
  1451. echo "[ * ] Configuring PHP..."
  1452. ZONE=$(timedatectl > /dev/null 2>&1 | grep Timezone | awk '{print $2}')
  1453. if [ -z "$ZONE" ]; then
  1454. ZONE='UTC'
  1455. fi
  1456. for pconf in $(find /etc/php* -name php.ini); do
  1457. sed -i "s%;date.timezone =%date.timezone = $ZONE%g" $pconf
  1458. sed -i 's%_open_tag = Off%_open_tag = On%g' $pconf
  1459. done
  1460. # Cleanup php session files not changed in the last 7 days (60*24*7 minutes)
  1461. echo '#!/bin/sh' > /etc/cron.daily/php-session-cleanup
  1462. echo "find -O3 /home/*/tmp/ -ignore_readdir_race -depth -mindepth 1 -name 'sess_*' -type f -cmin '+10080' -delete > /dev/null 2>&1" >> /etc/cron.daily/php-session-cleanup
  1463. echo "find -O3 $HESTIA/data/sessions/ -ignore_readdir_race -depth -mindepth 1 -name 'sess_*' -type f -cmin '+10080' -delete > /dev/null 2>&1" >> /etc/cron.daily/php-session-cleanup
  1464. chmod 755 /etc/cron.daily/php-session-cleanup
  1465. #----------------------------------------------------------#
  1466. # Configure Vsftpd #
  1467. #----------------------------------------------------------#
  1468. if [ "$vsftpd" = 'yes' ]; then
  1469. echo "[ * ] Configuring Vsftpd server..."
  1470. cp -f $HESTIA_INSTALL_DIR/vsftpd/vsftpd.conf /etc/
  1471. touch /var/log/vsftpd.log
  1472. chown root:adm /var/log/vsftpd.log
  1473. chmod 640 /var/log/vsftpd.log
  1474. touch /var/log/xferlog
  1475. chown root:adm /var/log/xferlog
  1476. chmod 640 /var/log/xferlog
  1477. update-rc.d vsftpd defaults > /dev/null 2>&1
  1478. systemctl start vsftpd >> $LOG
  1479. check_result $? "vsftpd start failed"
  1480. fi
  1481. #----------------------------------------------------------#
  1482. # Configure ProFTPD #
  1483. #----------------------------------------------------------#
  1484. if [ "$proftpd" = 'yes' ]; then
  1485. echo "[ * ] Configuring ProFTPD server..."
  1486. echo "127.0.0.1 $servername" >> /etc/hosts
  1487. cp -f $HESTIA_INSTALL_DIR/proftpd/proftpd.conf /etc/proftpd/
  1488. cp -f $HESTIA_INSTALL_DIR/proftpd/tls.conf /etc/proftpd/
  1489. # Disable TLS 1.3 support for ProFTPD versions older than v1.3.7a
  1490. if [ "$release" -eq 10 ]; then
  1491. sed -i 's/TLSProtocol TLSv1.2 TLSv1.3/TLSProtocol TLSv1.2/' /etc/proftpd/tls.conf
  1492. fi
  1493. update-rc.d proftpd defaults > /dev/null 2>&1
  1494. systemctl start proftpd >> $LOG
  1495. check_result $? "proftpd start failed"
  1496. if [ "$release" -eq 11 ]; then
  1497. unit_files="$(systemctl list-unit-files | grep proftpd)"
  1498. if [[ "$unit_files" =~ "disabled" ]]; then
  1499. systemctl enable proftpd
  1500. fi
  1501. fi
  1502. if [ "$release" -eq 12 ]; then
  1503. systemctl disable --now proftpd.socket
  1504. systemctl enable --now proftpd.service
  1505. fi
  1506. fi
  1507. #----------------------------------------------------------#
  1508. # Configure MariaDB / MySQL #
  1509. #----------------------------------------------------------#
  1510. if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
  1511. [ "$mysql" = 'yes' ] && mysql_type="MariaDB" || mysql_type="MySQL"
  1512. echo "[ * ] Configuring $mysql_type database server..."
  1513. mycnf="my-small.cnf"
  1514. if [ $memory -gt 1200000 ]; then
  1515. mycnf="my-medium.cnf"
  1516. fi
  1517. if [ $memory -gt 3900000 ]; then
  1518. mycnf="my-large.cnf"
  1519. fi
  1520. if [ "$mysql_type" = 'MariaDB' ]; then
  1521. # Run mysql_install_db
  1522. mysql_install_db >> $LOG
  1523. fi
  1524. # Remove symbolic link
  1525. rm -f /etc/mysql/my.cnf
  1526. # Configuring MariaDB
  1527. cp -f $HESTIA_INSTALL_DIR/mysql/$mycnf /etc/mysql/my.cnf
  1528. # Switch MariaDB inclusions to the MySQL
  1529. if [ "$mysql_type" = 'MySQL' ]; then
  1530. sed -i '/query_cache_size/d' /etc/mysql/my.cnf
  1531. sed -i 's|mariadb.conf.d|mysql.conf.d|g' /etc/mysql/my.cnf
  1532. fi
  1533. if [ "$mysql_type" = 'MariaDB' ]; then
  1534. update-rc.d mariadb defaults > /dev/null 2>&1
  1535. systemctl -q enable mariadb 2> /dev/null
  1536. systemctl start mariadb >> $LOG
  1537. check_result $? "${mysql_type,,} start failed"
  1538. fi
  1539. if [ "$mysql_type" = 'MySQL' ]; then
  1540. update-rc.d mysql defaults > /dev/null 2>&1
  1541. systemctl -q enable mysql 2> /dev/null
  1542. systemctl start mysql >> $LOG
  1543. check_result $? "${mysql_type,,} start failed"
  1544. fi
  1545. # Securing MariaDB/MySQL installation
  1546. mpass=$(gen_pass)
  1547. echo -e "[client]\npassword='$mpass'\n" > /root/.my.cnf
  1548. chmod 600 /root/.my.cnf
  1549. if [ -f '/usr/bin/mariadb' ]; then
  1550. mysql_server="mariadb"
  1551. else
  1552. mysql_server="mysql"
  1553. fi
  1554. # Alter root password
  1555. $mysql_server -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$mpass'; FLUSH PRIVILEGES;"
  1556. if [ "$mysql_type" = 'MariaDB' ]; then
  1557. # Allow mysql access via socket for startup
  1558. $mysql_server -e "UPDATE mysql.global_priv SET priv=json_set(priv, '$.password_last_changed', UNIX_TIMESTAMP(), '$.plugin', 'mysql_native_password', '$.authentication_string', 'invalid', '$.auth_or', json_array(json_object(), json_object('plugin', 'unix_socket'))) WHERE User='root';"
  1559. # Disable anonymous users
  1560. $mysql_server -e "DELETE FROM mysql.global_priv WHERE User='';"
  1561. else
  1562. $mysql_server -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '$mpass';"
  1563. $mysql_server -e "DELETE FROM mysql.user WHERE User='';"
  1564. $mysql_server -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
  1565. fi
  1566. # Drop test database
  1567. $mysql_server -e "DROP DATABASE IF EXISTS test"
  1568. $mysql_server -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
  1569. # Flush privileges
  1570. $mysql_server -e "FLUSH PRIVILEGES;"
  1571. fi
  1572. #----------------------------------------------------------#
  1573. # Configure phpMyAdmin #
  1574. #----------------------------------------------------------#
  1575. # Source upgrade.conf with phpmyadmin versions
  1576. # shellcheck source=/usr/local/hestia/install/upgrade/upgrade.conf
  1577. source $HESTIA/install/upgrade/upgrade.conf
  1578. if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
  1579. # Display upgrade information
  1580. echo "[ * ] Installing phpMyAdmin version v$pma_v..."
  1581. # Download latest phpmyadmin release
  1582. wget --quiet --retry-connrefused https://files.phpmyadmin.net/phpMyAdmin/$pma_v/phpMyAdmin-$pma_v-all-languages.tar.gz
  1583. # Unpack files
  1584. tar xzf phpMyAdmin-$pma_v-all-languages.tar.gz
  1585. # Create folders
  1586. mkdir -p /usr/share/phpmyadmin
  1587. mkdir -p /etc/phpmyadmin
  1588. mkdir -p /etc/phpmyadmin/conf.d/
  1589. mkdir /usr/share/phpmyadmin/tmp
  1590. # Configuring Apache2 for PHPMYADMIN
  1591. if [ "$apache" = 'yes' ]; then
  1592. touch /etc/apache2/conf.d/phpmyadmin.inc
  1593. fi
  1594. # Overwrite old files
  1595. cp -rf phpMyAdmin-$pma_v-all-languages/* /usr/share/phpmyadmin
  1596. # Create copy of config file
  1597. cp -f $HESTIA_INSTALL_DIR/phpmyadmin/config.inc.php /etc/phpmyadmin/
  1598. mkdir -p /var/lib/phpmyadmin/tmp
  1599. chmod 770 /var/lib/phpmyadmin/tmp
  1600. chown root:hestiamail /usr/share/phpmyadmin/tmp
  1601. # Set config and log directory
  1602. sed -i "s|'configFile' => ROOT_PATH . 'config.inc.php',|'configFile' => '/etc/phpmyadmin/config.inc.php',|g" /usr/share/phpmyadmin/libraries/vendor_config.php
  1603. # Create temporary folder and change permission
  1604. chmod 770 /usr/share/phpmyadmin/tmp
  1605. chown root:hestiamail /usr/share/phpmyadmin/tmp
  1606. # Generate blow fish
  1607. blowfish=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)
  1608. sed -i "s|%blowfish_secret%|$blowfish|" /etc/phpmyadmin/config.inc.php
  1609. # Clean Up
  1610. rm -fr phpMyAdmin-$pma_v-all-languages
  1611. rm -f phpMyAdmin-$pma_v-all-languages.tar.gz
  1612. write_config_value "DB_PMA_ALIAS" "phpmyadmin"
  1613. $HESTIA/bin/v-change-sys-db-alias 'pma' "phpmyadmin"
  1614. # Special thanks to Pavel Galkin (https://skurudo.ru)
  1615. # https://github.com/skurudo/phpmyadmin-fixer
  1616. # shellcheck source=/usr/local/hestia/install/deb/phpmyadmin/pma.sh
  1617. source $HESTIA_INSTALL_DIR/phpmyadmin/pma.sh > /dev/null 2>&1
  1618. # limit access to /etc/phpmyadmin/
  1619. chown -R root:www-data /etc/phpmyadmin/
  1620. chmod -R 640 /etc/phpmyadmin/*
  1621. chmod 750 /etc/phpmyadmin/conf.d/
  1622. fi
  1623. #----------------------------------------------------------#
  1624. # Configure PostgreSQL #
  1625. #----------------------------------------------------------#
  1626. if [ "$postgresql" = 'yes' ]; then
  1627. echo "[ * ] Configuring PostgreSQL database server..."
  1628. ppass=$(gen_pass)
  1629. cp -f $HESTIA_INSTALL_DIR/postgresql/pg_hba.conf /etc/postgresql/*/main/
  1630. systemctl restart postgresql
  1631. sudo -iu postgres psql -c "ALTER USER postgres WITH PASSWORD '$ppass'" > /dev/null 2>&1
  1632. mkdir -p /etc/phppgadmin/
  1633. mkdir -p /usr/share/phppgadmin/
  1634. wget --retry-connrefused --quiet https://github.com/hestiacp/phppgadmin/releases/download/v$pga_v/phppgadmin-v$pga_v.tar.gz
  1635. tar xzf phppgadmin-v$pga_v.tar.gz -C /usr/share/phppgadmin/
  1636. cp -f $HESTIA_INSTALL_DIR/pga/config.inc.php /etc/phppgadmin/
  1637. ln -s /etc/phppgadmin/config.inc.php /usr/share/phppgadmin/conf/
  1638. # Configuring phpPgAdmin
  1639. if [ "$apache" = 'yes' ]; then
  1640. cp -f $HESTIA_INSTALL_DIR/pga/phppgadmin.conf /etc/apache2/conf.d/phppgadmin.inc
  1641. fi
  1642. rm phppgadmin-v$pga_v.tar.gz
  1643. write_config_value "DB_PGA_ALIAS" "phppgadmin"
  1644. $HESTIA/bin/v-change-sys-db-alias 'pga' "phppgadmin"
  1645. fi
  1646. #----------------------------------------------------------#
  1647. # Configure Bind #
  1648. #----------------------------------------------------------#
  1649. if [ "$named" = 'yes' ]; then
  1650. echo "[ * ] Configuring Bind DNS server..."
  1651. cp -f $HESTIA_INSTALL_DIR/bind/named.conf /etc/bind/
  1652. cp -f $HESTIA_INSTALL_DIR/bind/named.conf.options /etc/bind/
  1653. chown root:bind /etc/bind/named.conf
  1654. chown root:bind /etc/bind/named.conf.options
  1655. chown bind:bind /var/cache/bind
  1656. chmod 640 /etc/bind/named.conf
  1657. chmod 640 /etc/bind/named.conf.options
  1658. aa-complain /usr/sbin/named 2> /dev/null
  1659. if [ "$apparmor" = 'yes' ]; then
  1660. echo "/home/** rwm," >> /etc/apparmor.d/local/usr.sbin.named 2> /dev/null
  1661. systemctl status apparmor > /dev/null 2>&1
  1662. if [ $? -ne 0 ]; then
  1663. systemctl restart apparmor >> $LOG
  1664. fi
  1665. fi
  1666. update-rc.d bind9 defaults > /dev/null 2>&1
  1667. systemctl start bind9
  1668. check_result $? "bind9 start failed"
  1669. # Workaround for OpenVZ/Virtuozzo
  1670. if [ -e "/proc/vz/veinfo" ] && [ -e "/etc/rc.local" ]; then
  1671. sed -i "s/^exit 0/service bind9 restart\nexit 0/" /etc/rc.local
  1672. fi
  1673. fi
  1674. #----------------------------------------------------------#
  1675. # Configure Exim #
  1676. #----------------------------------------------------------#
  1677. if [ "$exim" = 'yes' ]; then
  1678. echo "[ * ] Configuring Exim mail server..."
  1679. gpasswd -a Debian-exim mail > /dev/null 2>&1
  1680. exim_version=$(exim4 --version | head -1 | awk '{print $3}' | cut -f -2 -d .)
  1681. # if Exim version > 4.9.4 or greater!
  1682. if ! version_ge "4.95" "$exim_version"; then
  1683. cp -f $HESTIA_INSTALL_DIR/exim/exim4.conf.4.95.template /etc/exim4/exim4.conf.template
  1684. else
  1685. if ! version_ge "4.93" "$exim_version"; then
  1686. cp -f $HESTIA_INSTALL_DIR/exim/exim4.conf.4.94.template /etc/exim4/exim4.conf.template
  1687. else
  1688. cp -f $HESTIA_INSTALL_DIR/exim/exim4.conf.template /etc/exim4/
  1689. fi
  1690. fi
  1691. cp -f $HESTIA_INSTALL_DIR/exim/dnsbl.conf /etc/exim4/
  1692. cp -f $HESTIA_INSTALL_DIR/exim/spam-blocks.conf /etc/exim4/
  1693. cp -f $HESTIA_INSTALL_DIR/exim/limit.conf /etc/exim4/
  1694. cp -f $HESTIA_INSTALL_DIR/exim/system.filter /etc/exim4/
  1695. touch /etc/exim4/white-blocks.conf
  1696. if [ "$spamd" = 'yes' ]; then
  1697. sed -i "s/#SPAM/SPAM/g" /etc/exim4/exim4.conf.template
  1698. fi
  1699. if [ "$clamd" = 'yes' ]; then
  1700. sed -i "s/#CLAMD/CLAMD/g" /etc/exim4/exim4.conf.template
  1701. fi
  1702. if [ "$release" = 10 ]; then
  1703. sed -i "/^smtputf8_advertise_hosts =/d" /etc/exim4/exim4.conf.template
  1704. fi
  1705. # Generate SRS KEY If not support just created it will get ignored anyway
  1706. srs=$(gen_pass)
  1707. echo $srs > /etc/exim4/srs.conf
  1708. chmod 640 /etc/exim4/srs.conf
  1709. chmod 640 /etc/exim4/exim4.conf.template
  1710. chown root:Debian-exim /etc/exim4/srs.conf
  1711. rm -rf /etc/exim4/domains
  1712. mkdir -p /etc/exim4/domains
  1713. rm -f /etc/alternatives/mta
  1714. ln -s /usr/sbin/exim4 /etc/alternatives/mta
  1715. update-rc.d -f sendmail remove > /dev/null 2>&1
  1716. systemctl stop sendmail > /dev/null 2>&1
  1717. update-rc.d -f postfix remove > /dev/null 2>&1
  1718. systemctl stop postfix > /dev/null 2>&1
  1719. update-rc.d exim4 defaults
  1720. systemctl start exim4 >> $LOG
  1721. check_result $? "exim4 start failed"
  1722. fi
  1723. #----------------------------------------------------------#
  1724. # Configure Dovecot #
  1725. #----------------------------------------------------------#
  1726. if [ "$dovecot" = 'yes' ]; then
  1727. echo "[ * ] Configuring Dovecot POP/IMAP mail server..."
  1728. gpasswd -a dovecot mail > /dev/null 2>&1
  1729. cp -rf $HESTIA_COMMON_DIR/dovecot /etc/
  1730. cp -f $HESTIA_INSTALL_DIR/logrotate/dovecot /etc/logrotate.d/
  1731. rm -f /etc/dovecot/conf.d/15-mailboxes.conf
  1732. chown -R root:root /etc/dovecot*
  1733. #Alter config for 2.2
  1734. version=$(dovecot --version | cut -f -2 -d .)
  1735. if [ "$version" = "2.2" ]; then
  1736. echo "[ * ] Downgrade dovecot config to sync with 2.2 settings"
  1737. sed -i 's|#ssl_dh_parameters_length = 4096|ssl_dh_parameters_length = 4096|g' /etc/dovecot/conf.d/10-ssl.conf
  1738. sed -i 's|ssl_dh = </etc/ssl/dhparam.pem|#ssl_dh = </etc/ssl/dhparam.pem|g' /etc/dovecot/conf.d/10-ssl.conf
  1739. sed -i 's|ssl_min_protocol = TLSv1.2|ssl_protocols = !SSLv3 !TLSv1 !TLSv1.1|g' /etc/dovecot/conf.d/10-ssl.conf
  1740. fi
  1741. update-rc.d dovecot defaults
  1742. systemctl start dovecot >> $LOG
  1743. check_result $? "dovecot start failed"
  1744. fi
  1745. #----------------------------------------------------------#
  1746. # Configure ClamAV #
  1747. #----------------------------------------------------------#
  1748. if [ "$clamd" = 'yes' ]; then
  1749. gpasswd -a clamav mail > /dev/null 2>&1
  1750. gpasswd -a clamav Debian-exim > /dev/null 2>&1
  1751. cp -f $HESTIA_INSTALL_DIR/clamav/clamd.conf /etc/clamav/
  1752. update-rc.d clamav-daemon defaults
  1753. if [ ! -d "/run/clamav" ]; then
  1754. mkdir /run/clamav
  1755. fi
  1756. chown -R clamav:clamav /run/clamav
  1757. if [ -e "/lib/systemd/system/clamav-daemon.service" ]; then
  1758. exec_pre1='ExecStartPre=-/bin/mkdir -p /run/clamav'
  1759. exec_pre2='ExecStartPre=-/bin/chown -R clamav:clamav /run/clamav'
  1760. sed -i "s|\[Service\]|[Service]\n$exec_pre1\n$exec_pre2|g" \
  1761. /lib/systemd/system/clamav-daemon.service
  1762. systemctl daemon-reload
  1763. fi
  1764. systemctl start clamav-daemon > /dev/null 2>&1
  1765. sleep 1
  1766. systemctl status clamav-daemon > /dev/null 2>&1
  1767. echo -ne "[ * ] Installing ClamAV anti-virus definitions... "
  1768. /usr/bin/freshclam >> $LOG > /dev/null 2>&1
  1769. BACK_PID=$!
  1770. spin_i=1
  1771. while kill -0 $BACK_PID > /dev/null 2>&1; do
  1772. printf "\b${spinner:spin_i++%${#spinner}:1}"
  1773. sleep 0.5
  1774. done
  1775. echo
  1776. systemctl start clamav-daemon >> $LOG
  1777. check_result $? "clamav-daemon start failed"
  1778. fi
  1779. #----------------------------------------------------------#
  1780. # Configure SpamAssassin #
  1781. #----------------------------------------------------------#
  1782. if [ "$spamd" = 'yes' ]; then
  1783. echo "[ * ] Configuring SpamAssassin..."
  1784. update-rc.d spamassassin defaults > /dev/null 2>&1
  1785. if [ "$release" = "10" ] || [ "$release" = "11" ]; then
  1786. update-rc.d spamassassin enable > /dev/null 2>&1
  1787. systemctl start spamassassin >> $LOG
  1788. check_result $? "spamassassin start failed"
  1789. unit_files="$(systemctl list-unit-files | grep spamassassin)"
  1790. if [[ "$unit_files" =~ "disabled" ]]; then
  1791. systemctl enable spamassassin > /dev/null 2>&1
  1792. fi
  1793. sed -i "s/#CRON=1/CRON=1/" /etc/default/spamassassin
  1794. else
  1795. # Deb 12+ renamed to spamd
  1796. update-rc.d spamd enable > /dev/null 2>&1
  1797. systemctl start spamd >> $LOG
  1798. unit_files="$(systemctl list-unit-files | grep spamd)"
  1799. if [[ "$unit_files" =~ "disabled" ]]; then
  1800. systemctl enable spamd > /dev/null 2>&1
  1801. fi
  1802. fi
  1803. fi
  1804. #----------------------------------------------------------#
  1805. # Configure Fail2Ban #
  1806. #----------------------------------------------------------#
  1807. if [ "$fail2ban" = 'yes' ]; then
  1808. echo "[ * ] Configuring fail2ban access monitor..."
  1809. cp -rf $HESTIA_INSTALL_DIR/fail2ban /etc/
  1810. if [ "$dovecot" = 'no' ]; then
  1811. fline=$(cat /etc/fail2ban/jail.local | grep -n dovecot-iptables -A 2)
  1812. fline=$(echo "$fline" | grep enabled | tail -n1 | cut -f 1 -d -)
  1813. sed -i "${fline}s/true/false/" /etc/fail2ban/jail.local
  1814. fi
  1815. if [ "$exim" = 'no' ]; then
  1816. fline=$(cat /etc/fail2ban/jail.local | grep -n exim-iptables -A 2)
  1817. fline=$(echo "$fline" | grep enabled | tail -n1 | cut -f 1 -d -)
  1818. sed -i "${fline}s/true/false/" /etc/fail2ban/jail.local
  1819. fi
  1820. if [ "$vsftpd" = 'yes' ]; then
  1821. # Create vsftpd Log File
  1822. if [ ! -f "/var/log/vsftpd.log" ]; then
  1823. touch /var/log/vsftpd.log
  1824. fi
  1825. fline=$(cat /etc/fail2ban/jail.local | grep -n vsftpd-iptables -A 2)
  1826. fline=$(echo "$fline" | grep enabled | tail -n1 | cut -f 1 -d -)
  1827. sed -i "${fline}s/false/true/" /etc/fail2ban/jail.local
  1828. fi
  1829. if [ ! -e /var/log/auth.log ]; then
  1830. # Debian workaround: auth logging was moved to systemd
  1831. touch /var/log/auth.log
  1832. chmod 640 /var/log/auth.log
  1833. chown root:adm /var/log/auth.log
  1834. fi
  1835. if [ -f /etc/fail2ban/jail.d/defaults-debian.conf ]; then
  1836. rm -f /etc/fail2ban/jail.d/defaults-debian.conf
  1837. fi
  1838. update-rc.d fail2ban defaults
  1839. systemctl start fail2ban >> $LOG
  1840. check_result $? "fail2ban start failed"
  1841. fi
  1842. # Configuring MariaDB/MySQL host
  1843. if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
  1844. $HESTIA/bin/v-add-database-host mysql localhost root $mpass
  1845. fi
  1846. # Configuring PostgreSQL host
  1847. if [ "$postgresql" = 'yes' ]; then
  1848. $HESTIA/bin/v-add-database-host pgsql localhost postgres $ppass
  1849. fi
  1850. #----------------------------------------------------------#
  1851. # Install Roundcube #
  1852. #----------------------------------------------------------#
  1853. # Min requirements Dovecot + Exim + Mysql
  1854. if ([ "$mysql" == 'yes' ] || [ "$mysql8" == 'yes' ]) && [ "$dovecot" == "yes" ]; then
  1855. echo "[ * ] Installing Roundcube..."
  1856. $HESTIA/bin/v-add-sys-roundcube
  1857. write_config_value "WEBMAIL_ALIAS" "webmail"
  1858. else
  1859. write_config_value "WEBMAIL_ALIAS" ""
  1860. write_config_value "WEBMAIL_SYSTEM" ""
  1861. fi
  1862. #----------------------------------------------------------#
  1863. # Install Sieve #
  1864. #----------------------------------------------------------#
  1865. # Min requirements Dovecot + Exim + Mysql + Roundcube
  1866. if [ "$sieve" = 'yes' ]; then
  1867. # Folder paths
  1868. RC_INSTALL_DIR="/var/lib/roundcube"
  1869. RC_CONFIG_DIR="/etc/roundcube"
  1870. echo "[ * ] Installing Sieve Mail Filter..."
  1871. # dovecot.conf install
  1872. sed -i "s/namespace/service stats \{\n unix_listener stats-writer \{\n group = mail\n mode = 0660\n user = dovecot\n \}\n\}\n\nnamespace/g" /etc/dovecot/dovecot.conf
  1873. # Dovecot conf files
  1874. # 10-master.conf
  1875. sed -i -E -z "s/ }\n user = dovecot\n}/ \}\n unix_listener auth-master \{\n group = mail\n mode = 0660\n user = dovecot\n \}\n user = dovecot\n\}/g" /etc/dovecot/conf.d/10-master.conf
  1876. # 15-lda.conf
  1877. sed -i "s/\#mail_plugins = \\\$mail_plugins/mail_plugins = \$mail_plugins quota sieve\n auth_socket_path = \/var\/run\/dovecot\/auth-master/g" /etc/dovecot/conf.d/15-lda.conf
  1878. # 20-imap.conf
  1879. sed -i "s/mail_plugins = quota imap_quota/mail_plugins = quota imap_quota imap_sieve/g" /etc/dovecot/conf.d/20-imap.conf
  1880. # Replace dovecot-sieve config files
  1881. cp -f $HESTIA_COMMON_DIR/dovecot/sieve/* /etc/dovecot/conf.d
  1882. # Dovecot default file install
  1883. echo -e "require [\"fileinto\"];\n# rule:[SPAM]\nif header :contains \"X-Spam-Flag\" \"YES\" {\n fileinto \"INBOX.Spam\";\n}\n" > /etc/dovecot/sieve/default
  1884. # exim4 install
  1885. sed -i "s/\stransport = local_delivery/ transport = dovecot_virtual_delivery/" /etc/exim4/exim4.conf.template
  1886. sed -i "s/address_pipe:/dovecot_virtual_delivery:\n driver = pipe\n command = \/usr\/lib\/dovecot\/dovecot-lda -e -d \${extract{1}{:}{\${lookup{\$local_part}lsearch{\/etc\/exim4\/domains\/\${lookup{\$domain}dsearch{\/etc\/exim4\/domains\/}}\/accounts}}}}@\${lookup{\$domain}dsearch{\/etc\/exim4\/domains\/}}\n delivery_date_add\n envelope_to_add\n return_path_add\n log_output = true\n log_defer_output = true\n user = \${extract{2}{:}{\${lookup{\$local_part}lsearch{\/etc\/exim4\/domains\/\${lookup{\$domain}dsearch{\/etc\/exim4\/domains\/}}\/passwd}}}}\n group = mail\n return_output\n\naddress_pipe:/g" /etc/exim4/exim4.conf.template
  1887. # Permission changes
  1888. chown -R dovecot:mail /var/log/dovecot.log
  1889. chmod 660 /var/log/dovecot.log
  1890. if [ -d "/var/lib/roundcube" ]; then
  1891. # Modify Roundcube config
  1892. mkdir -p $RC_CONFIG_DIR/plugins/managesieve
  1893. cp -f $HESTIA_COMMON_DIR/roundcube/plugins/config_managesieve.inc.php $RC_CONFIG_DIR/plugins/managesieve/config.inc.php
  1894. ln -s $RC_CONFIG_DIR/plugins/managesieve/config.inc.php $RC_INSTALL_DIR/plugins/managesieve/config.inc.php
  1895. chown -R root:hestiamail $RC_CONFIG_DIR/
  1896. chmod 751 -R $RC_CONFIG_DIR
  1897. chmod 644 $RC_CONFIG_DIR/*.php
  1898. chmod 644 $RC_CONFIG_DIR/plugins/managesieve/config.inc.php
  1899. sed -i "s/\"archive\"/\"archive\", \"managesieve\"/g" $RC_CONFIG_DIR/config.inc.php
  1900. fi
  1901. # Restart Dovecot and exim4
  1902. systemctl restart dovecot > /dev/null 2>&1
  1903. systemctl restart exim4 > /dev/null 2>&1
  1904. fi
  1905. #----------------------------------------------------------#
  1906. # Configure API #
  1907. #----------------------------------------------------------#
  1908. if [ "$api" = "yes" ]; then
  1909. # Keep legacy api enabled until transition is complete
  1910. write_config_value "API" "yes"
  1911. write_config_value "API_SYSTEM" "1"
  1912. write_config_value "API_ALLOWED_IP" ""
  1913. else
  1914. write_config_value "API" "no"
  1915. write_config_value "API_SYSTEM" "0"
  1916. write_config_value "API_ALLOWED_IP" ""
  1917. $HESTIA/bin/v-change-sys-api disable
  1918. fi
  1919. #----------------------------------------------------------#
  1920. # Configure Web terminal #
  1921. #----------------------------------------------------------#
  1922. # Web terminal
  1923. if [ "$webterminal" = 'yes' ]; then
  1924. write_config_value "WEB_TERMINAL" "true"
  1925. systemctl daemon-reload > /dev/null 2>&1
  1926. systemctl enable hestia-web-terminal > /dev/null 2>&1
  1927. systemctl restart hestia-web-terminal > /dev/null 2>&1
  1928. else
  1929. write_config_value "WEB_TERMINAL" "false"
  1930. fi
  1931. #----------------------------------------------------------#
  1932. # Configure File Manager #
  1933. #----------------------------------------------------------#
  1934. echo "[ * ] Configuring File Manager..."
  1935. $HESTIA/bin/v-add-sys-filemanager quiet
  1936. #----------------------------------------------------------#
  1937. # Configure dependencies #
  1938. #----------------------------------------------------------#
  1939. echo "[ * ] Configuring PHP dependencies..."
  1940. $HESTIA/bin/v-add-sys-dependencies quiet
  1941. echo "[ * ] Installing Rclone..."
  1942. curl -s https://rclone.org/install.sh | bash > /dev/null 2>&1
  1943. #----------------------------------------------------------#
  1944. # Configure IP #
  1945. #----------------------------------------------------------#
  1946. # Configuring system IPs
  1947. echo "[ * ] Configuring System IP..."
  1948. $HESTIA/bin/v-update-sys-ip > /dev/null 2>&1
  1949. # Get primary IP
  1950. default_nic="$(ip -d -j route show | jq -r '.[] | if .dst == "default" then .dev else empty end')"
  1951. # IPv4
  1952. primary_ipv4="$(ip -4 -d -j addr show "$default_nic" | jq -r '.[] | select(length > 0) | .addr_info[] | if .scope == "global" then .local else empty end' | head -n1)"
  1953. # IPv6
  1954. #primary_ipv6="$(ip -6 -d -j addr show "$default_nic" | jq -r '.[] | select(length > 0) | .addr_info[] | if .scope == "global" then .local else empty end' | head -n1)"
  1955. ip="$primary_ipv4"
  1956. local_ip="$primary_ipv4"
  1957. # Configuring firewall
  1958. if [ "$iptables" = 'yes' ]; then
  1959. $HESTIA/bin/v-update-firewall
  1960. fi
  1961. # Get public IP
  1962. pub_ipv4="$(curl -fsLm5 --retry 2 --ipv4 https://ip.hestiacp.com/)"
  1963. if [ -n "$pub_ipv4" ] && [ "$pub_ipv4" != "$ip" ]; then
  1964. if [ -e /etc/rc.local ]; then
  1965. sed -i '/exit 0/d' /etc/rc.local
  1966. else
  1967. touch /etc/rc.local
  1968. fi
  1969. check_rclocal=$(cat /etc/rc.local | grep "#!")
  1970. if [ -z "$check_rclocal" ]; then
  1971. echo "#!/bin/sh" >> /etc/rc.local
  1972. fi
  1973. # Fix for Proxmox VE containers where hostname is reset to non-FQDN format on reboot
  1974. check_pve=$(uname -r | grep pve)
  1975. if [ ! -z "$check_pve" ]; then
  1976. echo 'hostname=$(hostname --fqdn)' >> /etc/rc.local
  1977. echo ""$HESTIA/bin/v-change-sys-hostname" "'"$hostname"'"" >> /etc/rc.local
  1978. fi
  1979. echo "$HESTIA/bin/v-update-sys-ip" >> /etc/rc.local
  1980. echo "exit 0" >> /etc/rc.local
  1981. chmod +x /etc/rc.local
  1982. systemctl enable rc-local > /dev/null 2>&1
  1983. $HESTIA/bin/v-change-sys-ip-nat "$ip" "$pub_ipv4" > /dev/null 2>&1
  1984. ip="$pub_ipv4"
  1985. fi
  1986. # Configuring libapache2-mod-remoteip
  1987. if [ "$apache" = 'yes' ] && [ "$nginx" = 'yes' ]; then
  1988. cd /etc/apache2/mods-available
  1989. echo "<IfModule mod_remoteip.c>" > remoteip.conf
  1990. echo " RemoteIPHeader X-Real-IP" >> remoteip.conf
  1991. if [ "$local_ip" != "127.0.0.1" ] && [ "$pub_ipv4" != "127.0.0.1" ]; then
  1992. echo " RemoteIPInternalProxy 127.0.0.1" >> remoteip.conf
  1993. fi
  1994. if [ -n "$local_ip" ] && [ "$local_ip" != "$pub_ipv4" ]; then
  1995. echo " RemoteIPInternalProxy $local_ip" >> remoteip.conf
  1996. fi
  1997. if [ -n "$pub_ipv4" ]; then
  1998. echo " RemoteIPInternalProxy $pub_ipv4" >> remoteip.conf
  1999. fi
  2000. echo "</IfModule>" >> remoteip.conf
  2001. sed -i "s/LogFormat \"%h/LogFormat \"%a/g" /etc/apache2/apache2.conf
  2002. a2enmod remoteip >> $LOG
  2003. systemctl restart apache2
  2004. fi
  2005. # Adding default domain
  2006. $HESTIA/bin/v-add-web-domain "$username" "$servername" "$ip"
  2007. check_result $? "can't create $servername domain"
  2008. # Adding cron jobs
  2009. export SCHEDULED_RESTART="yes"
  2010. min=$(gen_pass '012345' '2')
  2011. hour=$(gen_pass '1234567' '1')
  2012. echo "MAILTO=\"\"" > /var/spool/cron/crontabs/hestiaweb
  2013. echo "CONTENT_TYPE=\"text/plain; charset=utf-8\"" >> /var/spool/cron/crontabs/hestiaweb
  2014. echo "*/2 * * * * sudo /usr/local/hestia/bin/v-update-sys-queue restart" >> /var/spool/cron/crontabs/hestiaweb
  2015. echo "10 00 * * * sudo /usr/local/hestia/bin/v-update-sys-queue daily" >> /var/spool/cron/crontabs/hestiaweb
  2016. echo "15 02 * * * sudo /usr/local/hestia/bin/v-update-sys-queue disk" >> /var/spool/cron/crontabs/hestiaweb
  2017. echo "10 00 * * * sudo /usr/local/hestia/bin/v-update-sys-queue traffic" >> /var/spool/cron/crontabs/hestiaweb
  2018. echo "30 03 * * * sudo /usr/local/hestia/bin/v-update-sys-queue webstats" >> /var/spool/cron/crontabs/hestiaweb
  2019. echo "*/5 * * * * sudo /usr/local/hestia/bin/v-update-sys-queue backup" >> /var/spool/cron/crontabs/hestiaweb
  2020. echo "10 05 * * * sudo /usr/local/hestia/bin/v-backup-users" >> /var/spool/cron/crontabs/hestiaweb
  2021. echo "20 00 * * * sudo /usr/local/hestia/bin/v-update-user-stats" >> /var/spool/cron/crontabs/hestiaweb
  2022. echo "*/5 * * * * sudo /usr/local/hestia/bin/v-update-sys-rrd" >> /var/spool/cron/crontabs/hestiaweb
  2023. echo "$min $hour * * * sudo /usr/local/hestia/bin/v-update-letsencrypt-ssl" >> /var/spool/cron/crontabs/hestiaweb
  2024. echo "41 4 * * * sudo /usr/local/hestia/bin/v-update-sys-hestia-all" >> /var/spool/cron/crontabs/hestiaweb
  2025. chmod 600 /var/spool/cron/crontabs/hestiaweb
  2026. chown hestiaweb:hestiaweb /var/spool/cron/crontabs/hestiaweb
  2027. # Enable automatic updates
  2028. $HESTIA/bin/v-add-cron-hestia-autoupdate apt
  2029. # Building initital rrd images
  2030. $HESTIA/bin/v-update-sys-rrd
  2031. # Enabling file system quota
  2032. if [ "$quota" = 'yes' ]; then
  2033. $HESTIA/bin/v-add-sys-quota
  2034. fi
  2035. # Set backend port
  2036. $HESTIA/bin/v-change-sys-port $port > /dev/null 2>&1
  2037. # Create default configuration files
  2038. $HESTIA/bin/v-update-sys-defaults
  2039. # Update remaining packages since repositories have changed
  2040. echo -ne "[ * ] Installing remaining software updates..."
  2041. apt-get -qq update
  2042. apt-get -y upgrade >> $LOG &
  2043. BACK_PID=$!
  2044. echo
  2045. # Starting Hestia service
  2046. update-rc.d hestia defaults
  2047. systemctl start hestia
  2048. check_result $? "hestia start failed"
  2049. chown hestiaweb:hestiaweb $HESTIA/data/sessions
  2050. # Create backup folder and set correct permission
  2051. mkdir -p /backup/
  2052. chmod 755 /backup/
  2053. # Create cronjob to generate ssl
  2054. echo "@reboot root sleep 10 && rm /etc/cron.d/hestia-ssl && PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:' && /usr/local/hestia/bin/v-add-letsencrypt-host" > /etc/cron.d/hestia-ssl
  2055. #----------------------------------------------------------#
  2056. # Set hestia.conf default values #
  2057. #----------------------------------------------------------#
  2058. echo "[ * ] Updating configuration files..."
  2059. BIN="$HESTIA/bin"
  2060. source $HESTIA/func/syshealth.sh
  2061. syshealth_repair_system_config
  2062. # Add /usr/local/hestia/bin/ to path variable
  2063. echo 'if [ "${PATH#*/usr/local/hestia/bin*}" = "$PATH" ]; then
  2064. . /etc/profile.d/hestia.sh
  2065. fi' >> /root/.bashrc
  2066. #----------------------------------------------------------#
  2067. # Hestia Access Info #
  2068. #----------------------------------------------------------#
  2069. # Comparing hostname and IP
  2070. host_ip=$(host $servername | head -n 1 | awk '{print $NF}')
  2071. if [ "$host_ip" = "$ip" ]; then
  2072. ip="$servername"
  2073. fi
  2074. echo -e "\n"
  2075. echo "===================================================================="
  2076. echo -e "\n"
  2077. # Sending notification to admin email
  2078. echo -e "Congratulations!
  2079. You have successfully installed Hestia Control Panel on your server.
  2080. Ready to get started? Log in using the following credentials:
  2081. Admin URL: https://$servername:$port" > $tmpfile
  2082. if [ "$host_ip" != "$ip" ]; then
  2083. echo " Backup URL: https://$ip:$port" >> $tmpfile
  2084. fi
  2085. echo -e -n " Username: $username
  2086. Password: $displaypass
  2087. Thank you for choosing Hestia Control Panel to power your full stack web server,
  2088. we hope that you enjoy using it as much as we do!
  2089. Please feel free to contact us at any time if you have any questions,
  2090. or if you encounter any bugs or problems:
  2091. Documentation: https://docs.hestiacp.com/
  2092. Forum: https://forum.hestiacp.com/
  2093. GitHub: https://www.github.com/hestiacp/hestiacp
  2094. Note: Automatic updates are enabled by default. If you would like to disable them,
  2095. please log in and navigate to Server > Updates to turn them off.
  2096. Help support the Hestia Control Panel project by donating via PayPal:
  2097. https://www.hestiacp.com/donate
  2098. --
  2099. Sincerely yours,
  2100. The Hestia Control Panel development team
  2101. Made with love & pride by the open-source community around the world.
  2102. " >> $tmpfile
  2103. send_mail="$HESTIA/web/inc/mail-wrapper.php"
  2104. cat $tmpfile | $send_mail -s "Hestia Control Panel" $email
  2105. # Congrats
  2106. echo
  2107. cat $tmpfile
  2108. rm -f $tmpfile
  2109. # Add welcome message to notification panel
  2110. $HESTIA/bin/v-add-user-notification "$username" 'Welcome to Hestia Control Panel!' '<p>You are now ready to begin adding <a href="/add/user/">user accounts</a> and <a href="/add/web/">domains</a>. For help and assistance, <a href="https://hestiacp.com/docs/" target="_blank">view the documentation</a> or <a href="https://forum.hestiacp.com/" target="_blank">visit our forum</a>.</p><p>Please <a href="https://github.com/hestiacp/hestiacp/issues" target="_blank">report any issues via GitHub</a>.</p><p class="u-text-bold">Have a wonderful day!</p><p><i class="fas fa-heart icon-red"></i> The Hestia Control Panel development team</p>'
  2111. # Clean-up
  2112. # Sort final configuration file
  2113. sort_config_file
  2114. if [ "$interactive" = 'yes' ]; then
  2115. echo "[ ! ] IMPORTANT: The system will now reboot to complete the installation process."
  2116. read -n 1 -s -r -p "Press any key to continue"
  2117. reboot
  2118. else
  2119. echo "[ ! ] IMPORTANT: You must restart the system before continuing!"
  2120. fi
  2121. # EOF