diff --git a/.gitignore b/.gitignore index 55d79859a8..23f2059e5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ conf/application.conf -conf/base.conf logs project/project project/target diff --git a/conf/base.conf b/conf/base.conf new file mode 100644 index 0000000000..6ccda2363f --- /dev/null +++ b/conf/base.conf @@ -0,0 +1,630 @@ +mongodb { + uri = "mongodb://127.0.0.1:27017/lichess" + mongo-async-driver = {} +} +net { + domain = "lichess.org" + protocol = "http://" + base_url = ${net.protocol}${net.domain} + base_en_url = ${net.protocol}en.${net.domain} + ip = "5.196.91.160" + asset { + domain = ${net.domain} + version = 723 + } +} +play { + server { + netty { + # The maximum length of the initial line. This effectively restricts the maximum length of a URL that the server will + # accept, the initial line consists of the method (3-7 characters), the URL, and the HTTP version (8 characters), + # including typical whitespace, the maximum URL length will be this number - 18. + maxInitialLineLength = 2048 # 4096 + + # The maximum length of the HTTP headers. The most common effect of this is a restriction in cookie length, including + # number of cookies and size of cookie values. + maxHeaderSize = 4096 # 8192 + } + } + i18n { + langs=[en,fr,ru,de,tr,sr,lv,bs,da,es,ro,it,fi,uk,pt,pl,nl,vi,sv,cs,sk,hu,ca,sl,az,nn,eo,tp,el,fp,lt,nb,et,hy,af,hi,ar,zh,gl,hr,mk,id,ja,bg,th,fa,he,mr,mn,cy,gd,ga,sq,be,ka,sw,ps,is,kk,io,gu,fo,eu,bn,id,la,jv,ky,pi,as,le,ta,sa,ml,kn,ko,mg,kb,zu,ur,yo,tl,fy,jb] + } + http { + session { + cookieName = "lila2" + maxAge = 365 days + } + } + ws { + useragent = ${net.base_url} + compressionEnabled = true + timeout { + connection = 5 seconds + idle = 5 minutes + request = 5 minutes + } + } + crypto { + secret="CiebwjgIM9cHQ;I?Xk:sfqDJ;BhIe:jsL?r=?IPF[saf>s^r0]?0grUq4>q?5mP^" + } +} +app { + scheduler { + disabled = ${ai.server-only} + debug = false + } + renderer.name = "renderer" + router.name = "router" + web_path = "public" + casual_only = false +} +api { + token = secret +} +cli { + username = "thibault" +} +chessground { + animation { + duration = 250 ms + } +} +editor { + animation.duration = ${chessground.animation.duration} +} +accessibility { + blind { + cookie { + name = "mBzamRgfXgRBSnXB" + salt = "WWcTbz5xxaHU4d96" + max_age = 31536000 # one year + } + } +} +prismic { + api_url = "https://lichess.cdn.prismic.io/api" +} +blog { + prismic { + api_url = ${prismic.api_url} + collection = blog + } + notify { + delay = 20 minutes + sender = "lichess-blog" + } + last_post_cache.ttl = 10 minutes + rss { + email = "lichess.contact@gmail.com" + } +} +qa { + collection { + question = qa_question + answer = qa_answer + } + notifier.sender = lichess-qa +} +donation { + collection.donation = donation + monthly_goal = 43500 + server_donors = [ drazak, jaldus, intenex, thibault ] +} +chat { + collection.chat = chat + max_lines = 50 + net.domain = ${net.domain} + actor.name = chat +} +puzzle { + collection { + puzzle = puzzle + attempt = puzzle_attempt + } + api.token = ${api.token} + selector { + anon_min_rating = 30 + max_attempts = 10000 + } + animation.duration = ${chessground.animation.duration} + png.exec_path = "submodules/boardcreator" +} +coordinate { + collection { + score = coordinate_score + } +} +opening { + collection { + opening = opening + attempt = opening_attempt + name = opening_name + } + selector { + tolerance = { + step = 160 + max = 1000 + } + modulo = 20000 + } + animation.duration = ${chessground.animation.duration} + api.token = ${api.token} +} +video { + collection { + video = video + view = video_view + } + sheet { + url = "https://spreadsheets.google.com/feeds/list/1qYU1XhvC8TlBggXEkjI481ieNGyYGmMTy97A9iboyrM/2/public/values?alt=json" + delay = 3 hour + } + youtube { + url = "https://www.googleapis.com/youtube/v3/videos" + api_key = "" + max = 50 + delay = 20 minutes + } +} +search { + enabled = false + writeable = true + endpoint = "http://localhost:9673" +} +team { + collection{ + team = team + member = team_member + request = team_request + } + notifier.sender = lichess-team + paginator.max_per_page = 15 + paginator.max_user_per_page = 24 +} +teamSearch { + index = team + paginator.max_per_page = ${team.paginator.max_per_page} + actor.name = team-search +} +relation { + collection { + relation = relation + } + actor { + name = relation-actor + notify_freq = 2 seconds + } + limit { + follow = 300 + block = 500 + } +} +pref { + collection.pref = pref + cache.ttl = 30 minutes +} +bookmark { + collection.bookmark = bookmark + paginator.max_per_page = ${game.paginator.max_per_page} + actor.name = bookmark +} +analyse { + collection.analysis = analysis2 + net.domain = ${net.domain} + cached.nb.ttl = ${game.cached.nb.ttl} + paginator.max_per_page = ${game.paginator.max_per_page} + actor.name = analyser +} +geoip { + file = "" + cache_ttl = 1 hour +} +security { + collection.security = security + flood.duration = 60 seconds + firewall { + enabled=true + cached.ips.ttl = 10 minutes + cookie { + enabled = false + name=fEKHA4zI74ZrZrom + } + collection.firewall = firewall + } + geoip = ${geoip} + password_reset { + mailgun = ${mailgun} + secret = "???" + } + email_confirm { + mailgun = ${mailgun} + secret = "???" + } + tor { + provider_url = "https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip="${net.ip}"&port=80" + refresh_delay = 2 hour + } + disposable_email { + provider_url = "https://raw.githubusercontent.com/ornicar/disposable-email-domains/master/index.json" + refresh_delay = 1 hour + } + recaptcha = ${recaptcha} + whois { + key = "matewithknightandbishop" + } +} +recaptcha { + endpoint = "https://www.google.com/recaptcha/api/siteverify" + public_key = "6LeMhwsTAAAAAElD4KwTo_IUmqIXqx7hkSLLaNSP" + private_key = "" +} +shutup { + collection.shutup = shutup + actor.name = shutup +} +playban { + collection.playban = playban +} +worldMap { + geoip = ${geoip} + players.cache_size = 8192 +} +mod { + collection { + modlog = modlog + player_assessment = player_assessment + boosting = boosting + } + boosting.nb_games_to_mark = 5 + boosting.ratio_games_to_mark = 0.01 + actor.name = mod +} +report { + collection.report = report + actor.name = report +} +i18n { + web_path.relative = ${app.web_path}/trans + file_path.relative = "conf" + upstream.url_pattern = "http://en.lichess.org/translation/fetch/%d" + hide_calls.cookie { + name="hide_i18n_calls" + max_age=604800 # one week + } + collection.translation = translation + request_handler.protocol = ${net.protocol} + context.git { + url = "git://github.com/ornicar/lila.wiki.git" + file = "translation_context.md" + } + cdn_domain = ${net.asset.domain} + call.threshold = 4500 +} +detectlanguage.api { + url = "http://ws.detectlanguage.com/0.2/detect" + key = "???" +} +mailgun { + api { + url = "???" + key = "???" + } + sender = "lichess.org " + base_url = ${net.base_url} +} +monitor { + actor.name = monitor-actor + socket.name = monitor-socket + socket.uid.ttl = ${site.socket.uid.ttl} + channel.move_lat = monitor-move-lat +} +lobby { + message.ttl = 30 seconds + orphan_hook.ttl = 5 seconds + socket { + name = lobby-socket + uid.ttl = ${site.socket.uid.ttl} + } + actor.name = lobby-actor + net.domain = ${net.domain} + broom_period = 1 second + resync_ids_period = 15 seconds + collection.seek = seek + collection.seek_archive = seek_archive + seek { + max_per_page = 14 + max_per_user = 5 + } +} +timeline { + collection { + unsub = timeline_unsub + entry = timeline_entry + } + user { + display_max = 12 + actor.name = user-timeline + } +} +game { + cached.nb.ttl = 1 hour + paginator.max_per_page = 9 + collection { + game = game5 + crosstable = crosstable + } + js_path { + raw = public/javascripts/big.js + compiled = public/compiled/big.js + } + actor.name = game-actor + captcher { + name = captcher + duration = 7 seconds + } + net.base_url = ${net.base_url} + uci_memo.ttl = 2 minutes + pdf.exec_path = "submodules/pdfexporter" + png.exec_path = "submodules/boardcreator" +} +tv { + featured { + select = 3 seconds + } + streaming { + search = 15 seconds + } +} +gameSearch { + index = game + paginator.max_per_page = ${game.paginator.max_per_page} + actor.name = game-search +} +round { + active.ttl = 30 seconds + uid.timeout = 10 seconds + finisher.lock.timeout = 20 seconds + animation.duration = ${chessground.animation.duration} + moretime = 15 seconds + casual_only = ${app.casual_only} + player { + disconnect.timeout = 90 seconds + ragequit.timeout = 10 seconds + } + socket { + name = round-socket + timeout = 30 seconds + } + actor.map.name = round-map + collection { + note = game_note + history = round_history + forecast = forecast + } + net.domain = ${net.domain} +} +tournament { + collection { + tournament = tournament2 + player = tournament_player + pairing = tournament_pairing + } + history.message.ttl = 30 seconds + uid.timeout = 7 seconds # small to avoid missed events + socket { + name = tournament-socket + timeout = 2 minutes + } + organizer.name = tournament-organizer + reminder.name = tournament-reminder + sequencer { + map_name = tournament-sequencers + timeout = 10 minutes + } + pairing.delay = 3.1 seconds + created.cache.ttl = 2 seconds + leaderboard.cache.ttl = 1 hour + ranking.cache.ttl = 1 hour + net.domain = ${net.domain} +} +simul { + collection { + simul = simul + } + sequencer { + map_name = simul-sequencers + timeout = 10 minutes + } + socket { + name = simul-socket + timeout = 5 minutes + } + created.cache.ttl = 2 seconds + history.message.ttl = 30 seconds + uid.timeout = 7 seconds # small to avoid missed events + actor.name = simul +} +forum { + topic.max_per_page = 10 + post.max_per_page = 10 + recent { + ttl = 1 hour + nb = 20 + } + collection { + categ = f_categ + topic = f_topic + post = f_post + } + public_categ_ids = [ + general-chess-discussion + game-analysis + lichess-feedback + off-topic-discussion + ] + actor.name = forum +} +forumSearch { + index = forum + paginator.max_per_page = 10 + actor.name = forum-search +} +message { + thread.max_per_page = 30 + collection.thread = m_thread + actor.name = message + lichess_senders = [ + lichess + ${blog.notify.sender} + ${qa.notifier.sender} + ${team.notifier.sender} + ] +} +memo { + collection { + cache = cache + } +} +setup { + friend.memo.ttl = 1 day + casual_only = ${app.casual_only} + collection { + user_config = config + anon_config = config_anon + } + challenger.name = "setup-challenger" +} +site { + socket { + name = site-socket + uid.ttl = 10 seconds + } +} +user { + paginator.max_per_page = 40 + cached.nb.ttl = 10 minutes + online.ttl = 7 seconds + collection { + user = user4 + note = note + trophy = trophy + } +} +history { + collection.history = history3 + cached.rating_chart.ttl = 1 hour +} +ai { + exec_path = "local/Stockfish/src/stockfish" + hash_size = 64 + threads = 1 + instances = 2 + debug = false + endpoint = ${net.base_url}/ai + callback_url = ${net.protocol}en.${net.domain}/%/post-analysis + server-only = false + play { + movetime = 500 ms + timeout = 5 seconds + } + analyse { + max_plies = 200 + movetime = 1500 ms + } + collection.ai_perf = "ai_perf" + ai_perf.cache_ttl = 5 seconds + actor.name = ai +} +application { + global="lila.app.Global" +} +wiki { + collection.page = wiki + git.url = "git://github.com/ornicar/lichess.wiki.git" + markdown_path = "/usr/bin/markdown" +} +importer { + delay = 50 milliseconds +} +mobile.app.version = "1.3.0" +coach { + collection { + stat = coach_stat + } +} +simulation { + enabled = false + players = 300 + watchers = 200 +} +hub { + actor { + game { + actor = ${game.actor.name} + search = ${gameSearch.actor.name} + } + renderer = ${app.renderer.name} + captcher = ${game.captcher.name} + forum { + actor = ${forum.actor.name} + search = ${forumSearch.actor.name} + } + team { + search = ${teamSearch.actor.name} + } + messenger = ${message.actor.name} + router = ${app.router.name} + ai = ${ai.actor.name} + monitor = ${monitor.actor.name} + tournament.organizer = ${tournament.organizer.name} + timeline { + user = ${timeline.user.actor.name} + } + bookmark = ${bookmark.actor.name} + round { + map = ${round.actor.map.name} + } + lobby = ${lobby.actor.name} + relation = ${relation.actor.name} + challenger = ${setup.challenger.name} + report = ${report.actor.name} + shutup = ${shutup.actor.name} + mod = ${mod.actor.name} + chat = ${chat.actor.name} + analyser = ${analyse.actor.name} + move_broadcast = ${socket.move_broadcast.name} + user_register = ${socket.user_register.name} + simul = ${simul.actor.name} + } + socket { + lobby = ${lobby.socket.name} + monitor = ${monitor.socket.name} + site = ${site.socket.name} + round = ${round.socket.name} + tournament = ${tournament.socket.name} + simul = ${simul.socket.name} + hub = ${socket.hub.name} + } + channel { + move_lat = ${monitor.channel.move_lat} + } +} + +socket { + hub.name = socket.hub + move_broadcast.name = socket.move-broadcast + user_register.name = socket.user-register + population.name = socket.population +} + +dbplugin = disabled +ehcacheplugin = disabled + +akka { + loggers = ["akka.event.slf4j.Slf4jLogger"] + loglevel = INFO + stdout-loglevel = INFO + log-config-on-start = off + log-dead-letters-during-shutdown = off +} +forcedev = false