diff --git a/README.rdoc b/README.rdoc --- a/README.rdoc +++ b/README.rdoc @@ -1,261 +1,134 @@ -== Welcome to Rails +== Installation + +Installing cafe-grader can be done in the following steps. -Rails is a web-application framework that includes everything needed to create -database-backed web applications according to the Model-View-Control pattern. +1. Set up database. We need MySQL 5 database name, username and password. +2. Install RVM. cafe-grader runs on Ruby on Rails and the best way to install it is to use RVM. +3. Install necessary package for the system +4. Install cafe-grader from github +5. Deploy cafe-grader on apache with Phusion Passenger + +The detail of each step are provided as follows. -This pattern splits the view (also called the presentation) into "dumb" -templates that are primarily responsible for inserting pre-built data in between -HTML tags. The model contains the "smart" domain objects (such as Account, -Product, Person, Post) that holds all the business logic and knows how to -persist themselves to a database. The controller handles the incoming requests -(such as Save New Account, Update Product, Show Post) by manipulating the model -and directing data to the view. +=== Install MySQL 5 + +Install MySQL server for the server. + + $ sudo apt install mysql-server -In Rails, the model is handled by what's called an object-relational mapping -layer entitled Active Record. This layer allows you to present the data from -database rows as objects and embellish these data objects with business logic -methods. You can read more about Active Record in -link:files/vendor/rails/activerecord/README.html. +Next, we will connect to mysql as root and set up the database. You can choose your DATABASENAME, USERNAME and PASSWORD. + + sudo mysql -u root + + mysql> create database DATABASENAME; + Query OK, 1 row affected (0.00 sec) -The controller and view are handled by the Action Pack, which handles both -layers by its two parts: Action View and Action Controller. These two layers -are bundled in a single package due to their heavy interdependence. This is -unlike the relationship between the Active Record and Action Pack that is much -more separate. Each of these packages can be used independently outside of -Rails. You can read more about Action Pack in -link:files/vendor/rails/actionpack/README.html. + mysql> grant all privileges on grader.* to USERNAME@localhost identified by 'PASSWORD'; + Query OK, 0 rows affected, 1 warning (0.00 sec) + + mysql> flush privileges; + Query OK, 0 rows affected (0.00 sec) +=== Install RVM -== Getting Started +Since Ubuntu has dedicated package for RVM we will use that. Just follow instruction given in https://github.com/rvm/ubuntu_rvm. For your convenience, the step are reproduced here. + +First, we install necessary package for installing RVM. -1. At the command prompt, create a new Rails application: - rails new myapp (where myapp is the application name) + $ sudo apt install software-properties-common -2. Change directory to myapp and start the web server: - cd myapp; rails server (run with --help for options) +Second, we add the custom PPA, update the system and install RVM. -3. Go to http://localhost:3000/ and you'll see: - "Welcome aboard: You're riding Ruby on Rails!" + $ sudo apt-add-repository -y ppa:rael-gc/rvm + $ sudo apt-get update + $ sudo apt-get install rvm -4. Follow the guidelines to start developing your application. You can find -the following resources handy: +This is very important. You have to logout and login again since RVM change a lots of system. -* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html -* Ruby on Rails Tutorial Book: http://www.railstutorial.org/ +=== Install necessary package + + $ sudo apt install libmysql-dev default-jdk unzip nodejs php7.2-cli apache2 dirmngr gnupg apache2-dev -== Debugging Rails - -Sometimes your application goes wrong. Fortunately there are a lot of tools that -will help you debug it and get it back on the rails. - -First area to check is the application log files. Have "tail -f" commands -running on the server.log and development.log. Rails will automatically display -debugging and runtime information to these files. Debugging info will also be -shown in the browser on requests from 127.0.0.1. - -You can also log your own messages directly into the log file from your code -using the Ruby logger class from inside your controllers. Example: - - class WeblogController < ActionController::Base - def destroy - @weblog = Weblog.find(params[:id]) - @weblog.destroy - logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") - end - end - -The result will be a message in your log file along the lines of: - - Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1! - -More information on how to use the logger is at http://www.ruby-doc.org/core/ - -Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are -several books available online as well: - -* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe) -* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide) - -These two books will bring you up to speed on the Ruby language and also on -programming in general. - - -== Debugger - -Debugger support is available through the debugger command when you start your -Mongrel or WEBrick server with --debugger. This means that you can break out of -execution at any point in the code, investigate and change the model, and then, -resume execution! You need to install ruby-debug to run the server in debugging -mode. With gems, use sudo gem install ruby-debug. Example: - - class WeblogController < ActionController::Base - def index - @posts = Post.all - debugger - end - end - -So the controller will accept the action, run the first line, then present you -with a IRB prompt in the server window. Here you can do things like: - - >> @posts.inspect - => "[#nil, "body"=>nil, "id"=>"1"}>, - #"Rails", "body"=>"Only ten..", "id"=>"2"}>]" - >> @posts.first.title = "hello from a debugger" - => "hello from a debugger" - -...and even better, you can examine how your runtime objects actually work: - - >> f = @posts.first - => #nil, "body"=>nil, "id"=>"1"}> - >> f. - Display all 152 possibilities? (y or n) - -Finally, when you're ready to resume execution, you can enter "cont". +curl build-essential -== Console +=== Install cafe-grader + +First, ensure that RVM is installed correctly. + +If instead of this you get the following error, it is very likely that you have not use bash --login. + +Next, we will let the install script do the work of installing cafe-grader. Please prepare the DATABASENAME, USERNAME and PASSWORD as the script will ask for that. Make sure that you run the script from the home directory of the user. -The console is a Ruby shell, which allows you to interact with your -application's domain model. Here you'll have all parts of the application -configured, just like it is when the application is running. You can inspect -domain models, change values, and save to the database. Starting the script -without arguments will launch it in the development environment. + cafe@grader:~$ wget https://github.com/cafe-grader-team/cafe-grader-judge-scripts/raw/master/installer/install-ubuntu-18.04.sh + cafe@grader:~$ . ./install-ubuntu-18.04.sh -To start the console, run rails console from the application -directory. +After installation is finished, grader is ready to run in development mode via WEBrick. We will try that by the following command which will start a grader accessible via http://localhost:3000/. You should try logging in to the system and verify that it is actually work. + +cafe@grader:~/cafe_grader/web$ rails s + +We are almost done. The last step is to set up apache and Phusion so that cafe-grader is served by apache. -Options: +=== Deploy cafe-grader on Phusion passenger via apache +Basically, we will follow the instructions given in https://www.phusionpassenger.com/library/walkthroughs/deploy/ruby/ownserver/apache/oss/bionic/install_passenger.html, which devided into two parts: Installing Passenger and deploying the app. + +Installing Passenger as a mod for apache and enable it. -* Passing the -s, --sandbox argument will rollback any modifications - made to the database. -* Passing an environment name as an argument will load the corresponding - environment. Example: rails console production. +cafe@grader:~$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 + cafe@grader:~$ sudo apt-get install -y apt-transport-https ca-certificates + cafe@grader:~$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list' + cafe@grader:~$ sudo apt-get update + cafe@grader:~$ sudo apt-get install -y libapache2-mod-passenger + cafe@grader:~$ sudo a2enmod passenger -To reload your controllers and models after launching the console run -reload! + + cafe@grader:~$ sudo apache2ctl restart -More information about irb can be found at: -link:http://www.rubycentral.org/pickaxe/irb.html + Finally, we should check that passenger is installed correctly. Run the following command and fix anything as suggested by the command. + + cafe@grader:~$ sudo /usr/bin/passenger-config validate-install + -== dbconsole - -You can go to the command line of your database directly through rails -dbconsole. You would be connected to the database with the credentials -defined in database.yml. Starting the script without arguments will connect you -to the development database. Passing an argument will connect you to a different -database, like rails dbconsole production. Currently works for MySQL, -PostgreSQL and SQLite 3. - -== Description of Contents - -The default directory structure of a generated Ruby on Rails application: +Deploying the app. First, we determine the exact location of our ruby that is installed via RVM. - |-- app - | |-- assets - | |-- images - | |-- javascripts - | `-- stylesheets - | |-- controllers - | |-- helpers - | |-- mailers - | |-- models - | `-- views - | `-- layouts - |-- config - | |-- environments - | |-- initializers - | `-- locales - |-- db - |-- doc - |-- lib - | `-- tasks - |-- log - |-- public - |-- script - |-- test - | |-- fixtures - | |-- functional - | |-- integration - | |-- performance - | `-- unit - |-- tmp - | |-- cache - | |-- pids - | |-- sessions - | `-- sockets - `-- vendor - |-- assets - `-- stylesheets - `-- plugins + cafe@grader:~$ passenger-config about ruby-command +passenger-config was invoked through the following Ruby interpreter: + Command: /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby + Version: ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux] + To use in Apache: PassengerRuby /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby + To use in Nginx : passenger_ruby /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby + To use with Standalone: /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby /usr/bin/passenger start -app - Holds all the code that's specific to this particular application. +Then, take note of the path after "Command". For this guide, it is /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby -app/assets - Contains subdirectories for images, stylesheets, and JavaScript files. +Assuming that cafe-grader is installed at /home/cafe/cafe_grader, we will edit the site config file of the apache as follow. + + + #ServerName www.example.com -app/controllers - Holds controllers that should be named like weblogs_controller.rb for - automated URL mapping. All controllers should descend from - ApplicationController which itself descends from ActionController::Base. - -app/models - Holds models that should be named like post.rb. Models descend from - ActiveRecord::Base by default. - -app/views - Holds the template files for the view that should be named like - weblogs/index.html.erb for the WeblogsController#index action. All views use - eRuby syntax by default. + ServerAdmin webmaster@localhost + # dont forget to change the document root + DocumentRoot /home/cafe/cafe_grader/web/public + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined -app/views/layouts - Holds the template files for layouts to be used with views. This models the - common header/footer method of wrapping views. In your views, define a layout - using the layout :default and create a file named default.html.erb. - Inside default.html.erb, call <% yield %> to render the view using this - layout. - -app/helpers - Holds view helpers that should be named like weblogs_helper.rb. These are - generated for you automatically when using generators for controllers. - Helpers can be used to wrap functionality for your views into methods. - -config - Configuration files for the Rails environment, the routing map, the database, - and other dependencies. + # add Passenger + PassengerRuby /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby -db - Contains the database schema in schema.rb. db/migrate contains all the - sequence of Migrations for your schema. - -doc - This directory is where your application documentation will be stored when - generated using rake doc:app - -lib - Application specific libraries. Basically, any kind of custom code that - doesn't belong under controllers, models, or helpers. This directory is in - the load path. + # our cafe-grader app + + Allow from all + Options -MultiViews + Require all granted + + -public - The directory available for the web server. Also contains the dispatchers and the - default HTML files. This should be set as the DOCUMENT_ROOT of your web - server. - -script - Helper scripts for automation and generation. -test - Unit and functional tests along with fixtures. When using the rails generate - command, template test files will be generated for you and placed in this - directory. +Be noted that we make 3 modifications: 1) change DocumentRoot, 2) add PassengerRuby option and add 3) Directory directive +As the last step, we restart apache again and the site is ready to be used. -vendor - External libraries that the application depends on. Also includes the plugins - subdirectory. If the app has frozen rails, those gems also go here, under - vendor/rails/. This directory is in the load path. + cafe@grader:~$ sudo apache2ctl restart +