install-rhel.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. #!/bin/bash
  2. # should be run as root on a rhel8-like system
  3. function update_permissions
  4. {
  5. # fix permissions of /srv/mediacms directory
  6. chown -R nginx:root $1
  7. }
  8. echo "Welcome to the MediacMS installation!";
  9. if [ `id -u` -ne 0 ]; then
  10. echo "Please run as root user"
  11. exit
  12. fi
  13. while true; do
  14. read -p "
  15. This script will attempt to perform a system update, install required dependencies, and configure PostgreSQL, NGINX, Redis and a few other utilities.
  16. It is expected to run on a new system **with no running instances of any these services**. Make sure you check the script before you continue. Then enter y or n
  17. " yn
  18. case $yn in
  19. [Yy]* ) echo "OK!"; break;;
  20. [Nn]* ) echo "Have a great day"; exit;;
  21. * ) echo "Please answer y or n.";;
  22. esac
  23. done
  24. # update configuration files
  25. sed -i 's/\/home\/mediacms\.io\/mediacms\/Bento4-SDK-1-6-0-637\.x86_64-unknown-linux\/bin\/mp4hls/\/srv\/mediacms\/bento4\/bin\/mp4hls/g' cms/settings.py
  26. sed -i 's/www-data/nginx/g;s/\/home\/mediacms\.io\/mediacms\/logs/\/var\/log\/mediacms/g;s/\/home\/mediacms\.io\/mediacms/\/srv\/mediacms/g;s/\/home\/mediacms\.io\/bin/\/srv\/mediacms\/virtualenv\/bin/g' deploy/local_install/celery_*.service
  27. sed -i 's/\/home\/mediacms\.io\/mediacms/\/srv\/mediacms/g' deploy/local_install/mediacms.io
  28. sed -i 's/\/home\/mediacms\.io\/bin/\/srv\/mediacms\/virtualenv\/bin/g;s/\/home\/mediacms\.io\/mediacms/\/srv\/mediacms/g' deploy/local_install/mediacms.service
  29. sed -i 's/\/home\/mediacms\.io\/mediacms/\/var\/log\/mediacms/g' deploy/local_install/mediacms_logrorate
  30. sed -i 's/www-data/nginx/g' deploy/local_install/nginx.conf
  31. sed -i 's/www-data/nginx/g;s/\/home\/mediacms\.io\/mediacms\/logs/\/var\/log\/mediacms/g;s/\/home\/mediacms\.io\/mediacms/\/srv\/mediacms/g;s/\/home\/mediacms\.io/\/srv\/mediacms\/virtualenv/g' deploy/local_install/uwsgi.ini
  32. osVersion=
  33. if [[ -f /etc/os-release ]]; then
  34. osVersion=$(grep ^ID /etc/os-release)
  35. fi
  36. if [[ $osVersion == *"fedora"* ]] || [[ $osVersion == *"rhel"* ]] || [[ $osVersion == *"centos"* ]] || [[ *"rocky"* ]]; then
  37. dnf install -y epel-release https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm yum-utils
  38. yum-config-manager --enable powertools
  39. dnf install -y python3-virtualenv python39-devel redis postgresql postgresql-server nginx git gcc vim unzip ImageMagick python3-certbot-nginx certbot wget xz ffmpeg policycoreutils-devel cmake gcc gcc-c++ wget git bsdtar
  40. else
  41. echo "unsupported or unknown os"
  42. exit -1
  43. fi
  44. # fix permissions of /srv/mediacms directory
  45. update_permissions /srv/mediacms/
  46. read -p "Enter portal URL, or press enter for localhost : " FRONTEND_HOST
  47. read -p "Enter portal name, or press enter for 'MediaCMS : " PORTAL_NAME
  48. [ -z "$PORTAL_NAME" ] && PORTAL_NAME='MediaCMS'
  49. [ -z "$FRONTEND_HOST" ] && FRONTEND_HOST='localhost'
  50. echo "Configuring postgres"
  51. if [ ! command -v postgresql-setup > /dev/null 2>&1 ]; then
  52. echo "Something went wrong, the command 'postgresql-setup' was not found in the system path."
  53. exit -1
  54. fi
  55. postgresql-setup --initdb
  56. # set authentication method for mediacms user to scram-sha-256
  57. sed -i 's/.*password_encryption.*/password_encryption = scram-sha-256/' /var/lib/pgsql/data/postgresql.conf
  58. sed -i '/# IPv4 local connections:/a host\tmediacms\tmediacms\t127.0.0.1/32\tscram-sha-256' /var/lib/pgsql/data/pg_hba.conf
  59. systemctl enable postgresql.service --now
  60. su -c "psql -c \"CREATE DATABASE mediacms\"" postgres
  61. su -c "psql -c \"CREATE USER mediacms WITH ENCRYPTED PASSWORD 'mediacms'\"" postgres
  62. su -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE mediacms TO mediacms\"" postgres
  63. echo 'Creating python virtualenv on /srv/mediacms/virtualenv/'
  64. mkdir /srv/mediacms/virtualenv/
  65. cd /srv/mediacms/virtualenv/
  66. virtualenv . --python=python3
  67. source /srv/mediacms/virtualenv/bin/activate
  68. cd /srv/mediacms/
  69. pip install -r requirements.txt
  70. systemctl enable redis.service --now
  71. SECRET_KEY=`python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'`
  72. # remove http or https prefix
  73. FRONTEND_HOST=`echo "$FRONTEND_HOST" | sed -r 's/http:\/\///g'`
  74. FRONTEND_HOST=`echo "$FRONTEND_HOST" | sed -r 's/https:\/\///g'`
  75. FRONTEND_HOST_HTTP_PREFIX='http://'$FRONTEND_HOST
  76. echo 'FRONTEND_HOST='\'"$FRONTEND_HOST_HTTP_PREFIX"\' >> cms/local_settings.py
  77. echo 'PORTAL_NAME='\'"$PORTAL_NAME"\' >> cms/local_settings.py
  78. echo "SSL_FRONTEND_HOST = FRONTEND_HOST.replace('http', 'https')" >> cms/local_settings.py
  79. echo 'SECRET_KEY='\'"$SECRET_KEY"\' >> cms/local_settings.py
  80. echo "LOCAL_INSTALL = True" >> cms/local_settings.py
  81. mkdir /var/log/mediacms/
  82. mkdir pids
  83. update_permissions /var/log/mediacms/
  84. python manage.py migrate
  85. python manage.py loaddata fixtures/encoding_profiles.json
  86. python manage.py loaddata fixtures/categories.json
  87. python manage.py collectstatic --noinput
  88. ADMIN_PASS=`python -c "import secrets;chars = 'abcdefghijklmnopqrstuvwxyz0123456789';print(''.join(secrets.choice(chars) for i in range(10)))"`
  89. echo "from users.models import User; User.objects.create_superuser('admin', 'admin@example.com', '$ADMIN_PASS')" | python manage.py shell
  90. echo "from django.contrib.sites.models import Site; Site.objects.update(name='$FRONTEND_HOST', domain='$FRONTEND_HOST')" | python manage.py shell
  91. update_permissions /srv/mediacms/
  92. cp deploy/local_install/celery_long.service /etc/systemd/system/celery_long.service
  93. cp deploy/local_install/celery_short.service /etc/systemd/system/celery_short.service
  94. cp deploy/local_install/celery_beat.service /etc/systemd/system/celery_beat.service
  95. cp deploy/local_install/mediacms.service /etc/systemd/system/mediacms.service
  96. mkdir -p /etc/letsencrypt/live/$FRONTEND_HOST
  97. mkdir -p /etc/nginx/sites-enabled
  98. mkdir -p /etc/nginx/sites-available
  99. mkdir -p /etc/nginx/dhparams/
  100. rm -rf /etc/nginx/conf.d/default.conf
  101. rm -rf /etc/nginx/sites-enabled/default
  102. cp deploy/local_install/mediacms.io_fullchain.pem /etc/letsencrypt/live/$FRONTEND_HOST/fullchain.pem
  103. cp deploy/local_install/mediacms.io_privkey.pem /etc/letsencrypt/live/$FRONTEND_HOST/privkey.pem
  104. cp deploy/local_install/mediacms.io /etc/nginx/sites-available/mediacms.io
  105. ln -s /etc/nginx/sites-available/mediacms.io /etc/nginx/sites-enabled/mediacms.io
  106. cp deploy/local_install/uwsgi_params /etc/nginx/sites-enabled/uwsgi_params
  107. cp deploy/local_install/nginx.conf /etc/nginx/
  108. # attempt to get a valid certificate for specified domain
  109. while true ; do
  110. echo "Would you like to run [c]ertbot, or [s]kip?"
  111. read -p " : " certbotConfig
  112. case $certbotConfig in
  113. [cC*] )
  114. if [ "$FRONTEND_HOST" != "localhost" ]; then
  115. systemctl start
  116. echo 'attempt to get a valid certificate for specified url $FRONTEND_HOST'
  117. certbot --nginx -n --agree-tos --register-unsafely-without-email -d $FRONTEND_HOST
  118. certbot --nginx -n --agree-tos --register-unsafely-without-email -d $FRONTEND_HOST
  119. # unfortunately for some reason it needs to be run two times in order to create the entries
  120. # and directory structure!!!
  121. systemctl stop nginx
  122. # Generate individual DH params
  123. openssl dhparam -out /etc/nginx/dhparams/dhparams.pem 4096
  124. fi
  125. break
  126. ;;
  127. [sS*] )
  128. echo "will not call certbot utility to update ssl certificate for url 'localhost', using default ssl certificate"
  129. cp deploy/local_install/dhparams.pem /etc/nginx/dhparams/dhparams.pem
  130. break
  131. ;;
  132. * )
  133. echo "Unknown option: $certbotConfig"
  134. ;;
  135. esac
  136. done
  137. # configure bento4 utility installation, for HLS
  138. while true ; do
  139. echo "Configuring Bento4"
  140. echo "Would you like to [d]ownload a pre-compiled bento4 binary, or [b]uild it now?"
  141. read -p "b/d : " bentoConfig
  142. case $bentoConfig in
  143. [bB*] )
  144. echo "Building bento4 from source"
  145. git clone -b v1.6.0-640 https://github.com/axiomatic-systems/Bento4 /srv/mediacms/bento4
  146. cd /srv/mediacms/bento4/
  147. mkdir bin
  148. cd /srv/mediacms/bento4/bin/
  149. cmake -DCMAKE_BUILD_TYPE=Release ..
  150. make -j$(nproc)
  151. chmod +x ../Source/Python/utils/mp4-hls.py
  152. echo -e '#!/bin/bash' >> mp4hls
  153. echo -e 'BASEDIR=$(pwd)' >> mp4hls
  154. echo -e 'exec python3 "$BASEDIR/../Source/Python/utils/mp4-hls.py"' >> mp4hls
  155. chmod +x mp4hls
  156. break
  157. ;;
  158. [dD*] )
  159. cd /srv/mediacms/
  160. wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
  161. bsdtar -xf Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip -s '/Bento4-SDK-1-6-0-637.x86_64-unknown-linux/bento4/'
  162. break
  163. ;;
  164. * )
  165. echo "Unknown option: $bentoConfig"
  166. ;;
  167. esac
  168. done
  169. mkdir /srv/mediacms/media_files/hls
  170. # update permissions
  171. update_permissions /srv/mediacms/
  172. # configure selinux
  173. while true ; do
  174. echo "Configuring SELinux"
  175. echo "Would you like to [d]isable SELinux until next reboot, [c]onfigure our SELinux module, or [s]kip and not do any SELinux confgiguration?"
  176. read -p "d/c/s : " seConfig
  177. case $seConfig in
  178. [Dd]* )
  179. echo "Disabling SELinux until next reboot"
  180. break
  181. ;;
  182. [Cc]* )
  183. echo "Configuring custom mediacms selinux module"
  184. semanage fcontext -a -t bin_t /srv/mediacms/virtualenv/bin/
  185. semanage fcontext -a -t httpd_sys_content_t "/srv/mediacms(/.*)?"
  186. restorecon -FRv /srv/mediacms/
  187. sebools=(httpd_can_network_connect httpd_graceful_shutdown httpd_can_network_relay nis_enabled httpd_setrlimit domain_can_mmap_files)
  188. for bool in "${sebools[@]}"
  189. do
  190. setsebool -P $bool 1
  191. done
  192. cd /srv/mediacms/deploy/local_install/
  193. make -f /usr/share/selinux/devel/Makefile selinux-mediacms.pp
  194. semodule -i selinux-mediacms.pp
  195. break
  196. ;;
  197. [Ss]* )
  198. echo "Skipping SELinux configuration"
  199. break
  200. ;;
  201. * )
  202. echo "Unknown option: $seConfig"
  203. ;;
  204. esac
  205. done
  206. # configure firewall
  207. if command -v firewall-cmd > /dev/null 2>&1 ; then
  208. while true ; do
  209. echo "Configuring firewall"
  210. echo "Would you like to configure http, https, or skip and not do any firewall configuration?"
  211. read -p "http/https/skip : " fwConfig
  212. case $fwConfig in
  213. http )
  214. echo "Opening port 80 until next reboot"
  215. firewall-cmd --add-port=80/tcp
  216. break
  217. ;;
  218. https )
  219. echo "Opening port 443 permanently"
  220. firewall-cmd --add-port=443/tcp --permanent
  221. firewall-cmd --reload
  222. break
  223. ;;
  224. skip )
  225. echo "Skipping firewall configuration"
  226. break
  227. ;;
  228. * )
  229. echo "Unknown option: $fwConfig"
  230. ;;
  231. esac
  232. done
  233. fi
  234. systemctl daemon-reload
  235. systemctl start celery_long.service
  236. systemctl start celery_short.service
  237. systemctl start celery_beat.service
  238. systemctl start mediacms.service
  239. systemctl start nginx.service
  240. echo 'MediaCMS installation completed, open browser on http://'"$FRONTEND_HOST"' and login with user admin and password '"$ADMIN_PASS"''