Skip to content

Instantly share code, notes, and snippets.

@AstmDesign
Created May 11, 2020 09:37
Show Gist options
  • Select an option

  • Save AstmDesign/c0f8e59daacc11124b6f78056343301b to your computer and use it in GitHub Desktop.

Select an option

Save AstmDesign/c0f8e59daacc11124b6f78056343301b to your computer and use it in GitHub Desktop.

Revisions

  1. AstmDesign created this gist May 11, 2020.
    394 changes: 394 additions & 0 deletions install_rails_5.2_ruby2.6.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,394 @@
    #!/bin/bash
    #
    # Install Rails 5.2.4 & Ruby 2.6.4 server environment
    # Created by Astm Ali | https://github.com/astmdesign
    #

    clear

    echo "$(tput setaf 201)--------------------------------"
    echo "Install Rails 5.2.4 & Ruby 2.6.4 server environment As $(whoami) user"
    echo "-------------------------------- $(tput setaf 0)"

    # Define my variables
    export deployer_user="deploy"
    export postgres_user="postgres"
    export domain="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    export app_name="sprinteg"
    export db_user="sprinteg"
    export db_name="sprinteg_production"
    export shared_folder_path="/home/$deployer_user/$app_name/shared"

    echo -e "\n$(tput setaf 1)################## Update apt ################## $(tput setaf 0)"
    apt-get update

    # Create deployer user if it not found
    if grep "$deployer_user" /etc/passwd
    then

    echo -e "\n$(tput setaf 1) $deployer_user user already exist: use su $deployer_user to login with it $(tput setaf 0)"

    # Check if it the postgres user
    if [[ $(whoami) == "$postgres_user" ]]
    then
    echo -e "\n$(tput setaf 1)################## Create DB user ################## $(tput setaf 0)"
    createuser --pwprompt "$db_user"

    echo -e "\n$(tput setaf 1)################## Create DB ################## $(tput setaf 0)"
    createdb -O "$db_user" "$db_name"

    # echo -e "\n$(tput setaf 1)################## Check the default PostgreSQL DB user ################## $(tput setaf 0)"
    # psql # --> open console
    # \du # --> show db users
    # \l # --> List db
    # psql --dbname=devops_production # --> login as deployer user
    # \q
    # Login as deployer linux user
    su - "$deployer_user"
    fi

    else
    echo -e "\n$(tput setaf 1)################## Add $deployer_user user ################## $(tput setaf 0)"
    sudo adduser "$deployer_user"
    adduser "$deployer_user" sudo

    echo -e "\n$(tput setaf 1)################## Checking $deployer_user user ################## $(tput setaf 0)"
    tail -n 1 /etc/passwd
    fi

    # Login with the deployer user if it not db user
    if [[ $(whoami) == "$deployer_user" ]]
    then
    echo -e "\n$(tput setaf 1)################## Install Git ################## $(tput setaf 0)"
    sudo apt-get install git -y

    echo -e "\n$(tput setaf 1)################## Checking Git version ################## $(tput setaf 0)"
    git version

    echo -e "\n$(tput setaf 1)################## Install Rbenv ################## $(tput setaf 0)"
    cd
    rm -rf ~/.rbenv
    git clone https://github.com/rbenv/rbenv.git ~/.rbenv
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
    echo 'eval "$(rbenv init -)"' >> ~/.bashrc
    export PATH="$HOME/.rbenv/bin:$PATH"
    eval "$(rbenv init -)"

    git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
    echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
    source ~/.bashrc
    export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
    rbenv rehash

    echo -e "\n$(tput setaf 1)################## Checking the Rbenv version ################## $(tput setaf 0)"
    rbenv -v

    echo -e "\n$(tput setaf 1)################## Installing Ruby 2.6.4 ################## $(tput setaf 0)"
    sudo apt-get update
    sudo apt-get install -y build-essential libssl-dev libreadline-dev ruby-dev zlib1g-dev liblzma-dev
    sudo apt-get install -y libyaml-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev
    sudo apt-get install -y software-properties-common libffi-dev yarn libmagickwand-dev
    rbenv install 2.6.4
    rbenv global 2.6.4

    echo -e "\n$(tput setaf 1)################## Checking Ruby versions ################## $(tput setaf 0)"
    rbenv versions

    echo -e "\n$(tput setaf 1)################## Checking Ruby Global version ################## $(tput setaf 0)"
    ruby -v

    echo -e "\n$(tput setaf 1)################## Installing NodeJS ################## $(tput setaf 0)"
    sudo apt-get install nodejs -y

    echo -e "\n$(tput setaf 1)################## Checking NodeJs version ################## $(tput setaf 0)"
    nodejs -v

    echo -e "\n$(tput setaf 1)################## Installing Bundler ################## $(tput setaf 0)"
    # disable parsing gem documentation
    echo "gem: --no-document" > ~/.gemrc
    gem uninstall bundler
    gem install bundler -v 1.17.3
    gem install bundler
    gem update --system

    echo -e "\n$(tput setaf 1)################## Installing Graphviz for ERD Gem ################## $(tput setaf 0)"
    sudo apt-get install graphviz

    echo -e "\n$(tput setaf 1)################## Checking Gem version ################## $(tput setaf 0)"
    gem -v

    echo -e "\n$(tput setaf 1)################## List installed Bundlers ################## $(tput setaf 0)"
    gem list | grep bundler

    echo -e "\n$(tput setaf 1)################## Checking default Bundler version ################## $(tput setaf 0)"
    bundler -v

    echo -e "\n$(tput setaf 1)################## Installing Rails ################## $(tput setaf 0)"
    gem install rails -v 5.2.4
    rbenv rehash

    echo -e "\n$(tput setaf 1)################## Checking Rails version ################## $(tput setaf 0)"
    rails -v

    echo -e "\n$(tput setaf 1)################## Install Nginx & Passenger ################## $(tput setaf 0)"

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
    sudo apt-get install -y apt-transport-https ca-certificates

    # Add Passenger APT repository
    sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
    sudo apt-get update

    # Install Passenger & Nginx
    sudo apt-get install -y nginx-extras passenger
    sudo service nginx start

    # default -> /etc/nginx/sites-available/default
    # Config nginx: sudo vim /etc/nginx/sites-enabled/default
    nginx_default="server {
    location /cable {
    passenger_app_group_name fms;
    passenger_force_max_concurrent_requests_per_process 0;
    }
    listen 80;
    listen [::]:80 ipv6only=on;
    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    server_name $domain;
    passenger_enabled on;
    rails_env production;
    root /home/$deployer_user/$app_name/current/public;
    # redirect server error pages to the static page /50x.html
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }"

    touch "/home/$deployer_user/default"
    sudo echo "$nginx_default" > "/home/$deployer_user/default"
    sudo mv "/home/$deployer_user/default" /etc/nginx/sites-available/default

    # Config nginx: sudo vim /etc/nginx/nginx.conf by Uncomment this line: include /etc/nginx/passenger.conf;
    sudo sh -c 'echo "
    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    events {
    worker_connections 768;
    # multi_accept on;
    }
    http {
    ##
    # Basic Settings
    ##
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;
    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    ##
    # SSL Settings
    ##
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    ##
    # Logging Settings
    ##
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    ##
    # Gzip Settings
    ##
    gzip on;
    gzip_disable "msie6";
    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    ##
    # Phusion Passenger config
    ##
    # Uncomment it if you installed passenger or passenger-enterprise
    ##
    include /etc/nginx/passenger.conf;
    ##
    # Virtual Host Configs
    ##
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    }
    # mail {
    # # See sample authentication script at:
    # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
    #
    # # auth_http localhost/auth.php;
    # # pop3_capabilities "TOP" "USER";
    # # imap_capabilities "IMAP4rev1" "UIDPLUS";
    #
    # server {
    # listen localhost:110;
    # protocol pop3;
    # proxy on;
    # }
    #
    # server {
    # listen localhost:143;
    # protocol imap;
    # proxy on;
    # }
    #}
    " > /etc/nginx/nginx.conf'

    # Config nginx: sudo vim /etc/nginx/passenger.conf by Replace passenger_ruby line with this one passenger_ruby /home/deployer/.rbenv/shims/ruby;
    nginx_passenger="
    passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
    # passenger_ruby /usr/bin/passenger_free_ruby;
    passenger_ruby /home/$deployer_user/.rbenv/shims/ruby;"

    touch "/home/$deployer_user/passenger.conf"
    sudo echo "$nginx_passenger" > "/home/$deployer_user/passenger.conf"
    sudo mv "/home/$deployer_user/passenger.conf" /etc/nginx/passenger.conf

    # Checking nginx # if fail dubeg using: sudo journalctl -xe
    sudo service nginx configtest
    # restart nginx
    sudo service nginx restart

    echo -e "\n$(tput setaf 1)################## Checking Nginx version ################## $(tput setaf 0)"
    nginx -v

    echo -e "\n$(tput setaf 1)################## Checking Nginx status ################## $(tput setaf 0)"
    sudo service nginx status

    echo -e "\n$(tput setaf 1)################## Create app folders ################## $(tput setaf 0)"
    mkdir -p "/home/$deployer_user/$app_name"
    mkdir -p "$shared_folder_path/config"
    mkdir -p "$shared_folder_path/log"
    mkdir -p "$shared_folder_path/tmp/pids"
    mkdir -p "$shared_folder_path/tmp/cache"
    mkdir -p "$shared_folder_path/tmp/sockets"
    mkdir -p "$shared_folder_path/vendor/bundle"
    mkdir -p "$shared_folder_path/public/system"
    mkdir -p "$shared_folder_path/public/uploads"
    touch "$shared_folder_path/config/database.yml"
    touch "$shared_folder_path/config/secrets.yml"
    touch "$shared_folder_path/.env"

    env_credentials="
    POSTGRES_DB=$db_name
    POSTGRES_USER=$db_user
    POSTGRES_PASSWORD=123456
    POSTGRES_HOST=localhost
    RAILS_ENV=production
    SECRET_KEY_BASE=
    URL=$domain"
    sudo echo "$env_credentials" > "$shared_folder_path/.env"

    database_credentials="production:
    adapter: postgresql
    host: <%= ENV['POSTGRES_HOST']%>
    database: <%= ENV['POSTGRES_DB'] %>
    username: <%= ENV['POSTGRES_USER'] %>
    password: <%= ENV['POSTGRES_PASSWORD'] %>
    encoding: unicode
    pool: 5"
    sudo echo "$database_credentials" > "$shared_folder_path/config/database.yml"

    secrets_credentials="production:
    secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>"

    sudo echo "$secrets_credentials" > "$shared_folder_path/config/secrets.yml"

    echo -e "\n$(tput setaf 1)################## Install PostgreSQL ################## $(tput setaf 0)"
    sudo apt-get install postgresql postgresql-contrib libpq-dev -y

    echo -e "\n$(tput setaf 1)################## Checking PostgreSQL version ################## $(tput setaf 0)"
    pg_config --version

    echo -e "\n$(tput setaf 1)################## Checking PostgreSQL status ################## $(tput setaf 0)"
    sudo service postgresql start
    sudo service postgresql status

    echo -e "\n$(tput setaf 1)################## Checking PostgreSQL user ################## $(tput setaf 0)"
    tail -n 5 /etc/passwd

    echo -e "\n$(tput setaf 1)################## Add $deployer_user user publick key ################## $(tput setaf 0)"
    mkdir -p "/home/$deployer_user/.ssh"
    touch "/home/$deployer_user/.ssh/authorized_keys"
    touch "/home/$deployer_user/.ssh/known_hosts"
    sudo cp -r /root/.ssh/authorized_keys "/home/$deployer_user/.ssh/authorized_keys"

    # For digitalocean notifications
    sudo apt-get -y purge do-agent
    sudo apt-get -y install do-agent

    echo -e "\n$(tput setaf 1)################## Summary ################## $(tput setaf 0)"
    echo "Git version:"
    git version
    echo "Rbenv version:"
    rbenv -v
    echo "Ruby version:"
    ruby -v
    echo "Nodejs version:"
    nodejs -v
    echo "Bundler version:"
    bundler -v
    echo "Gem version:"
    gem -v
    echo "Rails version:"
    rails -v
    echo "Nginx version:"
    nginx -v
    echo "PostgreSQL version:"
    pg_config --version

    echo -e "\n$(tput setaf 1) Login as postgres user: use su postgres to login with it $(tput setaf 0)"
    sudo su - "$postgres_user"
    fi

    # First add the .env creadintails before using capistrano in deploy
    # Generate sercret key locally and add it to .env file on the server
    # Enter your app folder /home/$deployer_user/$app_name
    # sudo apt install ruby-bundler -y
    # run: bundle exec rake secret
    # copy the output
    # go to $shared_folder_path/.env
    # set the production secret_key_base
    # Restart the passenger app touch $shared_folder_path/tmp/restart.txt
    # passenger-config restart-app /home/deploy/devops

    # bundle exec rake db:migrate RAILS_ENV=production
    # bundle exec rake db:seed RAILS_ENV=production

    echo -e "\n$(tput setaf 21)################## Open on your browser $(dig +short myip.opendns.com @resolver1.opendns.com) ################## $(tput setaf 0)"