| @@ -48,7 +48,7 @@ Import node.js repository (can be skipped on Ubuntu and Debian Jessie): | ||
| 48 | 48 |  | 
| 49 | 49 | Install the required packages (needed to compile Ruby and native extensions to Ruby gems): | 
| 50 | 50 |  | 
| 51 | - sudo apt-get install -y build-essential git zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate python-docutils pkg-config cmake nodejs graphviz | |
| 51 | + sudo apt-get install -y runit build-essential git zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate python-docutils pkg-config cmake nodejs graphviz | |
| 52 | 52 |  | 
| 53 | 53 |  | 
| 54 | 54 | ## 2. Ruby | 
| @@ -229,6 +229,10 @@ When done you see `See the Huginn Wiki for more Agent examples! https://github. | ||
| 229 | 229 |  | 
| 230 | 230 | sudo -u huginn -H bundle exec rake db:seed RAILS_ENV=production SEED_USERNAME=admin SEED_PASSWORD=yourpassword | 
| 231 | 231 |  | 
| 232 | +### Compile Assets | |
| 233 | + | |
| 234 | + sudo -u huginn -H bundle exec rake assets:precompile RAILS_ENV=production | |
| 235 | + | |
| 232 | 236 | ### Install Init Script | 
| 233 | 237 |  | 
| 234 | 238 | Huginn uses foreman to generate the init scripts based on a `Procfile` | 
| @@ -237,31 +241,20 @@ Edit the `Procfile` and choose one of the suggested versions for production | ||
| 237 | 241 |  | 
| 238 | 242 | sudo -u huginn -H editor Procfile | 
| 239 | 243 |  | 
| 240 | -**Debian only** Install upstart and reboot the system (skip this step on Ubuntu): | |
| 241 | - | |
| 242 | - sudo apt-get install -y --force-yes upstart | |
| 243 | - sudo reboot | |
| 244 | - # After you you logged back in go to Huginn installation folder | |
| 245 | - cd /home/huginn/huginn | |
| 246 | - | |
| 247 | -Export the init scripts using foreman: | |
| 244 | +Export the init scripts: | |
| 248 | 245 |  | 
| 249 | - sudo rm /etc/init/huginn* | |
| 250 | - sudo foreman export upstart -a huginn /etc/init | |
| 246 | + sudo rake production:export | |
| 251 | 247 |  | 
| 252 | -**Note:** You have to re-export the init script every time you change the configuration in `.env`! | |
| 248 | +**Note:** You have to re-export the init script every time you change the configuration in `.env` or your `Procfile`! | |
| 253 | 249 |  | 
| 254 | 250 | ### Setup Logrotate | 
| 255 | 251 |  | 
| 256 | 252 | sudo cp lib/support/logrotate/huginn /etc/logrotate.d/huginn | 
| 257 | 253 |  | 
| 258 | -### Compile Assets | |
| 259 | - | |
| 260 | - sudo -u huginn -H bundle exec rake assets:precompile RAILS_ENV=production | |
| 261 | 254 |  | 
| 262 | -### Start Your Huginn Instance | |
| 255 | +### Ensure Your Huginn Instance Is Running | |
| 263 | 256 |  | 
| 264 | - sudo start huginn | |
| 257 | + sudo rake production:status | |
| 265 | 258 |  | 
| 266 | 259 | ## 7. Nginx | 
| 267 | 260 |  | 
| @@ -335,9 +328,7 @@ Restart Nginx, export the init script and restart Huginn: | ||
| 335 | 328 | ``` | 
| 336 | 329 | cd /home/huginn/huginn | 
| 337 | 330 | sudo service nginx restart | 
| 338 | -sudo rm /etc/init/huginn* | |
| 339 | -sudo foreman export upstart -a huginn /etc/init | |
| 340 | -sudo restart huginn | |
| 331 | +sudo rake production:export | |
| 341 | 332 | ``` | 
| 342 | 333 |  | 
| 343 | 334 | Using a self-signed certificate is discouraged, but if you must use it follow the normal directions. Then generate the certificate: | 
| @@ -1,19 +1,25 @@ | ||
| 1 | 1 | # Update | 
| 2 | 2 |  | 
| 3 | -### 0. Stop server | |
| 3 | +### 0. Ensure depencies are up to date | |
| 4 | 4 |  | 
| 5 | 5 | ``` | 
| 6 | -sudo stop huginn | |
| 6 | +cd /home/huginn/huginn | |
| 7 | +sudo rake production:check | |
| 7 | 8 | ``` | 
| 8 | 9 |  | 
| 9 | -### 1. Store the current version | |
| 10 | +### 1. Stop server | |
| 11 | + | |
| 12 | +``` | |
| 13 | +sudo rake production:stop | |
| 14 | +``` | |
| 15 | + | |
| 16 | +### 2. Store the current version | |
| 10 | 17 |  | 
| 11 | 18 | ``` | 
| 12 | -cd /home/huginn/huginn | |
| 13 | 19 | export OLD_VERSION=`git rev-parse HEAD` | 
| 14 | 20 | ``` | 
| 15 | 21 |  | 
| 16 | -### 2. Update the code | |
| 22 | +### 3. Update the code | |
| 17 | 23 |  | 
| 18 | 24 | Back up changed files | 
| 19 | 25 |  | 
| @@ -35,7 +41,7 @@ Restore backed up files | ||
| 35 | 41 | sudo -u huginn -H cp Procfile.bak Procfile | 
| 36 | 42 | ``` | 
| 37 | 43 |  | 
| 38 | -### 3. Install gems, migrate and precompile assets | |
| 44 | +### 4. Install gems, migrate and precompile assets | |
| 39 | 45 |  | 
| 40 | 46 | ``` | 
| 41 | 47 | cd /home/huginn/huginn | 
| @@ -46,11 +52,11 @@ sudo -u huginn -H bundle install --deployment --without development test | ||
| 46 | 52 | sudo -u huginn -H bundle exec rake db:migrate RAILS_ENV=production | 
| 47 | 53 |  | 
| 48 | 54 | # Clean up assets and cache | 
| 49 | -sudo -u huginn -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production | |
| 55 | +sudo -u huginn -H bundle exec rake assets:clean assets:precompile tmp:cache:clear RAILS_ENV=production | |
| 50 | 56 |  | 
| 51 | 57 | ``` | 
| 52 | 58 |  | 
| 53 | -### 4. Update the Procfile | |
| 59 | +### 5. Update the Procfile | |
| 54 | 60 |  | 
| 55 | 61 | Check for changes made to the default `Procfile` | 
| 56 | 62 | ``` | 
| @@ -62,7 +68,7 @@ Update your `Procfile` if the default options of the version you are using chang | ||
| 62 | 68 | sudo -u huginn -H editor Procfile | 
| 63 | 69 | ``` | 
| 64 | 70 |  | 
| 65 | -### 5. Update the .env file | |
| 71 | +### 6. Update the .env file | |
| 66 | 72 |  | 
| 67 | 73 | Check for changes made to the example `.env` | 
| 68 | 74 | ``` | 
| @@ -75,13 +81,10 @@ sudo -u huginn -H editor .env | ||
| 75 | 81 | ``` | 
| 76 | 82 |  | 
| 77 | 83 |  | 
| 78 | -### 6. Export init script and start Huginn | |
| 84 | +### 7. Export init script and start Huginn | |
| 79 | 85 |  | 
| 80 | 86 | ``` | 
| 81 | 87 | # Export the init script | 
| 82 | -sudo rm /etc/init/huginn* | |
| 83 | -sudo foreman export upstart -a huginn /etc/init | |
| 84 | -# Start Huginn | |
| 85 | -sudo start huginn | |
| 88 | +sudo rake production:export | |
| 86 | 89 | ``` | 
| 87 | 90 |  | 
| @@ -0,0 +1,94 @@ | ||
| 1 | +def failed; "[ \033[31mFAIL\033[0m ]"; end | |
| 2 | +def ok; "[ \033[32mOK\033[0m ]"; end | |
| 3 | + | |
| 4 | +def run_as_root | |
| 5 | + return true if ENV['USER'] == 'root' | |
| 6 | +  puts "#{failed} Please run this command as root or with sudo\n\n" | |
| 7 | + exit -1 | |
| 8 | +end | |
| 9 | + | |
| 10 | +def runit_installed | |
| 11 | + return true unless `which sv` && $?.to_i != 0 | |
| 12 | +  puts "#{failed} Please install runit: \n\nsudo apt-get install runit\n\n" | |
| 13 | + exit -1 | |
| 14 | +end | |
| 15 | + | |
| 16 | +def remove_upstart_config | |
| 17 | +  return true unless File.exists?('/etc/init/huginn.conf') | |
| 18 | +  puts "#{failed} Please stop huginn and remove the huginn upstart init scripts:\n\n" | |
| 19 | + puts "sudo stop huginn" | |
| 20 | + puts "sudo rm /etc/init/huginn*\n\n" | |
| 21 | + exit -1 | |
| 22 | +end | |
| 23 | + | |
| 24 | +namespace :production do | |
| 25 | + task :check do |t| | |
| 26 | + remove_upstart_config | |
| 27 | + runit_installed | |
| 28 | +    puts "#{ok} Everything is fine" if t.application.top_level_tasks.include? 'production:check' | |
| 29 | + end | |
| 30 | + | |
| 31 | + task :stop => :check do | |
| 32 | + puts "Stopping huginn ..." | |
| 33 | +    run_sv('stop') | |
| 34 | + end | |
| 35 | + | |
| 36 | + task :start => :check do | |
| 37 | + puts "Startig huginn ..." | |
| 38 | +    run_sv('start') | |
| 39 | + end | |
| 40 | + | |
| 41 | + task :status => :check do | |
| 42 | +    run_sv('status') | |
| 43 | + end | |
| 44 | + | |
| 45 | + task :restart => :check do | |
| 46 | + puts "Restarting huginn ..." | |
| 47 | +    run_sv('restart') | |
| 48 | + end | |
| 49 | + | |
| 50 | + task :export => :check do | |
| 51 | + run_as_root | |
| 52 | + Rake::Task['production:stop'].execute | |
| 53 | + puts "Exporting new services ..." | |
| 54 | +    run('rm -rf /etc/service/huginn*') | |
| 55 | +    run('foreman export runit -a huginn -l /home/huginn/huginn/log /etc/service') | |
| 56 | +    services = Dir.glob('/etc/service/huginn*') | |
| 57 | + while services.length > 0 | |
| 58 | + services.each do |p| | |
| 59 | + supervise = File.join(p, 'supervise') | |
| 60 | + next if !Dir.exists?(supervise) | |
| 61 | +        run("chown -R huginn:huginn #{p}") | |
| 62 | + services.delete(p) | |
| 63 | + end | |
| 64 | + sleep 0.1 | |
| 65 | + end | |
| 66 | + end | |
| 67 | +end | |
| 68 | + | |
| 69 | +def run_sv(command) | |
| 70 | +  Dir.glob('/etc/service/huginn*').each do |p| | |
| 71 | + with_retries do | |
| 72 | +      run("sv #{command} #{File.basename(p)}") | |
| 73 | + end | |
| 74 | + end | |
| 75 | +end | |
| 76 | + | |
| 77 | +def run(cmd, verbose=false) | |
| 78 | +  output = `#{cmd}` | |
| 79 | + if $?.to_i != 0 | |
| 80 | +    raise "'#{cmd}' exited with a non-zero return value: #{output}" | |
| 81 | + end | |
| 82 | + puts output if verbose && output.strip != '' | |
| 83 | + output | |
| 84 | +end | |
| 85 | + | |
| 86 | +def with_retries(&block) | |
| 87 | + tries ||= 5 | |
| 88 | + output = block.call | |
| 89 | +rescue StandardError => e | |
| 90 | + retry unless (tries -= 1).zero? | |
| 91 | + raise e | |
| 92 | +else | |
| 93 | + puts output | |
| 94 | +end |