Hi. I have a site that is currently running in alpha mode. I have
warned my users that it will be bouncing up and down as I deploy
updates. That said, i'd like to broadcast a real time warning to them
when I am about to do so. Something along the lines of:
The site will be brought down for maintenance in five minutes. Save
your work and logout to avoid losing data.
Any clever suggestions on how to do this?
A colleague suggested to me that I have a javascript on each page that
polls the server for a change in status and pos up an alert. I'm
looking for other creative suggestions...
There are lots of different approaches, especially depending on what
your app does and how it is implemented, but I usually do something
like the following, which works for both development env (setup to re-
reload all code/templates/etc on each request) and production env
(setup to re-load code/templates/etc on app restart):
### in ./app/controllers/application.rb
...
require 'time'
...
MAINT_DOWN_TIME_FILE = "#{RAILS_ROOT}/tmp/down_time_#
{RAILS_ENV}.txt"
...
before_filter :fetch_maint_down_time
...
def fetch_maint_down_time
@maint_down_time = nil
begin
s = IO.read(MAINT_DOWN_TIME_FILE)
@maint_down_time = Time.parse(s) if s && s =~ /\d/
rescue
#ignore, ... meaning no scheduled down time.
end
end
...
### in ./app/views/shared/_maintenance_msg.html.erb:
<% if @maint_down_time -%>
<% mins = (@maint_down_time - Time.now).to_i/60 -%>
<% down_when = mins > 1 ? "in #{mins} minutes" : "imminently" -%>
<div id='sys_notice'>
Notice: App going offline <%= h(down_when) %>. ...
</div>
<% end -%>
### in each layout, like ./app/views/layouts/testapp.html.erb:
...
<%= render :partial=> 'shared/maintenance_msg' %>
...
Then anytime you want to warn your users for a given env about a
planned maint down_time, you just stuff a parsable datetime in the
appropriate env down time file, like: