This guide is a continuation of How to deploy a Rails app using Digital Ocean and will walk through how to deploy Elastic Search on the same Digital Ocean Droplet as your Rails application.
Update your package index.
$ sudo apt-get update
Download Elastic Search. We've chosen to use 6.4.2 however you can also use other versions.
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.deb
Install Elastic Search 6.4.2
$ sudo dpkg -i elasticsearch-6.4.2.deb
For Elastic Search < 7.0.0, you will need to manually install Java 8 before Elastic Search. Read Guide Here.
Update your package index
$ sudo apt-get update
Install Java Runtime Environment (JRE).
$ sudo apt-get install default-jre
You can optionally install Java Development Kit (JDK) which is needed if you will be compiling Java programs. The JDK contains JRE so it will have a larger file size.
$ sudo apt-get install default-jdk
Configure Elastic Search to start automatically when the system boots up:
$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service
Start / Stop / Restart Elastic Search
$ sudo service elasticsearch start
$ sudo service elasticsearch stop
$ sudo service elasticsearch restart
Check that Elastic Search is running. The status you're looking for is Active: active (running) since ...
$ sudo service elasticsearch status
Confirm using a curl command
$ curl -XGET 'http://localhost:9200/_nodes?pretty'
$ curl -XGET 'http://127.0.0.1:9200/_nodes?pretty'
If you're using the Chewy gem in your rails application, update your config/chewy.yml
to point at localhost:9200.
production:
host: 'localhost:9200'
After you've updated this file, redeploy.
$ cap production deploy
SSH into the server
$ ssh deploy@ip_address
Navigate to the rails application folder
$ cd ~/my_app_name/current
Run rake task to build your indices. Depending on your needs, you can also run other rake tasks.
$ RAILS_ENV=production bundle exec rake chewy:reset
If the indices are successfully built and populated your logs will look like this
Resetting index_nameIndex
Imported index_nameIndex::index_name in 1s, stats:
Imported Chewy::Stash::Specification::Specification in 1s, stats: index 1
Total: 1s
Check what indices were created
$ curl -X GET \
http://localhost:9200/_cat/indices \
Check the doc count in a specific index
$ curl -X POST \
http://localhost:9200/[index_name]/_count \
For an added layer of security, setup UFW to limit which ports and IPs can access the server.
Check initial firewall status
$ sudo ufw status
Enable firewall
$ sudo ufw enable
Add application IP
$ sudo ufw allow from ip_address to any port 9200
Recheck Status
$ sudo ufw status
Status: active
To Action From
-- ------ ----
9200 ALLOW my_app_ip
To remove whitelisted IPs first list all rules by rule number and then send delete command for the rule number you'd like to remove. In the below example it is 2
.
$ ufw firewall numbered
$ sudo ufw delete 2
To see your servers active connections run
$ netstat -a
For an added layer of security, setup a Digital Ocean Firewall to limit which ports and IPs can access the server.
Open Digital Ocean Control Panel > Networking > Firewalls. Create Firewall with the following settings:
Name
Name: firewall-app_name-prd
Inbound Rules
Custom TCP 9200 ip_address
Outbound Rules
# leave this with the default settings
Apply to Droplets
# select your droplet name
Navigate to logs folder
sudo su root
cd /var/log/elasticsearch
Check the various log files using the the following commands
tail -f elasticsearch.log
tail -f elasticsearch_access.log
zcat elasticsearch-2019-08-12-1.log.gz
To get Elasticsearch to run on Ubuntu 16.04 you have to set START_DAEMON to true on /etc/default/elasticsearch. It comes commented out by default, and uncommenting it makes Elasticsearch start again just fine. https://stackoverflow.com/questions/38674711/can-not-start-elasticsearch-as-a-service-in-ubuntu-16-04
If in the future you need to remove Elastic Search, run:
$ sudo apt-get --purge autoremove elasticsearch
$ sudo rm -rf /var/lib/elasticsearch/
$ sudo rm -rf /etc/elasticsearch