/reddit-plugin-betamode

reddit beta testing mode

Primary LanguagePythonOtherNOASSERTION

reddit beta testing mode

This plugin orchestrates an opt-in beta test on an app server running a new feature branch of reddit. The presence of a beta cookie is used to flag a frontend proxy like HAProxy to direct users to the beta server instead of the regular app server pool.

details

To set up a beta, set up an app server with this plugin on a subdomain (such as http://lab.reddit.com) and configure your web frontend (sample HAProxy config below). Visits to the beta subdomain will be redirected to /beta/about/NAME, a page describing the beta and providing an opt-in button. When clicked, a JavaScript handler will create the cookie beta_NAME and navigate to the root domain (e.g. http://www.reddit.com). If your web frontend is configured properly, this request will be directed to the beta server.

When the beta is in place, a yellow overlay bar will be displayed allowing users to disable the beta. Clicking this button will delete the cookie and return to the root domain of the site. Beta cookies expire 7 days after the last request.

Users must be logged in to enable a beta. Beta access can be restricted to gold users or admins only. If access is restricted to admins, unauthorized requests will 404. If a user logs out or becomes ineligible for a beta (such as access restriction configuration changed), the user will be redirected to /beta/disable/NAME, a page which will automatically delete the cookie and then refresh. This interstitial page serves to work around browser inconsistencies setting cookies on redirects and to provide a suggestion to users to delete cookies in the case of being caught in an unforeseen redirect loop.

ini config params

# domain name of the beta app server (also add to reserved_subdomains)
beta_domain = beta.reddit.local

# short identifier ([a-z0-9]+) for beta, used in urls and cookie name
beta_name = maelstrom

# short human readable title for beta
beta_title = tag maelstrom beta

# markdown description for beta displayed on sign-up page
beta_description_md = "# beta test tag maelstrom\n it's folksonomy-driven!"

# subreddit to direct beta feedback to
beta_feedback_sr = /r/tagmaelstrom

# only allow gold users to enable the beta
beta_require_gold = False

# only allow admins to view and enable the beta
# (non-admins and logged-out will 404)
beta_require_admin = False

# list of users exempt from the above requirements
beta_allowed_users = kn0thing

simple dev haproxy sample config

This config assumes you are running a regular app server on port 8001 and a beta plugin app server on port 8002.

global
    maxconn 100

frontend frontend 0.0.0.0:80
    mode http
    timeout client 10000
    option forwardfor except 127.0.0.1
    option httpclose

    # requests containing a beta cookie go to the beta server
    acl beta hdr_sub(Cookie) beta_maelstrom=

    # send the beta domain to the beta server for opt-in
    acl beta hdr(Host) beta.reddit.local

    use_backend beta if beta
    default_backend regular

backend regular
    mode http
    timeout connect 4000
    timeout server 30000
    timeout queue 60000
    balance roundrobin

    server regular-app localhost:8001 maxconn 1 check

backend beta
    mode http
    timeout connect 4000
    timeout server 30000
    timeout queue 60000
    balance roundrobin

    server beta-app localhost:8002 maxconn 1 check

    # if the beta app server is down for some reason fall back to regular.
    server regular-app localhost:8001 maxconn 1 check backup