Created
May 11, 2020 09:37
-
-
Save AstmDesign/c0f8e59daacc11124b6f78056343301b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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)" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment