Last active
April 26, 2024 19:16
-
-
Save danielmoralesp/ddf73ee8e2183b010ba9e290c87f407f to your computer and use it in GitHub Desktop.
Commands inside Digital Ocean + Rails 5.2
This file contains 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
## Change file size on production | |
Enter to server | |
sudo vim /etc/nginx/nginx.conf | |
Inside of http section add client_max_body_size 10M; | |
Then restart the server with: sudo service nginx restart | |
http { | |
## | |
# Basic Settings | |
## | |
client_max_body_size 10M; | |
sendfile on; | |
## setting database and connect with app | |
/brokercurve/shared/config | |
production: | |
adapter: postgresql | |
host: 127.0.0.1 | |
database: project_name | |
username: db_username | |
password: db_password | |
encoding: unicode | |
pool: 5 | |
# commands to run database VIA CAPISTRANO | |
# https://gitlab.com/ydkn/capistrano-rails-console | |
gem 'capistrano-rails-console', require: false | |
#Capfile | |
require 'capistrano/rails/console' | |
#Run a remote rails console with: | |
$ cap production rails:console | |
$ cap production rails:c | |
You can also start a sandbox session: | |
$ cap production rails:console sandbox=1 | |
Or run a dbconsole: | |
$ cap production rails:dbconsole | |
$ cap production rails:db | |
### im using capistrano, and this commands doesnt work directly on the server | |
#ssh deploy@IPADDRESS | |
#cd brokercurve/current/ | |
#bundle exec rake db:create | |
#bundle exec rake db:schema:load | |
#bundle exec rails db:migrate | |
#bundle exec rails c | |
#User.all | |
#### Elastic search: https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-16-04 | |
# instal java + elasticsearch | |
# java as dependency of elasticsearch | |
sudo apt-get install default-jdk | |
sudo add-apt-repository ppa:webupd8team/java | |
sudo apt-get update | |
sudo apt-get install oracle-java8-installer | |
# elasticsearch | |
sudo apt-get update | |
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb | |
sudo dpkg -i elasticsearch-2.3.1.deb | |
sudo systemctl enable elasticsearch.service | |
# config elasticsearch | |
sudo vim /etc/elasticsearch/elasticsearch.yml | |
cluster.name: mycluster1 | |
node.name: "My First Node" | |
node.master: true | |
node.data: true | |
sudo systemctl start elasticsearch | |
sudo systemctl restart elasticsearch | |
sudo journalctl --unit elasticsearch | |
#testing inside server | |
curl -X GET 'http://localhost:9200' | |
# run elasticsearch | |
# inside proyect in terminal | |
cap production rails:console | |
# inside rails console, run the model that yoy wan to search inside | |
Model.reindex | |
## Digital Ocean + Cloudflare | |
# to add domain on digital ocean | |
https://www.youtube.com/watch?v=QduZyoy_eFA | |
# to connect via cloudflare | |
https://www.youtube.com/watch?v=2X_Tp_G7aTs | |
## resume | |
A = @ or hostname = @ and points to @IPADDRESS and select the droplet | |
CNAME = @ or hostname = www - is an alias of brokercurve.com | |
# whenever gem to run simple task with cronjobs | |
#Capfile | |
require 'whenever/capistrano' | |
# config/deploy.rb | |
set :whenever_roles, -> { [:app, :db, :web] } | |
# terminal | |
cap production deploy | |
# server | |
crontab -l | |
### working https://stackoverflow.com/questions/28495711/setting-up-secret-key-base-on-deploy-with-capistrano-3/30809747 | |
gem 'capistrano-secrets-yml', '~> 1.0.0' | |
# make sure your local config/secrets.yml is not git tracked. It should be on the disk, but gitignored. | |
# populate production secrets in local config/secrets.yml: | |
production: | |
secret_key_base: d6ced... | |
#add to Capfile: | |
require 'capistrano/secrets_yml' | |
#create secrets.yml file on the remote server by executing this task: | |
$ bundle exec cap production setup | |
# Paperclip error with imagemagick | |
# in server run | |
sudo apt-get update | |
sudo apt-get install imagemagick | |
sudo service nginx restart | |
## Deploy sideqik and Redis to background Jobs | |
#OJOOOOOO | |
## I've had multiple issues while deploying a rails app with Redis and Sidekiq to create workers. I've the following links | |
where In worked heavily trying to solve the issues | |
- https://chat.openai.com/c/7821014a-6986-48fc-9c0f-32af02afc609 | |
- https://chat.openai.com/c/b6d5ecda-aaa7-4546-b62e-519af62260af | |
THE MAIN ISSUES WHERE: | |
- Redis 6.0 is not compatible with my Sidekiq version, so I had to delete redis 6 and re-install redis 6.2.0. | |
In theory thats not a hard problem, the problem was that seems like Ubunt 22.04 LTS, does not support redis 6.2 | |
So I had to hack the way, and use `wget` to install the package manually, also using `make`, instead of just | |
using `apt-get instal ...`. Also to do this I had to create a `.service` file in order to keep redis running in | |
the background. Check the chatgpt chat above (the last one) | |
- The other issue was creating the sidekiq_production.service and sidekiq_staging.service. The error was due to | |
the path in these two lines | |
``` | |
WorkingDirectory=/home/deploy/myapp/current | |
# If you use rbenv: | |
ExecStart=/home/deploy/.rbenv/shims/bundle exec "sidekiq -e production" | |
``` | |
- After that the key for all of this is to have redis-server running in the background without the need to do it manually | |
and then sidekiq.service runnin in green (status) | |
- That service should show the sidekiq logs | |
- Remember that sidekiq will help me run workers, which is different from whenver, which is a task. | |
sudo apt-get update | |
sudo apt-get install build-essential | |
sudo apt-get install tcl8.5 | |
wget http://download.redis.io/releases/redis-stable.tar.gz | |
tar xzf redis-stable.tar.gz | |
cd redis-stable | |
make | |
make test | |
sudo make install | |
cd utils | |
sudo ./install_server.sh | |
#output | |
#Port : 6379 | |
#Config file : /etc/redis/6379.conf | |
#Log file : /var/log/redis_6379.log | |
#Data dir : /var/lib/redis/6379 | |
#Executable : /usr/local/bin/redis-server | |
#Cli Executable : /usr/local/bin/redis-cli | |
## You can start and stop redis with these commands (the number depends on the port you set during the installation. 6379 is the default port setting): | |
sudo service redis_6379 start | |
sudo service redis_6379 stop | |
#You can then access the redis database by typing the following command: | |
redis-cli | |
#To set Redis to automatically start at boot, run: | |
sudo update-rc.d redis_6379 defaults | |
export LANGUAGE=en_US.UTF-8 | |
export LC_ALL=en_US.UTF-8 | |
export LANG=en_US.UTF-8 | |
export LC_TYPE=en_US.UTF-8 | |
## securing redis | |
sudo apt-get install ufw | |
sudo ufw default deny incoming | |
sudo ufw default allow outgoing | |
sudo ufw allow ssh | |
sudo ufw enable (+ yes) | |
sudo ufw allow http | |
sudo ufw allow https | |
# instaling sideqik | |
/lib/systemd/system | |
sudo touch sidekiq.service | |
# inside | |
##################### | |
# | |
# systemd unit file for CentOS 7, Ubuntu 15.04 | |
# | |
# Customize this file based on your bundler location, app directory, etc. | |
# Put this in /usr/lib/systemd/system (CentOS) or /lib/systemd/system (Ubuntu). | |
# Run: | |
# - systemctl enable sidekiq | |
# - systemctl {start,stop,restart} sidekiq | |
# | |
# This file corresponds to a single Sidekiq process. Add multiple copies | |
# to run multiple processes (sidekiq-1, sidekiq-2, etc). | |
# | |
# See Inspeqtor's Systemd wiki page for more detail about Systemd: | |
# https://github.com/mperham/inspeqtor/wiki/Systemd | |
# | |
[Unit] | |
Description=sidekiq | |
# start us only once the network and logging subsystems are available, | |
# consider adding redis-server.service if Redis is local and systemd-managed. | |
After=syslog.target network.target | |
# See these pages for lots of options: | |
# http://0pointer.de/public/systemd-man/systemd.service.html | |
# http://0pointer.de/public/systemd-man/systemd.exec.html | |
[Service] | |
Type=simple | |
WorkingDirectory=/home/deploy/myapp/current | |
# If you use rbenv: | |
ExecStart=/home/deploy/.rbenv/shims/bundle exec "sidekiq -e production" | |
User=deploy | |
Group=deploy | |
UMask=0002 | |
# if we crash, restart | |
RestartSec=1 | |
Restart=on-failure | |
# output goes to /var/log/syslog | |
StandardOutput=syslog | |
StandardError=syslog | |
# This will default to "bundler" if we don't specify it | |
SyslogIdentifier=sidekiq | |
[Install] | |
WantedBy=multi-user.target | |
##################### | |
#After setting up configuration, enable the Sidekiq service with: | |
systemctl enable sidekiq | |
#other useful commands for controlling the service are: | |
systemctl {start,stop,status,restart} sidekiq | |
# or | |
service sidekiq {start,stop,status,restart} | |
## Restart sidekiq after deploy | |
# config/deploy | |
## For sidekiq | |
set :pty, true | |
namespace :sidekiq do | |
task :quiet do | |
on roles(:app) do | |
puts capture("pgrep -f 'sidekiq' | xargs kill -TSTP") | |
end | |
end | |
task :restart do | |
on roles(:app) do | |
execute :sudo, :systemctl, :restart, :sidekiq | |
end | |
end | |
end | |
after 'deploy:starting', 'sidekiq:quiet' | |
after 'deploy:reverted', 'sidekiq:restart' | |
after 'deploy:published', 'sidekiq:restart' | |
## Open the sudoers file on your server with sudo visudo. On Ubuntu, this will open the file with the nano text editor. To allow passwordless sudo for our Sidekiq restart task, add this to the bottom of the file and save /exit with ctrl-x. | |
%deploy ALL=NOPASSWD:/bin/systemctl restart sidekiq | |
Given that you've already installed rbenv and set the global Ruby version, the issue might be related to the shell's environment not being properly set up to recognize rbenv and its shims (like bundle). Here's how you can troubleshoot and resolve this: | |
Ensure rbenv Initialization: | |
Make sure your shell is properly initializing rbenv. Since you're using zsh, you should add the rbenv initialization to your .zshrc file, not just .bashrc. Run these commands: | |
bash | |
Copy code | |
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc | |
echo 'eval "$(rbenv init -)"' >> ~/.zshrc | |
exec $SHELL | |
Rehash rbenv: | |
Sometimes after installing new Ruby versions or gems with binaries, you need to run rbenv rehash: | |
bash | |
Copy code | |
rbenv rehash | |
Check if Bundle is Accessible: | |
After doing this, check if bundle is recognized: | |
bash | |
Copy code | |
bundle -v | |
If it's still not recognized, try installing it again: | |
bash | |
Copy code | |
gem install bundler | |
rbenv rehash | |
Check Your PATH: | |
Ensure that your PATH includes the shims directory. Run echo $PATH and look for a path like ~/.rbenv/shims. | |
Restart Your Shell: | |
After making these changes, restart your shell to ensure all changes are applied: | |
bash | |
Copy code | |
exec $SHELL | |
## Cockpit to monitor server from Browser | |
ssh deploy@IPADDRESS | |
sudo apt-get install cockpit | |
type sudo password | |
sudo ufw allow 9090 (this is to allow this port. Digital Ocean automatically set it) | |
https://IPADDRESS:9090/ (allow connection) | |
username: deploy | |
password: xxxx | |
Check as true the button: Reuse my password for privileged tasks | |
## Adding MX from google gmail | |
- This setup is following instructions from google | |
- The change of MXs is from Cloudflare, not from Digital ocean | |
- Copy and paste the MX inside cloudflare DNS | |
## Adding Staging Environment | |
https://itnext.io/deploy-staging-and-production-applications-to-single-server-using-capistrano-rails-1d5ab558d44f | |
- Step 1 | |
Go to cloudflare and/or digital ocean to crea an A Server as | |
Type A | |
Hostname: staging | |
Contento: 167.71.87.122 (Hosting server) | |
TTL: auto | |
Then, if I'm having www-redirections | |
Type: CNAME --> www.staging | |
Target: bookcademy.com | |
TTL; auto | |
- Step 2 | |
$> ssh deploy@167.71.87.122 | |
$> cd /etc/nginx/sites-enabled | |
$> sudo vim default (defaul is the name of current app) | |
$> sudo vim staging /this create an empty doc) | |
Inside staging | |
server { | |
listen 80; | |
listen [::]:80; | |
server_name datasource.ai staging.datasource.ai; | |
root /home/deploy/staging/current/public; | |
passenger_enabled on; | |
passenger_app_env staging; | |
location /cable { | |
passenger_app_group_name staging_websocket; | |
passenger_force_max_concurrent_requests_per_process 0; | |
} | |
# Allow uploads up to 100MB in size | |
client_max_body_size 100m; | |
location ~ ^/(assets|packs) { | |
expires max; | |
gzip_static on; | |
} | |
} | |
The default file is now this | |
server { | |
listen 80; | |
listen [::]:80 ipv6only=on; | |
server_name 167.71.87.122; | |
passenger_enabled on; | |
rails_env production; | |
root /home/deploy/shelf/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; | |
} | |
location /cable { | |
passenger_app_group_name production_websocket; | |
passenger_force_max_concurrent_requests_per_process 0; | |
} | |
# Allow uploads up to 100MB in size | |
client_max_body_size 100m; | |
location ~ ^/(assets|packs) { | |
expires max; | |
gzip_static on; | |
} | |
} | |
After updating both files, check nginx configuration and restart succeeds with following commands: | |
$> sudo nginx -t | |
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok | |
nginx: configuration file /etc/nginx/nginx.conf test is successful | |
$> sudo service nginx start | |
Step 3 - Change deply scripts | |
## config/deploy.rb | |
# config valid for current version and patch releases of Capistrano | |
lock "~> 3.11.0" | |
set :application, "shelf" | |
set :repo_url, "git@github.com:danielmoralesp/bookcademy.git" | |
set :passenger_restart_with_touch, true | |
append :linked_files, "config/database.yml", "config/master.key", "config/application.yml" | |
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "vendor/bundle", "public/system", "public/uploads" | |
load 'lib/capistrano/tasks/seed.rake' | |
## config/deploy/production.rb | |
# Replace 127.0.0.1 with your server's IP address! | |
server '167.71.87.122', user: 'deploy', roles: %w{app db web} | |
set :branch, 'master' | |
set :deploy_to, '/home/deploy/shelf' | |
set :stage, :production | |
## config/deploy/staging.rb | |
server '167.71.87.122', user: 'deploy', roles: %w{app db web} | |
set :branch, 'staging' | |
set :deploy_to, '/home/deploy/staging' | |
set :stage, :staging | |
Step 4 - Staging database Configuration | |
# setup database | |
sudo su | |
su postgres | |
psql | |
postgres=# create database db_name_staging with owner = deploy; | |
\q | |
exit | |
exit (come back to deploy user) | |
psql --user deploy --password db_name_staging | |
password_db | |
# it should print the name of database | |
\q | |
## inside database.yml in server add staging like this | |
staging: | |
adapter: postgresql | |
host: 127.0.0.1 | |
database: shelf_staging | |
username: deploy | |
password: password_db | |
encoding: unicode | |
pool: 5 | |
## inside project rails add this to database.yml | |
staging: | |
<<: *default | |
database: db/staging.sqlite3 | |
Step 5 - Create other environments and githhub branch | |
## environment staging is the same as production, so copy them | |
$> cp config/environments/production.rb config/environments/staging.rb | |
# first upload actual changes to master | |
git add . | |
git commit ... | |
git push origin master | |
## then we create the brach staging | |
git checkout -b staging | |
git push origin staging | |
Step 6 - Deploy | |
## inside deploy branch | |
$> cap staging deploy | |
## The first time running, you might get an error saying linked files are missing. As we have database.yml and master.key files shared in shared/config folder. Please create or update those files with the content from your application, if you get that error message | |
ERROR linked file /home/deploy/staging/shared/config/database.yml does not exist on 167.71.87.122 | |
## copy and paste same as production | |
touch application.yml | |
touch database.yml | |
touch master.key | |
## paste the same as production and then | |
$> cap production deploy | |
## Finally, the code in routes.rb if I wanted to redirect, is this: | |
constraints(subdomain: '') do | |
match '(*any)', via: :all, to: redirect { |params, request| | |
URI.parse(request.url).tap { |x| x.host = "www.#{x.host}" }.to_s | |
} | |
end | |
### INSTALLING RSPEC AND TRAVIS CI | |
app/.travis.yml | |
language: ruby | |
rvm: 2.3.3 | |
script: bundle exec rake spec | |
install gems | |
... | |
group :development, :test do | |
# Call 'byebug' anywhere in the code to stop execution and get a debugger console | |
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] | |
# Use sqlite3 as the database for Active Record | |
gem 'sqlite3' | |
## Annotate models | |
gem 'annotate' | |
# Test Suite Part 1 | |
# RSpec | |
gem 'rspec-rails', '~> 3.7' | |
# Devise Test | |
gem 'rails-controller-testing' | |
gem 'faker' | |
end | |
# Test Suite Part 2 | |
gem 'simplecov', require: false, group: :test | |
gem 'factory_bot_rails' | |
group :development do | |
... | |
run this commands | |
bundle install | |
rails generate rspec:install | |
## create first folder "controllers" and file: home_controller_spec.rb | |
require 'rails_helper' | |
RSpec.describe HomeController, type: :controller do | |
describe "GET #index" do | |
it "returns http success" do | |
get :index | |
expect(response).to have_http_status(:success) | |
end | |
end | |
end | |
## run command | |
rspec spec/controllers/home_controller_spec.rb | |
## travis badge | |
- inside travis CI webpage add repo | |
## Corriendo test | |
Build status via Travis CI | |
[![Build Status](https://travis-ci.com/danielmoralesp/datasource.svg?token=MgzPTs7cYofsdNWxWqp7&branch=staging)](https://travis-ci.com/danielmoralesp/datasource) | |
* Cuando necesite saltarse el build (casi siempre) se ejecuta con el comando | |
``` | |
git add . | |
git commit -m "Ticket #ticket_number - Comentario [ci skip]" | |
git push origin my_custom_branch_name | |
``` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment