Skip to content

func-i/SocialStreet

Repository files navigation

SocialStreet
================

### Description

SocialStreet is a web app that makes it easy for people to plan/find and attend local events.

### Initial Setup for Development:

- Download the source
- Setup a new config/database.yml file based on config/database.example.yml
- Setup a new config/secrets.yml file based on config/secrets.example.yml
  - For the secret keys, setup a Facebook app under your real/developer account: http://www.facebook.com/developers
  - Set the site URL to: http://localhost:3000/ (Site Domain can be left blank)
  - You can call it something like: SocialStreet-dev
  - You do not need to give other developers access to this app, since its just for your development sandbox
- Install PostgreSQL 8.3, 8.4 or 9
- Install the pg gem (might be a bit of a pain on OSX)
- Download and install Redis: http://redis.io/download
- Start Redis Server:
  - Open a terminal tab to the [REDIS_ROOT (where you extracted and installed it) dir, and run: ./src/redis-server
- Run 1 Resque Worker:
  - Open a terminal tab to the [APP_ROOT] dir, and run: QUEUE=* rake environment resque:work
- Run 1 Resque Scheduler:
  - Open a terminal tab to the [APP_ROOT] dir, and run: rake resque:scheduler
- Start Resque Web Server (optional, for debugging):
  - Open a terminal tab to the [APP_ROOT] dir, and run: bundle exec resque-web ~/yourapp/config/resque_config.rb
  - This will start another web server here: http://localhost:5678/
  - This page should show 1 worker waiting for a job: http://0.0.0.0:5678/workers
- Start the SocialStreet App Server (duh):
  - Open a terminal tab to the [APP_ROOT] dir, and run: rails server

### Running Tests (RSpec specs)

For all tests, from the [APP_ROOT], run the command:

    rspec spec

If that doesn't work, try running:

    bundle exec rake spec

For a single test based on its line number, run the command:

    rspec spec/models/searchable_date_range_spec.rb:69

In this example, it runs the first spec ("it" statement) that it can find at or above line 69 in searchable_date_range

### Using Facebook (IMPORTANT)

You should create and use facebook "test" users to test in development mode, using the following steps:

    rails c # go into rails console (development mode)
    app = FbGraph::Application.new(FACEBOOK_APP_ID, :secret=>FACEBOOK_APP_SECRET) # Create an fb_graph app instance
    user1 = app.test_user!(:installed => true, :permissions => :read_stream) # Create a 1st test user
    user2 = app.test_user!(:installed => true, :permissions => :read_stream) # Create a 2nd test user
    user1.friend!(user2) # Friend the 2 users
    user1.login_url # Get user1's login_url (so you can login into SS w/ that user)

Now, assuming you are not signed into Facrbook, Paste the login URL into your browser
Goto your local SS instance (http://localhost:3000) and click Sign-in
Facebook info on Test Users: https://developers.facebook.com/docs/test_users/

### Background jobs (For SearchSubscription Email Digests)

On our Staging/Production server(s)... Daily and Weekly search subscription email digests are sent by leveraging Crontab + Rake + Redis + Resque
On the server, a cron task executes a sh script which runs our rake commands located in lib/tasks/crons.rake

These rake tasks go through Redis looking for any subscriptions that have items that need to be emailed out
Each subscription has its own key ("digest_actions:#{subscription.id}") and is an ordered set of ActionIDs in Redis
For each SearchSubscription that needs to be emailed, a Resque Job is enqueued to send out that 1 email to the owner of the subscription

To test the daily/weekly tasks locally (in development mode), we simulate the end-of-day/week triggers:

For Daily Rake, run the command:

    bundle exec rake ss:crons:email_daily_digests RAILS_ENV=development

For Weekly Rake, run the command:

    bundle exec rake ss:crons:email_weekly_digests RAILS_ENV=development

Other helpful tips:

To see what's pending in the Redis (queues) order sets for email digests, run:

    rails c # go into rails console (development mode)
    r = Redis.new
    r.keys 'digest_actions:*' # returns list of subscriptions that have ActionIds to be emailed in the next digest email
    key = r.keys 'digest_actions:*'.first # as an example, lets use the first key ...
    r.zcard key # returns size of bucket (# of actions to email)
    r.zrevrange(key, 0, 999) # returns up to 1000 ActionIDs that need to be sent to the subscription associated with this 'key'
    r.quit # disconnect from Redis

### Docs:

- http://redis.io/download
- https://github.com/defunkt/resque
- http://redis.io/topics/data-types#sorted-sets
- https://github.com/ezmobius/redis-rb
- http://blog.waxman.me/how-to-build-a-fast-news-feed-in-redis
- https://developers.facebook.com/docs/test_users/

### Article used for Slicehost Server setup:

- http://library.linode.com/databases/redis/ubuntu-10.04-lucid


Production Servers
================

### Production Server Layout / Access

 - There are 2 servers, a small instance for Web/Redis/BG Tasks and a micro instance for 'DB'
 - Both servers allow SSH access but only the Web one has a static (Elastic IP) assigned
 - There will only be one user 'ubuntu' on the host servers
 - Every developer will have their own key pair generated via AWS, and the public key will be added to the web/db server
 - The Postgres server (on the 'DB' instance) accepts TCP/IP connects only from the EC2 Web instance's PRIVATE IP address

### Deployment (Capistrano)

- There are various deployment related commands, but the 2 main ones you should know about are:

    cap deploy # run when deploying code changes that do not have any migrations
    cap deploy:migrations # run instead of cap deploy when you have migrations to run as well
    cap deploy -S quick_update=true  # use if you just want to update the git, create the current and all symlinks
                                     # but want to skip restarting god, running jammit, notifying newrelic and hb

- Before running capistrano, make sure you install capistrano gem (not managed by bundler):  gem install capistrano
- Capistrano deploy code is located in config/deploy.rb
- Only deploy from 'master' branch (see Git Flow for release workflow)

### Adding a new developer (for Josh)

- Generate new keypair from AWS Management Console
- Generate public key as per instructions here: http://seabourneinc.com/2011/01/19/change-key-pairs-on-aws-ec2-instance/
- Provide developer private key and public key
- Developer should save the private key as ~/.ssh/socialstreet-web.pem
- Josh should append the public key contents to the /home/ubuntu/.ssh/authorized_keys file
- Developer should add the following two aliases to their ~/.bash_profile or ~/.bash_aliases file:

    alias sswebssh='ssh -i ~/.ssh/socialstreet-web.pem [email protected]'
    alias ssdbssh='ssh -i ~/.ssh/socialstreet-web.pem [email protected]'

- Open a new Terminal tab/window and try running sswebssh to make sure you can connect to the Web server. Ditto for the DB server

### Removing a developer from the servers (for Josh)

- Remove their public key from authorized_keys
- Remove their key pair from AWS Management Console
- If they were given access to the management console / AWS Account API, remove that access via the management console

### Git Flow usage / Release workflow

- Git Flow is being used on top of Git
- Please watch the screencast and ALWAYS use gitflow (for creating feature branches, performing hot fixes, releases, etc.)
- Code: https://github.com/nvie/gitflow
- Screencast: http://codesherpas.com/screencasts/on_the_path_gitflow.mov

### Heartbeat monitoring (NewRelic)

- URL: http://www.socialstreet.com/hb
- Controller: HeartbeatController
- Excluded from new relic performance calculations
- Using SmartRackLogger to exclude any .log entries for URL /hb (See application.rb) otherwise production.log will be too noisy

### Error simulation (Airbrake)

- URL: http://www.socialstreet.com/sim_error
- Causes a string exception to be thrown

### GOD

- Starting GOD
/usr/local/rvm/rubies/ruby-1.9.2-p180-patched/bin/ruby /usr/local/rvm/gems/ruby-1.9.2-p180-patched/bin/god -P /var/run/god/god.pid -l /var/log/god/god.log


### Streetmeet of the week

- There has to be a public page at http://socialstreet.com/events/streetmeet_of_the_week
- This page should have the action

    def streetmeet_of_the_week
      render "user_mailer/streetmeet_of_the_week.html.erb", :layout => false
    end

- The above file will be what is emailed out.
  -  This html file should have all the images files uploaded to the public/images directory
  -  all the <img> tags should use the full path.  src = http://socialstreet.com/images/.....
  -  The event needs to be created and the db needs to be updated and the "promoted" column needs to be set to true
  -  the attend button should ref the event on the site.
  -  To send a test email:  UserMailer.deliver_streetmeet_of_the_week("YOUR EMAIL ADDRESS")
  -  once you are happy with it,
     -  Jobs::Email::EmailStreetmeetOfTheWeek.perform
     -  This will print the total users to be emailed
     -  And will print a count for each email that is successful.
     -  TODO:  summarize this into an email that can be sent to Paul, Jon and Josh.

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors