# DO NOT EDIT THIS FILE # This is a base template. To apply changes to your # reddit instance, create a "myreddit.update" config # file, then run 'make ini'. 'make ini' will combine # this template with the myreddit.update file and create a # 'myreddit.ini'. ('myreddit.update' is just an example; # any name will do - e.g., 'foo.update' will create # 'foo.ini') [secrets] # the tokens in this section are base64 encoded # general purpose secret SECRET = YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5 # secret for /prefs/feeds FEEDSECRET = YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5 # used for authenticating admin API calls w/o cookie ADMINSECRET = YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5 # used to securely authenticate websocket requests to sutro websocket = YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5 # secret for validating HTTP_TRUE_CLIENT_IP_HASH as sent by the CDN true_ip = # secret for authenticating private media embeds media_embed = YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5 # secret for authenticating controller#action name action_name = YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5 # secrets for communicating with Stripe (optional payment processor) stripe_webhook = stripe_public_key = stripe_secret_key = # secrets for communicating with Authorize.net (optional payment processor-- # must also set authorizenetapi to enable) authorizenetname = authorizenetkey = # secret for communicating with Paypal (optional payment processor) paypal_webhook = # secret for communicating with Coinbase (optional payment processor) coinbase_webhook = # secret for communicating with RedditGifts (optional payment processor) redditgifts_webhook = [DEFAULT] ############################################ SITE-SPECIFIC OPTIONS #### Appearance # the site's tagline, used in the title and description short_description = open source is awesome # default site interface language (two letter character code) site_lang = en # default header image url default_header_url = reddit.com.header.png #### Domains # the domain that this app expects to be accessed on domain = reddit.local # where third party media (embeds etc.) are hosted # this should be different from `domain` for security media_domain = %(domain)s # the short domain (like redd.it) shortdomain = # if you use www for the old-timey feel, put it here domain_prefix = # subdomains that don't need special processing reserved_subdomains = www, ssl # subdomains that are not reddit instances offsite_subdomains = # https api endpoint (must be g.domain or a subdomain of g.domain) https_endpoint = # the domain for oauth-orized requests oauth_domain = # (secure) payment domain for self-serve ads payment_domain = https://pay.reddit.local/ # base url where 300x250 ad units (sidebar) are hosted ad_domain = http://reddit.local # domain where sutro websocket server is hosted websocket_host = %(domain)s # domain to send stats to stats_domain = #### Accounts and Subreddits # the user used for "system" operations and private messages system_user = reddit # the default subreddit for submissions default_sr = reddit.com # account used for default feedback messaging (can be /r/subreddit) admin_message_acct = reddit # subreddit used for DMCA takedowns takedown_sr = _takedowns # subreddit used for trending subreddits postings. Ignored if blank. trending_sr = # list of subreddits to always include in a user's front page (unless they unsubscribe) automatic_reddits = # special subreddit that only reddit gold subscribers can use lounge_reddit = #### Static Files # if set, this is the domain used for static files served over http and https # if not set, no domain will be specified and relative local URLs will be used instead static_domain = #### Ops # if your webserver is a proxy and on a different instance on the same 10.0.0.0/8 network # set X-forwarded-for and set this to true trust_local_proxies = false # Location (directory) for temp files for diff3 merging # Empty will use python default for temp files diff3_temp_location = #### Analytics # image to render to track pageviews tracker_url = /pixel/of_destiny.png # images to render to track sponsored links adtracker_url = /pixel/of_doom.png # image to render to track the ad frame adframetracker_url = /pixel/of_defenestration.png # redirector to bounce clicks off of on sponsored links for tracking clicktracker_url = /click # url to request to track interaction statistics uitracker_url = /pixel/of_discovery.png # google analytics token googleanalytics = # google analytics events sampling rate. Valid values are 1-100. # See https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiBasicConfiguration#_gat.GA_Tracker_._setSampleRate googleanalytics_sample_rate = 50 # secret used for signing information on the above tracking pixels tracking_secret = abcdefghijklmnopqrstuvwxyz0123456789 #### Wiki Pages wiki_page_privacy_policy = privacypolicy wiki_page_user_agreement = useragreement wiki_page_registration_info = registration_info wiki_page_gold_bottlecaps = gold_bottlecaps #### Feature toggles disable_ads = false disable_captcha = false disable_ratelimit = false disable_require_admin_otp = false disable_wiki = false ############################################ DEBUG # global debug flag -- displays pylons stacktrace rather than 500 page on error when true # NOTE: a pylons stacktrace allows remote code execution. make sure this is false in prod. debug = false # enables/disables whitespace removal in rendered html template_debug = false # enables/disables compiled template caching and template file mtime checking reload_templates = true # use uncompressed static files (out of /static/js and /static/css) # rather than compressed files out of /static (for development if true) uncompressedJS = true # enable/disable verbose logging of SQL queries sqlprinting = false # directory to write cProfile stats dumps to (disabled if not set) profile_directory = # template names to record render timings for timed_templates = Reddit, Link, Comment, LinkListing, NestedListing, SubredditTopBar ############################################ PLUGINS # which plugins are enabled (they must be installed via setup.py first) plugins = ###### about # set which subreddits the about page pulls its source data from # make sure you create the subreddits as well, otherwise you'll get an error about_sr_quotes = about_quotes about_sr_images = about_images # size limit on the about page slideshow about_images_count = 50 about_images_min_score = 1 advertising_links_sr = advertising_links wiki_page_selfserve_advertisers = advertising/advertisers wiki_page_selfserve_content = advertising/content wiki_page_selfserve_blurbs = advertising/blurbs wiki_page_selfserve_quotes = advertising/quotes wiki_page_selfserve_help = advertising/help ###### liveupdate # the domain the activity pixel is hosted on liveupdate_pixel_domain = %(domain)s # maximum number of outstanding invites an event can have liveupdate_invite_quota = 5 ###### meatspace # nothing! ############################################ LOGGING # whether to print a "reddit app started" message at start log_start = true # enable/disable logging of exceptions and events via amqp/rabbitmq amqp_logging = false # exception reporter objects to give to ErrorMiddleware (see log.py) error_reporters = ############################################ METRICS # where to send metrics statsd_addr = # how often to send them [0.0 - 1.0] statsd_sample_rate = 1.0 # percentage of stats for sampling (0-100) stats_sample_rate = 1 ############################################ MEDIA STORAGE # which backend provider to use for media (thumbnails, subreddit stylesheets, # subreddit images, app icons). options are: # s3 - use amazon s3 # filesystem - write to local filesystem # or write your own! media_provider = s3 # s3 provider # your s3 credentials -- if these are left blank, we'll pass None to # boto which will trigger it to look in various places, including instance # metadata if on ec2, for credentials. S3KEY_ID = S3SECRET_KEY = # May be one bucket, or many buckets seperated by commas s3_media_buckets = # Store direct urls for images, rather than buckets # For the bucket mybucket with the image helloworld.jpg the stored url would be: # true: http://{s3_media_domain}/mybucket/helloworld.jpg # false: http://mybucket/helloworld.jpg s3_media_direct = true # Which S3 region to use # If using the US region, the default is correct. Otherwise, use a region-specific # endpoint as in http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html s3_media_domain = s3.amazonaws.com # filesystem provider configuration media_fs_root = media_fs_base_url_http = thumbnail_size = 70, 70 thumbnail_hidpi_scaling = 2 ############################################ EMERGENCY MODES # emergency measures: makes the site read only read_only_mode = false # a modified read only mode used for cache shown during heavy load 503s heavy_load_mode = false # override default site language for things like pirate day lang_override = # enable/disable automatic creation of database tables/column families db_create_tables = True # are we allowed to write to databases at all? disallow_db_writes = False # disable custom subreddit stylesheets css_killswitch = False ############################################ SCRAPER # user agent for the scraper useragent = Mozilla/5.0 (compatible; redditbot/1.0; +http://www.reddit.com/feedback) # Embedly API Key. if no key is provided, the scraper will only fetch thumbnails. embedly_api_key = # A tuple of what media_object types will automatically be displayed on comments view. # Ex: liveupdate, custom autoexpand_media_types = liveupdate ############################################ QUOTAS # quota for various types of relations creatable in subreddits sr_banned_quota = 10000 sr_moderator_invite_quota = 10000 sr_contributor_quota = 10000 sr_wikibanned_quota = 10000 sr_wikicontributor_quota = 10000 sr_quota_time = 7200 sr_invite_limit = 25 # delay before allowing a link to be shared new_link_share_delay = 30 seconds # max number of uploaded images per subreddit max_sr_images = 50 ############################################ RATELIMITS # If true, send 429 responses on exceeded ratelimits # If false, send headers only, but don't abort # Only applies if tracking is enabled below ENFORCE_RATELIMIT = false # If true, store per-user request counts in ratelimits cache RL_SITEWIDE_ENABLED = true # How large of a burst window will users be allowed? RL_RESET_MINUTES = 10 # What is the average request rate over the above time period? RL_AVG_REQ_PER_SEC = 0.5 # Same as above, but configured separately for connections via OAuth RL_OAUTH_SITEWIDE_ENABLED = true RL_OAUTH_RESET_MINUTES = 10 RL_OAUTH_AVG_REQ_PER_SEC = 0.5 # same as above, but for failed login attempts per account RL_LOGIN_AVG_PER_SEC = .1 # user agent substrings to hard-ratelimit to a number of requests per ten second period # example: agents = googlebot:10, appengine:2 agents = # karma needed to avoid per-subreddit submission ratelimits MIN_RATE_LIMIT_KARMA = 10 MIN_RATE_LIMIT_COMMENT_KARMA = 1 ############################################ THRESHOLDS # minimum item score to be considered for quota baskets QUOTA_THRESHOLD = 5 # if the user has positive total karma, their per-subreddit karma will default to this, else 0 MIN_UP_KARMA = 1 # minimum user karma total values to show to non-admins link_karma_display_floor = 1 comment_karma_display_floor = -100 # age at which links/comments become "archived" and can no longer be voted on, replied to, or reported ARCHIVE_AGE = 180 days # minimum age of an account (in days) for the "create a subreddit" button to show min_membership_create_community = 30 # maximum age (in days) of items eligible for display on normalized hot pages (frontpage, multis, etc.) HOT_PAGE_AGE = 1000 # how long to consider links eligible for the rising page rising_period = 12 hours # default number of comments shown num_comments = 100 # max number of comments to show at once max_comments = 500 max_comments_gold = 2500 # how deep do we go into the top listing when fetching /random num_serendipity = 250 # number of subscriptions a user needs to have before the "my subreddits" # dropdown is shown sr_dropdown_threshold = 15 # Conflate visits to a comment page that happen within this many # seconds of each other (gold "new comments" feature) comment_visits_period = 600 # Max number of mentions to extract per comment butler_max_mentions = 3 # Number of days to keep recent wiki revisions for wiki_keep_recent_days = 7 # Max number of bytes for wiki pages wiki_max_page_length_bytes = 262144 # Max wiki page name length wiki_max_page_name_length = 128 # Max number of separators in a wiki page name wiki_max_page_separators = 3 ############################################ SEARCH # endpoint for link search CLOUDSEARCH_SEARCH_API = # endpoint for link upload CLOUDSEARCH_DOC_API = # endpoint for subreddit search CLOUDSEARCH_SUBREDDIT_SEARCH_API = # endpoint for subreddit upload CLOUDSEARCH_SUBREDDIT_DOC_API = ############################################ MEMCACHE num_mc_clients = 5 # core memcache cluster, Things and various other stuff memcaches = 127.0.0.1:11211 # caches used for @memoize decorator magic memoizecaches = 127.0.0.1:11211 # hosts to store memcache-based locks on lockcaches = 127.0.0.1:11211 # hosts to store rendered template fragments in rendercaches = 127.0.0.1:11211 # hosts to store entire rendered pages in pagecaches = 127.0.0.1:11211 # hosts that cache permacache cassandra data permacache_memcaches = 127.0.0.1:11211 # hosts that cache srmember rels (subset of Thing data) srmembercaches = 127.0.0.1:11211 # hosts that cache relations between Things relcaches = 127.0.0.1:11211 # a local cache that's not globally consistent and can have stale data (optional) stalecaches = # cache for tracking rate limit thresholds ratelimitcaches = 127.0.0.1:11211 ############################################ MISCELLANEOUS # default localization for strings (when using python's locale.format) # (mostly replaced by babel, this shouldn't be necessary to change) locale = C # storage timezone, should probably not be changed from UTC timezone = UTC # timezone for display of some data, deprecated display_timezone = MST # location of the static directory static_path = /static/ # Just a list of words. Used by errorlog.py to make up names for new errors. words_file = /usr/dict/words # domains that we consider URLs case sensitive for repost detection purposes case_sensitive_domains = i.imgur.com, youtube.com # Domains that we know are friendly and host raw image files known_image_domains = i.imgur.com, giant.gfycat.com, pbs.twimg.com, upload.wikimedia.org # whether to load reddit private code (a hack until we structure it better) import_private = false # location of geoip service geoip_location = http://127.0.0.1:5000 ############################################ AUTHENTICATION # how to authenticate users. see r2/lib/authentication.py for options authentication_provider = cookie # the work factor for bcrypt, increment this every time computers double in # speed. don't worry, changing this won't break old passwords bcrypt_work_factor = 12 # name of the cookie to drop with login information login_cookie = reddit_session # name of the admin cookie admin_cookie = reddit_admin # name of the otp cookie otp_cookie = reddit_otp # the maximum life of an admin cookie (seconds) ADMIN_COOKIE_TTL = 32400 # the maximum amount of idle time for an admin cookie (seconds) ADMIN_COOKIE_MAX_IDLE = 900 # the maximum life of an otp cookie OTP_COOKIE_TTL = 604800 # funky app user agents exempt from the login CSRF prevention exempt_login_user_agents = ############################################ SSL # max-age for Strict Transport Security, setting this to 0 disables # HSTS and revokes any previous HSTS grants. hsts_max_age = 10886400 ############################################ CASSANDRA # cassandra hosts cassandra_seeds = 127.0.0.1:9160 # number of connections to keep open to the cassandra ring cassandra_pool_size = 5 # default read/write consistency levels for Cassandra cassandra_rcl = ONE cassandra_wcl = ONE # name of default connection pool to use when _connection_pool not specified cassandra_default_pool = main ############################################ AMQP amqp_host = localhost:5672 amqp_user = reddit amqp_pass = reddit amqp_virtual_host = / ############################################ ZOOKEEPER # zookeeper is optional at the moment zookeeper_connection_string = zookeeper_username = zookeeper_password = ############################################ EMAIL smtp_server = localhost # where to send alerts for exceptions, etc. nerds_email = nerds@reddit.com # the "from" address for link share emails share_reply = noreply@reddit.com # where to send feedback comments feedback_email = reddit@gmail.com ############################################ POSTGRES db_user = reddit db_pass = password db_port = 5432 db_pool_size = 3 db_pool_overflow_size = 3 # list of all databases named in the subsequent table databases = main, comment, email, authorize, award, hc, traffic #db name db host user, pass, port, conn, overflow_conn main_db = reddit, 127.0.0.1, *, *, *, *, * comment_db = reddit, 127.0.0.1, *, *, *, *, * comment2_db = reddit, 127.0.0.1, *, *, *, *, * email_db = reddit, 127.0.0.1, *, *, *, *, * authorize_db = reddit, 127.0.0.1, *, *, *, *, * award_db = reddit, 127.0.0.1, *, *, *, *, * hc_db = reddit, 127.0.0.1, *, *, *, *, * traffic_db = reddit, 127.0.0.1, *, *, *, *, * hardcache_categories = *:hc:hc # this setting will prefix all of the table names db_app_name = reddit type_db = main rel_type_db = main hardcache_db = main # definitions of what each table is (probably shouldn't change in .update files) # things require no extra info. relation is followed by the names of the related tables # a !typeid=# flag allows overriding of the type id for a thing/rel to avoid the db # hit on app startup. db_table_link = thing db_table_account = thing db_table_message = thing db_table_comment = thing db_table_subreddit = thing db_table_srmember = relation, subreddit, account db_table_friend = relation, account, account db_table_inbox_account_comment = relation, account, comment db_table_inbox_account_message = relation, account, message db_table_moderatorinbox = relation, subreddit, message db_table_report_account_link = relation, account, link db_table_report_account_comment = relation, account, comment db_table_report_account_message = relation, account, message db_table_report_account_subreddit = relation, account, subreddit db_table_award = thing db_table_trophy = relation, account, award db_table_jury_account_link = relation, account, link db_table_flair = relation, subreddit, account db_table_promocampaign = thing # which servers to find each table on (likely to change in .update files) # first server listed is assumed to be the master, all others are read-only slaves # additionally, a "!avoid_master" flag may be added to specify that reads should use the slaves db_servers_link = main, main db_servers_account = main db_servers_message = main db_servers_comment = comment db_servers_subreddit = comment db_servers_srmember = comment db_servers_friend = comment db_servers_inbox_account_comment = main db_servers_inbox_account_message = main db_servers_moderatorinbox = main db_servers_report_account_link = main db_servers_report_account_comment = comment db_servers_report_account_message = main db_servers_report_account_subreddit = main db_servers_award = award db_servers_trophy = award db_servers_jury_account_link = main db_servers_ad = main db_servers_adsr = main db_servers_flair = main db_servers_promocampaign = main ############################################ GOLD # "thanks for subscribing to reddit gold" return address goldthanks_email = gold_month_price = 3.99 gold_year_price = 29.99 PAYPAL_BUTTONID_ONETIME_BYMONTH = PAYPAL_BUTTONID_ONETIME_BYYEAR = PAYPAL_BUTTONID_AUTORENEW_BYMONTH = PAYPAL_BUTTONID_AUTORENEW_BYYEAR = PAYPAL_BUTTONID_CREDDITS_BYMONTH = PAYPAL_BUTTONID_CREDDITS_BYYEAR = PAYPAL_BUTTONID_GIFTCODE_BYMONTH = PAYPAL_BUTTONID_GIFTCODE_BYYEAR = STRIPE_MONTHLY_GOLD_PLAN = STRIPE_YEARLY_GOLD_PLAN = COINBASE_BUTTONID_ONETIME_1MO = COINBASE_BUTTONID_ONETIME_3MO = COINBASE_BUTTONID_ONETIME_1YR = COINBASE_BUTTONID_ONETIME_2YR = COINBASE_BUTTONID_ONETIME_3YR = ############################################ SELF-SERVE ADS selfserve_support_email = selfservesupport@mydomain.com MAX_CAMPAIGNS_PER_LINK = 100 cpm_selfserve = 1.00 cpm_selfserve_geotarget_metro = 2.00 cpm_selfserve_collection = 0.75 authorizenetapi = default_promote_bid = 50 min_promote_bid = 20 max_promote_bid = 9999 min_promote_future = 2 max_promote_future = 93 adserver_click_domain = ############################################ TRAFFIC TRAFFIC_ACCESS_KEY = TRAFFIC_SECRET_KEY = RAW_LOG_DIR = PROCESSED_DIR = AGGREGATE_DIR = AWS_LOG_DIR = TRAFFIC_SRC_DIR = TRAFFIC_LOG_HOSTS = ############################################ PERFORMANCE / SCALING # should we split link votes into separate queues based on subreddit id? # this helps with lock contention but isn't necessary on smaller sites shard_link_vote_queues = false # should we split comment tree processing into shards based on the link id? # this helps with lock contention but isn't necessary on smaller sites shard_commentstree_queues = false # chance of a write to the query cache triggering pruning. increasing this will # potentially slow down writes, but will keep the size of cached queries in check better querycache_prune_chance = 0.05 # time for the page cache (for unlogged in users) page_cache_time = 90 # time for the comment pane cache (for a subset of logged in users, see pages.py:CommentPane) commentpane_cache_time = 120 [server:main] use = egg:Paste#http host = 0.0.0.0 port = %(http_port)s [filter:gzip] use = egg:r2#gzip compress_level = 6 min_size = 800 [app:main] use = egg:r2 cache_dir = %(here)s/data filter-with = gzip [loggers] keys = root [logger_root] level = WARNING handlers = console [handlers] keys = console [handler_console] class = StreamHandler args = (sys.stdout,) [formatters] keys = reddit [formatter_reddit] format = %(message)s # the following configuration section makes up the "live" config. if zookeeper # is enabled, then this configuration will be found by the app in zookeeper. to # write it to zookeeper, use the writer script: scripts/write_live_config. [live_config] # permissions! each user should have one of admin, sponsor, or employee as their permission level employees = reddit:admin # links that get their own infrastructure (comma-delimited list of id36s) fastlane_links = # a message placed in the infobar announcement_message = # an info message placed in the sidebar sidebar_message = # an info message placed in the sidebar for gold users gold_sidebar_message = # probability of the subreddit suggester showing up in the spotlight box # for users that have at some point edited their subscriptions: spotlight_interest_sub_p = .05 # and for users that have not ever subscribed: spotlight_interest_nosub_p = .1 # map of comment tree version to how frequently it should be chosen relative to # the others comment_tree_version_weights = 1:1, 2:0, 3:0 # enables/disables client side logging POSTs to /web/log/... frontend_logging = true # daily gold revenue goal (in pennies) for progress bar thing gold_revenue_goal = 0 # messages to display in the "you're new here" welcome bar # space-delimited list of strings with / to indicate newlines welcomebar_messages = # sample multireddits (displayed when a user has no multis) listing_chooser_sample_multis = /user/reddit/m/hello, /user/reddit/m/world # multi of subreddits to share with gold users listing_chooser_gold_multi = /user/reddit/m/gold # subreddit showcasing new multireddits listing_chooser_explore_sr = # subreddits that help people discover more subreddits (used in explore tab) discovery_srs = # historical cost to run a reddit server pennies_per_server_second = 1970/1/1:1 # lowercased names of accounts that API clients use as "proxies" for gilding proxy_gilding_accounts = # Controversial item determination # Criteria for an item to meet to be determined as controversial cflag_min_votes = 7 cflag_lower_bound = 0.4 cflag_upper_bound = 0.6 #### Features # Availability for the "force HTTPS" option feature_allow_force_https = {"employee": true} # Who is required to use HTTPS? feature_require_https = off # HSTS grants are disabled by default since they make it a pain for devs # to use local HTTP services. Beware that this will disable grant revocation # as well. feature_give_hsts_grants = off