Skip to content
This repository has been archived by the owner on Mar 19, 2019. It is now read-only.

meinside/rails-on-raspberrypi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rails on Raspberry Pi

This application is for monitoring Raspberry Pi server’s status.

1. Configuration

install latest ruby and rails using RVM

$ curl -L https://get.rvm.io | sudo bash -s stable
$ rvm install ruby
$ ...

clone this project and install bundles

$ mkdir ~/rails
$ git clone git://github.com/meinside/rails-on-raspberrypi.git ~/rails/rpi
$ cd ~/rails/rpi
$ bundle install

prepare for running

$ cp config/secrets.yml.sample config/secrets.yml
$ vi config/secrets.yml
$ cp config/database.yml.sample config/database.yml
$ vi config/database.yml
$ cp config/newrelic.yml.sample config/newrelic.yml
$ vi config/newrelic.yml
$ RAILS_ENV=production rake db:migrate
$ RAILS_ENV=production rake assets:precompile

install passenger module

$ gem install passenger
A. on Apache2
$ sudo passenger-install-apache2-module

and do as it directs:
a. setup apache,
$ sudo vi /etc/apache2/apache2.conf

  LoadModule passenger_module /usr/local/rvm/gems/ruby-x.x.x/gems/passenger-y.y.y/buildout/apache2/mod_passenger.so
  <IfModule mod_passenger.c>
    PassengerRoot /usr/local/rvm/gems/ruby-x.x.x/gems/passenger-y.y.y
    PassengerDefaultRuby /usr/local/rvm/gems/ruby-x.x.x/wrappers/ruby

PassengerStartTimeout 300

</IfModule>
b. setup site,
$ sudo vi /etc/apache2/sites-available/rpi

  # if it will be on the virtual host's root:
  <VirtualHost *:80>
    ServerName raspberrypi
    # !!! Be sure to point DocumentRoot to 'public'!
    DocumentRoot /home/user/rails/rpi/public
    <Directory /home/user/rails/rpi/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews

# Uncomment this if you’re on Apache >= 2.4: #Require all granted

  </Directory>
</VirtualHost>

# or if it will be on the sub uri:
<VirtualHost *:80>
  # (already-existing virtual host's configuration here)
  # blah blah...

  # add following lines here:
  Alias /suburi /home/user/rails/rpi/public
  <Location /suburi>
    PassengerBaseURI /suburi
    PassengerAppRoot /home/user/rails/rpi
  </Location>
  <Directory /home/user/rails/rpi/public>
    Allow from all
    Options -MultiViews
  </Directory>

</VirtualHost>
c. and enable it
$ sudo a2ensite rpi
$ sudo service apache2 reload
B. on Nginx
$ sudo passenger-install-nginx-module
a. configure Nginx,
  • referenced: github.com/hulihanapplications/nginx-init-debian

    $ sudo vi /etc/init/nginx.conf

    description "Nginx HTTP Server"
    
    start on filesystem
    stop on runlevel [!2345]
    
    respawn
    exec /opt/nginx/sbin/nginx -g "daemon off;"

    $ sudo vi /etc/init.d/nginx

    #! /bin/bash
    ### BEGIN INIT INFO
    # Provides:          nginx
    # Required-Start:    $remote_fs $syslog
    # Required-Stop:     $remote_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: nginx init.d bash script for debian/ubuntu
    # Description:       nginx init.d bash script for debian/ubuntu
    ### END INIT INFO
    #------------------------------------------------------------------------------
    # nginx - This is a bash script for starting/stopping/restarting nginx on 
    #  	  debian-based distributions such as Ubuntu, Mint, Mepis, etc.
    #
    # description:  Nginx is an HTTP(S) server, HTTP(S) reverse 
    #               proxy and IMAP/POP3 proxy server.  This 
    #				script will manage the initiation of the 
    #				server and it's process state.
    #
    # processname: nginx
    # Provides:    nginx
    #
    #------------------------------------------------------------------------------
    #                               Author
    #------------------------------------------------------------------------------
    #
    # Copyright (c) 2012 Dave Hulihan, www.hulihanapplications.com
    #   * Fork this at   
    #   * Based on Jason Giedymin's nginx-init-ubuntu: http://code.google.com/p/nginx-init-ubuntu/
    #
    #------------------------------------------------------------------------------
    #                               MIT X11 License
    #------------------------------------------------------------------------------
    #
    # Permission is hereby granted, free of charge, to any person obtaining
    # a copy of this software and associated documentation files (the
    # "Software"), to deal in the Software without restriction, including
    # without limitation the rights to use, copy, modify, merge, publish,
    # distribute, sublicense, and/or sell copies of the Software, and to
    # permit persons to whom the Software is furnished to do so, subject to
    # the following conditions:
    #
    # The above copyright notice and this permission notice shall be
    # included in all copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    #
    #------------------------------------------------------------------------------
    #                               Functions
    #------------------------------------------------------------------------------
    . /lib/lsb/init-functions
    
    #------------------------------------------------------------------------------
    #                               Consts
    #------------------------------------------------------------------------------
    
    # Change these to match your nginx configuration
    DAEMON=/opt/nginx/sbin/nginx
    NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    PS="nginx"								# process name
    PIDNAME="nginx"							# lets you do $PS-slave
    DESCRIPTION="Nginx Server..."			#
    PIDFILE=$PIDNAME.pid                    # pid file
    PIDSPATH=/var/run						# 
    RUNAS=root                              # user to run as
    SCRIPT_OK=0                             # ala error codes
    SCRIPT_ERROR=1                          # ala error codes
    TRUE=1                                  # boolean
    FALSE=0                                 # boolean
    
    #------------------------------------------------------------------------------
    #                               Simple Tests
    #------------------------------------------------------------------------------
    
    #test if nginx is a file and executable
    test -x $DAEMON || exit 0
    
    # Include nginx defaults if available
    if [ -f /etc/default/nginx ] ; then
            . /etc/default/nginx
    fi
    
    #set exit condition
    #set -e
    
    #------------------------------------------------------------------------------
    #                               Functions
    #------------------------------------------------------------------------------
    
    setFilePerms(){
    
            if [ -f $PIDSPATH/$PIDFILE ]; then
                    chmod 400 $PIDSPATH/$PIDFILE
            fi
    }
    
    configtest() {
    	$DAEMON -t -c $NGINX_CONF_FILE
    }
    
    getPSCount() {
    	return `pgrep -f $PS | wc -l`
    }
    
    isRunning() {
            if [ $1 ]; then
                    pidof_daemon $1
                    PID=$?
    
                    if [ $PID -gt 0 ]; then
                            return 1
                    else
                            return 0
                    fi
            else
                    pidof_daemon
                    PID=$?
    
                    if [ $PID -gt 0 ]; then
                            return 1
                    else
                            return 0
                    fi
            fi
    }
    
    #courtesy of php-fpm
    wait_for_pid () {
            try=0
    
            while test $try -lt 35 ; do
    
                    case "$1" in
                            'created')
                            if [ -f "$2" ] ; then
                                    try=''
                                    break
                            fi
                            ;;
    
                            'removed')
                            if [ ! -f "$2" ] ; then
                                    try=''
                                    break
                            fi
                            ;;
                    esac
    
                    #echo -n .
                    try=`expr $try + 1`
                    sleep 1
            done
    }
    
    status(){
    	isRunning
    	isAlive=$?
    
    	if [ "${isAlive}" -eq $TRUE ]; then
                    echo "$PIDNAME found running with processes:  `pidof $PS`"
            else
                    echo "$PIDNAME is NOT running."
            fi
    
    }
    
    removePIDFile(){
    	if [ $1 ]; then
                    if [ -f $1 ]; then
            	        rm -f $1
    	        fi
            else
    		#Do default removal
    		if [ -f $PIDSPATH/$PIDFILE ]; then
            	        rm -f $PIDSPATH/$PIDFILE
    	        fi
            fi
    }
    
    start() {
        log_daemon_msg "Starting $DESCRIPTION"
    
    	#isRunning
    	#isAlive=$?
    
        #if [ "${isAlive}" -eq $TRUE ]; then
        #        log_end_msg $SCRIPT_ERROR
        #else
        #        #start-stop-daemon --start --quiet --chuid $RUNAS --make-pidfile --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON -- -c $NGINX_CONF_FILE
    	#		start-stop-daemon --start --quiet --chuid $RUNAS --name $PS --exec $DAEMON -- -c $NGINX_CONF_FILE                
        #        setFilePerms
        #        log_end_msg $SCRIPT_OK
        #fi
    
        start-stop-daemon --start --quiet --chuid $RUNAS --exec $DAEMON -- -c $NGINX_CONF_FILE
        log_end_msg $SCRIPT_OK    
        return 0
    }
    
    stop() {
    	log_daemon_msg "Stopping $DESCRIPTION" 
    
    	#log_daemon_msg "Checking if $PS is running..." 
    	#isRunning
    	#isAlive=$?
    	
        #if [ "${isAlive}" -eq $TRUE ]; then
        # 	log_end_msg $SCRIPT_OK
        # else
        #    log_end_msg $SCRIPT_ERROR
        #    log_daemon_msg "Cannot tell if $PS is running. Trying to stop anyway..."
        # fi
    
        log_end_msg $SCRIPT_OK
        start-stop-daemon --stop --quiet --exec $DAEMON          
        return 0
    }
    
    reload() {
    	configtest || return $?
    
    	log_daemon_msg "Reloading (via HUP) $DESCRIPTION"
    
            isRunning
            if [ $? -eq $TRUE ]; then
    		`killall -HUP $PS` #to be safe
    
                    log_end_msg $SCRIPT_OK
            else
                    log_end_msg $SCRIPT_ERROR
            fi
    }
    
    quietupgrade() {
    	log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION"
    
            isRunning
            isAlive=$?
            if [ "${isAlive}" -eq $TRUE ]; then
    		kill -USR2 `cat $PIDSPATH/$PIDFILE`
    		kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin`
    
    		isRunning
    		isAlive=$?
    		if [ "${isAlive}" -eq $TRUE ]; then
    			kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
    			wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
                            removePIDFile $PIDSPATH/$PIDFILE.oldbin
    
    			log_end_msg $SCRIPT_OK
    		else
    			log_end_msg $SCRIPT_ERROR
    
    			log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION"
    
    			kill -HUP `cat $PIDSPATH/$PIDFILE`
    			kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin`
    			kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
    
    			wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
                            removePIDFile $PIDSPATH/$PIDFILE.oldbin
    
    			log_end_msg $SCRIPT_ok
    		fi
            else
                    log_end_msg $SCRIPT_ERROR
            fi
    }
    
    terminate() {
        log_daemon_msg "Force terminating (via KILL) $DESCRIPTION"
    
    	PIDS=`pidof $PS` || true
    
    	[ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
    
    	for i in $PIDS; do
    		if [ "$i" = "$PIDS2" ]; then
    	        	kill $i
                            wait_for_pid 'removed' $PIDSPATH/$PIDFILE
    			removePIDFile
    		fi
    	done
    
    	log_end_msg $SCRIPT_OK
    }
    
    destroy() {
    	log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION"
    	killall $PS -q >> /dev/null 2>&1
    	log_end_msg $SCRIPT_OK
    }
    
    pidof_daemon() {
        PIDS=`pidof $PS` || true
    
        [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
    
        for i in $PIDS; do
            if [ "$i" = "$PIDS2" ]; then
                return 1
            fi
        done
        return 0
    }
    
    # Handle signals
    #trap "echo 'Exiting Prematurely.'; exit 1" SIGTERM
    
    case "$1" in
      start)
    	start
            ;;
      stop)
    	stop
            ;;
      restart|force-reload)
    	stop
    	sleep 1
    	start
            ;;
      reload)
    	$1
    	;;
      status) 
    	status
    	;;
      configtest)
            $1
            ;;
      quietupgrade)
    	$1
    	;;
      terminate)
    	$1
    	;;
      destroy)
    	$1
    	;;
      *)
    	FULLPATH=/etc/init.d/$PS
    	echo "Usage: $FULLPATH {start|stop|restart|force-reload|status|configtest|quietupgrade|terminate|destroy}"
    	echo "       The 'destroy' command should only be used as a last resort." 
    	exit 1
    	;;
    esac
    
    exit 0

    $ sudo chmod +x /etc/init.d/nginx

    $ sudo /usr/sbin/update-rc.d -f nginx defaults

b. setup site,
$ sudo vi /opt/nginx/conf/nginx.conf

  server {
    listen 80;
    server_name raspberrypi;
    root /home/user/rails/rpi/public;
    passenger_enabled on;
  }
c. start service
$ service nginx start

2. Tips

use logrotate.d

$ sudo vi /etc/logrotate.d/nginx

  /opt/nginx/logs/*.log {
    compress
    copytruncate
    daily
    delaycompress
    missingok
    rotate 7
    size=5M
  }

$ sudo vi /etc/logrotate.d/rpi-log

  /home/user/rails/rpi/log/*.log {
    compress
    copytruncate
    daily
    delaycompress
    missingok
    rotate 7
    size=5M
  }