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